mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 06:24:53 +08:00
mt76: mt7921: add dumping Tx power table
Dump the tx power table saved in offload firmware. Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
18369a4f9d
commit
ea29acc97c
@ -564,6 +564,7 @@ enum {
|
||||
MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
|
||||
MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
|
||||
MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
|
||||
MCU_CMD_GET_TXPWR = MCU_CE_PREFIX | 0xd0,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -146,6 +146,83 @@ mt7921_queues_read(struct seq_file *s, void *data)
|
||||
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
|
||||
mt7921_pm_set(void *data, u64 val)
|
||||
{
|
||||
@ -225,6 +302,8 @@ int mt7921_init_debugfs(struct mt7921_dev *dev)
|
||||
mt7921_queues_read);
|
||||
debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,
|
||||
mt7921_queues_acq);
|
||||
debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,
|
||||
mt7921_txpwr);
|
||||
debugfs_create_file("tx_stats", 0400, dir, dev, &mt7921_tx_stats_fops);
|
||||
debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);
|
||||
debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm);
|
||||
|
@ -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,
|
||||
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_SCHED_SCAN_DONE = 0x23,
|
||||
MCU_EVENT_DBG_MSG = 0x27,
|
||||
MCU_EVENT_TXPWR = 0xd0,
|
||||
MCU_EVENT_COREDUMP = 0xf0,
|
||||
};
|
||||
|
||||
@ -390,4 +391,20 @@ struct mt7921_mcu_wlan_info {
|
||||
__le32 wlan_idx;
|
||||
struct mt7921_mcu_wlan_info_event event;
|
||||
} __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
|
||||
|
@ -172,6 +172,36 @@ struct mt7921_dev {
|
||||
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 {
|
||||
MT_LMAC_AC00,
|
||||
MT_LMAC_AC01,
|
||||
@ -352,4 +382,5 @@ int mt7921_mcu_update_arp_filter(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *info);
|
||||
int mt7921_wfsys_reset(struct mt7921_dev *dev);
|
||||
int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user