add mt7916 support
Subsystems (3)
v2 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 | 3 +- .../wireless/mediatek/mt76/mt7915/debugfs.c | 20 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 380 ++++++--- .../wireless/mediatek/mt76/mt7915/eeprom.c | 87 +- .../wireless/mediatek/mt76/mt7915/eeprom.h | 9 +- .../net/wireless/mediatek/mt76/mt7915/init.c | 76 +- .../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, 1908 insertions(+), 849 deletions(-)
Signature · 1 line
2.18.0
PATCH v2 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 v2 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
Re: [PATCH v2 02/11] mt76: mt7915: refine register definition
Quoted 4 lines · Bo Jiao
From: Bo Jiao <[email protected]>
Add
mt7915_reg_descto differentiate chip generations. This is an intermediate patch to introduce mt7916 support.
While merging this into my patched tree, I noticed this discrepency, it seems this patch is changing the value for SDR32/33 and/or confusing SDR32 with SDR33.
Is this on purpose?
[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep 088
+ [MIB_SDR32] = { INVALID_BASE, 0x088 },
-#define MT_MIB_SDR32(_band) MT_WF_MIB(_band, 0x088)
+#define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x088)
[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep SDR32
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);
+ [MIB_SDR32] = { INVALID_BASE, 0x088 },
+ [MIB_SDR32] = { INVALID_BASE, 0x7a8 },
+ MIB_SDR32,
-#define MT_MIB_SDR32(_band) MT_WF_MIB(_band, 0x088)
+#define MT_MIB_SDR32(_band) MT_WF_MIB(_band, __REG_OFFS(dev, MIB_SDR32))
#define MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK GENMASK(15, 0)
+#define MT_MIB_SDR32_TX_PKT_IBF_CNT_MASK __MASK(dev, MIB_BF_TX_CNT)
[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep SDR33
- 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);
+ cnt = mt76_rr(dev, MT_MIB_SDR33(ext_phy));
-#define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x08c)
-#define MT_MIB_SDR33_TX_PKT_IBF_CNT_MASK GENMASK(15, 0)
+#define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x088)
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Re: [PATCH v2 02/11] mt76: mt7915: refine register definition
Quoted 42 lines · Ben Greear
Quoted 4 lines · Bo Jiao
From: Bo Jiao <[email protected]>
Add
mt7915_reg_descto differentiate chip generations. This is an intermediate patch to introduce mt7916 support.While merging this into my patched tree, I noticed this discrepency, it seems this patch is changing the value for SDR32/33 and/or confusing
SDR32 with SDR33.Is this on purpose?
[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep 088
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +2
-1+ [MIB_SDR32] = { INVALID_BASE, 0x088 }, -#define MT_MIB_SDR32 (_band) MT_WF_MIB(_band, 0x088) +#define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x088)[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep SDR32
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);(quoted diff) +4
-1+ [MIB_SDR32] = { INVALID_BASE, 0x088 }, + [MIB_SDR32] = { INVALID_BASE, 0x7a8 }, + MIB_SDR32, -#define MT_MIB_SDR32(_band) MT_WF_MIB(_band, 0x088) +#define MT_MIB_SDR32(_band) MT_WF_MIB(_band,
__REG_OFFS(dev, MIB_SDR32))
#defineMT_MIB_SDR32_TX_PKT_EBF_CNT_MASKGENMASK(15, 0)
+#defineMT_MIB_SDR32_TX_PKT_IBF_CNT_MASK__MASK(dev,MIB_BF_TX_CNT)
[greearb@ben-dt4 linux-5.16.dev.y]$ git am --show-current-patch|grep SDR33(quoted diff) +0
-2- 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);drivers/net/wireless/mediatek/mt76/mt7915/regs.h +2
-2+ cnt =mt76_rr (dev,MT_MIB_SDR33 (ext_phy)); -#define MT_MIB_SDR33 (_band) MT_WF_MIB(_band, 0x08c) -#define MT_MIB_SDR33_TX_PKT_IBF_CNT_MASK GENMASK(15, 0) +#define MT_MIB_SDR33 (_band) MT_WF_MIB(_band, 0x088)
Quoted 4 lines
Thanks,
Ben
for mt7915, MT_MIB_SDR33's mask(15,0) is tx_pkt_ibf_cnt,
for mt7916, MT_MIB_SDR32's mask(15,0) is tx_pkt_ebf_cnt and mask(31,16) is tx_pkt_ibf_cnt.
Thanks,
Bo Jiao
_______________________________________________
Linux-mediatek mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-mediatek
PATCH v2 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.
---
v2:
- revert the modify to mt76_for_each_q_rx() which may cause not work for sdo/usb chip.
--- drivers/net/wireless/mediatek/mt76/dma.c | 13 +- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7915/dma.c | 375 ++++++++++++------ .../net/wireless/mediatek/mt76/mt7915/init.c | 9 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 + .../net/wireless/mediatek/mt76/mt7915/mmio.c | 38 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 60 ++- 8 files changed, 358 insertions(+), 145 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/mt7915/dma.c +259 -116
444 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 +35 -3
@@ -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_EXT : - rx_irq_mask =MT_INT_RX_DONE_DATA1 ; -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 : + 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_MAIN_WA : + rx_irq_mask =MT_INT_RX_DONE_WA_MAIN ; +break ;default :break ; }
@@ -611,6 +638,11 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)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_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
103 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH v2 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
Re: [PATCH v2 04/11] mt76: mt7915: add firmware support for mt7916
Quoted 41 lines · Bo Jiao
From: Bo Jiao <[email protected]>
Update firmware initialization for mt7916. 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]>--- .../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 +0
-0@@ -2713,16 +2713,20 @@ static int mt7915_mcu_start_patch(struct mt7915_dev *dev) sizeof(req), true);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c static int mt7915_mcu_start_patch(struct mt7915_dev *dev) · line 2720
Quoted 10 lines
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +3
-3} -static int mt7915_driver_own(struct mt7915_dev *dev) +static int mt7915_driver_own(struct mt7915_dev *dev, u8 band) { - mt76_wr(dev, MT_TOP_LPCR_HOST_BAND0, MT_TOP_LPCR_HOST_DRV_OWN); - if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND0, + mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_DRV_OWN); + if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_FW_OWN_STAT,
I think that MT_TOP_LPCR_HOST_FW_OWN_STAT is not defined in the upstream kernel...
Maybe a patch from owrt was not added to upstream yet?
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Re: [PATCH v2 04/11] mt76: mt7915: add firmware support for mt7916
Quoted 63 lines · Ben Greear
Quoted 48 lines · Bo Jiao
From: Bo Jiao <[email protected]>
Update firmware initialization for mt7916. 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]>--- .../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 +0
-0@@ -2713,16 +2713,20 @@ static int mt7915_mcu_start_patch(struct mt7915_dev *dev) sizeof(req), true); }drivers/net/wireless/mediatek/mt76/mt7915/mcu.c static int mt7915_mcu_start_patch(struct · line 2723
Quoted 10 lines
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +3
-3-static int mt7915_driver_own (struct mt7915_dev *dev) +static int mt7915_driver_own(struct mt7915_dev *dev, u8 band) { -mt76_wr (dev,MT_TOP_LPCR_HOST_BAND0 , MT_TOP_LPCR_HOST_DRV_OWN); -if (!mt76_poll_msec (dev,MT_TOP_LPCR_HOST_BAND0 , + mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_DRV_OWN); + if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_FW_OWN_STAT,I think that
MT_TOP_LPCR_HOST_FW_OWN_STATis not defined in the upstream kernel...
Quoted 7 lines
Maybe a patch from owrt was not added to upstream yet?
Thanks,
Ben
This definition is available on the latest mt76 version
#define MT_TOP_LPCR_HOST_FW_OWN_STAT BIT(2)
thanks
Bo Jiao
_______________________________________________
Linux-mediatek mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-mediatek
PATCH v2 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.
---
v2:
- extend mac address from main phy mac address for ext phy when ext phy mac address is invalid.
--- .../wireless/mediatek/mt76/mt7915/eeprom.c | 76 ++++++++++++++----- .../wireless/mediatek/mt76/mt7915/eeprom.h | 9 ++- .../net/wireless/mediatek/mt76/mt7915/init.c | 56 ++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- 4 files changed, 107 insertions(+), 37 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +57 -19
@@ -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)
@@ -98,7 +101,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)return mt7915_check_eeprom (dev); } -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;
@@ -124,32 +127,55 @@ 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 ]); + }else { + nss =FIELD_GET (MT_EE_WIFI_CONF0_TX_PATH , + eeprom[MT_EE_WIFI_CONF + ext_phy]); + } -/* 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 ; +/* read tx/rx stream */ nss_band = nss; -if (dev->dbdc_support) { - nss_band =FIELD_GET (MT_EE_WIFI_CONF3_TX_PATH_B0 , - eeprom[MT_EE_WIFI_CONF +3 ]); +if (is_mt7915 (&dev->mt76)) { + nss_band =FIELD_GET (MT_EE_WIFI_CONF3_TX_PATH_B0 , + eeprom[MT_EE_WIFI_CONF +3 ]); +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_band >2 ) nss_band =2 ; + } -if (nss_band >= nss) - nss =4 ; +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; } - dev->chainmask =BIT (nss) -1 ; - dev->mphy.antenna_mask =BIT (nss_band) -1 ; - dev->mphy.chainmask = dev->mphy.antenna_mask; + mphy->chainmask = ext_phy ? (BIT (nss_band) -1 ) <<2 : (BIT (nss_band) -1 ); + mphy->antenna_mask =BIT (hweight8 (mphy->chainmask)) -1 ; + dev->chainmask |= mphy->chainmask; }int mt7915_eeprom_init (struct mt7915_dev *dev)
@@ -171,7 +197,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 );
@@ -194,15 +220,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)
@@ -217,11 +248,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 +40 -16
105 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 v2 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
PATCH v2 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 v2 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 v2 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 v2 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)return ret;
@@ -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;
@@ -91,7 +96,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)return -EINVAL ;/* read eeprom data from efuse */ - 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 v2 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