16c92544dSBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
26c92544dSBjoern A. Zeeb /* Copyright (C) 2020 MediaTek Inc. */
36c92544dSBjoern A. Zeeb
46c92544dSBjoern A. Zeeb #ifndef __MT7915_EEPROM_H
56c92544dSBjoern A. Zeeb #define __MT7915_EEPROM_H
66c92544dSBjoern A. Zeeb
76c92544dSBjoern A. Zeeb #include "mt7915.h"
86c92544dSBjoern A. Zeeb
96c92544dSBjoern A. Zeeb struct cal_data {
106c92544dSBjoern A. Zeeb u8 count;
116c92544dSBjoern A. Zeeb u16 offset[60];
126c92544dSBjoern A. Zeeb };
136c92544dSBjoern A. Zeeb
146c92544dSBjoern A. Zeeb enum mt7915_eeprom_field {
156c92544dSBjoern A. Zeeb MT_EE_CHIP_ID = 0x000,
166c92544dSBjoern A. Zeeb MT_EE_VERSION = 0x002,
176c92544dSBjoern A. Zeeb MT_EE_MAC_ADDR = 0x004,
186c92544dSBjoern A. Zeeb MT_EE_MAC_ADDR2 = 0x00a,
196c92544dSBjoern A. Zeeb MT_EE_DDIE_FT_VERSION = 0x050,
206c92544dSBjoern A. Zeeb MT_EE_DO_PRE_CAL = 0x062,
216c92544dSBjoern A. Zeeb MT_EE_WIFI_CONF = 0x190,
22*8ba4d145SBjoern A. Zeeb MT_EE_DO_PRE_CAL_V2 = 0x19a,
236c92544dSBjoern A. Zeeb MT_EE_RATE_DELTA_2G = 0x252,
246c92544dSBjoern A. Zeeb MT_EE_RATE_DELTA_5G = 0x29d,
256c92544dSBjoern A. Zeeb MT_EE_TX0_POWER_2G = 0x2fc,
266c92544dSBjoern A. Zeeb MT_EE_TX0_POWER_5G = 0x34b,
276c92544dSBjoern A. Zeeb MT_EE_RATE_DELTA_2G_V2 = 0x7d3,
286c92544dSBjoern A. Zeeb MT_EE_RATE_DELTA_5G_V2 = 0x81e,
296c92544dSBjoern A. Zeeb MT_EE_RATE_DELTA_6G_V2 = 0x884, /* 6g fields only appear in eeprom v2 */
306c92544dSBjoern A. Zeeb MT_EE_TX0_POWER_2G_V2 = 0x441,
316c92544dSBjoern A. Zeeb MT_EE_TX0_POWER_5G_V2 = 0x445,
326c92544dSBjoern A. Zeeb MT_EE_TX0_POWER_6G_V2 = 0x465,
336c92544dSBjoern A. Zeeb MT_EE_ADIE_FT_VERSION = 0x9a0,
346c92544dSBjoern A. Zeeb
356c92544dSBjoern A. Zeeb __MT_EE_MAX = 0xe00,
366c92544dSBjoern A. Zeeb __MT_EE_MAX_V2 = 0x1000,
376c92544dSBjoern A. Zeeb /* 0xe10 ~ 0x5780 used to save group cal data */
386c92544dSBjoern A. Zeeb MT_EE_PRECAL = 0xe10,
396c92544dSBjoern A. Zeeb MT_EE_PRECAL_V2 = 0x1010
406c92544dSBjoern A. Zeeb };
416c92544dSBjoern A. Zeeb
426c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CAL_GROUP BIT(0)
43*8ba4d145SBjoern A. Zeeb #define MT_EE_WIFI_CAL_DPD_2G BIT(2)
44*8ba4d145SBjoern A. Zeeb #define MT_EE_WIFI_CAL_DPD_5G BIT(1)
45*8ba4d145SBjoern A. Zeeb #define MT_EE_WIFI_CAL_DPD_6G BIT(3)
46*8ba4d145SBjoern A. Zeeb #define MT_EE_WIFI_CAL_DPD GENMASK(3, 1)
476c92544dSBjoern A. Zeeb #define MT_EE_CAL_UNIT 1024
48*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_GROUP_SIZE_7915 (49 * MT_EE_CAL_UNIT + 16)
49*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_GROUP_SIZE_7916 (54 * MT_EE_CAL_UNIT + 16)
50*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_GROUP_SIZE_7975 (54 * MT_EE_CAL_UNIT + 16)
51*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_GROUP_SIZE_7976 (94 * MT_EE_CAL_UNIT + 16)
52*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_GROUP_SIZE_7916_6G (94 * MT_EE_CAL_UNIT + 16)
53*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_DPD_SIZE_V1 (54 * MT_EE_CAL_UNIT)
54*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_DPD_SIZE_V2 (300 * MT_EE_CAL_UNIT)
55*8ba4d145SBjoern A. Zeeb #define MT_EE_CAL_DPD_SIZE_V2_7981 (102 * MT_EE_CAL_UNIT) /* no 6g dpd data */
566c92544dSBjoern A. Zeeb
576c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF0_TX_PATH GENMASK(2, 0)
586c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF0_BAND_SEL GENMASK(7, 6)
596c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF1_BAND_SEL GENMASK(7, 6)
606c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF_STREAM_NUM GENMASK(7, 5)
616c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF3_TX_PATH_B0 GENMASK(1, 0)
626c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF3_TX_PATH_B1 GENMASK(5, 4)
636c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF7_TSSI0_2G BIT(0)
646c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF7_TSSI0_5G BIT(2)
656c92544dSBjoern A. Zeeb #define MT_EE_WIFI_CONF7_TSSI1_5G BIT(4)
666c92544dSBjoern A. Zeeb
676c92544dSBjoern A. Zeeb #define MT_EE_RATE_DELTA_MASK GENMASK(5, 0)
686c92544dSBjoern A. Zeeb #define MT_EE_RATE_DELTA_SIGN BIT(6)
696c92544dSBjoern A. Zeeb #define MT_EE_RATE_DELTA_EN BIT(7)
706c92544dSBjoern A. Zeeb
716c92544dSBjoern A. Zeeb enum mt7915_adie_sku {
726c92544dSBjoern A. Zeeb MT7976_ONE_ADIE_DBDC = 0x7,
736c92544dSBjoern A. Zeeb MT7975_ONE_ADIE = 0x8,
746c92544dSBjoern A. Zeeb MT7976_ONE_ADIE = 0xa,
756c92544dSBjoern A. Zeeb MT7975_DUAL_ADIE = 0xd,
766c92544dSBjoern A. Zeeb MT7976_DUAL_ADIE = 0xf,
776c92544dSBjoern A. Zeeb };
786c92544dSBjoern A. Zeeb
796c92544dSBjoern A. Zeeb enum mt7915_eeprom_band {
806c92544dSBjoern A. Zeeb MT_EE_BAND_SEL_DEFAULT,
816c92544dSBjoern A. Zeeb MT_EE_BAND_SEL_5GHZ,
826c92544dSBjoern A. Zeeb MT_EE_BAND_SEL_2GHZ,
836c92544dSBjoern A. Zeeb MT_EE_BAND_SEL_DUAL,
846c92544dSBjoern A. Zeeb };
856c92544dSBjoern A. Zeeb
866c92544dSBjoern A. Zeeb enum {
876c92544dSBjoern A. Zeeb MT_EE_V2_BAND_SEL_2GHZ,
886c92544dSBjoern A. Zeeb MT_EE_V2_BAND_SEL_5GHZ,
896c92544dSBjoern A. Zeeb MT_EE_V2_BAND_SEL_6GHZ,
906c92544dSBjoern A. Zeeb MT_EE_V2_BAND_SEL_5GHZ_6GHZ,
916c92544dSBjoern A. Zeeb };
926c92544dSBjoern A. Zeeb
936c92544dSBjoern A. Zeeb enum mt7915_sku_rate_group {
946c92544dSBjoern A. Zeeb SKU_CCK,
956c92544dSBjoern A. Zeeb SKU_OFDM,
966c92544dSBjoern A. Zeeb SKU_HT_BW20,
976c92544dSBjoern A. Zeeb SKU_HT_BW40,
986c92544dSBjoern A. Zeeb SKU_VHT_BW20,
996c92544dSBjoern A. Zeeb SKU_VHT_BW40,
1006c92544dSBjoern A. Zeeb SKU_VHT_BW80,
1016c92544dSBjoern A. Zeeb SKU_VHT_BW160,
1026c92544dSBjoern A. Zeeb SKU_HE_RU26,
1036c92544dSBjoern A. Zeeb SKU_HE_RU52,
1046c92544dSBjoern A. Zeeb SKU_HE_RU106,
1056c92544dSBjoern A. Zeeb SKU_HE_RU242,
1066c92544dSBjoern A. Zeeb SKU_HE_RU484,
1076c92544dSBjoern A. Zeeb SKU_HE_RU996,
1086c92544dSBjoern A. Zeeb SKU_HE_RU2x996,
1096c92544dSBjoern A. Zeeb MAX_SKU_RATE_GROUP_NUM,
1106c92544dSBjoern A. Zeeb };
1116c92544dSBjoern A. Zeeb
1126c92544dSBjoern A. Zeeb static inline int
mt7915_get_channel_group_5g(int channel,bool is_7976)1136c92544dSBjoern A. Zeeb mt7915_get_channel_group_5g(int channel, bool is_7976)
1146c92544dSBjoern A. Zeeb {
1156c92544dSBjoern A. Zeeb if (is_7976) {
1166c92544dSBjoern A. Zeeb if (channel <= 64)
1176c92544dSBjoern A. Zeeb return 0;
1186c92544dSBjoern A. Zeeb if (channel <= 96)
1196c92544dSBjoern A. Zeeb return 1;
1206c92544dSBjoern A. Zeeb if (channel <= 128)
1216c92544dSBjoern A. Zeeb return 2;
1226c92544dSBjoern A. Zeeb if (channel <= 144)
1236c92544dSBjoern A. Zeeb return 3;
1246c92544dSBjoern A. Zeeb return 4;
1256c92544dSBjoern A. Zeeb }
1266c92544dSBjoern A. Zeeb
1276c92544dSBjoern A. Zeeb if (channel >= 184 && channel <= 196)
1286c92544dSBjoern A. Zeeb return 0;
1296c92544dSBjoern A. Zeeb if (channel <= 48)
1306c92544dSBjoern A. Zeeb return 1;
1316c92544dSBjoern A. Zeeb if (channel <= 64)
1326c92544dSBjoern A. Zeeb return 2;
1336c92544dSBjoern A. Zeeb if (channel <= 96)
1346c92544dSBjoern A. Zeeb return 3;
1356c92544dSBjoern A. Zeeb if (channel <= 112)
1366c92544dSBjoern A. Zeeb return 4;
1376c92544dSBjoern A. Zeeb if (channel <= 128)
1386c92544dSBjoern A. Zeeb return 5;
1396c92544dSBjoern A. Zeeb if (channel <= 144)
1406c92544dSBjoern A. Zeeb return 6;
1416c92544dSBjoern A. Zeeb return 7;
1426c92544dSBjoern A. Zeeb }
1436c92544dSBjoern A. Zeeb
1446c92544dSBjoern A. Zeeb static inline int
mt7915_get_channel_group_6g(int channel)1456c92544dSBjoern A. Zeeb mt7915_get_channel_group_6g(int channel)
1466c92544dSBjoern A. Zeeb {
1476c92544dSBjoern A. Zeeb if (channel <= 29)
1486c92544dSBjoern A. Zeeb return 0;
1496c92544dSBjoern A. Zeeb
1506c92544dSBjoern A. Zeeb return DIV_ROUND_UP(channel - 29, 32);
1516c92544dSBjoern A. Zeeb }
1526c92544dSBjoern A. Zeeb
1536c92544dSBjoern A. Zeeb static inline bool
mt7915_tssi_enabled(struct mt7915_dev * dev,enum nl80211_band band)1546c92544dSBjoern A. Zeeb mt7915_tssi_enabled(struct mt7915_dev *dev, enum nl80211_band band)
1556c92544dSBjoern A. Zeeb {
1566c92544dSBjoern A. Zeeb u8 *eep = dev->mt76.eeprom.data;
157*8ba4d145SBjoern A. Zeeb u8 offs = is_mt7981(&dev->mt76) ? 8 : 7;
158*8ba4d145SBjoern A. Zeeb u8 val = eep[MT_EE_WIFI_CONF + offs];
1596c92544dSBjoern A. Zeeb
1606c92544dSBjoern A. Zeeb if (band == NL80211_BAND_2GHZ)
1616c92544dSBjoern A. Zeeb return val & MT_EE_WIFI_CONF7_TSSI0_2G;
1626c92544dSBjoern A. Zeeb
1636c92544dSBjoern A. Zeeb if (dev->dbdc_support)
1646c92544dSBjoern A. Zeeb return val & MT_EE_WIFI_CONF7_TSSI1_5G;
1656c92544dSBjoern A. Zeeb else
1666c92544dSBjoern A. Zeeb return val & MT_EE_WIFI_CONF7_TSSI0_5G;
1676c92544dSBjoern A. Zeeb }
1686c92544dSBjoern A. Zeeb
169*8ba4d145SBjoern A. Zeeb static inline u32
mt7915_get_cal_group_size(struct mt7915_dev * dev)170*8ba4d145SBjoern A. Zeeb mt7915_get_cal_group_size(struct mt7915_dev *dev)
171*8ba4d145SBjoern A. Zeeb {
172*8ba4d145SBjoern A. Zeeb u8 *eep = dev->mt76.eeprom.data;
173*8ba4d145SBjoern A. Zeeb u32 val;
174*8ba4d145SBjoern A. Zeeb
175*8ba4d145SBjoern A. Zeeb if (is_mt7915(&dev->mt76)) {
176*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_GROUP_SIZE_7915;
177*8ba4d145SBjoern A. Zeeb } else if (is_mt7916(&dev->mt76)) {
178*8ba4d145SBjoern A. Zeeb val = eep[MT_EE_WIFI_CONF + 1];
179*8ba4d145SBjoern A. Zeeb val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val);
180*8ba4d145SBjoern A. Zeeb return (val == MT_EE_V2_BAND_SEL_6GHZ) ? MT_EE_CAL_GROUP_SIZE_7916_6G :
181*8ba4d145SBjoern A. Zeeb MT_EE_CAL_GROUP_SIZE_7916;
182*8ba4d145SBjoern A. Zeeb } else if (mt7915_check_adie(dev, false)) {
183*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_GROUP_SIZE_7976;
184*8ba4d145SBjoern A. Zeeb } else {
185*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_GROUP_SIZE_7975;
186*8ba4d145SBjoern A. Zeeb }
187*8ba4d145SBjoern A. Zeeb }
188*8ba4d145SBjoern A. Zeeb
189*8ba4d145SBjoern A. Zeeb static inline u32
mt7915_get_cal_dpd_size(struct mt7915_dev * dev)190*8ba4d145SBjoern A. Zeeb mt7915_get_cal_dpd_size(struct mt7915_dev *dev)
191*8ba4d145SBjoern A. Zeeb {
192*8ba4d145SBjoern A. Zeeb if (is_mt7915(&dev->mt76))
193*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_DPD_SIZE_V1;
194*8ba4d145SBjoern A. Zeeb else if (is_mt7981(&dev->mt76))
195*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_DPD_SIZE_V2_7981;
196*8ba4d145SBjoern A. Zeeb else
197*8ba4d145SBjoern A. Zeeb return MT_EE_CAL_DPD_SIZE_V2;
198*8ba4d145SBjoern A. Zeeb }
199*8ba4d145SBjoern A. Zeeb
2006c92544dSBjoern A. Zeeb extern const u8 mt7915_sku_group_len[MAX_SKU_RATE_GROUP_NUM];
2016c92544dSBjoern A. Zeeb
2026c92544dSBjoern A. Zeeb #endif
203