add mt7916 support
Subsystems (3)
v4 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 (12):
mt76: mt7915: add mt7915_mmio_probe() as a common probing function
mt76: mt7915: refine register definition
mt76: add MT_RXQ_MAIN_WA for mt7916
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 | 454 +++++++++---- .../wireless/mediatek/mt76/mt7915/eeprom.c | 87 ++- .../wireless/mediatek/mt76/mt7915/eeprom.h | 9 +- .../net/wireless/mediatek/mt76/mt7915/init.c | 146 +++-- .../net/wireless/mediatek/mt76/mt7915/mac.c | 344 ++++++---- .../net/wireless/mediatek/mt76/mt7915/mac.h | 14 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 27 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 101 ++- .../net/wireless/mediatek/mt76/mt7915/mcu.h | 8 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 613 ++++++++++++++++-- .../wireless/mediatek/mt76/mt7915/mt7915.h | 54 +- .../net/wireless/mediatek/mt76/mt7915/pci.c | 243 +------ .../net/wireless/mediatek/mt76/mt7915/regs.h | 583 +++++++++++------ .../wireless/mediatek/mt76/mt7915/testmode.c | 59 +- 17 files changed, 1879 insertions(+), 899 deletions(-)
Signature · 1 line
2.18.0
PATCH v4 1/12 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 | 233 +++++++++++++++++- .../wireless/mediatek/mt76/mt7915/mt7915.h | 7 +- .../net/wireless/mediatek/mt76/mt7915/pci.c | 233 ++---------------- 3 files changed, 255 insertions(+), 218 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +232 -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,229 @@ 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_check = mt7915_rx_check, + .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
@@ -353,7 +353,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);
@@ -487,7 +493,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 +17 -216
293 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH v4 2/12 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.
---
v4:
- remove the mask/bit array and open-code the differences in the relevant functions.
- delete the register base array and open-code the differences.
- split {base, reg} tuple array into register and offset array.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 20 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 149 +++-- .../net/wireless/mediatek/mt76/mt7915/init.c | 10 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 108 ++-- .../net/wireless/mediatek/mt76/mt7915/main.c | 24 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 404 ++++++++++--- .../wireless/mediatek/mt76/mt7915/mt7915.h | 25 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 561 +++++++++++------- .../wireless/mediatek/mt76/mt7915/testmode.c | 59 +- 9 files changed, 950 insertions(+), 410 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +10 -10
@@ -521,14 +521,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;
@@ -536,13 +536,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);
@@ -570,8 +570,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,
@@ -633,7 +633,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 */
@@ -641,7 +641,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 +101 -48
227 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/init.c +7 -3
@@ -464,8 +464,9 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) ETH_ALEN);mt76_eeprom_override (mphy); - ret =mt7915_init_tx_queues (phy,MT7915_TXQ_BAND1 , -MT7915_TX_RING_SIZE ); + ret =mt7915_init_tx_queues (phy,MT_TXQ_ID (1 ), +MT7915_TX_RING_SIZE , +MT_TXQ_RING_BASE (1 ));if (ret) goto error;
@@ -564,7 +565,10 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)* 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 ); +if (is_mt7915 (&dev->mt76)) +mt76_wr (dev,MT_SWDEF_MODE ,MT_SWDEF_NORMAL_MODE ); +else +mt76_wr (dev,MT_SWDEF_MODE_MT7916 ,MT_SWDEF_NORMAL_MODE ); ret =mt7915_mcu_init (dev);if (ret) {
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +75 -33
155 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/main.c +18 -6
@@ -861,8 +861,12 @@ u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif) n = mvif->mt76.omac_idx >HW_BSSID_MAX ?HW_BSSID_0 : mvif->mt76.omac_idx;/* TSF software read */ -mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , -MT_LPON_TCR_SW_READ ); +if (is_mt7915 (&dev->mt76)) +mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_READ ); +else +mt76_rmw (dev,MT_LPON_TCR_MT7916 (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_READ ); tsf.t32[0 ] =mt76_rr (dev,MT_LPON_UTTR0 (band)); tsf.t32[1 ] =mt76_rr (dev,MT_LPON_UTTR1 (band));
@@ -904,8 +908,12 @@ mt7915_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,mt76_wr (dev,MT_LPON_UTTR0 (band), tsf.t32[0 ]);mt76_wr (dev,MT_LPON_UTTR1 (band), tsf.t32[1 ]);/* TSF software overwrite */ -mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , -MT_LPON_TCR_SW_WRITE ); +if (is_mt7915 (&dev->mt76)) +mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_WRITE ); +else +mt76_rmw (dev,MT_LPON_TCR_MT7916 (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_WRITE );mutex_unlock (&dev->mt76.mutex); }
@@ -931,8 +939,12 @@ mt7915_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,mt76_wr (dev,MT_LPON_UTTR0 (band), tsf.t32[0 ]);mt76_wr (dev,MT_LPON_UTTR1 (band), tsf.t32[1 ]);/* TSF software adjust*/ -mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , -MT_LPON_TCR_SW_ADJUST ); +if (is_mt7915 (&dev->mt76)) +mt76_rmw (dev,MT_LPON_TCR (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_ADJUST ); +else +mt76_rmw (dev,MT_LPON_TCR_MT7916 (band, n),MT_LPON_TCR_SW_MODE , +MT_LPON_TCR_SW_ADJUST );mutex_unlock (&dev->mt76.mutex); }
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +327 -77
474 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +22 -3
@@ -13,7 +13,7 @@#define MT7915_MAX_WMM_SETS 4#define MT7915_WTBL_SIZE 288#define MT7915_WTBL_RESERVED (MT7915_WTBL_SIZE - 1) -#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ +#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ MT7915_MAX_INTERFACES)#define MT7915_WATCHDOG_TIME (HZ / 10)
@@ -46,6 +46,7 @@#define MT7915_MAX_TWT_AGRT 16#define MT7915_MAX_STA_TWT_AGRT 8 +#define MT7915_MAX_QUEUE (__MT_RXQ_MAX + __MT_MCUQ_MAX + 2)struct mt7915_vif ;struct mt7915_sta ;
@@ -68,6 +69,14 @@ enum mt7915_rxq_id { MT7915_RXQ_MCU_WA_EXT, }; +enum mt7916_rxq_id { +MT7916_RXQ_MCU_WM =0 , +MT7916_RXQ_MCU_WA , +MT7916_RXQ_MCU_WA_EXT =3 , +MT7916_RXQ_BAND0 , +MT7916_RXQ_BAND1 , +}; +struct mt7915_sta_key_conf {s8 keyidx;u8 key[16 ];
@@ -247,6 +256,10 @@ struct mt7915_dev { };struct mt7915_hif *hif2; +struct mt7915_reg_desc reg; +u8 q_id[MT7915_MAX_QUEUE ]; +u32 q_int_mask[MT7915_MAX_QUEUE ]; +u32 wfdma_mask;const struct mt76_bus_ops *bus_ops;struct tasklet_struct irq_tasklet;
@@ -283,6 +296,13 @@ struct mt7915_dev { } twt; }; +enum { +WFDMA0 =0x0 , +WFDMA1 , +WFDMA_EXT , + __MT_WFDMA_MAX, +}; +enum {MT_CTX0 ,MT_HIF0 =0x0 ,
@@ -360,7 +380,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);
@@ -505,7 +524,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, struct mt76_tx_info *tx_info);void mt7915_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e);void mt7915_tx_token_put (struct mt7915_dev *dev); -int mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc); +int mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc,int ring_base);void mt7915_queue_rx_skb (struct mt76_dev *mdev,enum mt76_rxq_id q,struct sk_buff *skb);bool mt7915_rx_check (struct mt76_dev *mdev,void *data,int len);
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +357 -204
852 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c +33 -26
83 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH v4 3/12 mt76: add MT_RXQ_MAIN_WA for mt7916
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
mt7916 add MT_RXQ_MAIN_WA to receive tx free event separately 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.
v4:
- use separate patch for the mt76 core changes.
--- drivers/net/wireless/mediatek/mt76/dma.c | 13 +++++++++++-- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + 2 files changed, 12 insertions(+), 2 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 };
Signature · 1 line
2.18.0
PATCH v4 4/12 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, so, add initialization and preftech setting for the queue MT_RXQ_MAIN_WA.
This is an intermediate patch to add mt7916 support.
---
v4:
- add wfpdma_mask/q_int_mask/q_id for rx/tx queues that indicates wpdma type, interrput bit and queue index. This will be used in queue allocation, prefetch configuration and interruput handler.
--- .../net/wireless/mediatek/mt76/mt7915/dma.c | 317 ++++++++++++------ .../net/wireless/mediatek/mt76/mt7915/init.c | 9 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 + .../net/wireless/mediatek/mt76/mt7915/mmio.c | 4 + .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 21 +- 6 files changed, 259 insertions(+), 99 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +223 -94
@@ -59,6 +59,7 @@ static void mt7915_dma_config(struct mt7915_dev *dev)RXQ_CONFIG (MT_RXQ_MCU_WA ,WFDMA1 ,MT_INT_RX_DONE_WA ,MT7915_RXQ_MCU_WA );RXQ_CONFIG (MT_RXQ_EXT ,WFDMA0 ,MT_INT_RX_DONE_BAND1 ,MT7915_RXQ_BAND1 );RXQ_CONFIG (MT_RXQ_EXT_WA ,WFDMA1 ,MT_INT_RX_DONE_WA_EXT ,MT7915_RXQ_MCU_WA_EXT ); +RXQ_CONFIG (MT_RXQ_MAIN_WA ,WFDMA1 ,MT_INT_RX_DONE_WA_MAIN ,MT7915_RXQ_MCU_WA );TXQ_CONFIG (0 ,WFDMA1 ,MT_INT_TX_DONE_BAND0 ,MT7915_TXQ_BAND0 );TXQ_CONFIG (1 ,WFDMA1 ,MT_INT_TX_DONE_BAND1 ,MT7915_TXQ_BAND1 );MCUQ_CONFIG (MT_MCUQ_WM ,WFDMA1 ,MT_INT_TX_DONE_MCU_WM ,MT7915_TXQ_MCU_WM );
@@ -70,6 +71,7 @@ static void mt7915_dma_config(struct mt7915_dev *dev)RXQ_CONFIG (MT_RXQ_MCU_WA ,WFDMA0 ,MT_INT_RX_DONE_WA ,MT7916_RXQ_MCU_WA );RXQ_CONFIG (MT_RXQ_EXT ,WFDMA0 ,MT_INT_RX_DONE_BAND1_MT7916 ,MT7916_RXQ_BAND1 );RXQ_CONFIG (MT_RXQ_EXT_WA ,WFDMA0 ,MT_INT_RX_DONE_WA_EXT_MT7916 ,MT7916_RXQ_MCU_WA_EXT ); +RXQ_CONFIG (MT_RXQ_MAIN_WA ,WFDMA0 ,MT_INT_RX_DONE_WA_MAIN_MT7916 ,MT7916_RXQ_MCU_WA_MAIN );TXQ_CONFIG (0 ,WFDMA0 ,MT_INT_TX_DONE_BAND0 ,MT7915_TXQ_BAND0 );TXQ_CONFIG (1 ,WFDMA0 ,MT_INT_TX_DONE_BAND1 ,MT7915_TXQ_BAND1 );MCUQ_CONFIG (MT_MCUQ_WM ,WFDMA0 ,MT_INT_TX_DONE_MCU_WM ,MT7915_TXQ_MCU_WM );
@@ -81,6 +83,7 @@ static void mt7915_dma_config(struct mt7915_dev *dev)static void __mt7915_dma_prefetch (struct mt7915_dev *dev,u32 ofs) {#define PREFETCH (_base, _depth) ((_base) << 16 | (_depth)) +u32 base;/* prefetch SRAM wrapping boundary for tx/rx ring. */ mt76_wr (dev,MT_MCUQ_EXT_CTRL (MT_MCUQ_FWDL ) + ofs,PREFETCH (0x0 ,0x4 ));
@@ -91,9 +94,13 @@ static void __mt7915_dma_prefetch(struct mt7915_dev *dev, u32 ofs)mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_MCU ) + ofs,PREFETCH (0x140 ,0x4 ));mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_MCU_WA ) + ofs,PREFETCH (0x180 ,0x4 )); -mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT_WA ) + ofs,PREFETCH (0x1c0 ,0x4 )); -mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_MAIN ) + ofs,PREFETCH (0x200 ,0x4 )); -mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT ) + ofs,PREFETCH (0x240 ,0x4 )); +if (!is_mt7915 (&dev->mt76)) { +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_MAIN_WA ) + ofs,PREFETCH (0x1c0 ,0x4 )); + base =0x40 ; + } +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT_WA ) + ofs,PREFETCH (0x1c0 + base,0x4 )); +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_MAIN ) + ofs,PREFETCH (0x200 + base,0x4 )); +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT ) + ofs,PREFETCH (0x240 + base,0x4 ));/* for mt7915, the ring which is next the last * used ring must be initialized.
@@ -101,8 +108,8 @@ static void __mt7915_dma_prefetch(struct mt7915_dev *dev, u32 ofs)if (is_mt7915 (&dev->mt76)) { ofs +=0x4 ;mt76_wr (dev,MT_MCUQ_EXT_CTRL (MT_MCUQ_WA ) + ofs,PREFETCH (0x140 ,0x0 )); -mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT_WA ) + ofs,PREFETCH (0x200 ,0x0 )); -mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT ) + ofs,PREFETCH (0x280 ,0x0 )); +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT_WA ) + ofs,PREFETCH (0x200 + base,0x0 )); +mt76_wr (dev,MT_RXQ_EXT_CTRL (MT_RXQ_EXT ) + ofs,PREFETCH (0x280 + base,0x0 )); } }
@@ -113,45 +120,221 @@ 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; -mt7915_dma_config (dev); +if (dev->hif2) + hif1_ofs =MT_WFDMA0_PCIE1 (0 ) -MT_WFDMA0 (0 ); -mt76_dma_attach (&dev->mt76); +/* 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 ); -/* 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 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; + +mt7915_dma_config (dev); + +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,
@@ -203,7 +386,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)if (ret)return ret; -/* rx data queue */ +/* rx data queue for band0 */ ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN], MT_RXQ_ID(MT_RXQ_MAIN), MT7915_RX_RING_SIZE,
@@ -212,7 +395,19 @@ int mt7915_dma_init(struct mt7915_dev *dev)if (ret)return ret; +/* tx free notify event from WA for band0 */ +if (!is_mt7915 (mdev)) { + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN_WA ], +MT_RXQ_ID (MT_RXQ_MAIN_WA ), +MT7915_RX_MCU_RING_SIZE , +MT_RX_BUF_SIZE , +MT_RXQ_RING_BASE (MT_RXQ_MAIN_WA )); +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], MT_RXQ_ID(MT_RXQ_EXT), MT7915_RX_RING_SIZE,
@@ -221,7 +416,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)if (ret)return ret; -/* event from WA */ +/* tx free notify event from WA for band1 */ ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT_WA], MT_RXQ_ID(MT_RXQ_EXT_WA), MT7915_RX_MCU_RING_SIZE,
@@ -239,80 +434,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
@@ -801,6 +801,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 +4 -0
@@ -486,6 +486,10 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)if (intr &MT_INT_RX (MT_RXQ_MCU_WA ))napi_schedule (&dev->mt76.napi[MT_RXQ_MCU_WA ]); +if (!is_mt7915 (&dev->mt76) && + (intr &MT_INT_RX (MT_RXQ_MAIN_WA ))) +napi_schedule (&dev->mt76.napi[MT_RXQ_MAIN_WA ]); +if (intr &MT_INT_RX (MT_RXQ_EXT_WA ))napi_schedule (&dev->mt76.napi[MT_RXQ_EXT_WA ]);
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -1
@@ -72,7 +72,8 @@ enum mt7915_rxq_id {enum mt7916_rxq_id {MT7916_RXQ_MCU_WM =0 ,MT7916_RXQ_MCU_WA , -MT7916_RXQ_MCU_WA_EXT =3 , +MT7916_RXQ_MCU_WA_MAIN , +MT7916_RXQ_MCU_WA_EXT ,MT7916_RXQ_BAND0 ,MT7916_RXQ_BAND1 , };
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +18 -3
@@ -510,9 +510,14 @@ enum offs_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)/* WFDMA1 */ #define MT_WFDMA1_BASE 0xd5000
@@ -532,6 +537,7 @@ enum offs_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)
@@ -601,10 +607,12 @@ enum offs_rev {#define MT_INT_RX_DONE_BAND1 BIT(17)#define MT_INT_RX_DONE_WM BIT(0)#define MT_INT_RX_DONE_WA BIT(1) +#define MT_INT_RX_DONE_WA_MAIN BIT(1)#define MT_INT_RX_DONE_WA_EXT BIT(2)#define MT_INT_MCU_CMD BIT(29)#define MT_INT_RX_DONE_BAND0_MT7916 BIT(22)#define MT_INT_RX_DONE_BAND1_MT7916 BIT(23) +#define MT_INT_RX_DONE_WA_MAIN_MT7916 BIT(2)#define MT_INT_RX_DONE_WA_EXT_MT7916 BIT(3)#define MT_INT_RX (q) (dev->q_int_mask[__RXQ(q)])
@@ -614,11 +622,11 @@ enum offs_rev { MT_INT_RX(MT_RXQ_MCU_WA))#define MT_INT_BAND0_RX_DONE (MT_INT_RX(MT_RXQ_MAIN) | \ - MT_INT_RX(MT_RXQ_MCU_WA)) + MT_INT_RX(MT_RXQ_MAIN_WA))#define MT_INT_BAND1_RX_DONE (MT_INT_RX(MT_RXQ_EXT) | \ - MT_INT_RX(MT_RXQ_MCU_WA) | \ - MT_INT_RX(MT_RXQ_EXT_WA)) + MT_INT_RX(MT_RXQ_EXT_WA) | \ + MT_INT_RX(MT_RXQ_MAIN_WA))#define MT_INT_RX_DONE_ALL (MT_INT_RX_DONE_MCU | \ MT_INT_BAND0_RX_DONE | \
@@ -741,6 +749,13 @@ enum offs_rev {#define MT_PCIE1_MAC_INT_ENABLE 0x74020188#define MT_PCIE1_MAC_INT_ENABLE_MT7916 0x74090188 +/* 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 v4 5/12 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.
---
v3:
- modify the function mt7915_wfsys_reset to support mt7916
--- .../net/wireless/mediatek/mt76/mt7915/init.c | 75 ++++++++--------- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 81 +++++++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 3 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 6 +- 5 files changed, 115 insertions(+), 54 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +39 -36
@@ -511,41 +511,53 @@ static void mt7915_init_work(struct work_struct *work)static void mt7915_wfsys_reset (struct mt7915_dev *dev) { -u32 val =MT_TOP_PWR_KEY |MT_TOP_PWR_SW_PWR_ON |MT_TOP_PWR_PWR_ON ; +u32 val;#define MT_MCU_DUMMY_RANDOM GENMASK(15, 0)#define MT_MCU_DUMMY_DEFAULT GENMASK(31, 16) +if (is_mt7915 (&dev->mt76)) { +mt76_wr (dev,MT_MCU_WFDMA0_DUMMY_CR ,MT_MCU_DUMMY_RANDOM ); + +/* change to software control */ + val |=MT_TOP_PWR_SW_RST ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val); + +/* reset wfsys */ + val &= ~MT_TOP_PWR_SW_RST ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val); + +/* release wfsys then mcu re-excutes romcode */ + val |=MT_TOP_PWR_SW_RST ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val); + +/* switch to hw control */ + val &= ~MT_TOP_PWR_SW_RST ; + val |=MT_TOP_PWR_HW_CTRL ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val); + +/* check whether mcu resets to default */ +if (!mt76_poll_msec (dev,MT_MCU_WFDMA0_DUMMY_CR , +MT_MCU_DUMMY_DEFAULT ,MT_MCU_DUMMY_DEFAULT , +1000 )) { +dev_err (dev->mt76.dev,"wifi subsystem reset failure\n" ); +return ; + } -mt76_wr (dev,MT_MCU_WFDMA0_DUMMY_CR ,MT_MCU_DUMMY_RANDOM ); - -/* change to software control */ - val |=MT_TOP_PWR_SW_RST ; -mt76_wr (dev,MT_TOP_PWR_CTRL , val); - -/* reset wfsys */ - val &= ~MT_TOP_PWR_SW_RST ; -mt76_wr (dev,MT_TOP_PWR_CTRL , val); +/* wfsys reset won't clear host registers */ +mt76_clear (dev,MT_TOP_MISC ,MT_TOP_MISC_FW_STATE ); -/* release wfsys then mcu re-excutes romcode */ - val |=MT_TOP_PWR_SW_RST ; -mt76_wr (dev,MT_TOP_PWR_CTRL , val); +msleep (100 ); + }else { + val =mt76_rr (dev,MT_WF_SUBSYS_RST ); -/* switch to hw control */ - val &= ~MT_TOP_PWR_SW_RST ; - val |=MT_TOP_PWR_HW_CTRL ; -mt76_wr (dev,MT_TOP_PWR_CTRL , val); + val |=0x1 ; +mt76_wr (dev,MT_WF_SUBSYS_RST , val); +msleep (20 ); -/* check whether mcu resets to default */ -if (!mt76_poll_msec (dev,MT_MCU_WFDMA0_DUMMY_CR ,MT_MCU_DUMMY_DEFAULT , -MT_MCU_DUMMY_DEFAULT ,1000 )) { -dev_err (dev->mt76.dev,"wifi subsystem reset failure\n" ); -return ; + val &= ~0x1 ; +mt76_wr (dev,MT_WF_SUBSYS_RST , val); +msleep (20 ); } - -/* wfsys reset won't clear host registers */ -mt76_clear (dev,MT_TOP_MISC ,MT_TOP_MISC_FW_STATE ); - -msleep (100 ); }static int mt7915_init_hardware (struct mt7915_dev *dev)
@@ -568,15 +580,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. -*/ -if (is_mt7915 (&dev->mt76)) -mt76_wr (dev,MT_SWDEF_MODE ,MT_SWDEF_NORMAL_MODE ); -else -mt76_wr (dev,MT_SWDEF_MODE_MT7916 ,MT_SWDEF_NORMAL_MODE ); - ret =mt7915_mcu_init (dev);if (ret) {/* Reset and try again */
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +64 -17
154 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
@@ -167,3 +167,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 +5 -1
@@ -729,17 +729,21 @@ enum offs_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)#define MT_HW_BOUND 0x70010020#define MT_HW_CHIPID 0x70010200#define MT_HW_REV 0x70010204 +#define MT_WF_SUBSYS_RST 0x70002600/* PCIE MAC */ #define MT_PCIE_MAC_BASE 0x74030000
Signature · 1 line
2.18.0
Re: [PATCH v4 05/12] mt76: mt7915: add firmware support for mt7916
Quoted 30 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]>---
v3:
- modify the functionmt7915_wfsys_resetto support mt7916--- .../net/wireless/mediatek/mt76/mt7915/init.c | 75 ++++++++--------- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 81 +++++++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 3 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 6 +- 5 files changed, 115 insertions(+), 54 deletions(-)drivers/net/wireless/mediatek/mt76/mt7915/init.c +0
-1@@ -511,41 +511,53 @@ static void mt7915_init_work(struct work_struct *work)static void mt7915_wfsys_reset (struct mt7915_dev *dev) { -u32 val =MT_TOP_PWR_KEY |MT_TOP_PWR_SW_PWR_ON |MT_TOP_PWR_PWR_ON ;
drivers/net/wireless/mediatek/mt76/mt7915/init.c static void mt7915_init_work(struct work_struct *work) · line 523
Quoted 10 lines
drivers/net/wireless/mediatek/mt76/mt7915/init.c +7
-0+u32 val;#define MT_MCU_DUMMY_RANDOM GENMASK(15, 0)#define MT_MCU_DUMMY_DEFAULT GENMASK(31, 16) +if (is_mt7915 (&dev->mt76)) { +mt76_wr (dev,MT_MCU_WFDMA0_DUMMY_CR ,MT_MCU_DUMMY_RANDOM ); + +/* change to software control */ + val |=MT_TOP_PWR_SW_RST ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val);
val is not properly initialized in this path. I also notice this is not the version of the patch that was applied to nbd's tree. The 'else nic is 7916' clause that this patch creates is also different in nbd's tree vs this patch.
I'm not sure what is correct, I've been testing with the 'v3' series and have not gotten 7916 to work yet...
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Ryder Lee
maintainerRe: [PATCH v4 05/12] mt76: mt7915: add firmware support for mt7916
Quoted 38 lines · Ben Greear
Quoted 37 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]>---
v3:
- modify the functionmt7915_wfsys_resetto support mt7916--- .../net/wireless/mediatek/mt76/mt7915/init.c | 75 ++++++++---- ----- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 81 +++++++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 3 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 6 +- 5 files changed, 115 insertions(+), 54 deletions(-)drivers/net/wireless/mediatek/mt76/mt7915/init.c +1
-1@@ -511,41 +511,53 @@ static void mt7915_init_work(struct work_struct *work)static void mt7915_wfsys_reset (struct mt7915_dev *dev) { -u32 val =MT_TOP_PWR_KEY |MT_TOP_PWR_SW_PWR_ON |MT_TOP_PWR_PWR_ON ; +u32 val;
Quoted 16 lines
drivers/net/wireless/mediatek/mt76/mt7915/init.c static void mt7915_init_work(struct work_struct *work) · line 523
Quoted 9 lines
drivers/net/wireless/mediatek/mt76/mt7915/init.c +6
-0#define MT_MCU_DUMMY_RANDOM GENMASK(15, 0)#define MT_MCU_DUMMY_DEFAULT GENMASK(31, 16) +if (is_mt7915 (&dev->mt76)) { +mt76_wr (dev,MT_MCU_WFDMA0_DUMMY_CR ,MT_MCU_DUMMY_RANDOM ); + +/* change to software control */ + val |=MT_TOP_PWR_SW_RST ; +mt76_wr (dev,MT_TOP_PWR_CTRL , val);val is not properly initialized in this path. I also notice this is not the version of the patch
that was applied to nbd's tree. The 'else nic is 7916' clause that this patch creates is also different
in nbd's tree vs this patch.
He sent a follow up to fix this and had been folded into nbd's tree.
Ryder
PATCH v4 6/12 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 | 55 ++++++++++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +- 4 files changed, 106 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 +39 -16
104 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -1
@@ -389,7 +389,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 v4 7/12 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 | 10 ++++++++-- 4 files changed, 11 insertions(+), 5 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
@@ -1598,7 +1598,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 +8 -2
@@ -12,8 +12,9 @@#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 MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ +#define MT7916_WTBL_SIZE 544 +#define MT7915_WTBL_RESERVED (mt7915_wtbl_size(dev) - 1) +#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ MT7915_MAX_INTERFACES)#define MT7915_WATCHDOG_TIME (HZ / 10)
@@ -480,6 +481,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 v4 8/12 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.
---
v4:
- fix the code defect which may cause tx free event parse error.
--- .../net/wireless/mediatek/mt76/mt7915/mac.c | 37 +++++++++++++------ .../net/wireless/mediatek/mt76/mt7915/mac.h | 8 ++-- 2 files changed, 31 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +26 -11
@@ -1387,8 +1387,10 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)LIST_HEAD (free_list);struct sk_buff *skb, *tmp;void *end = data + len; -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);
@@ -1403,12 +1405,14 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)* 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)); -if (WARN_ON_ONCE ((void *)&free->info[count] > end)) + total =FIELD_GET (MT_TX_FREE_MSDU_CNT ,le16_to_cpu (free->ctrl)); + v3 = (FIELD_GET (MT_TX_FREE_VER , txd) ==0x4 ); +if (WARN_ON_ONCE ((void *)&free->info[total >> v3] > end))return ; -for (i =0 ; i < count; i++) { -u32 msdu, info =le32_to_cpu (free->info[i]); +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.
@@ -1419,7 +1423,6 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)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);
@@ -1434,12 +1437,24 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)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); + } + count++; + txwi =mt76_token_release (mdev, msdu, &wake); +if (!txwi) +continue ; + +mt7915_txwi_free (dev, txwi, sta, &free_list); + } }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 v4 9/12 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 | 193 +++++++++++------- .../net/wireless/mediatek/mt76/mt7915/mac.h | 6 + .../net/wireless/mediatek/mt76/mt7915/main.c | 3 +- 4 files changed, 129 insertions(+), 76 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 +119 -74
221 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 +2 -1
@@ -1006,7 +1006,8 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,struct rate_info *txrate = &msta->wcid.rate;struct rate_info rxrate = {}; -if (!mt7915_mcu_get_rx_rate (phy, vif, sta, &rxrate)) { +if (is_mt7915 (&phy->dev->mt76) && + !mt7915_mcu_get_rx_rate (phy, vif, sta, &rxrate)) { sinfo->rxrate = rxrate; sinfo->filled |=BIT_ULL (NL80211_STA_INFO_RX_BITRATE ); }
Signature · 1 line
2.18.0
PATCH v4 10/12 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
@@ -3818,19 +3818,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
@@ -161,10 +161,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 v4 11/12 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
@@ -3575,7 +3575,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;
@@ -3584,8 +3585,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
@@ -486,6 +489,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 v4 12/12 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 +++++-- drivers/net/wireless/mediatek/mt76/mt7915/regs.h | 1 - 3 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +1 -1
@@ -406,7 +406,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,
@@ -111,7 +114,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 );
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +0 -1
@@ -741,7 +741,6 @@ enum offs_rev {#define MT_TOP_MISC_FW_STATE GENMASK(2, 0)#define MT_HW_BOUND 0x70010020 -#define MT_HW_CHIPID 0x70010200#define MT_HW_REV 0x70010204#define MT_WF_SUBSYS_RST 0x70002600
Signature · 1 line
2.18.0