mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 05:16:57 +00:00
mt76: sync with upstream changes
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
@@ -308,20 +308,21 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
|
|||||||
|
|
||||||
txs_delta = mt76_get_txs_delta(np, hweight8(phy->antenna_mask));
|
txs_delta = mt76_get_txs_delta(np, hweight8(phy->antenna_mask));
|
||||||
|
|
||||||
val = mt76_get_of_array(np, "cck", &len, ARRAY_SIZE(dest->cck));
|
val = mt76_get_of_array(np, "rates-cck", &len, ARRAY_SIZE(dest->cck));
|
||||||
mt76_apply_array_limit(dest->cck, ARRAY_SIZE(dest->cck), val,
|
mt76_apply_array_limit(dest->cck, ARRAY_SIZE(dest->cck), val,
|
||||||
target_power, txs_delta, &max_power);
|
target_power, txs_delta, &max_power);
|
||||||
|
|
||||||
val = mt76_get_of_array(np, "ofdm", &len, ARRAY_SIZE(dest->ofdm));
|
val = mt76_get_of_array(np, "rates-ofdm",
|
||||||
|
&len, ARRAY_SIZE(dest->ofdm));
|
||||||
mt76_apply_array_limit(dest->ofdm, ARRAY_SIZE(dest->ofdm), val,
|
mt76_apply_array_limit(dest->ofdm, ARRAY_SIZE(dest->ofdm), val,
|
||||||
target_power, txs_delta, &max_power);
|
target_power, txs_delta, &max_power);
|
||||||
|
|
||||||
val = mt76_get_of_array(np, "mcs", &len, mcs_rates + 1);
|
val = mt76_get_of_array(np, "rates-mcs", &len, mcs_rates + 1);
|
||||||
mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]),
|
mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]),
|
||||||
ARRAY_SIZE(dest->mcs), val, len,
|
ARRAY_SIZE(dest->mcs), val, len,
|
||||||
target_power, txs_delta, &max_power);
|
target_power, txs_delta, &max_power);
|
||||||
|
|
||||||
val = mt76_get_of_array(np, "ru", &len, ru_rates + 1);
|
val = mt76_get_of_array(np, "rates-ru", &len, ru_rates + 1);
|
||||||
mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]),
|
mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]),
|
||||||
ARRAY_SIZE(dest->ru), val, len,
|
ARRAY_SIZE(dest->ru), val, len,
|
||||||
target_power, txs_delta, &max_power);
|
target_power, txs_delta, &max_power);
|
||||||
|
|||||||
+2
-2
@@ -111,8 +111,8 @@ void mt7603_init_debugfs(struct mt7603_dev *dev)
|
|||||||
mt7603_reset_read);
|
mt7603_reset_read);
|
||||||
debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir,
|
debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir,
|
||||||
mt7603_radio_read);
|
mt7603_radio_read);
|
||||||
debugfs_create_bool("dynamic_sensitivity", 0600, dir,
|
|
||||||
&dev->dynamic_sensitivity);
|
|
||||||
debugfs_create_u8("sensitivity_limit", 0600, dir,
|
debugfs_create_u8("sensitivity_limit", 0600, dir,
|
||||||
&dev->sensitivity_limit);
|
&dev->sensitivity_limit);
|
||||||
|
debugfs_create_bool("dynamic_sensitivity", 0600, dir,
|
||||||
|
&dev->dynamic_sensitivity);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -128,7 +128,7 @@ mt7615_eeprom_parse_hw_band_cap(struct mt7615_dev *dev)
|
|||||||
break;
|
break;
|
||||||
case MT_EE_DBDC:
|
case MT_EE_DBDC:
|
||||||
dev->dbdc_support = true;
|
dev->dbdc_support = true;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
dev->mphy.cap.has_2ghz = true;
|
dev->mphy.cap.has_2ghz = true;
|
||||||
dev->mphy.cap.has_5ghz = true;
|
dev->mphy.cap.has_5ghz = true;
|
||||||
|
|||||||
+4
-1
@@ -323,8 +323,11 @@ mt7615_regd_notifier(struct wiphy *wiphy,
|
|||||||
|
|
||||||
if (chandef->chan->flags & IEEE80211_CHAN_RADAR)
|
if (chandef->chan->flags & IEEE80211_CHAN_RADAR)
|
||||||
mt7615_dfs_init_radar_detector(phy);
|
mt7615_dfs_init_radar_detector(phy);
|
||||||
if (mt7615_firmware_offload(phy->dev))
|
|
||||||
|
if (mt7615_firmware_offload(phy->dev)) {
|
||||||
mt76_connac_mcu_set_channel_domain(mphy);
|
mt76_connac_mcu_set_channel_domain(mphy);
|
||||||
|
mt76_connac_mcu_set_rate_txpower(mphy);
|
||||||
|
}
|
||||||
|
|
||||||
mt7615_mutex_release(dev);
|
mt7615_mutex_release(dev);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ static int mt7615_start(struct ieee80211_hw *hw)
|
|||||||
ret = mt76_connac_mcu_set_channel_domain(phy->mt76);
|
ret = mt76_connac_mcu_set_channel_domain(phy->mt76);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
ret = mt76_connac_mcu_set_rate_txpower(phy->mt76);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = mt7615_mcu_set_chan_info(phy, MCU_EXT_CMD_SET_RX_PATH);
|
ret = mt7615_mcu_set_chan_info(phy, MCU_EXT_CMD_SET_RX_PATH);
|
||||||
|
|||||||
@@ -2204,6 +2204,11 @@ static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
|
|||||||
&limits, tx_power);
|
&limits, tx_power);
|
||||||
mphy->txpower_cur = tx_power;
|
mphy->txpower_cur = tx_power;
|
||||||
|
|
||||||
|
if (is_mt7663(mphy->dev)) {
|
||||||
|
memset(sku, tx_power, MT_SKU_4SS_DELTA + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < MT_SKU_1SS_DELTA; i++)
|
for (i = 0; i < MT_SKU_1SS_DELTA; i++)
|
||||||
sku[i] = limits_array[sku_mapping[i]];
|
sku[i] = limits_array[sku_mapping[i]];
|
||||||
|
|
||||||
|
|||||||
@@ -1560,6 +1560,139 @@ void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
|
EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
|
||||||
|
struct mt76_power_limits *limits,
|
||||||
|
enum nl80211_band band)
|
||||||
|
{
|
||||||
|
int max_power = is_mt7921(dev) ? 127 : 63;
|
||||||
|
int i, offset = sizeof(limits->cck);
|
||||||
|
|
||||||
|
memset(sku, max_power, MT_SKU_POWER_LIMIT);
|
||||||
|
|
||||||
|
if (band == NL80211_BAND_2GHZ) {
|
||||||
|
/* cck */
|
||||||
|
memcpy(sku, limits->cck, sizeof(limits->cck));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ofdm */
|
||||||
|
memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
|
||||||
|
offset += sizeof(limits->ofdm);
|
||||||
|
|
||||||
|
/* ht */
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
memcpy(&sku[offset], limits->mcs[i], 8);
|
||||||
|
offset += 8;
|
||||||
|
}
|
||||||
|
sku[offset++] = limits->mcs[0][0];
|
||||||
|
|
||||||
|
/* vht */
|
||||||
|
for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
|
||||||
|
memcpy(&sku[offset], limits->mcs[i],
|
||||||
|
ARRAY_SIZE(limits->mcs[i]));
|
||||||
|
offset += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_mt7921(dev))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* he */
|
||||||
|
for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
|
||||||
|
memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
|
||||||
|
offset += ARRAY_SIZE(limits->ru[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
|
||||||
|
enum nl80211_band band)
|
||||||
|
{
|
||||||
|
struct mt76_dev *dev = phy->dev;
|
||||||
|
int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
|
||||||
|
static const u8 chan_list_2ghz[] = {
|
||||||
|
1, 2, 3, 4, 5, 6, 7,
|
||||||
|
8, 9, 10, 11, 12, 13, 14
|
||||||
|
};
|
||||||
|
static const u8 chan_list_5ghz[] = {
|
||||||
|
36, 38, 40, 42, 44, 46, 48,
|
||||||
|
50, 52, 54, 56, 58, 60, 62,
|
||||||
|
64, 100, 102, 104, 106, 108, 110,
|
||||||
|
112, 114, 116, 118, 120, 122, 124,
|
||||||
|
126, 128, 132, 134, 136, 138, 140,
|
||||||
|
142, 144, 149, 151, 153, 155, 157,
|
||||||
|
159, 161, 165
|
||||||
|
};
|
||||||
|
struct mt76_connac_sku_tlv sku_tlbv;
|
||||||
|
int i, n_chan, batch_size, idx = 0;
|
||||||
|
struct mt76_power_limits limits;
|
||||||
|
const u8 *ch_list;
|
||||||
|
|
||||||
|
sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
|
||||||
|
|
||||||
|
if (band == NL80211_BAND_2GHZ) {
|
||||||
|
n_chan = ARRAY_SIZE(chan_list_2ghz);
|
||||||
|
ch_list = chan_list_2ghz;
|
||||||
|
} else {
|
||||||
|
n_chan = ARRAY_SIZE(chan_list_5ghz);
|
||||||
|
ch_list = chan_list_5ghz;
|
||||||
|
}
|
||||||
|
batch_size = DIV_ROUND_UP(n_chan, batch_len);
|
||||||
|
|
||||||
|
for (i = 0; i < batch_size; i++) {
|
||||||
|
bool last_msg = i == batch_size - 1;
|
||||||
|
int num_ch = last_msg ? n_chan % batch_len : batch_len;
|
||||||
|
struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {
|
||||||
|
.band = band == NL80211_BAND_2GHZ ? 1 : 2,
|
||||||
|
.n_chan = num_ch,
|
||||||
|
.last_msg = last_msg,
|
||||||
|
};
|
||||||
|
struct sk_buff *skb;
|
||||||
|
int j, err, msg_len;
|
||||||
|
|
||||||
|
msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
|
||||||
|
skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
|
||||||
|
if (!skb)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
|
||||||
|
memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
|
||||||
|
|
||||||
|
skb_put_data(skb, &tx_power_tlv, sizeof(tx_power_tlv));
|
||||||
|
for (j = 0; j < num_ch; j++, idx++) {
|
||||||
|
struct ieee80211_channel chan = {
|
||||||
|
.hw_value = ch_list[idx],
|
||||||
|
.band = band,
|
||||||
|
};
|
||||||
|
|
||||||
|
mt76_get_rate_power_limits(phy, &chan, &limits, 127);
|
||||||
|
|
||||||
|
sku_tlbv.channel = ch_list[idx];
|
||||||
|
mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
|
||||||
|
&limits, band);
|
||||||
|
skb_put_data(skb, &sku_tlbv, sku_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mt76_mcu_skb_send_msg(dev, skb,
|
||||||
|
MCU_CMD_SET_RATE_TX_POWER, false);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_2GHZ);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
return mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_5GHZ);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
|
const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
|
||||||
|
|||||||
@@ -564,6 +564,7 @@ enum {
|
|||||||
MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
|
MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
|
||||||
MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
|
MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
|
||||||
MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
|
MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
|
||||||
|
MCU_CMD_GET_TXPWR = MCU_CE_PREFIX | 0xd0,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -895,6 +896,28 @@ struct mt76_sta_cmd_info {
|
|||||||
u8 rcpi;
|
u8 rcpi;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MT_SKU_POWER_LIMIT 161
|
||||||
|
|
||||||
|
struct mt76_connac_sku_tlv {
|
||||||
|
u8 channel;
|
||||||
|
s8 pwr_limit[MT_SKU_POWER_LIMIT];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct mt76_connac_tx_power_limit_tlv {
|
||||||
|
/* DW0 - common info*/
|
||||||
|
u8 ver;
|
||||||
|
u8 pad0;
|
||||||
|
__le16 len;
|
||||||
|
/* DW1 - cmd hint */
|
||||||
|
u8 n_chan; /* # channel */
|
||||||
|
u8 band; /* 2.4GHz - 5GHz */
|
||||||
|
u8 last_msg;
|
||||||
|
u8 pad1;
|
||||||
|
/* DW3 */
|
||||||
|
u8 alpha2[4]; /* regulatory_request.alpha2 */
|
||||||
|
u8 pad2[32];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
#define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id)
|
#define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id)
|
||||||
#define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id)
|
#define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id)
|
||||||
|
|
||||||
@@ -996,4 +1019,5 @@ void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
|
|||||||
int mt76_connac_mcu_chip_config(struct mt76_dev *dev);
|
int mt76_connac_mcu_chip_config(struct mt76_dev *dev);
|
||||||
void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
|
void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
|
||||||
struct mt76_connac_coredump *coredump);
|
struct mt76_connac_coredump *coredump);
|
||||||
|
int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy);
|
||||||
#endif /* __MT76_CONNAC_MCU_H */
|
#endif /* __MT76_CONNAC_MCU_H */
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ void mt76x02e_init_beacon_config(struct mt76x02_dev *dev)
|
|||||||
.pre_tbtt_enable = mt76x02e_pre_tbtt_enable,
|
.pre_tbtt_enable = mt76x02e_pre_tbtt_enable,
|
||||||
.beacon_enable = mt76x02e_beacon_enable,
|
.beacon_enable = mt76x02e_beacon_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
dev->beacon_ops = &beacon_ops;
|
dev->beacon_ops = &beacon_ops;
|
||||||
|
|
||||||
/* Fire a pre-TBTT interrupt 8 ms before TBTT */
|
/* Fire a pre-TBTT interrupt 8 ms before TBTT */
|
||||||
|
|||||||
+31
-45
@@ -311,7 +311,8 @@ mt7915_queues_read(struct seq_file *s, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7915_puts_rate_txpower(struct seq_file *s, struct mt7915_phy *phy)
|
mt7915_puts_rate_txpower(struct seq_file *s, s8 *delta,
|
||||||
|
s8 txpower_cur, int band)
|
||||||
{
|
{
|
||||||
static const char * const sku_group_name[] = {
|
static const char * const sku_group_name[] = {
|
||||||
"CCK", "OFDM", "HT20", "HT40",
|
"CCK", "OFDM", "HT20", "HT40",
|
||||||
@@ -319,54 +320,24 @@ mt7915_puts_rate_txpower(struct seq_file *s, struct mt7915_phy *phy)
|
|||||||
"RU26", "RU52", "RU106", "RU242/SU20",
|
"RU26", "RU52", "RU106", "RU242/SU20",
|
||||||
"RU484/SU40", "RU996/SU80", "RU2x996/SU160"
|
"RU484/SU40", "RU996/SU80", "RU2x996/SU160"
|
||||||
};
|
};
|
||||||
struct mt7915_dev *dev = dev_get_drvdata(s->private);
|
s8 txpower[MT7915_SKU_RATE_NUM];
|
||||||
bool ext_phy = phy != &dev->phy;
|
|
||||||
u32 reg_base;
|
|
||||||
int i, idx = 0;
|
int i, idx = 0;
|
||||||
|
|
||||||
if (!phy)
|
for (i = 0; i < MT7915_SKU_RATE_NUM; i++)
|
||||||
return;
|
txpower[i] = DIV_ROUND_UP(txpower_cur + delta[i], 2);
|
||||||
|
|
||||||
reg_base = MT_TMAC_FP0R0(ext_phy);
|
for (i = 0; i < MAX_SKU_RATE_GROUP_NUM; i++) {
|
||||||
seq_printf(s, "\nBand %d\n", ext_phy);
|
const struct sku_group *sku = &mt7915_sku_groups[i];
|
||||||
|
u32 offset = sku->offset[band];
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
|
if (!offset) {
|
||||||
u8 cnt, mcs_num = mt7915_sku_group_len[i];
|
idx += sku->len;
|
||||||
s8 txpower[12];
|
continue;
|
||||||
int j;
|
|
||||||
|
|
||||||
if (i == SKU_HT_BW20 || i == SKU_HT_BW40) {
|
|
||||||
mcs_num = 8;
|
|
||||||
} else if (i >= SKU_VHT_BW20 && i <= SKU_VHT_BW160) {
|
|
||||||
mcs_num = 10;
|
|
||||||
} else if (i == SKU_HE_RU26) {
|
|
||||||
reg_base = MT_TMAC_FP0R18(ext_phy);
|
|
||||||
idx = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0, cnt = 0; j < DIV_ROUND_UP(mcs_num, 4); j++) {
|
mt76_seq_puts_array(s, sku_group_name[i],
|
||||||
u32 val;
|
txpower + idx, sku->len);
|
||||||
|
idx += sku->len;
|
||||||
if (i == SKU_VHT_BW160 && idx == 60) {
|
|
||||||
reg_base = MT_TMAC_FP0R15(ext_phy);
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
val = mt76_rr(dev, reg_base + (idx / 4) * 4);
|
|
||||||
|
|
||||||
if (idx && idx % 4)
|
|
||||||
val >>= (idx % 4) * 8;
|
|
||||||
|
|
||||||
while (val > 0 && cnt < mcs_num) {
|
|
||||||
s8 pwr = FIELD_GET(MT_TMAC_FP_MASK, val);
|
|
||||||
|
|
||||||
txpower[cnt++] = pwr;
|
|
||||||
val >>= 8;
|
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mt76_seq_puts_array(s, sku_group_name[i], txpower, mcs_num);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,9 +345,24 @@ static int
|
|||||||
mt7915_read_rate_txpower(struct seq_file *s, void *data)
|
mt7915_read_rate_txpower(struct seq_file *s, void *data)
|
||||||
{
|
{
|
||||||
struct mt7915_dev *dev = dev_get_drvdata(s->private);
|
struct mt7915_dev *dev = dev_get_drvdata(s->private);
|
||||||
|
struct mt76_phy *mphy = &dev->mphy;
|
||||||
|
enum nl80211_band band = mphy->chandef.chan->band;
|
||||||
|
s8 *delta = dev->rate_power[band];
|
||||||
|
s8 txpower_base = mphy->txpower_cur - delta[MT7915_SKU_MAX_DELTA_IDX];
|
||||||
|
|
||||||
mt7915_puts_rate_txpower(s, &dev->phy);
|
seq_puts(s, "Band 0:\n");
|
||||||
mt7915_puts_rate_txpower(s, mt7915_ext_phy(dev));
|
mt7915_puts_rate_txpower(s, delta, txpower_base, band);
|
||||||
|
|
||||||
|
if (dev->mt76.phy2) {
|
||||||
|
mphy = dev->mt76.phy2;
|
||||||
|
band = mphy->chandef.chan->band;
|
||||||
|
delta = dev->rate_power[band];
|
||||||
|
txpower_base = mphy->txpower_cur -
|
||||||
|
delta[MT7915_SKU_MAX_DELTA_IDX];
|
||||||
|
|
||||||
|
seq_puts(s, "Band 1:\n");
|
||||||
|
mt7915_puts_rate_txpower(s, delta, txpower_base, band);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+111
-29
@@ -151,38 +151,120 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
|
|||||||
return target_power;
|
return target_power;
|
||||||
}
|
}
|
||||||
|
|
||||||
s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band)
|
static const u8 sku_cck_delta_map[] = {
|
||||||
{
|
SKU_CCK_GROUP0,
|
||||||
u32 val;
|
SKU_CCK_GROUP0,
|
||||||
s8 delta;
|
SKU_CCK_GROUP1,
|
||||||
|
SKU_CCK_GROUP1,
|
||||||
|
};
|
||||||
|
|
||||||
if (band == NL80211_BAND_2GHZ)
|
static const u8 sku_ofdm_delta_map[] = {
|
||||||
val = mt7915_eeprom_read(dev, MT_EE_RATE_DELTA_2G);
|
SKU_OFDM_GROUP0,
|
||||||
else
|
SKU_OFDM_GROUP0,
|
||||||
val = mt7915_eeprom_read(dev, MT_EE_RATE_DELTA_5G);
|
SKU_OFDM_GROUP1,
|
||||||
|
SKU_OFDM_GROUP1,
|
||||||
|
SKU_OFDM_GROUP2,
|
||||||
|
SKU_OFDM_GROUP2,
|
||||||
|
SKU_OFDM_GROUP3,
|
||||||
|
SKU_OFDM_GROUP4,
|
||||||
|
};
|
||||||
|
|
||||||
if (!(val & MT_EE_RATE_DELTA_EN))
|
static const u8 sku_mcs_delta_map[] = {
|
||||||
return 0;
|
SKU_MCS_GROUP0,
|
||||||
|
SKU_MCS_GROUP1,
|
||||||
|
SKU_MCS_GROUP1,
|
||||||
|
SKU_MCS_GROUP2,
|
||||||
|
SKU_MCS_GROUP2,
|
||||||
|
SKU_MCS_GROUP3,
|
||||||
|
SKU_MCS_GROUP4,
|
||||||
|
SKU_MCS_GROUP5,
|
||||||
|
SKU_MCS_GROUP6,
|
||||||
|
SKU_MCS_GROUP7,
|
||||||
|
SKU_MCS_GROUP8,
|
||||||
|
SKU_MCS_GROUP9,
|
||||||
|
};
|
||||||
|
|
||||||
delta = FIELD_GET(MT_EE_RATE_DELTA_MASK, val);
|
#define SKU_GROUP(_mode, _len, _ofs_2g, _ofs_5g, _map) \
|
||||||
|
[_mode] = { \
|
||||||
return val & MT_EE_RATE_DELTA_SIGN ? delta : -delta;
|
.len = _len, \
|
||||||
|
.offset = { \
|
||||||
|
_ofs_2g, \
|
||||||
|
_ofs_5g, \
|
||||||
|
}, \
|
||||||
|
.delta_map = _map \
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8 mt7915_sku_group_len[] = {
|
const struct sku_group mt7915_sku_groups[] = {
|
||||||
[SKU_CCK] = 4,
|
SKU_GROUP(SKU_CCK, 4, 0x252, 0, sku_cck_delta_map),
|
||||||
[SKU_OFDM] = 8,
|
SKU_GROUP(SKU_OFDM, 8, 0x254, 0x29d, sku_ofdm_delta_map),
|
||||||
[SKU_HT_BW20] = 8,
|
|
||||||
[SKU_HT_BW40] = 9,
|
SKU_GROUP(SKU_HT_BW20, 8, 0x259, 0x2a2, sku_mcs_delta_map),
|
||||||
[SKU_VHT_BW20] = 12,
|
SKU_GROUP(SKU_HT_BW40, 9, 0x262, 0x2ab, sku_mcs_delta_map),
|
||||||
[SKU_VHT_BW40] = 12,
|
SKU_GROUP(SKU_VHT_BW20, 12, 0x259, 0x2a2, sku_mcs_delta_map),
|
||||||
[SKU_VHT_BW80] = 12,
|
SKU_GROUP(SKU_VHT_BW40, 12, 0x262, 0x2ab, sku_mcs_delta_map),
|
||||||
[SKU_VHT_BW160] = 12,
|
SKU_GROUP(SKU_VHT_BW80, 12, 0, 0x2b4, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU26] = 12,
|
SKU_GROUP(SKU_VHT_BW160, 12, 0, 0, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU52] = 12,
|
|
||||||
[SKU_HE_RU106] = 12,
|
SKU_GROUP(SKU_HE_RU26, 12, 0x27f, 0x2dd, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU242] = 12,
|
SKU_GROUP(SKU_HE_RU52, 12, 0x289, 0x2e7, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU484] = 12,
|
SKU_GROUP(SKU_HE_RU106, 12, 0x293, 0x2f1, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU996] = 12,
|
SKU_GROUP(SKU_HE_RU242, 12, 0x26b, 0x2bf, sku_mcs_delta_map),
|
||||||
[SKU_HE_RU2x996] = 12
|
SKU_GROUP(SKU_HE_RU484, 12, 0x275, 0x2c9, sku_mcs_delta_map),
|
||||||
|
SKU_GROUP(SKU_HE_RU996, 12, 0, 0x2d3, sku_mcs_delta_map),
|
||||||
|
SKU_GROUP(SKU_HE_RU2x996, 12, 0, 0, sku_mcs_delta_map),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static s8
|
||||||
|
mt7915_get_sku_delta(struct mt7915_dev *dev, u32 addr)
|
||||||
|
{
|
||||||
|
u32 val = mt7915_eeprom_read(dev, addr);
|
||||||
|
s8 delta = FIELD_GET(SKU_DELTA_VAL, val);
|
||||||
|
|
||||||
|
if (!(val & SKU_DELTA_EN))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return val & SKU_DELTA_ADD ? delta : -delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt7915_eeprom_init_sku_band(struct mt7915_dev *dev,
|
||||||
|
struct ieee80211_supported_band *sband)
|
||||||
|
{
|
||||||
|
int i, band = sband->band;
|
||||||
|
s8 *rate_power = dev->rate_power[band], max_delta = 0;
|
||||||
|
u8 idx = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(mt7915_sku_groups); i++) {
|
||||||
|
const struct sku_group *sku = &mt7915_sku_groups[i];
|
||||||
|
u32 offset = sku->offset[band];
|
||||||
|
int j;
|
||||||
|
|
||||||
|
if (!offset) {
|
||||||
|
idx += sku->len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rate_power[idx++] = mt7915_get_sku_delta(dev, offset);
|
||||||
|
if (rate_power[idx - 1] > max_delta)
|
||||||
|
max_delta = rate_power[idx - 1];
|
||||||
|
|
||||||
|
if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
|
||||||
|
offset += 1;
|
||||||
|
|
||||||
|
for (j = 1; j < sku->len; j++) {
|
||||||
|
u32 addr = offset + sku->delta_map[j];
|
||||||
|
|
||||||
|
rate_power[idx++] = mt7915_get_sku_delta(dev, addr);
|
||||||
|
if (rate_power[idx - 1] > max_delta)
|
||||||
|
max_delta = rate_power[idx - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rate_power[idx] = max_delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mt7915_eeprom_init_sku(struct mt7915_dev *dev)
|
||||||
|
{
|
||||||
|
mt7915_eeprom_init_sku_band(dev, &dev->mphy.sband_2g.sband);
|
||||||
|
mt7915_eeprom_init_sku_band(dev, &dev->mphy.sband_5g.sband);
|
||||||
|
}
|
||||||
|
|||||||
+33
-7
@@ -18,8 +18,6 @@ enum mt7915_eeprom_field {
|
|||||||
MT_EE_MAC_ADDR2 = 0x00a,
|
MT_EE_MAC_ADDR2 = 0x00a,
|
||||||
MT_EE_DDIE_FT_VERSION = 0x050,
|
MT_EE_DDIE_FT_VERSION = 0x050,
|
||||||
MT_EE_WIFI_CONF = 0x190,
|
MT_EE_WIFI_CONF = 0x190,
|
||||||
MT_EE_RATE_DELTA_2G = 0x252,
|
|
||||||
MT_EE_RATE_DELTA_5G = 0x29d,
|
|
||||||
MT_EE_TX0_POWER_2G = 0x2fc,
|
MT_EE_TX0_POWER_2G = 0x2fc,
|
||||||
MT_EE_TX0_POWER_5G = 0x34b,
|
MT_EE_TX0_POWER_5G = 0x34b,
|
||||||
MT_EE_ADIE_FT_VERSION = 0x9a0,
|
MT_EE_ADIE_FT_VERSION = 0x9a0,
|
||||||
@@ -36,10 +34,6 @@ enum mt7915_eeprom_field {
|
|||||||
#define MT_EE_WIFI_CONF7_TSSI0_5G BIT(2)
|
#define MT_EE_WIFI_CONF7_TSSI0_5G BIT(2)
|
||||||
#define MT_EE_WIFI_CONF7_TSSI1_5G BIT(4)
|
#define MT_EE_WIFI_CONF7_TSSI1_5G BIT(4)
|
||||||
|
|
||||||
#define MT_EE_RATE_DELTA_MASK GENMASK(5, 0)
|
|
||||||
#define MT_EE_RATE_DELTA_SIGN BIT(6)
|
|
||||||
#define MT_EE_RATE_DELTA_EN BIT(7)
|
|
||||||
|
|
||||||
enum mt7915_eeprom_band {
|
enum mt7915_eeprom_band {
|
||||||
MT_EE_BAND_SEL_DEFAULT,
|
MT_EE_BAND_SEL_DEFAULT,
|
||||||
MT_EE_BAND_SEL_5GHZ,
|
MT_EE_BAND_SEL_5GHZ,
|
||||||
@@ -47,6 +41,32 @@ enum mt7915_eeprom_band {
|
|||||||
MT_EE_BAND_SEL_DUAL,
|
MT_EE_BAND_SEL_DUAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SKU_DELTA_VAL GENMASK(5, 0)
|
||||||
|
#define SKU_DELTA_ADD BIT(6)
|
||||||
|
#define SKU_DELTA_EN BIT(7)
|
||||||
|
|
||||||
|
enum mt7915_sku_delta_group {
|
||||||
|
SKU_CCK_GROUP0,
|
||||||
|
SKU_CCK_GROUP1,
|
||||||
|
|
||||||
|
SKU_OFDM_GROUP0 = 0,
|
||||||
|
SKU_OFDM_GROUP1,
|
||||||
|
SKU_OFDM_GROUP2,
|
||||||
|
SKU_OFDM_GROUP3,
|
||||||
|
SKU_OFDM_GROUP4,
|
||||||
|
|
||||||
|
SKU_MCS_GROUP0 = 0,
|
||||||
|
SKU_MCS_GROUP1,
|
||||||
|
SKU_MCS_GROUP2,
|
||||||
|
SKU_MCS_GROUP3,
|
||||||
|
SKU_MCS_GROUP4,
|
||||||
|
SKU_MCS_GROUP5,
|
||||||
|
SKU_MCS_GROUP6,
|
||||||
|
SKU_MCS_GROUP7,
|
||||||
|
SKU_MCS_GROUP8,
|
||||||
|
SKU_MCS_GROUP9,
|
||||||
|
};
|
||||||
|
|
||||||
enum mt7915_sku_rate_group {
|
enum mt7915_sku_rate_group {
|
||||||
SKU_CCK,
|
SKU_CCK,
|
||||||
SKU_OFDM,
|
SKU_OFDM,
|
||||||
@@ -66,6 +86,12 @@ enum mt7915_sku_rate_group {
|
|||||||
MAX_SKU_RATE_GROUP_NUM,
|
MAX_SKU_RATE_GROUP_NUM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sku_group {
|
||||||
|
u8 len;
|
||||||
|
u16 offset[2];
|
||||||
|
const u8 *delta_map;
|
||||||
|
};
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
mt7915_get_channel_group(int channel)
|
mt7915_get_channel_group(int channel)
|
||||||
{
|
{
|
||||||
@@ -98,6 +124,6 @@ mt7915_tssi_enabled(struct mt7915_dev *dev, enum nl80211_band band)
|
|||||||
return eep[MT_EE_WIFI_CONF + 7] & MT_EE_WIFI_CONF7_TSSI0_2G;
|
return eep[MT_EE_WIFI_CONF + 7] & MT_EE_WIFI_CONF7_TSSI0_2G;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const u8 mt7915_sku_group_len[MAX_SKU_RATE_GROUP_NUM];
|
extern const struct sku_group mt7915_sku_groups[];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+33
-40
@@ -67,39 +67,6 @@ static const struct ieee80211_iface_combination if_comb[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
|
||||||
mt7915_init_txpower(struct mt7915_dev *dev,
|
|
||||||
struct ieee80211_supported_band *sband)
|
|
||||||
{
|
|
||||||
int i, n_chains = hweight8(dev->mphy.antenna_mask);
|
|
||||||
int nss_delta = mt76_tx_power_nss_delta(n_chains);
|
|
||||||
int pwr_delta = mt7915_eeprom_get_power_delta(dev, sband->band);
|
|
||||||
struct mt76_power_limits limits;
|
|
||||||
|
|
||||||
for (i = 0; i < sband->n_channels; i++) {
|
|
||||||
struct ieee80211_channel *chan = &sband->channels[i];
|
|
||||||
u32 target_power = 0;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
for (j = 0; j < n_chains; j++) {
|
|
||||||
u32 val;
|
|
||||||
|
|
||||||
val = mt7915_eeprom_get_target_power(dev, chan, j);
|
|
||||||
target_power = max(target_power, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
target_power += pwr_delta;
|
|
||||||
target_power = mt76_get_rate_power_limits(&dev->mphy, chan,
|
|
||||||
&limits,
|
|
||||||
target_power);
|
|
||||||
target_power += nss_delta;
|
|
||||||
target_power = DIV_ROUND_UP(target_power, 2);
|
|
||||||
chan->max_power = min_t(int, chan->max_reg_power,
|
|
||||||
target_power);
|
|
||||||
chan->orig_mpwr = target_power;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7915_regd_notifier(struct wiphy *wiphy,
|
mt7915_regd_notifier(struct wiphy *wiphy,
|
||||||
struct regulatory_request *request)
|
struct regulatory_request *request)
|
||||||
@@ -110,12 +77,8 @@ mt7915_regd_notifier(struct wiphy *wiphy,
|
|||||||
struct mt7915_phy *phy = mphy->priv;
|
struct mt7915_phy *phy = mphy->priv;
|
||||||
struct cfg80211_chan_def *chandef = &mphy->chandef;
|
struct cfg80211_chan_def *chandef = &mphy->chandef;
|
||||||
|
|
||||||
memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
|
|
||||||
dev->mt76.region = request->dfs_region;
|
dev->mt76.region = request->dfs_region;
|
||||||
|
|
||||||
mt7915_init_txpower(dev, &mphy->sband_2g.sband);
|
|
||||||
mt7915_init_txpower(dev, &mphy->sband_5g.sband);
|
|
||||||
|
|
||||||
if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
|
if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -247,6 +210,38 @@ static int mt7915_txbf_init(struct mt7915_dev *dev)
|
|||||||
return mt7915_mcu_set_txbf_type(dev);
|
return mt7915_mcu_set_txbf_type(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt7915_init_txpower_band(struct mt7915_dev *dev,
|
||||||
|
struct ieee80211_supported_band *sband)
|
||||||
|
{
|
||||||
|
int i, n_chains = hweight8(dev->mphy.antenna_mask);
|
||||||
|
|
||||||
|
for (i = 0; i < sband->n_channels; i++) {
|
||||||
|
struct ieee80211_channel *chan = &sband->channels[i];
|
||||||
|
u32 target_power = 0;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j = 0; j < n_chains; j++) {
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = mt7915_eeprom_get_target_power(dev, chan, j);
|
||||||
|
target_power = max(target_power, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->max_power = min_t(int, chan->max_reg_power,
|
||||||
|
target_power / 2);
|
||||||
|
chan->orig_mpwr = target_power / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mt7915_init_txpower(struct mt7915_dev *dev)
|
||||||
|
{
|
||||||
|
mt7915_init_txpower_band(dev, &dev->mphy.sband_2g.sband);
|
||||||
|
mt7915_init_txpower_band(dev, &dev->mphy.sband_5g.sband);
|
||||||
|
|
||||||
|
mt7915_eeprom_init_sku(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int mt7915_register_ext_phy(struct mt7915_dev *dev)
|
static int mt7915_register_ext_phy(struct mt7915_dev *dev)
|
||||||
{
|
{
|
||||||
struct mt7915_phy *phy = mt7915_ext_phy(dev);
|
struct mt7915_phy *phy = mt7915_ext_phy(dev);
|
||||||
@@ -303,8 +298,7 @@ static void mt7915_init_work(struct work_struct *work)
|
|||||||
|
|
||||||
mt7915_mcu_set_eeprom(dev);
|
mt7915_mcu_set_eeprom(dev);
|
||||||
mt7915_mac_init(dev);
|
mt7915_mac_init(dev);
|
||||||
mt7915_init_txpower(dev, &dev->mphy.sband_2g.sband);
|
mt7915_init_txpower(dev);
|
||||||
mt7915_init_txpower(dev, &dev->mphy.sband_5g.sband);
|
|
||||||
mt7915_txbf_init(dev);
|
mt7915_txbf_init(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,7 +397,6 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy)
|
void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy)
|
||||||
{
|
{
|
||||||
int nss;
|
int nss;
|
||||||
|
|||||||
+1
-1
@@ -423,7 +423,7 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||||
ret = mt7915_mcu_set_txpower_sku(phy);
|
ret = mt7915_mcu_set_sku(phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-10
@@ -3362,9 +3362,8 @@ int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx)
|
|||||||
sizeof(req), false);
|
sizeof(req), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
|
int mt7915_mcu_set_sku(struct mt7915_phy *phy)
|
||||||
{
|
{
|
||||||
#define MT7915_SKU_RATE_NUM 161
|
|
||||||
struct mt7915_dev *dev = phy->dev;
|
struct mt7915_dev *dev = phy->dev;
|
||||||
struct mt76_phy *mphy = phy->mt76;
|
struct mt76_phy *mphy = phy->mt76;
|
||||||
struct ieee80211_hw *hw = mphy->hw;
|
struct ieee80211_hw *hw = mphy->hw;
|
||||||
@@ -3378,10 +3377,11 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
|
|||||||
.dbdc_idx = phy != &dev->phy,
|
.dbdc_idx = phy != &dev->phy,
|
||||||
};
|
};
|
||||||
struct mt76_power_limits limits_array;
|
struct mt76_power_limits limits_array;
|
||||||
s8 *la = (s8 *)&limits_array;
|
s8 *delta, *la = (s8 *)&limits_array;
|
||||||
int i, idx, n_chains = hweight8(mphy->antenna_mask);
|
int i, idx, n_chains = hweight8(mphy->antenna_mask);
|
||||||
int tx_power;
|
int tx_power;
|
||||||
|
|
||||||
|
delta = dev->rate_power[mphy->chandef.chan->band];
|
||||||
tx_power = hw->conf.power_level * 2 -
|
tx_power = hw->conf.power_level * 2 -
|
||||||
mt76_tx_power_nss_delta(n_chains);
|
mt76_tx_power_nss_delta(n_chains);
|
||||||
|
|
||||||
@@ -3389,8 +3389,10 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
|
|||||||
&limits_array, tx_power);
|
&limits_array, tx_power);
|
||||||
mphy->txpower_cur = tx_power;
|
mphy->txpower_cur = tx_power;
|
||||||
|
|
||||||
for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
|
for (i = 0, idx = 0; i < MAX_SKU_RATE_GROUP_NUM; i++) {
|
||||||
u8 mcs_num, len = mt7915_sku_group_len[i];
|
const struct sku_group *sku = &mt7915_sku_groups[i];
|
||||||
|
u32 offset = sku->offset[mphy->chandef.chan->band];
|
||||||
|
u8 mcs_num = sku->len;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
|
if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
|
||||||
@@ -3398,15 +3400,22 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
|
|||||||
|
|
||||||
if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
|
if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
|
||||||
la = (s8 *)&limits_array + 12;
|
la = (s8 *)&limits_array + 12;
|
||||||
} else {
|
|
||||||
mcs_num = len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < min_t(u8, mcs_num, len); j++)
|
if (!offset) {
|
||||||
req.val[idx + j] = la[j];
|
idx += sku->len;
|
||||||
|
la += mcs_num;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < min_t(u8, mcs_num, sku->len); j++) {
|
||||||
|
s8 rate_power;
|
||||||
|
|
||||||
|
rate_power = hw->conf.power_level * 2 + delta[idx + j];
|
||||||
|
req.val[idx + j] = min_t(s8, la[j], rate_power);
|
||||||
|
}
|
||||||
la += mcs_num;
|
la += mcs_num;
|
||||||
idx += len;
|
idx += sku->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mt76_mcu_send_msg(&dev->mt76,
|
return mt76_mcu_send_msg(&dev->mt76,
|
||||||
|
|||||||
+8
-2
@@ -39,6 +39,10 @@
|
|||||||
#define MT7915_5G_RATE_DEFAULT 0x4b /* OFDM 6M */
|
#define MT7915_5G_RATE_DEFAULT 0x4b /* OFDM 6M */
|
||||||
#define MT7915_2G_RATE_DEFAULT 0x0 /* CCK 1M */
|
#define MT7915_2G_RATE_DEFAULT 0x0 /* CCK 1M */
|
||||||
|
|
||||||
|
#define MT7915_SKU_RATE_NUM 161
|
||||||
|
#define MT7915_SKU_MAX_DELTA_IDX MT7915_SKU_RATE_NUM
|
||||||
|
#define MT7915_SKU_TABLE_SIZE (MT7915_SKU_RATE_NUM + 1)
|
||||||
|
|
||||||
struct mt7915_vif;
|
struct mt7915_vif;
|
||||||
struct mt7915_sta;
|
struct mt7915_sta;
|
||||||
struct mt7915_dfs_pulse;
|
struct mt7915_dfs_pulse;
|
||||||
@@ -191,6 +195,8 @@ struct mt7915_dev {
|
|||||||
int token_count;
|
int token_count;
|
||||||
struct idr token;
|
struct idr token;
|
||||||
|
|
||||||
|
s8 **rate_power; /* TODO: use mt76_rate_power */
|
||||||
|
|
||||||
bool dbdc_support;
|
bool dbdc_support;
|
||||||
bool flash_mode;
|
bool flash_mode;
|
||||||
bool fw_debug;
|
bool fw_debug;
|
||||||
@@ -294,7 +300,7 @@ void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy);
|
|||||||
int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
|
int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
|
||||||
struct ieee80211_channel *chan,
|
struct ieee80211_channel *chan,
|
||||||
u8 chain_idx);
|
u8 chain_idx);
|
||||||
s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band);
|
void mt7915_eeprom_init_sku(struct mt7915_dev *dev);
|
||||||
int mt7915_dma_init(struct mt7915_dev *dev);
|
int mt7915_dma_init(struct mt7915_dev *dev);
|
||||||
void mt7915_dma_prefetch(struct mt7915_dev *dev);
|
void mt7915_dma_prefetch(struct mt7915_dev *dev);
|
||||||
void mt7915_dma_cleanup(struct mt7915_dev *dev);
|
void mt7915_dma_cleanup(struct mt7915_dev *dev);
|
||||||
@@ -344,7 +350,7 @@ int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band);
|
|||||||
int mt7915_mcu_set_rts_thresh(struct mt7915_phy *phy, u32 val);
|
int mt7915_mcu_set_rts_thresh(struct mt7915_phy *phy, u32 val);
|
||||||
int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter);
|
int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter);
|
||||||
int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable);
|
int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable);
|
||||||
int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy);
|
int mt7915_mcu_set_sku(struct mt7915_phy *phy);
|
||||||
int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev);
|
int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev);
|
||||||
int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev);
|
int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev);
|
||||||
int mt7915_mcu_set_txbf_sounding(struct mt7915_dev *dev);
|
int mt7915_mcu_set_txbf_sounding(struct mt7915_dev *dev);
|
||||||
|
|||||||
@@ -154,6 +154,28 @@ static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
|
|||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mt7915_alloc_device(struct pci_dev *pdev, struct mt7915_dev *dev)
|
||||||
|
{
|
||||||
|
#define NUM_BANDS 2
|
||||||
|
int i;
|
||||||
|
s8 **sku;
|
||||||
|
|
||||||
|
sku = devm_kzalloc(&pdev->dev, NUM_BANDS * sizeof(*sku), GFP_KERNEL);
|
||||||
|
if (!sku)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_BANDS; i++) {
|
||||||
|
sku[i] = devm_kzalloc(&pdev->dev, MT7915_SKU_TABLE_SIZE *
|
||||||
|
sizeof(**sku), GFP_KERNEL);
|
||||||
|
if (!sku[i])
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
dev->rate_power = sku;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void mt7915_pci_init_hif2(struct mt7915_dev *dev)
|
static void mt7915_pci_init_hif2(struct mt7915_dev *dev)
|
||||||
{
|
{
|
||||||
struct mt7915_hif *hif;
|
struct mt7915_hif *hif;
|
||||||
@@ -248,6 +270,9 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
dev = container_of(mdev, struct mt7915_dev, mt76);
|
dev = container_of(mdev, struct mt7915_dev, mt76);
|
||||||
|
ret = mt7915_alloc_device(pdev, dev);
|
||||||
|
if (ret)
|
||||||
|
goto error;
|
||||||
|
|
||||||
ret = mt7915_mmio_init(mdev, pcim_iomap_table(pdev)[0], pdev->irq);
|
ret = mt7915_mmio_init(mdev, pcim_iomap_table(pdev)[0], pdev->irq);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|||||||
@@ -82,11 +82,6 @@
|
|||||||
#define MT_TMAC_CTCR0_INS_DDLMT_EN BIT(17)
|
#define MT_TMAC_CTCR0_INS_DDLMT_EN BIT(17)
|
||||||
#define MT_TMAC_CTCR0_INS_DDLMT_VHT_SMPDU_EN BIT(18)
|
#define MT_TMAC_CTCR0_INS_DDLMT_VHT_SMPDU_EN BIT(18)
|
||||||
|
|
||||||
#define MT_TMAC_FP0R0(_band) MT_WF_TMAC(_band, 0x020)
|
|
||||||
#define MT_TMAC_FP0R15(_band) MT_WF_TMAC(_band, 0x080)
|
|
||||||
#define MT_TMAC_FP0R18(_band) MT_WF_TMAC(_band, 0x270)
|
|
||||||
#define MT_TMAC_FP_MASK GENMASK(7, 0)
|
|
||||||
|
|
||||||
#define MT_TMAC_TFCR0(_band) MT_WF_TMAC(_band, 0x1e0)
|
#define MT_TMAC_TFCR0(_band) MT_WF_TMAC(_band, 0x1e0)
|
||||||
|
|
||||||
#define MT_WF_DMA_BASE(_band) ((_band) ? 0xa1e00 : 0x21e00)
|
#define MT_WF_DMA_BASE(_band) ((_band) ? 0xa1e00 : 0x21e00)
|
||||||
|
|||||||
@@ -158,6 +158,83 @@ mt7921_queues_read(struct seq_file *s, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt7921_seq_puts_array(struct seq_file *file, const char *str,
|
||||||
|
s8 *val, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
seq_printf(file, "%-16s:", str);
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
if (val[i] == 127)
|
||||||
|
seq_printf(file, " %6s", "N.A");
|
||||||
|
else
|
||||||
|
seq_printf(file, " %6d", val[i]);
|
||||||
|
seq_puts(file, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#define mt7921_print_txpwr_entry(prefix, rate) \
|
||||||
|
({ \
|
||||||
|
mt7921_seq_puts_array(s, #prefix " (user)", \
|
||||||
|
txpwr.data[TXPWR_USER].rate, \
|
||||||
|
ARRAY_SIZE(txpwr.data[TXPWR_USER].rate)); \
|
||||||
|
mt7921_seq_puts_array(s, #prefix " (eeprom)", \
|
||||||
|
txpwr.data[TXPWR_EEPROM].rate, \
|
||||||
|
ARRAY_SIZE(txpwr.data[TXPWR_EEPROM].rate)); \
|
||||||
|
mt7921_seq_puts_array(s, #prefix " (tmac)", \
|
||||||
|
txpwr.data[TXPWR_MAC].rate, \
|
||||||
|
ARRAY_SIZE(txpwr.data[TXPWR_MAC].rate)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
static int
|
||||||
|
mt7921_txpwr(struct seq_file *s, void *data)
|
||||||
|
{
|
||||||
|
struct mt7921_dev *dev = dev_get_drvdata(s->private);
|
||||||
|
struct mt7921_txpwr txpwr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = mt7921_get_txpwr_info(dev, &txpwr);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
seq_printf(s, "Tx power table (channel %d)\n", txpwr.ch);
|
||||||
|
seq_printf(s, "%-16s %6s %6s %6s %6s\n",
|
||||||
|
" ", "1m", "2m", "5m", "11m");
|
||||||
|
mt7921_print_txpwr_entry(CCK, cck);
|
||||||
|
|
||||||
|
seq_printf(s, "%-16s %6s %6s %6s %6s %6s %6s %6s %6s\n",
|
||||||
|
" ", "6m", "9m", "12m", "18m", "24m", "36m",
|
||||||
|
"48m", "54m");
|
||||||
|
mt7921_print_txpwr_entry(OFDM, ofdm);
|
||||||
|
|
||||||
|
seq_printf(s, "%-16s %6s %6s %6s %6s %6s %6s %6s %6s\n",
|
||||||
|
" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
|
||||||
|
"mcs6", "mcs7");
|
||||||
|
mt7921_print_txpwr_entry(HT20, ht20);
|
||||||
|
|
||||||
|
seq_printf(s, "%-16s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
|
||||||
|
" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
|
||||||
|
"mcs6", "mcs7", "mcs32");
|
||||||
|
mt7921_print_txpwr_entry(HT40, ht40);
|
||||||
|
|
||||||
|
seq_printf(s, "%-16s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
|
||||||
|
" ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
|
||||||
|
"mcs6", "mcs7", "mcs8", "mcs9", "mcs10", "mcs11");
|
||||||
|
mt7921_print_txpwr_entry(VHT20, vht20);
|
||||||
|
mt7921_print_txpwr_entry(VHT40, vht40);
|
||||||
|
mt7921_print_txpwr_entry(VHT80, vht80);
|
||||||
|
mt7921_print_txpwr_entry(VHT160, vht160);
|
||||||
|
mt7921_print_txpwr_entry(HE26, he26);
|
||||||
|
mt7921_print_txpwr_entry(HE52, he52);
|
||||||
|
mt7921_print_txpwr_entry(HE106, he106);
|
||||||
|
mt7921_print_txpwr_entry(HE242, he242);
|
||||||
|
mt7921_print_txpwr_entry(HE484, he484);
|
||||||
|
mt7921_print_txpwr_entry(HE996, he996);
|
||||||
|
mt7921_print_txpwr_entry(HE996x2, he996x2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mt7921_pm_set(void *data, u64 val)
|
mt7921_pm_set(void *data, u64 val)
|
||||||
{
|
{
|
||||||
@@ -237,6 +314,8 @@ int mt7921_init_debugfs(struct mt7921_dev *dev)
|
|||||||
mt7921_queues_read);
|
mt7921_queues_read);
|
||||||
debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,
|
debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,
|
||||||
mt7921_queues_acq);
|
mt7921_queues_acq);
|
||||||
|
debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,
|
||||||
|
mt7921_txpwr);
|
||||||
debugfs_create_file("tx_stats", 0400, dir, dev, &fops_tx_stats);
|
debugfs_create_file("tx_stats", 0400, dir, dev, &fops_tx_stats);
|
||||||
debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);
|
debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);
|
||||||
debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm);
|
debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm);
|
||||||
|
|||||||
@@ -58,12 +58,14 @@ mt7921_regd_notifier(struct wiphy *wiphy,
|
|||||||
{
|
{
|
||||||
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
|
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
|
||||||
struct mt7921_dev *dev = mt7921_hw_dev(hw);
|
struct mt7921_dev *dev = mt7921_hw_dev(hw);
|
||||||
|
struct mt7921_phy *phy = mt7921_hw_phy(hw);
|
||||||
|
|
||||||
memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
|
memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
|
||||||
dev->mt76.region = request->dfs_region;
|
dev->mt76.region = request->dfs_region;
|
||||||
|
|
||||||
mt7921_mutex_acquire(dev);
|
mt7921_mutex_acquire(dev);
|
||||||
mt76_connac_mcu_set_channel_domain(hw->priv);
|
mt76_connac_mcu_set_channel_domain(hw->priv);
|
||||||
|
mt76_connac_mcu_set_rate_txpower(phy->mt76);
|
||||||
mt7921_mutex_release(dev);
|
mt7921_mutex_release(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -297,9 +297,9 @@ mt7921_mac_assoc_rssi(struct mt7921_dev *dev, struct sk_buff *skb)
|
|||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
|
struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
|
||||||
|
|
||||||
if (!ieee80211_is_assoc_resp(hdr->frame_control) &&
|
if (!ieee80211_is_assoc_resp(hdr->frame_control) &&
|
||||||
!ieee80211_is_auth(hdr->frame_control))
|
!ieee80211_is_auth(hdr->frame_control))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
|
ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
|
||||||
IEEE80211_IFACE_ITER_RESUME_ALL,
|
IEEE80211_IFACE_ITER_RESUME_ALL,
|
||||||
|
|||||||
+9
-3
@@ -182,6 +182,10 @@ int __mt7921_start(struct mt7921_phy *phy)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = mt76_connac_mcu_set_rate_txpower(phy->mt76);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
mt7921_mac_reset_counters(phy);
|
mt7921_mac_reset_counters(phy);
|
||||||
set_bit(MT76_STATE_RUNNING, &mphy->state);
|
set_bit(MT76_STATE_RUNNING, &mphy->state);
|
||||||
|
|
||||||
@@ -698,11 +702,13 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
|||||||
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
||||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||||
|
|
||||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||||
struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
|
struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
|
||||||
|
|
||||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
ewma_rssi_init(&mvif->rssi);
|
||||||
false);
|
if (!sta->tdls)
|
||||||
|
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif,
|
||||||
|
&mvif->sta.wcid, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_bh(&dev->sta_poll_lock);
|
spin_lock_bh(&dev->sta_poll_lock);
|
||||||
|
|||||||
@@ -1382,3 +1382,26 @@ int mt7921_mcu_update_arp_filter(struct ieee80211_hw *hw,
|
|||||||
return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
|
return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr)
|
||||||
|
{
|
||||||
|
struct mt7921_txpwr_event *event;
|
||||||
|
struct mt7921_txpwr_req req = {
|
||||||
|
.dbdc_idx = 0,
|
||||||
|
};
|
||||||
|
struct sk_buff *skb;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_CMD_GET_TXPWR,
|
||||||
|
&req, sizeof(req), true, &skb);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
event = (struct mt7921_txpwr_event *)skb->data;
|
||||||
|
WARN_ON(skb->len != le16_to_cpu(event->len));
|
||||||
|
memcpy(txpwr, &event->txpwr, sizeof(event->txpwr));
|
||||||
|
|
||||||
|
dev_kfree_skb(skb);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ enum {
|
|||||||
MCU_EVENT_CH_PRIVILEGE = 0x18,
|
MCU_EVENT_CH_PRIVILEGE = 0x18,
|
||||||
MCU_EVENT_SCHED_SCAN_DONE = 0x23,
|
MCU_EVENT_SCHED_SCAN_DONE = 0x23,
|
||||||
MCU_EVENT_DBG_MSG = 0x27,
|
MCU_EVENT_DBG_MSG = 0x27,
|
||||||
|
MCU_EVENT_TXPWR = 0xd0,
|
||||||
MCU_EVENT_COREDUMP = 0xf0,
|
MCU_EVENT_COREDUMP = 0xf0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -390,4 +391,20 @@ struct mt7921_mcu_wlan_info {
|
|||||||
__le32 wlan_idx;
|
__le32 wlan_idx;
|
||||||
struct mt7921_mcu_wlan_info_event event;
|
struct mt7921_mcu_wlan_info_event event;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct mt7921_txpwr_req {
|
||||||
|
u8 ver;
|
||||||
|
u8 action;
|
||||||
|
__le16 len;
|
||||||
|
u8 dbdc_idx;
|
||||||
|
u8 rsv[3];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct mt7921_txpwr_event {
|
||||||
|
u8 ver;
|
||||||
|
u8 action;
|
||||||
|
__le16 len;
|
||||||
|
struct mt7921_txpwr txpwr;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -172,6 +172,36 @@ struct mt7921_dev {
|
|||||||
struct mt76_connac_coredump coredump;
|
struct mt76_connac_coredump coredump;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TXPWR_USER,
|
||||||
|
TXPWR_EEPROM,
|
||||||
|
TXPWR_MAC,
|
||||||
|
TXPWR_MAX_NUM,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mt7921_txpwr {
|
||||||
|
u8 ch;
|
||||||
|
u8 rsv[3];
|
||||||
|
struct {
|
||||||
|
u8 ch;
|
||||||
|
u8 cck[4];
|
||||||
|
u8 ofdm[8];
|
||||||
|
u8 ht20[8];
|
||||||
|
u8 ht40[9];
|
||||||
|
u8 vht20[12];
|
||||||
|
u8 vht40[12];
|
||||||
|
u8 vht80[12];
|
||||||
|
u8 vht160[12];
|
||||||
|
u8 he26[12];
|
||||||
|
u8 he52[12];
|
||||||
|
u8 he106[12];
|
||||||
|
u8 he242[12];
|
||||||
|
u8 he484[12];
|
||||||
|
u8 he996[12];
|
||||||
|
u8 he996x2[12];
|
||||||
|
} data[TXPWR_MAX_NUM];
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MT_LMAC_AC00,
|
MT_LMAC_AC00,
|
||||||
MT_LMAC_AC01,
|
MT_LMAC_AC01,
|
||||||
@@ -352,4 +382,5 @@ int mt7921_mcu_update_arp_filter(struct ieee80211_hw *hw,
|
|||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *info);
|
struct ieee80211_bss_conf *info);
|
||||||
int mt7921_wfsys_reset(struct mt7921_dev *dev);
|
int mt7921_wfsys_reset(struct mt7921_dev *dev);
|
||||||
|
int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -59,14 +59,14 @@ sub parse_channel($$$) {
|
|||||||
$channels->{$ch} = $channel;
|
$channels->{$ch} = $channel;
|
||||||
|
|
||||||
$band->{type} eq '2' and do {
|
$band->{type} eq '2' and do {
|
||||||
$channel->{cck} = convert_array([
|
$channel->{"rates-cck"} = convert_array([
|
||||||
$data[0], $data[0],
|
$data[0], $data[0],
|
||||||
$data[1], $data[1]
|
$data[1], $data[1]
|
||||||
]);
|
]);
|
||||||
splice @data, 0, 2;
|
splice @data, 0, 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
$channel->{ofdm} = convert_array([
|
$channel->{"rates-ofdm"} = convert_array([
|
||||||
$data[0], $data[0],
|
$data[0], $data[0],
|
||||||
$data[1], $data[1],
|
$data[1], $data[1],
|
||||||
$data[2], $data[2],
|
$data[2], $data[2],
|
||||||
@@ -78,7 +78,7 @@ sub parse_channel($$$) {
|
|||||||
$band->{type} eq '2' and @bw = ( "bw20", "bw40" );
|
$band->{type} eq '2' and @bw = ( "bw20", "bw40" );
|
||||||
|
|
||||||
foreach my $bw (@bw) {
|
foreach my $bw (@bw) {
|
||||||
push @{$channel->{mcs}}, convert_array([
|
push @{$channel->{"rates-mcs"}}, convert_array([
|
||||||
$data[0],
|
$data[0],
|
||||||
$data[1], $data[1],
|
$data[1], $data[1],
|
||||||
$data[2], $data[2],
|
$data[2], $data[2],
|
||||||
@@ -225,11 +225,11 @@ sub print_txpower($) {
|
|||||||
my @data;
|
my @data;
|
||||||
|
|
||||||
add_named_array($ch, "txs-delta");
|
add_named_array($ch, "txs-delta");
|
||||||
add_named_array($ch, "cck");
|
add_named_array($ch, "rates-cck");
|
||||||
add_named_array($ch, "ofdm");
|
add_named_array($ch, "rates-ofdm");
|
||||||
|
|
||||||
my $prev;
|
my $prev;
|
||||||
foreach my $v (@{$ch->{mcs}}) {
|
foreach my $v (@{$ch->{"rates-mcs"}}) {
|
||||||
my $val = [1, @{$v}];
|
my $val = [1, @{$v}];
|
||||||
|
|
||||||
if ($prev and (array_str($v) eq array_str($prev))) {
|
if ($prev and (array_str($v) eq array_str($prev))) {
|
||||||
@@ -241,7 +241,7 @@ sub print_txpower($) {
|
|||||||
$prev = $v;
|
$prev = $v;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_multi_array("mcs", \@data);
|
add_multi_array("rates-mcs", \@data);
|
||||||
};
|
};
|
||||||
|
|
||||||
sub print_channels($) {
|
sub print_channels($) {
|
||||||
|
|||||||
Reference in New Issue
Block a user