2021-11-18 16:41:48

by Ben Greear

[permalink] [raw]
Subject: [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing

From: Ben Greear <[email protected]>

This is a tricky beast to understand, so add some notes for
next time someone is looking at this code and trying to compare
against documents.

Signed-off-by: Ben Greear <[email protected]>
---

txs and related patches rebased on top of 5.16

.../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 8e5b87af2efb..6fbd58ae9c88 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
__le32 *rxd = (__le32 *)skb->data;
__le32 *rxv = NULL;
u32 mode = 0;
+ /* table "PP -> HOST / X-CPU" RX Format */
u32 rxd0 = le32_to_cpu(rxd[0]);
u32 rxd1 = le32_to_cpu(rxd[1]);
u32 rxd2 = le32_to_cpu(rxd[2]);
@@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)

rxd += 6;
if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
- u32 v0 = le32_to_cpu(rxd[0]);
+ u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
u32 v2 = le32_to_cpu(rxd[2]);

fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
@@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}

if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
+ /* DW10, assuming Group-4 enabled */
u8 *data = (u8 *)rxd;

if (status->flag & RX_FLAG_DECRYPTED) {
@@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}

if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
+ /* DW14, assuming group-1,4 */
status->timestamp = le32_to_cpu(rxd[0]);
status->flag |= RX_FLAG_MACTIME_START;

@@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
u32 v0, v1, v2;

- rxv = rxd;
+ rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
if ((u8 *)rxd - skb->data >= skb->len)
return -EINVAL;

- v0 = le32_to_cpu(rxv[0]);
+ v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
+ /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
v1 = le32_to_cpu(rxv[1]);
- v2 = le32_to_cpu(rxv[2]);
+ v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */

if (v0 & MT_PRXV_HT_AD_CODE)
status->enc_flags |= RX_ENC_FLAG_LDPC;

+ /* 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);
@@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (!(status->chains & BIT(i)))
continue;

+ /* TODO: Use db sum logic instead of max. */
status->signal = max(status->signal,
status->chain_signal[i]);
}

- /* RXD Group 5 - C-RXV */
+ /* RXD Group 5 - C-RXV.
+ * Group 5 Not currently enabled for 7915 except in
+ * monitor mode.
+ * See MT_DMA_DCR0_RXD_G5_EN
+ */
if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
+ /* See RXV document ... */
u8 stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
bool cck = false;
--
2.20.1



2021-11-18 16:46:45

by Ben Greear

[permalink] [raw]
Subject: [PATCH 06/11] mt76: mt7915: ethtool counters for driver rx path

From: Ben Greear <[email protected]>

Add some per-phy counters for rx errors in the driver.

Signed-off-by: Ben Greear <[email protected]>
---
.../net/wireless/mediatek/mt76/mt7915/mac.c | 45 ++++++++++++++-----
.../net/wireless/mediatek/mt76/mt7915/main.c | 22 +++++++++
.../wireless/mediatek/mt76/mt7915/mt7915.h | 11 +++++
3 files changed, 68 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 2915e7237d96..edf33540658e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -425,9 +425,12 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
__le16 fc = 0;
int i, idx;
struct mt76_sta_stats *stats = NULL;
+ struct mib_stats *mib = &phy->mib;

memset(status, 0, sizeof(*status));

+ mib->rx_d_skb++;
+
if (rxd1 & MT_RXD1_NORMAL_BAND_IDX) {
mphy = dev->mt76.phy2;
if (!mphy)
@@ -440,8 +443,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
return -EINVAL;

- if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR)
+ if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR) {
+ mib->rx_d_rxd2_amsdu_err++;
return -EINVAL;
+ }

unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
@@ -466,8 +471,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
else
sband = &mphy->sband_2g.sband;

- if (!sband->channels)
+ if (!sband->channels) {
+ mib->rx_d_null_channels++;
return -EINVAL;
+ }

if ((rxd0 & csum_mask) == csum_mask)
skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -487,8 +494,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)

remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);

- if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
+ if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR) {
+ mib->rx_d_max_len_err++;
return -EINVAL;
+ }

rxd += 6;
if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
@@ -500,8 +509,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
seq_ctrl = FIELD_GET(MT_RXD8_SEQ_CTRL, v2);

rxd += 4;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}

if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
@@ -532,8 +543,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
}
rxd += 4;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}

if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
@@ -555,8 +568,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}

rxd += 2;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}

/* RXD Group 3 - P-RXV */
@@ -566,8 +581,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)

rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }

