wifi: mt76: mt7921: fix antenna signal are way off in monitor mode
authorSean Wang <sean.wang@mediatek.com>
Fri, 16 Sep 2022 22:46:45 +0000 (06:46 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 1 Dec 2022 16:29:12 +0000 (17:29 +0100)
Group 3 in RxD is disabled in monitor mode. We should use the group 5 in
RxD instead to fix antenna signal way off issue, e.g we would see the
incorrect antenna signal value in wireshark. On the other hand, Group 5
wouldn't be used in STA or AP mode, so the patch shouldn't cause any
harm to those modes.

Fixes: cbaa0a404f8d ("mt76: mt7921: fix up the monitor mode")
Reported-by: Adrian Granados <agranados@gmail.com>
Co-developed-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/mac.c

index 650ab97..6860468 100644 (file)
@@ -396,6 +396,27 @@ mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
                if (v0 & MT_PRXV_HT_AD_CODE)
                        status->enc_flags |= RX_ENC_FLAG_LDPC;
 
+               ret = mt76_connac2_mac_fill_rx_rate(&dev->mt76, status, sband,
+                                                   rxv, &mode);
+               if (ret < 0)
+                       return ret;
+
+               if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
+                       rxd += 6;
+                       if ((u8 *)rxd - skb->data >= skb->len)
+                               return -EINVAL;
+
+                       rxv = rxd;
+                       /* Monitor mode would use RCPI described in GROUP 5
+                        * instead.
+                        */
+                       v1 = le32_to_cpu(rxv[0]);
+
+                       rxd += 12;
+                       if ((u8 *)rxd - skb->data >= skb->len)
+                               return -EINVAL;
+               }
+
                status->chains = mphy->antenna_mask;
                status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
                status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
@@ -410,17 +431,6 @@ mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
                        status->signal = max(status->signal,
                                             status->chain_signal[i]);
                }
-
-               ret = mt76_connac2_mac_fill_rx_rate(&dev->mt76, status, sband,
-                                                   rxv, &mode);
-               if (ret < 0)
-                       return ret;
-
-               if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
-                       rxd += 18;
-                       if ((u8 *)rxd - skb->data >= skb->len)
-                               return -EINVAL;
-               }
        }
 
        amsdu_info = FIELD_GET(MT_RXD4_NORMAL_PAYLOAD_FORMAT, rxd4);