[][MAC80211][mt76][Add eBF/iBF certification and calibration with golden]

[Description]
Add eBF certification commands with golden device
Add iBF calibration and verification commands with golden device
Add normal mode bf station record and pfmu tag dump command via debugfs
Fix BW display error in debugfs tmac info dump function

[Release-log]
N/A

Change-Id: I992f52b439cfa467e159dbe54285a902087da5db
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6929902
diff --git a/autobuild_mac80211_release/package/kernel/mt76/patches/1120-mt76-mt7915-add-mt7986-and-mt7916-pre-calibration.patch b/autobuild_mac80211_release/package/kernel/mt76/patches/1120-mt76-mt7915-add-mt7986-and-mt7916-pre-calibration.patch
new file mode 100644
index 0000000..c0c01c6
--- /dev/null
+++ b/autobuild_mac80211_release/package/kernel/mt76/patches/1120-mt76-mt7915-add-mt7986-and-mt7916-pre-calibration.patch
@@ -0,0 +1,202 @@
+From a5db0f0eadc5827f7a82b62cc6ce47ab646932cd Mon Sep 17 00:00:00 2001
+From: Peter Chiu <chui-hao.chiu@mediatek.com>
+Date: Fri, 20 May 2022 19:19:25 +0800
+Subject: [PATCH 1120/1131] mt76: mt7915: add mt7986 and mt7916 pre-calibration
+
+Add pre-calibration for mt7986 and mt7916. It has different data size
+with mt7915. Group cal needs 54k and 94k for 2G + 5G and 2G + 6G,
+respectively. DPD cal needs 300k.
+
+Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
+---
+ mt7915/eeprom.c | 15 +++++------
+ mt7915/eeprom.h |  1 +
+ mt7915/mcu.c    | 72 ++++++++++++++++++++++++++++++++++++-------------
+ 3 files changed, 62 insertions(+), 26 deletions(-)
+
+diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c
+index 24efa28..7bdd4d5 100644
+--- a/mt7915/eeprom.c
++++ b/mt7915/eeprom.c
+@@ -9,23 +9,22 @@ static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)
+ {
+ 	struct mt76_dev *mdev = &dev->mt76;
+ 	u8 *eeprom = mdev->eeprom.data;
+-	u32 val = eeprom[MT_EE_DO_PRE_CAL];
+-	u32 offs;
++	u32 offs = is_mt7915(&dev->mt76) ? MT_EE_DO_PRE_CAL : MT_EE_DO_PRE_CAL_V2;
++	u32 size, val = eeprom[offs];
+ 
+-	if (!dev->flash_mode)
++	if (!dev->flash_mode || !val)
+ 		return 0;
+ 
+-	if (val != (MT_EE_WIFI_CAL_DPD | MT_EE_WIFI_CAL_GROUP))
+-		return 0;
++	size = mt7915_get_cal_group_size(dev) +
++	       (is_mt7915(&dev->mt76) ? MT_EE_CAL_DPD_SIZE_V1 : MT_EE_CAL_DPD_SIZE_V2);
+ 
+-	val = MT_EE_CAL_GROUP_SIZE + MT_EE_CAL_DPD_SIZE;
+-	dev->cal = devm_kzalloc(mdev->dev, val, GFP_KERNEL);
++	dev->cal = devm_kzalloc(mdev->dev, size, GFP_KERNEL);
+ 	if (!dev->cal)
+ 		return -ENOMEM;
+ 
+ 	offs = is_mt7915(&dev->mt76) ? MT_EE_PRECAL : MT_EE_PRECAL_V2;
+ 
+-	return mt76_get_of_eeprom(mdev, dev->cal, offs, val);
++	return mt76_get_of_eeprom(mdev, dev->cal, offs, size);
+ }
+ 
+ static int mt7915_check_eeprom(struct mt7915_dev *dev)
+diff --git a/mt7915/eeprom.h b/mt7915/eeprom.h
+index 88aaa16..fdae347 100644
+--- a/mt7915/eeprom.h
++++ b/mt7915/eeprom.h
+@@ -19,6 +19,7 @@ enum mt7915_eeprom_field {
+ 	MT_EE_DDIE_FT_VERSION =	0x050,
+ 	MT_EE_DO_PRE_CAL =	0x062,
+ 	MT_EE_WIFI_CONF =	0x190,
++	MT_EE_DO_PRE_CAL_V2 =	0x19a,
+ 	MT_EE_RATE_DELTA_2G =	0x252,
+ 	MT_EE_RATE_DELTA_5G =	0x29d,
+ 	MT_EE_TX0_POWER_2G =	0x2fc,
+diff --git a/mt7915/mcu.c b/mt7915/mcu.c
+index 2d363c4..4c64655 100644
+--- a/mt7915/mcu.c
++++ b/mt7915/mcu.c
+@@ -2917,7 +2917,8 @@ static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
+ int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
+ {
+ 	u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
+-	u32 total = MT_EE_CAL_GROUP_SIZE;
++	u32 total = mt7915_get_cal_group_size(dev);
++	u32 offs = is_mt7915(&dev->mt76) ? MT_EE_DO_PRE_CAL : MT_EE_DO_PRE_CAL_V2;
+ 
+ 	if (!(eep[offs] & MT_EE_WIFI_CAL_GROUP))
+ 		return 0;
+@@ -2955,9 +2956,9 @@ static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
+ 	return -1;
+ }
+ 
+-static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
++static int mt7915_dpd_freq_idx(struct mt7915_dev *dev, u16 freq, u8 bw)
+ {
+-	static const u16 freq_list[] = {
++	const u16 freq_list_v1[] = {
+ 		5180, 5200, 5220, 5240,
+ 		5260, 5280, 5300, 5320,
+ 		5500, 5520, 5540, 5560,
+@@ -2965,34 +2966,69 @@ static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
+ 		5660, 5680, 5700, 5745,
+ 		5765, 5785, 5805, 5825
+ 	};
+-	int offset_2g = ARRAY_SIZE(freq_list);
++	const u16 freq_list_v2[] = {
++		/* 6G BW20*/
++		5955, 5975, 5995, 6015,
++		6035, 6055, 6075, 6095,
++		6115, 6135, 6155, 6175,
++		6195, 6215, 6235, 6255,
++		6275, 6295, 6315, 6335,
++		6355, 6375, 6395, 6415,
++		6435, 6455, 6475, 6495,
++		6515, 6535, 6555, 6575,
++		6595, 6615, 6635, 6655,
++		6675, 6695, 6715, 6735,
++		6755, 6775, 6795, 6815,
++		6835, 6855, 6875, 6895,
++		6915, 6935, 6955, 6975,
++		6995, 7015, 7035, 7055,
++		7075, 7095, 7115,
++		/* 6G BW160 */
++		6025, 6185, 6345, 6505,
++		6665, 6825, 6985,
++		/* 5G BW20 */
++		5180, 5200, 5220, 5240,
++		5260, 5280, 5300, 5320,
++		5500, 5520, 5540, 5560,
++		5580, 5600, 5620, 5640,
++		5660, 5680, 5700, 5720,
++		5745, 5765, 5785, 5805,
++		5825, 5845, 5865, 5885,
++		/* 5G BW160 */
++		5250, 5570, 5815
++	};
++	const u16 *freq_list = freq_list_v1;
++	int n_freqs = ARRAY_SIZE(freq_list_v1);
+ 	int idx;
+ 
++	if (!is_mt7915(&dev->mt76)) {
++		freq_list = freq_list_v2;
++		n_freqs = ARRAY_SIZE(freq_list_v2);
++	}
++
+ 	if (freq < 4000) {
+ 		if (freq < 2432)
+-			return offset_2g;
++			return n_freqs;
+ 		if (freq < 2457)
+-			return offset_2g + 1;
++			return n_freqs + 1;
+ 
+-		return offset_2g + 2;
++		return n_freqs + 2;
+ 	}
+ 
+-	if (bw == NL80211_CHAN_WIDTH_80P80 || bw == NL80211_CHAN_WIDTH_160)
++	if (bw == NL80211_CHAN_WIDTH_80P80)
+ 		return -1;
+ 
+ 	if (bw != NL80211_CHAN_WIDTH_20) {
+-		idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
+-					   freq + 10);
++		idx = mt7915_find_freq_idx(freq_list, n_freqs, freq + 10);
+ 		if (idx >= 0)
+ 			return idx;
+ 
+-		idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
+-					   freq - 10);
++		idx = mt7915_find_freq_idx(freq_list, n_freqs, freq - 10);
+ 		if (idx >= 0)
+ 			return idx;
+ 	}
+ 
+-	return mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
++	return mt7915_find_freq_idx(freq_list, n_freqs, freq);
+ }
+ 
+ int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
+@@ -3024,24 +3060,24 @@ int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
+ 	if (!(eep[offs] & dpd_mask))
+ 		return 0;
+ 
+-	idx = mt7915_dpd_freq_idx(center_freq, chandef->width);
++	idx = mt7915_dpd_freq_idx(dev, center_freq, chandef->width);
+ 	if (idx < 0)
+ 		return -EINVAL;
+ 
+ 	/* Items: Tx DPD, Tx Flatness */
+-	idx = idx * 2;
+-	cal += MT_EE_CAL_GROUP_SIZE;
++	idx = idx * cal_num;
++	cal += mt7915_get_cal_group_size(dev) + (idx * MT_EE_CAL_UNIT);
+ 
+-	while (total--) {
++	while (cal_num--) {
+ 		int ret;
+ 
+-		cal += (idx * MT_EE_CAL_UNIT);
+ 		ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
+ 					     MCU_EXT_CMD(DPD_PRE_CAL_INFO));
+ 		if (ret)
+ 			return ret;
+ 
+ 		idx++;
++		cal += MT_EE_CAL_UNIT;
+ 	}
+ 
+ 	return 0;
+-- 
+2.18.0
+