mt76: mt7915: update rx rate reporting for mt7916
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>
This commit is contained in:
parent
c17780e7b2
commit
1c9db0aa23
4 changed files with 121 additions and 76 deletions
|
@ -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(dev, MT_MDP_BNRCFR1(band), mask, set);
|
||||||
|
|
||||||
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 0x680);
|
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);
|
mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -462,6 +462,108 @@ static int mt7915_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
|
||||||
return 0;
|
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
|
static int
|
||||||
mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
|
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 */
|
/* RXD Group 3 - P-RXV */
|
||||||
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
|
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
|
||||||
u32 v0, v1, v2;
|
u32 v0, v1;
|
||||||
|
int ret;
|
||||||
|
|
||||||
rxv = rxd;
|
rxv = rxd;
|
||||||
rxd += 2;
|
rxd += 2;
|
||||||
|
@ -635,7 +738,6 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
|
||||||
|
|
||||||
v0 = le32_to_cpu(rxv[0]);
|
v0 = le32_to_cpu(rxv[0]);
|
||||||
v1 = le32_to_cpu(rxv[1]);
|
v1 = le32_to_cpu(rxv[1]);
|
||||||
v2 = le32_to_cpu(rxv[2]);
|
|
||||||
|
|
||||||
if (v0 & MT_PRXV_HT_AD_CODE)
|
if (v0 & MT_PRXV_HT_AD_CODE)
|
||||||
status->enc_flags |= RX_ENC_FLAG_LDPC;
|
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 */
|
/* RXD Group 5 - C-RXV */
|
||||||
if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
|
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;
|
rxd += 18;
|
||||||
if ((u8 *)rxd - skb->data >= skb->len)
|
if ((u8 *)rxd - skb->data >= skb->len)
|
||||||
return -EINVAL;
|
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 (!is_mt7915(&dev->mt76) ||
|
||||||
if (mode < MT_PHY_TYPE_HE_SU && gi)
|
(is_mt7915(&dev->mt76) &&
|
||||||
status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
|
(rxd1 & MT_RXD1_NORMAL_GROUP_5))) {
|
||||||
|
ret = mt7915_mac_fill_rx_rate(dev, status, sband, rxv);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,12 @@ enum rx_pkt_type {
|
||||||
#define MT_PRXV_RCPI2 GENMASK(23, 16)
|
#define MT_PRXV_RCPI2 GENMASK(23, 16)
|
||||||
#define MT_PRXV_RCPI1 GENMASK(15, 8)
|
#define MT_PRXV_RCPI1 GENMASK(15, 8)
|
||||||
#define MT_PRXV_RCPI0 GENMASK(7, 0)
|
#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 */
|
/* C-RXV */
|
||||||
#define MT_CRXV_HT_STBC GENMASK(1, 0)
|
#define MT_CRXV_HT_STBC GENMASK(1, 0)
|
||||||
|
|
|
@ -1006,7 +1006,8 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
|
||||||
struct rate_info *txrate = &msta->wcid.rate;
|
struct rate_info *txrate = &msta->wcid.rate;
|
||||||
struct rate_info rxrate = {};
|
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->rxrate = rxrate;
|
||||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
|
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue