1 // SPDX-License-Identifier: ISC 2 /* Copyright (C) 2020 MediaTek Inc. */ 3 4 #include <linux/firmware.h> 5 #include <linux/moduleparam.h> 6 #include "mt7915.h" 7 #include "eeprom.h" 8 9 static bool enable_6ghz; 10 module_param(enable_6ghz, bool, 0644); 11 MODULE_PARM_DESC(enable_6ghz, "Enable 6 GHz instead of 5 GHz on hardware that supports both"); 12 13 static int mt7915_eeprom_load_precal(struct mt7915_dev *dev) 14 { 15 struct mt76_dev *mdev = &dev->mt76; 16 u8 *eeprom = mdev->eeprom.data; 17 u32 offs = is_mt7915(&dev->mt76) ? MT_EE_DO_PRE_CAL : MT_EE_DO_PRE_CAL_V2; 18 u32 size, val = eeprom[offs]; 19 int ret; 20 21 if (!dev->flash_mode || !val) 22 return 0; 23 24 size = mt7915_get_cal_group_size(dev) + mt7915_get_cal_dpd_size(dev); 25 26 dev->cal = devm_kzalloc(mdev->dev, size, GFP_KERNEL); 27 if (!dev->cal) 28 return -ENOMEM; 29 30 offs = is_mt7915(&dev->mt76) ? MT_EE_PRECAL : MT_EE_PRECAL_V2; 31 32 ret = mt76_get_of_data_from_mtd(mdev, dev->cal, offs, size); 33 if (!ret) 34 return ret; 35 36 ret = mt76_get_of_data_from_nvmem(mdev, dev->cal, "precal", size); 37 if (!ret) 38 return ret; 39 40 dev_warn(mdev->dev, "missing precal data, size=%d\n", size); 41 devm_kfree(mdev->dev, dev->cal); 42 dev->cal = NULL; 43 44 return ret; 45 } 46 47 static int mt7915_check_eeprom(struct mt7915_dev *dev) 48 { 49 u8 *eeprom = dev->mt76.eeprom.data; 50 u16 val = get_unaligned_le16(eeprom); 51 52 #define CHECK_EEPROM_ERR(match) (match ? 0 : -EINVAL) 53 switch (val) { 54 case 0x7915: 55 return CHECK_EEPROM_ERR(is_mt7915(&dev->mt76)); 56 case 0x7916: 57 return CHECK_EEPROM_ERR(is_mt7916(&dev->mt76)); 58 case 0x7981: 59 return CHECK_EEPROM_ERR(is_mt7981(&dev->mt76)); 60 case 0x7986: 61 return CHECK_EEPROM_ERR(is_mt7986(&dev->mt76)); 62 default: 63 return -EINVAL; 64 } 65 } 66 67 static char *mt7915_eeprom_name(struct mt7915_dev *dev) 68 { 69 switch (mt76_chip(&dev->mt76)) { 70 case 0x7915: 71 return dev->dbdc_support ? 72 MT7915_EEPROM_DEFAULT_DBDC : MT7915_EEPROM_DEFAULT; 73 case 0x7981: 74 /* mt7981 only supports mt7976 and only in DBDC mode */ 75 return MT7981_EEPROM_MT7976_DEFAULT_DBDC; 76 case 0x7986: 77 switch (mt7915_check_adie(dev, true)) { 78 case MT7976_ONE_ADIE_DBDC: 79 return MT7986_EEPROM_MT7976_DEFAULT_DBDC; 80 case MT7975_ONE_ADIE: 81 return MT7986_EEPROM_MT7975_DEFAULT; 82 case MT7976_ONE_ADIE: 83 return MT7986_EEPROM_MT7976_DEFAULT; 84 case MT7975_DUAL_ADIE: 85 return MT7986_EEPROM_MT7975_DUAL_DEFAULT; 86 case MT7976_DUAL_ADIE: 87 return MT7986_EEPROM_MT7976_DUAL_DEFAULT; 88 default: 89 break; 90 } 91 return NULL; 92 default: 93 return MT7916_EEPROM_DEFAULT; 94 } 95 } 96 97 static int 98 mt7915_eeprom_load_default(struct mt7915_dev *dev) 99 { 100 u8 *eeprom = dev->mt76.eeprom.data; 101 const struct firmware *fw = NULL; 102 int ret; 103 104 ret = request_firmware(&fw, mt7915_eeprom_name(dev), dev->mt76.dev); 105 if (ret) 106 return ret; 107 108 if (!fw || !fw->data) { 109 dev_err(dev->mt76.dev, "Invalid default bin\n"); 110 ret = -EINVAL; 111 goto out; 112 } 113 114 memcpy(eeprom, fw->data, mt7915_eeprom_size(dev)); 115 dev->flash_mode = true; 116 117 out: 118 release_firmware(fw); 119 120 return ret; 121 } 122 123 static int mt7915_eeprom_load(struct mt7915_dev *dev) 124 { 125 int ret; 126 u16 eeprom_size = mt7915_eeprom_size(dev); 127 128 ret = mt76_eeprom_init(&dev->mt76, eeprom_size); 129 if (ret < 0) 130 return ret; 131 132 if (ret) { 133 dev->flash_mode = true; 134 } else { 135 u8 free_block_num; 136 u32 block_num, i; 137 u32 eeprom_blk_size = MT7915_EEPROM_BLOCK_SIZE; 138 139 ret = mt7915_mcu_get_eeprom_free_block(dev, &free_block_num); 140 if (ret < 0) 141 return ret; 142 143 /* efuse info isn't enough */ 144 if (free_block_num >= 29) 145 return -EINVAL; 146 147 /* read eeprom data from efuse */ 148 block_num = DIV_ROUND_UP(eeprom_size, eeprom_blk_size); 149 for (i = 0; i < block_num; i++) { 150 ret = mt7915_mcu_get_eeprom(dev, i * eeprom_blk_size); 151 if (ret < 0) 152 return ret; 153 } 154 } 155 156 return mt7915_check_eeprom(dev); 157 } 158 159 static void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy) 160 { 161 struct mt7915_dev *dev = phy->dev; 162 u8 *eeprom = dev->mt76.eeprom.data; 163 u8 band = phy->mt76->band_idx; 164 u32 val; 165 166 val = eeprom[MT_EE_WIFI_CONF + band]; 167 val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val); 168 169 if (!is_mt7915(&dev->mt76)) { 170 switch (val) { 171 case MT_EE_V2_BAND_SEL_5GHZ: 172 phy->mt76->cap.has_5ghz = true; 173 return; 174 case MT_EE_V2_BAND_SEL_6GHZ: 175 phy->mt76->cap.has_6ghz = true; 176 return; 177 case MT_EE_V2_BAND_SEL_5GHZ_6GHZ: 178 if (enable_6ghz) { 179 phy->mt76->cap.has_6ghz = true; 180 u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band], 181 MT_EE_V2_BAND_SEL_6GHZ, 182 MT_EE_WIFI_CONF0_BAND_SEL); 183 } else { 184 phy->mt76->cap.has_5ghz = true; 185 u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band], 186 MT_EE_V2_BAND_SEL_5GHZ, 187 MT_EE_WIFI_CONF0_BAND_SEL); 188 } 189 /* force to buffer mode */ 190 dev->flash_mode = true; 191 192 return; 193 default: 194 phy->mt76->cap.has_2ghz = true; 195 return; 196 } 197 } else if (val == MT_EE_BAND_SEL_DEFAULT && dev->dbdc_support) { 198 val = band ? MT_EE_BAND_SEL_5GHZ : MT_EE_BAND_SEL_2GHZ; 199 } 200 201 switch (val) { 202 case MT_EE_BAND_SEL_5GHZ: 203 phy->mt76->cap.has_5ghz = true; 204 break; 205 case MT_EE_BAND_SEL_2GHZ: 206 phy->mt76->cap.has_2ghz = true; 207 break; 208 default: 209 phy->mt76->cap.has_2ghz = true; 210 phy->mt76->cap.has_5ghz = true; 211 break; 212 } 213 } 214 215 void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, 216 struct mt7915_phy *phy) 217 { 218 u8 path, nss, nss_max = 4, *eeprom = dev->mt76.eeprom.data; 219 struct mt76_phy *mphy = phy->mt76; 220 u8 band = phy->mt76->band_idx; 221 222 mt7915_eeprom_parse_band_config(phy); 223 224 /* read tx/rx path from eeprom */ 225 if (is_mt7915(&dev->mt76)) { 226 path = FIELD_GET(MT_EE_WIFI_CONF0_TX_PATH, 227 eeprom[MT_EE_WIFI_CONF]); 228 } else { 229 path = FIELD_GET(MT_EE_WIFI_CONF0_TX_PATH, 230 eeprom[MT_EE_WIFI_CONF + band]); 231 } 232 233 if (!path || path > 4) 234 path = 4; 235 236 /* read tx/rx stream */ 237 nss = path; 238 if (dev->dbdc_support) { 239 if (is_mt7915(&dev->mt76)) { 240 path = min_t(u8, path, 2); 241 nss = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B0, 242 eeprom[MT_EE_WIFI_CONF + 3]); 243 if (band) 244 nss = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B1, 245 eeprom[MT_EE_WIFI_CONF + 3]); 246 } else { 247 nss = FIELD_GET(MT_EE_WIFI_CONF_STREAM_NUM, 248 eeprom[MT_EE_WIFI_CONF + 2 + band]); 249 } 250 251 if (!is_mt798x(&dev->mt76)) 252 nss_max = 2; 253 } 254 255 if (!nss) 256 nss = nss_max; 257 nss = min_t(u8, min_t(u8, nss_max, nss), path); 258 259 mphy->chainmask = BIT(path) - 1; 260 if (band) 261 mphy->chainmask <<= dev->chainshift; 262 mphy->antenna_mask = BIT(nss) - 1; 263 dev->chainmask |= mphy->chainmask; 264 dev->chainshift = hweight8(dev->mphy.chainmask); 265 } 266 267 int mt7915_eeprom_init(struct mt7915_dev *dev) 268 { 269 int ret; 270 271 ret = mt7915_eeprom_load(dev); 272 if (ret < 0) { 273 if (ret != -EINVAL) 274 return ret; 275 276 dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n"); 277 ret = mt7915_eeprom_load_default(dev); 278 if (ret) 279 return ret; 280 } 281 282 mt7915_eeprom_load_precal(dev); 283 mt7915_eeprom_parse_hw_cap(dev, &dev->phy); 284 #if defined(__linux__) 285 memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, 286 #elif defined(__FreeBSD__) 287 memcpy(dev->mphy.macaddr, (u8 *)dev->mt76.eeprom.data + MT_EE_MAC_ADDR, 288 #endif 289 ETH_ALEN); 290 291 mt76_eeprom_override(&dev->mphy); 292 293 return 0; 294 } 295 296 int mt7915_eeprom_get_target_power(struct mt7915_dev *dev, 297 struct ieee80211_channel *chan, 298 u8 chain_idx) 299 { 300 u8 *eeprom = dev->mt76.eeprom.data; 301 int index, target_power; 302 bool tssi_on, is_7976; 303 304 if (chain_idx > 3) 305 return -EINVAL; 306 307 tssi_on = mt7915_tssi_enabled(dev, chan->band); 308 is_7976 = mt7915_check_adie(dev, false) || is_mt7916(&dev->mt76); 309 310 if (chan->band == NL80211_BAND_2GHZ) { 311 if (is_7976) { 312 index = MT_EE_TX0_POWER_2G_V2 + chain_idx; 313 target_power = eeprom[index]; 314 } else { 315 index = MT_EE_TX0_POWER_2G + chain_idx * 3; 316 target_power = eeprom[index]; 317 318 if (!tssi_on) 319 target_power += eeprom[index + 1]; 320 } 321 } else if (chan->band == NL80211_BAND_5GHZ) { 322 int group = mt7915_get_channel_group_5g(chan->hw_value, is_7976); 323 324 if (is_7976) { 325 index = MT_EE_TX0_POWER_5G_V2 + chain_idx * 5; 326 target_power = eeprom[index + group]; 327 } else { 328 index = MT_EE_TX0_POWER_5G + chain_idx * 12; 329 target_power = eeprom[index + group]; 330 331 if (!tssi_on) 332 target_power += eeprom[index + 8]; 333 } 334 } else { 335 int group = mt7915_get_channel_group_6g(chan->hw_value); 336 337 index = MT_EE_TX0_POWER_6G_V2 + chain_idx * 8; 338 target_power = is_7976 ? eeprom[index + group] : 0; 339 } 340 341 return target_power; 342 } 343 344 s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band) 345 { 346 u8 *eeprom = dev->mt76.eeprom.data; 347 u32 val, offs; 348 s8 delta; 349 bool is_7976 = mt7915_check_adie(dev, false) || is_mt7916(&dev->mt76); 350 351 if (band == NL80211_BAND_2GHZ) 352 offs = is_7976 ? MT_EE_RATE_DELTA_2G_V2 : MT_EE_RATE_DELTA_2G; 353 else if (band == NL80211_BAND_5GHZ) 354 offs = is_7976 ? MT_EE_RATE_DELTA_5G_V2 : MT_EE_RATE_DELTA_5G; 355 else 356 offs = is_7976 ? MT_EE_RATE_DELTA_6G_V2 : 0; 357 358 val = eeprom[offs]; 359 360 if (!offs || !(val & MT_EE_RATE_DELTA_EN)) 361 return 0; 362 363 delta = FIELD_GET(MT_EE_RATE_DELTA_MASK, val); 364 365 return val & MT_EE_RATE_DELTA_SIGN ? delta : -delta; 366 } 367 368 const u8 mt7915_sku_group_len[] = { 369 [SKU_CCK] = 4, 370 [SKU_OFDM] = 8, 371 [SKU_HT_BW20] = 8, 372 [SKU_HT_BW40] = 9, 373 [SKU_VHT_BW20] = 12, 374 [SKU_VHT_BW40] = 12, 375 [SKU_VHT_BW80] = 12, 376 [SKU_VHT_BW160] = 12, 377 [SKU_HE_RU26] = 12, 378 [SKU_HE_RU52] = 12, 379 [SKU_HE_RU106] = 12, 380 [SKU_HE_RU242] = 12, 381 [SKU_HE_RU484] = 12, 382 [SKU_HE_RU996] = 12, 383 [SKU_HE_RU2x996] = 12 384 }; 385