v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
/* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
@@ -600,8 +617,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)

nss = 1;
rxd += 18;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }

idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
mode = FIELD_GET(MT_CRXV_TX_MODE, v2);
@@ -616,16 +635,20 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
case MT_PHY_TYPE_HT_GF:
case MT_PHY_TYPE_HT:
status->encoding = RX_ENC_HT;
- if (i > 31)
+ if (i > 31) {
+ mib->rx_d_bad_ht_rix++;
return -EINVAL;
+ }
nss = i / 8 + 1;
break;
case MT_PHY_TYPE_VHT:
status->nss =
FIELD_GET(MT_PRXV_NSTS, v0) + 1;
status->encoding = RX_ENC_VHT;
- if (i > 9)
+ if (i > 9) {
+ mib->rx_d_bad_vht_rix++;
return -EINVAL;
+ }
nss = status->nss;
break;
case MT_PHY_TYPE_HE_MU:
@@ -647,6 +670,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
break;
default:
+ mib->rx_d_bad_mode++;
return -EINVAL;
}
status->rate_idx = i;
@@ -697,6 +721,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->bw = RATE_INFO_BW_160;
break;
default:
+ mib->rx_d_bad_bw++;
return -EINVAL;
}

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index bfc81e008f86..f6c334721bca 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1140,6 +1140,17 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
"rx_vec_queue_overflow_drop_cnt",
"rx_ba_cnt",

+ /* driver rx counters */
+ "d_rx_skb",
+ "d_rx_rxd2_amsdu_err",
+ "d_rx_null_channels",
+ "d_rx_max_len_err",
+ "d_rx_too_short",
+ "d_rx_bad_ht_rix",
+ "d_rx_bad_vht_rix",
+ "d_rx_bad_mode",
+ "d_rx_bad_bw",
+
/* per vif counters */
"v_tx_mpdu_attempts", /* counting any retries */
"v_tx_mpdu_fail", /* frames that failed even after retry */
@@ -1307,6 +1318,17 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->rx_vec_queue_overflow_drop_cnt;
data[ei++] = mib->rx_ba_cnt;

+ /* rx stats from driver */
+ data[ei++] = mib->rx_d_skb;
+ data[ei++] = mib->rx_d_rxd2_amsdu_err;
+ data[ei++] = mib->rx_d_null_channels;
+ data[ei++] = mib->rx_d_max_len_err;
+ data[ei++] = mib->rx_d_too_short;
+ data[ei++] = mib->rx_d_bad_ht_rix;
+ data[ei++] = mib->rx_d_bad_vht_rix;
+ data[ei++] = mib->rx_d_bad_mode;
+ data[ei++] = mib->rx_d_bad_bw;
+
/* Add values for all stations owned by this vif */
wi.initial_stat_idx = ei;
ieee80211_iterate_stations_atomic(hw, mt7915_ethtool_worker, &wi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 84fff60ada92..bcbc8496516e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -188,6 +188,17 @@ struct mib_stats {

u32 tx_amsdu[8];
u32 tx_amsdu_cnt;
+
+ /* rx stats from the driver */
+ u32 rx_d_skb; /* total skb received in rx path */
+ u32 rx_d_rxd2_amsdu_err;
+ u32 rx_d_null_channels;
+ u32 rx_d_max_len_err;
+ u32 rx_d_too_short;
+ u32 rx_d_bad_ht_rix;
+ u32 rx_d_bad_vht_rix;
+ u32 rx_d_bad_mode;
+ u32 rx_d_bad_bw;
};

struct mt7915_hif {
--
2.20.1


2021-11-19 16:33:30

by Lorenzo Bianconi

[permalink] [raw]
Subject: Re: [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing

> From: Ben Greear <[email protected]>
>
> This is a tricky beast to understand, so add some notes for
> next time someone is looking at this code and trying to compare
> against documents.
>
> Signed-off-by: Ben Greear <[email protected]>
> ---
>
> txs and related patches rebased on top of 5.16
>
> .../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
> 1 file changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> index 8e5b87af2efb..6fbd58ae9c88 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> @@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> __le32 *rxd = (__le32 *)skb->data;
> __le32 *rxv = NULL;
> u32 mode = 0;
> + /* table "PP -> HOST / X-CPU" RX Format */
> u32 rxd0 = le32_to_cpu(rxd[0]);
> u32 rxd1 = le32_to_cpu(rxd[1]);
> u32 rxd2 = le32_to_cpu(rxd[2]);
> @@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>
> rxd += 6;
> if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
> - u32 v0 = le32_to_cpu(rxd[0]);
> + u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
> u32 v2 = le32_to_cpu(rxd[2]);
>
> fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
> @@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> }
>
> if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
> + /* DW10, assuming Group-4 enabled */
> u8 *data = (u8 *)rxd;
>
> if (status->flag & RX_FLAG_DECRYPTED) {
> @@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> }
>
> if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
> + /* DW14, assuming group-1,4 */
> status->timestamp = le32_to_cpu(rxd[0]);
> status->flag |= RX_FLAG_MACTIME_START;
>
> @@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
> u32 v0, v1, v2;
>
> - rxv = rxd;
> + rxv = rxd; /* DW16 assuming group 1,2,3,4 */
> rxd += 2;
> if ((u8 *)rxd - skb->data >= skb->len)
> return -EINVAL;
>
> - v0 = le32_to_cpu(rxv[0]);
> + v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
> + /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */

This seems not so useful for everybody.

> v1 = le32_to_cpu(rxv[1]);
> - v2 = le32_to_cpu(rxv[2]);
> + v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */
>
> if (v0 & MT_PRXV_HT_AD_CODE)
> status->enc_flags |= RX_ENC_FLAG_LDPC;
>
> + /* 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);
> @@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> if (!(status->chains & BIT(i)))
> continue;
>
> + /* TODO: Use db sum logic instead of max. */

This seems just a not for you :)

> status->signal = max(status->signal,
> status->chain_signal[i]);
> }
>
> - /* RXD Group 5 - C-RXV */
> + /* RXD Group 5 - C-RXV.
> + * Group 5 Not currently enabled for 7915 except in
> + * monitor mode.
> + * See MT_DMA_DCR0_RXD_G5_EN
> + */
> if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
> + /* See RXV document ... */

