mt76: mt7915: update rx rate reporting for mt7916
authorBo Jiao <Bo.Jiao@mediatek.com>
Mon, 20 Dec 2021 02:18:01 +0000 (10:18 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:57:56 +0000 (13:57 +0100)
mt7916 reports rx rate from rxd group3 directly.

Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
Co-developed-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/init.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.h
drivers/net/wireless/mediatek/mt76/mt7915/main.c

index 6be14f5f8dff45e27c46bcfc2bb097a150300c0d..1f49f55687b5abc385c8e90cfe30544c4621f374 100644 (file)
@@ -408,7 +408,8 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)
        mt76_rmw(dev, MT_MDP_BNRCFR1(band), mask, set);
 
        mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 0x680);
-       /* disable rx rate report by default due to hw issues */
+
+       /* mt7915: disable rx rate report by default due to hw issues */
        mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
 }
 
index 74ec7cd01272ac5a15f0751547d032a9533d673c..d83e828b6e3e1e16a7abaf16deb91b6dcee6db40 100644 (file)
@@ -462,6 +462,108 @@ static int mt7915_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        return 0;
 }
 
+static int
+mt7915_mac_fill_rx_rate(struct mt7915_dev *dev,
+                       struct mt76_rx_status *status,
+                       struct ieee80211_supported_band *sband,
+                       __le32 *rxv)
+{
+       u32 v0, v2;
+       u8 stbc, gi, bw, dcm, mode, nss;
+       int i, idx;
+       bool cck = false;
+
+       v0 = le32_to_cpu(rxv[0]);
+       v2 = le32_to_cpu(rxv[2]);
+
+       idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
+       nss = FIELD_GET(MT_PRXV_NSTS, v0) + 1;
+
+       if (!is_mt7915(&dev->mt76)) {
+               stbc = FIELD_GET(MT_PRXV_HT_STBC, v0);
+               gi = FIELD_GET(MT_PRXV_HT_SHORT_GI, v0);
+               mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
+               dcm = FIELD_GET(MT_PRXV_DCM, v0);
+               bw = FIELD_GET(MT_PRXV_FRAME_MODE, v0);
+       } else {
+               stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
+               gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
+               mode = FIELD_GET(MT_CRXV_TX_MODE, v2);
+               dcm = !!(idx & GENMASK(3, 0) & MT_PRXV_TX_DCM);
+               bw = FIELD_GET(MT_CRXV_FRAME_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 (gi)
+                       status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
+               if (i > 31)
+                       return -EINVAL;
+               break;
+       case MT_PHY_TYPE_VHT:
+               status->nss = nss;
+               status->encoding = RX_ENC_VHT;
+               if (gi)
+                       status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
+               if (i > 9)
+                       return -EINVAL;
+               break;
+       case MT_PHY_TYPE_HE_MU:
+       case MT_PHY_TYPE_HE_SU:
+       case MT_PHY_TYPE_HE_EXT_SU:
+       case MT_PHY_TYPE_HE_TB:
+               status->nss = nss;
+               status->encoding = RX_ENC_HE;
+               i &= GENMASK(3, 0);
+
+               if (gi <= NL80211_RATE_INFO_HE_GI_3_2)
+                       status->he_gi = gi;
+
+               status->he_dcm = dcm;
+               break;
+       default:
+               return -EINVAL;
+       }
+       status->rate_idx = i;
+
+       switch (bw) {
+       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;
+
+       return 0;
+}
+
 static int
 mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
 {
@@ -626,7 +728,8 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
 
        /* RXD Group 3 - P-RXV */
        if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
-               u32 v0, v1, v2;
+               u32 v0, v1;
+               int ret;
 
                rxv = rxd;
                rxd += 2;
@@ -635,7 +738,6 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
 
                v0 = le32_to_cpu(rxv[0]);
                v1 = le32_to_cpu(rxv[1]);
-               v2 = le32_to_cpu(rxv[2]);
 
                if (v0 & MT_PRXV_HT_AD_CODE)
                        status->enc_flags |= RX_ENC_FLAG_LDPC;
@@ -657,82 +759,17 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
 
                /* 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;
-
                        rxd += 18;
                        if ((u8 *)rxd - skb->data >= skb->len)
                                return -EINVAL;
+               }
 
-                       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:
-                       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;
-                               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_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:
-                               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;
+               if (!is_mt7915(&dev->mt76) ||
+                   (is_mt7915(&dev->mt76) &&
+                    (rxd1 & MT_RXD1_NORMAL_GROUP_5))) {
+                       ret = mt7915_mac_fill_rx_rate(dev, status, sband, rxv);
+                       if (ret < 0)
+                               return ret;
                }
        }
 
index 4504ebcbcd13a5934960de8b78c52a73178d1d1f..d79f0a56535f0913e4e431ce1e574012bf717db6 100644 (file)
@@ -125,6 +125,12 @@ enum rx_pkt_type {
 #define MT_PRXV_RCPI2                  GENMASK(23, 16)
 #define MT_PRXV_RCPI1                  GENMASK(15, 8)
 #define MT_PRXV_RCPI0                  GENMASK(7, 0)
+#define MT_PRXV_HT_SHORT_GI            GENMASK(16, 15)
+#define MT_PRXV_HT_STBC                        GENMASK(23, 22)
+#define MT_PRXV_TX_MODE                        GENMASK(27, 24)
+#define MT_PRXV_FRAME_MODE             GENMASK(14, 12)
+#define MT_PRXV_DCM                    BIT(17)
+#define MT_PRXV_NUM_RX                 BIT(20, 18)
 
 /* C-RXV */
 #define MT_CRXV_HT_STBC                        GENMASK(1, 0)
index 8302fae8b4cb221dc28e9803c6d30fb3a29fca9f..d2a7a4a499cddb11ac208b0151c67ad3b282fe59 100644 (file)
@@ -1006,7 +1006,8 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
        struct rate_info *txrate = &msta->wcid.rate;
        struct rate_info rxrate = {};
 
-       if (!mt7915_mcu_get_rx_rate(phy, vif, sta, &rxrate)) {
+       if (is_mt7915(&phy->dev->mt76) &&
+           !mt7915_mcu_get_rx_rate(phy, vif, sta, &rxrate)) {
                sinfo->rxrate = rxrate;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
        }