blob: 88296a5286ebde005b408a0bbc20408f6211e4d8 [file] [log] [blame]
From fa32fd17aed1561a48cff42344e06d5ebf5a736d Mon Sep 17 00:00:00 2001
From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Date: Thu, 12 Oct 2023 16:17:33 +0800
Subject: [PATCH 041/223] mtk: mt76: mt7996: add kite testmode support
Add Kite testmode support
1. avoid entering connac 2 testmode flow in kite
2. refactor prek implementation for handling chip difference
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
---
mt7996/eeprom.c | 63 +++++++++++++-----------------
mt7996/eeprom.h | 81 +++++++++++++++++++++++++++------------
mt7996/mcu.c | 48 ++++++++++++++---------
mt7996/mt7996.h | 18 ++++++++-
mt7996/testmode.c | 97 ++++++++++++++++++++++++++++-------------------
testmode.c | 17 ++++++---
6 files changed, 202 insertions(+), 122 deletions(-)
diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
index b71961d9..7575dcb9 100644
--- a/mt7996/eeprom.c
+++ b/mt7996/eeprom.c
@@ -29,12 +29,39 @@ const struct ieee80211_channel dpd_5g_skip_ch_list[] = {
CHAN5G(96, 5480)
};
+const struct ieee80211_channel dpd_5g_ch_list_bw80[] = {
+ CHAN5G(42, 5210),
+ CHAN5G(58, 5290),
+ CHAN5G(106, 5530),
+ CHAN5G(122, 5610),
+ CHAN5G(138, 5690),
+ CHAN5G(155, 5775),
+ CHAN5G(171, 5855)
+};
+
const struct ieee80211_channel dpd_5g_ch_list_bw160[] = {
CHAN5G(50, 5250),
CHAN5G(114, 5570),
CHAN5G(163, 5815)
};
+const struct ieee80211_channel dpd_6g_ch_list_bw80[] = {
+ CHAN6G(7, 5985),
+ CHAN6G(23, 6065),
+ CHAN6G(39, 6145),
+ CHAN6G(55, 6225),
+ CHAN6G(71, 6305),
+ CHAN6G(87, 6385),
+ CHAN6G(103, 6465),
+ CHAN6G(119, 6545),
+ CHAN6G(135, 6625),
+ CHAN6G(151, 6705),
+ CHAN6G(167, 6785),
+ CHAN6G(183, 6865),
+ CHAN6G(199, 6945),
+ CHAN6G(215, 7025)
+};
+
const struct ieee80211_channel dpd_6g_ch_list_bw160[] = {
CHAN6G(15, 6025),
CHAN6G(47, 6185),
@@ -54,12 +81,6 @@ const struct ieee80211_channel dpd_6g_ch_list_bw320[] = {
CHAN6G(191, 6905)
};
-const u32 dpd_2g_bw20_ch_num = ARRAY_SIZE(dpd_2g_ch_list_bw20);
-const u32 dpd_5g_skip_ch_num = ARRAY_SIZE(dpd_5g_skip_ch_list);
-const u32 dpd_5g_bw160_ch_num = ARRAY_SIZE(dpd_5g_ch_list_bw160);
-const u32 dpd_6g_bw160_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw160);
-const u32 dpd_6g_bw320_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw320);
-
static int mt7996_check_eeprom(struct mt7996_dev *dev)
{
u8 *eeprom = dev->mt76.eeprom.data;
@@ -182,36 +203,6 @@ static bool mt7996_eeprom_variant_valid(struct mt7996_dev *dev, const u8 *def)
return true;
}
-int
-mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band)
-{
- /* handle different sku */
- static const u8 band_to_idx[] = {
- [NL80211_BAND_2GHZ] = MT_BAND0,
- [NL80211_BAND_5GHZ] = MT_BAND1,
- [NL80211_BAND_6GHZ] = MT_BAND2,
- };
- struct mt7996_phy *phy = __mt7996_phy(dev, band_to_idx[band]);
- struct mt76_phy *mphy;
- int dpd_size;
-
- if (!phy)
- return 0;
-
- mphy = phy->mt76;
-
- if (band == NL80211_BAND_2GHZ)
- dpd_size = dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
- else if (band == NL80211_BAND_5GHZ)
- dpd_size = (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
- DPD_PER_CH_BW20_SIZE + dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
- else
- dpd_size = mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
- (dpd_6g_bw160_ch_num + dpd_6g_bw320_ch_num) * DPD_PER_CH_GT_BW20_SIZE;
-
- return dpd_size;
-}
-
static int
mt7996_eeprom_check_or_use_default(struct mt7996_dev *dev, bool use_default)
{
diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
index 782d847b..c3c248ca 100644
--- a/mt7996/eeprom.h
+++ b/mt7996/eeprom.h
@@ -45,36 +45,69 @@ enum mt7996_eeprom_field {
#define MT_EE_WIFI_CAL_DPD GENMASK(5, 3)
#define MT_EE_CAL_UNIT 1024
-#define MT_EE_CAL_GROUP_SIZE_2G (4 * MT_EE_CAL_UNIT)
-#define MT_EE_CAL_GROUP_SIZE_5G (45 * MT_EE_CAL_UNIT)
-#define MT_EE_CAL_GROUP_SIZE_6G (125 * MT_EE_CAL_UNIT)
-#define MT_EE_CAL_ADCDCOC_SIZE_2G (4 * 4)
-#define MT_EE_CAL_ADCDCOC_SIZE_5G (4 * 4)
-#define MT_EE_CAL_ADCDCOC_SIZE_6G (4 * 5)
-#define MT_EE_CAL_GROUP_SIZE (MT_EE_CAL_GROUP_SIZE_2G + \
- MT_EE_CAL_GROUP_SIZE_5G + \
- MT_EE_CAL_GROUP_SIZE_6G + \
- MT_EE_CAL_ADCDCOC_SIZE_2G + \
- MT_EE_CAL_ADCDCOC_SIZE_5G + \
- MT_EE_CAL_ADCDCOC_SIZE_6G)
-
-#define DPD_PER_CH_LEGACY_SIZE (4 * MT_EE_CAL_UNIT)
-#define DPD_PER_CH_MEM_SIZE (13 * MT_EE_CAL_UNIT)
-#define DPD_PER_CH_OTFG0_SIZE (2 * MT_EE_CAL_UNIT)
-#define DPD_PER_CH_BW20_SIZE (DPD_PER_CH_LEGACY_SIZE + DPD_PER_CH_OTFG0_SIZE)
-#define DPD_PER_CH_GT_BW20_SIZE (DPD_PER_CH_MEM_SIZE + DPD_PER_CH_OTFG0_SIZE)
-#define MT_EE_CAL_DPD_SIZE (780 * MT_EE_CAL_UNIT)
+
+enum mt7996_prek_rev {
+ GROUP_SIZE_2G,
+ GROUP_SIZE_5G,
+ GROUP_SIZE_6G,
+ ADCDCOC_SIZE_2G,
+ ADCDCOC_SIZE_5G,
+ ADCDCOC_SIZE_6G,
+ DPD_LEGACY_SIZE,
+ DPD_MEM_SIZE,
+ DPD_OTFG0_SIZE,
+};
+
+static const u32 mt7996_prek_rev[] = {
+ [GROUP_SIZE_2G] = 4 * MT_EE_CAL_UNIT,
+ [GROUP_SIZE_5G] = 45 * MT_EE_CAL_UNIT,
+ [GROUP_SIZE_6G] = 125 * MT_EE_CAL_UNIT,
+ [ADCDCOC_SIZE_2G] = 4 * 4,
+ [ADCDCOC_SIZE_5G] = 4 * 4,
+ [ADCDCOC_SIZE_6G] = 4 * 5,
+ [DPD_LEGACY_SIZE] = 4 * MT_EE_CAL_UNIT,
+ [DPD_MEM_SIZE] = 13 * MT_EE_CAL_UNIT,
+ [DPD_OTFG0_SIZE] = 2 * MT_EE_CAL_UNIT,
+};
+
+/* kite 2/5g config */
+static const u32 mt7992_prek_rev[] = {
+ [GROUP_SIZE_2G] = 4 * MT_EE_CAL_UNIT,
+ [GROUP_SIZE_5G] = 110 * MT_EE_CAL_UNIT,
+ [GROUP_SIZE_6G] = 0,
+ [ADCDCOC_SIZE_2G] = 4 * 4,
+ [ADCDCOC_SIZE_5G] = 4 * 5,
+ [ADCDCOC_SIZE_6G] = 0,
+ [DPD_LEGACY_SIZE] = 5 * MT_EE_CAL_UNIT,
+ [DPD_MEM_SIZE] = 16 * MT_EE_CAL_UNIT,
+ [DPD_OTFG0_SIZE] = 2 * MT_EE_CAL_UNIT,
+};
extern const struct ieee80211_channel dpd_2g_ch_list_bw20[];
-extern const u32 dpd_2g_bw20_ch_num;
extern const struct ieee80211_channel dpd_5g_skip_ch_list[];
-extern const u32 dpd_5g_skip_ch_num;
+extern const struct ieee80211_channel dpd_5g_ch_list_bw80[];
extern const struct ieee80211_channel dpd_5g_ch_list_bw160[];
-extern const u32 dpd_5g_bw160_ch_num;
+extern const struct ieee80211_channel dpd_6g_ch_list_bw80[];
extern const struct ieee80211_channel dpd_6g_ch_list_bw160[];
-extern const u32 dpd_6g_bw160_ch_num;
extern const struct ieee80211_channel dpd_6g_ch_list_bw320[];
-extern const u32 dpd_6g_bw320_ch_num;
+
+#define PREK(id) (dev->prek.rev[(id)])
+#define DPD_CH_NUM(_type) (dev->prek.dpd_ch_num[DPD_CH_NUM_##_type])
+#define MT_EE_CAL_GROUP_SIZE (PREK(GROUP_SIZE_2G) + PREK(GROUP_SIZE_5G) + \
+ PREK(GROUP_SIZE_6G) + PREK(ADCDCOC_SIZE_2G) + \
+ PREK(ADCDCOC_SIZE_5G) + PREK(ADCDCOC_SIZE_6G))
+#define DPD_PER_CH_BW20_SIZE (PREK(DPD_LEGACY_SIZE) + PREK(DPD_OTFG0_SIZE))
+#define DPD_PER_CH_GT_BW20_SIZE (PREK(DPD_MEM_SIZE) + PREK(DPD_OTFG0_SIZE))
+#define MT_EE_CAL_DPD_SIZE_2G (DPD_CH_NUM(BW20_2G) * DPD_PER_CH_BW20_SIZE)
+#define MT_EE_CAL_DPD_SIZE_5G (DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE + \
+ DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE + \
+ DPD_CH_NUM(BW160_5G) * DPD_PER_CH_GT_BW20_SIZE)
+#define MT_EE_CAL_DPD_SIZE_6G (DPD_CH_NUM(BW20_6G) * DPD_PER_CH_BW20_SIZE + \
+ DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE + \
+ DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE + \
+ DPD_CH_NUM(BW320_6G) * DPD_PER_CH_GT_BW20_SIZE)
+#define MT_EE_CAL_DPD_SIZE (MT_EE_CAL_DPD_SIZE_2G + MT_EE_CAL_DPD_SIZE_5G + \
+ MT_EE_CAL_DPD_SIZE_6G)
#define RF_DPD_FLAT_CAL BIT(28)
#define RF_PRE_CAL BIT(29)
diff --git a/mt7996/mcu.c b/mt7996/mcu.c
index 54a84966..87322283 100644
--- a/mt7996/mcu.c
+++ b/mt7996/mcu.c
@@ -3771,13 +3771,11 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
enum nl80211_chan_width bw = chandef->width;
const struct ieee80211_channel *chan_list;
u32 cal_id, chan_list_size, base_offset = 0, offs = MT_EE_DO_PRE_CAL;
- u32 dpd_size_2g, dpd_size_5g, per_chan_size = DPD_PER_CH_BW20_SIZE;
+ u32 per_chan_size = DPD_PER_CH_BW20_SIZE;
u16 channel = ieee80211_frequency_to_channel(chandef->center_freq1);
u8 dpd_mask, *cal = dev->cal, *eeprom = dev->mt76.eeprom.data;
int idx, i, ret;
-
- dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
- dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
+ bool has_skip_ch = (band == NL80211_BAND_5GHZ);
switch (band) {
case NL80211_BAND_2GHZ:
@@ -3793,27 +3791,35 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
return 0;
cal_id = RF_DPD_FLAT_CAL;
chan_list = dpd_2g_ch_list_bw20;
- chan_list_size = dpd_2g_bw20_ch_num;
+ chan_list_size = DPD_CH_NUM(BW20_2G);
break;
case NL80211_BAND_5GHZ:
dpd_mask = MT_EE_WIFI_CAL_DPD_5G;
cal_id = RF_DPD_FLAT_5G_CAL;
chan_list = mphy->sband_5g.sband.channels;
chan_list_size = mphy->sband_5g.sband.n_channels;
- base_offset += dpd_size_2g;
+ base_offset += MT_EE_CAL_DPD_SIZE_2G;
if (bw == NL80211_CHAN_WIDTH_160) {
- base_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
- DPD_PER_CH_BW20_SIZE;
+ base_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE +
+ DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE;
per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
cal_id = RF_DPD_FLAT_5G_MEM_CAL;
chan_list = dpd_5g_ch_list_bw160;
- chan_list_size = dpd_5g_bw160_ch_num;
+ chan_list_size = DPD_CH_NUM(BW160_5G);
+ has_skip_ch = false;
+ } else if (is_mt7992(&dev->mt76) && bw == NL80211_CHAN_WIDTH_80) {
+ base_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE;
+ per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
+ cal_id = RF_DPD_FLAT_5G_MEM_CAL;
+ chan_list = dpd_5g_ch_list_bw80;
+ chan_list_size = DPD_CH_NUM(BW80_5G);
+ has_skip_ch = false;
} else if (bw > NL80211_CHAN_WIDTH_20) {
/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
channel -= 2;
}
if (channel >= dpd_5g_skip_ch_list[0].hw_value &&
- channel <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
+ channel <= dpd_5g_skip_ch_list[DPD_CH_NUM(BW20_5G_SKIP) - 1].hw_value)
return 0;
break;
case NL80211_BAND_6GHZ:
@@ -3821,20 +3827,27 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
cal_id = RF_DPD_FLAT_6G_CAL;
chan_list = mphy->sband_6g.sband.channels;
chan_list_size = mphy->sband_6g.sband.n_channels;
- base_offset += dpd_size_2g + dpd_size_5g;
+ base_offset += MT_EE_CAL_DPD_SIZE_2G + MT_EE_CAL_DPD_SIZE_5G;
if (bw == NL80211_CHAN_WIDTH_160) {
base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
cal_id = RF_DPD_FLAT_6G_MEM_CAL;
chan_list = dpd_6g_ch_list_bw160;
- chan_list_size = dpd_6g_bw160_ch_num;
- } else if (bw == NL80211_CHAN_WIDTH_320) {
+ chan_list_size = DPD_CH_NUM(BW160_6G);
+ } else if (is_mt7996(&dev->mt76) && bw == NL80211_CHAN_WIDTH_320) {
base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
- dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
+ DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE +
+ DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE;
per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
cal_id = RF_DPD_FLAT_6G_MEM_CAL;
chan_list = dpd_6g_ch_list_bw320;
- chan_list_size = dpd_6g_bw320_ch_num;
+ chan_list_size = DPD_CH_NUM(BW320_6G);
+ } else if (is_mt7992(&dev->mt76) && bw == NL80211_CHAN_WIDTH_80) {
+ base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
+ per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
+ cal_id = RF_DPD_FLAT_6G_MEM_CAL;
+ chan_list = dpd_6g_ch_list_bw80;
+ chan_list_size = DPD_CH_NUM(BW80_6G);
} else if (bw > NL80211_CHAN_WIDTH_20) {
/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
channel -= 2;
@@ -3854,9 +3867,8 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
if (idx == chan_list_size)
return -EINVAL;
- if (band == NL80211_BAND_5GHZ && bw != NL80211_CHAN_WIDTH_160 &&
- channel > dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
- idx -= dpd_5g_skip_ch_num;
+ if (has_skip_ch && channel > dpd_5g_skip_ch_list[DPD_CH_NUM(BW20_5G_SKIP) - 1].hw_value)
+ idx -= DPD_CH_NUM(BW20_5G_SKIP);
cal += MT_EE_CAL_GROUP_SIZE + base_offset + idx * per_chan_size;
diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
index e406dc87..981f496e 100644
--- a/mt7996/mt7996.h
+++ b/mt7996/mt7996.h
@@ -203,6 +203,19 @@ struct mt7996_twt_flow {
DECLARE_EWMA(avg_signal, 10, 8)
+enum mt7996_dpd_ch_num {
+ DPD_CH_NUM_BW20_2G,
+ DPD_CH_NUM_BW20_5G,
+ DPD_CH_NUM_BW20_5G_SKIP,
+ DPD_CH_NUM_BW80_5G,
+ DPD_CH_NUM_BW160_5G,
+ DPD_CH_NUM_BW20_6G,
+ DPD_CH_NUM_BW80_6G,
+ DPD_CH_NUM_BW160_6G,
+ DPD_CH_NUM_BW320_6G,
+ DPD_CH_NUM_TYPE_MAX,
+};
+
struct mt7996_sta {
struct mt76_wcid wcid; /* must be first */
@@ -472,6 +485,10 @@ struct mt7996_dev {
void *cal;
u32 cur_prek_offset;
+ struct {
+ const u32 *rev;
+ u8 dpd_ch_num[DPD_CH_NUM_TYPE_MAX];
+ } prek;
struct {
u16 table_mask;
@@ -630,7 +647,6 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
struct ieee80211_channel *chan);
s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band);
-int mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band);
int mt7996_dma_init(struct mt7996_dev *dev);
void mt7996_dma_reset(struct mt7996_dev *dev, bool force);
void mt7996_dma_prefetch(struct mt7996_dev *dev);
diff --git a/mt7996/testmode.c b/mt7996/testmode.c
index 6de49afc..5c0eb3cb 100644
--- a/mt7996/testmode.c
+++ b/mt7996/testmode.c
@@ -440,7 +440,7 @@ mt7996_tm_set_tx_cont(struct mt7996_phy *phy, bool en)
static int
mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
{
- u8 *eeprom;
+ u8 *eeprom, do_precal;
u32 i, group_size, dpd_size, size, offs, *pre_cal;
int ret = 0;
struct mt7996_dev *dev = phy->dev;
@@ -468,6 +468,9 @@ mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
dpd_size = MT_EE_CAL_DPD_SIZE;
size = group_size + dpd_size;
offs = MT_EE_DO_PRE_CAL;
+ do_precal = (MT_EE_WIFI_CAL_GROUP_2G * !!PREK(GROUP_SIZE_2G)) |
+ (MT_EE_WIFI_CAL_GROUP_5G * !!PREK(GROUP_SIZE_5G)) |
+ (MT_EE_WIFI_CAL_GROUP_6G * !!PREK(GROUP_SIZE_6G));
switch (state) {
case MT76_TM_STATE_GROUP_PREK:
@@ -482,13 +485,10 @@ mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == group_size,
30 * HZ);
- if (ret) {
+ if (ret)
dev_err(dev->mt76.dev, "Group Pre-cal: mcu send msg failed!\n");
- return ret;
- }
-
- if (!ret)
- eeprom[offs] |= MT_EE_WIFI_CAL_GROUP;
+ else
+ eeprom[offs] |= do_precal;
break;
case MT76_TM_STATE_GROUP_PREK_DUMP:
pre_cal = (u32 *)dev->cal;
@@ -526,10 +526,12 @@ mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
struct mt76_phy *mphy = phy->mt76;
struct cfg80211_chan_def chandef_backup, *chandef = &mphy->chandef;
struct ieee80211_channel chan_backup;
- int i, ret;
+ int i, ret, skip_ch_num = DPD_CH_NUM(BW20_5G_SKIP);
if (!chan_list)
return -EOPNOTSUPP;
+ if (!channel_size)
+ return 0;
req->rf_test.op.rf.param.cal_param.func_data = cpu_to_le32(func_data);
@@ -539,7 +541,7 @@ mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
for (i = 0; i < channel_size; i++) {
if (chan_list[i].band == NL80211_BAND_5GHZ &&
chan_list[i].hw_value >= dpd_5g_skip_ch_list[0].hw_value &&
- chan_list[i].hw_value <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
+ chan_list[i].hw_value <= dpd_5g_skip_ch_list[skip_ch_num - 1].hw_value)
continue;
memcpy(chandef->chan, &chan_list[i], sizeof(struct ieee80211_channel));
@@ -608,11 +610,11 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
switch (state) {
case MT76_TM_STATE_DPD_2G:
ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_2g_ch_list_bw20,
- dpd_2g_bw20_ch_num,
+ DPD_CH_NUM(BW20_2G),
NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_CAL);
- wait_on_prek_offset += dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW20_2G) * DPD_PER_CH_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
do_precal = MT_EE_WIFI_CAL_DPD_2G;
break;
@@ -623,18 +625,27 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_5G_CAL);
if (ret)
return ret;
- wait_on_prek_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
- DPD_PER_CH_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
+
+ /* 5g channel bw80 calibration */
+ ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_5g_ch_list_bw80,
+ DPD_CH_NUM(BW80_5G),
+ NL80211_CHAN_WIDTH_80, RF_DPD_FLAT_5G_MEM_CAL);
+ if (ret)
+ return ret;
+ wait_on_prek_offset += DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
/* 5g channel bw160 calibration */
ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_5g_ch_list_bw160,
- dpd_5g_bw160_ch_num,
+ DPD_CH_NUM(BW160_5G),
NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_5G_MEM_CAL);
- wait_on_prek_offset += dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW160_5G) * DPD_PER_CH_GT_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
do_precal = MT_EE_WIFI_CAL_DPD_5G;
break;
@@ -645,27 +656,37 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_6G_CAL);
if (ret)
return ret;
- wait_on_prek_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW20_6G) * DPD_PER_CH_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
+
+ /* 6g channel bw80 calibration */
+ ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw80,
+ DPD_CH_NUM(BW80_6G),
+ NL80211_CHAN_WIDTH_80, RF_DPD_FLAT_6G_MEM_CAL);
+ if (ret)
+ return ret;
+ wait_on_prek_offset += DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
/* 6g channel bw160 calibration */
ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw160,
- dpd_6g_bw160_ch_num,
+ DPD_CH_NUM(BW160_6G),
NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_6G_MEM_CAL);
if (ret)
return ret;
- wait_on_prek_offset += dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
/* 6g channel bw320 calibration */
ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw320,
- dpd_6g_bw320_ch_num,
+ DPD_CH_NUM(BW320_6G),
NL80211_CHAN_WIDTH_320, RF_DPD_FLAT_6G_MEM_CAL);
- wait_on_prek_offset += dpd_6g_bw320_ch_num * DPD_PER_CH_GT_BW20_SIZE;
- wait_event_timeout(mdev->mcu.wait,
- dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
+ wait_on_prek_offset += DPD_CH_NUM(BW320_6G) * DPD_PER_CH_GT_BW20_SIZE;
+ wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
+ 30 * HZ);
do_precal = MT_EE_WIFI_CAL_DPD_6G;
break;
@@ -738,9 +759,9 @@ mt7996_tm_dump_precal(struct mt76_phy *mphy, struct sk_buff *msg, int flag, int
eeprom = dev->mt76.eeprom.data;
offs = MT_EE_DO_PRE_CAL;
- dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
- dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
- dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
+ dpd_size_2g = MT_EE_CAL_DPD_SIZE_2G;
+ dpd_size_5g = MT_EE_CAL_DPD_SIZE_5G;
+ dpd_size_6g = MT_EE_CAL_DPD_SIZE_6G;
switch (type) {
case PREK_SYNC_ALL:
@@ -816,9 +837,9 @@ mt7996_tm_re_cal_event(struct mt7996_dev *dev, struct mt7996_tm_rf_test_result *
u8 *pre_cal;
pre_cal = dev->cal;
- dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
- dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
- dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
+ dpd_size_2g = MT_EE_CAL_DPD_SIZE_2G;
+ dpd_size_5g = MT_EE_CAL_DPD_SIZE_5G;
+ dpd_size_6g = MT_EE_CAL_DPD_SIZE_6G;
cal_idx = le32_to_cpu(data->cal_idx);
cal_type = le32_to_cpu(data->cal_type);
diff --git a/testmode.c b/testmode.c
index 9a7559bf..a1744755 100644
--- a/testmode.c
+++ b/testmode.c
@@ -37,6 +37,11 @@ const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
};
EXPORT_SYMBOL_GPL(mt76_tm_policy);
+static inline bool mt76_testmode_offload(struct mt76_dev *dev)
+{
+ return is_mt7996(dev) || is_mt7992(dev);
+}
+
void mt76_testmode_tx_pending(struct mt76_phy *phy)
{
struct mt76_testmode_data *td = &phy->test;
@@ -197,7 +202,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
u8 max_nss = hweight8(phy->antenna_mask);
int ret;
- if (is_mt7996(phy->dev))
+ if (mt76_testmode_offload(phy->dev))
return 0;
ret = mt76_testmode_alloc_skb(phy, td->tx_mpdu_len);
@@ -293,7 +298,7 @@ mt76_testmode_tx_start(struct mt76_phy *phy)
td->tx_done = 0;
td->tx_pending = td->tx_count;
- if (!is_mt7996(dev))
+ if (!mt76_testmode_offload(dev))
mt76_worker_schedule(&dev->tx_worker);
}
@@ -303,7 +308,7 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
struct mt76_testmode_data *td = &phy->test;
struct mt76_dev *dev = phy->dev;
- if (is_mt7996(dev) && dev->test_ops->tx_stop) {
+ if (mt76_testmode_offload(dev) && dev->test_ops->tx_stop) {
dev->test_ops->tx_stop(phy);
return;
}
@@ -783,10 +788,12 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
if (nla_put_u32(msg, MT76_TM_ATTR_STATE, td->state))
goto out;
+ if (nla_put_u8(msg, MT76_TM_ATTR_BAND_IDX, phy->band_idx))
+ goto out;
+
if (dev->test_mtd.name &&
(nla_put_string(msg, MT76_TM_ATTR_MTD_PART, dev->test_mtd.name) ||
- nla_put_u32(msg, MT76_TM_ATTR_MTD_OFFSET, dev->test_mtd.offset) ||
- nla_put_u8(msg, MT76_TM_ATTR_BAND_IDX, phy->band_idx)))
+ nla_put_u32(msg, MT76_TM_ATTR_MTD_OFFSET, dev->test_mtd.offset)))
goto out;
if (nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, td->tx_count) ||
--
2.45.2