| From 2c9f6ad4b961b736f60003d50b3e145c7b33a79d Mon Sep 17 00:00:00 2001 |
| From: Peter Chiu <chui-hao.chiu@mediatek.com> |
| Date: Fri, 2 Sep 2022 14:40:40 +0800 |
| Subject: [PATCH 3006/3012] mt76: mt7915: wed: enable red per-band token drop |
| for HW Path |
| |
| Limit the number of token used by each band. If a band uses too many token, |
| it may hurt the throughput of the other band. The SW path can solve this |
| problem by AQL. |
| |
| Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> |
| --- |
| mt7915/mcu.c | 57 ++++++++++++++++++++++++++++++++++++++++--------- |
| mt7915/mcu.h | 1 + |
| mt7915/mt7915.h | 3 ++- |
| 3 files changed, 50 insertions(+), 11 deletions(-) |
| |
| diff --git a/mt7915/mcu.c b/mt7915/mcu.c |
| index bdfb71e2..daa0006b 100644 |
| --- a/mt7915/mcu.c |
| +++ b/mt7915/mcu.c |
| @@ -2360,8 +2360,17 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *dev) |
| dev->mt76.mmio.wed.rev_id, 0); |
| if (ret) |
| return ret; |
| + |
| + ret = mt7915_mcu_set_red(dev, true); |
| + if (ret) |
| + return ret; |
| + } else { |
| + mt7915_mcu_set_red(dev, false); |
| + if (ret) |
| + return ret; |
| } |
| |
| + |
| ret = mt7915_mcu_set_mwds(dev, 1); |
| if (ret) |
| return ret; |
| @@ -2371,12 +2380,7 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *dev) |
| if (ret) |
| return ret; |
| |
| - ret = mt7915_mcu_init_rx_airtime(dev); |
| - if (ret) |
| - return ret; |
| - |
| - return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| - MCU_WA_PARAM_RED, 0, 0); |
| + return mt7915_mcu_init_rx_airtime(dev); |
| } |
| |
| int mt7915_mcu_init(struct mt7915_dev *dev) |
| @@ -4508,6 +4512,35 @@ int mt7915_dbg_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a |
| |
| return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), wait_resp); |
| } |
| +#endif |
| + |
| +static int mt7915_red_set_watermark(struct mt7915_dev *dev) |
| +{ |
| +#define RED_GLOBAL_TOKEN_WATERMARK 2 |
| +#define TOTAL_HW_TOKEN_SIZE 8192 |
| + struct { |
| + __le32 args[3]; |
| + |
| + u8 cmd; |
| + u8 version; |
| + u8 __rsv1[4]; |
| + u16 len; |
| + |
| + __le16 high_mark; |
| + __le16 low_mark; |
| + u8 __rsv2[12]; |
| + } req = { |
| + .args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING), |
| + .cmd = RED_GLOBAL_TOKEN_WATERMARK, |
| + .len = cpu_to_le16(sizeof(req) - 12), |
| + |
| + .high_mark = cpu_to_le16(TOTAL_HW_TOKEN_SIZE - 256), |
| + .low_mark = cpu_to_le16(TOTAL_HW_TOKEN_SIZE - 256 - 1536), |
| + }; |
| + |
| + return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET), &req, |
| + sizeof(req), false); |
| +} |
| |
| int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled) |
| { |
| @@ -4518,17 +4551,21 @@ int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled) |
| u32 red_type = enabled > 0 ? RED_BY_WA_ENABLE : RED_DISABLE; |
| __le32 req = cpu_to_le32(red_type); |
| |
| + if (enabled) { |
| + ret = mt7915_red_set_watermark(dev); |
| + if (ret < 0) |
| + return ret; |
| + } |
| + |
| ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RED_ENABLE), &req, |
| sizeof(req), false); |
| if (ret < 0) |
| return ret; |
| |
| - mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| - MCU_WA_PARAM_RED, enabled, 0, true); |
| + return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| + MCU_WA_PARAM_RED, enabled, 0); |
| |
| - return 0; |
| } |
| -#endif |
| |
| int mt7915_mcu_rf_regval(struct mt7915_dev *dev, u32 regidx, u32 *val, bool set) |
| { |
| diff --git a/mt7915/mcu.h b/mt7915/mcu.h |
| index edb8b510..7963a700 100644 |
| --- a/mt7915/mcu.h |
| +++ b/mt7915/mcu.h |
| @@ -285,6 +285,7 @@ enum { |
| MCU_WA_PARAM_CPU_UTIL = 0x0b, |
| MCU_WA_PARAM_RED = 0x0e, |
| MCU_WA_PARAM_WED_VERSION = 0x32, |
| + MCU_WA_PARAM_RED_SETTING = 0x40, |
| #ifdef MTK_DEBUG |
| MCU_WA_PARAM_RED_SHOW_STA = 0xf, |
| MCU_WA_PARAM_RED_TARGET_DELAY = 0x10, |
| diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h |
| index f9c02912..819cec99 100644 |
| --- a/mt7915/mt7915.h |
| +++ b/mt7915/mt7915.h |
| @@ -771,13 +771,14 @@ int mt7915_vendor_amnt_sta_remove(struct mt7915_phy *phy, |
| #endif |
| int mt7915_mcu_set_edcca(struct mt7915_phy *phy, int mode, u8 *value, s8 compensation); |
| int mt7915_mcu_get_edcca(struct mt7915_phy *phy, u8 mode, s8 *value); |
| +int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled); |
| + |
| int mt7915_mcu_ipi_hist_ctrl(struct mt7915_phy *phy, void *data, u8 cmd, bool wait_resp); |
| int mt7915_mcu_ipi_hist_scan(struct mt7915_phy *phy, void *data, u8 mode, bool wait_resp); |
| |
| #ifdef MTK_DEBUG |
| int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir); |
| int mt7915_dbg_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3, bool wait_resp); |
| -int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled); |
| void mt7915_dump_tmac_info(u8 *tmac_info); |
| int mt7915_mcu_set_txpower_level(struct mt7915_phy *phy, u8 drop_level); |
| void mt7915_packet_log_to_host(struct mt7915_dev *dev, const void *data, int len, int type, int des_len); |
| -- |
| 2.25.1 |
| |