2021-11-18 16:41:36

by Ben Greear

[permalink] [raw]
Subject: [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains

From: Ben Greear <[email protected]>

When group-5 is enabled, we can find the actuall NSS used.
In that case, update the rx chains info so that the upper
stack can give better idea of actual antenna usage.

Signed-off-by: Ben Greear <[email protected]>
---
.../net/wireless/mediatek/mt76/mt7915/mac.c | 32 +++++++++++++------
1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index a6bcc76dcb03..ddc85464b1e9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -560,6 +560,7 @@ 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;
+ u8 nss;

rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
@@ -577,21 +578,12 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
/* TODO: When group-5 is enabled, use nss (and stbc) to
* calculate chains properly for this particular skb.
*/
- 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);
status->chain_signal[2] = to_rssi(MT_PRXV_RCPI2, v1);
status->chain_signal[3] = to_rssi(MT_PRXV_RCPI3, v1);
- status->signal = status->chain_signal[0];

- for (i = 1; i < hweight8(mphy->antenna_mask); i++) {
- if (!(status->chains & BIT(i)))
- continue;
-
- /* TODO: Use db sum logic instead of max. */
- status->signal = max(status->signal,
- status->chain_signal[i]);
- }
+ nss = hweight8(mphy->antenna_mask);

/* RXD Group 5 - C-RXV.
* Group 5 Not currently enabled for 7915 except in
@@ -604,6 +596,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
bool cck = false;

+ nss = 1;
rxd += 18;
if ((u8 *)rxd - skb->data >= skb->len)
return -EINVAL;
@@ -623,6 +616,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->encoding = RX_ENC_HT;
if (i > 31)
return -EINVAL;
+ nss = i / 8 + 1;
break;
case MT_PHY_TYPE_VHT:
status->nss =
@@ -630,6 +624,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->encoding = RX_ENC_VHT;
if (i > 9)
return -EINVAL;
+ nss = status->nss;
break;
case MT_PHY_TYPE_HE_MU:
status->flag |= RX_FLAG_RADIOTAP_HE_MU;
@@ -639,6 +634,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
case MT_PHY_TYPE_HE_TB:
status->nss =
FIELD_GET(MT_PRXV_NSTS, v0) + 1;
+ nss = status->nss;
status->encoding = RX_ENC_HE;
status->flag |= RX_FLAG_RADIOTAP_HE;
i &= GENMASK(3, 0);
@@ -653,6 +649,11 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
status->rate_idx = i;

+ if (stbc) {
+ nss *= 2;
+ WARN_ON_ONCE(nss > 4);
+ }
+
switch (FIELD_GET(MT_CRXV_FRAME_MODE, v2)) {
case IEEE80211_STA_RX_BW_20:
break;
@@ -680,6 +681,17 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (mode < MT_PHY_TYPE_HE_SU && gi)
status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
}
+
+ status->chains = 1;
+ status->signal = status->chain_signal[0];
+
+ for (i = 1; i < nss; i++) {
+ status->chains |= BIT(i);
+
+ /* TODO: Use db sum logic instead of max. */
+ status->signal = max(status->signal,
+ status->chain_signal[i]);
+ }
}

skb_pull(skb, (u8 *)rxd - skb->data + 2 * remove_pad);
--
2.20.1



2021-12-03 09:16:07

by Felix Fietkau

[permalink] [raw]
Subject: Re: [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains

On 2021-11-18 17:40, [email protected] wrote:
> From: Ben Greear <[email protected]>
>
> When group-5 is enabled, we can find the actuall NSS used.
> In that case, update the rx chains info so that the upper
> stack can give better idea of actual antenna usage.
>
> Signed-off-by: Ben Greear <[email protected]>
I'm not sure this is correct. From my understanding, nss does not
determine which antennas (and how many of them) are involved in
receiving the signal.

- Felix

2021-12-03 15:33:12

by Ben Greear

[permalink] [raw]
Subject: Re: [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains

On 12/3/21 1:16 AM, Felix Fietkau wrote:
> On 2021-11-18 17:40, [email protected] wrote:
>> From: Ben Greear <[email protected]>
>>
>> When group-5 is enabled, we can find the actuall NSS used.
>> In that case, update the rx chains info so that the upper
>> stack can give better idea of actual antenna usage.
>>
>> Signed-off-by: Ben Greear <[email protected]>
> I'm not sure this is correct. From my understanding, nss does not determine which antennas (and how many of them) are involved in receiving the signal.
>
> - Felix
>

I guess this would take some special knowledge of this chip and how firmware reports
the descriptor to know for sure.

Ath10k at least acts similar to how I wrote this patch....

Thanks,
Ben

--
Ben Greear <[email protected]>
Candela Technologies Inc http://www.candelatech.com