Add MediaTek IEEE 802.11ax devices - MT7915E
Subsystems (2)
Ryder Lee
maintainercover Add MediaTek IEEE 802.11ax devices - MT7915E
MT7915E is the latest generation IEEE 802.11ax NIC in MediaTek, which currently supports AP, Station and Mesh mode.
Even though some Tx/Rx paths of MT7915 [1] are similar to MT7615. Considering it has huge amounts of HE parts, different designs of firmware, and most importantly, for the sake of convenience to get family devices supported in the future, it was concluded to be simpler to have a clean start for this generation.
This makes maintenance easier and avoids major changes in MT7615, which currently shares the codes with low power capable device MT7663. It will increase the risk of regressions in existing flow.
MT7915 supports only basic HE_SU for the mmoment, whereas other 802.11ax specific features, such as BSS color, TWT, SR, DCM and OFDMA are WIP, and will be gradually added in upcoming days.
The three firmwares are available from https://github.com/ryderlee1110/wireless-fw
they will be submitted soon. At last, the developers are all listed in the series.
Thanks,
Ryder
Ryder Lee (16):
mt76: avoid rx reorder buffer overflow
mt76: add support for HE RX rate reporting
mt76: add Rx stats support for radiotap
mt76: adjust wcid size to support new 802.11ax generation
mt76: add HE phy modes and hardware queue
mt76: add mac80211 driver for MT7915 PCIe-based chipsets
mt76: mt7915: implement HE per-rate tx power support
mt76: mt7915: add offloading Tx AMSDU support
mt76: mt7915: register HE capabilities for each interface
mt76: mt7915: add HE bss_conf support for interfaces
mt76: mt7915: add HE capabilities support for peers
mt76: mt7915: add Rx radiotap header support
mt76: mt7915: add .sta_add_debugfs support
mt76: mt7915: add .sta_statistics support
mt76: mt7915: set peer Tx fixed rate through debugfs
mt76: mt7915: enable firmware module debug support
drivers/net/wireless/mediatek/mt76/Kconfig | 1 + drivers/net/wireless/mediatek/mt76/Makefile | 1 + drivers/net/wireless/mediatek/mt76/agg-rx.c | 12 +- drivers/net/wireless/mediatek/mt76/mac80211.c | 10 +- drivers/net/wireless/mediatek/mt76/mt76.h | 42 +- .../net/wireless/mediatek/mt76/mt7915/Kconfig | 13 + .../wireless/mediatek/mt76/mt7915/Makefile | 6 + .../wireless/mediatek/mt76/mt7915/debugfs.c | 415 +++ .../net/wireless/mediatek/mt76/mt7915/dma.c | 283 ++ .../wireless/mediatek/mt76/mt7915/eeprom.c | 236 ++ .../wireless/mediatek/mt76/mt7915/eeprom.h | 125 + .../net/wireless/mediatek/mt76/mt7915/init.c | 591 ++++ .../net/wireless/mediatek/mt76/mt7915/mac.c | 1453 +++++++++ .../net/wireless/mediatek/mt76/mt7915/mac.h | 346 ++ .../net/wireless/mediatek/mt76/mt7915/main.c | 780 +++++ .../net/wireless/mediatek/mt76/mt7915/mcu.c | 2804 +++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 1003 ++++++ .../wireless/mediatek/mt76/mt7915/mt7915.h | 459 +++ .../net/wireless/mediatek/mt76/mt7915/pci.c | 212 ++ .../net/wireless/mediatek/mt76/mt7915/regs.h | 344 ++ 20 files changed, 9118 insertions(+), 18 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/Kconfig create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/Makefile create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/dma.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/init.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mac.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mac.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/main.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mcu.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/pci.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/regs.h
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 1/16 mt76: avoid rx reorder buffer overflow
Enlarge slot to support 11ax 256 BA (256 MPDUs in an AMPDU)
--- drivers/net/wireless/mediatek/mt76/agg-rx.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt76.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/agg-rx.c +4 -4
@@ -152,8 +152,8 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)struct ieee80211_sta *sta;struct mt76_rx_tid *tid;bool sn_less; -u16 seqno, head, size; -u8 ackp, idx; +u16 seqno, head, size, idx; +u8 ackp;__skb_queue_tail (frames, skb);
@@ -239,7 +239,7 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames) }int mt76_rx_aggr_start (struct mt76_dev *dev,struct mt76_wcid *wcid,u8 tidno, -u16 ssn,u8 size) +u16 ssn,u16 size) {struct mt76_rx_tid *tid;
@@ -264,7 +264,7 @@ EXPORT_SYMBOL_GPL(mt76_rx_aggr_start);static void mt76_rx_aggr_shutdown (struct mt76_dev *dev,struct mt76_rx_tid *tid) { -u8 size = tid->size; +u16 size = tid->size;int i;spin_lock_bh (&tid->lock);
drivers/net/wireless/mediatek/mt76/mt76.h +3 -3
@@ -244,8 +244,8 @@ struct mt76_rx_tid {struct delayed_work reorder_work;u16 head; -u8 size; -u8 nframes; +u16 size; +u16 nframes;u8 num;
@@ -794,7 +794,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx,void mt76_set_stream_caps (struct mt76_dev *dev,bool vht);int mt76_rx_aggr_start (struct mt76_dev *dev,struct mt76_wcid *wcid,u8 tid, -u16 ssn,u8 size); +u16 ssn,u16 size);void mt76_rx_aggr_stop (struct mt76_dev *dev,struct mt76_wcid *wcid,u8 tid); void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 2/16 mt76: add support for HE RX rate reporting
In reply to Ryder LeeAdd support for encoding and reporting HE RX rates.
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt76.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +3 -1
@@ -677,7 +677,6 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,struct ieee80211_hw **hw, struct ieee80211_sta **sta) { - struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);struct mt76_rx_status mstat;
@@ -689,6 +688,9 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb, status->enc_flags = mstat.enc_flags; status->encoding = mstat.encoding; status->bw = mstat.bw; + status->he_ru = mstat.he_ru; + status->he_gi = mstat.he_gi; + status->he_dcm = mstat.he_dcm; status->rate_idx = mstat.rate_idx; status->nss = mstat.nss; status->band = mstat.band;
drivers/net/wireless/mediatek/mt76/mt76.h +2 -1
@@ -458,7 +458,8 @@ struct mt76_rx_status {u16 freq;u32 flag;u8 enc_flags; - u8 encoding:2, bw:3; + u8 encoding:2, bw:3, he_ru:3; + u8 he_gi:2, he_dcm:1;u8 rate_idx;u8 nss;u8 band;
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 3/16 mt76: add Rx stats support for radiotap
In reply to Ryder LeeHE deivces need to add Rx radiotap header.
--- drivers/net/wireless/mediatek/mt76/agg-rx.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mac80211.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt76.h | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/agg-rx.c +2 -2
@@ -119,7 +119,7 @@ static void mt76_rx_aggr_check_ctl(struct sk_buff *skb, struct sk_buff_head *frames) { struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; -struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data; +struct ieee80211_bar *bar =mt76_skb_get_hdr (skb);struct mt76_wcid *wcid = status->wcid;struct mt76_rx_tid *tid;u16 seqno;
@@ -147,7 +147,7 @@ mt76_rx_aggr_check_ctl(struct sk_buff *skb, struct sk_buff_head *frames)void mt76_rx_aggr_reorder (struct sk_buff *skb,struct sk_buff_head *frames) {struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; -struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +struct ieee80211_hdr *hdr =mt76_skb_get_hdr (skb);struct mt76_wcid *wcid = status->wcid;struct ieee80211_sta *sta;struct mt76_rx_tid *tid;
drivers/net/wireless/mediatek/mt76/mac80211.c +3 -3
@@ -727,7 +727,7 @@ mt76_check_ccmp_pn(struct sk_buff *skb)* Validate the first fragment both here and in mac80211 * All further fragments will be validated by mac80211 only. */ - hdr = (struct ieee80211_hdr *)skb->data; + hdr =mt76_skb_get_hdr (skb);if (ieee80211_is_frag (hdr) && !ieee80211_is_first_frag (hdr->frame_control))return 0 ;
@@ -800,7 +800,7 @@ mt76_airtime_flush_ampdu(struct mt76_dev *dev)static void mt76_airtime_check (struct mt76_dev *dev,struct sk_buff *skb) { -struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +struct ieee80211_hdr *hdr =mt76_skb_get_hdr (skb);struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;struct mt76_wcid *wcid = status->wcid;
@@ -837,7 +837,7 @@ static void mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb) { struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; -struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +struct ieee80211_hdr *hdr =mt76_skb_get_hdr (skb);struct ieee80211_sta *sta;struct ieee80211_hw *hw;struct mt76_wcid *wcid = status->wcid;
drivers/net/wireless/mediatek/mt76/mt76.h +19 -0
@@ -742,6 +742,25 @@ static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb)return ((void *)IEEE80211_SKB_CB (skb)->status.status_driver_data); } +static inline void *mt76_skb_get_hdr (struct sk_buff *skb) +{ +struct mt76_rx_status mstat; +u8 *data = skb->data; + +/* Alignment concerns */ +BUILD_BUG_ON (sizeof (struct ieee80211_radiotap_he ) %4 ); +BUILD_BUG_ON (sizeof (struct ieee80211_radiotap_he_mu ) %4 ); + + mstat = *((struct mt76_rx_status *)skb->cb); + +if (mstat.flag &RX_FLAG_RADIOTAP_HE ) + data +=sizeof (struct ieee80211_radiotap_he ); +if (mstat.flag &RX_FLAG_RADIOTAP_HE_MU ) + data +=sizeof (struct ieee80211_radiotap_he_mu ); + +return data; +} +static inline void mt76_insert_hdr_pad (struct sk_buff *skb) {int len =ieee80211_get_hdrlen_from_skb (skb);
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 4/16 mt76: adjust wcid size to support new 802.11ax generation
In reply to Ryder LeeThe newer 802.11ax devices (i.e. MT7915E) can connect to much more peers than previous generations.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +4 -4
@@ -181,7 +181,7 @@ enum mt76_wcid_flags { MT_WCID_FLAG_PS, }; -#define MT76_N_WCIDS 128 +#define MT76_N_WCIDS 288/* stored in ieee80211_tx_info::hw_queue */ #define MT_TX_HW_QUEUE_EXT_PHY BIT(3)
@@ -201,7 +201,7 @@ struct mt76_wcid {struct ewma_signal rssi;int inactive_count; -u8 idx; +u16 idx;u8 hw_key_idx; u8 sta:1;
@@ -268,7 +268,7 @@ struct mt76_rx_tid {struct mt76_tx_cb {unsigned long jiffies; -u8 wcid; +u16 wcid;u8 pktid;u8 flags; };
@@ -441,7 +441,7 @@ struct mt76_mmio {struct mt76_rx_status {union {struct mt76_wcid *wcid; -u8 wcid_idx; +u16 wcid_idx; };unsigned long reorder_time;
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 5/16 mt76: add HE phy modes and hardware queue
In reply to Ryder LeeThis is a preliminary patch to support 11ax deivces.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/wireless/mediatek/mt76/mt76.h +6 -0
@@ -60,6 +60,7 @@ enum mt76_txq_id {MT_TXQ_BK =IEEE80211_AC_BK ,MT_TXQ_PSD ,MT_TXQ_MCU , +MT_TXQ_MCU_WA ,MT_TXQ_BEACON ,MT_TXQ_CAB , MT_TXQ_FWDL,
@@ -69,6 +70,7 @@ enum mt76_txq_id {enum mt76_rxq_id {MT_RXQ_MAIN ,MT_RXQ_MCU , +MT_RXQ_MCU_WA , __MT_RXQ_MAX };
@@ -577,6 +579,10 @@ enum mt76_phy_type {MT_PHY_TYPE_HT ,MT_PHY_TYPE_HT_GF ,MT_PHY_TYPE_VHT , +MT_PHY_TYPE_HE_SU =8 , +MT_PHY_TYPE_HE_EXT_SU , +MT_PHY_TYPE_HE_TB , + MT_PHY_TYPE_HE_MU, };#define __mt76_rr (dev, ...) (dev)->bus->rr((dev), __VA_ARGS__)
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 6/16 mt76: add mac80211 driver for MT7915 PCIe-based chipsets
In reply to Ryder LeeAdd support for the MediaTek latest generation IEEE 802.11ax 4x4 device MT7915E, which supports concurrent dual-band operation at both 5GHz and 2.4GHz.
Note that this patch just add basic part and will add more HE capabilities support in the further patches.
The driver supports AP, Station, Mesh and monitor mode.
--- drivers/net/wireless/mediatek/mt76/Kconfig | 1 + drivers/net/wireless/mediatek/mt76/Makefile | 1 + .../net/wireless/mediatek/mt76/mt7915/Kconfig | 13 + .../wireless/mediatek/mt76/mt7915/Makefile | 6 + .../wireless/mediatek/mt76/mt7915/debugfs.c | 245 ++ .../net/wireless/mediatek/mt76/mt7915/dma.c | 283 ++ .../wireless/mediatek/mt76/mt7915/eeprom.c | 125 + .../wireless/mediatek/mt76/mt7915/eeprom.h | 78 + .../net/wireless/mediatek/mt76/mt7915/init.c | 392 +++ .../net/wireless/mediatek/mt76/mt7915/mac.c | 1310 ++++++++++ .../net/wireless/mediatek/mt76/mt7915/mac.h | 330 +++ .../net/wireless/mediatek/mt76/mt7915/main.c | 743 ++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.c | 2319 +++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 837 ++++++ .../wireless/mediatek/mt76/mt7915/mt7915.h | 442 ++++ .../net/wireless/mediatek/mt76/mt7915/pci.c | 165 ++ .../net/wireless/mediatek/mt76/mt7915/regs.h | 344 +++ 17 files changed, 7634 insertions(+) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/Kconfig create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/Makefile create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/dma.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/init.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mac.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mac.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/main.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mcu.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/pci.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/regs.h
drivers/net/wireless/mediatek/mt76/Kconfig +1 -0
@@ -24,3 +24,4 @@ source "drivers/net/wireless/mediatek/mt76/mt76x0/Kconfig" source "drivers/net/wireless/mediatek/mt76/mt76x2/Kconfig" source "drivers/net/wireless/mediatek/mt76/mt7603/Kconfig" source "drivers/net/wireless/mediatek/mt76/mt7615/Kconfig" +source "drivers/net/wireless/mediatek/mt76/mt7915/Kconfig"
drivers/net/wireless/mediatek/mt76/Makefile +1 -0
@@ -27,3 +27,4 @@ obj-$(CONFIG_MT76x0_COMMON) += mt76x0/ obj-$(CONFIG_MT76x2_COMMON) += mt76x2/ obj-$(CONFIG_MT7603E) += mt7603/ obj-$(CONFIG_MT7615E) += mt7615/ +obj-$(CONFIG_MT7915E) += mt7915/
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig new file +13 -0
@@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-only +config MT7915E + tristate "MediaTek MT7915E (PCIe) support" + select MT76_CORE + depends on MAC80211 + depends on PCI + help + This adds support for MT7915-based wireless PCIe devices, + which support concurrent dual-band operation at both 5GHz + and 2.4GHz IEEE 802.11ax 4x4:4SS 1024-QAM, 160MHz channels, + OFDMA, spatial reuse and dual carrier modulation. + + To compile this driver as a module, choose M here.
drivers/net/wireless/mediatek/mt76/mt7915/Makefile new file +6 -0
@@ -0,0 +1,6 @@ +#SPDX-License-Identifier: ISC + +obj-$(CONFIG_MT7915E) += mt7915e.o + +mt7915e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \ + debugfs.o
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c new file +245 -0
245 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/dma.c new file +283 -0
283 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c new file +125 -0
125 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h new file +78 -0
78 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/init.c new file +392 -0
392 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mac.c new file +1310 -0
1,310 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mac.h new file +330 -0
330 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/main.c new file +743 -0
210 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c new file +2319 -0
2,319 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h new file +837 -0
837 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h new file +442 -0
442 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/pci.c new file +165 -0
165 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/regs.h new file +344 -0
344 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 5 lines
2.18.0 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Part of the diff is not shown here. View the raw message.
Re: [PATCH 06/16] mt76: add mac80211 driver for MT7915 PCIe-based chipsets
Quoted 15 lines · Ryder Lee
Add support for the MediaTek latest generation IEEE 802.11ax 4x4 device MT7915E, which supports concurrent dual-band operation at both 5GHz and 2.4GHz.
Note that this patch just add basic part and will add more HE capabilities support in the further patches.
The driver supports AP, Station, Mesh and monitor mode.
Signed-off-by Ryder Lee <[email protected]>Signed-off-by Shayne Chen <[email protected]>Signed-off-by Chih-Min Chen <[email protected]>Tested-by Evelyn Tsai <[email protected]>Acked-by Yiwei Chung <[email protected]>Acked-by YF Luo <[email protected]>
[...]
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig line 1
Quoted 4 lines
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig new file +1
-0@@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-only
Same as in my earlier comment today: mt76 is ISC, why are you using GPL?
Signature · 1 line
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ryder Lee
maintainerRe: [PATCH 06/16] mt76: add mac80211 driver for MT7915 PCIe-based chipsets
Quoted 18 lines · Kalle Valo
Quoted 7 lines · Ryder Lee
Add support for the MediaTek latest generation IEEE 802.11ax 4x4 device MT7915E, which supports concurrent dual-band operation at both 5GHz and 2.4GHz.
Note that this patch just add basic part and will add more HE capabilities support in the further patches.
Quoted 8 lines
The driver supports AP, Station, Mesh and monitor mode.
Signed-off-by Ryder Lee <[email protected]>Signed-off-by Shayne Chen <[email protected]>Signed-off-by Chih-Min Chen <[email protected]>Tested-by Evelyn Tsai <[email protected]>Acked-by Yiwei Chung <[email protected]>Acked-by YF Luo <[email protected]>
Quoted 8 lines
[...]
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig line 1
Quoted 4 lines
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig new file +1
-0@@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-onlySame as in my earlier comment today: mt76 is ISC, why are you using GPL?
My bad. I copy/paste this from another driver. Will fix it.
Ryder Lee
maintainerPATCH 7/16 mt76: mt7915: implement HE per-rate tx power support
In reply to Ryder LeeUse firmware support for applying per-rate limit and power offsets. This can support all HE RU types.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 56 +++++++++ .../wireless/mediatek/mt76/mt7915/eeprom.c | 111 ++++++++++++++++++ .../wireless/mediatek/mt76/mt7915/eeprom.h | 47 ++++++++ .../net/wireless/mediatek/mt76/mt7915/init.c | 2 + .../net/wireless/mediatek/mt76/mt7915/main.c | 7 ++ .../net/wireless/mediatek/mt76/mt7915/mcu.c | 49 ++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 1 + .../wireless/mediatek/mt76/mt7915/mt7915.h | 6 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 26 ++++ 9 files changed, 305 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +56 -0
@@ -219,6 +219,60 @@ mt7915_queues_read(struct seq_file *s, void *data)return 0 ; } +static void +mt7915_puts_rate_txpower (struct seq_file *s,s8 *delta, +s8 txpower_cur,int band) +{ +static const char *const sku_group_name[] = { +"CCK" ,"OFDM" ,"HT20" ,"HT40" , +"VHT20" ,"VHT40" ,"VHT80" ,"VHT160" , +"RU26" ,"RU52" ,"RU106" ,"RU242/SU20" , +"RU484/SU40" ,"RU996/SU80" ,"RU2x996/SU160" + }; +s8 txpower[MT7915_SKU_RATE_NUM ]; +int i, idx =0 ; + +for (i =0 ; i <MT7915_SKU_RATE_NUM ; i++) + txpower[i] = txpower_cur + delta[i] /2 ; + +for (i =0 ; i <MAX_SKU_RATE_GROUP_NUM ; i++) { +const struct sku_group *sku = &mt7915_sku_groups[i]; +u32 offset = sku->offset[band]; + +if (!offset) { + idx += sku->len; +continue ; + } + +mt76_seq_puts_array (s, sku_group_name[i], + txpower + idx, sku->len); + idx += sku->len; + } +} + +static int +mt7915_read_rate_txpower (struct seq_file *s,void *data) +{ +struct mt7915_dev *dev =dev_get_drvdata (s->private); +struct mt76_phy *mphy = &dev->mphy; +enum nl80211_band band = mphy->chandef.chan->band; +s8 *delta = dev->rate_power[band]; + +seq_puts (s,"Band 0:\n" ); +mt7915_puts_rate_txpower (s, delta, mphy->txpower_cur, band); + +if (dev->mt76.phy2) { + mphy = dev->mt76.phy2; + band = mphy->chandef.chan->band; + delta = dev->rate_power[band]; + +seq_puts (s,"Band 1:\n" ); +mt7915_puts_rate_txpower (s, delta, mphy->txpower_cur, band); + } + +return 0 ; +} +int mt7915_init_debugfs (struct mt7915_dev *dev) {struct dentry *dir;
@@ -240,6 +294,8 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)debugfs_create_file ("ser_trigger" ,0200 , dir, dev, &fops_ser_trigger);debugfs_create_devm_seqfile (dev->mt76.dev,"temperature" , dir, mt7915_read_temperature); +debugfs_create_devm_seqfile (dev->mt76.dev,"txpower_sku" , dir, + mt7915_read_rate_txpower);return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +111 -0
114 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h +47 -0
57 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/init.c +2 -0
@@ -85,6 +85,8 @@ static void mt7915_init_txpower(struct mt7915_dev *dev) {mt7915_init_txpower_band (dev, &dev->mphy.sband_2g.sband);mt7915_init_txpower_band (dev, &dev->mphy.sband_5g.sband); + +mt7915_eeprom_init_sku (dev); }static void mt7915_init_work (struct work_struct *work)
drivers/net/wireless/mediatek/mt76/mt7915/main.c +7 -0
@@ -42,6 +42,7 @@ static int mt7915_start(struct ieee80211_hw *hw)mt7915_mcu_set_scs (dev,1 , true); } +mt7915_mcu_set_sku_en (phy, true);mt7915_mcu_set_chan_info (phy,MCU_EXT_CMD_SET_RX_PATH );set_bit (MT76_STATE_RUNNING , &phy->mt76->state);
@@ -327,6 +328,12 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)ieee80211_wake_queues (hw); } +if (changed &IEEE80211_CONF_CHANGE_POWER ) { + ret =mt7915_mcu_set_sku (phy); +if (ret) +return ret; + } +mutex_lock (&dev->mt76.mutex);if (changed &IEEE80211_CONF_CHANGE_MONITOR ) {
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +49 -0
55 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +1 -0
@@ -203,6 +203,7 @@ enum {MCU_EXT_CMD_MAC_INIT_CTRL =0x46 ,MCU_EXT_CMD_RX_HDR_TRANS =0x47 ,MCU_EXT_CMD_SET_RX_PATH =0x4e , +MCU_EXT_CMD_TX_POWER_FEATURE_CTRL =0x58 ,MCU_EXT_CMD_SET_SER_TRIGGER =0x81 ,MCU_EXT_CMD_SCS_CTRL =0x82 , MCU_EXT_CMD_RATE_CTRL = 0x87,
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +6 -0
@@ -38,6 +38,7 @@#define MT7915_5G_RATE_DEFAULT 0x4b/* OFDM 6M */ #define MT7915_2G_RATE_DEFAULT 0x0/* CCK 1M */ +#define MT7915_SKU_RATE_NUM 161struct mt7915_vif ;struct mt7915_sta ;
@@ -162,6 +163,8 @@ struct mt7915_dev {spinlock_t token_lock;struct idr token; +s8 **rate_power;/* TODO: use mt76_rate_power */ +u8 mac_work_count;bool fw_debug; };
@@ -269,6 +272,7 @@ u32 mt7915_eeprom_read(struct mt7915_dev *dev, u32 offset);int mt7915_eeprom_get_target_power (struct mt7915_dev *dev,struct ieee80211_channel *chan,u8 chain_idx); +void mt7915_eeprom_init_sku (struct mt7915_dev *dev);int mt7915_dma_init (struct mt7915_dev *dev);void mt7915_dma_prefetch (struct mt7915_dev *dev);void mt7915_dma_cleanup (struct mt7915_dev *dev);
@@ -304,6 +308,8 @@ int mt7915_mcu_set_scs(struct mt7915_dev *dev, u8 band, bool enable);int mt7915_mcu_set_ser (struct mt7915_dev *dev,u8 action,u8 set,u8 band);int mt7915_mcu_set_rts_thresh (struct mt7915_phy *phy,u32 val);int mt7915_mcu_set_pm (struct mt7915_dev *dev,int band,int enter); +int mt7915_mcu_set_sku_en (struct mt7915_phy *phy,bool enable); +int mt7915_mcu_set_sku (struct mt7915_phy *phy);int mt7915_mcu_set_fcc5_lpn (struct mt7915_dev *dev,int val);int mt7915_mcu_set_pulse_th (struct mt7915_dev *dev,const struct mt7915_dfs_pulse *pulse);
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +26 -0
@@ -74,6 +74,29 @@ static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)return IRQ_HANDLED ; } +static int +mt7915_alloc_device (struct pci_dev *pdev,struct mt7915_dev *dev) +{ +#define NUM_BANDS 2 +int i; +s8 **sku; + + sku =devm_kzalloc (&pdev->dev,NUM_BANDS *sizeof (*sku),GFP_KERNEL ); +if (!sku) +return -ENOMEM ; + +for (i =0 ; i <NUM_BANDS ; i++) { + sku[i] =devm_kzalloc (&pdev->dev,MT7915_SKU_RATE_NUM * +sizeof (**sku),GFP_KERNEL ); +if (!sku[i]) +return -ENOMEM ; + } + dev->rate_power = sku; + + +return 0 ; +} +static int mt7915_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) {
@@ -117,6 +140,9 @@ static int mt7915_pci_probe(struct pci_dev *pdev,return -ENOMEM ; dev = container_of(mdev, struct mt7915_dev, mt76); + ret =mt7915_alloc_device (pdev, dev); +if (ret) +return ret;mt76_mmio_init (&dev->mt76,pcim_iomap_table (pdev)[0 ]); mdev->rev = (mt7915_l1_rr(dev, MT_HW_CHIPID) << 16) |
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 8/16 mt76: mt7915: add offloading Tx AMSDU support
In reply to Ryder LeeAdd module parameter to enable hw_tx_amsdu.
--- .../net/wireless/mediatek/mt76/mt7915/init.c | 5 ++- .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 40 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 20 ++++++++++ .../wireless/mediatek/mt76/mt7915/mt7915.h | 1 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 8 ++++ 6 files changed, 76 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +4 -1
@@ -236,7 +236,10 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)ieee80211_hw_set (hw,HAS_RATE_CONTROL ); - hw->max_tx_fragments =4 ; +if (phy->dev->hw_tx_amsdu) + hw->max_tx_fragments =1 ; +else + hw->max_tx_fragments =4 ; } static void
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +3 -1
@@ -524,7 +524,9 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi, txwi[7 ] =cpu_to_le32 (val); val =FIELD_PREP (MT_TXD3_REM_TX_COUNT , tx_count); -if (ieee80211_is_data_qos (fc)) { +if (dev->hw_tx_amsdu &&ieee80211_is_data_qos (fc)) { + txwi[7 ] |=MT_TXD7_HW_AMSDU ; + }else if (ieee80211_is_data_qos (fc)) { seqno =IEEE80211_SEQ_TO_SN (le16_to_cpu (hdr->seq_ctrl)); val |=MT_TXD3_SN_VALID ; }else if (ieee80211_is_back_req (fc)) {
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +40 -0
@@ -85,6 +85,8 @@ struct mt7915_fw_region {#define to_wcid_lo (id) FIELD_GET(GENMASK(7, 0), (u16)id)#define to_wcid_hi (id) FIELD_GET(GENMASK(9, 8), (u16)id) +#define HW_TX_AMSDU_MAX_NUM 8 +static enum mt7915_cipher_type mt7915_mcu_get_cipher (int cipher) {
@@ -786,6 +788,23 @@ mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, ra->fast_interval =cpu_to_le32 (100 ); } +static void +mt7915_mcu_bss_hw_amsdu_tlv (struct sk_buff *skb) +{ +#define TXD_CMP_MAP1 GENMASK(15, 0) +#define TXD_CMP_MAP2 (GENMASK(31, 0) & ~BIT(23)) +struct bss_info_hw_amsdu *amsdu; +struct tlv *tlv; + + tlv =mt7915_mcu_add_tlv (skb,BSS_INFO_HW_AMSDU ,sizeof (*amsdu)); + + amsdu = (struct bss_info_hw_amsdu *)tlv; + amsdu->cmp_bitmap_0 =cpu_to_le32 (TXD_CMP_MAP1 ); + amsdu->cmp_bitmap_1 =cpu_to_le32 (TXD_CMP_MAP2 ); + amsdu->trig_thres =cpu_to_le16 (2 ); + amsdu->enable = true; +} +static void mt7915_mcu_bss_ext_tlv (struct sk_buff *skb,struct mt7915_vif *mvif) {
@@ -861,6 +880,9 @@ int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,mt7915_mcu_bss_bmc_tlv (skb, phy);mt7915_mcu_bss_ra_tlv (skb, vif, phy); +if (phy->dev->hw_tx_amsdu) +mt7915_mcu_bss_hw_amsdu_tlv (skb); +if (mvif->omac_idx >HW_BSSID_MAX )mt7915_mcu_bss_ext_tlv (skb, mvif);else
@@ -1145,6 +1167,24 @@ mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb, tlv =mt7915_mcu_add_tlv (skb,STA_REC_HT ,sizeof (*ht)); ht = (struct sta_rec_ht *)tlv; ht->ht_cap =cpu_to_le16 (sta->ht_cap.cap); + +/* starec hw amsdu */ +if (dev->hw_tx_amsdu) { +struct sta_rec_amsdu *amsdu; +int max_amsdu_len = sta->max_amsdu_len; + + tlv =mt7915_mcu_add_tlv (skb,STA_REC_HW_AMSDU , +sizeof (*amsdu)); + amsdu = (struct sta_rec_amsdu *)tlv; + amsdu->max_amsdu_num =HW_TX_AMSDU_MAX_NUM ; + amsdu->amsdu_en = true; + +if (sta->max_rc_amsdu_len) + max_amsdu_len =min_t (int, max_amsdu_len, + sta->max_rc_amsdu_len); + + amsdu->max_mpdu_size = max_amsdu_len; + } }/* starec vht */
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +20 -0
@@ -396,6 +396,16 @@ struct bss_info_ra {__le32 fast_interval; } __packed; +struct bss_info_hw_amsdu { +__le16 tag; +__le16 len; +__le32 cmp_bitmap_0; +__le32 cmp_bitmap_1; +__le16 trig_thres; +u8 enable; +u8 rsv; +} __packed; +struct bss_info_bcn {__le16 tag;__le16 len;
@@ -659,6 +669,15 @@ struct sta_rec_ba {__le16 winsize; } __packed; +struct sta_rec_amsdu { +__le16 tag; +__le16 len; +u8 max_amsdu_num; +u8 max_mpdu_size; +u8 amsdu_en; +u8 rsv; +} __packed; +struct sec_key {u8 cipher_id;u8 cipher_len;
@@ -796,6 +815,7 @@ enum {sizeof (struct sta_rec_ba ) + \sizeof (struct sta_rec_vht ) + \sizeof (struct tlv ) + \ +sizeof (struct sta_rec_amsdu ) + \sizeof (struct sta_rec_sec ) + \sizeof (struct sta_rec_ra ) + \ MT7915_WTBL_UPDATE_MAX_SIZE)
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +1 -0
@@ -167,6 +167,7 @@ struct mt7915_dev {u8 mac_work_count;bool fw_debug; +bool hw_tx_amsdu; };enum {
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +8 -0
@@ -12,6 +12,10 @@#include "mac.h" #include "../trace.h" +static bool hw_tx_amsdu; +module_param_named (enable_hw_tx_amsdu, hw_tx_amsdu, bool,0644 ); +MODULE_PARM_DESC (enable_hw_tx_amsdu,"enable Hardware Tx AMSDU" ); +static const struct pci_device_id mt7915_pci_device_table[] = { {PCI_DEVICE (0x14c3 ,0x7915 ) }, { },
@@ -149,6 +153,10 @@ static int mt7915_pci_probe(struct pci_dev *pdev, (mt7915_l1_rr (dev,MT_HW_REV ) &0xff );dev_dbg (mdev->dev,"ASIC revision: %04x\n" , mdev->rev); +/* TODO: more hw capabilities */ +if (hw_tx_amsdu) + dev->hw_tx_amsdu = true; +/* master switch of PCIe tnterrupt enable */ mt7915_l1_wr (dev,MT_PCIE_MAC_INT_ENABLE ,0xff );
Signature · 1 line
2.18.0
Re: [PATCH 08/16] mt76: mt7915: add offloading Tx AMSDU support
Quoted 1 line · Ryder Lee
Add module parameter to enable
hw_tx_amsdu.
Why is a module parameter needed? And why is it not enabled by default?
Signature · 6 lines
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Ryder Lee
maintainerRe: [PATCH 08/16] mt76: mt7915: add offloading Tx AMSDU support
Quoted 6 lines · Kalle Valo
Quoted 1 line · Ryder Lee
Add module parameter to enable
hw_tx_amsdu.Why is a module parameter needed? And why is it not enabled by default?
This is still WIP, so make it optional. But I will drop this one until we're ready.
Ryder
_______________________________________________
Linux-mediatek mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-mediatek
Re: [PATCH 08/16] mt76: mt7915: add offloading Tx AMSDU support
Quoted 10 lines · Ryder Lee
Quoted 6 lines · Kalle Valo
Quoted 1 line · Ryder Lee
Add module parameter to enable
hw_tx_amsdu.Why is a module parameter needed? And why is it not enabled by default?
This is still WIP, so make it optional. But I will drop this one until we're ready.
What do you mean? Are you saying that these patches are still RFC and the final patches will not have the module parameter?
Signature · 1 line
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ryder Lee
maintainerPATCH 9/16 mt76: mt7915: register HE capabilities for each interface
In reply to Ryder LeeThe capabilities for the HE interfaces are generated from the capabilities reported by the firmware.
This should move to common file once we have other HE devices support.
--- .../net/wireless/mediatek/mt76/mt7915/init.c | 194 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/main.c | 1 + .../net/wireless/mediatek/mt76/mt7915/mcu.c | 9 + .../net/wireless/mediatek/mt76/mt7915/mcu.h | 3 + .../wireless/mediatek/mt76/mt7915/mt7915.h | 2 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 13 ++ 6 files changed, 222 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/init.c +194 -0
@@ -242,6 +242,198 @@ mt7915_init_wiphy(struct ieee80211_hw *hw) hw->max_tx_fragments =4 ; } +static void +mt7915_gen_ppe_thresh (struct mt7915_dev *dev,u8 *he_ppet) +{ +int ru, nss, max_nss =1 , max_ru =3 ; +u8 bit =7 , ru_bit_mask =0x7 ; +u8 ppet16_ppet8_ru3_ru0[] = {0x1c ,0xc7 ,0x71 }; + + he_ppet[0 ] = max_nss &IEEE80211_PPE_THRES_NSS_MASK ; + he_ppet[0 ] |= (ru_bit_mask << +IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS ) & +IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK ; + +for (nss =0 ; nss <= max_nss; nss++) { +for (ru =0 ; ru < max_ru; ru++) { +u8 val; +int i; + +if (!(ru_bit_mask &BIT (ru))) +continue ; + + val = (ppet16_ppet8_ru3_ru0[nss] >> (ru *6 )) & +0x3f ; + val = ((val >>3 ) &0x7 ) | ((val &0x7 ) <<3 ); +for (i =5 ; i >=0 ; i--) { + he_ppet[bit /8 ] |= + ((val >> i) &0x1 ) << ((bit %8 )); + bit++; + } + } + } +} + +static int +mt7915_init_he_caps (struct mt7915_dev *dev,enum nl80211_band band, +struct ieee80211_sband_iftype_data *data) +{ +int i, idx =0 ; +int nss =hweight8 (dev->phy.chainmask); +u16 mcs_map =0 ; + +for (i =0 ; i <8 ; i++) { +if (i < nss) + mcs_map |= (IEEE80211_HE_MCS_SUPPORT_0_11 << (i *2 )); +else + mcs_map |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i *2 )); + } + +for (i =0 ; i <NUM_NL80211_IFTYPES ; i++) { +struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; +struct ieee80211_he_cap_elem *he_cap_elem = + &he_cap->he_cap_elem; +struct ieee80211_he_mcs_nss_supp *he_mcs = + &he_cap->he_mcs_nss_supp; + +switch (i) { +case NL80211_IFTYPE_STATION : +case NL80211_IFTYPE_AP : +#ifdef CONFIG_MAC80211_MESH +case NL80211_IFTYPE_MESH_POINT : +#endif +break ; +default : +continue ; + } + + data[idx].types_mask =BIT (i); + he_cap->has_he = true; + + he_cap_elem->mac_cap_info[0 ] = +IEEE80211_HE_MAC_CAP0_HTC_HE ; + he_cap_elem->mac_cap_info[1 ] = +IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_0US | +IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_1 ; + he_cap_elem->mac_cap_info[2 ] = +IEEE80211_HE_MAC_CAP2_BSR ; + he_cap_elem->mac_cap_info[3 ] = +IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED ; + he_cap_elem->mac_cap_info[4 ] = +IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU ; + +if (band ==NL80211_BAND_2GHZ ) + he_cap_elem->phy_cap_info[0 ] = +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G ; +else if (band ==NL80211_BAND_5GHZ ) + he_cap_elem->phy_cap_info[0 ] = +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G ; + + he_cap_elem->phy_cap_info[1 ] = +IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD ; + he_cap_elem->phy_cap_info[2 ] = + IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US | +IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ | +IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ ; + +/* TODO: TxBF & MU & MESH */ + +switch (i) { +case NL80211_IFTYPE_AP : + he_cap_elem->mac_cap_info[0 ] |= +IEEE80211_HE_MAC_CAP0_TWT_RES ; + he_cap_elem->mac_cap_info[4 ] |= +IEEE80211_HE_MAC_CAP4_BQR ; + he_cap_elem->phy_cap_info[3 ] |= +IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK | +IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK ; + he_cap_elem->phy_cap_info[6 ] |= +IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT ; + he_cap_elem->phy_cap_info[9 ] |= +IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU ; +break ; +case NL80211_IFTYPE_STATION : + he_cap_elem->mac_cap_info[0 ] |= +IEEE80211_HE_MAC_CAP0_TWT_REQ ; + he_cap_elem->mac_cap_info[3 ] |= +IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED ; + +if (band ==NL80211_BAND_2GHZ ) + he_cap_elem->phy_cap_info[0 ] |= +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G ; +else if (band ==NL80211_BAND_5GHZ ) + he_cap_elem->phy_cap_info[0 ] |= +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G ; + + he_cap_elem->phy_cap_info[1 ] |= +IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A ; + he_cap_elem->phy_cap_info[8 ] |= +IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | +IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | +IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU ; + he_cap_elem->phy_cap_info[9 ] |= +IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU ; +break ; +#ifdef CONFIG_MAC80211_MESH +case NL80211_IFTYPE_MESH_POINT : +break ; +#endif + } + + he_mcs->rx_mcs_80 =cpu_to_le16 (mcs_map); + he_mcs->tx_mcs_80 =cpu_to_le16 (mcs_map); + +/* DBDC mode */ +if (dev->chainmask != dev->phy.chainmask) + mcs_map =GENMASK (15 ,0 ); + + he_mcs->rx_mcs_160 =cpu_to_le16 (mcs_map); + he_mcs->tx_mcs_160 =cpu_to_le16 (mcs_map); + he_mcs->rx_mcs_80p80 =cpu_to_le16 (mcs_map); + he_mcs->tx_mcs_80p80 =cpu_to_le16 (mcs_map); + +if (he_cap_elem->phy_cap_info[6 ] & +IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT ) { +mt7915_gen_ppe_thresh (dev, he_cap->ppe_thres); + }else { + he_cap_elem->phy_cap_info[9 ] |= +IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US ; + } + idx++; + } + +return idx; +} + +void mt7915_set_stream_he_caps (struct mt7915_dev *dev) +{ +struct ieee80211_sband_iftype_data *data; +struct ieee80211_supported_band *band; +struct mt76_dev *mdev = &dev->mt76; +int n; + +if (mdev->cap.has_2ghz) { + data = dev->iftype[NL80211_BAND_2GHZ ]; + n =mt7915_init_he_caps (dev,NL80211_BAND_2GHZ , data); + + band = &mdev->phy.sband_2g.sband; + band->iftype_data = data; + band->n_iftype_data = n; + } + +if (mdev->cap.has_5ghz) { + data = dev->iftype[NL80211_BAND_5GHZ ]; + n =mt7915_init_he_caps (dev,NL80211_BAND_5GHZ , data); + + band = &mdev->phy.sband_5g.sband; + band->iftype_data = data; + band->n_iftype_data = n; + } +} +static void mt7915_cap_dbdc_enable (struct mt7915_dev *dev) {
@@ -259,6 +451,7 @@ mt7915_cap_dbdc_enable(struct mt7915_dev *dev) dev->mphy.hw->wiphy->available_antennas_tx = dev->phy.chainmask;mt76_set_stream_caps (&dev->mt76, true); +mt7915_set_stream_he_caps (dev); } static void
@@ -274,6 +467,7 @@ mt7915_cap_dbdc_disable(struct mt7915_dev *dev) dev->mphy.hw->wiphy->available_antennas_tx = dev->chainmask;mt76_set_stream_caps (&dev->mt76, true); +mt7915_set_stream_he_caps (dev); }int mt7915_register_ext_phy (struct mt7915_dev *dev)
drivers/net/wireless/mediatek/mt76/mt7915/main.c +1 -0
@@ -693,6 +693,7 @@ mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) phy->chainmask = tx_ant;mt76_set_stream_caps (&dev->mt76, true); +mt7915_set_stream_he_caps (dev);mutex_unlock (&dev->mt76.mutex);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +9 -0
@@ -139,11 +139,13 @@ mt7915_get_phy_mode(struct mt7915_dev *dev, struct ieee80211_vif *vif, {struct ieee80211_sta_ht_cap *ht_cap;struct ieee80211_sta_vht_cap *vht_cap; +const struct ieee80211_sta_he_cap *he_cap;u8 mode =0 ;if (sta) { ht_cap = &sta->ht_cap; vht_cap = &sta->vht_cap; + he_cap = &sta->he_cap; }else {struct ieee80211_supported_band *sband;
@@ -154,6 +156,7 @@ mt7915_get_phy_mode(struct mt7915_dev *dev, struct ieee80211_vif *vif, ht_cap = &sband->ht_cap; vht_cap = &sband->vht_cap; + he_cap =ieee80211_get_he_iftype_cap (sband, vif->type); }if (band ==NL80211_BAND_2GHZ ) {
@@ -161,6 +164,9 @@ mt7915_get_phy_mode(struct mt7915_dev *dev, struct ieee80211_vif *vif,if (ht_cap->ht_supported) mode |=PHY_MODE_GN ; + +if (he_cap->has_he) + mode |=PHY_MODE_AX_24G ; }else if (band ==NL80211_BAND_5GHZ ) { mode |=PHY_MODE_A ;
@@ -169,6 +175,9 @@ mt7915_get_phy_mode(struct mt7915_dev *dev, struct ieee80211_vif *vif,if (vht_cap->vht_supported) mode |=PHY_MODE_AC ; + +if (he_cap->has_he) + mode |=PHY_MODE_AX_5G ; }return mode;
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +3 -0
@@ -835,6 +835,9 @@ enum {#define PHY_MODE_GN BIT(3)#define PHY_MODE_AN BIT(4)#define PHY_MODE_AC BIT(5) +#define PHY_MODE_AX_24G BIT(6) +#define PHY_MODE_AX_5G BIT(7) +#define PHY_MODE_AX_6G BIT(8)#define MODE_CCK BIT(0)#define MODE_OFDM BIT(1)
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -0
@@ -163,6 +163,7 @@ struct mt7915_dev {spinlock_t token_lock;struct idr token; +struct ieee80211_sband_iftype_data **iftype;s8 **rate_power;/* TODO: use mt76_rate_power */ u8 mac_work_count;
@@ -443,6 +444,7 @@ void mt7915_txp_skb_unmap(struct mt76_dev *dev, struct mt76_txwi_cache *txwi);int mt76_dfs_start_rdd (struct mt7915_dev *dev,bool force);int mt7915_dfs_init_radar_detector (struct mt7915_phy *phy); +void mt7915_set_stream_he_caps (struct mt7915_dev *dev);void mt7915_update_channel (struct mt76_dev *mdev);int mt7915_init_debugfs (struct mt7915_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +13 -0
@@ -82,6 +82,7 @@ static int mt7915_alloc_device(struct pci_dev *pdev, struct mt7915_dev *dev) { #define NUM_BANDS 2 + struct ieee80211_sband_iftype_data **iftype;int i;s8 **sku;
@@ -97,6 +98,18 @@ mt7915_alloc_device(struct pci_dev *pdev, struct mt7915_dev *dev) } dev->rate_power = sku; + iftype =devm_kzalloc (&pdev->dev,NUM_BANDS *sizeof (*iftype), +GFP_KERNEL ); +if (!iftype) +return -ENOMEM ; + +for (i =0 ; i <NUM_BANDS ; i++) { + iftype[i] =devm_kzalloc (&pdev->dev,NUM_NL80211_IFTYPES * +sizeof (**iftype),GFP_KERNEL ); +if (!iftype[i]) +return -ENOMEM ; + } + dev->iftype = iftype;return 0 ; }
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 10/16 mt76: mt7915: add HE bss_conf support for interfaces
In reply to Ryder LeeAdd basic HE BSS's info for interfaces. As for the advanced features will be added gradually in the future patches.
(i.e. BSS color, TWT, spatial reuse and OFDMA)
--- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 89 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7915/mcu.h | 11 +++ 2 files changed, 99 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +88 -1
@@ -746,6 +746,47 @@ mt7915_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif) omac->hw_bss_idx = idx; } +struct mt7915_he_obss_narrow_bw_ru_data { +bool tolerated; +}; + +static void mt7915_check_he_obss_narrow_bw_ru_iter (struct wiphy *wiphy, +struct cfg80211_bss *bss, +void *_data) +{ +struct mt7915_he_obss_narrow_bw_ru_data *data = _data; +const struct element *elem; + + elem =cfg80211_find_elem (WLAN_EID_EXT_CAPABILITY , bss->ies->data, + bss->ies->len); + +if (!elem || elem->datalen <10 || + !(elem->data[10 ] & +WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT )) + data->tolerated = false; +} + +static bool mt7915_check_he_obss_narrow_bw_ru (struct ieee80211_hw *hw, +struct ieee80211_vif *vif) +{ +struct mt7915_he_obss_narrow_bw_ru_data iter_data = { + .tolerated = true, + }; + +if (!(vif->bss_conf.chandef.chan->flags &IEEE80211_CHAN_RADAR )) +return false; + +cfg80211_bss_iter (hw->wiphy, &vif->bss_conf.chandef, + mt7915_check_he_obss_narrow_bw_ru_iter, + &iter_data); + +/* +* If there is at least one AP on radar channel that cannot +* tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU. +*/ +return !iter_data.tolerated; +} +static void mt7915_mcu_bss_rfch_tlv (struct sk_buff *skb,struct ieee80211_vif *vif,struct mt7915_phy *phy)
@@ -768,7 +809,20 @@ mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, ch->center_ch1 =ieee80211_frequency_to_channel (freq2); } - ch->he_all_disable = true; +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; + + ch->he_ru26_block = +mt7915_check_he_obss_narrow_bw_ru (mphy->hw, vif); + ch->he_all_disable = false; + }else { + ch->he_all_disable = true; + } } static void
@@ -797,6 +851,36 @@ mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, ra->fast_interval =cpu_to_le32 (100 ); } +static void +mt7915_mcu_bss_he_tlv (struct sk_buff *skb,struct ieee80211_vif *vif, +struct mt7915_phy *phy) +{ +#define DEFAULT_HE_PE_DURATION 4 +#define DEFAULT_HE_DURATION_RTS_THRES 1023 +struct cfg80211_chan_def *chandef = &phy->mt76->chandef; +enum nl80211_band band = chandef->chan->band; +struct ieee80211_sta_he_cap *cap; +struct bss_info_he *he; +struct tlv *tlv; + + cap = &phy->dev->iftype[band][vif->type].he_cap; + + tlv =mt7915_mcu_add_tlv (skb,BSS_INFO_HE_BASIC ,sizeof (*he)); + + he = (struct bss_info_he *)tlv; + he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext *4 ; +if (!he->he_pe_duration) + he->he_pe_duration =DEFAULT_HE_PE_DURATION ; + + he->he_rts_thres =cpu_to_le16 (vif->bss_conf.frame_time_rts_th *32 ); +if (!he->he_rts_thres) + he->he_rts_thres =cpu_to_le16 (DEFAULT_HE_DURATION_RTS_THRES ); + + he->max_nss_mcs[CMD_HE_MCS_BW80 ] = cap->he_mcs_nss_supp.tx_mcs_80; + he->max_nss_mcs[CMD_HE_MCS_BW160 ] = cap->he_mcs_nss_supp.tx_mcs_160; + he->max_nss_mcs[CMD_HE_MCS_BW8080 ] = cap->he_mcs_nss_supp.tx_mcs_80p80; +} +static void mt7915_mcu_bss_hw_amsdu_tlv (struct sk_buff *skb) {
@@ -889,6 +973,9 @@ int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,mt7915_mcu_bss_bmc_tlv (skb, phy);mt7915_mcu_bss_ra_tlv (skb, vif, phy); +if (vif->bss_conf.he_support) +mt7915_mcu_bss_he_tlv (skb, vif, phy); +if (phy->dev->hw_tx_amsdu)mt7915_mcu_bss_hw_amsdu_tlv (skb);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +11 -0
@@ -396,6 +396,17 @@ struct bss_info_ra {__le32 fast_interval; } __packed; + +struct bss_info_he { +__le16 tag; +__le16 len; +u8 he_pe_duration; +u8 vht_op_info_present; +__le16 he_rts_thres; +__le16 max_nss_mcs[CMD_HE_MCS_BW_NUM ]; +u8 rsv[6 ]; +} __packed; +struct bss_info_hw_amsdu {__le16 tag;__le16 len;
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 11/16 mt76: mt7915: add HE capabilities support for peers
In reply to Ryder LeeSet peer's bsic HE capabilities through starec.
--- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 196 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 100 +++++++++ 2 files changed, 296 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +196 -0
@@ -85,6 +85,8 @@ struct mt7915_fw_region {#define to_wcid_lo (id) FIELD_GET(GENMASK(7, 0), (u16)id)#define to_wcid_hi (id) FIELD_GET(GENMASK(9, 8), (u16)id) +#define HE_PHY (p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p) +#define HE_MAC (m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)#define HW_TX_AMSDU_MAX_NUM 8 static enum mt7915_cipher_type
@@ -1250,6 +1252,187 @@ mt7915_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, basic->qos = sta->wme; } +static void +mt7915_mcu_sta_he_tlv (struct sk_buff *skb,struct ieee80211_sta *sta) +{ +struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; +struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; +struct sta_rec_he *he; +struct tlv *tlv; +u32 cap =0 ; + + tlv =mt7915_mcu_add_tlv (skb,STA_REC_HE ,sizeof (*he)); + + he = (struct sta_rec_he *)tlv; + +if (elem->mac_cap_info[0 ] &IEEE80211_HE_MAC_CAP0_HTC_HE ) + cap |=STA_REC_HE_CAP_HTC ; + +if (elem->mac_cap_info[2 ] &IEEE80211_HE_MAC_CAP2_BSR ) + cap |=STA_REC_HE_CAP_BSR ; + +if (elem->mac_cap_info[3 ] &IEEE80211_HE_MAC_CAP3_OMI_CONTROL ) + cap |=STA_REC_HE_CAP_OM ; + +if (elem->mac_cap_info[4 ] &IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU ) + cap |=STA_REC_HE_CAP_AMSDU_IN_AMPDU ; + +if (elem->mac_cap_info[4 ] &IEEE80211_HE_MAC_CAP4_BQR ) + cap |=STA_REC_HE_CAP_BQR ; + +if (elem->phy_cap_info[0 ] & + (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G | +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G )) + cap |=STA_REC_HE_CAP_BW20_RU242_SUPPORT ; + +if (elem->phy_cap_info[1 ] & +IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD ) + cap |=STA_REC_HE_CAP_LDPC ; + +if (elem->phy_cap_info[1 ] & +IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US ) + cap |=STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI ; + +if (elem->phy_cap_info[2 ] & + IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US) + cap |=STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI ; + +if (elem->phy_cap_info[2 ] & +IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ ) + cap |=STA_REC_HE_CAP_LE_EQ_80M_TX_STBC ; + +if (elem->phy_cap_info[2 ] & +IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ ) + cap |=STA_REC_HE_CAP_LE_EQ_80M_RX_STBC ; + +if (elem->phy_cap_info[6 ] & +IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE ) + cap |=STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE ; + +if (elem->phy_cap_info[7 ] & +IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI ) + cap |=STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI ; + +if (elem->phy_cap_info[7 ] & +IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ ) + cap |=STA_REC_HE_CAP_GT_80M_TX_STBC ; + +if (elem->phy_cap_info[7 ] & +IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ ) + cap |=STA_REC_HE_CAP_GT_80M_RX_STBC ; + +if (elem->phy_cap_info[8 ] & +IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI ) + cap |=STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI ; + +if (elem->phy_cap_info[8 ] & +IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI ) + cap |=STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI ; + +if (elem->phy_cap_info[9 ] & +IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK ) + cap |=STA_REC_HE_CAP_TRIG_CQI_FK ; + +if (elem->phy_cap_info[9 ] & +IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU ) + cap |=STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242 ; + +if (elem->phy_cap_info[9 ] & +IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU ) + cap |=STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242 ; + + he->he_cap =cpu_to_le32 (cap); + +switch (sta->bandwidth) { +case IEEE80211_STA_RX_BW_160 : +if (elem->phy_cap_info[0 ] & +IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G ) + he->max_nss_mcs[CMD_HE_MCS_BW8080 ] = + he_cap->he_mcs_nss_supp.rx_mcs_80p80; + + he->max_nss_mcs[CMD_HE_MCS_BW160 ] = + he_cap->he_mcs_nss_supp.rx_mcs_160; +/* fall through */ +default : + he->max_nss_mcs[CMD_HE_MCS_BW80 ] = + he_cap->he_mcs_nss_supp.rx_mcs_80; +break ; + } + + he->t_frame_dur = +HE_MAC (CAP1_TF_MAC_PAD_DUR_MASK , elem->mac_cap_info[1 ]); + he->max_ampdu_exp = +HE_MAC (CAP3_MAX_AMPDU_LEN_EXP_MASK , elem->mac_cap_info[3 ]); + + he->bw_set = +HE_PHY (CAP0_CHANNEL_WIDTH_SET_MASK , elem->phy_cap_info[0 ]); + he->device_class = +HE_PHY (CAP1_DEVICE_CLASS_A , elem->phy_cap_info[1 ]); + he->punc_pream_rx = +HE_PHY (CAP1_PREAMBLE_PUNC_RX_MASK , elem->phy_cap_info[1 ]); + + he->dcm_tx_mode = +HE_PHY (CAP3_DCM_MAX_CONST_TX_MASK , elem->phy_cap_info[3 ]); + he->dcm_tx_max_nss = +HE_PHY (CAP3_DCM_MAX_TX_NSS_2 , elem->phy_cap_info[3 ]); + he->dcm_rx_mode = +HE_PHY (CAP3_DCM_MAX_CONST_RX_MASK , elem->phy_cap_info[3 ]); + he->dcm_rx_max_nss = +HE_PHY (CAP3_DCM_MAX_RX_NSS_2 , elem->phy_cap_info[3 ]); + he->dcm_rx_max_nss = +HE_PHY (CAP8_DCM_MAX_RU_MASK , elem->phy_cap_info[8 ]); + + he->pkt_ext =2 ; +} + +static void +mt7915_mcu_sta_muru_tlv (struct sk_buff *skb,struct ieee80211_sta *sta) +{ +struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; +struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; +struct sta_rec_muru *muru; +struct tlv *tlv; + + tlv =mt7915_mcu_add_tlv (skb,STA_REC_MURU ,sizeof (*muru)); + + muru = (struct sta_rec_muru *)tlv; + muru->cfg.ofdma_dl_en = true; + muru->cfg.ofdma_ul_en = true; + muru->cfg.mimo_dl_en = true; + muru->cfg.mimo_ul_en = true; + + muru->ofdma_dl.punc_pream_rx = +HE_PHY (CAP1_PREAMBLE_PUNC_RX_MASK , elem->phy_cap_info[1 ]); + muru->ofdma_dl.he_20m_in_40m_2g = +HE_PHY (CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G , elem->phy_cap_info[8 ]); + muru->ofdma_dl.he_20m_in_160m = +HE_PHY (CAP8_20MHZ_IN_160MHZ_HE_PPDU , elem->phy_cap_info[8 ]); + muru->ofdma_dl.he_80m_in_160m = +HE_PHY (CAP8_80MHZ_IN_160MHZ_HE_PPDU , elem->phy_cap_info[8 ]); + muru->ofdma_dl.lt16_sigb =0 ; + muru->ofdma_dl.rx_su_comp_sigb =0 ; + muru->ofdma_dl.rx_su_non_comp_sigb =0 ; + + muru->ofdma_ul.t_frame_dur = +HE_MAC (CAP1_TF_MAC_PAD_DUR_MASK , elem->mac_cap_info[1 ]); + muru->ofdma_ul.mu_cascading = +HE_MAC (CAP2_MU_CASCADING , elem->mac_cap_info[2 ]); + muru->ofdma_ul.uo_ra = +HE_MAC (CAP3_OFDMA_RA , elem->mac_cap_info[3 ]); + muru->ofdma_ul.he_2x996_tone =0 ; + muru->ofdma_ul.rx_t_frame_11ac =0 ; + + muru->mimo_dl.vht_mu_bfee = + !!(sta->vht_cap.cap &IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE ); + muru->mimo_dl.partial_bw_dl_mimo = +HE_PHY (CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO , elem->phy_cap_info[6 ]); + + muru->mimo_ul.full_ul_mimo = +HE_PHY (CAP2_UL_MU_FULL_MU_MIMO , elem->phy_cap_info[2 ]); + muru->mimo_ul.partial_ul_mimo = +HE_PHY (CAP2_UL_MU_PARTIAL_MU_MIMO , elem->phy_cap_info[2 ]); +} +static void mt7915_mcu_sta_tlv (struct mt7915_dev *dev,struct sk_buff *skb,struct ieee80211_sta *sta)
@@ -1293,6 +1476,14 @@ mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb, vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map; vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map; } + +/* starec he */ +if (sta->he_cap.has_he) +mt7915_mcu_sta_he_tlv (skb, sta); + +/* starec muru */ +if (sta->he_cap.has_he || sta->vht_cap.vht_supported) +mt7915_mcu_sta_muru_tlv (skb, sta); } static void
@@ -1494,6 +1685,11 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev, } } +if (sta->he_cap.has_he) { + ra->supp_mode |=MODE_HE ; + cap |=STA_CAP_HE ; + } + ra->sta_status =cpu_to_le32 (cap);switch (BIT (fls (ra->supp_mode) -1 )) {
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +100 -0
127 lines not on this page · raw message
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 12/16 mt76: mt7915: add Rx radiotap header support
In reply to Ryder Leemac80211 expects the definition of what HE rate info is available inside astruct prepended to the skb.
--- .../net/wireless/mediatek/mt76/mt7915/mac.c | 141 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mac.h | 16 ++ 2 files changed, 157 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +141 -0
@@ -9,6 +9,10 @@#define to_rssi (field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) +#define HE_BITS (f) cpu_to_le16(IEEE80211_RADIOTAP_HE_##f) +#define HE_PREP (f, m, v) le16_encode_bits(le32_get_bits(v, MT_CRXV_HE_##m),\ + IEEE80211_RADIOTAP_HE_##f) +static const struct mt7915_dfs_radar_spec etsi_radar_specs = { .pulse_th = {110 ,-10 ,-80 ,40 ,5200 ,128 ,5200 }, .radar_pattern = {
@@ -171,6 +175,138 @@ void mt7915_mac_sta_poll(struct mt7915_dev *dev)rcu_read_unlock (); } +static void +mt7915_mac_decode_he_radiotap_ru (struct mt76_rx_status *status, +struct mt7915_rxv *rxv, +struct ieee80211_radiotap_he *he) +{ +u32 ru_h, ru_l; +u8 ru, offs =0 ; + + ru_l =FIELD_GET (MT_PRXV_HE_RU_ALLOC_L ,le32_to_cpu (rxv->v[0 ])); + ru_h =FIELD_GET (MT_PRXV_HE_RU_ALLOC_H ,le32_to_cpu (rxv->v[1 ])); + ru = (u8)(ru_l | ru_h <<4 ); + + status->bw =RATE_INFO_BW_HE_RU ; + +switch (ru) { + case 0 ... 36: + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_26 ; + offs = ru; +break ; + case 37 ... 52: + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_52 ; + offs = ru -37 ; +break ; + case 53 ... 60: + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_106 ; + offs = ru -53 ; +break ; + case 61 ... 64: + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_242 ; + offs = ru -61 ; +break ; + case 65 ... 66: + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_484 ; + offs = ru -65 ; +break ; +case 67 : + status->he_ru =NL80211_RATE_INFO_HE_RU_ALLOC_996 ; +break ; +case 68 : + status->he_ru = NL80211_RATE_INFO_HE_RU_ALLOC_2x996; +break ; + } + + he->data1 |=HE_BITS (DATA1_BW_RU_ALLOC_KNOWN ); + he->data2 |=HE_BITS (DATA2_RU_OFFSET_KNOWN ) | +le16_encode_bits (offs, +IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET ); +} + +static void +mt7915_mac_decode_he_radiotap (struct sk_buff *skb, +struct mt76_rx_status *status, +struct mt7915_rxv *rxv) +{ +/* TODO: struct ieee80211_radiotap_he_mu */ +static const struct ieee80211_radiotap_he known = { + .data1 =HE_BITS (DATA1_DATA_MCS_KNOWN ) | +HE_BITS (DATA1_DATA_DCM_KNOWN ) | +HE_BITS (DATA1_STBC_KNOWN ) | +HE_BITS (DATA1_CODING_KNOWN ), + .data2 =HE_BITS (DATA2_GI_KNOWN ) | +HE_BITS (DATA2_TXBF_KNOWN ), + }; +struct ieee80211_radiotap_he *he =NULL ; +__le32 v2 = rxv->v[2 ]; +__le32 v11 = rxv->v[11 ]; +__le32 v14 = rxv->v[14 ]; +u32 ltf_size =le32_get_bits (v2,MT_CRXV_HE_LTF_SIZE ) +1 ; + + he =skb_push (skb,sizeof (known)); +memcpy (he, &known,sizeof (known)); + + he->data1 =HE_BITS (DATA1_LDPC_XSYMSEG_KNOWN ) | +HE_BITS (DATA1_DOPPLER_KNOWN ) | +HE_BITS (DATA1_BSS_COLOR_KNOWN ); + he->data2 =HE_BITS (DATA2_PE_DISAMBIG_KNOWN ) | +HE_BITS (DATA2_TXOP_KNOWN ); + + he->data3 =HE_PREP (DATA3_BSS_COLOR ,BSS_COLOR , v14) | +HE_PREP (DATA3_LDPC_XSYMSEG ,LDPC_EXT_SYM , v2); + he->data5 =HE_PREP (DATA5_PE_DISAMBIG ,PE_DISAMBIG , v2) | +le16_encode_bits (ltf_size, +IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE ); + he->data6 =HE_PREP (DATA6_TXOP ,TXOP_DUR , v14) | +HE_PREP (DATA6_DOPPLER ,DOPPLER , v14); + +switch (rxv->phy) { +case MT_PHY_TYPE_HE_SU : + he->data1 |=HE_BITS (DATA1_FORMAT_SU ) | +HE_BITS (DATA1_UL_DL_KNOWN ) | +HE_BITS (DATA1_BEAM_CHANGE_KNOWN ) | +HE_BITS (DATA1_SPTL_REUSE_KNOWN ); + + he->data3 |=HE_PREP (DATA3_BEAM_CHANGE ,BEAM_CHNG , v14) | +HE_PREP (DATA3_UL_DL ,UPLINK , v2); + he->data4 |=HE_PREP (DATA4_SU_MU_SPTL_REUSE ,SR_MASK , v11); +break ; +case MT_PHY_TYPE_HE_EXT_SU : + he->data1 |=HE_BITS (DATA1_FORMAT_EXT_SU ) | +HE_BITS (DATA1_UL_DL_KNOWN ); + + he->data3 |=HE_PREP (DATA3_UL_DL ,UPLINK , v2); +break ; +case MT_PHY_TYPE_HE_MU : + he->data1 |=HE_BITS (DATA1_FORMAT_MU ) | +HE_BITS (DATA1_UL_DL_KNOWN ) | +HE_BITS (DATA1_SPTL_REUSE_KNOWN ); + + he->data3 |=HE_PREP (DATA3_UL_DL ,UPLINK , v2); + he->data4 |=HE_PREP (DATA4_SU_MU_SPTL_REUSE ,SR_MASK , v11); + +mt7915_mac_decode_he_radiotap_ru (status, rxv, he); +break ; +case MT_PHY_TYPE_HE_TB : + he->data1 |=HE_BITS (DATA1_FORMAT_TRIG ) | +HE_BITS (DATA1_SPTL_REUSE_KNOWN ) | +HE_BITS (DATA1_SPTL_REUSE2_KNOWN ) | +HE_BITS (DATA1_SPTL_REUSE3_KNOWN ) | +HE_BITS (DATA1_SPTL_REUSE4_KNOWN ); + + he->data4 =HE_PREP (DATA4_TB_SPTL_REUSE1 ,SR_MASK , v11) | +HE_PREP (DATA4_TB_SPTL_REUSE2 ,SR1_MASK , v11) | +HE_PREP (DATA4_TB_SPTL_REUSE3 ,SR2_MASK , v11) | +HE_PREP (DATA4_TB_SPTL_REUSE4 ,SR3_MASK , v11); + +mt7915_mac_decode_he_radiotap_ru (status, rxv, he); +break ; +default : +break ; + } +} +int mt7915_mac_fill_rx (struct mt7915_dev *dev,struct sk_buff *skb) {struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
@@ -347,6 +483,7 @@ int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)return -EINVAL ;break ;case MT_PHY_TYPE_HE_MU : + status->flag |=RX_FLAG_RADIOTAP_HE_MU ;/* fall through */ case MT_PHY_TYPE_HE_SU :case MT_PHY_TYPE_HE_EXT_SU :
@@ -354,6 +491,7 @@ int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb) status->nss =FIELD_GET (MT_PRXV_NSTS , rxv.v[0 ]) +1 ; status->encoding =RX_ENC_HE ; + status->flag |=RX_FLAG_RADIOTAP_HE ; i &=GENMASK (3 ,0 );if (gi <=NL80211_RATE_INFO_HE_GI_3_2 )
@@ -404,6 +542,9 @@ int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)mt76_insert_ccmp_hdr (skb, key_id); } +if (status->flag &RX_FLAG_RADIOTAP_HE ) +mt7915_mac_decode_he_radiotap (skb, status, &rxv); + hdr =mt76_skb_get_hdr (skb);if (!status->wcid || !ieee80211_is_data_qos (hdr->frame_control))return 0 ;
drivers/net/wireless/mediatek/mt76/mt7915/mac.h +16 -0
@@ -101,6 +101,8 @@ enum rx_pkt_type {#define MT_PRXV_TX_ER_SU_106T BIT(5)#define MT_PRXV_NSTS GENMASK(9, 7)#define MT_PRXV_HT_AD_CODE BIT(11) +#define MT_PRXV_HE_RU_ALLOC_L GENMASK(31, 28) +#define MT_PRXV_HE_RU_ALLOC_H GENMASK(3, 0)#define MT_PRXV_RCPI3 GENMASK(31, 24)#define MT_PRXV_RCPI2 GENMASK(23, 16)#define MT_PRXV_RCPI1 GENMASK(15, 8)
@@ -111,6 +113,20 @@ enum rx_pkt_type {#define MT_CRXV_TX_MODE GENMASK(7, 4)#define MT_CRXV_FRAME_MODE GENMASK(10, 8)#define MT_CRXV_HT_SHORT_GI GENMASK(14, 13) +#define MT_CRXV_HE_LTF_SIZE GENMASK(18, 17) +#define MT_CRXV_HE_LDPC_EXT_SYM BIT(20) +#define MT_CRXV_HE_PE_DISAMBIG BIT(23) +#define MT_CRXV_HE_UPLINK BIT(31) + +#define MT_CRXV_HE_SR_MASK GENMASK(11, 8) +#define MT_CRXV_HE_SR1_MASK GENMASK(16, 12) +#define MT_CRXV_HE_SR2_MASK GENMASK(20, 17) +#define MT_CRXV_HE_SR3_MASK GENMASK(24, 21) + +#define MT_CRXV_HE_BSS_COLOR GENMASK(5, 0) +#define MT_CRXV_HE_TXOP_DUR GENMASK(12, 6) +#define MT_CRXV_HE_BEAM_CHNG BIT(13) +#define MT_CRXV_HE_DOPPLER BIT(16)struct mt7915_rxv {u32 phy;
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 13/16 mt76: mt7915: add .sta_add_debugfs support
In reply to Ryder LeeThis generation supports much more per-peer statistics than legacy ones, so add .sta_add_debugfs accordingly.
This is convenient to set/get more settings/counters in the long run.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 65 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/main.c | 3 + .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 ++ 3 files changed, 72 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +65 -0
@@ -299,3 +299,68 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)return 0 ; } + +/** per-station debugfs **/ + +static int +mt7915_sta_stats_read (struct seq_file *s,void *data) +{ +struct ieee80211_sta *sta = s->private; +struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; +struct mt7915_sta_stats *stats = &msta->stats; +struct rate_info *rate = &stats->prob_rate; +static const char *const bw[] = { +"BW20" ,"BW5" ,"BW10" ,"BW40" , +"BW80" ,"BW160" ,"BW_HE_RU" + }; + +if (!rate->legacy && !rate->flags) +return 0 ; + +seq_puts (s,"Probing rate - " ); +if (rate->flags &RATE_INFO_FLAGS_MCS ) +seq_puts (s,"HT " ); +else if (rate->flags &RATE_INFO_FLAGS_VHT_MCS ) +seq_puts (s,"VHT " ); +else if (rate->flags &RATE_INFO_FLAGS_HE_MCS ) +seq_puts (s,"HE " ); +else +seq_printf (s,"Bitrate %d\n" , rate->legacy); + +if (rate->flags) { +seq_printf (s,"%s NSS%d MCS%d " , + bw[rate->bw], rate->nss, rate->mcs); + +if (rate->flags &RATE_INFO_FLAGS_SHORT_GI ) +seq_puts (s,"SGI " ); +else if (rate->he_gi) +seq_puts (s,"HE GI " ); + +if (rate->he_dcm) +seq_puts (s,"DCM " ); + } + +seq_printf (s,"\nPPDU PER: %ld.%1ld%%\n" , + stats->per /10 , stats->per %10 ); + +return 0 ; +} + +static int +mt7915_sta_stats_open (struct inode *inode,struct file *f) +{ +return single_open (f, mt7915_sta_stats_read, inode->i_private); +} + +static const struct file_operations fops_sta_stats = { + .open = mt7915_sta_stats_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +void mt7915_sta_add_debugfs (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +struct ieee80211_sta *sta,struct dentry *dir) +{ +debugfs_create_file ("stats" ,0400 , dir, sta, &fops_sta_stats); +}
drivers/net/wireless/mediatek/mt76/mt7915/main.c +3 -0
@@ -748,4 +748,7 @@ const struct ieee80211_ops mt7915_ops = { .get_antenna = mt76_get_antenna, .set_antenna = mt7915_set_antenna, .set_coverage_class = mt7915_set_coverage_class, +#ifdef CONFIG_MAC80211_DEBUGFS + .sta_add_debugfs = mt7915_sta_add_debugfs, +#endif };
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +4 -0
@@ -447,5 +447,9 @@ int mt7915_dfs_init_radar_detector(struct mt7915_phy *phy);void mt7915_set_stream_he_caps (struct mt7915_dev *dev);void mt7915_update_channel (struct mt76_dev *mdev);int mt7915_init_debugfs (struct mt7915_dev *dev); +#ifdef CONFIG_MAC80211_DEBUGFS +void mt7915_sta_add_debugfs (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +struct ieee80211_sta *sta,struct dentry *dir); +#endif #endif
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 14/16 mt76: mt7915: add .sta_statistics support
In reply to Ryder LeeAdd useful debug counters since this generation uses struct rate_info to report HE tx rate.
--- .../net/wireless/mediatek/mt76/mt7915/main.c | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/main.c +26 -0
@@ -700,6 +700,31 @@ mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)return 0 ; } +static void mt7915_sta_statistics (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +struct ieee80211_sta *sta, +struct station_info *sinfo) +{ +struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; +struct mt7915_sta_stats *stats = &msta->stats; + +if (!stats->tx_rate.legacy && !stats->tx_rate.flags) +return ; + +if (stats->tx_rate.legacy) { + sinfo->txrate.legacy = stats->tx_rate.legacy; + }else { + sinfo->txrate.mcs = stats->tx_rate.mcs; + sinfo->txrate.nss = stats->tx_rate.nss; + sinfo->txrate.bw = stats->tx_rate.bw; + sinfo->txrate.he_gi = stats->tx_rate.he_gi; + sinfo->txrate.he_dcm = stats->tx_rate.he_dcm; + sinfo->txrate.he_ru_alloc = stats->tx_rate.he_ru_alloc; + } + sinfo->txrate.flags = stats->tx_rate.flags; + sinfo->filled |=BIT_ULL (NL80211_STA_INFO_TX_BITRATE ); +} + static void mt7915_sta_rc_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
@@ -748,6 +773,7 @@ const struct ieee80211_ops mt7915_ops = { .get_antenna = mt76_get_antenna, .set_antenna = mt7915_set_antenna, .set_coverage_class = mt7915_set_coverage_class, + .sta_statistics = mt7915_sta_statistics,#ifdef CONFIG_MAC80211_DEBUGFS .sta_add_debugfs = mt7915_sta_add_debugfs,#endif
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 15/16 mt76: mt7915: set peer Tx fixed rate through debugfs
In reply to Ryder LeeDriver can manually set fixed rate for each peer through debugfs.
May use .set_bitrate_mask callback and iterate stations under the current vif to achieve the aim once it supports HE rate.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 13 ++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.c | 46 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 28 +++++++++++ .../wireless/mediatek/mt76/mt7915/mt7915.h | 2 + 4 files changed, 89 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +13 -0
@@ -302,6 +302,18 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)/** per-station debugfs **/ +/* usage: <tx mode> <ldpc> <stbc> <bw> <gi> <nss> <mcs> */ +static int mt7915_sta_fixed_rate_set (void *data,u64 rate) +{ +struct ieee80211_sta *sta = data; +struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; + +return mt7915_mcu_set_fixed_rate (msta->vif->dev, sta, rate); +} + +DEFINE_DEBUGFS_ATTRIBUTE (fops_fixed_rate,NULL , + mt7915_sta_fixed_rate_set,"%llx\n" ); +static int mt7915_sta_stats_read (struct seq_file *s,void *data) {
@@ -362,5 +374,6 @@ static const struct file_operations fops_sta_stats = {void mt7915_sta_add_debugfs (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta,struct dentry *dir) { +debugfs_create_file ("fixed_rate" ,0600 , dir, sta, &fops_fixed_rate);debugfs_create_file ("stats" ,0400 , dir, sta, &fops_sta_stats); }
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +46 -0
52 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +28 -0
@@ -823,6 +823,34 @@ struct sta_rec_ra {struct ra_phy phy; } __packed; +struct sta_rec_ra_fixed { +__le16 tag; +__le16 len; + +__le32 field; +u8 op_mode; +u8 op_vht_chan_width; +u8 op_vht_rx_nss; +u8 op_vht_rx_nss_type; + +struct ra_phy phy; + +u8 spe_en; +u8 short_preamble; +u8 is_5g; +u8 mmps_mode; +} __packed; + +#define RATE_PARAM_FIXED 3 +#define RATE_PARAM_AUTO 20 +#define RATE_CFG_MCS GENMASK(3, 0) +#define RATE_CFG_NSS GENMASK(7, 4) +#define RATE_CFG_GI GENMASK(11, 8) +#define RATE_CFG_BW GENMASK(15, 12) +#define RATE_CFG_STBC GENMASK(19, 16) +#define RATE_CFG_LDPC GENMASK(23, 20) +#define RATE_CFG_PHY_TYPE GENMASK(27, 24) +enum {STA_REC_BASIC ,STA_REC_RA ,
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -0
@@ -302,6 +302,8 @@ int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif, struct ieee80211_sta *sta);int mt7915_mcu_set_chan_info (struct mt7915_phy *phy,int cmd);int mt7915_mcu_set_tx (struct mt7915_dev *dev,struct ieee80211_vif *vif); +int mt7915_mcu_set_fixed_rate (struct mt7915_dev *dev, +struct ieee80211_sta *sta,u32 rate);int mt7915_mcu_set_eeprom (struct mt7915_dev *dev);int mt7915_mcu_get_eeprom (struct mt7915_dev *dev,u32 offset); int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
Signature · 1 line
2.18.0
Ryder Lee
maintainerPATCH 16/16 mt76: mt7915: enable firmware module debug support
In reply to Ryder LeeThis allows host driver to get useful information of some important modules.
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 36 ++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.c | 58 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7915/mcu.h | 3 + .../wireless/mediatek/mt76/mt7915/mt7915.h | 2 + 4 files changed, 99 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +36 -0
@@ -74,6 +74,41 @@ mt7915_dbdc_get(void *data, u64 *val)DEFINE_DEBUGFS_ATTRIBUTE (fops_dbdc, mt7915_dbdc_get, mt7915_dbdc_set,"%lld\n" ); +static int +mt7915_fw_debug_set (void *data,u64 val) +{ +struct mt7915_dev *dev = data; +enum { +DEBUG_TXCMD =62 , +DEBUG_CMD_RPT_TX , +DEBUG_CMD_RPT_TRIG , +DEBUG_SPL , +DEBUG_RPT_RX , + } debug; + + dev->fw_debug = !!val; + +mt7915_mcu_fw_log_2_host (dev, dev->fw_debug ?2 :0 ); + +for (debug =DEBUG_TXCMD ; debug <=DEBUG_RPT_RX ; debug++) +mt7915_mcu_fw_dbg_ctrl (dev, debug, dev->fw_debug); + +return 0 ; +} + +static int +mt7915_fw_debug_get (void *data,u64 *val) +{ +struct mt7915_dev *dev = data; + + *val = dev->fw_debug; + +return 0 ; +} + +DEFINE_DEBUGFS_ATTRIBUTE (fops_fw_debug, mt7915_fw_debug_get, + mt7915_fw_debug_set,"%lld\n" ); +static void mt7915_ampdu_stat_read_phy (struct mt7915_phy *phy,struct seq_file *file)
@@ -287,6 +322,7 @@ int mt7915_init_debugfs(struct mt7915_dev *dev) mt7915_queues_acq);debugfs_create_file ("tx_stats" ,0400 , dir, dev, &fops_tx_stats);debugfs_create_file ("dbdc" ,0600 , dir, dev, &fops_dbdc); +debugfs_create_file ("fw_debug" ,0600 , dir, dev, &fops_fw_debug);debugfs_create_u32 ("dfs_hw_pattern" ,0400 , dir, &dev->hw_pattern);/* test knobs */ debugfs_create_file("radar_trigger", 0200, dir, dev,
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +58 -0
88 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +3 -0
@@ -38,6 +38,7 @@ enum {/* ext event table */ enum {MCU_EXT_EVENT_PS_SYNC =0x5 , +MCU_EXT_EVENT_FW_LOG_2_HOST =0x13 ,MCU_EXT_EVENT_THERMAL_PROTECT =0x22 ,MCU_EXT_EVENT_ASSERT_DUMP =0x23 ,MCU_EXT_EVENT_RDD_REPORT =0x3a ,
@@ -192,6 +193,7 @@ enum {MCU_EXT_CMD_EFUSE_ACCESS =0x01 ,MCU_EXT_CMD_PM_STATE_CTRL =0x07 ,MCU_EXT_CMD_CHANNEL_SWITCH =0x08 , +MCU_EXT_CMD_FW_LOG_2_HOST =0x13 ,MCU_EXT_CMD_EFUSE_BUFFER_MODE =0x21 ,MCU_EXT_CMD_STA_REC_UPDATE =0x25 , MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
@@ -207,6 +209,7 @@ enum {MCU_EXT_CMD_SET_SER_TRIGGER =0x81 ,MCU_EXT_CMD_SCS_CTRL =0x82 ,MCU_EXT_CMD_RATE_CTRL =0x87 , +MCU_EXT_CMD_FW_DBG_CTRL =0x95 , MCU_EXT_CMD_SET_RDD_TH = 0x9d, };
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +2 -0
@@ -323,6 +323,8 @@ int mt7915_mcu_get_rate_info(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx);int mt7915_mcu_get_temperature (struct mt7915_dev *dev,int index);int mt7915_mcu_rdd_cmd (struct mt7915_dev *dev,enum mt7915_rdd_cmd cmd,u8 index,u8 rx_sel,u8 val); +int mt7915_mcu_fw_log_2_host (struct mt7915_dev *dev,u8 ctrl); +int mt7915_mcu_fw_dbg_ctrl (struct mt7915_dev *dev,u32 module,u8 level);void mt7915_mcu_rx_event (struct mt7915_dev *dev,struct sk_buff *skb);void mt7915_mcu_exit (struct mt7915_dev *dev);
Signature · 1 line
2.18.0