add mt7916 support
Subsystems (3)
cover add mt7916 support
From: Bo Jiao <[email protected]>
This adds support for mt7916 PCIe-based device, which shares the same driver with MT7915. The maximum number of client connections is extended to 512. mt7916 is capable of WIFI6@160MHz, simultaneous dual-band and all WiFi6 R2 features.
Bo Jiao (11):
mt76: mt7915: add mt7915_mmio_probe() as a common probing function
mt76: mt7915: refine register definition
mt76: mt7915: rework dma.c to adapt mt7916 changes
mt76: mt7915: add firmware support for mt7916
mt76: mt7915: rework eeprom.c to adapt mt7916 changes
mt76: mt7915: enlarge wcid size to 544
mt76: mt7915: add txfree event v3
mt76: mt7915: update rx rate reporting for mt7916
mt76: mt7915: update mt7915_chan_mib_offs for mt7916
mt76: mt7915: add mt7916 calibrated data support
mt76: mt7915: add device id for mt7916
drivers/net/wireless/mediatek/mt76/dma.c | 13 +- drivers/net/wireless/mediatek/mt76/mt76.h | 6 +- .../wireless/mediatek/mt76/mt7915/debugfs.c | 20 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 388 ++++++--- .../wireless/mediatek/mt76/mt7915/eeprom.c | 94 ++- .../wireless/mediatek/mt76/mt7915/eeprom.h | 9 +- .../net/wireless/mediatek/mt76/mt7915/init.c | 66 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 273 ++++--- .../net/wireless/mediatek/mt76/mt7915/mac.h | 14 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 11 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 98 ++- .../net/wireless/mediatek/mt76/mt7915/mcu.h | 8 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 757 ++++++++++++++++-- .../wireless/mediatek/mt76/mt7915/mt7915.h | 37 +- .../net/wireless/mediatek/mt76/mt7915/pci.c | 243 +----- .../net/wireless/mediatek/mt76/mt7915/regs.h | 670 +++++++++++----- .../wireless/mediatek/mt76/mt7915/testmode.c | 58 +- 17 files changed, 1907 insertions(+), 858 deletions(-)
Signature · 1 line
2.18.0
PATCH 1/11 mt76: mt7915: add mt7915_mmio_probe() as a common probing function
From: Bo Jiao <[email protected]>
Add mt7915_mmio_probe() which will be used for the upcoming devices. This is an intermediate patch to add mt7916 support.
--- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 232 ++++++++++++++++- .../wireless/mediatek/mt76/mt7915/mt7915.h | 7 +- .../net/wireless/mediatek/mt76/mt7915/pci.c | 233 ++---------------- 3 files changed, 255 insertions(+), 217 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +231 -1
@@ -1,7 +1,14 @@// SPDX-License-Identifier: ISC /* Copyright (C) 2020 MediaTek Inc. */ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/pci.h> +#include "mt7915.h" +#include "mac.h" +#include "../trace.h" static u32 mt7915_reg_map_l1 (struct mt7915_dev *dev,u32 addr) {
@@ -125,7 +132,9 @@ static u32 mt7915_rmw(struct mt76_dev *mdev, u32 offset, u32 mask, u32 val)return dev->bus_ops->rmw (mdev, addr, mask, val); } -int mt7915_mmio_init (struct mt76_dev *mdev,void __iomem *mem_base,int irq) +static int mt7915_mmio_init (struct mt76_dev *mdev, +void __iomem *mem_base, +u32 device_id) {struct mt76_bus_ops *bus_ops;struct mt7915_dev *dev;
@@ -148,7 +157,228 @@ int mt7915_mmio_init(struct mt76_dev *mdev, void __iomem *mem_base, int irq) (mt76_rr (dev,MT_HW_REV ) &0xff );dev_dbg (mdev->dev,"ASIC revision: %04x\n" , mdev->rev); +return 0 ; +} + +void mt7915_dual_hif_set_irq_mask (struct mt7915_dev *dev, +bool write_reg, +u32 clear,u32 set) +{ +struct mt76_dev *mdev = &dev->mt76; +unsigned long flags; + +spin_lock_irqsave (&mdev->mmio.irq_lock, flags); + + mdev->mmio.irqmask &= ~clear; + mdev->mmio.irqmask |= set; + +if (write_reg) { +mt76_wr (dev,MT_INT_MASK_CSR , mdev->mmio.irqmask); +mt76_wr (dev,MT_INT1_MASK_CSR , mdev->mmio.irqmask); + } + +spin_unlock_irqrestore (&mdev->mmio.irq_lock, flags); +} + +static void mt7915_rx_poll_complete (struct mt76_dev *mdev, +enum mt76_rxq_id q) +{ + struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76); +static const u32 rx_irq_mask[] = { + [MT_RXQ_MAIN ] =MT_INT_RX_DONE_DATA0 , + [MT_RXQ_EXT ] =MT_INT_RX_DONE_DATA1 , + [MT_RXQ_MCU ] =MT_INT_RX_DONE_WM , + [MT_RXQ_MCU_WA ] =MT_INT_RX_DONE_WA , + [MT_RXQ_EXT_WA ] =MT_INT_RX_DONE_WA_EXT , + }; + +mt7915_irq_enable (dev, rx_irq_mask[q]); +} + +/* TODO: support 2/4/6/8 MSI-X vectors */ +static void mt7915_irq_tasklet (struct tasklet_struct *t) +{ +struct mt7915_dev *dev =from_tasklet (dev, t, irq_tasklet); +u32 intr, intr1, mask; +mt76_wr (dev,MT_INT_MASK_CSR ,0 ); +if (dev->hif2) +mt76_wr (dev,MT_INT1_MASK_CSR ,0 ); + + intr =mt76_rr (dev,MT_INT_SOURCE_CSR ); + intr &= dev->mt76.mmio.irqmask; +mt76_wr (dev,MT_INT_SOURCE_CSR , intr); + +if (dev->hif2) { + intr1 =mt76_rr (dev,MT_INT1_SOURCE_CSR ); + intr1 &= dev->mt76.mmio.irqmask; +mt76_wr (dev,MT_INT1_SOURCE_CSR , intr1); + + intr |= intr1; + } + +trace_dev_irq (&dev->mt76, intr, dev->mt76.mmio.irqmask); + + mask = intr &MT_INT_RX_DONE_ALL ; +if (intr &MT_INT_TX_DONE_MCU ) + mask |=MT_INT_TX_DONE_MCU ; + +mt7915_irq_disable (dev, mask); + +if (intr &MT_INT_TX_DONE_MCU ) +napi_schedule (&dev->mt76.tx_napi); + +if (intr &MT_INT_RX_DONE_DATA0 ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MAIN ]); + +if (intr &MT_INT_RX_DONE_DATA1 ) +napi_schedule (&dev->mt76.napi[MT_RXQ_EXT ]); + +if (intr &MT_INT_RX_DONE_WM ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MCU ]); + +if (intr &MT_INT_RX_DONE_WA ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MCU_WA ]); + +if (intr &MT_INT_RX_DONE_WA_EXT ) +napi_schedule (&dev->mt76.napi[MT_RXQ_EXT_WA ]); + +if (intr &MT_INT_MCU_CMD ) { +u32 val =mt76_rr (dev,MT_MCU_CMD ); + +mt76_wr (dev,MT_MCU_CMD , val); +if (val &MT_MCU_CMD_ERROR_MASK ) { + dev->reset_state = val; +ieee80211_queue_work (mt76_hw (dev), &dev->reset_work); +wake_up (&dev->reset_wait); + } + } +} + +static irqreturn_t mt7915_irq_handler (int irq,void *dev_instance) +{ +struct mt7915_dev *dev = dev_instance; + +mt76_wr (dev,MT_INT_MASK_CSR ,0 ); +if (dev->hif2) +mt76_wr (dev,MT_INT1_MASK_CSR ,0 ); + +if (!test_bit (MT76_STATE_INITIALIZED , &dev->mphy.state)) +return IRQ_NONE ; + +tasklet_schedule (&dev->irq_tasklet); + +return IRQ_HANDLED ; +} + +int mt7915_mmio_probe (struct device *pdev, +void __iomem *mem_base, +u32 device_id, +int irq,struct mt7915_hif *hif2) +{ +static const struct mt76_driver_ops drv_ops = { +/* txwi_size = txd size + txp size */ + .txwi_size =MT_TXD_SIZE +sizeof (struct mt7915_txp ), + .drv_flags =MT_DRV_TXWI_NO_FREE |MT_DRV_HW_MGMT_TXQ , + .survey_flags =SURVEY_INFO_TIME_TX | +SURVEY_INFO_TIME_RX | +SURVEY_INFO_TIME_BSS_RX , + .token_size =MT7915_TOKEN_SIZE , + .tx_prepare_skb = mt7915_tx_prepare_skb, + .tx_complete_skb = mt7915_tx_complete_skb, + .rx_skb = mt7915_queue_rx_skb, + .rx_poll_complete = mt7915_rx_poll_complete, + .sta_ps = mt7915_sta_ps, + .sta_add = mt7915_mac_sta_add, + .sta_remove = mt7915_mac_sta_remove, + .update_survey = mt7915_update_channel, + }; +struct ieee80211_ops *ops; +struct mt7915_dev *dev; +struct mt76_dev *mdev; +int ret; + + ops =devm_kmemdup (pdev, &mt7915_ops,sizeof (mt7915_ops),GFP_KERNEL ); +if (!ops) +return -ENOMEM ; + + mdev =mt76_alloc_device (pdev,sizeof (*dev), ops, &drv_ops); +if (!mdev) +return -ENOMEM ; + + dev = container_of(mdev, struct mt7915_dev, mt76); + + ret =mt7915_mmio_init (mdev, mem_base, device_id); +if (ret) + goto error; + +tasklet_setup (&dev->irq_tasklet, mt7915_irq_tasklet); + +mt76_wr (dev,MT_INT_MASK_CSR ,0 ); +/* master switch of PCIe tnterrupt enable */ +if (dev_is_pci (pdev)) +mt76_wr (dev,MT_PCIE_MAC_INT_ENABLE ,0xff ); + + ret =devm_request_irq (mdev->dev, irq, mt7915_irq_handler, +IRQF_SHARED ,KBUILD_MODNAME , dev); +if (ret) + goto error; + +if (hif2) { + dev->hif2 = hif2; + +mt76_wr (dev,MT_INT1_MASK_CSR ,0 ); +/* master switch of PCIe tnterrupt enable */ +if (dev_is_pci (pdev)) +mt76_wr (dev,MT_PCIE1_MAC_INT_ENABLE ,0xff ); + + ret =devm_request_irq (mdev->dev, dev->hif2->irq, + mt7915_irq_handler,IRQF_SHARED , +KBUILD_MODNAME "-hif" , dev); +if (ret) { +put_device (dev->hif2->dev); + goto free_irq; + } + } + + ret =mt7915_register_device (dev); +if (ret) + goto free_hif2_irq;return 0 ; + +free_hif2_irq: +if (dev->hif2) +devm_free_irq (mdev->dev, dev->hif2->irq, dev); +free_irq: +devm_free_irq (mdev->dev, irq, dev); +error: +mt76_free_device (&dev->mt76); + +return ret; } + +static int __init mt7915_init (void ) +{ +int ret; + + ret =pci_register_driver (&mt7915_hif_driver); +if (ret) +return ret; + + ret =pci_register_driver (&mt7915_pci_driver); +if (ret) +pci_unregister_driver (&mt7915_hif_driver); + +return ret; +} + +static void __exit mt7915_exit(void) +{ +pci_unregister_driver (&mt7915_pci_driver); +pci_unregister_driver (&mt7915_hif_driver); +} + +module_init (mt7915_init); +module_exit (mt7915_exit); +MODULE_LICENSE ("Dual BSD/GPL" );
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +6 -1
@@ -369,7 +369,13 @@ static inline u8 mt7915_lmac_mapping(struct mt7915_dev *dev, u8 ac)extern const struct ieee80211_ops mt7915_ops;extern const struct mt76_testmode_ops mt7915_testmode_ops; +extern struct pci_driver mt7915_pci_driver; +extern struct pci_driver mt7915_hif_driver; +int mt7915_mmio_probe (struct device *pdev, +void __iomem *mem_base, +u32 device_id, +int irq,struct mt7915_hif *hif2);u32 mt7915_reg_map (struct mt7915_dev *dev,u32 addr);u64 __mt7915_get_tsf (struct ieee80211_hw *hw,struct mt7915_vif *mvif);int mt7915_register_device (struct mt7915_dev *dev);
@@ -503,7 +509,6 @@ void mt7915_mac_work(struct work_struct *work);void mt7915_mac_reset_work (struct work_struct *work);void mt7915_mac_sta_rc_work (struct work_struct *work);void mt7915_mac_update_stats (struct mt7915_phy *phy); -int mt7915_mmio_init (struct mt76_dev *mdev,void __iomem *mem_base,int irq);void mt7915_mac_twt_teardown_flow (struct mt7915_dev *dev,struct mt7915_sta *msta,u8 flowid);
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +18 -215
293 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH 2/11 mt76: mt7915: refine register definition
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Add mt7915_reg_desc to differentiate chip generations. This is an intermediate patch to introduce mt7916 support.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 20 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 5 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 26 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 507 +++++++++++++-- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 607 ++++++++++++------ .../wireless/mediatek/mt76/mt7915/testmode.c | 58 +- 7 files changed, 907 insertions(+), 320 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +10 -10
@@ -302,14 +302,14 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)DEFINE_SHOW_ATTRIBUTE (mt7915_tx_stats);static void -mt7915_hw_queue_read (struct seq_file *s,u32 base,u32 size, +mt7915_hw_queue_read (struct seq_file *s,u32 size,const struct hw_queue_map *map) {struct mt7915_phy *phy = s->private;struct mt7915_dev *dev = phy->dev;u32 i, val; - val =mt76_rr (dev, base +MT_FL_Q_EMPTY ); + val =mt76_rr (dev,MT_FL_Q_EMPTY );for (i =0 ; i < size; i++) {u32 ctrl, head, tail, queued;
@@ -317,13 +317,13 @@ mt7915_hw_queue_read(struct seq_file *s, u32 base, u32 size,continue ; ctrl =BIT (31 ) | (map[i].pid <<10 ) | (map[i].qid <<24 ); -mt76_wr (dev, base +MT_FL_Q0_CTRL , ctrl); +mt76_wr (dev,MT_FL_Q0_CTRL , ctrl); - head =mt76_get_field (dev, base +MT_FL_Q2_CTRL , + head =mt76_get_field (dev,MT_FL_Q2_CTRL ,GENMASK (11 ,0 )); - tail =mt76_get_field (dev, base +MT_FL_Q2_CTRL , + tail =mt76_get_field (dev,MT_FL_Q2_CTRL ,GENMASK (27 ,16 )); - queued =mt76_get_field (dev, base +MT_FL_Q3_CTRL , + queued =mt76_get_field (dev,MT_FL_Q3_CTRL ,GENMASK (11 ,0 ));seq_printf (s,"\t%s: " , map[i].name);
@@ -351,8 +351,8 @@ mt7915_sta_hw_queue_read(void *data, struct ieee80211_sta *sta)if (val &BIT (offs))continue ; -mt76_wr (dev,MT_PLE_BASE +MT_FL_Q0_CTRL , ctrl | msta->wcid.idx); - qlen =mt76_get_field (dev,MT_PLE_BASE +MT_FL_Q3_CTRL , +mt76_wr (dev,MT_FL_Q0_CTRL , ctrl | msta->wcid.idx); + qlen =mt76_get_field (dev,MT_FL_Q3_CTRL ,GENMASK (11 ,0 )); seq_printf(s, "\tSTA %pM wcid %d: AC%d%d queued:%d\n", sta->addr, msta->wcid.idx, msta->vif->wmm_idx,
@@ -414,7 +414,7 @@ mt7915_hw_queues_show(struct seq_file *file, void *data) val, head, tail);seq_puts (file,"PLE non-empty queue info:\n" ); -mt7915_hw_queue_read (file,MT_PLE_BASE ,ARRAY_SIZE (ple_queue_map), +mt7915_hw_queue_read (file,ARRAY_SIZE (ple_queue_map), &ple_queue_map[0 ]);/* iterate per-sta ple queue */
@@ -422,7 +422,7 @@ mt7915_hw_queues_show(struct seq_file *file, void *data) mt7915_sta_hw_queue_read, file);/* pse queue */ seq_puts (file,"PSE non-empty queue info:\n" ); -mt7915_hw_queue_read (file,MT_PSE_BASE ,ARRAY_SIZE (pse_queue_map), +mt7915_hw_queue_read (file,ARRAY_SIZE (pse_queue_map), &pse_queue_map[0 ]);return 0 ;
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +3 -2
@@ -7,6 +7,7 @@int mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc) { +struct mt7915_dev *dev = phy->dev;int i, err; err =mt76_init_tx_queue (phy->mt76,0 , idx, n_desc,MT_TX_RING_BASE );
@@ -74,7 +75,7 @@ void mt7915_dma_prefetch(struct mt7915_dev *dev) {__mt7915_dma_prefetch (dev,0 );if (dev->hif2) -__mt7915_dma_prefetch (dev,MT_WFDMA1_PCIE1_BASE -MT_WFDMA1_BASE ); +__mt7915_dma_prefetch (dev,MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 )); }int mt7915_dma_init (struct mt7915_dev *dev)
@@ -85,7 +86,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)mt76_dma_attach (&dev->mt76);if (dev->hif2) - hif1_ofs =MT_WFDMA1_PCIE1_BASE -MT_WFDMA1_BASE ; + hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 );/* configure global setting */ mt76_set(dev, MT_WFDMA1_GLO_CFG,
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +13 -13
@@ -1763,7 +1763,7 @@ static void mt7915_dma_reset(struct mt7915_dev *dev) {struct mt76_phy *mphy_ext = dev->mt76.phy2; -u32 hif1_ofs =MT_WFDMA1_PCIE1_BASE -MT_WFDMA1_BASE ; +u32 hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 );int i; mt76_clear(dev, MT_WFDMA0_GLO_CFG,
@@ -1925,8 +1925,8 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)bool ext_phy = phy != &dev->phy;int i, aggr0, aggr1, cnt; - mib->fcs_err_cnt +=mt76_get_field (dev,MT_MIB_SDR3 (ext_phy), -MT_MIB_SDR3_FCS_ERR_MASK ); + cnt =mt76_rr (dev,MT_MIB_SDR3 (ext_phy)); + mib->fcs_err_cnt +=__FIELD_GET (MIB_SDR3_FCS_ERR , cnt); cnt =mt76_rr (dev,MT_MIB_SDR4 (ext_phy)); mib->rx_fifo_full_cnt +=FIELD_GET (MT_MIB_SDR4_RX_FIFO_FULL_MASK , cnt);
@@ -1953,10 +1953,10 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) mib->tx_stop_q_empty_cnt +=FIELD_GET (MT_MIB_SDR13_TX_STOP_Q_EMPTY_CNT_MASK , cnt); cnt =mt76_rr (dev,MT_MIB_SDR14 (ext_phy)); - mib->tx_mpdu_attempts_cnt +=FIELD_GET (MT_MIB_SDR14_TX_MPDU_ATTEMPTS_CNT_MASK , cnt); + mib->tx_mpdu_attempts_cnt +=__FIELD_GET (MIB_MPDU_ATTEMPTS_CNT , cnt); cnt =mt76_rr (dev,MT_MIB_SDR15 (ext_phy)); - mib->tx_mpdu_success_cnt +=FIELD_GET (MT_MIB_SDR15_TX_MPDU_SUCCESS_CNT_MASK , cnt); + mib->tx_mpdu_success_cnt +=__FIELD_GET (MIB_MPDU_SUCCESS_CNT , cnt); cnt =mt76_rr (dev,MT_MIB_SDR22 (ext_phy)); mib->rx_ampdu_cnt += cnt;
@@ -1965,7 +1965,7 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) mib->rx_ampdu_bytes_cnt += cnt; cnt =mt76_rr (dev,MT_MIB_SDR24 (ext_phy)); - mib->rx_ampdu_valid_subframe_cnt +=FIELD_GET (MT_MIB_SDR24_RX_AMPDU_SF_CNT_MASK , cnt); + mib->rx_ampdu_valid_subframe_cnt +=__FIELD_GET (MIB_AMPDU_SF_CNT , cnt); cnt =mt76_rr (dev,MT_MIB_SDR25 (ext_phy)); mib->rx_ampdu_valid_subframe_bytes_cnt += cnt;
@@ -1977,11 +1977,10 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) mib->tx_rwp_need_cnt +=FIELD_GET (MT_MIB_SDR28_TX_RWP_NEED_CNT_MASK , cnt); cnt =mt76_rr (dev,MT_MIB_SDR29 (ext_phy)); - mib->rx_pfdrop_cnt +=FIELD_GET (MT_MIB_SDR29_RX_PFDROP_CNT_MASK , cnt); + mib->rx_pfdrop_cnt +=__FIELD_GET (MIB_PF_DROP_CNT , cnt); - cnt =mt76_rr (dev,MT_MIB_SDR30 (ext_phy)); - mib->rx_vec_queue_overflow_drop_cnt += -FIELD_GET (MT_MIB_SDR30_RX_VEC_QUEUE_OVERFLOW_DROP_CNT_MASK , cnt); + cnt =mt76_rr (dev,MT_MIB_SDRVEC (ext_phy)); + mib->rx_vec_queue_overflow_drop_cnt +=__FIELD_GET (MIB_VEC_DROP_CNT , cnt); cnt =mt76_rr (dev,MT_MIB_SDR31 (ext_phy)); mib->rx_ba_cnt += cnt;
@@ -1989,10 +1988,11 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) cnt =mt76_rr (dev,MT_MIB_SDR32 (ext_phy)); mib->tx_pkt_ebf_cnt +=FIELD_GET (MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK , cnt); - cnt =mt76_rr (dev,MT_MIB_SDR33 (ext_phy)); - mib->tx_pkt_ibf_cnt +=FIELD_GET (MT_MIB_SDR33_TX_PKT_IBF_CNT_MASK , cnt); +if (is_mt7915 (&dev->mt76)) + cnt =mt76_rr (dev,MT_MIB_SDR33 (ext_phy)); + mib->tx_pkt_ibf_cnt +=__FIELD_GET (MIB_BF_TX_CNT , cnt); - cnt =mt76_rr (dev,MT_MIB_SDR34 (ext_phy)); + cnt =mt76_rr (dev,MT_MIB_SDRMUBF (ext_phy)); mib->tx_bf_cnt +=FIELD_GET (MT_MIB_MU_BF_TX_CNT , cnt); cnt =mt76_rr (dev,MT_MIB_DR8 (ext_phy));
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +439 -68
564 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -2
@@ -53,7 +53,7 @@ struct mt7915_dfs_pulse;struct mt7915_dfs_pattern ;enum mt7915_txq_id { -MT7915_TXQ_FWDL =16 , +MT7915_TXQ_FWDL =0 ,MT7915_TXQ_MCU_WM ,MT7915_TXQ_BAND0 ,MT7915_TXQ_BAND1 ,
@@ -250,6 +250,7 @@ struct mt7915_dev { };struct mt7915_hif *hif2; +const struct mt7915_reg_desc *reg;const struct mt76_bus_ops *bus_ops;struct tasklet_struct irq_tasklet;
@@ -376,7 +377,6 @@ int mt7915_mmio_probe(struct device *pdev,void __iomem *mem_base, u32 device_id, int irq, struct mt7915_hif *hif2); -u32 mt7915_reg_map (struct mt7915_dev *dev,u32 addr);u64 __mt7915_get_tsf (struct ieee80211_hw *hw,struct mt7915_vif *mvif);int mt7915_register_device (struct mt7915_dev *dev);void mt7915_unregister_device (struct mt7915_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +408 -199
895 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c +32 -26
82 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH 3/11 mt76: mt7915: rework dma.c to adapt mt7916 changes
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
The RXQ of mt7916 are separated to MT_RXQ_MAIN_WA and MT_RXQ_MCU_WA, which causes a hole for queue iteration so modify it accordingly.
This is an intermediate patch to add mt7916 support.
--- drivers/net/wireless/mediatek/mt76/dma.c | 13 +- drivers/net/wireless/mediatek/mt76/mt76.h | 4 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 383 ++++++++++++------ .../net/wireless/mediatek/mt76/mt7915/init.c | 9 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 + .../net/wireless/mediatek/mt76/mt7915/mmio.c | 42 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 60 ++- 8 files changed, 365 insertions(+), 153 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +11 -2
@@ -93,7 +93,7 @@ mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q) {int i; -if (!q) +if (!q || !q->ndesc)return ;/* clear descriptors */
@@ -233,7 +233,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush)struct mt76_queue_entry entry;int last; -if (!q) +if (!q || !q->ndesc)return ;spin_lock_bh (&q->cleanup_lock);
@@ -448,6 +448,9 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q)int len =SKB_WITH_OVERHEAD (q->buf_size);int offset = q->buf_offset; +if (!q->ndesc) +return 0 ; +spin_lock_bh (&q->lock);while (q->queued < q->ndesc -1 ) {
@@ -484,6 +487,9 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)void *buf;bool more; +if (!q->ndesc) +return ; +spin_lock_bh (&q->lock); do { buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
@@ -508,6 +514,9 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)struct mt76_queue *q = &dev->q_rx[qid];int i; +if (!q->ndesc) +return ; +for (i =0 ; i < q->ndesc; i++) q->desc[i].ctrl =cpu_to_le32 (MT_DMA_CTL_DMA_DONE );
drivers/net/wireless/mediatek/mt76/mt76.h +2 -2
@@ -85,6 +85,7 @@ enum mt76_rxq_id {MT_RXQ_MCU_WA ,MT_RXQ_EXT ,MT_RXQ_EXT_WA , +MT_RXQ_MAIN_WA , __MT_RXQ_MAX };
@@ -892,8 +893,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev)#define mt76_queue_reset (dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)#define mt76_for_each_q_rx (dev, i) \ - for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ - (dev)->q_rx[i].ndesc; i++) + for (i = 0; i < ARRAY_SIZE((dev)->q_rx); i++) struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, const struct ieee80211_ops *ops,
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +263 -120
449 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/init.c +8 -1
@@ -397,8 +397,15 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)static void mt7915_mac_init (struct mt7915_dev *dev) {int i; +u32 rx_len =is_mt7915 (&dev->mt76) ?0x400 :0x680 ; + +/* config pse qid6 wfdma port selection */ +if (!is_mt7915 (&dev->mt76) && dev->hif2) +mt76_rmw (dev,MT_WF_PP_TOP_RXQ_WFDMA_CF_5 ,0 , +MT_WF_PP_TOP_RXQ_QID6_WFDMA_HIF_SEL_MASK ); + +mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN , rx_len); -mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN ,0x400 );/* enable hardware de-agg */ mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN );
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +4 -0
@@ -696,6 +696,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)if (!status->wcid || !ieee80211_is_data_qos (fc))return 0 ; +/* drop no data frame */ +if (fc &cpu_to_le16 (IEEE80211_STYPE_NULLFUNC )) +return -EINVAL ; + status->aggr = unicast && !ieee80211_is_qos_nullfunc (fc); status->qos_ctl = qos_ctl;
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +37 -5
79 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -1
@@ -65,7 +65,8 @@ enum mt7915_rxq_id {MT7915_RXQ_BAND1 ,MT7915_RXQ_MCU_WM =0 ,MT7915_RXQ_MCU_WA , - MT7915_RXQ_MCU_WA_EXT, +MT7915_RXQ_WA_BAND0 =0 , + MT7915_RXQ_WA_BAND1, }; struct mt7915_sta_key_conf {
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +38 -22
103 lines not on this page · raw message
Signature · 1 line
2.18.0
Lorenzo Bianconi
maintainerRe: [PATCH 03/11] mt76: mt7915: rework dma.c to adapt mt7916 changes
Quoted 88 lines
From: Bo Jiao <[email protected]>
The RXQ of mt7916 are separated to
MT_RXQ_MAIN_WAandMT_RXQ_MCU_WA, which causes a hole for queue iteration so modify it accordingly.This is an intermediate patch to add mt7916 support.
Co-developed-by Sujuan Chen <[email protected]>Signed-off-by Sujuan Chen <[email protected]>Co-developed-by Ryder Lee <[email protected]>Signed-off-by Ryder Lee <[email protected]>Signed-off-by Bo Jiao <[email protected]>--- drivers/net/wireless/mediatek/mt76/dma.c | 13 +- drivers/net/wireless/mediatek/mt76/mt76.h | 4 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 383 ++++++++++++------ .../net/wireless/mediatek/mt76/mt7915/init.c | 9 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 + .../net/wireless/mediatek/mt76/mt7915/mmio.c | 42 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 60 ++- 8 files changed, 365 insertions(+), 153 deletions(-)drivers/net/wireless/mediatek/mt76/dma.c +11
-2@@ -93,7 +93,7 @@ mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q) {int i; -if (!q) +if (!q || !q->ndesc)return ;/* clear descriptors */ @@ -233,7 +233,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush)struct mt76_queue_entry entry;int last; -if (!q) +if (!q || !q->ndesc)return ;spin_lock_bh (&q->cleanup_lock);@@ -448,6 +448,9 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q)int len =SKB_WITH_OVERHEAD (q->buf_size);int offset = q->buf_offset; +if (!q->ndesc) +return 0 ; +spin_lock_bh (&q->lock);while (q->queued < q->ndesc -1 ) {@@ -484,6 +487,9 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)void *buf;bool more; +if (!q->ndesc) +return ; +spin_lock_bh (&q->lock); do { buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);@@ -508,6 +514,9 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)struct mt76_queue *q = &dev->q_rx[qid];int i; +if (!q->ndesc) +return ; +for (i =0 ; i < q->ndesc; i++) q->desc[i].ctrl =cpu_to_le32 (MT_DMA_CTL_DMA_DONE );drivers/net/wireless/mediatek/mt76/mt76.h +1
-0@@ -85,6 +85,7 @@ enum mt76_rxq_id {MT_RXQ_MCU_WA ,MT_RXQ_EXT ,MT_RXQ_EXT_WA , +MT_RXQ_MAIN_WA , __MT_RXQ_MAX };
drivers/net/wireless/mediatek/mt76/mt76.h static inline u16 mt76_rev(struct mt76_dev *dev) · line 896
Quoted 6 lines
drivers/net/wireless/mediatek/mt76/mt76.h +1
-2@@ -892,8 +893,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev)#define mt76_queue_reset (dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)#define mt76_for_each_q_rx (dev, i) \ - for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ - (dev)->q_rx[i].ndesc; i++) + for (i = 0; i < ARRAY_SIZE((dev)->q_rx); i++)
Have you checked this change is ok with sdio and usb code?
Regards,
Lorenzo
Quoted 713 lines
drivers/net/wireless/mediatek/mt76/mt76.h +0
-0struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, const struct ieee80211_ops *ops,drivers/net/wireless/mediatek/mt76/mt7915/dma.c +263
-120@@ -44,31 +44,52 @@ static int mt7915_poll_tx(struct napi_struct *napi, int budget)static void __mt7915_dma_prefetch (struct mt7915_dev *dev,u32 ofs) {#define PREFETCH (base, depth) ((base) << 16 | (depth)) - -mt76_wr (dev,MT_WFDMA0_RX_RING0_EXT_CTRL + ofs,PREFETCH (0x0 ,0x4 )); -mt76_wr (dev,MT_WFDMA0_RX_RING1_EXT_CTRL + ofs,PREFETCH (0x40 ,0x4 )); -mt76_wr (dev,MT_WFDMA0_RX_RING2_EXT_CTRL + ofs,PREFETCH (0x80 ,0x0 )); - -mt76_wr (dev,MT_WFDMA1_TX_RING0_EXT_CTRL + ofs,PREFETCH (0x80 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING1_EXT_CTRL + ofs,PREFETCH (0xc0 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING2_EXT_CTRL + ofs,PREFETCH (0x100 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING3_EXT_CTRL + ofs,PREFETCH (0x140 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING4_EXT_CTRL + ofs,PREFETCH (0x180 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING5_EXT_CTRL + ofs,PREFETCH (0x1c0 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING6_EXT_CTRL + ofs,PREFETCH (0x200 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING7_EXT_CTRL + ofs,PREFETCH (0x240 ,0x4 )); - -mt76_wr (dev,MT_WFDMA1_TX_RING16_EXT_CTRL + ofs,PREFETCH (0x280 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING17_EXT_CTRL + ofs,PREFETCH (0x2c0 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING18_EXT_CTRL + ofs,PREFETCH (0x300 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING19_EXT_CTRL + ofs,PREFETCH (0x340 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING20_EXT_CTRL + ofs,PREFETCH (0x380 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_TX_RING21_EXT_CTRL + ofs,PREFETCH (0x3c0 ,0x0 )); - -mt76_wr (dev,MT_WFDMA1_RX_RING0_EXT_CTRL + ofs,PREFETCH (0x3c0 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_RX_RING1_EXT_CTRL + ofs,PREFETCH (0x400 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_RX_RING2_EXT_CTRL + ofs,PREFETCH (0x440 ,0x4 )); -mt76_wr (dev,MT_WFDMA1_RX_RING3_EXT_CTRL + ofs,PREFETCH (0x480 ,0x0 )); +struct mt76_dev *mdev = &dev->mt76; +u32 base_ofs =0 ; + +/* prefetch SRAM wrapping boundary for tx/rx ring. */ +mt76_wr (dev,MT_WFDMA_TX_RING_EXT_CTRL_FWDL + ofs, +PREFETCH (0x0 ,0x4 )); +mt76_wr (dev,MT_WFDMA_TX_RING_EXT_CTRL_WM + ofs, +PREFETCH (0x40 ,0x4 )); +mt76_wr (dev,MT_WFDMA_TX_RING_EXT_CTRL_BAND0 + ofs, +PREFETCH (0x80 ,0x4 )); +mt76_wr (dev,MT_WFDMA_TX_RING_EXT_CTRL_BAND1 + ofs, +PREFETCH (0xc0 ,0x4 )); +mt76_wr (dev,MT_WFDMA_TX_RING_EXT_CTRL_WA + ofs, +PREFETCH (0x100 ,0x4 )); +mt76_wr (dev,MT_WFDMA1_TX_RING21_EXT_CTRL + ofs, +PREFETCH (0x140 ,0x0 )); + +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_WM + ofs, +PREFETCH (0x140 ,0x4 )); +if (!is_mt7915 (mdev)) { +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_WA + ofs, +PREFETCH (0x180 ,0x4 )); + base_ofs =0x40 ; + } +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_STS0 + ofs, +PREFETCH (0x180 + base_ofs,0x4 )); +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_STS1 + ofs, +PREFETCH (0x1c0 + base_ofs,0x4 )); +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_BAND0 + ofs, +PREFETCH (0x200 + base_ofs,0x4 )); +mt76_wr (dev,MT_WFDMA_RX_RING_EXT_CTRL_BAND1 + ofs, +PREFETCH (0x240 + base_ofs,0x4 )); + +/* for mt7915, the ring which is next the last +* used ring must be initialized. +*/ +if (is_mt7915 (mdev)) { +mt76_wr (dev,MT_WFDMA1_TX_RING21_EXT_CTRL + ofs, +PREFETCH (0x140 ,0x0 )); + +mt76_wr (dev,MT_WFDMA1_RX_RING3_EXT_CTRL + ofs, +PREFETCH (0x200 + base_ofs,0x0 )); + +mt76_wr (dev,MT_WFDMA0_RX_RING2_EXT_CTRL + ofs, +PREFETCH (0x280 + base_ofs,0x0 )); + } }void mt7915_dma_prefetch (struct mt7915_dev *dev)@@ -78,43 +99,219 @@ void mt7915_dma_prefetch(struct mt7915_dev *dev)__mt7915_dma_prefetch (dev,MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 )); } -int mt7915_dma_init (struct mt7915_dev *dev) +static void mt7915_dma_disable (struct mt7915_dev *dev,bool rst) { +struct mt76_dev *mdev = &dev->mt76;u32 hif1_ofs =0 ; -int ret; - -mt76_dma_attach (&dev->mt76);if (dev->hif2) hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 ); -/* configure global setting */ -mt76_set (dev,MT_WFDMA1_GLO_CFG , -MT_WFDMA1_GLO_CFG_OMIT_TX_INFO | -MT_WFDMA1_GLO_CFG_OMIT_RX_INFO ); +/* reset */ +if (rst) { +mt76_clear (dev,MT_WFDMA0_RST , +MT_WFDMA0_RST_DMASHDL_ALL_RST | +MT_WFDMA0_RST_LOGIC_RST ); + +mt76_set (dev,MT_WFDMA0_RST , +MT_WFDMA0_RST_DMASHDL_ALL_RST | +MT_WFDMA0_RST_LOGIC_RST ); + +if (is_mt7915 (mdev)) { +mt76_clear (dev,MT_WFDMA1_RST , +MT_WFDMA1_RST_DMASHDL_ALL_RST | +MT_WFDMA1_RST_LOGIC_RST ); + +mt76_set (dev,MT_WFDMA1_RST , +MT_WFDMA1_RST_DMASHDL_ALL_RST | +MT_WFDMA1_RST_LOGIC_RST ); + } + +if (dev->hif2) { +mt76_clear (dev,MT_WFDMA0_RST + hif1_ofs, +MT_WFDMA0_RST_DMASHDL_ALL_RST | +MT_WFDMA0_RST_LOGIC_RST ); + +mt76_set (dev,MT_WFDMA0_RST + hif1_ofs, +MT_WFDMA0_RST_DMASHDL_ALL_RST | +MT_WFDMA0_RST_LOGIC_RST ); + +if (is_mt7915 (mdev)) { +mt76_clear (dev,MT_WFDMA1_RST + hif1_ofs, +MT_WFDMA1_RST_DMASHDL_ALL_RST | +MT_WFDMA1_RST_LOGIC_RST ); + +mt76_set (dev,MT_WFDMA1_RST + hif1_ofs, +MT_WFDMA1_RST_DMASHDL_ALL_RST | +MT_WFDMA1_RST_LOGIC_RST ); + } + } + } + +/* disable */ +mt76_clear (dev,MT_WFDMA0_GLO_CFG , +MT_WFDMA0_GLO_CFG_TX_DMA_EN | +MT_WFDMA0_GLO_CFG_RX_DMA_EN | +MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 ); + +if (is_mt7915 (mdev)) +mt76_clear (dev,MT_WFDMA1_GLO_CFG , +MT_WFDMA1_GLO_CFG_TX_DMA_EN | +MT_WFDMA1_GLO_CFG_RX_DMA_EN | +MT_WFDMA1_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA1_GLO_CFG_OMIT_RX_INFO | +MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2 ); + +if (dev->hif2) { +mt76_clear (dev,MT_WFDMA0_GLO_CFG + hif1_ofs, +MT_WFDMA0_GLO_CFG_TX_DMA_EN | +MT_WFDMA0_GLO_CFG_RX_DMA_EN | +MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 ); + +if (is_mt7915 (mdev)) +mt76_clear (dev,MT_WFDMA1_GLO_CFG + hif1_ofs, +MT_WFDMA1_GLO_CFG_TX_DMA_EN | +MT_WFDMA1_GLO_CFG_RX_DMA_EN | +MT_WFDMA1_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA1_GLO_CFG_OMIT_RX_INFO | +MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2 ); + } +} + +static int mt7915_dma_enable (struct mt7915_dev *dev) +{ +struct mt76_dev *mdev = &dev->mt76; +u32 hif1_ofs =0 ; +u32 irq_mask; + +if (dev->hif2) + hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 );/* reset dma idx */ mt76_wr (dev,MT_WFDMA0_RST_DTX_PTR , ~0 ); -mt76_wr (dev,MT_WFDMA1_RST_DTX_PTR , ~0 ); +if (is_mt7915 (mdev)) +mt76_wr (dev,MT_WFDMA1_RST_DTX_PTR , ~0 ); +if (dev->hif2) { +mt76_wr (dev,MT_WFDMA0_RST_DTX_PTR + hif1_ofs, ~0 ); +if (is_mt7915 (mdev)) +mt76_wr (dev,MT_WFDMA1_RST_DTX_PTR + hif1_ofs, ~0 ); + } -/* configure delay interrupt */ +/* configure delay interrupt off */ mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG0 ,0 ); -mt76_wr (dev,MT_WFDMA1_PRI_DLY_INT_CFG0 ,0 ); +if (is_mt7915 (mdev)) { +mt76_wr (dev,MT_WFDMA1_PRI_DLY_INT_CFG0 ,0 ); + }else { +mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG1 ,0 ); +mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG2 ,0 ); + }if (dev->hif2) { -mt76_set (dev,MT_WFDMA1_GLO_CFG + hif1_ofs, +mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG0 + hif1_ofs,0 ); +if (is_mt7915 (mdev)) { +mt76_wr (dev,MT_WFDMA1_PRI_DLY_INT_CFG0 + + hif1_ofs,0 ); + }else { +mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG1 + + hif1_ofs,0 ); +mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG2 + + hif1_ofs,0 ); + } + } + +/* configure perfetch settings */ +mt7915_dma_prefetch (dev); + +/* hif wait WFDMA idle */ +mt76_set (dev,MT_WFDMA0_BUSY_ENA , +MT_WFDMA0_BUSY_ENA_TX_FIFO0 | +MT_WFDMA0_BUSY_ENA_TX_FIFO1 | +MT_WFDMA0_BUSY_ENA_RX_FIFO ); + +if (is_mt7915 (mdev)) +mt76_set (dev,MT_WFDMA1_BUSY_ENA , +MT_WFDMA1_BUSY_ENA_TX_FIFO0 | +MT_WFDMA1_BUSY_ENA_TX_FIFO1 | +MT_WFDMA1_BUSY_ENA_RX_FIFO ); + +if (dev->hif2) { +mt76_set (dev,MT_WFDMA0_BUSY_ENA + hif1_ofs, +MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO0 | +MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO1 | +MT_WFDMA0_PCIE1_BUSY_ENA_RX_FIFO ); + +if (is_mt7915 (mdev)) +mt76_set (dev,MT_WFDMA1_BUSY_ENA + hif1_ofs, +MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO0 | +MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO1 | +MT_WFDMA1_PCIE1_BUSY_ENA_RX_FIFO ); + } + +mt76_poll (dev,MT_WFDMA_EXT_CSR_HIF_MISC , +MT_WFDMA_EXT_CSR_HIF_MISC_BUSY ,0 ,1000 ); + +/* set WFDMA Tx/Rx */ +mt76_set (dev,MT_WFDMA0_GLO_CFG , +MT_WFDMA0_GLO_CFG_TX_DMA_EN | +MT_WFDMA0_GLO_CFG_RX_DMA_EN | +MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 ); + +if (is_mt7915 (mdev)) +mt76_set (dev,MT_WFDMA1_GLO_CFG , +MT_WFDMA1_GLO_CFG_TX_DMA_EN | +MT_WFDMA1_GLO_CFG_RX_DMA_EN |MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |MT_WFDMA1_GLO_CFG_OMIT_RX_INFO ); -mt76_wr (dev,MT_WFDMA0_RST_DTX_PTR + hif1_ofs, ~0 ); -mt76_wr (dev,MT_WFDMA1_RST_DTX_PTR + hif1_ofs, ~0 ); +if (dev->hif2) { +mt76_set (dev,MT_WFDMA0_GLO_CFG + hif1_ofs, +MT_WFDMA0_GLO_CFG_TX_DMA_EN | +MT_WFDMA0_GLO_CFG_RX_DMA_EN | +MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 ); + +if (is_mt7915 (mdev)) +mt76_set (dev,MT_WFDMA1_GLO_CFG + hif1_ofs, +MT_WFDMA1_GLO_CFG_TX_DMA_EN | +MT_WFDMA1_GLO_CFG_RX_DMA_EN | +MT_WFDMA1_GLO_CFG_OMIT_TX_INFO | +MT_WFDMA1_GLO_CFG_OMIT_RX_INFO ); -mt76_wr (dev,MT_WFDMA0_PRI_DLY_INT_CFG0 + hif1_ofs,0 ); -mt76_wr (dev,MT_WFDMA1_PRI_DLY_INT_CFG0 + hif1_ofs,0 ); +mt76_set (dev,MT_WFDMA_HOST_CONFIG , +MT_WFDMA_HOST_CONFIG_PDMA_BAND ); } -/* configure perfetch settings */ -mt7915_dma_prefetch (dev); +/* enable interrupts for TX/RX rings */ + irq_mask =MT_INT_RX_DONE_MCU | +MT_INT_TX_DONE_MCU | +MT_INT_MCU_CMD | +MT_INT_BAND0_RX_DONE ; + +if (dev->dbdc_support) + irq_mask |=MT_INT_BAND1_RX_DONE ; + +mt7915_irq_enable (dev, irq_mask); + +return 0 ; +} + +int mt7915_dma_init (struct mt7915_dev *dev) +{ +struct mt76_dev *mdev = &dev->mt76; +u32 hif1_ofs =0 ; +int ret; + +mt76_dma_attach (&dev->mt76); + +if (dev->hif2) + hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 ); + +mt7915_dma_disable (dev, true);/* init tx queue */ ret = mt7915_init_tx_queues(&dev->phy, MT7915_TXQ_BAND0,@@ -148,20 +345,32 @@ int mt7915_dma_init(struct mt7915_dev *dev)return ret;/* event from WA */ - ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA ], -MT7915_RXQ_MCU_WA ,MT7915_RX_MCU_RING_SIZE , -MT_RX_BUF_SIZE ,MT_RX_EVENT_RING_BASE ); -if (ret) -return ret; +if (!is_mt7915 (mdev)) { + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA ], +MT7915_RXQ_MCU_WA , +MT7915_RX_MCU_RING_SIZE , +MT_RX_BUF_SIZE ,MT_RX_EVENT_RING_BASE ); +if (ret) +return ret; + } -/* rx data queue */ +/* rx data queue for band0 */ ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN ],MT7915_RXQ_BAND0 ,MT7915_RX_RING_SIZE ,MT_RX_BUF_SIZE ,MT_RX_DATA_RING_BASE );if (ret)return ret; +/* STS & tx free done event from WA for band0 */ + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN_WA ], +MT7915_RXQ_WA_BAND0 , +MT7915_RX_MCU_RING_SIZE , +MT_RX_BUF_SIZE ,MT_RX_STS_RING_BASE ); +if (ret) +return ret; +if (dev->dbdc_support) { +/* rx data queue for band1 */ ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT], MT7915_RXQ_BAND1, MT7915_RX_RING_SIZE, MT_RX_BUF_SIZE,@@ -169,12 +378,12 @@ int mt7915_dma_init(struct mt7915_dev *dev)if (ret)return ret; -/* event from WA */ +/* STS & tx free done event from WA for band1 */ ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_EXT_WA ], -MT7915_RXQ_MCU_WA_EXT , +MT7915_RXQ_WA_BAND1 ,MT7915_RX_MCU_RING_SIZE ,MT_RX_BUF_SIZE , -MT_RX_EVENT_RING_BASE + hif1_ofs); +MT_RX_STS_RING_BASE + hif1_ofs);if (ret)return ret; }@@ -187,80 +396,14 @@ int mt7915_dma_init(struct mt7915_dev *dev) mt7915_poll_tx, NAPI_POLL_WEIGHT);napi_enable (&dev->mt76.tx_napi); -/* hif wait WFDMA idle */ -mt76_set (dev,MT_WFDMA0_BUSY_ENA , -MT_WFDMA0_BUSY_ENA_TX_FIFO0 | -MT_WFDMA0_BUSY_ENA_TX_FIFO1 | -MT_WFDMA0_BUSY_ENA_RX_FIFO ); - -mt76_set (dev,MT_WFDMA1_BUSY_ENA , -MT_WFDMA1_BUSY_ENA_TX_FIFO0 | -MT_WFDMA1_BUSY_ENA_TX_FIFO1 | -MT_WFDMA1_BUSY_ENA_RX_FIFO ); - -mt76_set (dev,MT_WFDMA0_PCIE1_BUSY_ENA , -MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO0 | -MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO1 | -MT_WFDMA0_PCIE1_BUSY_ENA_RX_FIFO ); - -mt76_set (dev,MT_WFDMA1_PCIE1_BUSY_ENA , -MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO0 | -MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO1 | -MT_WFDMA1_PCIE1_BUSY_ENA_RX_FIFO ); - -mt76_poll (dev,MT_WFDMA_EXT_CSR_HIF_MISC , -MT_WFDMA_EXT_CSR_HIF_MISC_BUSY ,0 ,1000 ); - -/* set WFDMA Tx/Rx */ -mt76_set (dev,MT_WFDMA0_GLO_CFG , -MT_WFDMA0_GLO_CFG_TX_DMA_EN |MT_WFDMA0_GLO_CFG_RX_DMA_EN ); -mt76_set (dev,MT_WFDMA1_GLO_CFG , -MT_WFDMA1_GLO_CFG_TX_DMA_EN |MT_WFDMA1_GLO_CFG_RX_DMA_EN ); - -if (dev->hif2) { -mt76_set (dev,MT_WFDMA0_GLO_CFG + hif1_ofs, - (MT_WFDMA0_GLO_CFG_TX_DMA_EN | -MT_WFDMA0_GLO_CFG_RX_DMA_EN )); -mt76_set (dev,MT_WFDMA1_GLO_CFG + hif1_ofs, - (MT_WFDMA1_GLO_CFG_TX_DMA_EN | -MT_WFDMA1_GLO_CFG_RX_DMA_EN )); -mt76_set (dev,MT_WFDMA_HOST_CONFIG , -MT_WFDMA_HOST_CONFIG_PDMA_BAND ); - } - -/* enable interrupts for TX/RX rings */ -mt7915_irq_enable (dev,MT_INT_RX_DONE_ALL |MT_INT_TX_DONE_MCU | -MT_INT_MCU_CMD ); +mt7915_dma_enable (dev);return 0 ; }void mt7915_dma_cleanup (struct mt7915_dev *dev) { -/* disable */ -mt76_clear (dev,MT_WFDMA0_GLO_CFG , -MT_WFDMA0_GLO_CFG_TX_DMA_EN | -MT_WFDMA0_GLO_CFG_RX_DMA_EN ); -mt76_clear (dev,MT_WFDMA1_GLO_CFG , -MT_WFDMA1_GLO_CFG_TX_DMA_EN | -MT_WFDMA1_GLO_CFG_RX_DMA_EN ); - -/* reset */ -mt76_clear (dev,MT_WFDMA1_RST , -MT_WFDMA1_RST_DMASHDL_ALL_RST | -MT_WFDMA1_RST_LOGIC_RST ); - -mt76_set (dev,MT_WFDMA1_RST , -MT_WFDMA1_RST_DMASHDL_ALL_RST | -MT_WFDMA1_RST_LOGIC_RST ); - -mt76_clear (dev,MT_WFDMA0_RST , -MT_WFDMA0_RST_DMASHDL_ALL_RST | -MT_WFDMA0_RST_LOGIC_RST ); - -mt76_set (dev,MT_WFDMA0_RST , -MT_WFDMA0_RST_DMASHDL_ALL_RST | -MT_WFDMA0_RST_LOGIC_RST ); +mt7915_dma_disable (dev, true);mt76_dma_cleanup (&dev->mt76); }drivers/net/wireless/mediatek/mt76/mt7915/init.c +8
-1@@ -397,8 +397,15 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)static void mt7915_mac_init (struct mt7915_dev *dev) {int i; +u32 rx_len =is_mt7915 (&dev->mt76) ?0x400 :0x680 ; + +/* config pse qid6 wfdma port selection */ +if (!is_mt7915 (&dev->mt76) && dev->hif2) +mt76_rmw (dev,MT_WF_PP_TOP_RXQ_WFDMA_CF_5 ,0 , +MT_WF_PP_TOP_RXQ_QID6_WFDMA_HIF_SEL_MASK ); + +mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN , rx_len); -mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN ,0x400 );/* enable hardware de-agg */ mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN );drivers/net/wireless/mediatek/mt76/mt7915/mac.c +4
-0@@ -696,6 +696,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)if (!status->wcid || !ieee80211_is_data_qos (fc))return 0 ; +/* drop no data frame */ +if (fc &cpu_to_le16 (IEEE80211_STYPE_NULLFUNC )) +return -EINVAL ; + status->aggr = unicast && !ieee80211_is_qos_nullfunc (fc); status->qos_ctl = qos_ctl;drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +37
-5@@ -55,8 +55,20 @@ static const struct __reg mt7915_reg[] = { [INT1_MASK_CSR] = { MT_WFDMA_EXT_CSR_BASE, 0x8c }, [INT_MCU_CMD_SOURCE] = { MT_WFDMA1_BASE, 0x1f0 }, [INT_MCU_CMD_EVENT] = { MT_MCU_WFDMA1_BASE, 0x108 }, + [TX_RING_CTRL_FWDL] = { MT_WFDMA1_BASE, 0x640 }, + [TX_RING_CTRL_WM] = { MT_WFDMA1_BASE, 0x644 }, + [TX_RING_CTRL_BAND0] = { MT_WFDMA1_BASE, 0x648 }, + [TX_RING_CTRL_BAND1] = { MT_WFDMA1_BASE, 0x64c }, + [TX_RING_CTRL_WA] = { MT_WFDMA1_BASE, 0x650 }, + [RX_RING_CTRL_WM] = { MT_WFDMA1_BASE, 0x680 }, + [RX_RING_CTRL_WA] = { INVALID_BASE, INVALID_OFFSET }, + [RX_RING_CTRL_STS0] = { MT_WFDMA1_BASE, 0x684 }, + [RX_RING_CTRL_STS1] = { MT_WFDMA1_BASE, 0x688 }, + [RX_RING_CTRL_BAND0] = { MT_WFDMA0_BASE, 0x680 }, + [RX_RING_CTRL_BAND1] = { MT_WFDMA0_BASE, 0x684 }, [TX_RING_BASE] = { MT_WFDMA1_BASE, 0x400 }, [RX_EVENT_RING_BASE] = { MT_WFDMA1_BASE, 0x500 }, + [RX_STS_RING_BASE] = { MT_WFDMA1_BASE, 0x510 }, [RX_DATA_RING_BASE] = { MT_WFDMA0_BASE, 0x500 }, [TMAC_CDTR] = { INVALID_BASE, 0x090 }, [TMAC_ODTR] = { INVALID_BASE, 0x094 },@@ -137,8 +149,20 @@ static const struct __reg mt7916_reg[] = { [INT1_MASK_CSR] = { MT_WFDMA0_PCIE1_BASE, 0x204 }, [INT_MCU_CMD_SOURCE] = { MT_WFDMA0_BASE, 0x1f0 }, [INT_MCU_CMD_EVENT] = { MT_MCU_WFDMA0_BASE, 0x108 }, + [TX_RING_CTRL_FWDL] = { MT_WFDMA0_BASE, 0x640 }, + [TX_RING_CTRL_WM] = { MT_WFDMA0_BASE, 0x644 }, + [TX_RING_CTRL_BAND0] = { MT_WFDMA0_BASE, 0x648 }, + [TX_RING_CTRL_BAND1] = { MT_WFDMA0_BASE, 0x64c }, + [TX_RING_CTRL_WA] = { MT_WFDMA0_BASE, 0x650 }, + [RX_RING_CTRL_WM] = { MT_WFDMA0_BASE, 0x680 }, + [RX_RING_CTRL_WA] = { MT_WFDMA0_BASE, 0x684 }, + [RX_RING_CTRL_STS0] = { MT_WFDMA0_BASE, 0x688 }, + [RX_RING_CTRL_STS1] = { MT_WFDMA0_BASE, 0x68c }, + [RX_RING_CTRL_BAND0] = { MT_WFDMA0_BASE, 0x690 }, + [RX_RING_CTRL_BAND1] = { MT_WFDMA0_BASE, 0x694 }, [TX_RING_BASE] = { MT_WFDMA0_BASE, 0x400 }, [RX_EVENT_RING_BASE] = { MT_WFDMA0_BASE, 0x500 }, + [RX_STS_RING_BASE] = { MT_WFDMA0_BASE, 0x520 }, [RX_DATA_RING_BASE] = { MT_WFDMA0_BASE, 0x540 }, [TMAC_CDTR] = { INVALID_BASE, 0x0c8 }, [TMAC_ODTR] = { INVALID_BASE, 0x0cc },@@ -547,18 +571,21 @@ static void mt7915_rx_poll_complete(struct mt76_dev *mdev,case MT_RXQ_MAIN : rx_irq_mask =MT_INT_RX_DONE_DATA0 ;break ; +case MT_RXQ_MAIN_WA : + rx_irq_mask =MT_INT_RX_DONE_WA_MAIN ; +break ;case MT_RXQ_EXT : rx_irq_mask =MT_INT_RX_DONE_DATA1 ;break ; +case MT_RXQ_EXT_WA : + rx_irq_mask =MT_INT_RX_DONE_WA_EXT ; +break ;case MT_RXQ_MCU : rx_irq_mask =MT_INT_RX_DONE_WM ;break ;case MT_RXQ_MCU_WA : rx_irq_mask =MT_INT_RX_DONE_WA ;break ; -case MT_RXQ_EXT_WA : - rx_irq_mask =MT_INT_RX_DONE_WA_EXT ; -break ;default :break ; }@@ -608,8 +635,13 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)if (intr &MT_INT_RX_DONE_WM )napi_schedule (&dev->mt76.napi[MT_RXQ_MCU ]); -if (intr &MT_INT_RX_DONE_WA ) -napi_schedule (&dev->mt76.napi[MT_RXQ_MCU_WA ]); +if (!is_mt7915 (&dev->mt76)) { +if (intr &MT_INT_RX_DONE_WA ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MCU_WA ]); + } + +if (intr &MT_INT_RX_DONE_WA_MAIN ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MAIN_WA ]);if (intr &MT_INT_RX_DONE_WA_EXT )napi_schedule (&dev->mt76.napi[MT_RXQ_EXT_WA ]);drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2
-1@@ -65,7 +65,8 @@ enum mt7915_rxq_id {MT7915_RXQ_BAND1 ,MT7915_RXQ_MCU_WM =0 ,MT7915_RXQ_MCU_WA , - MT7915_RXQ_MCU_WA_EXT, +MT7915_RXQ_WA_BAND0 =0 , + MT7915_RXQ_WA_BAND1, }; struct mt7915_sta_key_conf {drivers/net/wireless/mediatek/mt76/mt7915/regs.h +38
-22@@ -62,8 +62,20 @@ enum reg_rev {INT1_MASK_CSR ,INT_MCU_CMD_SOURCE ,INT_MCU_CMD_EVENT , +TX_RING_CTRL_FWDL , +TX_RING_CTRL_WM , +TX_RING_CTRL_BAND0 , +TX_RING_CTRL_BAND1 , +TX_RING_CTRL_WA , +RX_RING_CTRL_WM , +RX_RING_CTRL_WA , +RX_RING_CTRL_STS0 , +RX_RING_CTRL_STS1 , +RX_RING_CTRL_BAND0 , +RX_RING_CTRL_BAND1 ,TX_RING_BASE ,RX_EVENT_RING_BASE , +RX_STS_RING_BASE ,RX_DATA_RING_BASE ,TMAC_CDTR , TMAC_ODTR,@@ -574,12 +586,15 @@ enum bit_rev {#define MT_WFDMA0_GLO_CFG MT_WFDMA0(0x208)#define MT_WFDMA0_GLO_CFG_TX_DMA_EN BIT(0)#define MT_WFDMA0_GLO_CFG_RX_DMA_EN BIT(2) +#define MT_WFDMA0_GLO_CFG_OMIT_TX_INFO BIT(28) +#define MT_WFDMA0_GLO_CFG_OMIT_RX_INFO BIT(27) +#define MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 BIT(21)#define MT_WFDMA0_RST_DTX_PTR MT_WFDMA0(0x20c)#define MT_WFDMA0_PRI_DLY_INT_CFG0 MT_WFDMA0(0x2f0) +#define MT_WFDMA0_PRI_DLY_INT_CFG1 MT_WFDMA0(0x2f4) +#define MT_WFDMA0_PRI_DLY_INT_CFG2 MT_WFDMA0(0x2f8) -#define MT_WFDMA0_RX_RING0_EXT_CTRL MT_WFDMA0(0x680) -#define MT_WFDMA0_RX_RING1_EXT_CTRL MT_WFDMA0(0x684)#define MT_WFDMA0_RX_RING2_EXT_CTRL MT_WFDMA0(0x688)/* WFDMA1 */ @@ -599,31 +614,12 @@ enum bit_rev {#define MT_WFDMA1_GLO_CFG_RX_DMA_EN BIT(2)#define MT_WFDMA1_GLO_CFG_OMIT_TX_INFO BIT(28)#define MT_WFDMA1_GLO_CFG_OMIT_RX_INFO BIT(27) +#define MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2 BIT(21)#define MT_WFDMA1_RST_DTX_PTR MT_WFDMA1(0x20c)#define MT_WFDMA1_PRI_DLY_INT_CFG0 MT_WFDMA1(0x2f0) -#define MT_WFDMA1_TX_RING0_EXT_CTRL MT_WFDMA1(0x600) -#define MT_WFDMA1_TX_RING1_EXT_CTRL MT_WFDMA1(0x604) -#define MT_WFDMA1_TX_RING2_EXT_CTRL MT_WFDMA1(0x608) -#define MT_WFDMA1_TX_RING3_EXT_CTRL MT_WFDMA1(0x60c) -#define MT_WFDMA1_TX_RING4_EXT_CTRL MT_WFDMA1(0x610) -#define MT_WFDMA1_TX_RING5_EXT_CTRL MT_WFDMA1(0x614) -#define MT_WFDMA1_TX_RING6_EXT_CTRL MT_WFDMA1(0x618) -#define MT_WFDMA1_TX_RING7_EXT_CTRL MT_WFDMA1(0x61c) - -#define MT_WFDMA1_TX_RING16_EXT_CTRL MT_WFDMA1(0x640) -#define MT_WFDMA1_TX_RING17_EXT_CTRL MT_WFDMA1(0x644) -#define MT_WFDMA1_TX_RING18_EXT_CTRL MT_WFDMA1(0x648) -#define MT_WFDMA1_TX_RING19_EXT_CTRL MT_WFDMA1(0x64c) -#define MT_WFDMA1_TX_RING20_EXT_CTRL MT_WFDMA1(0x650)#define MT_WFDMA1_TX_RING21_EXT_CTRL MT_WFDMA1(0x654) -#define MT_WFDMA1_TX_RING22_EXT_CTRL MT_WFDMA1(0x658) -#define MT_WFDMA1_TX_RING23_EXT_CTRL MT_WFDMA1(0x65c) - -#define MT_WFDMA1_RX_RING0_EXT_CTRL MT_WFDMA1(0x680) -#define MT_WFDMA1_RX_RING1_EXT_CTRL MT_WFDMA1(0x684) -#define MT_WFDMA1_RX_RING2_EXT_CTRL MT_WFDMA1(0x688)#define MT_WFDMA1_RX_RING3_EXT_CTRL MT_WFDMA1(0x68c)/* WFDMA CSR */ @@ -662,8 +658,21 @@ enum bit_rev {#define MT_INT1_SOURCE_CSR __REG(dev, INT1_SOURCE_CSR)#define MT_INT1_MASK_CSR __REG(dev, INT1_MASK_CSR) +#define MT_WFDMA_TX_RING_EXT_CTRL_FWDL __REG(dev, TX_RING_CTRL_FWDL) +#define MT_WFDMA_TX_RING_EXT_CTRL_WM __REG(dev, TX_RING_CTRL_WM) +#define MT_WFDMA_TX_RING_EXT_CTRL_BAND0 __REG(dev, TX_RING_CTRL_BAND0) +#define MT_WFDMA_TX_RING_EXT_CTRL_BAND1 __REG(dev, TX_RING_CTRL_BAND1) +#define MT_WFDMA_TX_RING_EXT_CTRL_WA __REG(dev, TX_RING_CTRL_WA) +#define MT_WFDMA_RX_RING_EXT_CTRL_WM __REG(dev, RX_RING_CTRL_WM) +#define MT_WFDMA_RX_RING_EXT_CTRL_WA __REG(dev, RX_RING_CTRL_WA) +#define MT_WFDMA_RX_RING_EXT_CTRL_STS0 __REG(dev, RX_RING_CTRL_STS0) +#define MT_WFDMA_RX_RING_EXT_CTRL_STS1 __REG(dev, RX_RING_CTRL_STS1) +#define MT_WFDMA_RX_RING_EXT_CTRL_BAND0 __REG(dev, RX_RING_CTRL_BAND0) +#define MT_WFDMA_RX_RING_EXT_CTRL_BAND1 __REG(dev, RX_RING_CTRL_BAND1) +#define MT_TX_RING_BASE __REG(dev, TX_RING_BASE)#define MT_RX_EVENT_RING_BASE __REG(dev, RX_EVENT_RING_BASE) +#define MT_RX_STS_RING_BASE __REG(dev, RX_STS_RING_BASE)#define MT_RX_DATA_RING_BASE __REG(dev, RX_DATA_RING_BASE)#define MT_INT_RX_DONE_DATA0 __BIT(dev, RX_DONE_DAND0)@@ -797,6 +806,13 @@ enum bit_rev {#define MT_PCIE1_MAC (ofs) __REG_MAP(dev, MT_PCIE1_MAC_BASE, (ofs))#define MT_PCIE1_MAC_INT_ENABLE MT_PCIE1_MAC(0x188) +/* PP TOP */ +#define MT_WF_PP_TOP_BASE 0x820cc000 +#define MT_WF_PP_TOP (ofs) (MT_WF_PP_TOP_BASE + (ofs)) + +#define MT_WF_PP_TOP_RXQ_WFDMA_CF_5 MT_WF_PP_TOP(0x0e8) +#define MT_WF_PP_TOP_RXQ_QID6_WFDMA_HIF_SEL_MASK BIT(6) +#define MT_WF_IRPI_BASE 0x83006000#define MT_WF_IRPI (ofs) (MT_WF_IRPI_BASE + ((ofs) << 16))Signature · 1 line
2.18.0
PATCH 4/11 mt76: mt7915: add firmware support for mt7916
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Update firmware initialization for mt7916. This is an intermediate patch to add mt7916 support.
--- .../net/wireless/mediatek/mt76/mt7915/init.c | 6 -- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 78 +++++++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 3 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 5 +- 5 files changed, 72 insertions(+), 24 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +0 -6
@@ -567,12 +567,6 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)set_bit (MT76_STATE_INITIALIZED , &dev->mphy.state); -/* -* force firmware operation mode into normal state, -* which should be set before firmware download stage. -*/ -mt76_wr (dev,MT_SWDEF_MODE ,MT_SWDEF_NORMAL_MODE ); - ret =mt7915_mcu_init (dev);if (ret) {/* Reset and try again */
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +61 -17
151 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +4 -0
@@ -30,6 +30,10 @@#define MT7915_FIRMWARE_WM "mediatek/mt7915_wm.bin"#define MT7915_ROM_PATCH "mediatek/mt7915_rom_patch.bin" +#define MT7916_FIRMWARE_WA "mediatek/mt7916_wa.bin" +#define MT7916_FIRMWARE_WM "mediatek/mt7916_wm.bin" +#define MT7916_ROM_PATCH "mediatek/mt7916_rom_patch.bin" +#define MT7915_EEPROM_DEFAULT "mediatek/mt7915_eeprom.bin"#define MT7915_EEPROM_DEFAULT_DBDC "mediatek/mt7915_eeprom_dbdc.bin"
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +3 -0
@@ -168,3 +168,6 @@ MODULE_DEVICE_TABLE(pci, mt7915_hif_device_table);MODULE_FIRMWARE (MT7915_FIRMWARE_WA );MODULE_FIRMWARE (MT7915_FIRMWARE_WM );MODULE_FIRMWARE (MT7915_ROM_PATCH ); +MODULE_FIRMWARE (MT7916_FIRMWARE_WA ); +MODULE_FIRMWARE (MT7916_FIRMWARE_WM ); +MODULE_FIRMWARE (MT7916_ROM_PATCH );
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +4 -1
@@ -787,11 +787,14 @@ enum bit_rev {#define MT_TOP_BASE 0x18060000#define MT_TOP (ofs) (MT_TOP_BASE + (ofs)) -#define MT_TOP_LPCR_HOST_BAND0 MT_TOP(0x10) +#define MT_TOP_LPCR_HOST_BAND (_band) MT_TOP(0x10 + ((_band) * 0x10))#define MT_TOP_LPCR_HOST_FW_OWN BIT(0)#define MT_TOP_LPCR_HOST_DRV_OWN BIT(1)#define MT_TOP_LPCR_HOST_FW_OWN_STAT BIT(2) +#define MT_TOP_LPCR_HOST_BAND_IRQ_STAT (_band) MT_TOP(0x14 + ((_band) * 0x10)) +#define MT_TOP_LPCR_HOST_BAND_STAT BIT(0) +#define MT_TOP_MISC MT_TOP(0xf0)#define MT_TOP_MISC_FW_STATE GENMASK(2, 0)
Signature · 1 line
2.18.0
PATCH 5/11 mt76: mt7915: rework eeprom.c to adapt mt7916 changes
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
This is an intermediate patch to add mt7916 support.
--- .../wireless/mediatek/mt76/mt7915/eeprom.c | 83 ++++++++++++++----- .../wireless/mediatek/mt76/mt7915/eeprom.h | 9 +- .../net/wireless/mediatek/mt76/mt7915/init.c | 46 ++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- 4 files changed, 101 insertions(+), 40 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +61 -22
@@ -10,6 +10,7 @@ static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)struct mt76_dev *mdev = &dev->mt76;u8 *eeprom = mdev->eeprom.data;u32 val = eeprom[MT_EE_DO_PRE_CAL ]; +u32 offs;if (!dev->flash_mode)return 0 ;
@@ -22,7 +23,9 @@ static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)if (!dev->cal)return -ENOMEM ; -return mt76_get_of_eeprom (mdev, dev->cal,MT_EE_PRECAL , val); + offs =is_mt7915 (&dev->mt76) ?MT_EE_PRECAL :MT_EE_PRECAL_V2 ; + +return mt76_get_of_eeprom (mdev, dev->cal, offs, val); }static int mt7915_check_eeprom (struct mt7915_dev *dev)
@@ -113,7 +116,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)return ret; } -void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy) +static void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy) {struct mt7915_dev *dev = phy->dev;bool ext_phy = phy != &dev->phy;
@@ -139,32 +142,56 @@ void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy) } } -static void mt7915_eeprom_parse_hw_cap (struct mt7915_dev *dev) +void mt7915_eeprom_parse_hw_cap (struct mt7915_dev *dev, +struct mt7915_phy *phy) {u8 nss, nss_band, *eeprom = dev->mt76.eeprom.data; +struct mt76_phy *mphy = phy->mt76; +bool ext_phy = phy != &dev->phy; + +mt7915_eeprom_parse_band_config (phy); -mt7915_eeprom_parse_band_config (&dev->phy); +/* read tx/rx mask from eeprom */ +if (is_mt7915 (&dev->mt76)) { + nss =FIELD_GET (MT_EE_WIFI_CONF0_TX_PATH , + eeprom[MT_EE_WIFI_CONF ]); -/* read tx mask from eeprom */ - nss =FIELD_GET (MT_EE_WIFI_CONF0_TX_PATH , eeprom[MT_EE_WIFI_CONF ]); -if (!nss || nss >4 ) - nss =4 ; +if (dev->dbdc_support) + nss = nss >>1 ; + }else { + nss =FIELD_GET (MT_EE_WIFI_CONF0_TX_PATH , + eeprom[MT_EE_WIFI_CONF + ext_phy]); + } - nss_band = nss; +if (!nss || nss >2 ) + nss =2 ; -if (dev->dbdc_support) { +/* read tx/rx stream */ +if (is_mt7915 (&dev->mt76)) { nss_band =FIELD_GET (MT_EE_WIFI_CONF3_TX_PATH_B0 , eeprom[MT_EE_WIFI_CONF +3 ]); -if (!nss_band || nss_band >2 ) - nss_band =2 ; +if (ext_phy) + nss_band =FIELD_GET (MT_EE_WIFI_CONF3_TX_PATH_B1 , + eeprom[MT_EE_WIFI_CONF +3 ]); + }else { + nss_band =FIELD_GET (MT_EE_WIFI_CONF_STREAM_NUM , + eeprom[MT_EE_WIFI_CONF +2 + ext_phy]); -if (nss_band >= nss) - nss =4 ; } - dev->chainmask =BIT (nss) -1 ; - dev->mphy.antenna_mask =BIT (nss_band) -1 ; - dev->mphy.chainmask = dev->mphy.antenna_mask; +if (!nss_band || nss_band >2 ) + nss_band =2 ; + +if (nss_band > nss) { +dev_err (dev->mt76.dev, +"nss mismatch, nss(%d) nss_band(%d) ext_phy(%d)\n" , + nss, nss_band, ext_phy); + nss = nss_band; + } + + mphy->chainmask = ext_phy ? (BIT (nss) -1 ) <<2 : (BIT (nss) -1 ); + mphy->antenna_mask =BIT (hweight8 (mphy->chainmask)) -1 ; + dev->chainmask |= mphy->chainmask; }int mt7915_eeprom_init (struct mt7915_dev *dev)
@@ -179,7 +206,7 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)if (ret)return ret; -mt7915_eeprom_parse_hw_cap (dev); +mt7915_eeprom_parse_hw_cap (dev, &dev->phy);memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN );
@@ -202,15 +229,20 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev, tssi_on =mt7915_tssi_enabled (dev, chan->band);if (chan->band ==NL80211_BAND_2GHZ ) { - index =MT_EE_TX0_POWER_2G + chain_idx *3 ; +u32 power =is_mt7915 (&dev->mt76) ? +MT_EE_TX0_POWER_2G :MT_EE_TX0_POWER_2G_V2 ; + + index = power + chain_idx *3 ; target_power = eeprom[index];if (!tssi_on) target_power += eeprom[index +1 ]; }else {int group =mt7915_get_channel_group (chan->hw_value); +u32 power =is_mt7915 (&dev->mt76) ? +MT_EE_TX0_POWER_5G :MT_EE_TX0_POWER_5G_V2 ; - index =MT_EE_TX0_POWER_5G + chain_idx *12 ; + index = power + chain_idx *12 ; target_power = eeprom[index + group];if (!tssi_on)
@@ -225,11 +257,18 @@ s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band)u8 *eeprom = dev->mt76.eeprom.data;u32 val;s8 delta; +u32 rate_2g, rate_5g; + + rate_2g =is_mt7915 (&dev->mt76) ? +MT_EE_RATE_DELTA_2G :MT_EE_RATE_DELTA_2G_V2 ; + + rate_5g =is_mt7915 (&dev->mt76) ? +MT_EE_RATE_DELTA_5G :MT_EE_RATE_DELTA_5G_V2 ;if (band ==NL80211_BAND_2GHZ ) - val = eeprom[MT_EE_RATE_DELTA_2G ]; + val = eeprom[rate_2g];else - val = eeprom[MT_EE_RATE_DELTA_5G ]; + val = eeprom[rate_5g];if (!(val &MT_EE_RATE_DELTA_EN ))return 0 ;
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h +8 -1
@@ -23,11 +23,17 @@ enum mt7915_eeprom_field {MT_EE_RATE_DELTA_5G =0x29d ,MT_EE_TX0_POWER_2G =0x2fc ,MT_EE_TX0_POWER_5G =0x34b , +MT_EE_RATE_DELTA_2G_V2 =0x7d3 , +MT_EE_RATE_DELTA_5G_V2 =0x81e , +MT_EE_TX0_POWER_2G_V2 =0x441 , +MT_EE_TX0_POWER_5G_V2 =0x445 ,MT_EE_ADIE_FT_VERSION =0x9a0 , __MT_EE_MAX =0xe00 , + __MT_EE_MAX_V2 =0x1000 ,/* 0xe10 ~ 0x5780 used to save group cal data */ - MT_EE_PRECAL = 0xe10 +MT_EE_PRECAL =0xe10 , +MT_EE_PRECAL_V2 =0x1010 };#define MT_EE_WIFI_CAL_GROUP BIT(0)
@@ -39,6 +45,7 @@ enum mt7915_eeprom_field {#define MT_EE_WIFI_CONF0_TX_PATH GENMASK(2, 0)#define MT_EE_WIFI_CONF0_BAND_SEL GENMASK(7, 6)#define MT_EE_WIFI_CONF1_BAND_SEL GENMASK(7, 6) +#define MT_EE_WIFI_CONF_STREAM_NUM GENMASK(7, 5)#define MT_EE_WIFI_CONF3_TX_PATH_B0 GENMASK(1, 0)#define MT_EE_WIFI_CONF3_TX_PATH_B1 GENMASK(5, 4)#define MT_EE_WIFI_CONF7_TSSI0_2G BIT(0)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +30 -16
95 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -1
@@ -386,7 +386,8 @@ u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif);int mt7915_register_device (struct mt7915_dev *dev);void mt7915_unregister_device (struct mt7915_dev *dev);int mt7915_eeprom_init (struct mt7915_dev *dev); -void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy); +void mt7915_eeprom_parse_hw_cap (struct mt7915_dev *dev, +struct mt7915_phy *phy);int mt7915_eeprom_get_target_power (struct mt7915_dev *dev,struct ieee80211_channel *chan,u8 chain_idx);
Signature · 1 line
2.18.0
PATCH 6/11 mt76: mt7915: enlarge wcid size to 544
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
The mt7916 can support up to 544 wcid entries. This is an intermediate patch to add mt7916 support.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 8 +++++++- 4 files changed, 10 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -225,7 +225,7 @@ enum mt76_wcid_flags { MT_WCID_FLAG_HDR_TRANS, }; -#define MT76_N_WCIDS 288 +#define MT76_N_WCIDS 544/* stored in ieee80211_tx_info::hw_queue */ #define MT_TX_HW_QUEUE_EXT_PHY BIT(3)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +1 -1
@@ -430,7 +430,7 @@ static void mt7915_mac_init(struct mt7915_dev *dev)/* enable hardware de-agg */ mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN ); -for (i =0 ; i <MT7915_WTBL_SIZE ; i++) +for (i =0 ; i <mt7915_wtbl_size (dev); i++)mt7915_mac_wtbl_update (dev, i,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );for (i =0 ; i <2 ; i++)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +1 -1
@@ -1492,7 +1492,7 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)if (pid <MT_PACKET_ID_FIRST )return ; -if (wcidx >=MT7915_WTBL_SIZE ) +if (wcidx >=mt7915_wtbl_size (dev))return ;rcu_read_lock ();
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +7 -1
@@ -12,7 +12,8 @@#define MT7915_MAX_INTERFACES 19#define MT7915_MAX_WMM_SETS 4#define MT7915_WTBL_SIZE 288 -#define MT7915_WTBL_RESERVED (MT7915_WTBL_SIZE - 1) +#define MT7916_WTBL_SIZE 544 +#define MT7915_WTBL_RESERVED (mt7915_wtbl_size(dev) - 1)#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ MT7915_MAX_INTERFACES)
@@ -477,6 +478,11 @@ static inline bool is_mt7915(struct mt76_dev *dev)return mt76_chip (dev) ==0x7915 ; } +static inline u16 mt7915_wtbl_size (struct mt7915_dev *dev) +{ +return is_mt7915 (&dev->mt76) ?MT7915_WTBL_SIZE :MT7916_WTBL_SIZE ; +} +void mt7915_dual_hif_set_irq_mask (struct mt7915_dev *dev,bool write_reg,u32 clear,u32 set);
Signature · 1 line
2.18.0
Lorenzo Bianconi
maintainerRe: [PATCH 06/11] mt76: mt7915: enlarge wcid size to 544
Quoted 22 lines
From: Bo Jiao <[email protected]>
The mt7916 can support up to 544 wcid entries. This is an intermediate patch to add mt7916 support.
Co-developed-by Sujuan Chen <[email protected]>Signed-off-by Sujuan Chen <[email protected]>Co-developed-by Ryder Lee <[email protected]>Signed-off-by Ryder Lee <[email protected]>Signed-off-by Bo Jiao <[email protected]>--- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 8 +++++++- 4 files changed, 10 insertions(+), 4 deletions(-)drivers/net/wireless/mediatek/mt76/mt76.h +0
-0
drivers/net/wireless/mediatek/mt76/mt76.h enum mt76_wcid_flags { · line 228
Quoted 5 lines
drivers/net/wireless/mediatek/mt76/mt76.h +1
-1@@ -225,7 +225,7 @@ enum mt76_wcid_flags { MT_WCID_FLAG_HDR_TRANS, }; -#define MT76_N_WCIDS 288 +#define MT76_N_WCIDS 544
is this change ok with older chipset as well?
Regards,
Lorenzo
Quoted 58 lines
drivers/net/wireless/mediatek/mt76/mt76.h +0
-0/* stored in ieee80211_tx_info::hw_queue */ #define MT_TX_HW_QUEUE_EXT_PHY BIT(3)drivers/net/wireless/mediatek/mt76/mt7915/init.c +1
-1@@ -430,7 +430,7 @@ static void mt7915_mac_init(struct mt7915_dev *dev)/* enable hardware de-agg */ mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN ); -for (i =0 ; i <MT7915_WTBL_SIZE ; i++) +for (i =0 ; i <mt7915_wtbl_size (dev); i++)mt7915_mac_wtbl_update (dev, i,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );for (i =0 ; i <2 ; i++)drivers/net/wireless/mediatek/mt76/mt7915/mac.c +1
-1@@ -1492,7 +1492,7 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)if (pid <MT_PACKET_ID_FIRST )return ; -if (wcidx >=MT7915_WTBL_SIZE ) +if (wcidx >=mt7915_wtbl_size (dev))return ;rcu_read_lock ();drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +7
-1@@ -12,7 +12,8 @@#define MT7915_MAX_INTERFACES 19#define MT7915_MAX_WMM_SETS 4#define MT7915_WTBL_SIZE 288 -#define MT7915_WTBL_RESERVED (MT7915_WTBL_SIZE - 1) +#define MT7916_WTBL_SIZE 544 +#define MT7915_WTBL_RESERVED (mt7915_wtbl_size(dev) - 1)#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ MT7915_MAX_INTERFACES)@@ -477,6 +478,11 @@ static inline bool is_mt7915(struct mt76_dev *dev)return mt76_chip (dev) ==0x7915 ; } +static inline u16 mt7915_wtbl_size (struct mt7915_dev *dev) +{ +return is_mt7915 (&dev->mt76) ?MT7915_WTBL_SIZE :MT7916_WTBL_SIZE ; +} +void mt7915_dual_hif_set_irq_mask (struct mt7915_dev *dev,bool write_reg,u32 clear,u32 set);Signature · 1 line
2.18.0
PATCH 7/11 mt76: mt7915: add txfree event v3
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Update txfree v3 format.
This is an intermediate patch to add mt7916 support.
--- .../net/wireless/mediatek/mt76/mt7915/mac.c | 42 ++++++++++++------- .../net/wireless/mediatek/mt76/mt7915/mac.h | 8 ++-- 2 files changed, 32 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +27 -15
@@ -1282,8 +1282,10 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)struct ieee80211_sta *sta =NULL ;LIST_HEAD (free_list);struct sk_buff *tmp; -u8 i, count; -bool wake = false; +bool v3, wake = false; +u16 total, count =0 ; +u32 txd =le32_to_cpu (free->txd); +u32 *cur_info;/* clean DMA queues and unmap buffers first */ mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_PSD ], false);
@@ -1293,14 +1295,12 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)mt76_queue_tx_cleanup (dev, mphy_ext->q_tx[MT_TXQ_BE ], false); } -/* -* TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE, -* to the time ack is received or dropped by hw (air + hw queue time). -* Should avoid accessing WTBL to get Tx airtime, and use it instead. -*/ - count =FIELD_GET (MT_TX_FREE_MSDU_CNT ,le16_to_cpu (free->ctrl)); -for (i =0 ; i < count; i++) { -u32 msdu, info =le32_to_cpu (free->info[i]); + total =FIELD_GET (MT_TX_FREE_MSDU_CNT ,le16_to_cpu (free->ctrl)); + v3 = (FIELD_GET (MT_TX_FREE_VER , txd) ==0x4 ); + +for (cur_info = &free->info[0 ]; count < total; cur_info++) { +u32 msdu, info =le32_to_cpu (*cur_info); +u8 i;/* * 1'b1: new wcid pair.
@@ -1311,7 +1311,6 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)struct mt76_wcid *wcid;u16 idx; - count++; idx =FIELD_GET (MT_TX_FREE_WLAN_ID , info); wcid =rcu_dereference (dev->mt76.wcid[idx]); sta =wcid_to_sta (wcid);
@@ -1326,12 +1325,25 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)continue ; } - msdu =FIELD_GET (MT_TX_FREE_MSDU_ID , info); - txwi =mt76_token_release (mdev, msdu, &wake); -if (!txwi) +if (v3 && (info &MT_TX_FREE_MPDU_HEADER ))continue ; -mt7915_txwi_free (dev, txwi, sta, &free_list); +for (i =0 ; i <1 + v3; i++) { +if (v3) { + msdu = (info >> (15 * i)) &MT_TX_FREE_MSDU_ID_V3 ; +if (msdu ==MT_TX_FREE_MSDU_ID_V3 ) +continue ; + }else { + msdu =FIELD_GET (MT_TX_FREE_MSDU_ID , info); + } + + txwi =mt76_token_release (mdev, msdu, &wake); +if (!txwi) +continue ; + +mt7915_txwi_free (dev, txwi, sta, &free_list); + count++; + } }mt7915_mac_sta_poll (dev);
drivers/net/wireless/mediatek/mt76/mt7915/mac.h +5 -3
@@ -298,18 +298,20 @@ struct mt7915_txp {struct mt7915_tx_free {__le16 rx_byte_cnt;__le16 ctrl; -u8 txd_cnt; -u8 rsv[3 ]; +__le32 txd;__le32 info[]; } __packed__aligned(4) ; +#define MT_TX_FREE_VER GENMASK(18, 16)#define MT_TX_FREE_MSDU_CNT GENMASK(9, 0)#define MT_TX_FREE_WLAN_ID GENMASK(23, 14)#define MT_TX_FREE_LATENCY GENMASK(12, 0)/* 0: success, others: dropped */ -#define MT_TX_FREE_STATUS GENMASK(14, 13)#define MT_TX_FREE_MSDU_ID GENMASK(30, 16)#define MT_TX_FREE_PAIR BIT(31) +#define MT_TX_FREE_MPDU_HEADER BIT(30) +#define MT_TX_FREE_MSDU_ID_V3 GENMASK(14, 0) +/* will support this field in further revision */ #define MT_TX_FREE_RATE GENMASK(13, 0)
Signature · 1 line
2.18.0
PATCH 8/11 mt76: mt7915: update rx rate reporting for mt7916
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
mt7916 reports rx rate from rxd group3 directly.
--- .../net/wireless/mediatek/mt76/mt7915/init.c | 3 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 199 +++++++++++------- .../net/wireless/mediatek/mt76/mt7915/mac.h | 6 + .../net/wireless/mediatek/mt76/mt7915/main.c | 11 +- 4 files changed, 137 insertions(+), 82 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +2 -1
@@ -411,7 +411,8 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)mt76_rmw (dev,MT_MDP_BNRCFR1 (band), mask, set);mt76_rmw_field (dev,MT_DMA_DCR0 (band),MT_DMA_DCR0_MAX_RX_LEN ,0x680 ); -/* disable rx rate report by default due to hw issues */ + +/* mt7915: disable rx rate report by default due to hw issues */ mt76_clear (dev,MT_DMA_DCR0 (band),MT_DMA_DCR0_RXD_G5_EN ); }
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +122 -77
227 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mac.h +6 -0
@@ -125,6 +125,12 @@ enum rx_pkt_type {#define MT_PRXV_RCPI2 GENMASK(23, 16)#define MT_PRXV_RCPI1 GENMASK(15, 8)#define MT_PRXV_RCPI0 GENMASK(7, 0) +#define MT_PRXV_HT_SHORT_GI GENMASK(16, 15) +#define MT_PRXV_HT_STBC GENMASK(23, 22) +#define MT_PRXV_TX_MODE GENMASK(27, 24) +#define MT_PRXV_FRAME_MODE GENMASK(14, 12) +#define MT_PRXV_DCM BIT(17) +#define MT_PRXV_NUM_RX BIT(20, 18)/* C-RXV */ #define MT_CRXV_HT_STBC GENMASK(1, 0)
drivers/net/wireless/mediatek/mt76/mt7915/main.c +7 -4
@@ -969,11 +969,14 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,struct mt7915_phy *phy =mt7915_hw_phy (hw);struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;struct rate_info *txrate = &msta->wcid.rate; -struct rate_info rxrate = {}; -if (!mt7915_mcu_get_rx_rate (phy, vif, sta, &rxrate)) { - sinfo->rxrate = rxrate; - sinfo->filled |=BIT_ULL (NL80211_STA_INFO_RX_BITRATE ); +if (is_mt7915 (&phy->dev->mt76)) { +struct rate_info rxrate = {}; + +if (!mt7915_mcu_get_rx_rate (phy, vif, sta, &rxrate)) { + sinfo->rxrate = rxrate; + sinfo->filled |=BIT_ULL (NL80211_STA_INFO_RX_BITRATE ); + } }if (!txrate->legacy && !txrate->flags)
Signature · 1 line
2.18.0
PATCH 9/11 mt76: mt7915: update mt7915_chan_mib_offs for mt7916
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Update v2 offset. This is an intermediate patch to add mt7916 support.
--- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 13 +++++++++---- drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 8 +++++++- 2 files changed, 16 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +9 -4
@@ -3794,19 +3794,24 @@ int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)int mt7915_mcu_get_chan_mib_info (struct mt7915_phy *phy,bool chan_switch) {/* strict order */ -static const enum mt7915_chan_mib_offs offs[] = { -MIB_BUSY_TIME ,MIB_TX_TIME ,MIB_RX_TIME ,MIB_OBSS_AIRTIME +static const u32 offs[] = { +MIB_BUSY_TIME ,MIB_TX_TIME ,MIB_RX_TIME ,MIB_OBSS_AIRTIME , +MIB_BUSY_TIME_V2 ,MIB_TX_TIME_V2 ,MIB_RX_TIME_V2 , +MIB_OBSS_AIRTIME_V2 };struct mt76_channel_state *state = phy->mt76->chan_state;struct mt76_channel_state *state_ts = &phy->state_ts;struct mt7915_dev *dev = phy->dev;struct mt7915_mcu_mib *res, req[4 ];struct sk_buff *skb; -int i, ret; +int i, ret, start =0 ; + +if (!is_mt7915 (&dev->mt76)) + start =4 ;for (i =0 ; i <4 ; i++) { req[i].band =cpu_to_le32 (phy != &dev->phy); - req[i].offs =cpu_to_le32 (offs[i]); + req[i].offs =cpu_to_le32 (offs[i + start]); } ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +7 -1
@@ -182,10 +182,16 @@ struct mt7915_mcu_mib { } __packed;enum mt7915_chan_mib_offs { +/* mt7915 */ MIB_BUSY_TIME =14 ,MIB_TX_TIME =81 ,MIB_RX_TIME , -MIB_OBSS_AIRTIME =86 +MIB_OBSS_AIRTIME =86 , +/* mt7916 */ +MIB_BUSY_TIME_V2 =0 , +MIB_TX_TIME_V2 =6 , +MIB_RX_TIME_V2 =8 , +MIB_OBSS_AIRTIME_V2 =490 };struct edca {
Signature · 1 line
2.18.0
PATCH 10/11 mt76: mt7915: add mt7916 calibrated data support
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Adjust proper eeprom size and add default calibrated data support for mt7916.
--- drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c | 11 ++++++++--- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 7 ++++--- drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 8 ++++++++ 3 files changed, 20 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +8 -3
@@ -35,6 +35,7 @@ static int mt7915_check_eeprom(struct mt7915_dev *dev)switch (val) {case 0x7915 : +case 0x7916 :return 0 ;default :return -EINVAL ;
@@ -52,6 +53,9 @@ mt7915_eeprom_load_default(struct mt7915_dev *dev)if (dev->dbdc_support) default_bin =MT7915_EEPROM_DEFAULT_DBDC ; +if (!is_mt7915 (&dev->mt76)) + default_bin =MT7916_EEPROM_DEFAULT ; + ret =request_firmware (&fw, default_bin, dev->mt76.dev);if (ret) goto out;
@@ -62,7 +66,7 @@ mt7915_eeprom_load_default(struct mt7915_dev *dev) goto out; } -memcpy (eeprom, fw->data,MT7915_EEPROM_SIZE ); +memcpy (eeprom, fw->data,mt7915_eeprom_size (dev)); dev->flash_mode = true; out:
@@ -74,8 +78,9 @@ out:static int mt7915_eeprom_load (struct mt7915_dev *dev) {int ret; +u16 eeprom_size =mt7915_eeprom_size (dev); - ret =mt76_eeprom_init (&dev->mt76,MT7915_EEPROM_SIZE ); + ret =mt76_eeprom_init (&dev->mt76, eeprom_size);if (ret <0 )return ret;
@@ -85,7 +90,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)/* read eeprom data from efuse */ u32 block_num, i; - block_num =DIV_ROUND_UP (MT7915_EEPROM_SIZE , + block_num =DIV_ROUND_UP (eeprom_size,MT7915_EEPROM_BLOCK_SIZE );for (i =0 ; i < block_num; i++) mt7915_mcu_get_eeprom(dev,
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +4 -3
@@ -3551,7 +3551,8 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)#define PAGE_IDX_MASK GENMASK(4, 2)#define PER_PAGE_SIZE 0x400struct mt7915_mcu_eeprom req = { .buffer_mode =EE_MODE_BUFFER }; -u8 total =DIV_ROUND_UP (MT7915_EEPROM_SIZE ,PER_PAGE_SIZE ); +u16 eeprom_size =mt7915_eeprom_size (dev); +u8 total =DIV_ROUND_UP (eeprom_size,PER_PAGE_SIZE );u8 *eep = (u8 *)dev->mt76.eeprom.data;int eep_len;int i;
@@ -3560,8 +3561,8 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)struct sk_buff *skb;int ret; -if (i == total -1 && !!(MT7915_EEPROM_SIZE %PER_PAGE_SIZE )) - eep_len =MT7915_EEPROM_SIZE %PER_PAGE_SIZE ; +if (i == total -1 && !!(eeprom_size %PER_PAGE_SIZE )) + eep_len = eeprom_size %PER_PAGE_SIZE ;else eep_len =PER_PAGE_SIZE ;
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +8 -0
@@ -37,8 +37,11 @@#define MT7915_EEPROM_DEFAULT "mediatek/mt7915_eeprom.bin"#define MT7915_EEPROM_DEFAULT_DBDC "mediatek/mt7915_eeprom_dbdc.bin" +#define MT7916_EEPROM_DEFAULT "mediatek/mt7916_eeprom.bin"#define MT7915_EEPROM_SIZE 3584 +#define MT7916_EEPROM_SIZE 4096 +#define MT7915_EEPROM_BLOCK_SIZE 16#define MT7915_TOKEN_SIZE 8192
@@ -483,6 +486,11 @@ static inline u16 mt7915_wtbl_size(struct mt7915_dev *dev)return is_mt7915 (&dev->mt76) ?MT7915_WTBL_SIZE :MT7916_WTBL_SIZE ; } +static inline u16 mt7915_eeprom_size (struct mt7915_dev *dev) +{ +return is_mt7915 (&dev->mt76) ?MT7915_EEPROM_SIZE :MT7916_EEPROM_SIZE ; +} +void mt7915_dual_hif_set_irq_mask (struct mt7915_dev *dev,bool write_reg,u32 clear,u32 set);
Signature · 1 line
2.18.0
PATCH 11/11 mt76: mt7915: add device id for mt7916
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Add pci_device_id to enable mt7916. Note that MT_HW_CHIPID is no longer used for further chips, so drop it accordingly.
--- drivers/net/wireless/mediatek/mt76/mt7915/mmio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/pci.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +1 -1
@@ -534,7 +534,7 @@ static int mt7915_mmio_init(struct mt76_dev *mdev, bus_ops->rmw = mt7915_rmw; dev->mt76.bus = bus_ops; - mdev->rev = (mt76_rr (dev,MT_HW_CHIPID ) <<16 ) | + mdev->rev = (device_id <<16 ) | (mt76_rr (dev,MT_HW_REV ) &0xff );dev_dbg (mdev->dev,"ASIC revision: %04x\n" , mdev->rev);
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +5 -2
@@ -18,11 +18,13 @@ static u32 hif_idx;static const struct pci_device_id mt7915_pci_device_table[] = { {PCI_DEVICE (PCI_VENDOR_ID_MEDIATEK ,0x7915 ) }, + {PCI_DEVICE (PCI_VENDOR_ID_MEDIATEK ,0x7906 ) }, { }, };static const struct pci_device_id mt7915_hif_device_table[] = { {PCI_DEVICE (PCI_VENDOR_ID_MEDIATEK ,0x7916 ) }, + {PCI_DEVICE (PCI_VENDOR_ID_MEDIATEK ,0x790a ) }, { }, };
@@ -61,7 +63,8 @@ static void mt7915_put_hif2(struct mt7915_hif *hif)static struct mt7915_hif *mt7915_pci_init_hif2 (struct pci_dev *pdev) { hif_idx++; -if (!pci_get_device (PCI_VENDOR_ID_MEDIATEK ,0x7916 ,NULL )) +if (!pci_get_device (PCI_VENDOR_ID_MEDIATEK ,0x7916 ,NULL ) && + !pci_get_device (PCI_VENDOR_ID_MEDIATEK ,0x790a ,NULL ))return NULL ; writel(hif_idx | MT_PCIE_RECOG_ID_SEM,
@@ -112,7 +115,7 @@ static int mt7915_pci_probe(struct pci_dev *pdev,mt76_pci_disable_aspm (pdev); -if (id->device ==0x7916 ) +if (id->device ==0x7916 || id->device ==0x790a )return mt7915_pci_hif2_probe (pdev); ret =pci_alloc_irq_vectors (pdev,1 ,1 ,PCI_IRQ_ALL_TYPES );
Signature · 1 line
2.18.0