This is not so useful :)

> u8 stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
> u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
> bool cck = false;
> --
> 2.20.1
>


Attachments:
(No filename) (3.55 kB)
signature.asc (228.00 B)
Download all attachments

2021-11-19 16:41:54

by Ben Greear

[permalink] [raw]
Subject: Re: [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing

On 11/19/21 8:33 AM, Lorenzo Bianconi wrote:
>> From: Ben Greear <[email protected]>
>>
>> This is a tricky beast to understand, so add some notes for
>> next time someone is looking at this code and trying to compare
>> against documents.
>>
>> Signed-off-by: Ben Greear <[email protected]>
>> ---
>>
>> txs and related patches rebased on top of 5.16
>>
>> .../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
>> 1 file changed, 18 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> index 8e5b87af2efb..6fbd58ae9c88 100644
>> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> @@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> __le32 *rxd = (__le32 *)skb->data;
>> __le32 *rxv = NULL;
>> u32 mode = 0;
>> + /* table "PP -> HOST / X-CPU" RX Format */
>> u32 rxd0 = le32_to_cpu(rxd[0]);
>> u32 rxd1 = le32_to_cpu(rxd[1]);
>> u32 rxd2 = le32_to_cpu(rxd[2]);
>> @@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>>
>> rxd += 6;
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
>> - u32 v0 = le32_to_cpu(rxd[0]);
>> + u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
>> u32 v2 = le32_to_cpu(rxd[2]);
>>
>> fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
>> @@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> }
>>
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
>> + /* DW10, assuming Group-4 enabled */
>> u8 *data = (u8 *)rxd;
>>
>> if (status->flag & RX_FLAG_DECRYPTED) {
>> @@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> }
>>
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
>> + /* DW14, assuming group-1,4 */
>> status->timestamp = le32_to_cpu(rxd[0]);
>> status->flag |= RX_FLAG_MACTIME_START;
>>
>> @@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
>> u32 v0, v1, v2;
>>
>> - rxv = rxd;
>> + rxv = rxd; /* DW16 assuming group 1,2,3,4 */
>> rxd += 2;
>> if ((u8 *)rxd - skb->data >= skb->len)
>> return -EINVAL;
>>
>> - v0 = le32_to_cpu(rxv[0]);
>> + v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
>> + /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
>
> This seems not so useful for everybody.

It was put in for folks doing dev work on this driver, so just a handful
of people in the whole world. It doesn't need to be useful for lots
of people.

>
>> v1 = le32_to_cpu(rxv[1]);
>> - v2 = le32_to_cpu(rxv[2]);
>> + v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */
>>
>> if (v0 & MT_PRXV_HT_AD_CODE)
>> status->enc_flags |= RX_ENC_FLAG_LDPC;
>>
>> + /* 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);
>> @@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> if (!(status->chains & BIT(i)))
>> continue;
>>
>> + /* TODO: Use db sum logic instead of max. */
>
> This seems just a not for you :)

Anyone wanting proper RSSI. The current implementation is wrong
and could be off by as much as 6db on a 4x4 radio.

I will fix it eventually if no one beats me to it.

Anyway, please apply anything you think is helpful, leave out
the rest.

Thanks,
Ben



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