Introduce mt7663e support to mt7615 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover Introduce mt7663e support to mt7615 driver
Introduce support for mt7663e 802.11ac 2x2:2 chipset to mt7615 driver. Introduce mt7615e_reg_map and mt7663e_regmap to reuse mt7615 code. Code refactoring.
Lorenzo Bianconi (8):
mt76: mt7615: introduce mt7615_register_map
mt76: mt7615: add mt7663e support to mt7615_reg_map
mt76: mt7615: add mt7663 support to mt7615_mcu_set_tx_ba
mt76: mt7615: add mt7663e support to mt7615_{driver,firmware}_own
mt76: mt7615: add mt7663e support to mt7615_mcu_set_eeprom
mt76: mt7615: introduce mt7615_eeprom_parse_hw_band_cap routine
mt76: mt7615: introduce mt7615_init_mac_chain routine
mt76: mt7615: introduce mt7663e support
.../net/wireless/mediatek/mt76/mt7615/dma.c | 45 +++- .../wireless/mediatek/mt76/mt7615/eeprom.c | 48 ++++- .../wireless/mediatek/mt76/mt7615/eeprom.h | 2 + .../net/wireless/mediatek/mt76/mt7615/init.c | 130 ++++++------ .../net/wireless/mediatek/mt76/mt7615/mac.c | 20 +- .../net/wireless/mediatek/mt76/mt7615/mac.h | 7 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 192 ++++++++++++++++-- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 67 +++++- .../wireless/mediatek/mt76/mt7615/mt7615.h | 14 +- .../net/wireless/mediatek/mt76/mt7615/pci.c | 12 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 87 ++++++-- .../net/wireless/mediatek/mt76/mt7615/soc.c | 2 +- 12 files changed, 507 insertions(+), 119 deletions(-)
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 1/8 mt76: mt7615: introduce mt7615_register_map
In order to reuse mt7615 code adding support for mt7663e driver, introduce mt7615e_reg_map since mt7663e and mt7615 rely on a different base registers definitions.
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 14 ++-- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 27 ++++++- .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 +- .../net/wireless/mediatek/mt76/mt7615/pci.c | 3 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 72 +++++++++++++------ .../net/wireless/mediatek/mt76/mt7615/soc.c | 2 +- 6 files changed, 91 insertions(+), 32 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +7 -7
@@ -703,9 +703,9 @@ void mt7615_txp_skb_unmap(struct mt76_dev *dev,mt7615_txp_skb_unmap_hw (dev, &txp->hw); } -static u32 mt7615_mac_wtbl_addr (int wcid) +static u32 mt7615_mac_wtbl_addr (struct mt7615_dev *dev,int wcid) { -return MT_WTBL_BASE + wcid *MT_WTBL_ENTRY_SIZE ; +return MT_WTBL_BASE (dev) + wcid *MT_WTBL_ENTRY_SIZE ; }bool mt7615_mac_wtbl_update (struct mt7615_dev *dev,int idx,u32 mask)
@@ -751,7 +751,7 @@ void mt7615_mac_sta_poll(struct mt7615_dev *dev)list_del_init (&msta->poll_list);spin_unlock_bh (&dev->sta_poll_lock); - addr =mt7615_mac_wtbl_addr (msta->wcid.idx) +19 *4 ; + addr =mt7615_mac_wtbl_addr (dev, msta->wcid.idx) +19 *4 ;for (i =0 ; i <4 ; i++, addr +=8 ) {u32 tx_last = msta->airtime_ac[i];
@@ -801,7 +801,7 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,struct mt76_phy *mphy = phy->mt76;struct ieee80211_tx_rate *ref;int wcid = sta->wcid.idx; -u32 addr =mt7615_mac_wtbl_addr (wcid); +u32 addr =mt7615_mac_wtbl_addr (dev, wcid);bool stbc = false;int n_rates = sta->n_rates;u8 bw, bw_prev, bw_idx =0 ;
@@ -966,7 +966,7 @@ mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, enum set_key_cmd cmd) { -u32 addr =mt7615_mac_wtbl_addr (wcid->idx) +30 *4 ; +u32 addr =mt7615_mac_wtbl_addr (dev, wcid->idx) +30 *4 ;u8 data[32 ] = {};if (key->keylen >sizeof (data))
@@ -1004,7 +1004,7 @@ mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, int keyidx, enum set_key_cmd cmd) { - u32 addr = mt7615_mac_wtbl_addr(wcid->idx), w0, w1; + u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx), w0, w1;if (!mt76_poll (dev,MT_WTBL_UPDATE ,MT_WTBL_UPDATE_BUSY ,0 ,5000 ))return -ETIMEDOUT ;
@@ -1040,7 +1040,7 @@ mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, enum set_key_cmd cmd) { -u32 addr =mt7615_mac_wtbl_addr (wcid->idx); +u32 addr =mt7615_mac_wtbl_addr (dev, wcid->idx);if (cmd ==SET_KEY ) {if (cipher !=MT_CIPHER_BIP_CMAC_128 || !wcid->cipher)
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +26 -1
@@ -2,9 +2,32 @@#include <linux/module.h> #include "mt7615.h" +#include "regs.h" #include "mac.h" #include "../trace.h" +const u32 mt7615e_reg_map[] = { + [MT_TOP_CFG_BASE ] =0x01000 , + [MT_HW_BASE ] =0x01000 , + [MT_PCIE_REMAP_2 ] =0x02504 , + [MT_HIF_BASE ] =0x04000 , + [MT_CSR_BASE ] =0x07000 , + [MT_PHY_BASE ] =0x10000 , + [MT_CFG_BASE ] =0x20200 , + [MT_AGG_BASE ] =0x20a00 , + [MT_TMAC_BASE ] =0x21000 , + [MT_RMAC_BASE ] =0x21200 , + [MT_DMA_BASE ] =0x21800 , + [MT_WTBL_BASE_ON ] =0x23000 , + [MT_WTBL_BASE_OFF ] =0x23400 , + [MT_LPON_BASE ] =0x24200 , + [MT_MIB_BASE ] =0x24800 , + [MT_WTBL_BASE_ADDR ] =0x30000 , + [MT_PCIE_REMAP_BASE2 ] =0x80000 , + [MT_TOP_MISC_BASE ] =0xc0000 , + [MT_EFUSE_ADDR_BASE ] =0x81070000 , +}; +u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) {u32 base = addr &MT_MCU_PCIE_REMAP_2_BASE ;
@@ -66,7 +89,8 @@ static irqreturn_t mt7615_irq_handler(int irq, void *dev_instance)return IRQ_HANDLED ; } -int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base,int irq) +int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base, +int irq,const u32 *map) {static const struct mt76_driver_ops drv_ops = {/* txwi_size = txd size + txp size */
@@ -95,6 +119,7 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base, int irq) dev = container_of(mdev, struct mt7615_dev, mt76);mt76_mmio_init (&dev->mt76, mem_base); + dev->reg_map = map; mdev->rev = (mt76_rr (dev,MT_HW_CHIPID ) <<16 ) | (mt76_rr (dev,MT_HW_REV ) &0xff );dev_dbg (mdev->dev,"ASIC revision: %04x\n" , mdev->rev);
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -1
@@ -157,6 +157,7 @@ struct mt7615_dev {u16 chainmask;struct regmap *infracfg; +const u32 *reg_map;struct work_struct mcu_work;
@@ -257,6 +258,7 @@ mt7615_ext_phy(struct mt7615_dev *dev) }extern const struct ieee80211_ops mt7615_ops; +extern const u32 mt7615e_reg_map[__MT_BASE_MAX];extern struct pci_driver mt7615_pci_driver;extern struct platform_driver mt7622_wmac_driver;
@@ -269,7 +271,8 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev) }#endif -int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base,int irq); +int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base, +int irq,const u32 *map);u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr);int mt7615_register_device (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/pci.c +2 -1
@@ -35,7 +35,8 @@ static int mt7615_pci_probe(struct pci_dev *pdev,if (ret)return ret; -return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], pdev->irq); +return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], + pdev->irq, mt7615e_reg_map); }static void mt7615_pci_remove (struct pci_dev *pdev)
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +51 -21
166 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/soc.c +1 -1
@@ -47,7 +47,7 @@ static int mt7622_wmac_probe(struct platform_device *pdev)return PTR_ERR (mem_base); } -return mt7615_mmio_probe (&pdev->dev, mem_base, irq); +return mt7615_mmio_probe (&pdev->dev, mem_base, irq, mt7615e_reg_map); }static int mt7622_wmac_remove (struct platform_device *pdev)
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 2/8 mt76: mt7615: add mt7663e support to mt7615_reg_map
In reply to Lorenzo BianconiIntroduce mt7663e support to mt7615_reg_map routine in order to reuse it adding support for mt7663e driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mmio.c | 12 +++++++++--- drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7615/regs.h | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +9 -3
@@ -30,9 +30,15 @@ const u32 mt7615e_reg_map[] = {u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) { -u32 base = addr &MT_MCU_PCIE_REMAP_2_BASE ; -u32 offset = addr &MT_MCU_PCIE_REMAP_2_OFFSET ; - +u32 base, offset; + +if (is_mt7663 (&dev->mt76)) { + base = addr &MT7663_MCU_PCIE_REMAP_2_BASE ; + offset = addr &MT7663_MCU_PCIE_REMAP_2_OFFSET ; + }else { + base = addr &MT_MCU_PCIE_REMAP_2_BASE ; + offset = addr &MT_MCU_PCIE_REMAP_2_OFFSET ; + }mt76_wr (dev,MT_MCU_PCIE_REMAP_2 , base);return MT_PCIE_REMAP_BASE_2 + offset;
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +5 -0
@@ -330,6 +330,11 @@ static inline bool is_mt7615(struct mt76_dev *dev)return mt76_chip (dev) ==0x7615 ; } +static inline bool is_mt7663 (struct mt76_dev *dev) +{ +return mt76_chip (dev) ==0x7663 ; +} +static inline void mt7615_irq_enable (struct mt7615_dev *dev,u32 mask) {mt76_set_irq_mask (&dev->mt76,MT_INT_MASK_CSR ,0 , mask);
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +3 -0
@@ -55,6 +55,9 @@ enum mt7615_reg_base {#define MT_HIF (ofs) ((dev)->reg_map[MT_HIF_BASE] + (ofs)) +#define MT7663_MCU_PCIE_REMAP_2_OFFSET GENMASK(15, 0) +#define MT7663_MCU_PCIE_REMAP_2_BASE GENMASK(31, 16) +#define MT_CFG_LPCR_HOST MT_HIF(0x1f0)#define MT_CFG_LPCR_HOST_FW_OWN BIT(0)#define MT_CFG_LPCR_HOST_DRV_OWN BIT(1)
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 3/8 mt76: mt7615: add mt7663 support to mt7615_mcu_set_tx_ba
In reply to Lorenzo BianconiExtend mt7615_mcu_set_tx_ba routine in order to support mt7663e driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +3 -1
@@ -1746,7 +1746,9 @@ int mt7615_mcu_set_tx_ba(struct mt7615_dev *dev, wtbl_ba->sn = add ?cpu_to_le16 (params->ssn) :0 ; wtbl_ba->ba_en = add; -if (add) { +if (is_mt7663 (&dev->mt76)) { + wtbl_ba->ba_winsize =cpu_to_le16 (params->buf_size); + }else if (add) {u8 idx, ba_range[] = {4 ,8 ,12 ,24 ,36 ,48 ,54 ,64 };for (idx =7 ; idx >0 ; idx--) {
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 4/8 mt76: mt7615: add mt7663e support to mt7615_{driver,firmware}_own
In reply to Lorenzo BianconiExtend mt7615_driver_own and mt7615_firmware_own in order to reuse them adding mt7663e support to mt7615 driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +9 -4
@@ -371,11 +371,13 @@ static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)static int mt7615_driver_own (struct mt7615_dev *dev) { -mt76_wr (dev,MT_CFG_LPCR_HOST ,MT_CFG_LPCR_HOST_DRV_OWN ); +u32 addr; + + addr =is_mt7663 (&dev->mt76) ?MT_CONN_HIF_ON_LPCTL :MT_CFG_LPCR_HOST ; +mt76_wr (dev, addr,MT_CFG_LPCR_HOST_DRV_OWN );mt7622_trigger_hif_int (dev, true); -if (!mt76_poll_msec (dev,MT_CFG_LPCR_HOST , -MT_CFG_LPCR_HOST_FW_OWN ,0 ,3000 )) { +if (!mt76_poll_msec (dev, addr,MT_CFG_LPCR_HOST_FW_OWN ,0 ,3000 )) {dev_err (dev->mt76.dev,"Timeout for driver own\n" );return -EIO ; }
@@ -386,9 +388,12 @@ static int mt7615_driver_own(struct mt7615_dev *dev) static int mt7615_firmware_own(struct mt7615_dev *dev) { + u32 addr; + + addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST; mt7622_trigger_hif_int(dev, true); - mt76_wr(dev, MT_CFG_LPCR_HOST, MT_CFG_LPCR_HOST_FW_OWN); + mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN); if (is_mt7622(&dev->mt76) && !mt76_poll_msec(dev, MT_CFG_LPCR_HOST,
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 5/8 mt76: mt7615: add mt7663e support to mt7615_mcu_set_eeprom
In reply to Lorenzo BianconiExtend mt7615_mcu_set_eeprom routine in order to be reused adding mt7663e support to mt7615 driver
--- .../wireless/mediatek/mt76/mt7615/eeprom.h | 2 ++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h +2 -0
@@ -18,11 +18,13 @@ enum mt7615_eeprom_field {MT_EE_TX1_5G_G0_TARGET_POWER =0x098 ,MT_EE_EXT_PA_2G_TARGET_POWER =0x0f2 ,MT_EE_EXT_PA_5G_TARGET_POWER =0x0f3 , +MT7663_EE_TX0_2G_TARGET_POWER =0x123 ,MT_EE_TX2_5G_G0_TARGET_POWER =0x142 ,MT_EE_TX3_5G_G0_TARGET_POWER =0x16a ,MT7615_EE_MAX =0x3bf ,MT7622_EE_MAX =0x3db , + MT7663_EE_MAX = 0x400, };#define MT_EE_NIC_CONF_TX_MASK GENMASK(7, 4)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +16 -5
@@ -731,18 +731,29 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev) {struct {u8 buffer_mode; -u8 pad; +u8 content_format;__le16 len; } __packed req_hdr = { .buffer_mode =1 , }; -int ret, len, eep_len; +int ret, len, eep_len, offset;u8 *req, *eep = (u8 *)dev->mt76.eeprom.data; -if (is_mt7622 (&dev->mt76)) +switch (mt76_chip (&dev->mt76)) { +case 0x7622 : eep_len =MT7622_EE_MAX -MT_EE_NIC_CONF_0 ; -else + offset =MT_EE_NIC_CONF_0 ; +break ; +case 0x7663 : + eep_len =MT7663_EE_MAX -MT_EE_CHIP_ID ; + req_hdr.content_format =1 ; + offset =MT_EE_CHIP_ID ; +break ; +default : eep_len =MT7615_EE_MAX -MT_EE_NIC_CONF_0 ; + offset =MT_EE_NIC_CONF_0 ; +break ; + } len =sizeof (req_hdr) + eep_len; req =kzalloc (len,GFP_KERNEL );
@@ -751,7 +762,7 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev) req_hdr.len =cpu_to_le16 (eep_len);memcpy (req, &req_hdr,sizeof (req_hdr)); -memcpy (req +sizeof (req_hdr), eep +MT_EE_NIC_CONF_0 , eep_len); +memcpy (req +sizeof (req_hdr), eep + offset, eep_len); ret =__mt76_mcu_send_msg (&dev->mt76,MCU_EXT_CMD_EFUSE_BUFFER_MODE , req, len, true);
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 6/8 mt76: mt7615: introduce mt7615_eeprom_parse_hw_band_cap routine
In reply to Lorenzo BianconiIntroduce mt7615_eeprom_parse_hw_band_cap routine in order to configure supported band for mt7663e and mt7622 devices since they do not rely on eeprom data to enable 2GHz/5GHz bands
--- .../wireless/mediatek/mt76/mt7615/eeprom.c | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +24 -6
@@ -91,11 +91,23 @@ static int mt7615_check_eeprom(struct mt76_dev *dev) } } -static void mt7615_eeprom_parse_hw_cap (struct mt7615_dev *dev) +static void +mt7615_eeprom_parse_hw_band_cap (struct mt7615_dev *dev) { -u8 *eeprom = dev->mt76.eeprom.data; -u8 tx_mask, max_nss; -u32 val; +u8 val, *eeprom = dev->mt76.eeprom.data; + +if (is_mt7663 (&dev->mt76)) { +/* dual band */ + dev->mt76.cap.has_2ghz = true; + dev->mt76.cap.has_5ghz = true; +return ; + } + +if (is_mt7622 (&dev->mt76)) { +/* 2GHz only */ + dev->mt76.cap.has_2ghz = true; +return ; + } val =FIELD_GET (MT_EE_NIC_WIFI_CONF_BAND_SEL , eeprom[MT_EE_WIFI_CONF ]);
@@ -111,9 +123,15 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev) dev->mt76.cap.has_5ghz = true;break ; } +} + +static void mt7615_eeprom_parse_hw_cap (struct mt7615_dev *dev) +{ +u8 *eeprom = dev->mt76.eeprom.data; +u8 tx_mask, max_nss; +u32 val; -if (is_mt7622 (&dev->mt76)) - dev->mt76.cap.has_5ghz = false; +mt7615_eeprom_parse_hw_band_cap (dev);/* read tx-rx mask from eeprom */ val =mt76_rr (dev,MT_TOP_STRAP_STA );
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 7/8 mt76: mt7615: introduce mt7615_init_mac_chain routine
In reply to Lorenzo BianconiIntroduce mt7615_init_mac_chain routine to configure per band mac register since new devices (e.g. mt7663e) do not support dbdc
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 118 +++++++++--------- 1 file changed, 62 insertions(+), 56 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +62 -56
@@ -18,27 +18,66 @@ static void mt7615_phy_init(struct mt7615_dev *dev)mt76_set (dev,MT_WF_PHY_WF2_RFCTRL0 (1 ),MT_WF_PHY_WF2_RFCTRL0_LPBCN_EN ); } -static void mt7615_mac_init (struct mt7615_dev *dev) +static void +mt7615_init_mac_chain (struct mt7615_dev *dev,int chain) {u32 val, mask, set; -int i; + +if (!chain) + val =MT_CFG_CCR_MAC_D0_1X_GC_EN |MT_CFG_CCR_MAC_D0_2X_GC_EN ; +else + val =MT_CFG_CCR_MAC_D1_1X_GC_EN |MT_CFG_CCR_MAC_D1_2X_GC_EN ;/* enable band 0/1 clk */ -mt76_set (dev,MT_CFG_CCR , -MT_CFG_CCR_MAC_D0_1X_GC_EN |MT_CFG_CCR_MAC_D0_2X_GC_EN | -MT_CFG_CCR_MAC_D1_1X_GC_EN |MT_CFG_CCR_MAC_D1_2X_GC_EN ); - - val =mt76_rmw (dev,MT_TMAC_TRCR (0 ), -MT_TMAC_TRCR_CCA_SEL |MT_TMAC_TRCR_SEC_CCA_SEL , -FIELD_PREP (MT_TMAC_TRCR_CCA_SEL ,2 ) | -FIELD_PREP (MT_TMAC_TRCR_SEC_CCA_SEL ,0 )); -mt76_wr (dev,MT_TMAC_TRCR (1 ), val); - - val =MT_AGG_ACR_PKT_TIME_EN |MT_AGG_ACR_NO_BA_AR_RULE | -FIELD_PREP (MT_AGG_ACR_CFEND_RATE ,MT7615_CFEND_RATE_DEFAULT ) | -FIELD_PREP (MT_AGG_ACR_BAR_RATE ,MT7615_BAR_RATE_DEFAULT ); -mt76_wr (dev,MT_AGG_ACR (0 ), val); -mt76_wr (dev,MT_AGG_ACR (1 ), val); +mt76_set (dev,MT_CFG_CCR , val); + +mt76_rmw (dev,MT_TMAC_TRCR (chain), +MT_TMAC_TRCR_CCA_SEL |MT_TMAC_TRCR_SEC_CCA_SEL , +FIELD_PREP (MT_TMAC_TRCR_CCA_SEL ,2 ) | +FIELD_PREP (MT_TMAC_TRCR_SEC_CCA_SEL ,0 )); + +mt76_wr (dev,MT_AGG_ACR (chain), +MT_AGG_ACR_PKT_TIME_EN |MT_AGG_ACR_NO_BA_AR_RULE | +FIELD_PREP (MT_AGG_ACR_CFEND_RATE ,MT7615_CFEND_RATE_DEFAULT ) | +FIELD_PREP (MT_AGG_ACR_BAR_RATE ,MT7615_BAR_RATE_DEFAULT )); + +mt76_wr (dev,MT_AGG_ARUCR (chain), +FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),7 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),1 )); + +mt76_wr (dev,MT_AGG_ARDCR (chain), +FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),MT7615_RATE_RETRY -1 )); + + mask =MT_DMA_RCFR0_MCU_RX_MGMT | +MT_DMA_RCFR0_MCU_RX_CTL_NON_BAR | +MT_DMA_RCFR0_MCU_RX_CTL_BAR | +MT_DMA_RCFR0_MCU_RX_BYPASS | +MT_DMA_RCFR0_RX_DROPPED_UCAST | +MT_DMA_RCFR0_RX_DROPPED_MCAST ; + set =FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_UCAST ,2 ) | +FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_MCAST ,2 ); +mt76_rmw (dev,MT_DMA_RCFR0 (chain), mask, set); +} + +static void mt7615_mac_init (struct mt7615_dev *dev) +{ +int i; + +mt7615_init_mac_chain (dev,0 ); +mt7615_init_mac_chain (dev,1 );mt76_rmw_field (dev,MT_TMAC_CTCR0 ,MT_TMAC_CTCR0_INS_DDLMT_REFTIME ,0x3f );
@@ -56,47 +95,14 @@ static void mt7615_mac_init(struct mt7615_dev *dev)mt76_rmw (dev,MT_AGG_SCR ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS ); -mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | -FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 )); - - val =FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),7 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),1 ); -mt76_wr (dev,MT_AGG_ARUCR (0 ), val); -mt76_wr (dev,MT_AGG_ARUCR (1 ), val); - - val =FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),MT7615_RATE_RETRY -1 ); -mt76_wr (dev,MT_AGG_ARDCR (0 ), val); -mt76_wr (dev,MT_AGG_ARDCR (1 ), val); -mt76_wr (dev,MT_AGG_ARCR , - (FIELD_PREP (MT_AGG_ARCR_RTS_RATE_THR ,2 ) | -MT_AGG_ARCR_RATE_DOWN_RATIO_EN | -FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | -FIELD_PREP (MT_AGG_ARCR_RATE_UP_EXTRA_TH ,4 ))); +FIELD_PREP (MT_AGG_ARCR_RTS_RATE_THR ,2 ) | +MT_AGG_ARCR_RATE_DOWN_RATIO_EN | +FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | +FIELD_PREP (MT_AGG_ARCR_RATE_UP_EXTRA_TH ,4 )); - mask =MT_DMA_RCFR0_MCU_RX_MGMT | -MT_DMA_RCFR0_MCU_RX_CTL_NON_BAR | -MT_DMA_RCFR0_MCU_RX_CTL_BAR | -MT_DMA_RCFR0_MCU_RX_BYPASS | -MT_DMA_RCFR0_RX_DROPPED_UCAST | -MT_DMA_RCFR0_RX_DROPPED_MCAST ; - set =FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_UCAST ,2 ) | -FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_MCAST ,2 ); -mt76_rmw (dev,MT_DMA_RCFR0 (0 ), mask, set); -mt76_rmw (dev,MT_DMA_RCFR0 (1 ), mask, set); +mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | +FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 ));for (i =0 ; i <MT7615_WTBL_SIZE ; i++) mt7615_mac_wtbl_update(dev, i,
Signature · 1 line
2.24.1
Lorenzo Bianconi
maintainerPATCH 8/8 mt76: mt7615: introduce mt7663e support
In reply to Lorenzo BianconiIntroduce support for mt7663e 802.11ac 2x2:2 chipset to mt7615 driver.
--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 45 ++++- .../wireless/mediatek/mt76/mt7615/eeprom.c | 18 +- .../net/wireless/mediatek/mt76/mt7615/init.c | 18 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 6 + .../net/wireless/mediatek/mt76/mt7615/mac.h | 7 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 154 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 28 ++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 + .../net/wireless/mediatek/mt76/mt7615/pci.c | 11 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 12 +- 10 files changed, 287 insertions(+), 16 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +41 -4
@@ -186,6 +186,41 @@ static void mt7622_dma_sched_init(struct mt7615_dev *dev)mt76_wr (dev, reg +MT_DMASHDL_SCHED_SET1 ,0xedcba987 ); } +static void mt7663_dma_sched_init (struct mt7615_dev *dev) +{ +int i; + +mt76_rmw (dev,MT_DMA_SHDL (MT_DMASHDL_PKT_MAX_SIZE ), +MT_DMASHDL_PKT_MAX_SIZE_PLE |MT_DMASHDL_PKT_MAX_SIZE_PSE , +FIELD_PREP (MT_DMASHDL_PKT_MAX_SIZE_PLE ,1 ) | +FIELD_PREP (MT_DMASHDL_PKT_MAX_SIZE_PSE ,8 )); + +/* enable refill control group 0, 1, 2, 4, 5 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_REFILL ),0xffc80000 ); +/* enable group 0, 1, 2, 4, 5, 15 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_OPTIONAL ),0x70068037 ); + +/* each group min quota must larger then PLE_PKT_MAX_SIZE_NUM */ +for (i =0 ; i <5 ; i++) +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (i)), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x40 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x800 )); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (5 )), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x40 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x40 )); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (15 )), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x20 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x20 )); + +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (0 )),0x42104210 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (1 )),0x42104210 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (2 )),0x00050005 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (3 )),0 ); +/* ALTX0 and ALTX1 QID mapping to group 5 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_SCHED_SET0 ),0x6012345f ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_SCHED_SET1 ),0xedcba987 ); +} +int mt7615_dma_init (struct mt7615_dev *dev) {int rx_ring_size =MT7615_RX_RING_SIZE ;
@@ -198,10 +233,6 @@ int mt7615_dma_init(struct mt7615_dev *dev)MT_WPDMA_GLO_CFG_FIFO_LITTLE_ENDIAN | MT_WPDMA_GLO_CFG_OMIT_TX_INFO); -if (!is_mt7622 (&dev->mt76)) -mt76_set (dev,MT_WPDMA_GLO_CFG , -MT_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY ); -mt76_rmw_field (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_BT_SIZE_BIT0 ,0x1 );
@@ -215,6 +246,9 @@ int mt7615_dma_init(struct mt7615_dev *dev) MT_WPDMA_GLO_CFG_MULTI_DMA_EN, 0x3);if (is_mt7615 (&dev->mt76)) { +mt76_set (dev,MT_WPDMA_GLO_CFG , +MT_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY ); +mt76_wr (dev,MT_WPDMA_GLO_CFG1 ,0x1 );mt76_wr (dev,MT_WPDMA_TX_PRE_CFG ,0xf0000 );mt76_wr (dev,MT_WPDMA_RX_PRE_CFG ,0xf7f0000 );
@@ -271,6 +305,9 @@ int mt7615_dma_init(struct mt7615_dev *dev)if (is_mt7622 (&dev->mt76))mt7622_dma_sched_init (dev); +if (is_mt7663 (&dev->mt76)) +mt7663_dma_sched_init (dev); +return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +15 -3
@@ -136,6 +136,8 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev)/* read tx-rx mask from eeprom */ val =mt76_rr (dev,MT_TOP_STRAP_STA ); max_nss = val &MT_TOP_3NSS ?3 :4 ; +if (is_mt7663 (&dev->mt76)) + max_nss = max_nss /2 ; tx_mask =FIELD_GET (MT_EE_NIC_CONF_TX_MASK , eeprom[MT_EE_NIC_CONF_0 ]);
@@ -247,6 +249,18 @@ static void mt7622_apply_cal_free_data(struct mt7615_dev *dev) } } +static void mt7615_cal_free_data (struct mt7615_dev *dev) +{ +switch (mt76_chip (&dev->mt76)) { +case 0x7622 : +mt7622_apply_cal_free_data (dev); +break ; +case 0x7615 : +mt7615_apply_cal_free_data (dev); +break ; + } +} +int mt7615_eeprom_init (struct mt7615_dev *dev) {int ret;
@@ -259,10 +273,8 @@ int mt7615_eeprom_init(struct mt7615_dev *dev)if (ret && dev->mt76.otp.data)memcpy (dev->mt76.eeprom.data, dev->mt76.otp.data,MT7615_EEPROM_SIZE ); -else if (is_mt7622 (&dev->mt76)) -mt7622_apply_cal_free_data (dev);else -mt7615_apply_cal_free_data (dev); +mt7615_cal_free_data (dev);mt7615_eeprom_parse_hw_cap (dev); memcpy(dev->mt76.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
drivers/net/wireless/mediatek/mt76/mt7615/init.c +14 -4
@@ -4,6 +4,7 @@* Author: Roy Luo <[email protected]> * Ryder Lee <[email protected]> * Felix Fietkau <[email protected]> +* Lorenzo Bianconi <[email protected]> */ #include <linux/etherdevice.h>
@@ -77,7 +78,6 @@ static void mt7615_mac_init(struct mt7615_dev *dev)int i;mt7615_init_mac_chain (dev,0 ); -mt7615_init_mac_chain (dev,1 );mt76_rmw_field (dev,MT_TMAC_CTCR0 ,MT_TMAC_CTCR0_INS_DDLMT_REFTIME ,0x3f );
@@ -101,15 +101,25 @@ static void mt7615_mac_init(struct mt7615_dev *dev)FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | FIELD_PREP(MT_AGG_ARCR_RATE_UP_EXTRA_TH, 4)); -mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | -FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 )); -for (i =0 ; i <MT7615_WTBL_SIZE ; i++)mt7615_mac_wtbl_update (dev, i,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );mt76_set (dev,MT_WF_RMAC_MIB_TIME0 ,MT_WF_RMAC_MIB_RXTIME_EN );mt76_set (dev,MT_WF_RMAC_MIB_AIRTIME0 ,MT_WF_RMAC_MIB_RXTIME_EN ); + +/* disable hdr translation and hw AMSDU */ +mt76_wr (dev,MT_DMA_DCR0 , +FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 ) | +MT_DMA_DCR0_RX_VEC_DROP ); +if (is_mt7663 (&dev->mt76)) { +mt76_wr (dev,MT_CSR (0x010 ),0x8208 ); +mt76_wr (dev,0x44064 ,0x2000000 ); +mt76_wr (dev,MT_WF_AGG (0x160 ),0x5c341c02 ); +mt76_wr (dev,MT_WF_AGG (0x164 ),0x70708040 ); + }else { +mt7615_init_mac_chain (dev,1 ); + } }bool mt7615_wait_for_mcu_init (struct mt7615_dev *dev)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +6 -0
@@ -1524,6 +1524,9 @@ void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable)if (dev->scs_en == enable) goto out; +if (is_mt7663 (&dev->mt76)) + goto out; +if (enable) {mt76_set (dev,MT_WF_PHY_MIN_PRI_PWR (0 ),MT_WF_PHY_PD_BLK (0 ));
@@ -1555,6 +1558,9 @@ void mt7615_mac_enable_nf(struct mt7615_dev *dev, bool ext_phy) {u32 rxtd; +if (is_mt7663 (&dev->mt76)) +return ; +if (ext_phy) rxtd =MT_WF_PHY_RXTD2 (10 );else
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +7 -0
@@ -229,8 +229,15 @@ enum tx_phy_bandwidth {#define MT_TXD6_FIXED_BW BIT(2)#define MT_TXD6_BW GENMASK(1, 0) +/* MT7663 DW7 HW-AMSDU */ +#define MT_TXD7_HW_AMSDU_CAP BIT(30)#define MT_TXD7_TYPE GENMASK(21, 20)#define MT_TXD7_SUB_TYPE GENMASK(19, 16) +#define MT_TXD7_SPE_IDX GENMASK(15, 11) +#define MT_TXD7_SPE_IDX_SLE BIT(10) + +#define MT_TXD8_L_TYPE GENMASK(5, 4) +#define MT_TXD8_L_SUB_TYPE GENMASK(3, 0)#define MT_TX_RATE_STBC BIT(11)#define MT_TX_RATE_NSS GENMASK(10, 9)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +152 -2
182 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +28 -0
@@ -10,6 +10,7 @@ const u32 mt7615e_reg_map[] = { [MT_TOP_CFG_BASE] = 0x01000, [MT_HW_BASE] = 0x01000, [MT_PCIE_REMAP_2] = 0x02504, + [MT_ARB_BASE] = 0x20c00, [MT_HIF_BASE] = 0x04000, [MT_CSR_BASE] = 0x07000, [MT_PHY_BASE] = 0x10000,
@@ -28,6 +29,30 @@ const u32 mt7615e_reg_map[] = { [MT_EFUSE_ADDR_BASE] = 0x81070000, }; +const u32 mt7663e_reg_map[] = { + [MT_TOP_CFG_BASE ] =0x01000 , + [MT_HW_BASE ] =0x02000 , + [MT_DMA_SHDL_BASE ] =0x06000 , + [MT_PCIE_REMAP_2 ] =0x0700c , + [MT_ARB_BASE ] =0x20c00 , + [MT_HIF_BASE ] =0x04000 , + [MT_CSR_BASE ] =0x07000 , + [MT_PHY_BASE ] =0x10000 , + [MT_CFG_BASE ] =0x20000 , + [MT_AGG_BASE ] =0x22000 , + [MT_TMAC_BASE ] =0x24000 , + [MT_RMAC_BASE ] =0x25000 , + [MT_DMA_BASE ] =0x27000 , + [MT_WTBL_BASE_ON ] =0x29000 , + [MT_WTBL_BASE_OFF ] =0x29800 , + [MT_LPON_BASE ] =0x2b000 , + [MT_MIB_BASE ] =0x2d000 , + [MT_WTBL_BASE_ADDR ] =0x30000 , + [MT_PCIE_REMAP_BASE2 ] =0x90000 , + [MT_TOP_MISC_BASE ] =0xc0000 , + [MT_EFUSE_ADDR_BASE ] =0x78011000 , +}; +u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) {u32 base, offset;
@@ -135,6 +160,9 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,if (ret) goto error; +if (is_mt7663 (mdev)) +mt76_wr (dev,MT_PCIE_IRQ_ENABLE ,1 ); + ret =mt7615_register_device (dev);if (ret) goto error;
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -0
@@ -39,6 +39,9 @@#define MT7615_FIRMWARE_V1 1#define MT7615_FIRMWARE_V2 2 +#define MT7663_ROM_PATCH "mediatek/mt7663pr2h_rebb.bin" +#define MT7663_FIRMWARE_N9 "mediatek/mt7663_n9_rebb.bin" +#define MT7615_EEPROM_SIZE 1024#define MT7615_TOKEN_SIZE 4096
@@ -259,6 +262,7 @@ mt7615_ext_phy(struct mt7615_dev *dev)extern const struct ieee80211_ops mt7615_ops;extern const u32 mt7615e_reg_map[__MT_BASE_MAX]; +extern const u32 mt7663e_reg_map[__MT_BASE_MAX];extern struct pci_driver mt7615_pci_driver;extern struct platform_driver mt7622_wmac_driver;
drivers/net/wireless/mediatek/mt76/mt7615/pci.c +9 -2
@@ -13,12 +13,15 @@static const struct pci_device_id mt7615_pci_device_table[] = { {PCI_DEVICE (0x14c3 ,0x7615 ) }, + {PCI_DEVICE (0x14c3 ,0x7663 ) }, { }, };static int mt7615_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) { +const u32 *map; +u64 mask;int ret; ret =pcim_enable_device (pdev);
@@ -31,12 +34,14 @@ static int mt7615_pci_probe(struct pci_dev *pdev,pci_set_master (pdev); - ret =pci_set_dma_mask (pdev,DMA_BIT_MASK (32 )); + mask = id->device ==0x7663 ?DMA_BIT_MASK (36 ) :DMA_BIT_MASK (32 ); + ret =pci_set_dma_mask (pdev, mask);if (ret)return ret; + map = id->device ==0x7663 ? mt7663e_reg_map : mt7615e_reg_map;return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], - pdev->irq, mt7615e_reg_map); + pdev->irq, map); }static void mt7615_pci_remove (struct pci_dev *pdev)
@@ -58,3 +63,5 @@ MODULE_DEVICE_TABLE(pci, mt7615_pci_device_table);MODULE_FIRMWARE (MT7615_FIRMWARE_CR4 );MODULE_FIRMWARE (MT7615_FIRMWARE_N9 );MODULE_FIRMWARE (MT7615_ROM_PATCH ); +MODULE_FIRMWARE (MT7663_FIRMWARE_N9 ); +MODULE_FIRMWARE (MT7663_ROM_PATCH );
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +11 -1
@@ -7,7 +7,9 @@enum mt7615_reg_base {MT_TOP_CFG_BASE ,MT_HW_BASE , +MT_DMA_SHDL_BASE ,MT_PCIE_REMAP_2 , +MT_ARB_BASE ,MT_HIF_BASE ,MT_CSR_BASE ,MT_PHY_BASE ,
@@ -40,6 +42,8 @@ enum mt7615_reg_base {#define MT_TOP_MISC2 ((dev)->reg_map[MT_TOP_CFG_BASE] + 0x134)#define MT_TOP_MISC2_FW_STATE GENMASK(2, 0) +#define MT7663_TOP_MISC2_FW_STATE GENMASK(3, 1) +#define MT_MCU_BASE 0x2000#define MT_MCU (ofs) (MT_MCU_BASE + (ofs))
@@ -58,6 +62,10 @@ enum mt7615_reg_base {#define MT7663_MCU_PCIE_REMAP_2_OFFSET GENMASK(15, 0)#define MT7663_MCU_PCIE_REMAP_2_BASE GENMASK(31, 16) +#define MT_HIF2_BASE 0xf0000 +#define MT_HIF2 (ofs) (MT_HIF2_BASE + (ofs)) +#define MT_PCIE_IRQ_ENABLE MT_HIF2(0x188) +#define MT_CFG_LPCR_HOST MT_HIF(0x1f0)#define MT_CFG_LPCR_HOST_FW_OWN BIT(0)#define MT_CFG_LPCR_HOST_DRV_OWN BIT(1)
@@ -209,7 +217,7 @@ enum mt7615_reg_base {#define MT_AGG_SCR MT_WF_AGG(0x0fc)#define MT_AGG_SCR_NLNAV_MID_PTEC_DIS BIT(3) -#define MT_WF_ARB_BASE 0x20c00 +#define MT_WF_ARB_BASE ((dev)->reg_map[MT_ARB_BASE])#define MT_WF_ARB (ofs) (MT_WF_ARB_BASE + (ofs))#define MT_ARB_SCR MT_WF_ARB(0x080)
@@ -400,6 +408,8 @@ enum mt7615_reg_base {#define MT_TX_AGG_CNT (n) MT_WF_MIB(0xa8 + ((n) << 2)) +#define MT_DMA_SHDL (ofs) (dev->reg_map[MT_DMA_SHDL_BASE] + (ofs)) +#define MT_DMASHDL_BASE 0x5000a000#define MT_DMASHDL_OPTIONAL 0x008#define MT_DMASHDL_PAGE 0x00c
Signature · 1 line
2.24.1