Commit 66ca1a7b authored by Sean Wang's avatar Sean Wang Committed by Felix Fietkau

mt76: mt7921: set EDCA parameters with the MCU CE command

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: 1c099ab4 ("mt76: mt7921: add MCU support")
Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent bf9727a2
...@@ -1018,6 +1018,7 @@ enum { ...@@ -1018,6 +1018,7 @@ enum {
MCU_CE_CMD_SET_BSS_ABORT = 0x17, MCU_CE_CMD_SET_BSS_ABORT = 0x17,
MCU_CE_CMD_CANCEL_HW_SCAN = 0x1b, MCU_CE_CMD_CANCEL_HW_SCAN = 0x1b,
MCU_CE_CMD_SET_ROC = 0x1c, MCU_CE_CMD_SET_ROC = 0x1c,
MCU_CE_CMD_SET_EDCA_PARMS = 0x1d,
MCU_CE_CMD_SET_P2P_OPPPS = 0x33, MCU_CE_CMD_SET_P2P_OPPPS = 0x33,
MCU_CE_CMD_SET_RATE_TX_POWER = 0x5d, MCU_CE_CMD_SET_RATE_TX_POWER = 0x5d,
MCU_CE_CMD_SCHED_SCAN_ENABLE = 0x61, MCU_CE_CMD_SCHED_SCAN_ENABLE = 0x61,
......
...@@ -739,33 +739,28 @@ EXPORT_SYMBOL_GPL(mt7921_mcu_exit); ...@@ -739,33 +739,28 @@ EXPORT_SYMBOL_GPL(mt7921_mcu_exit);
int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif) int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
{ {
#define WMM_AIFS_SET BIT(0) struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
#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 edca { struct edca {
u8 queue; __le16 cw_min;
u8 set;
u8 aifs;
u8 cw_min;
__le16 cw_max; __le16 cw_max;
__le16 txop; __le16 txop;
}; __le16 aifs;
u8 guardtime;
u8 acm;
} __packed;
struct mt7921_mcu_tx { struct mt7921_mcu_tx {
u8 total;
u8 action;
u8 valid;
u8 mode;
struct edca edca[IEEE80211_NUM_ACS]; struct edca edca[IEEE80211_NUM_ACS];
u8 bss_idx;
u8 qos;
u8 wmm_idx;
u8 pad;
} __packed req = { } __packed req = {
.valid = true, .bss_idx = mvif->mt76.idx,
.mode = TX_CMD_MODE, .qos = vif->bss_conf.qos,
.total = IEEE80211_NUM_ACS, .wmm_idx = mvif->mt76.wmm_idx,
}; };
struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
struct mu_edca { struct mu_edca {
u8 cw_min; u8 cw_min;
u8 cw_max; u8 cw_max;
...@@ -789,30 +784,29 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif) ...@@ -789,30 +784,29 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif)
.qos = vif->bss_conf.qos, .qos = vif->bss_conf.qos,
.wmm_idx = mvif->mt76.wmm_idx, .wmm_idx = mvif->mt76.wmm_idx,
}; };
int to_aci[] = {1, 0, 2, 3};
int ac, ret; int ac, ret;
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
struct ieee80211_tx_queue_params *q = &mvif->queue_params[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->aifs = q->aifs;
e->txop = cpu_to_le16(q->txop); e->txop = cpu_to_le16(q->txop);
if (q->cw_min) if (q->cw_min)
e->cw_min = fls(q->cw_min); e->cw_min = cpu_to_le16(q->cw_min);
else else
e->cw_min = 5; e->cw_min = 5;
if (q->cw_max) if (q->cw_max)
e->cw_max = cpu_to_le16(fls(q->cw_max)); e->cw_max = cpu_to_le16(q->cw_max);
else else
e->cw_max = cpu_to_le16(10); e->cw_max = cpu_to_le16(10);
} }
ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), ret = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_EDCA_PARMS), &req,
&req, sizeof(req), true); sizeof(req), false);
if (ret) if (ret)
return ret; return ret;
...@@ -822,7 +816,6 @@ int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif) ...@@ -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++) { for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
struct ieee80211_he_mu_edca_param_ac_rec *q; struct ieee80211_he_mu_edca_param_ac_rec *q;
struct mu_edca *e; struct mu_edca *e;
int to_aci[] = {1, 0, 2, 3};
if (!mvif->queue_params[ac].mu_edca) if (!mvif->queue_params[ac].mu_edca)
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment