1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (C) 2022 MediaTek Inc. 4 */ 5 6 #include <linux/firmware.h> 7 #include "mt7996.h" 8 #include "eeprom.h" 9 10 static int mt7996_check_eeprom(struct mt7996_dev *dev) 11 { 12 u8 *eeprom = dev->mt76.eeprom.data; 13 u16 val = get_unaligned_le16(eeprom); 14 15 switch (val) { 16 case 0x7990: 17 return is_mt7996(&dev->mt76) ? 0 : -EINVAL; 18 case 0x7992: 19 return is_mt7992(&dev->mt76) ? 0 : -EINVAL; 20 default: 21 return -EINVAL; 22 } 23 } 24 25 static char *mt7996_eeprom_name(struct mt7996_dev *dev) 26 { 27 switch (mt76_chip(&dev->mt76)) { 28 case 0x7992: 29 switch (dev->var.type) { 30 case MT7992_VAR_TYPE_23: 31 if (dev->var.fem == MT7996_FEM_INT) 32 return MT7992_EEPROM_DEFAULT_23_INT; 33 return MT7992_EEPROM_DEFAULT_23; 34 case MT7992_VAR_TYPE_44: 35 default: 36 if (dev->var.fem == MT7996_FEM_INT) 37 return MT7992_EEPROM_DEFAULT_INT; 38 if (dev->var.fem == MT7996_FEM_MIX) 39 return MT7992_EEPROM_DEFAULT_MIX; 40 return MT7992_EEPROM_DEFAULT; 41 } 42 case 0x7990: 43 default: 44 switch (dev->var.type) { 45 case MT7996_VAR_TYPE_233: 46 if (dev->var.fem == MT7996_FEM_INT) 47 return MT7996_EEPROM_DEFAULT_233_INT; 48 return MT7996_EEPROM_DEFAULT_233; 49 case MT7996_VAR_TYPE_444: 50 default: 51 if (dev->var.fem == MT7996_FEM_INT) 52 return MT7996_EEPROM_DEFAULT_INT; 53 return MT7996_EEPROM_DEFAULT; 54 } 55 } 56 } 57 58 static void 59 mt7996_eeprom_parse_stream(const u8 *eeprom, u8 band_idx, u8 *path, 60 u8 *rx_path, u8 *nss) 61 { 62 switch (band_idx) { 63 case MT_BAND1: 64 *path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1, 65 eeprom[MT_EE_WIFI_CONF + 2]); 66 *rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1, 67 eeprom[MT_EE_WIFI_CONF + 3]); 68 *nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1, 69 eeprom[MT_EE_WIFI_CONF + 5]); 70 break; 71 case MT_BAND2: 72 *path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2, 73 eeprom[MT_EE_WIFI_CONF + 2]); 74 *rx_path = FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2, 75 eeprom[MT_EE_WIFI_CONF + 4]); 76 *nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2, 77 eeprom[MT_EE_WIFI_CONF + 5]); 78 break; 79 default: 80 *path = FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0, 81 eeprom[MT_EE_WIFI_CONF + 1]); 82 *rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0, 83 eeprom[MT_EE_WIFI_CONF + 3]); 84 *nss = FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0, 85 eeprom[MT_EE_WIFI_CONF + 4]); 86 break; 87 } 88 } 89 90 static bool mt7996_eeprom_variant_valid(struct mt7996_dev *dev, const u8 *def) 91 { 92 #define FEM_INT 0 93 #define FEM_EXT 3 94 u8 *eeprom = dev->mt76.eeprom.data, fem[2]; 95 int i; 96 97 for (i = 0; i < 2; i++) 98 fem[i] = u8_get_bits(eeprom[MT_EE_WIFI_CONF + 6 + i], 99 MT_EE_WIFI_PA_LNA_CONFIG); 100 101 if (dev->var.fem == MT7996_FEM_EXT && 102 !(fem[0] == FEM_EXT && fem[1] == FEM_EXT)) 103 return false; 104 else if (dev->var.fem == MT7996_FEM_INT && 105 !(fem[0] == FEM_INT && fem[1] == FEM_INT)) 106 return false; 107 else if (dev->var.fem == MT7996_FEM_MIX && 108 !(fem[0] == FEM_INT && fem[1] == FEM_EXT)) 109 return false; 110 111 for (i = 0; i < __MT_MAX_BAND; i++) { 112 u8 path, rx_path, nss; 113 u8 def_path, def_rx_path, def_nss; 114 115 if (!dev->mt76.phys[i]) 116 continue; 117 118 mt7996_eeprom_parse_stream(eeprom, i, &path, &rx_path, &nss); 119 mt7996_eeprom_parse_stream(def, i, &def_path, &def_rx_path, 120 &def_nss); 121 if (path > def_path || rx_path > def_rx_path || nss > def_nss) 122 return false; 123 } 124 125 return true; 126 } 127 128 static int 129 mt7996_eeprom_check_or_use_default(struct mt7996_dev *dev, bool use_default) 130 { 131 u8 *eeprom = dev->mt76.eeprom.data; 132 const struct firmware *fw = NULL; 133 int ret; 134 135 ret = request_firmware(&fw, mt7996_eeprom_name(dev), dev->mt76.dev); 136 if (ret) 137 return ret; 138 139 if (!fw || !fw->data) { 140 dev_err(dev->mt76.dev, "Invalid default bin\n"); 141 ret = -EINVAL; 142 goto out; 143 } 144 145 if (!use_default && mt7996_eeprom_variant_valid(dev, fw->data)) 146 goto out; 147 148 dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n"); 149 memcpy(eeprom, fw->data, MT7996_EEPROM_SIZE); 150 dev->flash_mode = true; 151 152 out: 153 release_firmware(fw); 154 155 return ret; 156 } 157 158 static int mt7996_eeprom_load(struct mt7996_dev *dev) 159 { 160 bool use_default = false; 161 int ret; 162 163 ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE); 164 if (ret < 0) 165 return ret; 166 167 if (ret && !mt7996_check_eeprom(dev)) { 168 dev->flash_mode = true; 169 goto out; 170 } 171 172 if (!dev->flash_mode) { 173 u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE; 174 u32 block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size); 175 u8 free_block_num; 176 int i; 177 178 memset(dev->mt76.eeprom.data, 0, MT7996_EEPROM_SIZE); 179 ret = mt7996_mcu_get_eeprom_free_block(dev, &free_block_num); 180 if (ret < 0) 181 return ret; 182 183 /* efuse info isn't enough */ 184 if (free_block_num >= 59) { 185 use_default = true; 186 goto out; 187 } 188 189 /* check if eeprom data from fw is valid */ 190 if (mt7996_mcu_get_eeprom(dev, 0, NULL, 0) || 191 mt7996_check_eeprom(dev)) { 192 use_default = true; 193 goto out; 194 } 195 196 /* read eeprom data from fw */ 197 for (i = 1; i < block_num; i++) { 198 u32 len = eeprom_blk_size; 199 200 if (i == block_num - 1) 201 len = MT7996_EEPROM_SIZE % eeprom_blk_size; 202 ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size, 203 NULL, len); 204 if (ret && ret != -EINVAL) { 205 use_default = true; 206 goto out; 207 } 208 } 209 } 210 211 out: 212 return mt7996_eeprom_check_or_use_default(dev, use_default); 213 } 214 215 static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_phy *phy, 216 u8 *path, u8 *rx_path, u8 *nss) 217 { 218 #define MODE_HE_ONLY BIT(0) 219 #define WTBL_SIZE_GROUP GENMASK(31, 28) 220 #define STREAM_CAP(_offs) ((cap & (0x7 << (_offs))) >> (_offs)) 221 struct mt7996_dev *dev = phy->dev; 222 u32 cap = 0; 223 int ret; 224 225 ret = mt7996_mcu_get_chip_config(dev, &cap); 226 if (ret) 227 return ret; 228 229 if (cap) { 230 u8 band_offs = phy->mt76->band_idx * 3; 231 232 dev->has_eht = !(cap & MODE_HE_ONLY); 233 dev->wtbl_size_group = u32_get_bits(cap, WTBL_SIZE_GROUP); 234 *nss = min_t(u8, *nss, STREAM_CAP(1 + band_offs)); 235 *path = min_t(u8, *path, STREAM_CAP(10 + band_offs)); 236 *rx_path = min_t(u8, *rx_path, STREAM_CAP(19 + band_offs)); 237 } 238 239 if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4) 240 dev->wtbl_size_group = is_mt7996(&dev->mt76) ? 4 : 2; 241 242 return 0; 243 } 244 245 static int mt7996_eeprom_parse_band_config(struct mt7996_phy *phy) 246 { 247 u8 *eeprom = phy->dev->mt76.eeprom.data; 248 u32 val = eeprom[MT_EE_WIFI_CONF]; 249 int ret = 0; 250 251 switch (phy->mt76->band_idx) { 252 case MT_BAND1: 253 val = FIELD_GET(MT_EE_WIFI_CONF1_BAND_SEL, val); 254 break; 255 case MT_BAND2: 256 val = eeprom[MT_EE_WIFI_CONF + 1]; 257 val = FIELD_GET(MT_EE_WIFI_CONF2_BAND_SEL, val); 258 break; 259 default: 260 val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val); 261 break; 262 } 263 264 switch (val) { 265 case MT_EE_BAND_SEL_2GHZ: 266 phy->mt76->cap.has_2ghz = true; 267 break; 268 case MT_EE_BAND_SEL_5GHZ: 269 phy->mt76->cap.has_5ghz = true; 270 break; 271 case MT_EE_BAND_SEL_6GHZ: 272 phy->mt76->cap.has_6ghz = true; 273 break; 274 default: 275 ret = -EINVAL; 276 break; 277 } 278 279 return ret; 280 } 281 282 int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy) 283 { 284 u8 path, rx_path, nss, band_idx = phy->mt76->band_idx; 285 u8 *eeprom = dev->mt76.eeprom.data; 286 struct mt76_phy *mphy = phy->mt76; 287 int max_path = 5, max_nss = 4; 288 int ret; 289 290 mt7996_eeprom_parse_stream(eeprom, band_idx, &path, &rx_path, &nss); 291 ret = mt7996_eeprom_parse_efuse_hw_cap(phy, &path, &rx_path, &nss); 292 if (ret) 293 return ret; 294 295 if (!path || path > max_path) 296 path = max_path; 297 298 if (!nss || nss > max_nss) 299 nss = max_nss; 300 301 nss = min_t(u8, nss, path); 302 303 if (path != rx_path) 304 phy->has_aux_rx = true; 305 306 mphy->antenna_mask = BIT(nss) - 1; 307 mphy->chainmask = (BIT(path) - 1) << dev->chainshift[band_idx]; 308 phy->orig_chainmask = mphy->chainmask; 309 dev->chainmask |= mphy->chainmask; 310 if (band_idx < MT_BAND2) 311 dev->chainshift[band_idx + 1] = dev->chainshift[band_idx] + 312 hweight16(mphy->chainmask); 313 314 return mt7996_eeprom_parse_band_config(phy); 315 } 316 317 int mt7996_eeprom_init(struct mt7996_dev *dev) 318 { 319 int ret; 320 321 ret = mt7996_eeprom_load(dev); 322 if (ret < 0) 323 return ret; 324 325 ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy); 326 if (ret < 0) 327 return ret; 328 329 memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, ETH_ALEN); 330 mt76_eeprom_override(&dev->mphy); 331 332 return 0; 333 } 334 335 int mt7996_eeprom_get_target_power(struct mt7996_dev *dev, 336 struct ieee80211_channel *chan) 337 { 338 u8 *eeprom = dev->mt76.eeprom.data; 339 int target_power; 340 341 if (chan->band == NL80211_BAND_5GHZ) 342 target_power = eeprom[MT_EE_TX0_POWER_5G + 343 mt7996_get_channel_group_5g(chan->hw_value)]; 344 else if (chan->band == NL80211_BAND_6GHZ) 345 target_power = eeprom[MT_EE_TX0_POWER_6G + 346 mt7996_get_channel_group_6g(chan->hw_value)]; 347 else 348 target_power = eeprom[MT_EE_TX0_POWER_2G]; 349 350 return target_power; 351 } 352 353 s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band) 354 { 355 u8 *eeprom = dev->mt76.eeprom.data; 356 u32 val; 357 s8 delta; 358 359 if (band == NL80211_BAND_5GHZ) 360 val = eeprom[MT_EE_RATE_DELTA_5G]; 361 else if (band == NL80211_BAND_6GHZ) 362 val = eeprom[MT_EE_RATE_DELTA_6G]; 363 else 364 val = eeprom[MT_EE_RATE_DELTA_2G]; 365 366 if (!(val & MT_EE_RATE_DELTA_EN)) 367 return 0; 368 369 delta = FIELD_GET(MT_EE_RATE_DELTA_MASK, val); 370 371 return val & MT_EE_RATE_DELTA_SIGN ? delta : -delta; 372 } 373