OSDN Git Service

mt76: mt7915: clean hw queue before starting new testmode tx
authorShayne Chen <shayne.chen@mediatek.com>
Tue, 5 Jan 2021 08:55:29 +0000 (16:55 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 26 Jan 2021 19:07:49 +0000 (20:07 +0100)
Add a testmode mcu command to clean up hw tx queue before a new
testmode tx starts.

Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
drivers/net/wireless/mediatek/mt76/mt7915/testmode.h

index 66d34d7..163b6f3 100644 (file)
@@ -50,6 +50,7 @@ enum {
        MCU_ATE_SET_TRX = 0x1,
        MCU_ATE_SET_FREQ_OFFSET = 0xa,
        MCU_ATE_SET_SLOT_TIME = 0x13,
+       MCU_ATE_CLEAN_TXQUEUE = 0x1c,
 };
 
 struct mt7915_mcu_rxd {
index 89e550f..bac7585 100644 (file)
@@ -133,6 +133,21 @@ mt7915_tm_set_trx(struct mt7915_phy *phy, int type, bool en)
 }
 
 static int
+mt7915_tm_clean_hwq(struct mt7915_phy *phy, u8 wcid)
+{
+       struct mt7915_dev *dev = phy->dev;
+       struct mt7915_tm_cmd req = {
+               .testmode_en = 1,
+               .param_idx = MCU_ATE_CLEAN_TXQUEUE,
+               .param.clean.wcid = wcid,
+               .param.clean.band = phy != &dev->phy,
+       };
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_ATE_CTRL, &req,
+                                sizeof(req), false);
+}
+
+static int
 mt7915_tm_set_slot_time(struct mt7915_phy *phy, u8 slot_time, u8 sifs)
 {
        struct mt7915_dev *dev = phy->dev;
@@ -408,6 +423,7 @@ mt7915_tm_set_tx_frames(struct mt7915_phy *phy, bool en)
        u32 ipg = td->tx_ipg;
 
        mt7915_tm_set_trx(phy, TM_MAC_RX_RXV, false);
+       mt7915_tm_clean_hwq(phy, dev->mt76.global_wcid.idx);
 
        if (en) {
                mutex_unlock(&dev->mt76.mutex);
index 784d4c9..da92cad 100644 (file)
@@ -26,6 +26,13 @@ struct mt7915_tm_slot_time {
        u8 _rsv1[5];
 };
 
+struct mt7915_tm_clean_txq {
+       bool sta_pause;
+       u8 wcid;        /* 256 sta */
+       u8 band;
+       u8 rsv;
+};
+
 struct mt7915_tm_cmd {
        u8 testmode_en;
        u8 param_idx;
@@ -35,6 +42,7 @@ struct mt7915_tm_cmd {
                struct mt7915_tm_trx trx;
                struct mt7915_tm_freq_offset freq;
                struct mt7915_tm_slot_time slot;
+               struct mt7915_tm_clean_txq clean;
                u8 test[72];
        } param;
 } __packed;