[rdkb][common][bsp][Refactor and sync wifi from openwrt]
[Description]
e6d9f8b2 [MAC80211][misc][Add Filogic 880 Non-MLO SDK Release. Add missing firmwares]
9def0c8f [MAC80211][WiFi7][ucode][Not to remove or create interface for non-primary MLD link]
c77412af [MAC80211][WiFi7][Misc][Add MLD configuration options]
d0bc5c22 [MAC80211][misc][Add Filogic 880 Non-MLO SDK Release]
01817e1f [mac80211][WiFi7][misc][Fix patch fail]
d6a80bd6 [MAC80211][WiFi6][Misc][Add lpi, duplicate mode and sku index]
0977e5a6 [MAC80211][WiFi6][hostapd][Add txpower vendor command]
2e2eb49f [MAC80211][WiFi6][mt76][Add support for lpi and duplicate mode]
c4856a8a [MAC80211][WiFi6][core][Add sta info flush and send deauth during DFS channel switch]
c586f5f5 [MAC80211][WiFi6][mt76][rebase patches]
fabcdbbd [MAC80211][WiFi6][mt76][Support thermal recal debug command]
1cba3dbf [MAC80211][WiFi6][mt76][Fix the fw version of wm and wa are on contrary]
99500b19 [MAC80211][WiFi6][core][Revert sending deauth frame for DFS channel switch]
[Release-log]
Change-Id: I357f4a5fec68ce0210927e1b4f172fcd3196139d
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0050-hostapd-mtk-Add-txpower-vendor-command.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0050-hostapd-mtk-Add-txpower-vendor-command.patch
new file mode 100644
index 0000000..a4fb7ae
--- /dev/null
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0050-hostapd-mtk-Add-txpower-vendor-command.patch
@@ -0,0 +1,284 @@
+From 90af5fc57f409068ab5c0bf1dab313eb89736054 Mon Sep 17 00:00:00 2001
+From: Allen Ye <allen.ye@mediatek.com>
+Date: Fri, 22 Dec 2023 18:09:20 +0800
+Subject: [PATCH] hostapd: mtk: Add txpower vendor command
+
+Add txpower vendor command including lpi, sku index and duplicate mode
+control.
+---
+ hostapd/config_file.c | 10 ++++++
+ src/ap/ap_config.c | 3 ++
+ src/ap/ap_config.h | 3 ++
+ src/ap/ap_drv_ops.c | 8 +++++
+ src/ap/ap_drv_ops.h | 1 +
+ src/ap/hostapd.c | 2 ++
+ src/ap/ieee802_11_he.c | 3 ++
+ src/common/mtk_vendor.h | 14 +++++++++
+ src/drivers/driver.h | 9 ++++++
+ src/drivers/driver_nl80211.c | 51 +++++++++++++++++++++++++++++++
+ src/drivers/driver_nl80211.h | 1 +
+ src/drivers/driver_nl80211_capa.c | 3 ++
+ 12 files changed, 108 insertions(+)
+
+diff --git a/hostapd/config_file.c b/hostapd/config_file.c
+index 3f26191..8ecba5c 100644
+--- a/hostapd/config_file.c
++++ b/hostapd/config_file.c
+@@ -4827,6 +4827,16 @@ static int hostapd_config_fill(struct hostapd_config *conf,
+ return 1;
+ }
+ conf->amsdu = val;
++ } else if (os_strcmp(buf, "lpi_enable") == 0) {
++ u8 en = strtol(pos, NULL, 10);
++
++ conf->lpi_enable = !!en;
++ } else if (os_strcmp(buf, "sku_idx") == 0) {
++ conf->sku_idx = strtol(pos, NULL, 10);
++ } else if (os_strcmp(buf, "beacon_dup") == 0) {
++ u8 en = strtol(pos, NULL, 10);
++
++ conf->beacon_dup = !!en;
+ } else {
+ wpa_printf(MSG_ERROR,
+ "Line %d: unknown configuration item '%s'",
+diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c
+index c9e16ea..17bbd54 100644
+--- a/src/ap/ap_config.c
++++ b/src/ap/ap_config.c
+@@ -301,6 +301,9 @@ struct hostapd_config * hostapd_config_defaults(void)
+ conf->three_wire_enable = THREE_WIRE_MODE_DISABLE;
+ conf->ibf_enable = IBF_DEFAULT_ENABLE;
+ conf->amsdu = 1;
++ conf->lpi_enable = 0;
++ conf->sku_idx = 0;
++ conf->beacon_dup = 1;
+
+ return conf;
+ }
+diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
+index ae22a2f..90270c9 100644
+--- a/src/ap/ap_config.h
++++ b/src/ap/ap_config.h
+@@ -1165,6 +1165,9 @@ struct hostapd_config {
+ u8 ibf_enable;
+ u8 dfs_detect_mode;
+ u8 amsdu;
++ u8 lpi_enable;
++ u8 sku_idx;
++ u8 beacon_dup;
+
+ #define MBSSID_ENABLED 1
+ #define ENHANCED_MBSSID_ENABLED 2
+diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
+index bf64b77..a060f5c 100644
+--- a/src/ap/ap_drv_ops.c
++++ b/src/ap/ap_drv_ops.c
+@@ -1101,6 +1101,14 @@ int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd, u64 *aval_colo
+ return hapd->driver->get_aval_color_bmp(hapd->drv_priv, aval_color_bmp);
+ }
+
++int hostapd_drv_txpower_ctrl(struct hostapd_data *hapd)
++{
++ if (!hapd->driver || !hapd->driver->txpower_ctrl)
++ return 0;
++ return hapd->driver->txpower_ctrl(hapd->drv_priv, hapd->iconf->lpi_enable,
++ hapd->iconf->sku_idx, hapd->iconf->beacon_dup);
++}
++
+ int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
+ {
+ if (!hapd->driver || !hapd->driver->ap_wireless)
+diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
+index 2a89b99..5f11a57 100644
+--- a/src/ap/ap_drv_ops.h
++++ b/src/ap/ap_drv_ops.h
+@@ -151,6 +151,7 @@ int hostapd_drv_amsdu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_amsdu_dump(struct hostapd_data *hapd, u8 *amsdu);
+ int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd,
+ u64 *aval_color_bmp);
++int hostapd_drv_txpower_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
+ int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
+ int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type);
+diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
+index 250c168..93c79af 100644
+--- a/src/ap/hostapd.c
++++ b/src/ap/hostapd.c
+@@ -2368,6 +2368,8 @@ dfs_offload:
+ goto fail;
+ if (hostapd_drv_amsdu_ctrl(hapd) < 0)
+ goto fail;
++ if (hostapd_drv_txpower_ctrl(hapd) < 0)
++ goto fail;
+
+ wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
+ iface->bss[0]->conf->iface);
+diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c
+index f27aeb1..6c8c58f 100644
+--- a/src/ap/ieee802_11_he.c
++++ b/src/ap/ieee802_11_he.c
+@@ -251,6 +251,9 @@ u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid)
+ control = 3;
+ else
+ control = center_idx_to_bw_6ghz(seg0);
++ if (hapd->iconf->beacon_dup)
++ control |= HE_6GHZ_OPER_INFO_CTRL_DUP_BEACON;
++
+ if (hapd->iconf->he_6ghz_reg_pwr_type == 1)
+ control |= HE_6GHZ_STANDARD_POWER_AP <<
+ HE_6GHZ_OPER_INFO_CTRL_REG_INFO_SHIFT;
+diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
+index 7dd2fc4..21e735f 100644
+--- a/src/common/mtk_vendor.h
++++ b/src/common/mtk_vendor.h
+@@ -16,6 +16,7 @@ enum mtk_nl80211_vendor_subcmds {
+ MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8,
+ MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
+ MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
++ MTK_NL80211_VENDOR_SUBCMD_TXPOWER_CTRL = 0xce,
+ };
+
+ enum mtk_vendor_attr_edcca_ctrl {
+@@ -239,6 +240,19 @@ enum mtk_vendor_attr_bss_color_ctrl {
+ NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL - 1
+ };
+
++enum mtk_vendor_attr_txpower_ctrl {
++ MTK_VENDOR_ATTR_TXPOWER_CTRL_UNSPEC,
++
++ MTK_VENDOR_ATTR_TXPOWER_CTRL_LPI_ENABLE,
++ MTK_VENDOR_ATTR_TXPOWER_CTRL_SKU_IDX,
++ MTK_VENDOR_ATTR_TXPOWER_CTRL_BCN_DUP,
++
++ /* keep last */
++ NUM_MTK_VENDOR_ATTRS_TXPOWER_CTRL,
++ MTK_VENDOR_ATTR_TXPOWER_CTRL_MAX =
++ NUM_MTK_VENDOR_ATTRS_TXPOWER_CTRL - 1
++};
++
+ #define CSI_MAX_COUNT 256
+ #define ETH_ALEN 6
+
+diff --git a/src/drivers/driver.h b/src/drivers/driver.h
+index 01281a1..0e3934e 100644
+--- a/src/drivers/driver.h
++++ b/src/drivers/driver.h
+@@ -4825,6 +4825,15 @@ struct wpa_driver_ops {
+ * @amnt_dump_buf: Buffer to print
+ */
+ int (*amnt_dump)(void *priv, u8 amnt_idx, u8 *amnt_dump_buf);
++
++ /**
++ * txpower_ctrl - ctrl txpower operation
++ * @priv: Private driver interface data
++ * @lpi_enable: 1 to enable lpi, 0 to disable lpi
++ * @beacon_dup: 1 to enable beacon duplicate, 0 to disable duplicate
++ * @sku_idx: index used to indicate which sku table should be used
++ */
++ int (*txpower_ctrl)(void *priv, u8 lpi_enable, u8 sku_idx, u8 beacon_dup);
+ };
+
+ /**
+diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
+index e744a18..c8720bb 100644
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -138,6 +138,13 @@ amnt_dump_policy[NUM_MTK_VENDOR_ATTRS_AMNT_DUMP] = {
+ [MTK_VENDOR_ATTR_AMNT_DUMP_RESULT] = { .type = NLA_NESTED },
+ };
+
++static struct nla_policy
++txpower_ctrl_policy[NUM_MTK_VENDOR_ATTRS_TXPOWER_CTRL] = {
++ [MTK_VENDOR_ATTR_TXPOWER_CTRL_LPI_ENABLE] = { .type = NLA_U8 },
++ [MTK_VENDOR_ATTR_TXPOWER_CTRL_SKU_IDX] = { .type = NLA_U8 },
++ [MTK_VENDOR_ATTR_TXPOWER_CTRL_BCN_DUP] = { .type = NLA_U8 },
++};
++
+ static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
+ {
+ struct nl_sock *handle;
+@@ -13396,6 +13403,49 @@ fail:
+ return -ENOBUFS;
+ }
+
++static int nl80211_txpower_ctrl(void *priv, u8 lpi_enable, u8 sku_idx, u8 beacon_dup)
++{
++ struct i802_bss *bss = priv;
++ struct wpa_driver_nl80211_data *drv = bss->drv;
++ struct nl_msg *msg;
++ struct nlattr *data;
++ int ret;
++
++ if (!drv->mtk_txpower_vendor_cmd_avail) {
++ wpa_printf(MSG_INFO,
++ "nl80211: Driver does not support setting lpi control");
++ return 0;
++ }
++
++ msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR);
++ if (!msg)
++ goto fail;
++
++ if (nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
++ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
++ MTK_NL80211_VENDOR_SUBCMD_TXPOWER_CTRL))
++ goto fail;
++
++ data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
++ if (!data)
++ goto fail;
++
++ nla_put_u8(msg, MTK_VENDOR_ATTR_TXPOWER_CTRL_LPI_ENABLE, lpi_enable);
++ nla_put_u8(msg, MTK_VENDOR_ATTR_TXPOWER_CTRL_SKU_IDX, sku_idx);
++ nla_put_u8(msg, MTK_VENDOR_ATTR_TXPOWER_CTRL_BCN_DUP, beacon_dup);
++
++ nla_nest_end(msg, data);
++ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
++ if (ret)
++ wpa_printf(MSG_ERROR, "Failed to set lpi_enable. ret=%d (%s)", ret, strerror(-ret));
++
++ return ret;
++
++fail:
++ nlmsg_free(msg);
++ return -ENOBUFS;
++}
++
+ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
+ .name = "nl80211",
+ .desc = "Linux nl80211/cfg80211",
+@@ -13558,4 +13608,5 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
+ .ap_trigtype = nl80211_ap_trigtype,
+ .amnt_set = nl80211_amnt_set,
+ .amnt_dump = nl80211_amnt_dump,
++ .txpower_ctrl = nl80211_txpower_ctrl,
+ };
+diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
+index 7dd88e7..640fdc5 100644
+--- a/src/drivers/driver_nl80211.h
++++ b/src/drivers/driver_nl80211.h
+@@ -189,6 +189,7 @@ struct wpa_driver_nl80211_data {
+ unsigned int mtk_bss_color_vendor_cmd_avail:1;
+ unsigned int mtk_rfeatures_vendor_cmd_avail:1;
+ unsigned int mtk_amnt_vendor_cmd_avail:1;
++ unsigned int mtk_txpower_vendor_cmd_avail:1;
+
+ u64 vendor_scan_cookie;
+ u64 remain_on_chan_cookie;
+diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
+index 5c1a35d..004c452 100644
+--- a/src/drivers/driver_nl80211_capa.c
++++ b/src/drivers/driver_nl80211_capa.c
+@@ -1100,6 +1100,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
+ case MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL:
+ drv->mtk_rfeatures_vendor_cmd_avail = 1;
+ break;
++ case MTK_NL80211_VENDOR_SUBCMD_TXPOWER_CTRL:
++ drv->mtk_txpower_vendor_cmd_avail = 1;
++ break;
+ }
+ }
+
+--
+2.18.0
+
diff --git a/recipes-wifi/wpa-supplicant/files/patches/patches.inc b/recipes-wifi/wpa-supplicant/files/patches/patches.inc
index 0a397fe..b7af618 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/patches.inc
+++ b/recipes-wifi/wpa-supplicant/files/patches/patches.inc
@@ -115,4 +115,5 @@
file://mtk-0047-hostapd-mtk-add-support-for-channel-switching-to-dfs.patch \
file://mtk-0048-hostapd-mtk-add-support-for-channel-switching-with-c.patch \
file://mtk-0049-hostapd-mtk-Add-DFS-offchan-channel-switch.patch \
+ file://mtk-0050-hostapd-mtk-Add-txpower-vendor-command.patch \
"