blob: dcff98c17a8e29e0c8d7378cb1bd44ab736628d9 [file] [log] [blame]
developer0cee47d2022-10-12 14:03:27 +08001From fca9ad7a70a36d78f4ef977aa1fc179e4a0881d3 Mon Sep 17 00:00:00 2001
2From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
3Date: Thu, 13 Oct 2022 13:22:05 +0800
4Subject: [PATCH] mt76: mt7915: add E3 re-bonding for low yield rate issue
5
6Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
7---
8 mt7915/eeprom.c | 27 ++++++++++++++++++++++++++-
9 mt7915/mcu.c | 13 ++++++++++---
10 mt7915/mt7915.h | 3 ++-
11 3 files changed, 38 insertions(+), 5 deletions(-)
12
13diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c
14index 632ecc7..34a4a62 100644
15--- a/mt7915/eeprom.c
16+++ b/mt7915/eeprom.c
17@@ -133,7 +133,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
18 MT7915_EEPROM_BLOCK_SIZE);
19 for (i = 0; i < block_num; i++)
20 mt7915_mcu_get_eeprom(dev,
21- i * MT7915_EEPROM_BLOCK_SIZE);
22+ i * MT7915_EEPROM_BLOCK_SIZE, NULL);
23 }
24
25 return mt7915_check_eeprom(dev);
26@@ -230,6 +230,29 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
27 dev->chainshift = hweight8(dev->mphy.chainmask);
28 }
29
30+void mt7915_eeprom_rebonding(struct mt7915_dev *dev)
31+{
32+#define MT7976_ADIE_MASK BIT(1)
33+#define MT7986_ADIE1_EFFUSE_OFFSET 0x1000
34+#define MT7986_ADIE1_MT7976C_OFFSET 0x270
35+#define MT7986_ADIE1_E3_OFFSET 0x271
36+ u32 adie_offset, sku = mt7915_check_adie(dev, true);
37+ u8 read_buf, *eeprom = dev->mt76.eeprom.data;
38+
39+ if (!(sku & MT7976_ADIE_MASK))
40+ return;
41+
42+ adie_offset = (sku == MT7976_DUAL_ADIE) ? MT7986_ADIE1_EFFUSE_OFFSET : 0;
43+
44+ /* 7976 A-Die, To identify MT7976C */
45+ mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_MT7976C_OFFSET + adie_offset, &read_buf);
46+ eeprom[MT7986_ADIE1_MT7976C_OFFSET] = read_buf;
47+
48+ /* E3 re-binding */
49+ mt7915_mcu_get_eeprom(dev, MT7986_ADIE1_E3_OFFSET + adie_offset, &read_buf);
50+ eeprom[MT7986_ADIE1_E3_OFFSET] = read_buf;
51+}
52+
53 int mt7915_eeprom_init(struct mt7915_dev *dev)
54 {
55 int ret;
56@@ -263,6 +286,8 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)
57 return ret;
58 }
59
60+ mt7915_eeprom_rebonding(dev);
61+
62 ret = mt7915_eeprom_load_precal(dev);
63 if (ret)
64 return ret;
65diff --git a/mt7915/mcu.c b/mt7915/mcu.c
66index a3600c7..7fc24e6 100644
67--- a/mt7915/mcu.c
68+++ b/mt7915/mcu.c
69@@ -2881,7 +2881,7 @@ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode)
70 &req, sizeof(req), true);
71 }
72
73-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
74+int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf)
75 {
76 struct mt7915_mcu_eeprom_info req = {
77 .addr = cpu_to_le32(round_down(offset,
78@@ -2898,8 +2898,15 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
79 return ret;
80
81 res = (struct mt7915_mcu_eeprom_info *)skb->data;
82- buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
83- memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
84+
85+ if (read_buf) {
86+ u32 offs = offset % MT7915_EEPROM_BLOCK_SIZE;
87+ *read_buf = res->data[offs];
88+ } else {
89+ buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
90+ memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
91+ }
92+
93 dev_kfree_skb(skb);
94
95 return 0;
96diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
97index 217a5d4..ac3f476 100644
98--- a/mt7915/mt7915.h
99+++ b/mt7915/mt7915.h
100@@ -552,6 +552,7 @@ void mt7915_wed_update_wo_rxcnt(struct mtk_wed_device *wed,
101 struct wo_cmd_rxcnt_t *rxcnt);
102 int mt7915_register_device(struct mt7915_dev *dev);
103 void mt7915_unregister_device(struct mt7915_dev *dev);
104+void mt7915_eeprom_rebonding(struct mt7915_dev *dev);
105 int mt7915_eeprom_init(struct mt7915_dev *dev);
106 void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
107 struct mt7915_phy *phy);
108@@ -606,7 +607,7 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
109 struct ieee80211_sta *sta,
110 void *data, u32 field);
111 int mt7915_mcu_set_eeprom(struct mt7915_dev *dev, bool flash_mode);
112-int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset);
113+int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf);
114 int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num);
115 int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
116 bool hdr_trans);
117--
1182.18.0
119