OSDN Git Service

mt76: mt7921: add MU EDCA cmd support
authorSean Wang <sean.wang@mediatek.com>
Tue, 12 Oct 2021 22:12:10 +0000 (06:12 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Oct 2021 08:36:55 +0000 (10:36 +0200)
Add MU EDCA MCU command support to update MU AC parameter record field
from the access point.

Co-developed-by: Eric-SY Chang <Eric-SY.Chang@mediatek.com>
Signed-off-by: Eric-SY Chang <Eric-SY.Chang@mediatek.com>
Tested-by: Eric-SY Chang <Eric-SY.Chang@mediatek.com>
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 848f43c..751e621 100644 (file)
@@ -572,6 +572,7 @@ enum {
        MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
        MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
        MCU_CMD_GET_NIC_CAPAB = MCU_CE_PREFIX | 0x8a,
+       MCU_CMD_SET_MU_EDCA_PARMS = MCU_CE_PREFIX | 0xb0,
        MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
        MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
        MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
index 3f6c983..457365f 100644 (file)
@@ -974,7 +974,30 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
                .total = IEEE80211_NUM_ACS,
        };
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
-       int ac;
+       struct mu_edca {
+               u8 cw_min;
+               u8 cw_max;
+               u8 aifsn;
+               u8 acm;
+               u8 timer;
+               u8 padding[3];
+       };
+       struct mt7921_mcu_mu_tx {
+               u8 ver;
+               u8 pad0;
+               __le16 len;
+               u8 bss_idx;
+               u8 qos;
+               u8 wmm_idx;
+               u8 pad1;
+               struct mu_edca edca[IEEE80211_NUM_ACS];
+               u8 pad3[32];
+       } __packed req_mu = {
+               .bss_idx = mvif->mt76.idx,
+               .qos = vif->bss_conf.qos,
+               .wmm_idx = mvif->mt76.wmm_idx,
+       };
+       int ac, ret;
 
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
                struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
@@ -995,8 +1018,34 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
                else
                        e->cw_max = cpu_to_le16(10);
        }
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
-                                sizeof(req), true);
+
+       ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
+                               sizeof(req), true);
+       if (ret)
+               return ret;
+
+       if (!vif->bss_conf.he_support)
+               return 0;
+
+       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;
+
+               q = &mvif->queue_params[ac].mu_edca_param_rec;
+               e = &(req_mu.edca[to_aci[ac]]);
+
+               e->cw_min = q->ecw_min_max & 0xf;
+               e->cw_max = (q->ecw_min_max & 0xf0) >> 4;
+               e->aifsn = q->aifsn;
+               e->timer = q->mu_edca_timer;
+       }
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_MU_EDCA_PARMS, &req_mu,
+                                sizeof(req_mu), false);
 }
 
 int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd)