blob: 22b945203b22fb971a496c0e6ab1aa92bb67bb51 [file] [log] [blame]
developerc04f5402023-02-03 09:22:26 +08001From bc8e0a4dfa04ec0bf2cec39241329bca4c4f2b6d Mon Sep 17 00:00:00 2001
developer0cee47d2022-10-12 14:03:27 +08002From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
3Date: Thu, 13 Oct 2022 13:22:05 +0800
developerc04f5402023-02-03 09:22:26 +08004Subject: [PATCH 1127/1133] mt76: mt7915: add E3 re-bonding for low yield rate
developer81ca9d62022-10-14 11:23:22 +08005 issue
developer0cee47d2022-10-12 14:03:27 +08006
7Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
8---
9 mt7915/eeprom.c | 27 ++++++++++++++++++++++++++-
10 mt7915/mcu.c | 13 ++++++++++---
11 mt7915/mt7915.h | 3 ++-
12 3 files changed, 38 insertions(+), 5 deletions(-)
13
14diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c
developerc04f5402023-02-03 09:22:26 +080015index 54803e8e..849275e1 100644
developer0cee47d2022-10-12 14:03:27 +080016--- a/mt7915/eeprom.c
17+++ b/mt7915/eeprom.c
developer30d39c22022-12-16 10:29:49 +080018@@ -132,7 +132,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
developereb6a0182022-12-12 18:53:32 +080019 /* read eeprom data from efuse */
20 block_num = DIV_ROUND_UP(eeprom_size, eeprom_blk_size);
21 for (i = 0; i < block_num; i++) {
22- ret = mt7915_mcu_get_eeprom(dev, i * eeprom_blk_size);
23+ ret = mt7915_mcu_get_eeprom(dev, i * eeprom_blk_size, NULL);
24 if (ret < 0)
25 return ret;
26 }
developer30d39c22022-12-16 10:29:49 +080027@@ -239,6 +239,29 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
developer0cee47d2022-10-12 14:03:27 +080028 dev->chainshift = hweight8(dev->mphy.chainmask);
29 }
30
31+void mt7915_eeprom_rebonding(struct mt7915_dev *dev)
32+{
33+#define MT7976_ADIE_MASK BIT(1)
34+#define MT7986_ADIE1_EFFUSE_OFFSET 0x1000
35+#define MT7986_ADIE1_MT7976C_OFFSET 0x270
36+#define MT7986_ADIE1_E3_OFFSET 0x271
37+ u32 adie_offset, sku = mt7915_check_adie(dev, true);
38+ u8 read_buf, *eeprom = dev->mt76.eeprom.data;
39+
40+ if (!(sku & MT7976_ADIE_MASK))
41+ return;
42+
43+ adie_offset = (sku == MT7976_DUAL_ADIE) ? MT7986_ADIE1_EFFUSE_OFFSET : 0;
44+
45+ /* 7976 A-Die, To identify MT7976C */
46+ mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_MT7976C_OFFSET + adie_offset, &read_buf);
47+ eeprom[MT7986_ADIE1_MT7976C_OFFSET] = read_buf;
48+
49+ /* E3 re-binding */
50+ mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_E3_OFFSET + adie_offset, &read_buf);
51+ eeprom[MT7986_ADIE1_E3_OFFSET] = read_buf;
52+}
53+
54 int mt7915_eeprom_init(struct mt7915_dev *dev)
55 {
56 int ret;
developer30d39c22022-12-16 10:29:49 +080057@@ -275,6 +298,8 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)
developer0cee47d2022-10-12 14:03:27 +080058 return ret;
59 }
60
61+ mt7915_eeprom_rebonding(dev);
62+
63 ret = mt7915_eeprom_load_precal(dev);
64 if (ret)
65 return ret;
66diff --git a/mt7915/mcu.c b/mt7915/mcu.c
developerc04f5402023-02-03 09:22:26 +080067index 9cd51d95..e8b8bc8d 100644
developer0cee47d2022-10-12 14:03:27 +080068--- a/mt7915/mcu.c
69+++ b/mt7915/mcu.c
developerc04f5402023-02-03 09:22:26 +080070@@ -2885,7 +2885,7 @@ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode)
developer0cee47d2022-10-12 14:03:27 +080071 &req, sizeof(req), true);
72 }
73
74-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
75+int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf)
76 {
77 struct mt7915_mcu_eeprom_info req = {
78 .addr = cpu_to_le32(round_down(offset,
developerc04f5402023-02-03 09:22:26 +080079@@ -2903,8 +2903,15 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
developer0cee47d2022-10-12 14:03:27 +080080 return ret;
81
82 res = (struct mt7915_mcu_eeprom_info *)skb->data;
83- buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
84- memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
85+
86+ if (read_buf) {
87+ u32 offs = offset % MT7915_EEPROM_BLOCK_SIZE;
88+ *read_buf = res->data[offs];
89+ } else {
90+ buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
91+ memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
92+ }
93+
94 dev_kfree_skb(skb);
95
96 return 0;
97diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developerc04f5402023-02-03 09:22:26 +080098index e4422d94..538896e5 100644
developer0cee47d2022-10-12 14:03:27 +080099--- a/mt7915/mt7915.h
100+++ b/mt7915/mt7915.h
developerc04f5402023-02-03 09:22:26 +0800101@@ -557,6 +557,7 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
developer81ca9d62022-10-14 11:23:22 +0800102
developer0cee47d2022-10-12 14:03:27 +0800103 int mt7915_register_device(struct mt7915_dev *dev);
104 void mt7915_unregister_device(struct mt7915_dev *dev);
105+void mt7915_eeprom_rebonding(struct mt7915_dev *dev);
106 int mt7915_eeprom_init(struct mt7915_dev *dev);
107 void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
108 struct mt7915_phy *phy);
developerc04f5402023-02-03 09:22:26 +0800109@@ -611,7 +612,7 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
developer0cee47d2022-10-12 14:03:27 +0800110 struct ieee80211_sta *sta,
111 void *data, u32 field);
112 int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode);
113-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset);
114+int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf);
115 int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num);
116 int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
117 bool hdr_trans);
118--
developerc04f5402023-02-03 09:22:26 +08001192.18.0
developer0cee47d2022-10-12 14:03:27 +0800120