1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2022 MediaTek Inc.
6 #include <linux/firmware.h>
10 static int mt7996_check_eeprom(struct mt7996_dev
*dev
)
12 u8
*eeprom
= dev
->mt76
.eeprom
.data
;
13 u16 val
= get_unaligned_le16(eeprom
);
17 return is_mt7996(&dev
->mt76
) ? 0 : -EINVAL
;
19 return is_mt7992(&dev
->mt76
) ? 0 : -EINVAL
;
25 static char *mt7996_eeprom_name(struct mt7996_dev
*dev
)
27 switch (mt76_chip(&dev
->mt76
)) {
29 return MT7996_EEPROM_DEFAULT
;
31 return MT7992_EEPROM_DEFAULT
;
33 return MT7996_EEPROM_DEFAULT
;
38 mt7996_eeprom_load_default(struct mt7996_dev
*dev
)
40 u8
*eeprom
= dev
->mt76
.eeprom
.data
;
41 const struct firmware
*fw
= NULL
;
44 ret
= request_firmware(&fw
, mt7996_eeprom_name(dev
), dev
->mt76
.dev
);
48 if (!fw
|| !fw
->data
) {
49 dev_err(dev
->mt76
.dev
, "Invalid default bin\n");
54 memcpy(eeprom
, fw
->data
, MT7996_EEPROM_SIZE
);
55 dev
->flash_mode
= true;
63 static int mt7996_eeprom_load(struct mt7996_dev
*dev
)
67 ret
= mt76_eeprom_init(&dev
->mt76
, MT7996_EEPROM_SIZE
);
72 dev
->flash_mode
= true;
76 u32 eeprom_blk_size
= MT7996_EEPROM_BLOCK_SIZE
;
78 ret
= mt7996_mcu_get_eeprom_free_block(dev
, &free_block_num
);
82 /* efuse info isn't enough */
83 if (free_block_num
>= 59)
86 /* read eeprom data from efuse */
87 block_num
= DIV_ROUND_UP(MT7996_EEPROM_SIZE
, eeprom_blk_size
);
88 for (i
= 0; i
< block_num
; i
++) {
89 ret
= mt7996_mcu_get_eeprom(dev
, i
* eeprom_blk_size
);
95 return mt7996_check_eeprom(dev
);
98 static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev
*dev
)
100 #define MODE_HE_ONLY BIT(0)
101 #define WTBL_SIZE_GROUP GENMASK(31, 28)
105 ret
= mt7996_mcu_get_chip_config(dev
, &cap
);
110 dev
->has_eht
= !(cap
& MODE_HE_ONLY
);
111 dev
->wtbl_size_group
= u32_get_bits(cap
, WTBL_SIZE_GROUP
);
114 if (dev
->wtbl_size_group
< 2 || dev
->wtbl_size_group
> 4 ||
115 is_mt7992(&dev
->mt76
))
116 dev
->wtbl_size_group
= 2; /* set default */
121 static int mt7996_eeprom_parse_band_config(struct mt7996_phy
*phy
)
123 u8
*eeprom
= phy
->dev
->mt76
.eeprom
.data
;
124 u32 val
= eeprom
[MT_EE_WIFI_CONF
];
127 switch (phy
->mt76
->band_idx
) {
129 val
= FIELD_GET(MT_EE_WIFI_CONF1_BAND_SEL
, val
);
132 val
= eeprom
[MT_EE_WIFI_CONF
+ 1];
133 val
= FIELD_GET(MT_EE_WIFI_CONF2_BAND_SEL
, val
);
136 val
= FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL
, val
);
141 case MT_EE_BAND_SEL_2GHZ
:
142 phy
->mt76
->cap
.has_2ghz
= true;
144 case MT_EE_BAND_SEL_5GHZ
:
145 phy
->mt76
->cap
.has_5ghz
= true;
147 case MT_EE_BAND_SEL_6GHZ
:
148 phy
->mt76
->cap
.has_6ghz
= true;
158 int mt7996_eeprom_parse_hw_cap(struct mt7996_dev
*dev
, struct mt7996_phy
*phy
)
160 u8 path
, rx_path
, nss
, band_idx
= phy
->mt76
->band_idx
;
161 u8
*eeprom
= dev
->mt76
.eeprom
.data
;
162 struct mt76_phy
*mphy
= phy
->mt76
;
163 int max_path
= 5, max_nss
= 4;
168 path
= FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1
,
169 eeprom
[MT_EE_WIFI_CONF
+ 2]);
170 rx_path
= FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1
,
171 eeprom
[MT_EE_WIFI_CONF
+ 3]);
172 nss
= FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1
,
173 eeprom
[MT_EE_WIFI_CONF
+ 5]);
176 path
= FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2
,
177 eeprom
[MT_EE_WIFI_CONF
+ 2]);
178 rx_path
= FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2
,
179 eeprom
[MT_EE_WIFI_CONF
+ 4]);
180 nss
= FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2
,
181 eeprom
[MT_EE_WIFI_CONF
+ 5]);
184 path
= FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0
,
185 eeprom
[MT_EE_WIFI_CONF
+ 1]);
186 rx_path
= FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0
,
187 eeprom
[MT_EE_WIFI_CONF
+ 3]);
188 nss
= FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0
,
189 eeprom
[MT_EE_WIFI_CONF
+ 4]);
193 if (!path
|| path
> max_path
)
196 if (!nss
|| nss
> max_nss
)
199 nss
= min_t(u8
, nss
, path
);
202 phy
->has_aux_rx
= true;
204 mphy
->antenna_mask
= BIT(nss
) - 1;
205 mphy
->chainmask
= (BIT(path
) - 1) << dev
->chainshift
[band_idx
];
206 dev
->chainmask
|= mphy
->chainmask
;
207 if (band_idx
< MT_BAND2
)
208 dev
->chainshift
[band_idx
+ 1] = dev
->chainshift
[band_idx
] +
209 hweight16(mphy
->chainmask
);
211 ret
= mt7996_eeprom_parse_efuse_hw_cap(dev
);
215 return mt7996_eeprom_parse_band_config(phy
);
218 int mt7996_eeprom_init(struct mt7996_dev
*dev
)
222 ret
= mt7996_eeprom_load(dev
);
227 dev_warn(dev
->mt76
.dev
, "eeprom load fail, use default bin\n");
228 ret
= mt7996_eeprom_load_default(dev
);
233 ret
= mt7996_eeprom_parse_hw_cap(dev
, &dev
->phy
);
237 memcpy(dev
->mphy
.macaddr
, dev
->mt76
.eeprom
.data
+ MT_EE_MAC_ADDR
, ETH_ALEN
);
238 mt76_eeprom_override(&dev
->mphy
);
243 int mt7996_eeprom_get_target_power(struct mt7996_dev
*dev
,
244 struct ieee80211_channel
*chan
)
246 u8
*eeprom
= dev
->mt76
.eeprom
.data
;
249 if (chan
->band
== NL80211_BAND_5GHZ
)
250 target_power
= eeprom
[MT_EE_TX0_POWER_5G
+
251 mt7996_get_channel_group_5g(chan
->hw_value
)];
252 else if (chan
->band
== NL80211_BAND_6GHZ
)
253 target_power
= eeprom
[MT_EE_TX0_POWER_6G
+
254 mt7996_get_channel_group_6g(chan
->hw_value
)];
256 target_power
= eeprom
[MT_EE_TX0_POWER_2G
];
261 s8
mt7996_eeprom_get_power_delta(struct mt7996_dev
*dev
, int band
)
263 u8
*eeprom
= dev
->mt76
.eeprom
.data
;
267 if (band
== NL80211_BAND_5GHZ
)
268 val
= eeprom
[MT_EE_RATE_DELTA_5G
];
269 else if (band
== NL80211_BAND_6GHZ
)
270 val
= eeprom
[MT_EE_RATE_DELTA_6G
];
272 val
= eeprom
[MT_EE_RATE_DELTA_2G
];
274 if (!(val
& MT_EE_RATE_DELTA_EN
))
277 delta
= FIELD_GET(MT_EE_RATE_DELTA_MASK
, val
);
279 return val
& MT_EE_RATE_DELTA_SIGN
? delta
: -delta
;