blob: 3556945793a19049b24a04fcf6a73009691aea56 [file] [log] [blame]
developer7e2761e2023-10-12 08:11:13 +08001From dcace898314b1d369b61a0c4f7f9e325f04784dc Mon Sep 17 00:00:00 2001
2From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
3Date: Fri, 26 May 2023 14:44:04 +0800
4Subject: [PATCH 61/98] wifi: mt76: mt7996: add kite eeprom load support
5
6Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
7---
8 mt7996/eeprom.c | 33 ++++++++++++++++++++++-----------
9 mt7996/mcu.c | 2 +-
10 mt7996/mt7996.h | 10 ++++++++++
11 3 files changed, 33 insertions(+), 12 deletions(-)
12
13diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
14index 56605de..6605853 100644
15--- a/mt7996/eeprom.c
16+++ b/mt7996/eeprom.c
17@@ -53,9 +53,12 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev)
18 u8 *eeprom = dev->mt76.eeprom.data;
19 u16 val = get_unaligned_le16(eeprom);
20
21+#define CHECK_EEPROM_ERR(match) (match ? 0 : -EINVAL)
22 switch (val) {
23 case 0x7990:
24- return 0;
25+ return CHECK_EEPROM_ERR(is_mt7996(&dev->mt76));
26+ case 0x7992:
27+ return CHECK_EEPROM_ERR(is_mt7992(&dev->mt76));
28 default:
29 return -EINVAL;
30 }
31@@ -66,13 +69,20 @@ const char *mt7996_eeprom_name(struct mt7996_dev *dev)
32 if (dev->bin_file_mode)
33 return dev->mt76.bin_file_name;
34
35- /* reserve for future variants */
36- if (dev->testmode_enable)
37- return MT7996_EEPROM_DEFAULT_TM;
38- else if (dev->chip_sku == MT7996_SKU_404)
39- return MT7996_EEPROM_DEFAULT_404;
40- else
41+ switch (mt76_chip(&dev->mt76)) {
42+ case 0x7990:
43+ if (dev->testmode_enable)
44+ return MT7996_EEPROM_DEFAULT_TM;
45+ else if (dev->chip_sku == MT7996_SKU_404)
46+ return MT7996_EEPROM_DEFAULT_404;
47+ else
48+ return MT7996_EEPROM_DEFAULT;
49+ case 0x7992:
50+ return dev->testmode_enable ?
51+ MT7992_EEPROM_DEFAULT_TM : MT7992_EEPROM_DEFAULT;
52+ default:
53 return MT7996_EEPROM_DEFAULT;
54+ }
55 }
56
57 int
58@@ -125,7 +135,7 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
59 goto out;
60 }
61
62- memcpy(eeprom, fw->data, MT7996_EEPROM_SIZE);
63+ memcpy(eeprom, fw->data, mt7996_eeprom_size(dev));
64 dev->flash_mode = true;
65
66 out:
67@@ -141,7 +151,7 @@ static int mt7996_eeprom_load_flash(struct mt7996_dev *dev)
68 /* return > 0 for load success, return 0 for load failed, return < 0 for non memory */
69 dev->bin_file_mode = mt76_check_bin_file_mode(&dev->mt76);
70 if (dev->bin_file_mode) {
71- dev->mt76.eeprom.size = MT7996_EEPROM_SIZE;
72+ dev->mt76.eeprom.size = mt7996_eeprom_size(dev);
73 dev->mt76.eeprom.data = devm_kzalloc(dev->mt76.dev, dev->mt76.eeprom.size,
74 GFP_KERNEL);
75 if (!dev->mt76.eeprom.data)
76@@ -153,7 +163,7 @@ static int mt7996_eeprom_load_flash(struct mt7996_dev *dev)
77 if (mt7996_check_eeprom(dev))
78 return 0;
79 } else {
80- ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
81+ ret = mt76_eeprom_init(&dev->mt76, mt7996_eeprom_size(dev));
82 }
83
84 return ret;
85@@ -186,6 +196,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
86 {
87 int ret;
88 u8 free_block_num;
89+ u16 eeprom_size = mt7996_eeprom_size(dev);
90 u32 block_num, i;
91 u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;
92
93@@ -200,7 +211,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
94 return -EINVAL;
95
96 /* read eeprom data from efuse */
97- block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
98+ block_num = DIV_ROUND_UP(eeprom_size, eeprom_blk_size);
99 for (i = 0; i < block_num; i++) {
100 ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size);
101 if (ret < 0)
102diff --git a/mt7996/mcu.c b/mt7996/mcu.c
103index 255d0ba..e9088ba 100644
104--- a/mt7996/mcu.c
105+++ b/mt7996/mcu.c
106@@ -3425,7 +3425,7 @@ static int mt7996_mcu_set_eeprom_flash(struct mt7996_dev *dev)
107 .tag = cpu_to_le16(UNI_EFUSE_BUFFER_MODE),
108 .buffer_mode = EE_MODE_BUFFER
109 };
110- u16 eeprom_size = MT7996_EEPROM_SIZE;
111+ u16 eeprom_size = mt7996_eeprom_size(dev);
112 u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE);
113 u8 *eep = (u8 *)dev->mt76.eeprom.data;
114 int eep_len, i;
115diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
116index eb192eb..433d886 100644
117--- a/mt7996/mt7996.h
118+++ b/mt7996/mt7996.h
119@@ -44,7 +44,12 @@
120 #define MT7996_EEPROM_DEFAULT "mediatek/mt7996/mt7996_eeprom.bin"
121 #define MT7996_EEPROM_DEFAULT_404 "mediatek/mt7996/mt7996_eeprom_dual_404.bin"
122 #define MT7996_EEPROM_DEFAULT_TM "mediatek/mt7996/mt7996_eeprom_tm.bin"
123+#define MT7992_EEPROM_DEFAULT "mediatek/mt7996/mt7992_eeprom.bin"
124+#define MT7992_EEPROM_DEFAULT_TM "mediatek/mt7996/mt7992_eeprom_tm.bin"
125+
126 #define MT7996_EEPROM_SIZE 7680
127+#define MT7992_EEPROM_SIZE 7680
128+
129 #define MT7996_EEPROM_BLOCK_SIZE 16
130 #define MT7996_TOKEN_SIZE 16384
131 #define MT7996_HW_TOKEN_SIZE 8192
132@@ -643,6 +648,11 @@ void mt7996_mcu_scs_sta_poll(struct work_struct *work);
133 void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
134 #endif
135
136+static inline u16 mt7996_eeprom_size(struct mt7996_dev *dev)
137+{
138+ return is_mt7996(&dev->mt76) ? MT7996_EEPROM_SIZE : MT7992_EEPROM_SIZE;
139+}
140+
141 static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
142 {
143 return min(MT7996_MAX_INTERFACES * (1 + dev->dbdc_support + dev->tbtc_support),
144--
1452.18.0
146