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