Message ID | 20230105114711.31430-2-chui-hao.chiu@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] wifi: mt76: mt7915: set sku initial value to zero | expand |
> Enable RED to limit the number of token used by each band. If single band > uses too many tokens, it would hurt the throughput of the other bands.The > software path can solve this problem by AQL so enable RED for HW path only. > > Reviewed-by: Shayne Chen <shayne.chen@mediatek.com> > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> > --- > .../wireless/mediatek/mt76/mt76_connac_mcu.h | 1 + > .../net/wireless/mediatek/mt76/mt7915/mcu.c | 54 ++++++++++++++++++- > .../net/wireless/mediatek/mt76/mt7915/mcu.h | 1 + > 3 files changed, 54 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > index f1e942b9a887..855a434ecf54 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > @@ -1171,6 +1171,7 @@ enum { > MCU_EXT_CMD_GET_MIB_INFO = 0x5a, > MCU_EXT_CMD_TXDPD_CAL = 0x60, > MCU_EXT_CMD_CAL_CACHE = 0x67, > + MCU_EXT_CMD_RED_ENABLE = 0x68, > MCU_EXT_CMD_SET_RADAR_TH = 0x7c, > MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d, > MCU_EXT_CMD_MWDS_SUPPORT = 0x80, > diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c > index 37a3c1f082d9..a7bc2043a0db 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c > @@ -2291,6 +2291,57 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev) > sizeof(req), true); > } > > +static int mt7915_red_set_watermark(struct mt7915_dev *dev) > +{ > +#define RED_GLOBAL_TOKEN_WATERMARK 2 > + u16 nbuf = dev->mt76.mmio.wed.wlan.nbuf; I do not think this patch compile if CONFIG_NET_MEDIATEK_SOC_WED is not enabled > + struct { > + __le32 args[3]; please remove blank lines. > + > + u8 cmd; > + u8 version; > + u8 __rsv1[4]; > + u16 len; I guess it should be __le16 here > + > + __le16 high_mark; > + __le16 low_mark; > + u8 __rsv2[12]; > + } __packed req = { > + .args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING), > + .cmd = RED_GLOBAL_TOKEN_WATERMARK, > + .len = cpu_to_le16(sizeof(req) - sizeof(req.args)), > + > + .high_mark = cpu_to_le16(nbuf - 256), > + .low_mark = cpu_to_le16(nbuf - 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) > +{ > +#define RED_DISABLE 0 > +#define RED_BY_WA_ENABLE 2 > + int ret; > + u32 red_type = enabled ? 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; > + > + return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), > + MCU_WA_PARAM_RED, enabled, 0); > +} > + > int mt7915_mcu_init_firmware(struct mt7915_dev *dev) > { > int ret; > @@ -2339,8 +2390,7 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *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_set_red(dev, mtk_wed_device_active(&dev->mt76.mmio.wed)); > } > > int mt7915_mcu_init(struct mt7915_dev *dev) > diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h > index 29b5434bfdb8..b9ea297f382c 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h > +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h > @@ -278,6 +278,7 @@ enum { > MCU_WA_PARAM_PDMA_RX = 0x04, > MCU_WA_PARAM_CPU_UTIL = 0x0b, > MCU_WA_PARAM_RED = 0x0e, > + MCU_WA_PARAM_RED_SETTING = 0x40, > }; > > enum mcu_mmps_mode { > -- > 2.18.0 >
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h index f1e942b9a887..855a434ecf54 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h @@ -1171,6 +1171,7 @@ enum { MCU_EXT_CMD_GET_MIB_INFO = 0x5a, MCU_EXT_CMD_TXDPD_CAL = 0x60, MCU_EXT_CMD_CAL_CACHE = 0x67, + MCU_EXT_CMD_RED_ENABLE = 0x68, MCU_EXT_CMD_SET_RADAR_TH = 0x7c, MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d, MCU_EXT_CMD_MWDS_SUPPORT = 0x80, diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c index 37a3c1f082d9..a7bc2043a0db 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c @@ -2291,6 +2291,57 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev) sizeof(req), true); } +static int mt7915_red_set_watermark(struct mt7915_dev *dev) +{ +#define RED_GLOBAL_TOKEN_WATERMARK 2 + u16 nbuf = dev->mt76.mmio.wed.wlan.nbuf; + struct { + __le32 args[3]; + + u8 cmd; + u8 version; + u8 __rsv1[4]; + u16 len; + + __le16 high_mark; + __le16 low_mark; + u8 __rsv2[12]; + } __packed req = { + .args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING), + .cmd = RED_GLOBAL_TOKEN_WATERMARK, + .len = cpu_to_le16(sizeof(req) - sizeof(req.args)), + + .high_mark = cpu_to_le16(nbuf - 256), + .low_mark = cpu_to_le16(nbuf - 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) +{ +#define RED_DISABLE 0 +#define RED_BY_WA_ENABLE 2 + int ret; + u32 red_type = enabled ? 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; + + return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), + MCU_WA_PARAM_RED, enabled, 0); +} + int mt7915_mcu_init_firmware(struct mt7915_dev *dev) { int ret; @@ -2339,8 +2390,7 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *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_set_red(dev, mtk_wed_device_active(&dev->mt76.mmio.wed)); } int mt7915_mcu_init(struct mt7915_dev *dev) diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h index 29b5434bfdb8..b9ea297f382c 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h @@ -278,6 +278,7 @@ enum { MCU_WA_PARAM_PDMA_RX = 0x04, MCU_WA_PARAM_CPU_UTIL = 0x0b, MCU_WA_PARAM_RED = 0x0e, + MCU_WA_PARAM_RED_SETTING = 0x40, }; enum mcu_mmps_mode {