mt76: mt7921: set EDCA parameters with the MCU CE command
authorSean Wang <sean.wang@mediatek.com>
Fri, 24 Dec 2021 08:33:56 +0000 (16:33 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:57:58 +0000 (13:57 +0100)
The command MCU_EXT_CMD_EDCA_UPDATE is not fully supported by the MT7921
firmware, so we apply CE command MCU_CE_CMD_SET_EDCA_PARAMS instead which
is supported even in the oldest firmware to properly set up EDCA parameters
for each AC.

Fixes: 1c099ab44727 ("mt76: mt7921: add MCU support")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c

index 5319e6e2e96dda39cdc83cb50a0086139bb73a7c..1ebe02f55267d1ae8187f2615fa77f5bf83c1e5c 100644 (file)
@@ -1018,6 +1018,7 @@ enum {
        MCU_CE_CMD_SET_BSS_ABORT = 0x17,
        MCU_CE_CMD_CANCEL_HW_SCAN = 0x1b,
        MCU_CE_CMD_SET_ROC = 0x1c,
+       MCU_CE_CMD_SET_EDCA_PARMS = 0x1d,
        MCU_CE_CMD_SET_P2P_OPPPS = 0x33,
        MCU_CE_CMD_SET_RATE_TX_POWER = 0x5d,
        MCU_CE_CMD_SCHED_SCAN_ENABLE = 0x61,
index e4d6dd3698d05b15911dd12270718573d980afd5..76279f3c37f71ddda278500f7d2b24716341242b 100644 (file)
@@ -739,33 +739,28 @@ EXPORT_SYMBOL_GPL(mt7921_mcu_exit);
 
 int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
 {
-#define WMM_AIFS_SET           BIT(0)
-#define WMM_CW_MIN_SET         BIT(1)
-#define WMM_CW_MAX_SET         BIT(2)
-#define WMM_TXOP_SET           BIT(3)
-#define WMM_PARAM_SET          GENMASK(3, 0)
-#define TX_CMD_MODE            1
+       struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+
        struct edca {
-               u8 queue;
-               u8 set;
-               u8 aifs;
-               u8 cw_min;
+               __le16 cw_min;
                __le16 cw_max;
                __le16 txop;
-       };
+               __le16 aifs;
+               u8 guardtime;
+               u8 acm;
+       } __packed;
        struct mt7921_mcu_tx {
-               u8 total;
-               u8 action;
-               u8 valid;
-               u8 mode;
-
                struct edca edca[IEEE80211_NUM_ACS];
+               u8 bss_idx;
+               u8 qos;
+               u8 wmm_idx;
+               u8 pad;
        } __packed req = {
-               .valid = true,
-               .mode = TX_CMD_MODE,
-               .total = IEEE80211_NUM_ACS,
+               .bss_idx = mvif->mt76.idx,
+               .qos = vif->bss_conf.qos,
+               .wmm_idx = mvif->mt76.wmm_idx,
        };
-       struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+
        struct mu_edca {
                u8 cw_min;
                u8 cw_max;
@@ -789,30 +784,29 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
                .qos = vif->bss_conf.qos,
                .wmm_idx = mvif->mt76.wmm_idx,
        };
+       int to_aci[] = {1, 0, 2, 3};
        int ac, ret;
 
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
                struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
-               struct edca *e = &req.edca[ac];
+               struct edca *e = &req.edca[to_aci[ac]];
 
-               e->set = WMM_PARAM_SET;
-               e->queue = ac + mvif->mt76.wmm_idx * MT7921_MAX_WMM_SETS;
                e->aifs = q->aifs;
                e->txop = cpu_to_le16(q->txop);
 
                if (q->cw_min)
-                       e->cw_min = fls(q->cw_min);
+                       e->cw_min = cpu_to_le16(q->cw_min);
                else
                        e->cw_min = 5;
 
                if (q->cw_max)
-                       e->cw_max = cpu_to_le16(fls(q->cw_max));
+                       e->cw_max = cpu_to_le16(q->cw_max);
                else
                        e->cw_max = cpu_to_le16(10);
        }
 
-       ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE),
-                               &req, sizeof(req), true);
+       ret = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_EDCA_PARMS), &req,
+                               sizeof(req), false);
        if (ret)
                return ret;
 
@@ -822,7 +816,6 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
                struct ieee80211_he_mu_edca_param_ac_rec *q;
                struct mu_edca *e;
-               int to_aci[] = {1, 0, 2, 3};
 
                if (!mvif->queue_params[ac].mu_edca)
                        break;