* [PATCH 0/6] mt76: mt7921: multiple fixes
@ 2021-02-09 10:54 Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 1/6] mt76: mt7921: switch to new api for hardware beacon filter Lorenzo Bianconi
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
Align mt7921 driver to fw APIs available in linux-firmware.
Fix uninitialized pointer access.
Sean Wang (6):
mt76: mt7921: switch to new api for hardware beacon filter
mt76: connac: fix up the setting for ht40 mode in
mt76_connac_mcu_uni_add_bss
mt76: mt7921: fixup rx bitrate statistics
mt76: mt7921: add flush operation
mt76: mt7921: fix uninitialized pointer access in mt7921_get_wtbl_info
mt76: connac: update sched_scan cmd usage
.../wireless/mediatek/mt76/mt7615/mt7615.h | 5 -
.../net/wireless/mediatek/mt76/mt76_connac.h | 5 +
.../wireless/mediatek/mt76/mt76_connac_mcu.c | 9 +-
.../wireless/mediatek/mt76/mt76_connac_mcu.h | 14 +-
.../net/wireless/mediatek/mt76/mt7921/mac.c | 152 +++++++++---------
.../net/wireless/mediatek/mt76/mt7921/mac.h | 10 +-
.../net/wireless/mediatek/mt76/mt7921/main.c | 12 +-
.../net/wireless/mediatek/mt76/mt7921/mcu.c | 13 +-
8 files changed, 128 insertions(+), 92 deletions(-)
--
2.29.2
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/6] mt76: mt7921: switch to new api for hardware beacon filter
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 2/6] mt76: connac: fix up the setting for ht40 mode in mt76_connac_mcu_uni_add_bss Lorenzo Bianconi
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
Current firmware only supports new api for enabling hardware beacon filter.
Fixes: 1d8efc741df80 ("mt76: mt7921: introduce Runtime PM support")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt7921/main.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 8 +++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
index 729f6c42cdde..617e48f243f3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
@@ -296,7 +296,7 @@ static int mt7921_add_interface(struct ieee80211_hw *hw,
goto out;
if (dev->pm.enable) {
- ret = mt7921_mcu_set_bss_pm(dev, vif, true);
+ ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
if (ret)
goto out;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
index db125cd22b91..d784c75d47bf 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
@@ -1294,8 +1294,14 @@ mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
{
struct mt7921_phy *phy = priv;
struct mt7921_dev *dev = phy->dev;
+ int ret;
+
+ if (dev->pm.enable)
+ ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
+ else
+ ret = mt7921_mcu_set_bss_pm(dev, vif, false);
- if (mt7921_mcu_set_bss_pm(dev, vif, dev->pm.enable))
+ if (ret)
return;
if (dev->pm.enable) {
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/6] mt76: connac: fix up the setting for ht40 mode in mt76_connac_mcu_uni_add_bss
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 1/6] mt76: mt7921: switch to new api for hardware beacon filter Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics Lorenzo Bianconi
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
Use proper value for ht40 mode configuration in mt76_connac_mcu_uni_add_bss
routine and not ht20 one
Fixes: d0e274af2f2e4 ("mt76: mt76_connac: create mcu library")
Co-developed-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 6cbccfb05f8b..4356bf130dbd 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -1195,6 +1195,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
.center_chan = ieee80211_frequency_to_channel(freq1),
.center_chan2 = ieee80211_frequency_to_channel(freq2),
.tx_streams = hweight8(phy->antenna_mask),
+ .ht_op_info = 4, /* set HT 40M allowed */
.rx_streams = phy->chainmask,
.short_st = true,
},
@@ -1287,6 +1288,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
case NL80211_CHAN_WIDTH_20:
default:
rlm_req.rlm.bw = CMD_CBW_20MHZ;
+ rlm_req.rlm.ht_op_info = 0;
break;
}
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 1/6] mt76: mt7921: switch to new api for hardware beacon filter Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 2/6] mt76: connac: fix up the setting for ht40 mode in mt76_connac_mcu_uni_add_bss Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
2021-02-09 13:36 ` kernel test robot
2021-02-09 10:54 ` [PATCH 4/6] mt76: mt7921: add flush operation Lorenzo Bianconi
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
Since the related rx bitrate fields have been moved to group3 in Rxv,
fix rx bitrate statistics in mt7921_mac_fill_rx routine.
Fixes: 163f4d22c118d ("mt76: mt7921: add MAC support")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
.../net/wireless/mediatek/mt76/mt7921/mac.c | 152 +++++++++---------
.../net/wireless/mediatek/mt76/mt7921/mac.h | 10 +-
2 files changed, 85 insertions(+), 77 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
index 3f9097481a5e..dca4878b9849 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
@@ -401,6 +401,8 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
/* RXD Group 3 - P-RXV */
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
u32 v0, v1, v2;
+ u8 stbc, gi;
+ bool cck;
rxv = rxd;
rxd += 2;
@@ -429,87 +431,87 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
status->chain_signal[i]);
}
- /* RXD Group 5 - C-RXV */
- if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
- u8 stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
- u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
- bool cck = false;
+ stbc = FIELD_GET(MT_PRXV_STBC, v0);
+ gi = FIELD_GET(MT_PRXV_SGI, v0);
+ cck = false;
- rxd += 18;
- if ((u8 *)rxd - skb->data >= skb->len)
- return -EINVAL;
+ idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
+ mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
- idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
- mode = FIELD_GET(MT_CRXV_TX_MODE, v2);
-
- switch (mode) {
- case MT_PHY_TYPE_CCK:
- cck = true;
- fallthrough;
- case MT_PHY_TYPE_OFDM:
- i = mt76_get_rate(&dev->mt76, sband, i, cck);
- break;
- case MT_PHY_TYPE_HT_GF:
- case MT_PHY_TYPE_HT:
- status->encoding = RX_ENC_HT;
- if (i > 31)
- return -EINVAL;
- break;
- case MT_PHY_TYPE_VHT:
- status->nss =
- FIELD_GET(MT_PRXV_NSTS, v0) + 1;
- status->encoding = RX_ENC_VHT;
- if (i > 9)
- return -EINVAL;
- break;
- case MT_PHY_TYPE_HE_MU:
- status->flag |= RX_FLAG_RADIOTAP_HE_MU;
- fallthrough;
- case MT_PHY_TYPE_HE_SU:
- case MT_PHY_TYPE_HE_EXT_SU:
- case MT_PHY_TYPE_HE_TB:
- status->nss =
- FIELD_GET(MT_PRXV_NSTS, v0) + 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)
- status->he_gi = gi;
-
- status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
- break;
- default:
+ switch (mode) {
+ case MT_PHY_TYPE_CCK:
+ cck = true;
+ fallthrough;
+ case MT_PHY_TYPE_OFDM:
+ i = mt76_get_rate(&dev->mt76, sband, i, cck);
+ break;
+ case MT_PHY_TYPE_HT_GF:
+ case MT_PHY_TYPE_HT:
+ status->encoding = RX_ENC_HT;
+ if (i > 31)
return -EINVAL;
- }
- status->rate_idx = i;
-
- switch (FIELD_GET(MT_CRXV_FRAME_MODE, v2)) {
- case IEEE80211_STA_RX_BW_20:
- break;
- case IEEE80211_STA_RX_BW_40:
- if (mode & MT_PHY_TYPE_HE_EXT_SU &&
- (idx & MT_PRXV_TX_ER_SU_106T)) {
- status->bw = RATE_INFO_BW_HE_RU;
- status->he_ru =
- NL80211_RATE_INFO_HE_RU_ALLOC_106;
- } else {
- status->bw = RATE_INFO_BW_40;
- }
- break;
- case IEEE80211_STA_RX_BW_80:
- status->bw = RATE_INFO_BW_80;
- break;
- case IEEE80211_STA_RX_BW_160:
- status->bw = RATE_INFO_BW_160;
- break;
- default:
+ break;
+ case MT_PHY_TYPE_VHT:
+ status->nss =
+ FIELD_GET(MT_PRXV_NSTS, v0) + 1;
+ status->encoding = RX_ENC_VHT;
+ if (i > 9)
return -EINVAL;
+ break;
+ case MT_PHY_TYPE_HE_MU:
+ status->flag |= RX_FLAG_RADIOTAP_HE_MU;
+ fallthrough;
+ case MT_PHY_TYPE_HE_SU:
+ case MT_PHY_TYPE_HE_EXT_SU:
+ case MT_PHY_TYPE_HE_TB:
+ status->nss =
+ FIELD_GET(MT_PRXV_NSTS, v0) + 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)
+ status->he_gi = gi;
+
+ status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ status->rate_idx = i;
+
+ switch (FIELD_GET(MT_PRXV_FRAME_MODE, v0)) {
+ case IEEE80211_STA_RX_BW_20:
+ break;
+ case IEEE80211_STA_RX_BW_40:
+ if (mode & MT_PHY_TYPE_HE_EXT_SU &&
+ (idx & MT_PRXV_TX_ER_SU_106T)) {
+ status->bw = RATE_INFO_BW_HE_RU;
+ status->he_ru =
+ NL80211_RATE_INFO_HE_RU_ALLOC_106;
+ } else {
+ status->bw = RATE_INFO_BW_40;
}
+ break;
+ case IEEE80211_STA_RX_BW_80:
+ status->bw = RATE_INFO_BW_80;
+ break;
+ case IEEE80211_STA_RX_BW_160:
+ status->bw = RATE_INFO_BW_160;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
+ if (mode < MT_PHY_TYPE_HE_SU && gi)
+ status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
- status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
- if (mode < MT_PHY_TYPE_HE_SU && gi)
- status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
+ if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
+ rxd += 18;
+ if ((u8 *)rxd - skb->data >= skb->len)
+ return -EINVAL;
}
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
index a0c1fa0f20e4..109c8849d106 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
@@ -97,18 +97,24 @@ enum rx_pkt_type {
#define MT_RXD3_NORMAL_PF_MODE BIT(29)
#define MT_RXD3_NORMAL_PF_STS GENMASK(31, 30)
-/* P-RXV */
+/* P-RXV DW0 */
#define MT_PRXV_TX_RATE GENMASK(6, 0)
#define MT_PRXV_TX_DCM BIT(4)
#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_FRAME_MODE GENMASK(14, 12)
+#define MT_PRXV_SGI GENMASK(16, 15)
+#define MT_PRXV_STBC GENMASK(23, 22)
+#define MT_PRXV_TX_MODE GENMASK(27, 24)
#define MT_PRXV_HE_RU_ALLOC_L GENMASK(31, 28)
-#define MT_PRXV_HE_RU_ALLOC_H GENMASK(3, 0)
+
+/* P-RXV DW1 */
#define MT_PRXV_RCPI3 GENMASK(31, 24)
#define MT_PRXV_RCPI2 GENMASK(23, 16)
#define MT_PRXV_RCPI1 GENMASK(15, 8)
#define MT_PRXV_RCPI0 GENMASK(7, 0)
+#define MT_PRXV_HE_RU_ALLOC_H GENMASK(3, 0)
/* C-RXV */
#define MT_CRXV_HT_STBC GENMASK(1, 0)
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6] mt76: mt7921: add flush operation
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
` (2 preceding siblings ...)
2021-02-09 10:54 ` [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 5/6] mt76: mt7921: fix uninitialized pointer access in mt7921_get_wtbl_info Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 6/6] mt76: connac: update sched_scan cmd usage Lorenzo Bianconi
5 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
add flush operation to make sure cfg80211_mlme_deauth is able to flush
the deauthtication frame into air immediately.
Co-developed-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt7921/main.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
index 617e48f243f3..e6843c9ff145 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
@@ -1120,6 +1120,15 @@ static void mt7921_set_rekey_data(struct ieee80211_hw *hw,
}
#endif /* CONFIG_PM */
+static void mt7921_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+ u32 queues, bool drop)
+{
+ struct mt7921_dev *dev = mt7921_hw_dev(hw);
+
+ wait_event_timeout(dev->mt76.tx_wait, !mt76_has_tx_pending(&dev->mphy),
+ HZ / 2);
+}
+
const struct ieee80211_ops mt7921_ops = {
.tx = mt7921_tx,
.start = mt7921_start,
@@ -1158,4 +1167,5 @@ const struct ieee80211_ops mt7921_ops = {
.set_wakeup = mt7921_set_wakeup,
.set_rekey_data = mt7921_set_rekey_data,
#endif /* CONFIG_PM */
+ .flush = mt7921_flush,
};
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6] mt76: mt7921: fix uninitialized pointer access in mt7921_get_wtbl_info
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
` (3 preceding siblings ...)
2021-02-09 10:54 ` [PATCH 4/6] mt76: mt7921: add flush operation Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 6/6] mt76: connac: update sched_scan cmd usage Lorenzo Bianconi
5 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
fix possible uninitialized pointer access in mt7921_get_wtbl_info
routine
[ 270.073205] wlp1s0: deauthenticating from 9c:5c:8e:c9:93:14 by local choice (Reason: 3=DEAUTH_LEAVING)
[ 270.094918] 8<--- cut here ---
[ 270.097988] Unable to handle kernel NULL pointer dereference at virtual address 0000000a
[ 270.106120] pgd = 7ac68838
[ 270.108842] [0000000a] *pgd=00000000
[ 270.112426] Internal error: Oops: 805 [#1] SMP ARM
[ 270.117216] Modules linked in: mt7921e mt76_connac_lib mt76
[ 270.122803] CPU: 0 PID: 7 Comm: kworker/u8:0 Tainted: G W 5.11.0-rc2+ #67
[ 270.130891] Hardware name: Mediatek Cortex-A7 (Device Tree)
[ 270.136459] Workqueue: phy0 mt7921_mac_work [mt7921e]
[ 270.141557] PC is at mt7921_get_wtbl_info+0x224/0x2d8 [mt7921e]
[ 270.147498] LR is at 0x0
[ 270.150026] pc : [<bf030398>] lr : [<00000000>] psr: 60000013
...
[ 270.317696] 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 270.325869] 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[ 270.334043] [<bf030398>] (mt7921_get_wtbl_info [mt7921e]) from [<bf02ea9c>] (mt7921_mac_work+0x298/0x2c0 [mt7921e])
[ 270.344529] [<bf02ea9c>] (mt7921_mac_work [mt7921e]) from [<c013cde8>] (process_one_work+0x1f0/0x538)
[ 270.353780] [<c013cde8>] (process_one_work) from [<c013d17c>] (worker_thread+0x4c/0x55c)
[ 270.361874] [<c013d17c>] (worker_thread) from [<c01447a8>] (kthread+0x124/0x150)
[ 270.369275] [<c01447a8>] (kthread) from [<c0100150>] (ret_from_fork+0x14/0x24)
[ 270.376501] Exception stack(0xc19c7fb0 to 0xc19c7ff8)
[ 270.381550] 7fa0: 00000000 00000000 00000000 00000000
[ 270.389724] 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 270.397896] 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[ 270.404509] Code: e59de012 e1cdc1b6 e1cdc1b8 e59dc016 (e582e00a)
Fixes: 1c099ab44727c ("mt76: mt7921: add MCU support")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
index d784c75d47bf..58de7f32a625 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
@@ -404,11 +404,10 @@ mt7921_mcu_tx_rate_report(struct mt7921_dev *dev, struct sk_buff *skb,
if (wlan_idx >= MT76_N_WCIDS)
return;
+
wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]);
- if (!wcid) {
- stats->tx_rate = rate;
+ if (!wcid)
return;
- }
msta = container_of(wcid, struct mt7921_sta, wcid);
stats = &msta->stats;
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6] mt76: connac: update sched_scan cmd usage
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
` (4 preceding siblings ...)
2021-02-09 10:54 ` [PATCH 5/6] mt76: mt7921: fix uninitialized pointer access in mt7921_get_wtbl_info Lorenzo Bianconi
@ 2021-02-09 10:54 ` Lorenzo Bianconi
5 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2021-02-09 10:54 UTC (permalink / raw)
To: nbd; +Cc: linux-wireless, sean.wang, lorenzo.bianconi
From: Sean Wang <sean.wang@mediatek.com>
Update sched_scan command usage according to the current firmware
submitted into linux-firmware.git.
Fixes: 80fc1e37c0eb ("mt76: mt7921: rely on mt76_connac_mcu module for sched_scan and hw_scan")
Co-developed-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | 5 -----
drivers/net/wireless/mediatek/mt76/mt76_connac.h | 5 +++++
.../net/wireless/mediatek/mt76/mt76_connac_mcu.c | 7 +++++--
.../net/wireless/mediatek/mt76/mt76_connac_mcu.h | 14 +++++++++++---
4 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
index 491841bc6291..5ef19fbee6bd 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
@@ -408,11 +408,6 @@ static inline bool is_mt7615(struct mt76_dev *dev)
return mt76_chip(dev) == 0x7615 || mt76_chip(dev) == 0x7611;
}
-static inline bool is_mt7663(struct mt76_dev *dev)
-{
- return mt76_chip(dev) == 0x7663;
-}
-
static inline bool is_mt7611(struct mt76_dev *dev)
{
return mt76_chip(dev) == 0x7611;
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
index 0d58606391b0..b811f3c410a1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
@@ -73,6 +73,11 @@ static inline bool is_mt7921(struct mt76_dev *dev)
return mt76_chip(dev) == 0x7961;
}
+static inline bool is_mt7663(struct mt76_dev *dev)
+{
+ return mt76_chip(dev) == 0x7663;
+}
+
int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm);
void mt76_connac_power_save_sched(struct mt76_phy *phy,
struct mt76_connac_pm *pm);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 4356bf130dbd..1ee4e627ea00 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -1435,10 +1435,13 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
req->version = 1;
req->seq_num = mvif->scan_seq_num | ext_phy << 7;
- if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
- get_random_mask_addr(req->random_mac, sreq->mac_addr,
+ if (is_mt7663(phy->dev) &&
+ (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) {
+ get_random_mask_addr(req->mt7663.random_mac, sreq->mac_addr,
sreq->mac_addr_mask);
req->scan_func = 1;
+ } else if (is_mt7921(phy->dev)) {
+ req->mt7921.bss_idx = mvif->idx;
}
req->ssids_num = sreq->n_ssids;
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index c1e1df5f7cd7..4dca07e4e8aa 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -759,11 +759,19 @@ struct mt76_connac_sched_scan_req {
u8 channel_type;
u8 channels_num;
u8 intervals_num;
- u8 scan_func; /* BIT(0) eable random mac address */
+ u8 scan_func; /* MT7663: BIT(0) eable random mac address */
struct mt76_connac_mcu_scan_channel channels[64];
__le16 intervals[MT76_CONNAC_MAX_SCHED_SCAN_INTERVAL];
- u8 random_mac[ETH_ALEN]; /* valid when BIT(0) in scan_func is set */
- u8 pad2[58];
+ union {
+ struct {
+ u8 random_mac[ETH_ALEN];
+ u8 pad2[58];
+ } mt7663;
+ struct {
+ u8 bss_idx;
+ u8 pad2[63];
+ } mt7921;
+ };
} __packed;
struct mt76_connac_sched_scan_done {
--
2.29.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics
2021-02-09 10:54 ` [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics Lorenzo Bianconi
@ 2021-02-09 13:36 ` kernel test robot
0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-02-09 13:36 UTC (permalink / raw)
To: Lorenzo Bianconi, nbd
Cc: kbuild-all, linux-wireless, sean.wang, lorenzo.bianconi
[-- Attachment #1: Type: text/plain, Size: 18868 bytes --]
Hi Lorenzo,
I love your patch! Perhaps something to improve:
[auto build test WARNING on nbd168-wireless/mt76]
[cannot apply to wireless-drivers-next/master wireless-drivers/master v5.11-rc6 next-20210125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/mt76-mt7921-multiple-fixes/20210209-190328
base: https://github.com/nbd168/wireless mt76
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/716af9b953825b6ade758b0ed48ee2ceceaee289
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Lorenzo-Bianconi/mt76-mt7921-multiple-fixes/20210209-190328
git checkout 716af9b953825b6ade758b0ed48ee2ceceaee289
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
drivers/net/wireless/mediatek/mt76/mt7921/mac.c: In function 'mt7921_mac_fill_rx':
>> drivers/net/wireless/mediatek/mt76/mt7921/mac.c:403:15: warning: variable 'v2' set but not used [-Wunused-but-set-variable]
403 | u32 v0, v1, v2;
| ^~
vim +/v2 +403 drivers/net/wireless/mediatek/mt76/mt7921/mac.c
163f4d22c118d4 Sean Wang 2021-01-28 287
163f4d22c118d4 Sean Wang 2021-01-28 288 int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
163f4d22c118d4 Sean Wang 2021-01-28 289 {
163f4d22c118d4 Sean Wang 2021-01-28 290 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
163f4d22c118d4 Sean Wang 2021-01-28 291 struct mt76_phy *mphy = &dev->mt76.phy;
163f4d22c118d4 Sean Wang 2021-01-28 292 struct mt7921_phy *phy = &dev->phy;
163f4d22c118d4 Sean Wang 2021-01-28 293 struct ieee80211_supported_band *sband;
163f4d22c118d4 Sean Wang 2021-01-28 294 struct ieee80211_hdr *hdr;
163f4d22c118d4 Sean Wang 2021-01-28 295 __le32 *rxd = (__le32 *)skb->data;
163f4d22c118d4 Sean Wang 2021-01-28 296 __le32 *rxv = NULL;
163f4d22c118d4 Sean Wang 2021-01-28 297 u32 mode = 0;
163f4d22c118d4 Sean Wang 2021-01-28 298 u32 rxd1 = le32_to_cpu(rxd[1]);
163f4d22c118d4 Sean Wang 2021-01-28 299 u32 rxd2 = le32_to_cpu(rxd[2]);
163f4d22c118d4 Sean Wang 2021-01-28 300 u32 rxd3 = le32_to_cpu(rxd[3]);
163f4d22c118d4 Sean Wang 2021-01-28 301 bool unicast, insert_ccmp_hdr = false;
163f4d22c118d4 Sean Wang 2021-01-28 302 u8 remove_pad;
163f4d22c118d4 Sean Wang 2021-01-28 303 int i, idx;
163f4d22c118d4 Sean Wang 2021-01-28 304 u8 chfreq;
163f4d22c118d4 Sean Wang 2021-01-28 305
163f4d22c118d4 Sean Wang 2021-01-28 306 memset(status, 0, sizeof(*status));
163f4d22c118d4 Sean Wang 2021-01-28 307
163f4d22c118d4 Sean Wang 2021-01-28 308 if (rxd1 & MT_RXD1_NORMAL_BAND_IDX)
163f4d22c118d4 Sean Wang 2021-01-28 309 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 310
163f4d22c118d4 Sean Wang 2021-01-28 311 if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
163f4d22c118d4 Sean Wang 2021-01-28 312 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 313
163f4d22c118d4 Sean Wang 2021-01-28 314 chfreq = FIELD_GET(MT_RXD3_NORMAL_CH_FREQ, rxd3);
163f4d22c118d4 Sean Wang 2021-01-28 315 unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
163f4d22c118d4 Sean Wang 2021-01-28 316 idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
163f4d22c118d4 Sean Wang 2021-01-28 317 status->wcid = mt7921_rx_get_wcid(dev, idx, unicast);
163f4d22c118d4 Sean Wang 2021-01-28 318
163f4d22c118d4 Sean Wang 2021-01-28 319 if (status->wcid) {
163f4d22c118d4 Sean Wang 2021-01-28 320 struct mt7921_sta *msta;
163f4d22c118d4 Sean Wang 2021-01-28 321
163f4d22c118d4 Sean Wang 2021-01-28 322 msta = container_of(status->wcid, struct mt7921_sta, wcid);
163f4d22c118d4 Sean Wang 2021-01-28 323 spin_lock_bh(&dev->sta_poll_lock);
163f4d22c118d4 Sean Wang 2021-01-28 324 if (list_empty(&msta->poll_list))
163f4d22c118d4 Sean Wang 2021-01-28 325 list_add_tail(&msta->poll_list, &dev->sta_poll_list);
163f4d22c118d4 Sean Wang 2021-01-28 326 spin_unlock_bh(&dev->sta_poll_lock);
163f4d22c118d4 Sean Wang 2021-01-28 327 }
163f4d22c118d4 Sean Wang 2021-01-28 328
163f4d22c118d4 Sean Wang 2021-01-28 329 mt7921_get_status_freq_info(dev, mphy, status, chfreq);
163f4d22c118d4 Sean Wang 2021-01-28 330
163f4d22c118d4 Sean Wang 2021-01-28 331 if (status->band == NL80211_BAND_5GHZ)
163f4d22c118d4 Sean Wang 2021-01-28 332 sband = &mphy->sband_5g.sband;
163f4d22c118d4 Sean Wang 2021-01-28 333 else
163f4d22c118d4 Sean Wang 2021-01-28 334 sband = &mphy->sband_2g.sband;
163f4d22c118d4 Sean Wang 2021-01-28 335
163f4d22c118d4 Sean Wang 2021-01-28 336 if (!sband->channels)
163f4d22c118d4 Sean Wang 2021-01-28 337 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 338
163f4d22c118d4 Sean Wang 2021-01-28 339 if (rxd1 & MT_RXD1_NORMAL_FCS_ERR)
163f4d22c118d4 Sean Wang 2021-01-28 340 status->flag |= RX_FLAG_FAILED_FCS_CRC;
163f4d22c118d4 Sean Wang 2021-01-28 341
163f4d22c118d4 Sean Wang 2021-01-28 342 if (rxd1 & MT_RXD1_NORMAL_TKIP_MIC_ERR)
163f4d22c118d4 Sean Wang 2021-01-28 343 status->flag |= RX_FLAG_MMIC_ERROR;
163f4d22c118d4 Sean Wang 2021-01-28 344
163f4d22c118d4 Sean Wang 2021-01-28 345 if (FIELD_GET(MT_RXD1_NORMAL_SEC_MODE, rxd1) != 0 &&
163f4d22c118d4 Sean Wang 2021-01-28 346 !(rxd1 & (MT_RXD1_NORMAL_CLM | MT_RXD1_NORMAL_CM))) {
163f4d22c118d4 Sean Wang 2021-01-28 347 status->flag |= RX_FLAG_DECRYPTED;
163f4d22c118d4 Sean Wang 2021-01-28 348 status->flag |= RX_FLAG_IV_STRIPPED;
163f4d22c118d4 Sean Wang 2021-01-28 349 status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
163f4d22c118d4 Sean Wang 2021-01-28 350 }
163f4d22c118d4 Sean Wang 2021-01-28 351
163f4d22c118d4 Sean Wang 2021-01-28 352 if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
163f4d22c118d4 Sean Wang 2021-01-28 353 status->flag |= RX_FLAG_AMPDU_DETAILS;
163f4d22c118d4 Sean Wang 2021-01-28 354
163f4d22c118d4 Sean Wang 2021-01-28 355 /* all subframes of an A-MPDU have the same timestamp */
163f4d22c118d4 Sean Wang 2021-01-28 356 if (phy->rx_ampdu_ts != rxd[14]) {
163f4d22c118d4 Sean Wang 2021-01-28 357 if (!++phy->ampdu_ref)
163f4d22c118d4 Sean Wang 2021-01-28 358 phy->ampdu_ref++;
163f4d22c118d4 Sean Wang 2021-01-28 359 }
163f4d22c118d4 Sean Wang 2021-01-28 360 phy->rx_ampdu_ts = rxd[14];
163f4d22c118d4 Sean Wang 2021-01-28 361
163f4d22c118d4 Sean Wang 2021-01-28 362 status->ampdu_ref = phy->ampdu_ref;
163f4d22c118d4 Sean Wang 2021-01-28 363 }
163f4d22c118d4 Sean Wang 2021-01-28 364
163f4d22c118d4 Sean Wang 2021-01-28 365 remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
163f4d22c118d4 Sean Wang 2021-01-28 366
163f4d22c118d4 Sean Wang 2021-01-28 367 if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
163f4d22c118d4 Sean Wang 2021-01-28 368 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 369
163f4d22c118d4 Sean Wang 2021-01-28 370 rxd += 6;
163f4d22c118d4 Sean Wang 2021-01-28 371 if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
163f4d22c118d4 Sean Wang 2021-01-28 372 rxd += 4;
163f4d22c118d4 Sean Wang 2021-01-28 373 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 374 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 375 }
163f4d22c118d4 Sean Wang 2021-01-28 376
163f4d22c118d4 Sean Wang 2021-01-28 377 if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
163f4d22c118d4 Sean Wang 2021-01-28 378 u8 *data = (u8 *)rxd;
163f4d22c118d4 Sean Wang 2021-01-28 379
163f4d22c118d4 Sean Wang 2021-01-28 380 if (status->flag & RX_FLAG_DECRYPTED) {
163f4d22c118d4 Sean Wang 2021-01-28 381 status->iv[0] = data[5];
163f4d22c118d4 Sean Wang 2021-01-28 382 status->iv[1] = data[4];
163f4d22c118d4 Sean Wang 2021-01-28 383 status->iv[2] = data[3];
163f4d22c118d4 Sean Wang 2021-01-28 384 status->iv[3] = data[2];
163f4d22c118d4 Sean Wang 2021-01-28 385 status->iv[4] = data[1];
163f4d22c118d4 Sean Wang 2021-01-28 386 status->iv[5] = data[0];
163f4d22c118d4 Sean Wang 2021-01-28 387
163f4d22c118d4 Sean Wang 2021-01-28 388 insert_ccmp_hdr = FIELD_GET(MT_RXD2_NORMAL_FRAG, rxd2);
163f4d22c118d4 Sean Wang 2021-01-28 389 }
163f4d22c118d4 Sean Wang 2021-01-28 390 rxd += 4;
163f4d22c118d4 Sean Wang 2021-01-28 391 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 392 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 393 }
163f4d22c118d4 Sean Wang 2021-01-28 394
163f4d22c118d4 Sean Wang 2021-01-28 395 if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
163f4d22c118d4 Sean Wang 2021-01-28 396 rxd += 2;
163f4d22c118d4 Sean Wang 2021-01-28 397 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 398 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 399 }
163f4d22c118d4 Sean Wang 2021-01-28 400
163f4d22c118d4 Sean Wang 2021-01-28 401 /* RXD Group 3 - P-RXV */
163f4d22c118d4 Sean Wang 2021-01-28 402 if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
163f4d22c118d4 Sean Wang 2021-01-28 @403 u32 v0, v1, v2;
716af9b953825b Sean Wang 2021-02-09 404 u8 stbc, gi;
716af9b953825b Sean Wang 2021-02-09 405 bool cck;
163f4d22c118d4 Sean Wang 2021-01-28 406
163f4d22c118d4 Sean Wang 2021-01-28 407 rxv = rxd;
163f4d22c118d4 Sean Wang 2021-01-28 408 rxd += 2;
163f4d22c118d4 Sean Wang 2021-01-28 409 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 410 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 411
163f4d22c118d4 Sean Wang 2021-01-28 412 v0 = le32_to_cpu(rxv[0]);
163f4d22c118d4 Sean Wang 2021-01-28 413 v1 = le32_to_cpu(rxv[1]);
163f4d22c118d4 Sean Wang 2021-01-28 414 v2 = le32_to_cpu(rxv[2]);
163f4d22c118d4 Sean Wang 2021-01-28 415
163f4d22c118d4 Sean Wang 2021-01-28 416 if (v0 & MT_PRXV_HT_AD_CODE)
163f4d22c118d4 Sean Wang 2021-01-28 417 status->enc_flags |= RX_ENC_FLAG_LDPC;
163f4d22c118d4 Sean Wang 2021-01-28 418
163f4d22c118d4 Sean Wang 2021-01-28 419 status->chains = mphy->antenna_mask;
163f4d22c118d4 Sean Wang 2021-01-28 420 status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
163f4d22c118d4 Sean Wang 2021-01-28 421 status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
163f4d22c118d4 Sean Wang 2021-01-28 422 status->chain_signal[2] = to_rssi(MT_PRXV_RCPI2, v1);
163f4d22c118d4 Sean Wang 2021-01-28 423 status->chain_signal[3] = to_rssi(MT_PRXV_RCPI3, v1);
163f4d22c118d4 Sean Wang 2021-01-28 424 status->signal = status->chain_signal[0];
163f4d22c118d4 Sean Wang 2021-01-28 425
163f4d22c118d4 Sean Wang 2021-01-28 426 for (i = 1; i < hweight8(mphy->antenna_mask); i++) {
163f4d22c118d4 Sean Wang 2021-01-28 427 if (!(status->chains & BIT(i)))
163f4d22c118d4 Sean Wang 2021-01-28 428 continue;
163f4d22c118d4 Sean Wang 2021-01-28 429
163f4d22c118d4 Sean Wang 2021-01-28 430 status->signal = max(status->signal,
163f4d22c118d4 Sean Wang 2021-01-28 431 status->chain_signal[i]);
163f4d22c118d4 Sean Wang 2021-01-28 432 }
163f4d22c118d4 Sean Wang 2021-01-28 433
716af9b953825b Sean Wang 2021-02-09 434 stbc = FIELD_GET(MT_PRXV_STBC, v0);
716af9b953825b Sean Wang 2021-02-09 435 gi = FIELD_GET(MT_PRXV_SGI, v0);
716af9b953825b Sean Wang 2021-02-09 436 cck = false;
163f4d22c118d4 Sean Wang 2021-01-28 437
163f4d22c118d4 Sean Wang 2021-01-28 438 idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
716af9b953825b Sean Wang 2021-02-09 439 mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
163f4d22c118d4 Sean Wang 2021-01-28 440
163f4d22c118d4 Sean Wang 2021-01-28 441 switch (mode) {
163f4d22c118d4 Sean Wang 2021-01-28 442 case MT_PHY_TYPE_CCK:
163f4d22c118d4 Sean Wang 2021-01-28 443 cck = true;
163f4d22c118d4 Sean Wang 2021-01-28 444 fallthrough;
163f4d22c118d4 Sean Wang 2021-01-28 445 case MT_PHY_TYPE_OFDM:
163f4d22c118d4 Sean Wang 2021-01-28 446 i = mt76_get_rate(&dev->mt76, sband, i, cck);
163f4d22c118d4 Sean Wang 2021-01-28 447 break;
163f4d22c118d4 Sean Wang 2021-01-28 448 case MT_PHY_TYPE_HT_GF:
163f4d22c118d4 Sean Wang 2021-01-28 449 case MT_PHY_TYPE_HT:
163f4d22c118d4 Sean Wang 2021-01-28 450 status->encoding = RX_ENC_HT;
163f4d22c118d4 Sean Wang 2021-01-28 451 if (i > 31)
163f4d22c118d4 Sean Wang 2021-01-28 452 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 453 break;
163f4d22c118d4 Sean Wang 2021-01-28 454 case MT_PHY_TYPE_VHT:
163f4d22c118d4 Sean Wang 2021-01-28 455 status->nss =
163f4d22c118d4 Sean Wang 2021-01-28 456 FIELD_GET(MT_PRXV_NSTS, v0) + 1;
163f4d22c118d4 Sean Wang 2021-01-28 457 status->encoding = RX_ENC_VHT;
163f4d22c118d4 Sean Wang 2021-01-28 458 if (i > 9)
163f4d22c118d4 Sean Wang 2021-01-28 459 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 460 break;
163f4d22c118d4 Sean Wang 2021-01-28 461 case MT_PHY_TYPE_HE_MU:
163f4d22c118d4 Sean Wang 2021-01-28 462 status->flag |= RX_FLAG_RADIOTAP_HE_MU;
163f4d22c118d4 Sean Wang 2021-01-28 463 fallthrough;
163f4d22c118d4 Sean Wang 2021-01-28 464 case MT_PHY_TYPE_HE_SU:
163f4d22c118d4 Sean Wang 2021-01-28 465 case MT_PHY_TYPE_HE_EXT_SU:
163f4d22c118d4 Sean Wang 2021-01-28 466 case MT_PHY_TYPE_HE_TB:
163f4d22c118d4 Sean Wang 2021-01-28 467 status->nss =
163f4d22c118d4 Sean Wang 2021-01-28 468 FIELD_GET(MT_PRXV_NSTS, v0) + 1;
163f4d22c118d4 Sean Wang 2021-01-28 469 status->encoding = RX_ENC_HE;
163f4d22c118d4 Sean Wang 2021-01-28 470 status->flag |= RX_FLAG_RADIOTAP_HE;
163f4d22c118d4 Sean Wang 2021-01-28 471 i &= GENMASK(3, 0);
163f4d22c118d4 Sean Wang 2021-01-28 472
163f4d22c118d4 Sean Wang 2021-01-28 473 if (gi <= NL80211_RATE_INFO_HE_GI_3_2)
163f4d22c118d4 Sean Wang 2021-01-28 474 status->he_gi = gi;
163f4d22c118d4 Sean Wang 2021-01-28 475
163f4d22c118d4 Sean Wang 2021-01-28 476 status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
163f4d22c118d4 Sean Wang 2021-01-28 477 break;
163f4d22c118d4 Sean Wang 2021-01-28 478 default:
163f4d22c118d4 Sean Wang 2021-01-28 479 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 480 }
716af9b953825b Sean Wang 2021-02-09 481
163f4d22c118d4 Sean Wang 2021-01-28 482 status->rate_idx = i;
163f4d22c118d4 Sean Wang 2021-01-28 483
716af9b953825b Sean Wang 2021-02-09 484 switch (FIELD_GET(MT_PRXV_FRAME_MODE, v0)) {
163f4d22c118d4 Sean Wang 2021-01-28 485 case IEEE80211_STA_RX_BW_20:
163f4d22c118d4 Sean Wang 2021-01-28 486 break;
163f4d22c118d4 Sean Wang 2021-01-28 487 case IEEE80211_STA_RX_BW_40:
163f4d22c118d4 Sean Wang 2021-01-28 488 if (mode & MT_PHY_TYPE_HE_EXT_SU &&
163f4d22c118d4 Sean Wang 2021-01-28 489 (idx & MT_PRXV_TX_ER_SU_106T)) {
163f4d22c118d4 Sean Wang 2021-01-28 490 status->bw = RATE_INFO_BW_HE_RU;
163f4d22c118d4 Sean Wang 2021-01-28 491 status->he_ru =
163f4d22c118d4 Sean Wang 2021-01-28 492 NL80211_RATE_INFO_HE_RU_ALLOC_106;
163f4d22c118d4 Sean Wang 2021-01-28 493 } else {
163f4d22c118d4 Sean Wang 2021-01-28 494 status->bw = RATE_INFO_BW_40;
163f4d22c118d4 Sean Wang 2021-01-28 495 }
163f4d22c118d4 Sean Wang 2021-01-28 496 break;
163f4d22c118d4 Sean Wang 2021-01-28 497 case IEEE80211_STA_RX_BW_80:
163f4d22c118d4 Sean Wang 2021-01-28 498 status->bw = RATE_INFO_BW_80;
163f4d22c118d4 Sean Wang 2021-01-28 499 break;
163f4d22c118d4 Sean Wang 2021-01-28 500 case IEEE80211_STA_RX_BW_160:
163f4d22c118d4 Sean Wang 2021-01-28 501 status->bw = RATE_INFO_BW_160;
163f4d22c118d4 Sean Wang 2021-01-28 502 break;
163f4d22c118d4 Sean Wang 2021-01-28 503 default:
163f4d22c118d4 Sean Wang 2021-01-28 504 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 505 }
163f4d22c118d4 Sean Wang 2021-01-28 506
163f4d22c118d4 Sean Wang 2021-01-28 507 status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
163f4d22c118d4 Sean Wang 2021-01-28 508 if (mode < MT_PHY_TYPE_HE_SU && gi)
163f4d22c118d4 Sean Wang 2021-01-28 509 status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
716af9b953825b Sean Wang 2021-02-09 510
716af9b953825b Sean Wang 2021-02-09 511 if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
716af9b953825b Sean Wang 2021-02-09 512 rxd += 18;
716af9b953825b Sean Wang 2021-02-09 513 if ((u8 *)rxd - skb->data >= skb->len)
716af9b953825b Sean Wang 2021-02-09 514 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 515 }
163f4d22c118d4 Sean Wang 2021-01-28 516 }
163f4d22c118d4 Sean Wang 2021-01-28 517
163f4d22c118d4 Sean Wang 2021-01-28 518 skb_pull(skb, (u8 *)rxd - skb->data + 2 * remove_pad);
163f4d22c118d4 Sean Wang 2021-01-28 519
163f4d22c118d4 Sean Wang 2021-01-28 520 if (insert_ccmp_hdr) {
163f4d22c118d4 Sean Wang 2021-01-28 521 u8 key_id = FIELD_GET(MT_RXD1_NORMAL_KEY_ID, rxd1);
163f4d22c118d4 Sean Wang 2021-01-28 522
163f4d22c118d4 Sean Wang 2021-01-28 523 mt76_insert_ccmp_hdr(skb, key_id);
163f4d22c118d4 Sean Wang 2021-01-28 524 }
163f4d22c118d4 Sean Wang 2021-01-28 525
163f4d22c118d4 Sean Wang 2021-01-28 526 if (rxv && status->flag & RX_FLAG_RADIOTAP_HE)
163f4d22c118d4 Sean Wang 2021-01-28 527 mt7921_mac_decode_he_radiotap(skb, status, rxv, mode);
163f4d22c118d4 Sean Wang 2021-01-28 528
163f4d22c118d4 Sean Wang 2021-01-28 529 hdr = mt76_skb_get_hdr(skb);
163f4d22c118d4 Sean Wang 2021-01-28 530 if (!status->wcid || !ieee80211_is_data_qos(hdr->frame_control))
163f4d22c118d4 Sean Wang 2021-01-28 531 return 0;
163f4d22c118d4 Sean Wang 2021-01-28 532
163f4d22c118d4 Sean Wang 2021-01-28 533 status->aggr = unicast &&
163f4d22c118d4 Sean Wang 2021-01-28 534 !ieee80211_is_qos_nullfunc(hdr->frame_control);
163f4d22c118d4 Sean Wang 2021-01-28 535 status->tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
163f4d22c118d4 Sean Wang 2021-01-28 536 status->seqno = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
163f4d22c118d4 Sean Wang 2021-01-28 537
163f4d22c118d4 Sean Wang 2021-01-28 538 return 0;
163f4d22c118d4 Sean Wang 2021-01-28 539 }
163f4d22c118d4 Sean Wang 2021-01-28 540
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 67047 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics
@ 2021-02-09 13:36 ` kernel test robot
0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-02-09 13:36 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 19165 bytes --]
Hi Lorenzo,
I love your patch! Perhaps something to improve:
[auto build test WARNING on nbd168-wireless/mt76]
[cannot apply to wireless-drivers-next/master wireless-drivers/master v5.11-rc6 next-20210125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/mt76-mt7921-multiple-fixes/20210209-190328
base: https://github.com/nbd168/wireless mt76
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/716af9b953825b6ade758b0ed48ee2ceceaee289
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Lorenzo-Bianconi/mt76-mt7921-multiple-fixes/20210209-190328
git checkout 716af9b953825b6ade758b0ed48ee2ceceaee289
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
drivers/net/wireless/mediatek/mt76/mt7921/mac.c: In function 'mt7921_mac_fill_rx':
>> drivers/net/wireless/mediatek/mt76/mt7921/mac.c:403:15: warning: variable 'v2' set but not used [-Wunused-but-set-variable]
403 | u32 v0, v1, v2;
| ^~
vim +/v2 +403 drivers/net/wireless/mediatek/mt76/mt7921/mac.c
163f4d22c118d4 Sean Wang 2021-01-28 287
163f4d22c118d4 Sean Wang 2021-01-28 288 int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
163f4d22c118d4 Sean Wang 2021-01-28 289 {
163f4d22c118d4 Sean Wang 2021-01-28 290 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
163f4d22c118d4 Sean Wang 2021-01-28 291 struct mt76_phy *mphy = &dev->mt76.phy;
163f4d22c118d4 Sean Wang 2021-01-28 292 struct mt7921_phy *phy = &dev->phy;
163f4d22c118d4 Sean Wang 2021-01-28 293 struct ieee80211_supported_band *sband;
163f4d22c118d4 Sean Wang 2021-01-28 294 struct ieee80211_hdr *hdr;
163f4d22c118d4 Sean Wang 2021-01-28 295 __le32 *rxd = (__le32 *)skb->data;
163f4d22c118d4 Sean Wang 2021-01-28 296 __le32 *rxv = NULL;
163f4d22c118d4 Sean Wang 2021-01-28 297 u32 mode = 0;
163f4d22c118d4 Sean Wang 2021-01-28 298 u32 rxd1 = le32_to_cpu(rxd[1]);
163f4d22c118d4 Sean Wang 2021-01-28 299 u32 rxd2 = le32_to_cpu(rxd[2]);
163f4d22c118d4 Sean Wang 2021-01-28 300 u32 rxd3 = le32_to_cpu(rxd[3]);
163f4d22c118d4 Sean Wang 2021-01-28 301 bool unicast, insert_ccmp_hdr = false;
163f4d22c118d4 Sean Wang 2021-01-28 302 u8 remove_pad;
163f4d22c118d4 Sean Wang 2021-01-28 303 int i, idx;
163f4d22c118d4 Sean Wang 2021-01-28 304 u8 chfreq;
163f4d22c118d4 Sean Wang 2021-01-28 305
163f4d22c118d4 Sean Wang 2021-01-28 306 memset(status, 0, sizeof(*status));
163f4d22c118d4 Sean Wang 2021-01-28 307
163f4d22c118d4 Sean Wang 2021-01-28 308 if (rxd1 & MT_RXD1_NORMAL_BAND_IDX)
163f4d22c118d4 Sean Wang 2021-01-28 309 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 310
163f4d22c118d4 Sean Wang 2021-01-28 311 if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
163f4d22c118d4 Sean Wang 2021-01-28 312 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 313
163f4d22c118d4 Sean Wang 2021-01-28 314 chfreq = FIELD_GET(MT_RXD3_NORMAL_CH_FREQ, rxd3);
163f4d22c118d4 Sean Wang 2021-01-28 315 unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
163f4d22c118d4 Sean Wang 2021-01-28 316 idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
163f4d22c118d4 Sean Wang 2021-01-28 317 status->wcid = mt7921_rx_get_wcid(dev, idx, unicast);
163f4d22c118d4 Sean Wang 2021-01-28 318
163f4d22c118d4 Sean Wang 2021-01-28 319 if (status->wcid) {
163f4d22c118d4 Sean Wang 2021-01-28 320 struct mt7921_sta *msta;
163f4d22c118d4 Sean Wang 2021-01-28 321
163f4d22c118d4 Sean Wang 2021-01-28 322 msta = container_of(status->wcid, struct mt7921_sta, wcid);
163f4d22c118d4 Sean Wang 2021-01-28 323 spin_lock_bh(&dev->sta_poll_lock);
163f4d22c118d4 Sean Wang 2021-01-28 324 if (list_empty(&msta->poll_list))
163f4d22c118d4 Sean Wang 2021-01-28 325 list_add_tail(&msta->poll_list, &dev->sta_poll_list);
163f4d22c118d4 Sean Wang 2021-01-28 326 spin_unlock_bh(&dev->sta_poll_lock);
163f4d22c118d4 Sean Wang 2021-01-28 327 }
163f4d22c118d4 Sean Wang 2021-01-28 328
163f4d22c118d4 Sean Wang 2021-01-28 329 mt7921_get_status_freq_info(dev, mphy, status, chfreq);
163f4d22c118d4 Sean Wang 2021-01-28 330
163f4d22c118d4 Sean Wang 2021-01-28 331 if (status->band == NL80211_BAND_5GHZ)
163f4d22c118d4 Sean Wang 2021-01-28 332 sband = &mphy->sband_5g.sband;
163f4d22c118d4 Sean Wang 2021-01-28 333 else
163f4d22c118d4 Sean Wang 2021-01-28 334 sband = &mphy->sband_2g.sband;
163f4d22c118d4 Sean Wang 2021-01-28 335
163f4d22c118d4 Sean Wang 2021-01-28 336 if (!sband->channels)
163f4d22c118d4 Sean Wang 2021-01-28 337 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 338
163f4d22c118d4 Sean Wang 2021-01-28 339 if (rxd1 & MT_RXD1_NORMAL_FCS_ERR)
163f4d22c118d4 Sean Wang 2021-01-28 340 status->flag |= RX_FLAG_FAILED_FCS_CRC;
163f4d22c118d4 Sean Wang 2021-01-28 341
163f4d22c118d4 Sean Wang 2021-01-28 342 if (rxd1 & MT_RXD1_NORMAL_TKIP_MIC_ERR)
163f4d22c118d4 Sean Wang 2021-01-28 343 status->flag |= RX_FLAG_MMIC_ERROR;
163f4d22c118d4 Sean Wang 2021-01-28 344
163f4d22c118d4 Sean Wang 2021-01-28 345 if (FIELD_GET(MT_RXD1_NORMAL_SEC_MODE, rxd1) != 0 &&
163f4d22c118d4 Sean Wang 2021-01-28 346 !(rxd1 & (MT_RXD1_NORMAL_CLM | MT_RXD1_NORMAL_CM))) {
163f4d22c118d4 Sean Wang 2021-01-28 347 status->flag |= RX_FLAG_DECRYPTED;
163f4d22c118d4 Sean Wang 2021-01-28 348 status->flag |= RX_FLAG_IV_STRIPPED;
163f4d22c118d4 Sean Wang 2021-01-28 349 status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
163f4d22c118d4 Sean Wang 2021-01-28 350 }
163f4d22c118d4 Sean Wang 2021-01-28 351
163f4d22c118d4 Sean Wang 2021-01-28 352 if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
163f4d22c118d4 Sean Wang 2021-01-28 353 status->flag |= RX_FLAG_AMPDU_DETAILS;
163f4d22c118d4 Sean Wang 2021-01-28 354
163f4d22c118d4 Sean Wang 2021-01-28 355 /* all subframes of an A-MPDU have the same timestamp */
163f4d22c118d4 Sean Wang 2021-01-28 356 if (phy->rx_ampdu_ts != rxd[14]) {
163f4d22c118d4 Sean Wang 2021-01-28 357 if (!++phy->ampdu_ref)
163f4d22c118d4 Sean Wang 2021-01-28 358 phy->ampdu_ref++;
163f4d22c118d4 Sean Wang 2021-01-28 359 }
163f4d22c118d4 Sean Wang 2021-01-28 360 phy->rx_ampdu_ts = rxd[14];
163f4d22c118d4 Sean Wang 2021-01-28 361
163f4d22c118d4 Sean Wang 2021-01-28 362 status->ampdu_ref = phy->ampdu_ref;
163f4d22c118d4 Sean Wang 2021-01-28 363 }
163f4d22c118d4 Sean Wang 2021-01-28 364
163f4d22c118d4 Sean Wang 2021-01-28 365 remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
163f4d22c118d4 Sean Wang 2021-01-28 366
163f4d22c118d4 Sean Wang 2021-01-28 367 if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
163f4d22c118d4 Sean Wang 2021-01-28 368 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 369
163f4d22c118d4 Sean Wang 2021-01-28 370 rxd += 6;
163f4d22c118d4 Sean Wang 2021-01-28 371 if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
163f4d22c118d4 Sean Wang 2021-01-28 372 rxd += 4;
163f4d22c118d4 Sean Wang 2021-01-28 373 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 374 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 375 }
163f4d22c118d4 Sean Wang 2021-01-28 376
163f4d22c118d4 Sean Wang 2021-01-28 377 if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
163f4d22c118d4 Sean Wang 2021-01-28 378 u8 *data = (u8 *)rxd;
163f4d22c118d4 Sean Wang 2021-01-28 379
163f4d22c118d4 Sean Wang 2021-01-28 380 if (status->flag & RX_FLAG_DECRYPTED) {
163f4d22c118d4 Sean Wang 2021-01-28 381 status->iv[0] = data[5];
163f4d22c118d4 Sean Wang 2021-01-28 382 status->iv[1] = data[4];
163f4d22c118d4 Sean Wang 2021-01-28 383 status->iv[2] = data[3];
163f4d22c118d4 Sean Wang 2021-01-28 384 status->iv[3] = data[2];
163f4d22c118d4 Sean Wang 2021-01-28 385 status->iv[4] = data[1];
163f4d22c118d4 Sean Wang 2021-01-28 386 status->iv[5] = data[0];
163f4d22c118d4 Sean Wang 2021-01-28 387
163f4d22c118d4 Sean Wang 2021-01-28 388 insert_ccmp_hdr = FIELD_GET(MT_RXD2_NORMAL_FRAG, rxd2);
163f4d22c118d4 Sean Wang 2021-01-28 389 }
163f4d22c118d4 Sean Wang 2021-01-28 390 rxd += 4;
163f4d22c118d4 Sean Wang 2021-01-28 391 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 392 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 393 }
163f4d22c118d4 Sean Wang 2021-01-28 394
163f4d22c118d4 Sean Wang 2021-01-28 395 if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
163f4d22c118d4 Sean Wang 2021-01-28 396 rxd += 2;
163f4d22c118d4 Sean Wang 2021-01-28 397 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 398 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 399 }
163f4d22c118d4 Sean Wang 2021-01-28 400
163f4d22c118d4 Sean Wang 2021-01-28 401 /* RXD Group 3 - P-RXV */
163f4d22c118d4 Sean Wang 2021-01-28 402 if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
163f4d22c118d4 Sean Wang 2021-01-28 @403 u32 v0, v1, v2;
716af9b953825b Sean Wang 2021-02-09 404 u8 stbc, gi;
716af9b953825b Sean Wang 2021-02-09 405 bool cck;
163f4d22c118d4 Sean Wang 2021-01-28 406
163f4d22c118d4 Sean Wang 2021-01-28 407 rxv = rxd;
163f4d22c118d4 Sean Wang 2021-01-28 408 rxd += 2;
163f4d22c118d4 Sean Wang 2021-01-28 409 if ((u8 *)rxd - skb->data >= skb->len)
163f4d22c118d4 Sean Wang 2021-01-28 410 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 411
163f4d22c118d4 Sean Wang 2021-01-28 412 v0 = le32_to_cpu(rxv[0]);
163f4d22c118d4 Sean Wang 2021-01-28 413 v1 = le32_to_cpu(rxv[1]);
163f4d22c118d4 Sean Wang 2021-01-28 414 v2 = le32_to_cpu(rxv[2]);
163f4d22c118d4 Sean Wang 2021-01-28 415
163f4d22c118d4 Sean Wang 2021-01-28 416 if (v0 & MT_PRXV_HT_AD_CODE)
163f4d22c118d4 Sean Wang 2021-01-28 417 status->enc_flags |= RX_ENC_FLAG_LDPC;
163f4d22c118d4 Sean Wang 2021-01-28 418
163f4d22c118d4 Sean Wang 2021-01-28 419 status->chains = mphy->antenna_mask;
163f4d22c118d4 Sean Wang 2021-01-28 420 status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
163f4d22c118d4 Sean Wang 2021-01-28 421 status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
163f4d22c118d4 Sean Wang 2021-01-28 422 status->chain_signal[2] = to_rssi(MT_PRXV_RCPI2, v1);
163f4d22c118d4 Sean Wang 2021-01-28 423 status->chain_signal[3] = to_rssi(MT_PRXV_RCPI3, v1);
163f4d22c118d4 Sean Wang 2021-01-28 424 status->signal = status->chain_signal[0];
163f4d22c118d4 Sean Wang 2021-01-28 425
163f4d22c118d4 Sean Wang 2021-01-28 426 for (i = 1; i < hweight8(mphy->antenna_mask); i++) {
163f4d22c118d4 Sean Wang 2021-01-28 427 if (!(status->chains & BIT(i)))
163f4d22c118d4 Sean Wang 2021-01-28 428 continue;
163f4d22c118d4 Sean Wang 2021-01-28 429
163f4d22c118d4 Sean Wang 2021-01-28 430 status->signal = max(status->signal,
163f4d22c118d4 Sean Wang 2021-01-28 431 status->chain_signal[i]);
163f4d22c118d4 Sean Wang 2021-01-28 432 }
163f4d22c118d4 Sean Wang 2021-01-28 433
716af9b953825b Sean Wang 2021-02-09 434 stbc = FIELD_GET(MT_PRXV_STBC, v0);
716af9b953825b Sean Wang 2021-02-09 435 gi = FIELD_GET(MT_PRXV_SGI, v0);
716af9b953825b Sean Wang 2021-02-09 436 cck = false;
163f4d22c118d4 Sean Wang 2021-01-28 437
163f4d22c118d4 Sean Wang 2021-01-28 438 idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
716af9b953825b Sean Wang 2021-02-09 439 mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
163f4d22c118d4 Sean Wang 2021-01-28 440
163f4d22c118d4 Sean Wang 2021-01-28 441 switch (mode) {
163f4d22c118d4 Sean Wang 2021-01-28 442 case MT_PHY_TYPE_CCK:
163f4d22c118d4 Sean Wang 2021-01-28 443 cck = true;
163f4d22c118d4 Sean Wang 2021-01-28 444 fallthrough;
163f4d22c118d4 Sean Wang 2021-01-28 445 case MT_PHY_TYPE_OFDM:
163f4d22c118d4 Sean Wang 2021-01-28 446 i = mt76_get_rate(&dev->mt76, sband, i, cck);
163f4d22c118d4 Sean Wang 2021-01-28 447 break;
163f4d22c118d4 Sean Wang 2021-01-28 448 case MT_PHY_TYPE_HT_GF:
163f4d22c118d4 Sean Wang 2021-01-28 449 case MT_PHY_TYPE_HT:
163f4d22c118d4 Sean Wang 2021-01-28 450 status->encoding = RX_ENC_HT;
163f4d22c118d4 Sean Wang 2021-01-28 451 if (i > 31)
163f4d22c118d4 Sean Wang 2021-01-28 452 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 453 break;
163f4d22c118d4 Sean Wang 2021-01-28 454 case MT_PHY_TYPE_VHT:
163f4d22c118d4 Sean Wang 2021-01-28 455 status->nss =
163f4d22c118d4 Sean Wang 2021-01-28 456 FIELD_GET(MT_PRXV_NSTS, v0) + 1;
163f4d22c118d4 Sean Wang 2021-01-28 457 status->encoding = RX_ENC_VHT;
163f4d22c118d4 Sean Wang 2021-01-28 458 if (i > 9)
163f4d22c118d4 Sean Wang 2021-01-28 459 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 460 break;
163f4d22c118d4 Sean Wang 2021-01-28 461 case MT_PHY_TYPE_HE_MU:
163f4d22c118d4 Sean Wang 2021-01-28 462 status->flag |= RX_FLAG_RADIOTAP_HE_MU;
163f4d22c118d4 Sean Wang 2021-01-28 463 fallthrough;
163f4d22c118d4 Sean Wang 2021-01-28 464 case MT_PHY_TYPE_HE_SU:
163f4d22c118d4 Sean Wang 2021-01-28 465 case MT_PHY_TYPE_HE_EXT_SU:
163f4d22c118d4 Sean Wang 2021-01-28 466 case MT_PHY_TYPE_HE_TB:
163f4d22c118d4 Sean Wang 2021-01-28 467 status->nss =
163f4d22c118d4 Sean Wang 2021-01-28 468 FIELD_GET(MT_PRXV_NSTS, v0) + 1;
163f4d22c118d4 Sean Wang 2021-01-28 469 status->encoding = RX_ENC_HE;
163f4d22c118d4 Sean Wang 2021-01-28 470 status->flag |= RX_FLAG_RADIOTAP_HE;
163f4d22c118d4 Sean Wang 2021-01-28 471 i &= GENMASK(3, 0);
163f4d22c118d4 Sean Wang 2021-01-28 472
163f4d22c118d4 Sean Wang 2021-01-28 473 if (gi <= NL80211_RATE_INFO_HE_GI_3_2)
163f4d22c118d4 Sean Wang 2021-01-28 474 status->he_gi = gi;
163f4d22c118d4 Sean Wang 2021-01-28 475
163f4d22c118d4 Sean Wang 2021-01-28 476 status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
163f4d22c118d4 Sean Wang 2021-01-28 477 break;
163f4d22c118d4 Sean Wang 2021-01-28 478 default:
163f4d22c118d4 Sean Wang 2021-01-28 479 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 480 }
716af9b953825b Sean Wang 2021-02-09 481
163f4d22c118d4 Sean Wang 2021-01-28 482 status->rate_idx = i;
163f4d22c118d4 Sean Wang 2021-01-28 483
716af9b953825b Sean Wang 2021-02-09 484 switch (FIELD_GET(MT_PRXV_FRAME_MODE, v0)) {
163f4d22c118d4 Sean Wang 2021-01-28 485 case IEEE80211_STA_RX_BW_20:
163f4d22c118d4 Sean Wang 2021-01-28 486 break;
163f4d22c118d4 Sean Wang 2021-01-28 487 case IEEE80211_STA_RX_BW_40:
163f4d22c118d4 Sean Wang 2021-01-28 488 if (mode & MT_PHY_TYPE_HE_EXT_SU &&
163f4d22c118d4 Sean Wang 2021-01-28 489 (idx & MT_PRXV_TX_ER_SU_106T)) {
163f4d22c118d4 Sean Wang 2021-01-28 490 status->bw = RATE_INFO_BW_HE_RU;
163f4d22c118d4 Sean Wang 2021-01-28 491 status->he_ru =
163f4d22c118d4 Sean Wang 2021-01-28 492 NL80211_RATE_INFO_HE_RU_ALLOC_106;
163f4d22c118d4 Sean Wang 2021-01-28 493 } else {
163f4d22c118d4 Sean Wang 2021-01-28 494 status->bw = RATE_INFO_BW_40;
163f4d22c118d4 Sean Wang 2021-01-28 495 }
163f4d22c118d4 Sean Wang 2021-01-28 496 break;
163f4d22c118d4 Sean Wang 2021-01-28 497 case IEEE80211_STA_RX_BW_80:
163f4d22c118d4 Sean Wang 2021-01-28 498 status->bw = RATE_INFO_BW_80;
163f4d22c118d4 Sean Wang 2021-01-28 499 break;
163f4d22c118d4 Sean Wang 2021-01-28 500 case IEEE80211_STA_RX_BW_160:
163f4d22c118d4 Sean Wang 2021-01-28 501 status->bw = RATE_INFO_BW_160;
163f4d22c118d4 Sean Wang 2021-01-28 502 break;
163f4d22c118d4 Sean Wang 2021-01-28 503 default:
163f4d22c118d4 Sean Wang 2021-01-28 504 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 505 }
163f4d22c118d4 Sean Wang 2021-01-28 506
163f4d22c118d4 Sean Wang 2021-01-28 507 status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
163f4d22c118d4 Sean Wang 2021-01-28 508 if (mode < MT_PHY_TYPE_HE_SU && gi)
163f4d22c118d4 Sean Wang 2021-01-28 509 status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
716af9b953825b Sean Wang 2021-02-09 510
716af9b953825b Sean Wang 2021-02-09 511 if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
716af9b953825b Sean Wang 2021-02-09 512 rxd += 18;
716af9b953825b Sean Wang 2021-02-09 513 if ((u8 *)rxd - skb->data >= skb->len)
716af9b953825b Sean Wang 2021-02-09 514 return -EINVAL;
163f4d22c118d4 Sean Wang 2021-01-28 515 }
163f4d22c118d4 Sean Wang 2021-01-28 516 }
163f4d22c118d4 Sean Wang 2021-01-28 517
163f4d22c118d4 Sean Wang 2021-01-28 518 skb_pull(skb, (u8 *)rxd - skb->data + 2 * remove_pad);
163f4d22c118d4 Sean Wang 2021-01-28 519
163f4d22c118d4 Sean Wang 2021-01-28 520 if (insert_ccmp_hdr) {
163f4d22c118d4 Sean Wang 2021-01-28 521 u8 key_id = FIELD_GET(MT_RXD1_NORMAL_KEY_ID, rxd1);
163f4d22c118d4 Sean Wang 2021-01-28 522
163f4d22c118d4 Sean Wang 2021-01-28 523 mt76_insert_ccmp_hdr(skb, key_id);
163f4d22c118d4 Sean Wang 2021-01-28 524 }
163f4d22c118d4 Sean Wang 2021-01-28 525
163f4d22c118d4 Sean Wang 2021-01-28 526 if (rxv && status->flag & RX_FLAG_RADIOTAP_HE)
163f4d22c118d4 Sean Wang 2021-01-28 527 mt7921_mac_decode_he_radiotap(skb, status, rxv, mode);
163f4d22c118d4 Sean Wang 2021-01-28 528
163f4d22c118d4 Sean Wang 2021-01-28 529 hdr = mt76_skb_get_hdr(skb);
163f4d22c118d4 Sean Wang 2021-01-28 530 if (!status->wcid || !ieee80211_is_data_qos(hdr->frame_control))
163f4d22c118d4 Sean Wang 2021-01-28 531 return 0;
163f4d22c118d4 Sean Wang 2021-01-28 532
163f4d22c118d4 Sean Wang 2021-01-28 533 status->aggr = unicast &&
163f4d22c118d4 Sean Wang 2021-01-28 534 !ieee80211_is_qos_nullfunc(hdr->frame_control);
163f4d22c118d4 Sean Wang 2021-01-28 535 status->tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
163f4d22c118d4 Sean Wang 2021-01-28 536 status->seqno = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
163f4d22c118d4 Sean Wang 2021-01-28 537
163f4d22c118d4 Sean Wang 2021-01-28 538 return 0;
163f4d22c118d4 Sean Wang 2021-01-28 539 }
163f4d22c118d4 Sean Wang 2021-01-28 540
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 67047 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2021-02-09 13:38 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-02-09 10:54 [PATCH 0/6] mt76: mt7921: multiple fixes Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 1/6] mt76: mt7921: switch to new api for hardware beacon filter Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 2/6] mt76: connac: fix up the setting for ht40 mode in mt76_connac_mcu_uni_add_bss Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 3/6] mt76: mt7921: fixup rx bitrate statistics Lorenzo Bianconi
2021-02-09 13:36 ` kernel test robot
2021-02-09 13:36 ` kernel test robot
2021-02-09 10:54 ` [PATCH 4/6] mt76: mt7921: add flush operation Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 5/6] mt76: mt7921: fix uninitialized pointer access in mt7921_get_wtbl_info Lorenzo Bianconi
2021-02-09 10:54 ` [PATCH 6/6] mt76: connac: update sched_scan cmd usage Lorenzo Bianconi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.