mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 00:48:50 +00:00
mt76: mt7921: set EDCA parameters with the MCU CE command
[ Upstream commit66ca1a7b2d
] 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:1c099ab447
("mt76: mt7921: add MCU support") Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4c6456bf31
commit
fb1d7f3b11
2 changed files with 22 additions and 28 deletions
|
@ -997,6 +997,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,
|
||||
|
|
|
@ -920,33 +920,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;
|
||||
|
@ -970,30 +965,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;
|
||||
|
||||
|
@ -1003,7 +997,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;
|
||||
|
|
Loading…
Reference in a new issue