[][MAC80211][mt76][Add E3 re-bonding for low yield rate issue]

[Description]
Add E3 re-bonding for low yield rate issue

[Release-log]
N/A

Change-Id: I67db0ae07d2d8d7b6155c5d840dfd1e6a26b6c33
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6620787
Build: srv_hbgsm110
diff --git a/autobuild_mac80211_release/package/kernel/mt76/patches/1126-mt76-mt7915-add-E3-re-bonding-for-low-yield-rate-issue.patch b/autobuild_mac80211_release/package/kernel/mt76/patches/1126-mt76-mt7915-add-E3-re-bonding-for-low-yield-rate-issue.patch
new file mode 100644
index 0000000..dcff98c
--- /dev/null
+++ b/autobuild_mac80211_release/package/kernel/mt76/patches/1126-mt76-mt7915-add-E3-re-bonding-for-low-yield-rate-issue.patch
@@ -0,0 +1,119 @@
+From fca9ad7a70a36d78f4ef977aa1fc179e4a0881d3 Mon Sep 17 00:00:00 2001
+From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+Date: Thu, 13 Oct 2022 13:22:05 +0800
+Subject: [PATCH] mt76: mt7915: add E3 re-bonding for low yield rate issue
+
+Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+---
+ mt7915/eeprom.c | 27 ++++++++++++++++++++++++++-
+ mt7915/mcu.c    | 13 ++++++++++---
+ mt7915/mt7915.h |  3 ++-
+ 3 files changed, 38 insertions(+), 5 deletions(-)
+
+diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c
+index 632ecc7..34a4a62 100644
+--- a/mt7915/eeprom.c
++++ b/mt7915/eeprom.c
+@@ -133,7 +133,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
+ 					 MT7915_EEPROM_BLOCK_SIZE);
+ 		for (i = 0; i < block_num; i++)
+ 			mt7915_mcu_get_eeprom(dev,
+-					      i * MT7915_EEPROM_BLOCK_SIZE);
++					      i * MT7915_EEPROM_BLOCK_SIZE, NULL);
+ 	}
+ 
+ 	return mt7915_check_eeprom(dev);
+@@ -230,6 +230,29 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
+ 	dev->chainshift = hweight8(dev->mphy.chainmask);
+ }
+ 
++void mt7915_eeprom_rebonding(struct mt7915_dev *dev)
++{
++#define MT7976_ADIE_MASK			BIT(1)
++#define MT7986_ADIE1_EFFUSE_OFFSET		0x1000
++#define MT7986_ADIE1_MT7976C_OFFSET		0x270
++#define MT7986_ADIE1_E3_OFFSET			0x271
++	u32 adie_offset, sku = mt7915_check_adie(dev, true);
++	u8 read_buf, *eeprom = dev->mt76.eeprom.data;
++
++	if (!(sku & MT7976_ADIE_MASK))
++		return;
++
++	adie_offset = (sku == MT7976_DUAL_ADIE) ? MT7986_ADIE1_EFFUSE_OFFSET : 0;
++
++	/* 7976 A-Die, To identify MT7976C */
++	mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_MT7976C_OFFSET + adie_offset, &read_buf);
++	eeprom[MT7986_ADIE1_MT7976C_OFFSET] = read_buf;
++
++	/* E3 re-binding */
++	mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_E3_OFFSET + adie_offset, &read_buf);
++	eeprom[MT7986_ADIE1_E3_OFFSET] = read_buf;
++}
++
+ int mt7915_eeprom_init(struct mt7915_dev *dev)
+ {
+ 	int ret;
+@@ -263,6 +286,8 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)
+ 			return ret;
+ 	}
+ 
++	mt7915_eeprom_rebonding(dev);
++
+ 	ret = mt7915_eeprom_load_precal(dev);
+ 	if (ret)
+ 		return ret;
+diff --git a/mt7915/mcu.c b/mt7915/mcu.c
+index a3600c7..7fc24e6 100644
+--- a/mt7915/mcu.c
++++ b/mt7915/mcu.c
+@@ -2881,7 +2881,7 @@ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode)
+ 				 &req, sizeof(req), true);
+ }
+ 
+-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
++int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf)
+ {
+ 	struct mt7915_mcu_eeprom_info req = {
+ 		.addr = cpu_to_le32(round_down(offset,
+@@ -2898,8 +2898,15 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
+ 		return ret;
+ 
+ 	res = (struct mt7915_mcu_eeprom_info *)skb->data;
+-	buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
+-	memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
++
++	if (read_buf) {
++		u32 offs = offset % MT7915_EEPROM_BLOCK_SIZE;
++		*read_buf = res->data[offs];
++	} else {
++		buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
++		memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
++	}
++
+ 	dev_kfree_skb(skb);
+ 
+ 	return 0;
+diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
+index 217a5d4..ac3f476 100644
+--- a/mt7915/mt7915.h
++++ b/mt7915/mt7915.h
+@@ -552,6 +552,7 @@ void mt7915_wed_update_wo_rxcnt(struct mtk_wed_device *wed,
+ 				struct wo_cmd_rxcnt_t *rxcnt);
+ int mt7915_register_device(struct mt7915_dev *dev);
+ void mt7915_unregister_device(struct mt7915_dev *dev);
++void mt7915_eeprom_rebonding(struct mt7915_dev *dev);
+ int mt7915_eeprom_init(struct mt7915_dev *dev);
+ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
+ 				struct mt7915_phy *phy);
+@@ -606,7 +607,7 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
+ 				   struct ieee80211_sta *sta,
+ 				   void *data, u32 field);
+ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode);
+-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset);
++int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf);
+ int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num);
+ int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
+ 		       bool hdr_trans);
+-- 
+2.18.0
+