blob: f6b88f98ccbd08d1a7c151ad1ece69cac7edf4fc [file] [log] [blame]
developerc1997a82023-03-30 15:28:14 +08001From 6256e5a3577ddf726a30774b2366e7ccf098031a Mon Sep 17 00:00:00 2001
developer0cee47d2022-10-12 14:03:27 +08002From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
developerc1997a82023-03-30 15:28:14 +08003Date: Thu, 30 Mar 2023 15:12:37 +0800
4Subject: [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
developer0cee47d2022-10-12 14:03:27 +08007---
developerc1997a82023-03-30 15:28:14 +08008 mt7915/eeprom.c | 28 ++++++++++++++++++++++++++++
9 mt7915/mt7915.h | 1 +
10 2 files changed, 29 insertions(+)
developer0cee47d2022-10-12 14:03:27 +080011
12diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c
developerc1997a82023-03-30 15:28:14 +080013index 612be3f..c6d8ca1 100644
developer0cee47d2022-10-12 14:03:27 +080014--- a/mt7915/eeprom.c
15+++ b/mt7915/eeprom.c
developerc1997a82023-03-30 15:28:14 +080016@@ -239,6 +239,32 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
developer0cee47d2022-10-12 14:03:27 +080017 dev->chainshift = hweight8(dev->mphy.chainmask);
18 }
19
20+void mt7915_eeprom_rebonding(struct mt7915_dev *dev)
21+{
22+#define MT7976_ADIE_MASK BIT(1)
23+#define MT7986_ADIE1_EFFUSE_OFFSET 0x1000
24+#define MT7986_ADIE1_MT7976C_OFFSET 0x270
25+#define MT7986_ADIE1_E3_OFFSET 0x271
developerc1997a82023-03-30 15:28:14 +080026+ u32 adie_offset, offset, sku = mt7915_check_adie(dev, true);
27+ u8 read_buf[MT7915_EEPROM_BLOCK_SIZE], *eeprom = dev->mt76.eeprom.data;
28+
developer0cee47d2022-10-12 14:03:27 +080029+
30+ if (!(sku & MT7976_ADIE_MASK))
31+ return;
32+
33+ adie_offset = (sku == MT7976_DUAL_ADIE) ? MT7986_ADIE1_EFFUSE_OFFSET : 0;
34+
35+ /* 7976 A-Die, To identify MT7976C */
developerc1997a82023-03-30 15:28:14 +080036+ offset = MT7986_ADIE1_MT7976C_OFFSET + adie_offset;
37+ mt7915_mcu_get_eeprom(dev, offset, read_buf);
38+ eeprom[MT7986_ADIE1_MT7976C_OFFSET] = read_buf[offset % MT7915_EEPROM_BLOCK_SIZE];
developer0cee47d2022-10-12 14:03:27 +080039+
40+ /* E3 re-binding */
developerc1997a82023-03-30 15:28:14 +080041+ offset = MT7986_ADIE1_E3_OFFSET + adie_offset;
42+ mt7915_mcu_get_eeprom(dev, offset, read_buf);
43+ eeprom[MT7986_ADIE1_E3_OFFSET] = read_buf[offset % MT7915_EEPROM_BLOCK_SIZE];
developer0cee47d2022-10-12 14:03:27 +080044+}
45+
46 int mt7915_eeprom_init(struct mt7915_dev *dev)
47 {
48 int ret;
developerc1997a82023-03-30 15:28:14 +080049@@ -275,6 +301,8 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)
developer0cee47d2022-10-12 14:03:27 +080050 return ret;
51 }
52
53+ mt7915_eeprom_rebonding(dev);
54+
55 ret = mt7915_eeprom_load_precal(dev);
56 if (ret)
57 return ret;
developer0cee47d2022-10-12 14:03:27 +080058diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developerc1997a82023-03-30 15:28:14 +080059index 73bc030..5999134 100644
developer0cee47d2022-10-12 14:03:27 +080060--- a/mt7915/mt7915.h
61+++ b/mt7915/mt7915.h
developerfd8e1152023-02-14 11:29:23 +080062@@ -558,6 +558,7 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
developer81ca9d62022-10-14 11:23:22 +080063
developer0cee47d2022-10-12 14:03:27 +080064 int mt7915_register_device(struct mt7915_dev *dev);
65 void mt7915_unregister_device(struct mt7915_dev *dev);
66+void mt7915_eeprom_rebonding(struct mt7915_dev *dev);
67 int mt7915_eeprom_init(struct mt7915_dev *dev);
68 void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
69 struct mt7915_phy *phy);
developer0cee47d2022-10-12 14:03:27 +080070--
developerc04f5402023-02-03 09:22:26 +0800712.18.0
developer0cee47d2022-10-12 14:03:27 +080072