| From 50d93c608b1cfe0750fa98c1fbafe6ad6ed3212d Mon Sep 17 00:00:00 2001 |
| From: Peter Chiu <chui-hao.chiu@mediatek.com> |
| Date: Wed, 19 Apr 2023 18:32:41 +0800 |
| Subject: [PATCH 67/98] wifi: mt76: add random early drop support |
| |
| --- |
| mt7996/mcu.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++-- |
| mt7996/mcu.h | 4 ++- |
| mt7996/mt7996.h | 1 + |
| 3 files changed, 83 insertions(+), 3 deletions(-) |
| |
| diff --git a/mt7996/mcu.c b/mt7996/mcu.c |
| index b8d26ec..6589610 100644 |
| --- a/mt7996/mcu.c |
| +++ b/mt7996/mcu.c |
| @@ -3012,8 +3012,8 @@ int mt7996_mcu_init_firmware(struct mt7996_dev *dev) |
| if (ret) |
| return ret; |
| |
| - return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| - MCU_WA_PARAM_RED, 0, 0); |
| + return mt7996_mcu_red_config(dev, |
| + mtk_wed_device_active(&dev->mt76.mmio.wed)); |
| } |
| |
| int mt7996_mcu_init(struct mt7996_dev *dev) |
| @@ -3045,6 +3045,83 @@ out: |
| skb_queue_purge(&dev->mt76.mcu.res_q); |
| } |
| |
| +static int mt7996_mcu_wa_red_config(struct mt7996_dev *dev) |
| +{ |
| +#define RED_TOKEN_SRC_CNT 4 |
| +#define RED_TOKEN_CONFIG 2 |
| + struct { |
| + __le32 arg0; |
| + __le32 arg1; |
| + __le32 arg2; |
| + |
| + u8 mode; |
| + u8 version; |
| + u8 _rsv[4]; |
| + __le16 len; |
| + |
| + __le16 tcp_offset; |
| + __le16 priority_offset; |
| + __le16 token_per_src[RED_TOKEN_SRC_CNT]; |
| + __le16 token_thr_per_src[RED_TOKEN_SRC_CNT]; |
| + |
| + u8 _rsv2[604]; |
| + } __packed req = { |
| + .arg0 = cpu_to_le32(MCU_WA_PARAM_RED_CONFIG), |
| + |
| + .mode = RED_TOKEN_CONFIG, |
| + .len = cpu_to_le16(sizeof(req) - sizeof(__le32) * 3), |
| + |
| + .tcp_offset = cpu_to_le16(200), |
| + .priority_offset = cpu_to_le16(255), |
| + }; |
| + u8 i; |
| + |
| + for (i = 0; i < RED_TOKEN_SRC_CNT; i++) { |
| + req.token_per_src[i] = cpu_to_le16(MT7996_TOKEN_SIZE); |
| + req.token_thr_per_src[i] = cpu_to_le16(MT7996_TOKEN_SIZE); |
| + } |
| + |
| + if (!mtk_wed_device_active(&dev->mt76.mmio.wed)) |
| + req.token_per_src[RED_TOKEN_SRC_CNT - 1] = |
| + cpu_to_le16(MT7996_TOKEN_SIZE - MT7996_HW_TOKEN_SIZE); |
| + |
| + return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET), |
| + &req, sizeof(req), false); |
| +} |
| + |
| +int mt7996_mcu_red_config(struct mt7996_dev *dev, bool enable) |
| +{ |
| +#define RED_DISABLE 0 |
| +#define RED_BY_WA_ENABLE 2 |
| + struct { |
| + u8 __rsv1[4]; |
| + |
| + __le16 tag; |
| + __le16 len; |
| + u8 enable; |
| + u8 __rsv2[3]; |
| + } __packed req = { |
| + .tag = cpu_to_le16(UNI_VOW_RED_ENABLE), |
| + .len = cpu_to_le16(sizeof(req) - 4), |
| + .enable = enable ? RED_BY_WA_ENABLE : RED_DISABLE, |
| + }; |
| + int ret; |
| + |
| + ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(VOW), &req, |
| + sizeof(req), true); |
| + |
| + if (ret) |
| + return ret; |
| + |
| + ret = mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| + MCU_WA_PARAM_RED_EN, enable, 0); |
| + |
| + if (ret || !enable) |
| + return ret; |
| + |
| + return mt7996_mcu_wa_red_config(dev); |
| +} |
| + |
| int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans) |
| { |
| struct { |
| diff --git a/mt7996/mcu.h b/mt7996/mcu.h |
| index bb876f3..666216a 100644 |
| --- a/mt7996/mcu.h |
| +++ b/mt7996/mcu.h |
| @@ -287,8 +287,9 @@ enum { |
| enum { |
| MCU_WA_PARAM_PDMA_RX = 0x04, |
| MCU_WA_PARAM_CPU_UTIL = 0x0b, |
| - MCU_WA_PARAM_RED = 0x0e, |
| + MCU_WA_PARAM_RED_EN = 0x0e, |
| MCU_WA_PARAM_HW_PATH_HIF_VER = 0x2f, |
| + MCU_WA_PARAM_RED_CONFIG = 0x40, |
| }; |
| |
| enum mcu_mmps_mode { |
| @@ -817,6 +818,7 @@ enum { |
| UNI_VOW_DRR_CTRL, |
| UNI_VOW_RX_AT_AIRTIME_EN = 0x0b, |
| UNI_VOW_RX_AT_AIRTIME_CLR_EN = 0x0e, |
| + UNI_VOW_RED_ENABLE = 0x18, |
| }; |
| |
| enum { |
| diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h |
| index 6775360..bba1364 100644 |
| --- a/mt7996/mt7996.h |
| +++ b/mt7996/mt7996.h |
| @@ -654,6 +654,7 @@ int mt7996_mcu_rf_regval(struct mt7996_dev *dev, u32 regidx, u32 *val, bool set) |
| int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans); |
| int mt7996_mcu_set_rro(struct mt7996_dev *dev, u16 tag, u8 val); |
| int mt7996_mcu_wa_cmd(struct mt7996_dev *dev, int cmd, u32 a1, u32 a2, u32 a3); |
| +int mt7996_mcu_red_config(struct mt7996_dev *dev, bool enable); |
| int mt7996_mcu_fw_log_2_host(struct mt7996_dev *dev, u8 type, u8 ctrl); |
| int mt7996_mcu_fw_dbg_ctrl(struct mt7996_dev *dev, u32 module, u8 level); |
| int mt7996_mcu_trigger_assert(struct mt7996_dev *dev); |
| -- |
| 2.18.0 |
| |