[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 \
     "