Add NPU offload support to MT7996 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover Add NPU offload support to MT7996 driver
Introduce Airoha NPU support to MT7996 driver. NPU is used to enable traffic forward offloading between the MT76 NIC and Airoha ethernet one available on the Airoha EN7581 SoC using Netfilter Flowtable APIs. This series is based on the following net-next series for airoha_npu driver:
https://patchwork.kernel.org/project/netdevbpf/cover/[email protected]/
Lorenzo Bianconi (4):
wifi: mt76: Move Q_READ/Q_WRITE definitions in dma.h
wifi: mt76: Add mt76_dev pointer in mt76_queue struct.
wifi: mt76: Introduce the NPU generic layer
wifi: mt76: mt7996: Add NPU offload support to MT7996 driver
drivers/net/wireless/mediatek/mt76/Makefile | 2 +- drivers/net/wireless/mediatek/mt76/dma.c | 71 ++-- drivers/net/wireless/mediatek/mt76/dma.h | 67 ++++ drivers/net/wireless/mediatek/mt76/mac80211.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 49 +++ .../wireless/mediatek/mt76/mt7996/Makefile | 2 +- .../net/wireless/mediatek/mt76/mt7996/dma.c | 17 +- .../net/wireless/mediatek/mt76/mt7996/init.c | 4 + .../net/wireless/mediatek/mt76/mt7996/mac.c | 3 + .../net/wireless/mediatek/mt76/mt7996/main.c | 15 +- .../net/wireless/mediatek/mt76/mt7996/mmio.c | 13 +- .../wireless/mediatek/mt76/mt7996/mt7996.h | 3 + .../net/wireless/mediatek/mt76/mt7996/npu.c | 268 +++++++++++++ .../net/wireless/mediatek/mt76/mt7996/pci.c | 6 +- drivers/net/wireless/mediatek/mt76/npu.c | 378 ++++++++++++++++++ 15 files changed, 855 insertions(+), 49 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7996/npu.c create mode 100644 drivers/net/wireless/mediatek/mt76/npu.c
Signature · 1 line
2.50.1
Lorenzo Bianconi
maintainerRFC 1/4 wifi: mt76: Move Q_READ/Q_WRITE definitions in dma.h
This is a preliminary patch to enable traffic forward offloading between the MT76 NIC and Airoha ethernet one via the Airoha NPU module available on the Airoha EN7581 SoC.
--- drivers/net/wireless/mediatek/mt76/dma.c | 31 ------------------------ drivers/net/wireless/mediatek/mt76/dma.h | 31 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 31 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +0 -31
@@ -7,37 +7,6 @@#include "mt76.h" #include "dma.h" -#if IS_ENABLED (CONFIG_NET_MEDIATEK_SOC_WED ) - -#define Q_READ (_q, _field) ({ \ - u32 _offset = offsetof(struct mt76_queue_regs, _field); \ - u32 _val; \ - if ((_q)->flags & MT_QFLAG_WED) \ - _val = mtk_wed_device_reg_read((_q)->wed, \ - ((_q)->wed_regs + \ - _offset)); \ - else \ - _val = readl(&(_q)->regs->_field); \ - _val; \ -}) - -#define Q_WRITE (_q, _field, _val) do { \ - u32 _offset = offsetof(struct mt76_queue_regs, _field); \ - if ((_q)->flags & MT_QFLAG_WED) \ - mtk_wed_device_reg_write((_q)->wed, \ - ((_q)->wed_regs + _offset), \ - _val); \ - else \ - writel(_val, &(_q)->regs->_field); \ -} while (0) - -#else - -#define Q_READ (_q, _field) readl(&(_q)->regs->_field) -#define Q_WRITE (_q, _field, _val) writel(_val, &(_q)->regs->_field) - -#endif -static struct mt76_txwi_cache *mt76_alloc_txwi (struct mt76_dev *dev) {
drivers/net/wireless/mediatek/mt76/dma.h +31 -0
@@ -41,6 +41,37 @@#define MT_FCE_INFO_LEN 4#define MT_RX_RXWI_LEN 32 +#if IS_ENABLED (CONFIG_NET_MEDIATEK_SOC_WED ) + +#define Q_READ (_q, _field) ({ \ + u32 _offset = offsetof(struct mt76_queue_regs, _field); \ + u32 _val; \ + if ((_q)->flags & MT_QFLAG_WED) \ + _val = mtk_wed_device_reg_read((_q)->wed, \ + ((_q)->wed_regs + \ + _offset)); \ + else \ + _val = readl(&(_q)->regs->_field); \ + _val; \ +}) + +#define Q_WRITE (_q, _field, _val) do { \ + u32 _offset = offsetof(struct mt76_queue_regs, _field); \ + if ((_q)->flags & MT_QFLAG_WED) \ + mtk_wed_device_reg_write((_q)->wed, \ + ((_q)->wed_regs + _offset), \ + _val); \ + else \ + writel(_val, &(_q)->regs->_field); \ +} while (0) + +#else + +#define Q_READ (_q, _field) readl(&(_q)->regs->_field) +#define Q_WRITE (_q, _field, _val) writel(_val, &(_q)->regs->_field) + +#endif +struct mt76_desc {__le32 buf0;__le32 ctrl;
Signature · 1 line
2.50.1
Lorenzo Bianconi
maintainerRFC 2/4 wifi: mt76: Add mt76_dev pointer in mt76_queue struct.
In reply to Lorenzo BianconiThis is a preliminary patch to enable traffic forward offloading via the Airoha NPU module available on the Airoha EN7581 SoC.
--- drivers/net/wireless/mediatek/mt76/dma.c | 1 + drivers/net/wireless/mediatek/mt76/mt76.h | 1 + 2 files changed, 2 insertions(+)
drivers/net/wireless/mediatek/mt76/dma.c +1 -0
@@ -669,6 +669,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, q->ndesc = n_desc; q->buf_size = bufsize; q->hw_idx = idx; + q->dev = dev; size =mt76_queue_is_wed_rro_ind (q) ?sizeof (struct mt76_wed_rro_desc ) :sizeof (struct mt76_desc );
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -234,6 +234,7 @@ struct mt76_queue {u16 flags;struct mtk_wed_device *wed; +struct mt76_dev *dev;u32 wed_regs;dma_addr_t desc_dma;
Signature · 1 line
2.50.1
Lorenzo Bianconi
maintainerRFC 3/4 wifi: mt76: Introduce the NPU generic layer
In reply to Lorenzo BianconiAdd the NPU generic layer in mt76 module. NPU will be used to enable traffic forward offloading between the MT76 NIC and Airoha ethernet one available on the Airoha EN7581 SoC using Netfilter Flowtable APIs.
--- drivers/net/wireless/mediatek/mt76/Makefile | 2 +- drivers/net/wireless/mediatek/mt76/dma.c | 39 +- drivers/net/wireless/mediatek/mt76/dma.h | 36 ++ drivers/net/wireless/mediatek/mt76/mac80211.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 48 +++ drivers/net/wireless/mediatek/mt76/npu.c | 378 ++++++++++++++++++ 6 files changed, 502 insertions(+), 7 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/npu.c
drivers/net/wireless/mediatek/mt76/Makefile +1 -1
@@ -10,7 +10,7 @@ obj-$(CONFIG_MT792x_USB) += mt792x-usb.o mt76-y := \ mmio.o util.o trace.o dma.o mac80211.o debugfs.o eeprom.o \ - tx.o agg-rx.o mcu.o wed.o scan.o channel.o + tx.o agg-rx.o mcu.o wed.o scan.o channel.o npu.o mt76-$(CONFIG_PCI) += pci.o mt76-$(CONFIG_NL80211_TESTMODE) += testmode.o
drivers/net/wireless/mediatek/mt76/dma.c +34 -5
@@ -162,6 +162,11 @@ mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)Q_WRITE (q, ring_size,MT_DMA_RRO_EN | q->ndesc); else Q_WRITE(q, ring_size, q->ndesc); + +if (mt76_queue_is_npu_tx (q)) { +writel (q->desc_dma, &q->regs->desc_base); +writel (q->ndesc, &q->regs->ring_size); + } q->head =Q_READ (q, dma_idx); q->tail = q->head; }
@@ -172,7 +177,7 @@ void __mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q,if (!q || !q->ndesc)return ; -if (!mt76_queue_is_wed_rro_ind (q)) { +if (!mt76_queue_is_wed_rro_ind (q) && !mt76_queue_is_npu (q)) {int i;/* clear descriptors */
@@ -364,6 +369,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush)while (q->queued >0 && q->tail != last) {mt76_dma_tx_cleanup_idx (dev, q, q->tail, &entry); +mt76_npu_txdesc_cleanup (q, q->tail);mt76_queue_tx_complete (dev, q, &entry);if (entry.txwi) {
@@ -522,6 +528,10 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,if (test_bit (MT76_RESET , &phy->state)) goto free_skb; +/* FIXME: Take into account unlinear skbs */ +if (mt76_npu_device_active (dev) &&skb_linearize (skb)) + goto free_skb; + t =mt76_get_txwi (dev);if (!t) goto free_skb;
@@ -569,6 +579,9 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,if (ret <0 ) goto unmap; +if (mt76_npu_device_active (dev)) +return mt76_npu_dma_add_buf (phy, q, skb, &tx_info.buf[1 ], txwi); +return mt76_dma_add_buf (dev, q, tx_info.buf, tx_info.nbuf, tx_info.info, tx_info.skb, t);
@@ -671,8 +684,15 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, q->hw_idx = idx; q->dev = dev; - size =mt76_queue_is_wed_rro_ind (q) ?sizeof (struct mt76_wed_rro_desc ) - :sizeof (struct mt76_desc ); +if (mt76_queue_is_wed_rro_ind (q)) + size =sizeof (struct mt76_wed_rro_desc ); +else if (mt76_queue_is_npu_tx (q)) + size =sizeof (struct airoha_npu_tx_dma_desc ); +else if (mt76_queue_is_npu_rx (q)) + size =sizeof (struct airoha_npu_rx_dma_desc ); +else + size =sizeof (struct mt76_desc ); + q->desc =dmam_alloc_coherent (dev->dma_dev, q->ndesc * size, &q->desc_dma,GFP_KERNEL );if (!q->desc)
@@ -700,6 +720,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,if (ret)return ret; +mt76_npu_queue_setup (dev, q); ret =mt76_wed_dma_setup (dev, q, false);if (ret)return ret;
@@ -724,6 +745,11 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)if (!q->ndesc)return ; +if (mt76_queue_is_npu (q)) { +mt76_npu_queue_cleanup (dev, q); +return ; + } + do { spin_lock_bh(&q->lock); buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more, NULL);
@@ -753,7 +779,7 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)if (!q->ndesc)return ; -if (!mt76_queue_is_wed_rro_ind (q)) { +if (!mt76_queue_is_wed_rro_ind (q) && !mt76_queue_is_npu (q)) {int i;for (i =0 ; i < q->ndesc; i++)
@@ -773,7 +799,10 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)return ;mt76_dma_sync_idx (dev, q); -mt76_dma_rx_fill_buf (dev, q, false); +if (mt76_queue_is_npu (q)) +mt76_npu_fill_rx_queue (dev, q); +else +mt76_dma_rx_fill (dev, q, false); } static void
drivers/net/wireless/mediatek/mt76/dma.h +36 -0
@@ -65,6 +65,42 @@writel (_val, &(_q)->regs->_field); \ } while (0) +#elif (IS_BUILTIN (CONFIG_NET_AIROHA_NPU ) ||IS_MODULE (CONFIG_NET_AIROHA_NPU )) + +#define Q_READ (_q, _field) ({ \ + u32 _offset = offsetof(struct mt76_queue_regs, _field); \ + u32 _val; \ + if ((_q)->flags & MT_QFLAG_NPU) { \ + struct airoha_npu *npu; \ + \ + rcu_read_lock(); \ + npu = rcu_dereference(q->dev->mmio.npu); \ + if (npu) \ + regmap_read(npu->regmap, \ + ((_q)->wed_regs + _offset), &_val); \ + rcu_read_unlock(); \ + } else { \ + _val = readl(&(_q)->regs->_field); \ + } \ + _val; \ +}) + +#define Q_WRITE (_q, _field, _val) do { \ + u32 _offset = offsetof(struct mt76_queue_regs, _field); \ + if ((_q)->flags & MT_QFLAG_NPU) { \ + struct airoha_npu *npu; \ + \ + rcu_read_lock(); \ + npu = rcu_dereference(q->dev->mmio.npu); \ + if (npu) \ + regmap_write(npu->regmap, \ + ((_q)->wed_regs + _offset), _val); \ + rcu_read_unlock(); \ + } else { \ + writel(_val, &(_q)->regs->_field); \ + } \ +} while (0) +#else #define Q_READ (_q, _field) readl(&(_q)->regs->_field)
drivers/net/wireless/mediatek/mt76/mac80211.c +5 -1
@@ -630,6 +630,8 @@ int mt76_create_page_pool(struct mt76_dev *dev, struct mt76_queue *q)case MT_RXQ_MAIN :case MT_RXQ_BAND1 :case MT_RXQ_BAND2 : +case MT_RXQ_NPU0 : +case MT_RXQ_NPU1 : pp_params.pool_size =256 ;break ;default :
@@ -814,6 +816,7 @@ void mt76_free_device(struct mt76_dev *dev)destroy_workqueue (dev->wq); dev->wq =NULL ; } +mt76_npu_deinit (dev);ieee80211_free_hw (dev->hw); }EXPORT_SYMBOL_GPL (mt76_free_device);
@@ -1509,7 +1512,8 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,while ((skb =__skb_dequeue (&dev->rx_skb[q])) !=NULL ) {mt76_check_sta (dev, skb); -if (mtk_wed_device_active (&dev->mmio.wed)) +if (mtk_wed_device_active (&dev->mmio.wed) || +mt76_npu_device_active (dev))__skb_queue_tail (&frames, skb);else mt76_rx_aggr_reorder (skb, &frames);
drivers/net/wireless/mediatek/mt76/mt76.h +48 -0
90 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/npu.c new file +378 -0
378 lines not on this page · raw message
Signature · 1 line
2.50.1
Lorenzo Bianconi
maintainerRFC 4/4 wifi: mt76: mt7996: Add NPU offload support to MT7996 driver
In reply to Lorenzo BianconiIntroduce Airoha NPU support to MT7996 driver. NPU is used to enable traffic forward offloading between the MT76 NIC and Airoha ethernet one available on the Airoha EN7581 SoC using Netfilter Flowtable APIs.
--- .../wireless/mediatek/mt76/mt7996/Makefile | 2 +- .../net/wireless/mediatek/mt76/mt7996/dma.c | 17 +- .../net/wireless/mediatek/mt76/mt7996/init.c | 4 + .../net/wireless/mediatek/mt76/mt7996/mac.c | 3 + .../net/wireless/mediatek/mt76/mt7996/main.c | 15 +- .../net/wireless/mediatek/mt76/mt7996/mmio.c | 13 +- .../wireless/mediatek/mt76/mt7996/mt7996.h | 3 + .../net/wireless/mediatek/mt76/mt7996/npu.c | 268 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7996/pci.c | 6 +- 9 files changed, 320 insertions(+), 11 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7996/npu.c
drivers/net/wireless/mediatek/mt76/mt7996/Makefile +1 -1
@@ -3,6 +3,6 @@ obj-$(CONFIG_MT7996E) += mt7996e.o mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \ - debugfs.o mmio.o + debugfs.o mmio.o npu.o mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o
drivers/net/wireless/mediatek/mt76/mt7996/dma.c +16 -1
@@ -23,6 +23,9 @@ int mt7996_init_tx_queues(struct mt7996_phy *phy, int idx, int n_desc, flags =MT_WED_Q_TX (idx); } +if (mt76_npu_device_active (&dev->mt76)) + flags =MT_NPU_Q_TX (phy->mt76->band_idx); +return mt76_connac_init_tx_queues (phy->mt76, idx, n_desc, ring_base, wed, flags); }
@@ -302,7 +305,7 @@ void mt7996_dma_start(struct mt7996_dev *dev, bool reset, bool wed_reset)mtk_wed_device_start (wed, wed_irq_mask); } -if (!mt7996_has_wa (dev)) +if (!mt7996_has_wa (dev) ||mt76_npu_device_active (&dev->mt76)) irq_mask &= ~(MT_INT_RX (MT_RXQ_MAIN_WA ) |MT_INT_RX (MT_RXQ_BAND1_WA )); irq_mask = reset ?MT_INT_MCU_CMD : irq_mask;
@@ -705,6 +708,18 @@ int mt7996_dma_init(struct mt7996_dev *dev) } } +if (mt76_npu_device_active (&dev->mt76)) { + ret =mt76_npu_rx_queue_init (&dev->mt76, + &dev->mt76.q_rx[MT_RXQ_NPU0 ]); +if (ret) +return ret; + + ret =mt76_npu_rx_queue_init (&dev->mt76, + &dev->mt76.q_rx[MT_RXQ_NPU1 ]); +if (ret) +return ret; + } + ret =mt76_init_queues (dev, mt76_dma_rx_poll);if (ret <0 )return ret;
drivers/net/wireless/mediatek/mt76/mt7996/init.c +4 -0
@@ -1511,6 +1511,10 @@ int mt7996_register_device(struct mt7996_dev *dev)if (ret)return ret; + ret =mt7996_npu_hw_init (dev); +if (ret) +return ret; + ret =mt76_register_device (&dev->mt76, true, mt76_rates,ARRAY_SIZE (mt76_rates));if (ret)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c +3 -0
@@ -2018,6 +2018,8 @@ void mt7996_mac_reset_work(struct work_struct *work)mutex_lock (&dev->mt76.mutex); +mt7996_npu_hw_stop (dev); +mt76_wr (dev,MT_MCU_INT_EVENT ,MT_MCU_INT_EVENT_DMA_STOPPED );if (mt7996_wait_reset_state (dev,MT_MCU_CMD_RESET_DONE )) {
@@ -2092,6 +2094,7 @@ void mt7996_mac_reset_work(struct work_struct *work)mutex_unlock (&dev->mt76.mutex); +mt7996_npu_hw_init (dev);mt7996_update_beacons (dev); ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
drivers/net/wireless/mediatek/mt76/mt7996/main.c +9 -6
@@ -2054,7 +2054,6 @@ mt7996_set_radar_background(struct ieee80211_hw *hw,return ret; } -#ifdef CONFIG_NET_MEDIATEK_SOC_WED static int mt7996_net_fill_forward_path(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
@@ -2090,12 +2089,18 @@ mt7996_net_fill_forward_path(struct ieee80211_hw *hw,if (phy != &dev->phy && phy->mt76->band_idx ==MT_BAND2 ) wed = &dev->mt76.mmio.wed_hif2; -if (!mtk_wed_device_active (wed)) +if (!mtk_wed_device_active (wed) && + !mt76_npu_device_active (&dev->mt76))return -ENODEV ; path->type =DEV_PATH_MTK_WDMA ; path->dev = ctx->dev; - path->mtk_wdma.wdma_idx = wed->wdma_idx; +#ifdef CONFIG_NET_MEDIATEK_SOC_WED +if (mtk_wed_device_active (wed)) + path->mtk_wdma.wdma_idx = wed->wdma_idx; + else +#endif + path->mtk_wdma.wdma_idx = link->phy->mt76->band_idx; path->mtk_wdma.bss = mlink->idx; path->mtk_wdma.queue =0 ; path->mtk_wdma.wcid = msta_link->wcid.idx;
@@ -2106,8 +2111,6 @@ mt7996_net_fill_forward_path(struct ieee80211_hw *hw,return 0 ; } -#endif - static int mt7996_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 old_links, u16 new_links,
@@ -2168,8 +2171,8 @@ const struct ieee80211_ops mt7996_ops = { .sta_add_debugfs = mt7996_sta_add_debugfs, #endif .set_radar_background = mt7996_set_radar_background, -#ifdef CONFIG_NET_MEDIATEK_SOC_WED .net_fill_forward_path = mt7996_net_fill_forward_path, +#ifdef CONFIG_NET_MEDIATEK_SOC_WED .net_setup_tc = mt76_wed_net_setup_tc, #endif .change_vif_links = mt7996_change_vif_links,
drivers/net/wireless/mediatek/mt76/mt7996/mmio.c +11 -2
@@ -671,9 +671,18 @@ void mt7996_dual_hif_set_irq_mask(struct mt7996_dev *dev, bool write_reg,static void mt7996_rx_poll_complete (struct mt76_dev *mdev,enum mt76_rxq_id q) { - struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76); +if (q ==MT_RXQ_NPU0 || q ==MT_RXQ_NPU1 ) { +struct airoha_npu *npu; + + npu =rcu_dereference (mdev->mmio.npu); +if (npu) +airoha_npu_wlan_enable_irq (npu, q -MT_RXQ_NPU0 ); + }else { + struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, + mt76); -mt7996_irq_enable (dev,MT_INT_RX (q)); +mt7996_irq_enable (dev,MT_INT_RX (q)); + } }/* TODO: support 2/4/6/8 MSI-X vectors */
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h +3 -0
@@ -782,6 +782,9 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr, bool hif2, int *irq);u32 mt7996_wed_init_buf (void *ptr,dma_addr_t phys,int token_id); +int mt7996_npu_hw_init (struct mt7996_dev *dev); +int mt7996_npu_hw_stop (struct mt7996_dev *dev); +#ifdef CONFIG_MTK_DEBUG int mt7996_mtk_init_debugfs (struct mt7996_phy *phy,struct dentry *dir);#endif
drivers/net/wireless/mediatek/mt76/mt7996/npu.c new file +268 -0
268 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7996/pci.c +5 -1
@@ -98,10 +98,10 @@ static int mt7996_pci_hif2_probe(struct pci_dev *pdev)static int mt7996_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) { +int irq, hif2_irq, ret, npu_type;struct pci_dev *hif2_dev;struct mt7996_hif *hif2;struct mt7996_dev *dev; -int irq, hif2_irq, ret;struct mt76_dev *mdev; ret =pcim_enable_device (pdev);
@@ -138,6 +138,10 @@ static int mt7996_pci_probe(struct pci_dev *pdev,mt7996_wfsys_reset (dev); hif2 =mt7996_pci_init_hif2 (pdev); + npu_type = pdev->bus &&pci_domain_nr (pdev->bus) ?3 :2 ; +if (mt76_npu_init (mdev,pci_resource_start (pdev,0 ), npu_type)) +dev_warn (mdev->dev,"failed loading npu\n" ); + ret =mt7996_mmio_wed_init (dev, pdev, false, &irq);if (ret <0 ) goto free_wed_or_irq_vector;
Signature · 1 line
2.50.1