From: Shengwei Lu Enable the shared ICS logging framework for the MT7925/MT7928 family: - register the "ics" debugfs entry and set up the ics_worker in mt7925_register_device(), tearing it down in mt7925e_unregister_device(); - dispatch PKT_TYPE_ICS frames in mt7925_queue_rx_skb() to the shared mt792x_mcu_rx_ics(); - add the ICS RX queue id MT7928_RXQ_MCU_ICS and the rx_ics DMA ring for the mt7925 and mt7928 DMA layouts; - add MT7928_INT_RX_ICS and its rx.wm4_complete_mask on the mt7928 irq map, and napi-disable the ICS queue on MAC reset. Signed-off-by: Shengwei Lu --- drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7925/init.c | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h | 1 + drivers/net/wireless/mediatek/mt76/mt7925/pci.c | 9 +++++++++ drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c | 2 ++ drivers/net/wireless/mediatek/mt76/mt7925/regs.h | 4 +++- 7 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c index d01ff49de47a..896cf4df21fa 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c @@ -63,6 +63,9 @@ mt7925_fw_debug_get(void *data, u64 *val) DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug, mt7925_fw_debug_get, mt7925_fw_debug_set, "%lld\n"); +DEFINE_DEBUGFS_ATTRIBUTE(fops_ics, mt792x_ics_get, + mt792x_ics_set, "%lld\n"); + DEFINE_SHOW_ATTRIBUTE(mt792x_tx_stats); static void @@ -292,6 +295,8 @@ int mt7925_init_debugfs(struct mt792x_dev *dev) dir = mt76_register_debugfs_fops(&dev->mphy, &fops_regval); + debugfs_create_file("ics", 0600, dir, dev, &fops_ics); + if (mt76_is_mmio(&dev->mt76)) debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", dir, mt792x_queues_read); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/init.c b/drivers/net/wireless/mediatek/mt76/mt7925/init.c index 8c3049b66a85..f619c818ac4d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/init.c @@ -250,6 +250,11 @@ int mt7925_register_device(struct mt792x_dev *dev) dev->mt76.phy.priv = &dev->phy; dev->mt76.tx_worker.fn = mt792x_tx_worker; + dev->ics_worker.fn = mt792x_ics_worker; + WARN_ON(mt76_worker_setup(hw, &dev->ics_worker, NULL, "ics")); + mt76_worker_disable(&dev->ics_worker); + skb_queue_head_init(&dev->ics_q); + INIT_DELAYED_WORK(&dev->pm.ps_work, mt792x_pm_power_save_work); INIT_DELAYED_WORK(&dev->mlo_pm_work, mt7925_mlo_pm_work); INIT_WORK(&dev->pm.wake_work, mt792x_pm_wake_work); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mac.c b/drivers/net/wireless/mediatek/mt76/mt7925/mac.c index 7af996abe294..62d0a3baa4ec 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mac.c @@ -1440,6 +1440,9 @@ void mt7925_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, type = PKT_TYPE_NORMAL_MCU; switch (type) { + case PKT_TYPE_ICS: + mt792x_mcu_rx_ics(dev, skb); + break; case PKT_TYPE_TXRX_NOTIFY: if (!mt76_is_mmio(mdev)) { napi_consume_skb(skb, 1); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h index 636efe038392..d917e2c9bd02 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h @@ -150,6 +150,7 @@ enum mt7928_rxq_id { MT7928_RXQ_BAND1 = 2, MT7928_RXQ_MCU_WM = 3, MT7928_RXQ_MCU_WM2 = 1, /* for tx done */ + MT7928_RXQ_MCU_ICS = 4, }; enum { diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c index 0d477dc1086c..a5bcca75bbf4 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c @@ -104,6 +104,8 @@ static void mt7925e_unregister_device(struct mt792x_dev *dev) if (dev->phy.chip_cap & MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN) wiphy_rfkill_stop_polling(hw->wiphy); + mt76_worker_teardown(&dev->ics_worker); + cancel_work_sync(&dev->init_work); mt76_unregister_device(&dev->mt76); set_bit(MT76_REMOVED, &dev->mphy.state); @@ -392,6 +394,9 @@ static const struct mt792x_dma_layout mt7925_dma_layout = { .rx_data = mt792x_dma_ring(MT7925_RXQ_BAND0, MT7925_RX_RING_SIZE, MT_RX_DATA_RING_BASE), + .rx_ics = mt792x_dma_ring(MT7925_RXQ_MCU_WM2, + MT7925_RX_MCU_RING_SIZE, + MT_RX_EVENT_RING_BASE), }; static const struct mt792x_dma_layout mt7927_dma_layout = { @@ -431,6 +436,9 @@ static const struct mt792x_dma_layout mt7928_dma_layout = { .rx_data = mt792x_dma_ring(MT7928_RXQ_BAND0, MT7925_RX_RING_SIZE, MT_RX_DATA_RING_BASE), + .rx_ics = mt792x_dma_ring(MT7928_RXQ_MCU_ICS, + MT7925_RX_MCU_RING_SIZE, + MT_RX_EVENT_RING_BASE), }; static int mt7927_dma_init(struct mt792x_dev *dev) @@ -581,6 +589,7 @@ static const struct mt792x_irq_map mt7928_irq_map = { .data_complete_mask = MT7928_INT_RX_DONE_DATA, .wm_complete_mask = MT7928_INT_RX_DONE_WM, .wm2_complete_mask = MT_INT_RX_DONE_WM2, + .wm4_complete_mask = MT7928_INT_RX_ICS, }, }; diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c index bc8f741e9426..735188873463 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c @@ -99,6 +99,8 @@ int mt7925e_mac_reset(struct mt792x_dev *dev) napi_disable(&dev->mt76.napi[MT_RXQ_MCU]); if (irq_map->rx.wm2_complete_mask) napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]); + if (is_mt7928(&dev->mt76) && irq_map->rx.wm4_complete_mask) + napi_disable(&dev->mt76.napi[MT_RXQ_ICS]); if (irq_map->tx.all_complete_mask) napi_disable(&dev->mt76.tx_napi); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/regs.h b/drivers/net/wireless/mediatek/mt76/mt7925/regs.h index e040dff321dd..7b23ead148bb 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/regs.h +++ b/drivers/net/wireless/mediatek/mt76/mt7925/regs.h @@ -59,9 +59,11 @@ #define MT7928_INT_RX_DONE_DATA HOST_RX_DONE_INT_ENA0 #define MT7928_INT_RX_DONE_WM HOST_RX_DONE_INT_ENA3 +#define MT7928_INT_RX_ICS HOST_RX_DONE_INT_ENA4 #define MT7928_INT_RX_DONE_ALL (MT7928_INT_RX_DONE_DATA | \ MT7928_INT_RX_DONE_WM | \ - MT_INT_RX_DONE_WM2) + MT_INT_RX_DONE_WM2 | \ + MT7928_INT_RX_ICS) #define MT_INT_TX_DONE_MCU_WM (HOST_TX_DONE_INT_ENA15 | \ HOST_TX_DONE_INT_ENA17) -- 2.45.2