mt76: mt7915: enable firmware module debug support
This allows host driver to get useful information of some important modules. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Chih-Min Chen <chih-min.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
32add88f64
commit
5517f78b00
|
@ -74,6 +74,41 @@ mt7915_dbdc_get(void *data, u64 *val)
|
||||||
DEFINE_DEBUGFS_ATTRIBUTE(fops_dbdc, mt7915_dbdc_get,
|
DEFINE_DEBUGFS_ATTRIBUTE(fops_dbdc, mt7915_dbdc_get,
|
||||||
mt7915_dbdc_set, "%lld\n");
|
mt7915_dbdc_set, "%lld\n");
|
||||||
|
|
||||||
|
static int
|
||||||
|
mt7915_fw_debug_set(void *data, u64 val)
|
||||||
|
{
|
||||||
|
struct mt7915_dev *dev = data;
|
||||||
|
enum {
|
||||||
|
DEBUG_TXCMD = 62,
|
||||||
|
DEBUG_CMD_RPT_TX,
|
||||||
|
DEBUG_CMD_RPT_TRIG,
|
||||||
|
DEBUG_SPL,
|
||||||
|
DEBUG_RPT_RX,
|
||||||
|
} debug;
|
||||||
|
|
||||||
|
dev->fw_debug = !!val;
|
||||||
|
|
||||||
|
mt7915_mcu_fw_log_2_host(dev, dev->fw_debug ? 2 : 0);
|
||||||
|
|
||||||
|
for (debug = DEBUG_TXCMD; debug <= DEBUG_RPT_RX; debug++)
|
||||||
|
mt7915_mcu_fw_dbg_ctrl(dev, debug, dev->fw_debug);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mt7915_fw_debug_get(void *data, u64 *val)
|
||||||
|
{
|
||||||
|
struct mt7915_dev *dev = data;
|
||||||
|
|
||||||
|
*val = dev->fw_debug;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug, mt7915_fw_debug_get,
|
||||||
|
mt7915_fw_debug_set, "%lld\n");
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
|
mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
|
||||||
struct seq_file *file)
|
struct seq_file *file)
|
||||||
|
@ -290,6 +325,7 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)
|
||||||
mt7915_queues_acq);
|
mt7915_queues_acq);
|
||||||
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("dbdc", 0600, dir, dev, &fops_dbdc);
|
debugfs_create_file("dbdc", 0600, dir, dev, &fops_dbdc);
|
||||||
|
debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);
|
||||||
debugfs_create_u32("dfs_hw_pattern", 0400, dir, &dev->hw_pattern);
|
debugfs_create_u32("dfs_hw_pattern", 0400, dir, &dev->hw_pattern);
|
||||||
/* test knobs */
|
/* test knobs */
|
||||||
debugfs_create_file("radar_trigger", 0200, dir, dev,
|
debugfs_create_file("radar_trigger", 0200, dir, dev,
|
||||||
|
|
|
@ -502,6 +502,28 @@ mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
|
||||||
|
const char *data = (char *)&rxd[1];
|
||||||
|
const char *type;
|
||||||
|
|
||||||
|
switch (rxd->s2d_index) {
|
||||||
|
case 0:
|
||||||
|
type = "WM";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
type = "WA";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
type = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
wiphy_info(mt76_hw(dev)->wiphy, "%s: %s", type, data);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
|
mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
@ -519,6 +541,9 @@ mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
case MCU_EXT_EVENT_RATE_REPORT:
|
case MCU_EXT_EVENT_RATE_REPORT:
|
||||||
mt7915_mcu_tx_rate_report(dev, skb);
|
mt7915_mcu_tx_rate_report(dev, skb);
|
||||||
break;
|
break;
|
||||||
|
case MCU_EXT_EVENT_FW_LOG_2_HOST:
|
||||||
|
mt7915_mcu_rx_log_message(dev, skb);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -544,6 +569,7 @@ void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
|
struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
|
||||||
|
|
||||||
if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
|
if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
|
||||||
|
rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
|
||||||
rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
|
rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
|
||||||
rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
|
rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
|
||||||
rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
|
rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
|
||||||
|
@ -2265,6 +2291,37 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 ctrl)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
u8 ctrl_val;
|
||||||
|
u8 pad[3];
|
||||||
|
} data = {
|
||||||
|
.ctrl_val = ctrl
|
||||||
|
};
|
||||||
|
|
||||||
|
return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST,
|
||||||
|
&data, sizeof(data), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
u8 ver;
|
||||||
|
u8 pad;
|
||||||
|
u16 len;
|
||||||
|
u8 level;
|
||||||
|
u8 rsv[3];
|
||||||
|
u32 module_idx;
|
||||||
|
} data = {
|
||||||
|
.module_idx = cpu_to_le32(module),
|
||||||
|
.level = level,
|
||||||
|
};
|
||||||
|
|
||||||
|
return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_DBG_CTRL,
|
||||||
|
&data, sizeof(data), false);
|
||||||
|
}
|
||||||
|
|
||||||
int mt7915_mcu_init(struct mt7915_dev *dev)
|
int mt7915_mcu_init(struct mt7915_dev *dev)
|
||||||
{
|
{
|
||||||
static const struct mt76_mcu_ops mt7915_mcu_ops = {
|
static const struct mt76_mcu_ops mt7915_mcu_ops = {
|
||||||
|
@ -2286,6 +2343,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
|
set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
|
||||||
|
mt7915_mcu_fw_log_2_host(dev, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ enum {
|
||||||
/* ext event table */
|
/* ext event table */
|
||||||
enum {
|
enum {
|
||||||
MCU_EXT_EVENT_PS_SYNC = 0x5,
|
MCU_EXT_EVENT_PS_SYNC = 0x5,
|
||||||
|
MCU_EXT_EVENT_FW_LOG_2_HOST = 0x13,
|
||||||
MCU_EXT_EVENT_THERMAL_PROTECT = 0x22,
|
MCU_EXT_EVENT_THERMAL_PROTECT = 0x22,
|
||||||
MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
|
MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
|
||||||
MCU_EXT_EVENT_RDD_REPORT = 0x3a,
|
MCU_EXT_EVENT_RDD_REPORT = 0x3a,
|
||||||
|
@ -192,6 +193,7 @@ enum {
|
||||||
MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
|
MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
|
||||||
MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
|
MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
|
||||||
MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
|
MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
|
||||||
|
MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
|
||||||
MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
|
MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
|
||||||
MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
|
MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
|
||||||
MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
|
MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
|
||||||
|
@ -207,6 +209,7 @@ enum {
|
||||||
MCU_EXT_CMD_SET_SER_TRIGGER = 0x81,
|
MCU_EXT_CMD_SET_SER_TRIGGER = 0x81,
|
||||||
MCU_EXT_CMD_SCS_CTRL = 0x82,
|
MCU_EXT_CMD_SCS_CTRL = 0x82,
|
||||||
MCU_EXT_CMD_RATE_CTRL = 0x87,
|
MCU_EXT_CMD_RATE_CTRL = 0x87,
|
||||||
|
MCU_EXT_CMD_FW_DBG_CTRL = 0x95,
|
||||||
MCU_EXT_CMD_SET_RDD_TH = 0x9d,
|
MCU_EXT_CMD_SET_RDD_TH = 0x9d,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -324,6 +324,8 @@ int mt7915_mcu_get_rate_info(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx);
|
||||||
int mt7915_mcu_get_temperature(struct mt7915_dev *dev, int index);
|
int mt7915_mcu_get_temperature(struct mt7915_dev *dev, int index);
|
||||||
int mt7915_mcu_rdd_cmd(struct mt7915_dev *dev, enum mt7915_rdd_cmd cmd,
|
int mt7915_mcu_rdd_cmd(struct mt7915_dev *dev, enum mt7915_rdd_cmd cmd,
|
||||||
u8 index, u8 rx_sel, u8 val);
|
u8 index, u8 rx_sel, u8 val);
|
||||||
|
int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 ctrl);
|
||||||
|
int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level);
|
||||||
void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb);
|
void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb);
|
||||||
void mt7915_mcu_exit(struct mt7915_dev *dev);
|
void mt7915_mcu_exit(struct mt7915_dev *dev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue