mt76: mt7915: enable firmware module debug support
authorRyder Lee <ryder.lee@mediatek.com>
Fri, 24 Apr 2020 19:32:38 +0000 (03:32 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 12 May 2020 17:52:36 +0000 (19:52 +0200)
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>
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h

index cf3b60ded6ef45f42f94d9c372cf212cec0e7884..c6c009cd773edf57acc4868916839b4deb0a84d1 100644 (file)
@@ -74,6 +74,41 @@ mt7915_dbdc_get(void *data, u64 *val)
 DEFINE_DEBUGFS_ATTRIBUTE(fops_dbdc, mt7915_dbdc_get,
                         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
 mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
                           struct seq_file *file)
@@ -290,6 +325,7 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)
                                    mt7915_queues_acq);
        debugfs_create_file("tx_stats", 0400, dir, dev, &fops_tx_stats);
        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);
        /* test knobs */
        debugfs_create_file("radar_trigger", 0200, dir, dev,
index cbf96a56947a4a3e96f219edb7d52790c2643e1f..3e3d6f1d555a43b63285cead9a8217e782d66620 100644 (file)
@@ -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
 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:
                mt7915_mcu_tx_rate_report(dev, skb);
                break;
+       case MCU_EXT_EVENT_FW_LOG_2_HOST:
+               mt7915_mcu_rx_log_message(dev, skb);
+               break;
        default:
                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;
 
        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_PS_SYNC ||
            rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
@@ -2265,6 +2291,37 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)
        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)
 {
        static const struct mt76_mcu_ops mt7915_mcu_ops = {
@@ -2286,6 +2343,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
                return ret;
 
        set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
+       mt7915_mcu_fw_log_2_host(dev, 0);
 
        return 0;
 }
index b8d28d97197414eb3c917bcca13b35fe7c2d64fb..f68d2094ac6f9eca712fa3e1154d90455cc8405e 100644 (file)
@@ -38,6 +38,7 @@ enum {
 /* ext event table */
 enum {
        MCU_EXT_EVENT_PS_SYNC = 0x5,
+       MCU_EXT_EVENT_FW_LOG_2_HOST = 0x13,
        MCU_EXT_EVENT_THERMAL_PROTECT = 0x22,
        MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
        MCU_EXT_EVENT_RDD_REPORT = 0x3a,
@@ -192,6 +193,7 @@ enum {
        MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
        MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
        MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
+       MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
        MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
        MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
        MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
@@ -207,6 +209,7 @@ enum {
        MCU_EXT_CMD_SET_SER_TRIGGER = 0x81,
        MCU_EXT_CMD_SCS_CTRL = 0x82,
        MCU_EXT_CMD_RATE_CTRL = 0x87,
+       MCU_EXT_CMD_FW_DBG_CTRL = 0x95,
        MCU_EXT_CMD_SET_RDD_TH = 0x9d,
 };
 
index e5821d144c859ea13f3d8c23c90805d955e21299..43c956bc09f5dd82057be69406a719282ecf93e5 100644 (file)
@@ -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_rdd_cmd(struct mt7915_dev *dev, enum mt7915_rdd_cmd cmd,
                       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_exit(struct mt7915_dev *dev);