add mt7986 support
Subsystems (5)
v3 cover add mt7986 support
From: Bo Jiao <[email protected]>
This adds support for MT7986 SoC which integrated multi-band 4x4 WiFi 6/6E.
Detailed link: https://www.mediatek.com/products/mediatek-filogic-830
Bo Jiao (3):
mt76: redefine mt76_for_each_q_rx to adapt mt7986 changes
mt76: mt7915: add support for MT7986
mt76: mt7915: introduce band_idx in mt7915_phy
Peter Chiu (1):
dt-bindings: net: wireless: mt76: document bindings for MT7986
.../bindings/net/wireless/mediatek,mt76.yaml | 31 +- drivers/net/wireless/mediatek/mt76/mt76.h | 4 +- .../net/wireless/mediatek/mt76/mt76_connac.h | 5 + .../wireless/mediatek/mt76/mt76_connac_mcu.c | 6 +- .../net/wireless/mediatek/mt76/mt7915/Kconfig | 10 + .../wireless/mediatek/mt76/mt7915/Makefile | 1 + .../wireless/mediatek/mt76/mt7915/debugfs.c | 8 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 28 +- .../wireless/mediatek/mt76/mt7915/eeprom.c | 85 +- .../wireless/mediatek/mt76/mt7915/eeprom.h | 13 + .../net/wireless/mediatek/mt76/mt7915/init.c | 54 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 209 +-- .../net/wireless/mediatek/mt76/mt7915/main.c | 21 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 81 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 125 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 44 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 277 +++- .../net/wireless/mediatek/mt76/mt7915/soc.c | 1201 +++++++++++++++++ .../wireless/mediatek/mt76/mt7915/testmode.c | 35 +- drivers/net/wireless/mediatek/mt76/testmode.c | 5 +- 20 files changed, 2003 insertions(+), 240 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/soc.c
Signature · 1 line
2.18.0
PATCH v3 1/4 dt-bindings: net: wireless: mt76: document bindings for MT7986
From: Peter Chiu <[email protected]>
Add an entry for MT7986 SoC.
---
v3:
- fix yamllint warnings and errors
- add 'minItems: 1' to keep 1 reg entry being valid
--- .../bindings/net/wireless/mediatek,mt76.yaml | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-)
Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml +28 -3
@@ -18,7 +18,7 @@ description: | wireless device. The node is expected to be specified as a child node of the PCI controller to which the wireless chip is connected. Alternatively, it can specify the wireless part of the MT7628/MT7688 - or MT7622 SoC. + or MT7622/MT7986 SoC. allOf: - $ref: ieee80211.yaml#
@@ -29,9 +29,11 @@ properties: - mediatek,mt76 - mediatek,mt7628-wmac - mediatek,mt7622-wmac + - mediatek,mt7986-wmac reg: - maxItems: 1 + minItems: 1 + maxItems: 3 interrupts: maxItems: 1
@@ -39,6 +41,17 @@ properties: power-domains: maxItems: 1 + memory-region: + maxItems: 1 + + resets: + maxItems: 1 + description: + Specify the consys reset for mt7986. + + reset-name: + const: consys + mediatek,infracfg: $ref: /schemas/types.yaml#/definitions/phandle description:
@@ -165,7 +178,7 @@ required: - compatible - reg -additionalProperties: false +unevaluatedProperties: false examples: - |
@@ -231,3 +244,15 @@ examples: power-domains = <&scpsys 3>; }; + + - | + wifi@18000000 { + compatible = "mediatek,mt7986-wmac"; + resets = <&watchdog 23>; + reset-names = "consys"; + reg = <0x18000000 0x1000000>, + <0x10003000 0x1000>, + <0x11d10000 0x1000>; + interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>; + memory-region = <&wmcpu_emi>; + };
Signature · 1 line
2.18.0
Rob Herring
maintainerRe: [PATCH v3 1/4] dt-bindings: net: wireless: mt76: document bindings for MT7986
Quoted 28 lines · Bo Jiao
From: Peter Chiu <[email protected]>
Add an entry for MT7986 SoC.
Signed-off-by Peter Chiu <[email protected]>---
v3:
- fix yamllint warnings and errors
- add 'minItems: 1' to keep 1 reg entry being valid--- .../bindings/net/wireless/mediatek,mt76.yaml | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-)Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml +1
-1@@ -18,7 +18,7 @@ description: | wireless device. The node is expected to be specified as a child node of the PCI controller to which the wireless chip is connected. Alternatively, it can specify the wireless part of the MT7628/MT7688 - or MT7622 SoC. + or MT7622/MT7986 SoC. allOf: - $ref: ieee80211.yaml#
Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml properties: · line 36
Quoted 9 lines
Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml +3
-1@@ -29,9 +29,11 @@ properties: - mediatek,mt76 - mediatek,mt7628-wmac - mediatek,mt7622-wmac + - mediatek,mt7986-wmac reg: - maxItems: 1 + minItems: 1 + maxItems: 3
With more than 1, you need to define what each one is.
Quoted 50 lines
Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml +24
-1interrupts: maxItems: 1@@ -39,6 +41,17 @@ properties: power-domains: maxItems: 1 + memory-region: + maxItems: 1 + + resets: + maxItems: 1 + description: + Specify the consys reset for mt7986. + + reset-name: + const: consys + mediatek,infracfg: $ref: /schemas/types.yaml#/definitions/phandle description:@@ -165,7 +178,7 @@ required: - compatible - reg -additionalProperties: false +unevaluatedProperties: false examples: - |@@ -231,3 +244,15 @@ examples: power-domains = <&scpsys 3>; }; + + - | + wifi@18000000 { + compatible = "mediatek,mt7986-wmac"; + resets = <&watchdog 23>; + reset-names = "consys"; + reg = <0x18000000 0x1000000>, + <0x10003000 0x1000>, + <0x11d10000 0x1000>; + interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>; + memory-region = <&wmcpu_emi>; + };Signature · 1 line
2.18.0
PATCH v3 2/4 mt76: redefine mt76_for_each_q_rx to adapt mt7986 changes
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
Check ndesc of q_rx to avoid potential hole in iteration. This is an intermediate patch to add mt7986 support.
---
v2:
- redefine mt76_for_each_q_rx().
--- drivers/net/wireless/mediatek/mt76/mt76.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +2 -2
@@ -899,8 +899,8 @@ static inline u16 mt76_rev(struct mt76_dev *dev)#define mt76_queue_reset (dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)#define mt76_for_each_q_rx (dev, i) \ - for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ - (dev)->q_rx[i].ndesc; i++) + for (i = 0; i < ARRAY_SIZE((dev)->q_rx); i++) \ + if ((dev)->q_rx[i].ndesc) struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, const struct ieee80211_ops *ops,
Signature · 1 line
2.18.0
PATCH v3 3/4 mt76: mt7915: add support for MT7986
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
This adds MT7986 SoC integrated multi-band 4x4 WiFi 6/6E.
---
v3:
- meld patch 'add Kconfig entry for MT7986' into this commit
- modify some code style to make the code more readable
--- .../net/wireless/mediatek/mt76/mt76_connac.h | 5 + .../net/wireless/mediatek/mt76/mt7915/Kconfig | 10 + .../wireless/mediatek/mt76/mt7915/Makefile | 1 + .../wireless/mediatek/mt76/mt7915/eeprom.c | 71 +- .../wireless/mediatek/mt76/mt7915/eeprom.h | 13 + .../net/wireless/mediatek/mt76/mt7915/init.c | 20 +- .../net/wireless/mediatek/mt76/mt7915/mac.c | 48 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 9 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 53 +- .../net/wireless/mediatek/mt76/mt7915/mmio.c | 125 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 43 + .../net/wireless/mediatek/mt76/mt7915/regs.h | 277 +++- .../net/wireless/mediatek/mt76/mt7915/soc.c | 1201 +++++++++++++++++ .../wireless/mediatek/mt76/mt7915/testmode.c | 2 +- drivers/net/wireless/mediatek/mt76/testmode.c | 5 +- 15 files changed, 1804 insertions(+), 79 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/soc.c
drivers/net/wireless/mediatek/mt76/mt76_connac.h +5 -0
@@ -115,6 +115,11 @@ static inline bool is_mt7916(struct mt76_dev *dev)return mt76_chip (dev) ==0x7906 ; } +static inline bool is_mt7986 (struct mt76_dev *dev) +{ +return mt76_chip (dev) ==0x7986 ; +} +static inline bool is_mt7622 (struct mt76_dev *dev) {if (!IS_ENABLED (CONFIG_MT7622_WMAC ))
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig +10 -0
@@ -11,3 +11,13 @@ config MT7915E OFDMA, spatial reuse and dual carrier modulation. To compile this driver as a module, choose M here. + +config MT7986_WMAC + bool "MT7986 (SoC) WMAC support" + depends on MT7915E + depends on ARCH_MEDIATEK || COMPILE_TEST + select REGMAP + help + This adds support for the built-in WMAC on MT7986 SoC device + which has the same feature set as a MT7915, but enables 6E + support.
drivers/net/wireless/mediatek/mt76/mt7915/Makefile +1 -0
@@ -6,3 +6,4 @@ mt7915e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \ debugfs.o mmio.o mt7915e-$(CONFIG_NL80211_TESTMODE) += testmode.o +mt7915e-$(CONFIG_MT7986_WMAC) += soc.o
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +51 -20
135 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h +13 -0
@@ -56,6 +56,19 @@ enum mt7915_eeprom_field {#define MT_EE_RATE_DELTA_SIGN BIT(6)#define MT_EE_RATE_DELTA_EN BIT(7) +#define MT_EE_NSS_MAX_MA7915 4 +#define MT_EE_NSS_MAX_DBDC_MA7915 2 +#define MT_EE_NSS_MAX_MA7986 4 +#define MT_EE_NSS_MAX_DBDC_MA7986 4 + +enum mt7915_adie_sku { +MT7976_ONE_ADIE_DBDC =0x7 , +MT7975_ONE_ADIE =0x8 , +MT7976_ONE_ADIE =0xa , +MT7975_DUAL_ADIE =0xd , +MT7976_DUAL_ADIE =0xf , +}; +enum mt7915_eeprom_band {MT_EE_BAND_SEL_DEFAULT ,MT_EE_BAND_SEL_5GHZ ,
drivers/net/wireless/mediatek/mt76/mt7915/init.c +18 -2
@@ -578,6 +578,12 @@ static void mt7915_wfsys_reset(struct mt7915_dev *dev)mt76_clear (dev,MT_TOP_MISC ,MT_TOP_MISC_FW_STATE );msleep (100 ); + }else if (is_mt7986 (&dev->mt76)) { +mt7986_wmac_enable (dev); +msleep (20 ); + +mt7986_wmac_disable (dev); +msleep (20 ); }else {mt76_set (dev,MT_WF_SUBSYS_RST ,0x1 );msleep (20 );
@@ -763,9 +769,17 @@ static int mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band, struct ieee80211_sband_iftype_data *data) { + struct mt7915_dev *dev = phy->dev;int i, idx =0 , nss =hweight8 (phy->mt76->chainmask);u16 mcs_map =0 ;u16 mcs_map_160 =0 ; +u8 nss_160; + +/* Can do 1/2 of NSS streams in 160Mhz mode for mt7915 */ +if (is_mt7915 (&dev->mt76) && !dev->dbdc_support) + nss_160 = nss /2 ; +else + nss_160 = nss;for (i =0 ; i <8 ; i++) {if (i < nss)
@@ -773,8 +787,7 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,else mcs_map |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i *2 )); -/* Can do 1/2 of NSS streams in 160Mhz mode. */ -if (i < nss /2 ) +if (i < nss_160) mcs_map_160 |= (IEEE80211_HE_MCS_SUPPORT_0_11 << (i *2 ));else mcs_map_160 |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i *2 ));
@@ -1008,5 +1021,8 @@ void mt7915_unregister_device(struct mt7915_dev *dev)mt7915_dma_cleanup (dev);tasklet_disable (&dev->irq_tasklet); +if (is_mt7986 (&dev->mt76)) +mt7986_wmac_disable (dev); +mt76_free_device (&dev->mt76); }
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +29 -19
64 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/main.c +3 -6
@@ -987,12 +987,9 @@ mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) phy->mt76->antenna_mask = tx_ant; -if (ext_phy) { -if (dev->chainmask ==0xf ) - tx_ant <<=2 ; -else - tx_ant <<=1 ; - } +if (ext_phy) + tx_ant <<= dev->chainshift; + phy->mt76->chainmask = tx_ant;mt76_set_stream_caps (phy->mt76, true);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +37 -16
115 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +117 -8
186 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +43 -0
75 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +273 -4
321 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/soc.c new file +1201 -0
1,201 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c +1 -1
@@ -456,7 +456,7 @@ mt7915_tm_set_tx_frames(struct mt7915_phy *phy, bool en)u8 tx_ant = td->tx_antenna_mask;if (phy != &dev->phy) - tx_ant >>=2 ; + tx_ant >>= dev->chainshift; phy->test.spe_idx = spe_idx_map[tx_ant]; } }
drivers/net/wireless/mediatek/mt76/testmode.c +2 -3
@@ -409,7 +409,6 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct mt76_dev *dev = phy->dev;struct mt76_testmode_data *td = &phy->test;struct nlattr *tb[NUM_MT76_TM_ATTRS ]; -bool ext_phy = phy != &dev->phy;u32 state;int err;int i;
@@ -447,8 +446,8 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_RATE_LDPC ], &td->tx_rate_ldpc,0 ,1 ) ||mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_RATE_STBC ], &td->tx_rate_stbc,0 ,1 ) ||mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_LTF ], &td->tx_ltf,0 ,2 ) || -mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_ANTENNA ], &td->tx_antenna_mask, -1 << (ext_phy *2 ), phy->antenna_mask << (ext_phy *2 )) || +mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_ANTENNA ], + &td->tx_antenna_mask,0 ,0xff ) ||mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_SPE_IDX ], &td->tx_spe_idx,0 ,27 ) ||mt76_tm_get_u8 (tb[MT76_TM_ATTR_TX_DUTY_CYCLE ], &td->tx_duty_cycle, 0, 99) ||
Signature · 1 line
2.18.0
PATCH v3 4/4 mt76: mt7915: introduce band_idx in mt7915_phy
In reply to Bo JiaoFrom: Bo Jiao <[email protected]>
The wfsys of MT7986 has only single adie chip for non-dbdc devices, and it binds to band1 by default. Hence this patch adds band_idx to explicitly configure phy accordingly.
--- .../wireless/mediatek/mt76/mt76_connac_mcu.c | 6 +- .../wireless/mediatek/mt76/mt7915/debugfs.c | 8 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 28 +-- .../wireless/mediatek/mt76/mt7915/eeprom.c | 18 +- .../net/wireless/mediatek/mt76/mt7915/init.c | 34 +++- .../net/wireless/mediatek/mt76/mt7915/mac.c | 161 +++++++++--------- .../net/wireless/mediatek/mt76/mt7915/main.c | 12 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 28 ++- .../wireless/mediatek/mt76/mt7915/mt7915.h | 1 + .../wireless/mediatek/mt76/mt7915/testmode.c | 33 ++-- 10 files changed, 171 insertions(+), 158 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +2 -4
@@ -1501,7 +1501,6 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,int ext_channels_num =max_t (int, sreq->n_channels -32 ,0 );struct ieee80211_channel **scan_list = sreq->channels;struct mt76_dev *mdev = phy->dev; -bool ext_phy = phy == mdev->phy2;struct mt76_connac_mcu_scan_channel *chan;struct mt76_connac_hw_scan_req *req;struct sk_buff *skb;
@@ -1515,7 +1514,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, req = (struct mt76_connac_hw_scan_req *)skb_put (skb,sizeof (*req)); - req->seq_num = mvif->scan_seq_num | ext_phy <<7 ; + req->seq_num = mvif->scan_seq_num | mvif->band_idx <<7 ; req->bss_idx = mvif->idx; req->scan_type = sreq->n_ssids ?1 :0 ; req->probe_req_num = sreq->n_ssids ?2 :0 ;
@@ -1623,7 +1622,6 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,struct mt76_connac_mcu_scan_channel *chan;struct mt76_connac_sched_scan_req *req;struct mt76_dev *mdev = phy->dev; -bool ext_phy = phy == mdev->phy2;struct cfg80211_match_set *match;struct cfg80211_ssid *ssid;struct sk_buff *skb;
@@ -1637,7 +1635,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy, req = (struct mt76_connac_sched_scan_req *)skb_put (skb,sizeof (*req)); req->version =1 ; - req->seq_num = mvif->scan_seq_num | ext_phy <<7 ; + req->seq_num = mvif->scan_seq_num | mvif->band_idx <<7 ;if (sreq->flags &NL80211_SCAN_FLAG_RANDOM_ADDR ) { u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +4 -4
@@ -497,12 +497,12 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,/* Tx ampdu stat */ for (i =0 ; i <ARRAY_SIZE (range); i++) - range[i] =mt76_rr (dev,MT_MIB_ARNG (ext_phy, i)); + range[i] =mt76_rr (dev,MT_MIB_ARNG (phy->band_idx, i));for (i =0 ; i <ARRAY_SIZE (bound); i++) bound[i] =MT_MIB_ARNCR_RANGE (range[i /4 ], i %4 ) +1 ; -seq_printf (file,"\nPhy %d\n" , ext_phy); +seq_printf (file,"\nPhy %d, Phy band %d\n" , ext_phy, phy->band_idx);seq_printf (file,"Length: %8d | " , bound[0 ]);for (i =0 ; i <ARRAY_SIZE (bound) -1 ; i++)
@@ -510,7 +510,7 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, bound[i] + 1, bound[i + 1]);seq_puts (file,"\nCount: " ); - n = ext_phy ?ARRAY_SIZE (dev->mt76.aggr_stats) /2 :0 ; + n = phy->band_idx ?ARRAY_SIZE (dev->mt76.aggr_stats) /2 :0 ;for (i =0 ; i <ARRAY_SIZE (bound); i++)seq_printf (file,"%8d | " , dev->mt76.aggr_stats[i + n]);seq_puts (file,"\n" );
@@ -847,7 +847,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)debugfs_create_devm_seqfile (dev->mt76.dev,"twt_stats" , dir, mt7915_twt_stats);debugfs_create_file ("ser_trigger" ,0200 , dir, dev, &fops_ser_trigger); -if (!dev->dbdc_support || ext_phy) { +if (!dev->dbdc_support || phy->band_idx) {debugfs_create_u32 ("dfs_hw_pattern" ,0400 , dir, &dev->hw_pattern); debugfs_create_file("radar_trigger", 0200, dir, dev,
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +16 -12
@@ -310,10 +310,12 @@ static int mt7915_dma_enable(struct mt7915_dev *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 ; +MT_INT_MCU_CMD ; -if (dev->dbdc_support) +if (!dev->phy.band_idx) + irq_mask |=MT_INT_BAND0_RX_DONE ; + +if (dev->dbdc_support || dev->phy.band_idx) irq_mask |=MT_INT_BAND1_RX_DONE ;mt7915_irq_enable (dev, irq_mask);
@@ -338,7 +340,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)/* init tx queue */ ret =mt7915_init_tx_queues (&dev->phy, -MT_TXQ_ID (0 ), +MT_TXQ_ID (dev->phy.band_idx),MT7915_TX_RING_SIZE ,MT_TXQ_RING_BASE (0 ));if (ret)
@@ -387,13 +389,15 @@ int mt7915_dma_init(struct mt7915_dev *dev)return ret;/* 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 , -MT_RX_BUF_SIZE , -MT_RXQ_RING_BASE (MT_RXQ_MAIN )); -if (ret) -return ret; +if (!dev->phy.band_idx) { + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN ], +MT_RXQ_ID (MT_RXQ_MAIN ), +MT7915_RX_RING_SIZE , +MT_RX_BUF_SIZE , +MT_RXQ_RING_BASE (MT_RXQ_MAIN )); +if (ret) +return ret; + }/* tx free notify event from WA for band0 */ if (!is_mt7915 (mdev)) {
@@ -406,7 +410,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)return ret; } -if (dev->dbdc_support) { +if (dev->dbdc_support || dev->phy.band_idx) {/* rx data queue for band1 */ ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT], MT_RXQ_ID(MT_RXQ_EXT),
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +9 -9
@@ -130,14 +130,14 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)static void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy) {struct mt7915_dev *dev = phy->dev; -bool ext_phy = phy != &dev->phy;u8 *eeprom = dev->mt76.eeprom.data;u32 val; - val = eeprom[MT_EE_WIFI_CONF + ext_phy]; + val = eeprom[MT_EE_WIFI_CONF + phy->band_idx]; val =FIELD_GET (MT_EE_WIFI_CONF0_BAND_SEL , val); -if (val ==MT_EE_BAND_SEL_DEFAULT && dev->dbdc_support) - val = ext_phy ?MT_EE_BAND_SEL_5GHZ :MT_EE_BAND_SEL_2GHZ ; +if (val ==MT_EE_BAND_SEL_DEFAULT && + (!is_mt7915 (&dev->mt76) || dev->dbdc_support)) + val = phy->band_idx ?MT_EE_BAND_SEL_5GHZ :MT_EE_BAND_SEL_2GHZ ;switch (val) {case MT_EE_BAND_SEL_5GHZ :
@@ -168,7 +168,7 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, eeprom[MT_EE_WIFI_CONF]); }else { nss =FIELD_GET (MT_EE_WIFI_CONF0_TX_PATH , - eeprom[MT_EE_WIFI_CONF + ext_phy]); + eeprom[MT_EE_WIFI_CONF + phy->band_idx]); }if (!nss || nss >4 )
@@ -181,12 +181,12 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,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) +if (phy->band_idx) 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]); + eeprom[MT_EE_WIFI_CONF +2 + phy->band_idx]); } nss_band_max = is_mt7986(&dev->mt76) ?
@@ -201,8 +201,8 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,if (nss_band > nss) {dev_warn (dev->mt76.dev, -"nss mismatch, nss(%d) nss_band(%d) ext_phy(%d)\n" , - nss, nss_band, ext_phy); +"nss mismatch, nss(%d) nss_band(%d) band(%d) ext_phy(%d)\n" , + nss, nss_band, phy->band_idx, ext_phy); nss = nss_band; }
drivers/net/wireless/mediatek/mt76/mt7915/init.c +31 -3
@@ -482,6 +482,9 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) phy->dev = dev; phy->mt76 = mphy; +/* Bind main phy to band0 and ext_phy to band1 for dbdc case */ + phy->band_idx =1 ; +INIT_DELAYED_WORK (&mphy->mac_work, mt7915_mac_work);mt7915_eeprom_parse_hw_cap (dev, phy);
@@ -501,7 +504,7 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)/* init wiphy according to mphy and phy */ mt7915_init_wiphy (mphy->hw); - ret =mt7915_init_tx_queues (phy,MT_TXQ_ID (1 ), + ret =mt7915_init_tx_queues (phy,MT_TXQ_ID (phy->band_idx),MT7915_TX_RING_SIZE ,MT_TXQ_RING_BASE (1 ));if (ret)
@@ -593,6 +596,32 @@ static void mt7915_wfsys_reset(struct mt7915_dev *dev) } } +static bool mt7915_band_config (struct mt7915_dev *dev) +{ +bool ret = true; + + dev->phy.band_idx =0 ; + +if (is_mt7986 (&dev->mt76)) { +u32 sku =mt7915_check_adie (dev, true); + +/* +* for mt7986, dbdc support is determined by the number +* of adie chips and the main phy is bound to band1 when +* dbdc is disabled. +*/ +if (sku ==MT7975_ONE_ADIE || sku ==MT7976_ONE_ADIE ) { + dev->phy.band_idx =1 ; + ret = false; + } + }else { + ret =is_mt7915 (&dev->mt76) ? + !!(mt76_rr (dev,MT_HW_BOUND ) &BIT (5 )) : true; + } + +return ret; +} +static int mt7915_init_hardware (struct mt7915_dev *dev) {int ret, idx;
@@ -601,8 +630,7 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)INIT_WORK (&dev->init_work, mt7915_init_work); - dev->dbdc_support =is_mt7915 (&dev->mt76) ? - !!(mt76_rr (dev,MT_HW_BOUND ) &BIT (5 )) : true; + dev->dbdc_support =mt7915_band_config (dev);/* If MCU was already running, it is likely in a bad state */ if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) >
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +76 -85
417 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/main.c +6 -6
@@ -49,7 +49,7 @@ static int mt7915_start(struct ieee80211_hw *hw)mt7915_mac_enable_nf (dev,0 ); } -if (phy != &dev->phy) { +if (phy != &dev->phy || phy->band_idx) { ret =mt76_connac_mcu_set_pm (&dev->mt76,1 ,0 );if (ret) goto out;
@@ -217,7 +217,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw, } mvif->mt76.omac_idx = idx; mvif->phy = phy; - mvif->mt76.band_idx = ext_phy; + mvif->mt76.band_idx = phy->band_idx; mvif->mt76.wmm_idx = vif->type !=NL80211_IFTYPE_AP ;if (ext_phy)
@@ -235,7 +235,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,INIT_LIST_HEAD (&mvif->sta.rc_list);INIT_LIST_HEAD (&mvif->sta.poll_list); mvif->sta.wcid.idx = idx; - mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; + mvif->sta.wcid.ext_phy = ext_phy; mvif->sta.wcid.hw_key_idx =-1 ; mvif->sta.wcid.tx_info |=MT_WCID_TX_INFO_SET ;mt76_packet_id_init (&mvif->sta.wcid);
@@ -672,6 +672,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; +bool ext_phy = mvif->phy != &dev->phy;int ret, idx; idx =mt76_wcid_alloc (dev->mt76.wcid_mask,MT7915_WTBL_STA );
@@ -683,7 +684,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, msta->vif = mvif; msta->wcid.sta =1 ; msta->wcid.idx = idx; - msta->wcid.ext_phy = mvif->mt76.band_idx; + msta->wcid.ext_phy = ext_phy; msta->wcid.tx_info |=MT_WCID_TX_INFO_SET ; msta->jiffies = jiffies;
@@ -1256,7 +1257,6 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, };struct mib_stats *mib = &phy->mib;/* See mt7915_ampdu_stat_read_phy, etc */ -bool ext_phy = phy != &dev->phy;int i, n, ei =0 ;mutex_lock (&dev->mt76.mutex);
@@ -1273,7 +1273,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, data[ei++] = mib->tx_pkt_ibf_cnt;/* Tx ampdu stat */ - n = ext_phy ?ARRAY_SIZE (dev->mt76.aggr_stats) /2 :0 ; + n = phy->band_idx ?ARRAY_SIZE (dev->mt76.aggr_stats) /2 :0 ;for (i =0 ; i <15 /*ARRAY_SIZE(bound)*/ ; i++) data[ei++] = dev->mt76.aggr_stats[i + n];
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +11 -17
@@ -346,7 +346,7 @@ mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb) c = (struct mt7915_mcu_csa_notify *)skb->data; -if (c->band_idx && dev->mt76.phy2) +if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phy2) mphy = dev->mt76.phy2; ieee80211_iterate_active_interfaces_atomic(mphy->hw,
@@ -365,7 +365,7 @@ mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)if (t->ctrl.ctrl_id !=THERMAL_PROTECT_ENABLE )return ; -if (t->ctrl.band_idx && dev->mt76.phy2) +if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phy2) mphy = dev->mt76.phy2; phy = (struct mt7915_phy *)mphy->priv;
@@ -380,7 +380,7 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb) r = (struct mt7915_mcu_rdd_report *)skb->data; -if (r->band_idx && dev->mt76.phy2) +if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phy2) mphy = dev->mt76.phy2;ieee80211_radar_detected (mphy->hw);
@@ -565,12 +565,7 @@ mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, }if (vif->bss_conf.he_support && vif->type ==NL80211_IFTYPE_STATION ) { -struct mt7915_dev *dev = phy->dev; -struct mt76_phy *mphy = &dev->mt76.phy; -bool ext_phy = phy != &dev->phy; - -if (ext_phy && dev->mt76.phy2) - mphy = dev->mt76.phy2; +struct mt76_phy *mphy = phy->mt76; ch->he_ru26_block =mt7915_check_he_obss_narrow_bw_ru (mphy->hw, vif);
@@ -1239,8 +1234,7 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb, struct ieee80211_vif *vif, struct ieee80211_sta *sta) { struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; -struct mt7915_phy *phy = - mvif->mt76.band_idx ?mt7915_ext_phy (dev) : &dev->phy; +struct mt7915_phy *phy = mvif->phy;int tx_ant =hweight8 (phy->mt76->chainmask) -1 ;struct sta_rec_bf *bf;struct tlv *tlv;
@@ -1306,8 +1300,7 @@ mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb, struct ieee80211_vif *vif, struct ieee80211_sta *sta) { struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; -struct mt7915_phy *phy = - mvif->mt76.band_idx ?mt7915_ext_phy (dev) : &dev->phy; +struct mt7915_phy *phy = mvif->phy;int tx_ant =hweight8 (phy->mt76->chainmask) -1 ;struct sta_rec_bfee *bfee;struct tlv *tlv;
@@ -1913,6 +1906,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,struct tlv *tlv;struct bss_info_bcn *bcn;int len =MT7915_BEACON_UPDATE_SIZE +MAX_BEACON_SIZE ; +bool ext_phy = phy != &dev->phy; rskb =__mt76_connac_mcu_alloc_sta_req (&dev->mt76, &mvif->mt76,NULL , len);
@@ -1936,7 +1930,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,return -EINVAL ; } -if (mvif->mt76.band_idx) { +if (ext_phy) { info =IEEE80211_SKB_CB (skb); info->hw_queue |=MT_TX_HW_QUEUE_EXT_PHY ; }
@@ -2277,7 +2271,7 @@ int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms)u8 band_idx; } req = { .cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS), - .band_idx = phy != &dev->phy, + .band_idx = phy->band_idx, }; ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL),
@@ -2681,7 +2675,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) .bw = mt76_connac_chan_bw(chandef), .tx_streams_num = hweight8(phy->mt76->antenna_mask), .rx_streams = phy->mt76->antenna_mask, - .band_idx = ext_phy, + .band_idx = phy->band_idx, .channel_band = chandef->chan->band, };
@@ -3045,7 +3039,7 @@ int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)u8 rsv[2 ]; }__packed req = { .ctrl = { - .band_idx = phy != &dev->phy, + .band_idx = phy->band_idx, }, };int level;
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +1 -0
@@ -234,6 +234,7 @@ struct mt7915_phy {u32 rxfilter;u64 omac_mask; +u8 band_idx;u16 noise;
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c +15 -18
@@ -198,7 +198,6 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode)u8 slot_time =9 , sifs =TM_DEFAULT_SIFS ;u8 aifsn =TM_MIN_AIFSN ;u32 i2t_time, tr2t_time, txv_time; -bool ext_phy = phy != &dev->phy;u16 cw =0 ;if (ipg < sig_ext + slot_time + sifs)
@@ -236,14 +235,14 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode) } } done: - txv_time =mt76_get_field (dev,MT_TMAC_ATCR (ext_phy), + txv_time =mt76_get_field (dev,MT_TMAC_ATCR (phy->band_idx),MT_TMAC_ATCR_TXV_TOUT ); txv_time *=50 ;/* normal clock time */ i2t_time = (slot_time *1000 - txv_time -BBP_PROC_TIME ) /50 ; tr2t_time = (sifs *1000 - txv_time -BBP_PROC_TIME ) /50 ; -mt76_set (dev,MT_TMAC_TRCR0 (ext_phy), +mt76_set (dev,MT_TMAC_TRCR0 (phy->band_idx),FIELD_PREP (MT_TMAC_TRCR0_TR2T_CHK , tr2t_time) |FIELD_PREP (MT_TMAC_TRCR0_I2T_CHK , i2t_time));
@@ -337,7 +336,6 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy) {int n_regs =ARRAY_SIZE (reg_backup_list);struct mt7915_dev *dev = phy->dev; -bool ext_phy = phy != &dev->phy;u32 *b = phy->test.reg_backup;int i;
@@ -361,7 +359,7 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy)if (phy->mt76->test.state ==MT76_TM_STATE_OFF ) {for (i =0 ; i < n_regs; i++) -mt76_wr (dev, reg_backup_list[i].band[ext_phy], b[i]); +mt76_wr (dev, reg_backup_list[i].band[phy->band_idx], b[i]);return ; }
@@ -372,33 +370,33 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy) phy->test.reg_backup = b;for (i =0 ; i < n_regs; i++) - b[i] =mt76_rr (dev, reg_backup_list[i].band[ext_phy]); + b[i] =mt76_rr (dev, reg_backup_list[i].band[phy->band_idx]); } -mt76_clear (dev,MT_AGG_PCR0 (ext_phy,0 ),MT_AGG_PCR0_MM_PROT | +mt76_clear (dev,MT_AGG_PCR0 (phy->band_idx,0 ),MT_AGG_PCR0_MM_PROT |MT_AGG_PCR0_GF_PROT |MT_AGG_PCR0_ERP_PROT |MT_AGG_PCR0_VHT_PROT |MT_AGG_PCR0_BW20_PROT |MT_AGG_PCR0_BW40_PROT |MT_AGG_PCR0_BW80_PROT ); -mt76_set (dev,MT_AGG_PCR0 (ext_phy,0 ),MT_AGG_PCR0_PTA_WIN_DIS ); +mt76_set (dev,MT_AGG_PCR0 (phy->band_idx,0 ),MT_AGG_PCR0_PTA_WIN_DIS ); -mt76_wr (dev,MT_AGG_PCR0 (ext_phy,1 ),MT_AGG_PCR1_RTS0_NUM_THRES | +mt76_wr (dev,MT_AGG_PCR0 (phy->band_idx,1 ),MT_AGG_PCR1_RTS0_NUM_THRES |MT_AGG_PCR1_RTS0_LEN_THRES ); -mt76_clear (dev,MT_AGG_MRCR (ext_phy),MT_AGG_MRCR_BAR_CNT_LIMIT | +mt76_clear (dev,MT_AGG_MRCR (phy->band_idx),MT_AGG_MRCR_BAR_CNT_LIMIT |MT_AGG_MRCR_LAST_RTS_CTS_RN |MT_AGG_MRCR_RTS_FAIL_LIMIT |MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT ); -mt76_rmw (dev,MT_AGG_MRCR (ext_phy),MT_AGG_MRCR_RTS_FAIL_LIMIT | +mt76_rmw (dev,MT_AGG_MRCR (phy->band_idx),MT_AGG_MRCR_RTS_FAIL_LIMIT |MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT ,FIELD_PREP (MT_AGG_MRCR_RTS_FAIL_LIMIT ,1 ) |FIELD_PREP (MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT ,1 )); -mt76_wr (dev,MT_TMAC_TFCR0 (ext_phy),0 ); -mt76_clear (dev,MT_TMAC_TCR0 (ext_phy),MT_TMAC_TCR0_TBTT_STOP_CTRL ); +mt76_wr (dev,MT_TMAC_TFCR0 (phy->band_idx),0 ); +mt76_clear (dev,MT_TMAC_TCR0 (phy->band_idx),MT_TMAC_TCR0_TBTT_STOP_CTRL );/* config rx filter for testmode rx */ -mt76_wr (dev,MT_WF_RFCR (ext_phy),0xcf70a ); -mt76_wr (dev,MT_WF_RFCR1 (ext_phy),0 ); +mt76_wr (dev,MT_WF_RFCR (phy->band_idx),0xcf70a ); +mt76_wr (dev,MT_WF_RFCR1 (phy->band_idx),0 ); } static void
@@ -724,7 +722,6 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg) {struct mt7915_phy *phy = mphy->priv;struct mt7915_dev *dev = phy->dev; -bool ext_phy = phy != &dev->phy;enum mt76_rxq_id q;void *rx, *rssi;u16 fcs_err;
@@ -773,11 +770,11 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg)nla_nest_end (msg, rx); - cnt =mt76_rr (dev,MT_MIB_SDR3 (ext_phy)); + cnt =mt76_rr (dev,MT_MIB_SDR3 (phy->band_idx)); fcs_err =is_mt7915 (&dev->mt76) ?FIELD_GET (MT_MIB_SDR3_FCS_ERR_MASK , cnt) :FIELD_GET (MT_MIB_SDR3_FCS_ERR_MASK_MT7916 , cnt); - q = ext_phy ?MT_RXQ_EXT :MT_RXQ_MAIN ; + q = phy->band_idx ?MT_RXQ_EXT :MT_RXQ_MAIN ; mphy->test.rx_stats.packets[q] += fcs_err; mphy->test.rx_stats.fcs_error[q] += fcs_err;
Signature · 1 line
2.18.0