mt76: mt7615: report firmware log event messages
authorFelix Fietkau <nbd@nbd.name>
Sun, 29 Dec 2019 12:49:18 +0000 (13:49 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:08 +0000 (10:06 +0100)
Useful for debugging firmware issues. Can be turned on via the "fw_debug"
debugfs file

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

index 783f145b7d0202602f1a8bb376573a3c45761411..158c0c183e9c6b23a19604a14ba94c21e5fb8d26 100644 (file)
@@ -71,6 +71,33 @@ mt7615_dbdc_get(void *data, u64 *val)
 DEFINE_DEBUGFS_ATTRIBUTE(fops_dbdc, mt7615_dbdc_get,
                         mt7615_dbdc_set, "%lld\n");
 
+static int
+mt7615_fw_debug_set(void *data, u64 val)
+{
+       struct mt7615_dev *dev = data;
+
+       if (!mt7615_wait_for_mcu_init(dev))
+               return 0;
+
+       dev->fw_debug = val;
+       mt7615_mcu_fw_log_2_host(dev, dev->fw_debug ? 2 : 0);
+
+       return 0;
+}
+
+static int
+mt7615_fw_debug_get(void *data, u64 *val)
+{
+       struct mt7615_dev *dev = data;
+
+       *val = dev->fw_debug;
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug, mt7615_fw_debug_get,
+                        mt7615_fw_debug_set, "%lld\n");
+
 static int
 mt7615_ampdu_stat_read(struct seq_file *file, void *data)
 {
@@ -222,6 +249,7 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
        debugfs_create_file("ampdu_stat", 0400, dir, dev, &fops_ampdu_stat);
        debugfs_create_file("scs", 0600, dir, dev, &fops_scs);
        debugfs_create_file("dbdc", 0600, dir, dev, &fops_dbdc);
+       debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug);
        debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir,
                                    mt7615_radio_read);
        debugfs_create_u32("dfs_hw_pattern", 0400, dir, &dev->hw_pattern);
index 1face7abb9bb2724e4f98d7e79af8446d0096050..cd25ff8aed22f62f8e4b538999d2e83d2dc4aae7 100644 (file)
@@ -201,6 +201,28 @@ mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
        dev->hw_pattern++;
 }
 
+static void
+mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
+{
+       struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
+       const char *data = (char *)&rxd[1];
+       const char *type;
+
+       switch (rxd->s2d_index) {
+       case 0:
+               type = "N9";
+               break;
+       case 2:
+               type = "CR4";
+               break;
+       default:
+               type = "unknown";
+               break;
+       }
+
+       wiphy_info(mt76_hw(dev)->wiphy, "%s: %s", type, data);
+}
+
 static void
 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
 {
@@ -215,6 +237,9 @@ mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
                                IEEE80211_IFACE_ITER_RESUME_ALL,
                                mt7615_mcu_csa_finish, dev);
                break;
+       case MCU_EXT_EVENT_FW_LOG_2_HOST:
+               mt7615_mcu_rx_log_message(dev, skb);
+               break;
        default:
                break;
        }
@@ -643,6 +668,19 @@ static int mt7622_load_firmware(struct mt7615_dev *dev)
        return 0;
 }
 
+int mt7615_mcu_fw_log_2_host(struct mt7615_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 mt7615_mcu_init(struct mt7615_dev *dev)
 {
        static const struct mt76_mcu_ops mt7615_mcu_ops = {
@@ -667,6 +705,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)
        mt76_queue_tx_cleanup(dev, MT_TXQ_FWDL, false);
        dev_dbg(dev->mt76.dev, "Firmware init done\n");
        set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
+       mt7615_mcu_fw_log_2_host(dev, 0);
 
        return 0;
 }
index 640b00b8aa322ee63c7dccd48b2681e7e389c6d4..2fbfbdb2c53d938f6f5294680952a945d23fe211 100644 (file)
@@ -195,6 +195,7 @@ enum {
        MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
        MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
        MCU_EXT_CMD_SET_TX_POWER_CTRL = 0x11,
+       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,
index b43a09894487afadfbe4a7ca9dcfabb9df579bdb..b4748cf079b1a01bfe437463814c658adf20b15f 100644 (file)
@@ -169,6 +169,7 @@ struct mt7615_dev {
 
        u8 mac_work_count;
        bool scs_en;
+       bool fw_debug;
 
        spinlock_t token_lock;
        struct idr token;
@@ -308,6 +309,7 @@ int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
                       enum mt7615_rdd_cmd cmd, u8 index,
                       u8 rx_sel, u8 val);
 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev);
+int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl);
 
 static inline bool is_mt7622(struct mt76_dev *dev)
 {