2021-07-20 18:27:02

by Ben Greear

[permalink] [raw]
Subject: [PATCH 06/11] mt76: mt7915: Support parsing TXSFM 0x2.

From: Ben Greear <[email protected]>

Add code to support this format, but I don't actually
see any of these TXS format frames on my test system.

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

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 41247fe4ff8c..80acc07c0180 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1317,13 +1317,10 @@ mt7915_mac_parse_txs(struct mt7915_dev *dev, struct mt76_wcid *wcid,
{
struct ieee80211_supported_band *sband;
struct mt76_phy *mphy;
- u32 txrate, txs, txs5, txs6, txs7, mode;
+ u32 txrate, txs, mode;
bool cck = false;

txs = le32_to_cpu(txs_data[0]);
- txs5 = le32_to_cpu(txs_data[5]);
- txs6 = le32_to_cpu(txs_data[6]);
- txs7 = le32_to_cpu(txs_data[7]);

if (!(txs & MT_TXS0_ACK_ERROR_MASK))
info->flags |= IEEE80211_TX_STAT_ACK;
@@ -1334,10 +1331,6 @@ mt7915_mac_parse_txs(struct mt7915_dev *dev, struct mt76_wcid *wcid,

info->status.rates[0].idx = -1;

- stats->tx_mpdu_attempts += FIELD_GET(MT_TXS5_F1_MPDU_TX_COUNT, txs5);
- stats->tx_mpdu_fail += FIELD_GET(MT_TXS6_F1_MPDU_FAIL_COUNT, txs6);
- stats->tx_mpdu_retry += FIELD_GET(MT_TXS7_F1_MPDU_RETRY_COUNT, txs7);
-
txrate = FIELD_GET(MT_TXS0_TX_RATE, txs);

rate->mcs = FIELD_GET(MT_TX_RATE_IDX, txrate);
@@ -1418,6 +1411,19 @@ mt7915_mac_parse_txs(struct mt7915_dev *dev, struct mt76_wcid *wcid,
stats->tx_bw[0]++;
break;
}
+
+ if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) == 2) {
+ /* TXSFM == 10 */
+ u32 txs5, txs6, txs7;
+
+ txs5 = le32_to_cpu(txs_data[5]);
+ txs6 = le32_to_cpu(txs_data[6]);
+ txs7 = le32_to_cpu(txs_data[7]);
+
+ stats->tx_mpdu_attempts += FIELD_GET(MT_TXS5_F1_MPDU_TX_COUNT, txs5);
+ stats->tx_mpdu_fail += FIELD_GET(MT_TXS6_F1_MPDU_FAIL_COUNT, txs6);
+ stats->tx_mpdu_retry += FIELD_GET(MT_TXS7_F1_MPDU_RETRY_COUNT, txs7);
+ }
}

static void
@@ -1469,8 +1475,6 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
u8 pid;

txs = le32_to_cpu(txs_data[0]);
- if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1)
- return;

txs = le32_to_cpu(txs_data[2]);
wcidx = FIELD_GET(MT_TXS2_WCID, txs);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
index ccce994dc07a..986a65badd1b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
@@ -347,6 +347,9 @@ struct mt7915_tx_free {

#define MT_TXS4_TIMESTAMP GENMASK(31, 0)

+/* The F0 variables are for TXSFM 0x0 and 0x1. The F1 variables
+ * are for TXSFM 0x2 aka PPDU format.
+ */
#define MT_TXS5_F0_FINAL_MPDU BIT(31)
#define MT_TXS5_F0_QOS BIT(30)
#define MT_TXS5_F0_TX_COUNT GENMASK(29, 25)
--
2.20.1