[rdkb][common][bsp][Refactor and sync wifi from openwrt]

[Description]
3a2eef0b [MAC80211][Release][Update release note for Filogic 880/860 MLO Beta release]
cfbd2411 [MAC80211][Release][Filogic 880/860 MLO Beta release]
6c180e3f [MAC80211][WiFi7][misc][Add Eagle BE14000 efem default bin]
a55f34db [MAC80211][Release][Prepare for Filogic 880/860 release]
5b45ebca [MAC80211][WiFi7][hostapd][Add puncture bitmap to ucode]
95bbea73 [MAC80211][WiFi6][mt76][Add PID to only report data-frame TX rate]
b15ced26 [MAC80211][WiFi6][hostapd][Fix DFS channel selection issue]
d59133cb [MAC80211][WiFi6][mt76][Fix pse info not correct information]
3921b4b2 [MAC80211][WiFi6][mt76][Fix incomplete QoS-map setting to FW]
4e7690c7 [MAC80211][WiFi6/7][app][Change ATECHANNEL mapping cmd]
eb37af90 [MAC80211][WiFi7][app][Add support for per-packet bw & primary selection]
0ea82adf [MAC80211][WiFi6][core][Fix DFS CAC issue after CSA]

[Release-log]

Change-Id: I9bec97ec1b2e1c49ed43a812a07a5b21fcbb70a6
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0112-mtk-hostapd-support-enable-disable-preamble-puncture.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0112-mtk-hostapd-support-enable-disable-preamble-puncture.patch
new file mode 100644
index 0000000..0f8af3e
--- /dev/null
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0112-mtk-hostapd-support-enable-disable-preamble-puncture.patch
@@ -0,0 +1,470 @@
+From d45a052e2c7efe295705ad2185f36b38058ede83 Mon Sep 17 00:00:00 2001
+From: Allen Ye <allen.ye@mediatek.com>
+Date: Tue, 28 May 2024 17:46:26 +0800
+Subject: [PATCH 112/126] mtk: hostapd: support enable/disable preamble
+ puncture from mtk vendor command
+
+Add mtk vendor event to update punct bitmap and trigger channel switch.
+Change to pp user mode when use hostapd_cli to channel switch.
+Change pp vendor cmd use link_id instead of band_idx.
+Remove band_ind in hostapd_cli get/set pp cmd.
+
+Change pp default enable firmware mode.
+
+Signed-off-by: Allen Ye <allen.ye@mediatek.com>
+---
+ hostapd/config_file.c              |  1 -
+ hostapd/ctrl_iface.c               | 45 ++++++++--------
+ hostapd/hostapd_cli.c              |  4 +-
+ src/ap/ap_config.c                 |  2 +-
+ src/ap/ap_drv_ops.c                | 10 +++-
+ src/ap/drv_callbacks.c             | 82 ++++++++++++++++++++++++++++++
+ src/common/mtk_vendor.h            |  8 ++-
+ src/drivers/driver.h               | 11 +++-
+ src/drivers/driver_nl80211.c       | 10 ++--
+ src/drivers/driver_nl80211_event.c | 48 +++++++++++++++++
+ 10 files changed, 185 insertions(+), 36 deletions(-)
+
+diff --git a/hostapd/config_file.c b/hostapd/config_file.c
+index 38273a4f2..f7bfc357a 100644
+--- a/hostapd/config_file.c
++++ b/hostapd/config_file.c
+@@ -5452,7 +5452,6 @@ static int hostapd_config_fill(struct hostapd_config *conf,
+ 		if (get_u16(pos, line, &conf->punct_bitmap))
+ 			return 1;
+ 		conf->punct_bitmap = atoi(pos);
+-		conf->pp_mode = PP_USR_MODE;
+ 	} else if (os_strcmp(buf, "punct_acs_threshold") == 0) {
+ 		int val = atoi(pos);
+ 
+diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
+index 988bc90de..337261f8f 100644
+--- a/hostapd/ctrl_iface.c
++++ b/hostapd/ctrl_iface.c
+@@ -2818,6 +2818,7 @@ static int hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface,
+ #ifdef NEED_AP_MLME
+ 	struct hostapd_hw_modes *mode = iface->current_mode;
+ 	struct csa_settings settings, background_settings;
++	struct hostapd_data *hapd;
+ 	int ret;
+ 	int freq, state;
+ 	int bandwidth, oper_chwidth;
+@@ -2914,6 +2915,17 @@ static int hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface,
+ 		break;
+ 	}
+ 
++#ifdef CONFIG_IEEE80211BE
++	hapd = iface->bss[0];
++	if (hapd->iconf->punct_bitmap != settings.punct_bitmap &&
++	    hapd->iconf->pp_mode != PP_USR_MODE) {
++		hapd->iconf->pp_mode = PP_USR_MODE;
++		ret = hostapd_drv_pp_mode_set(hapd);
++		if (ret)
++			return ret;
++	}
++#endif /* CONFIG_IEEE80211BE */
++
+ 	for (i = 0; i < iface->num_bss; i++) {
+ 
+ 		/* Save CHAN_SWITCH VHT, HE, and EHT config */
+@@ -5172,8 +5184,7 @@ static int
+ hostapd_ctrl_iface_set_pp(struct hostapd_data *hapd, char *cmd, char *buf,
+ 			  size_t buflen)
+ {
+-	char *band, *config, *value;
+-	u8 band_idx;
++	char *config, *value;
+ 
+ 	config = cmd;
+ 
+@@ -5182,31 +5193,26 @@ hostapd_ctrl_iface_set_pp(struct hostapd_data *hapd, char *cmd, char *buf,
+ 		return -1;
+ 	*value++ = '\0';
+ 
+-	band = os_strchr(value, ' ');
+-	if (band == NULL)
+-		return -1;
+-	*band++ = '\0';
+-	band_idx = strtol(band, NULL, 10);
+-
+-	hapd = hostapd_get_hapd_by_band_idx(hapd, band_idx);
+-
+-	if (!hapd)
+-		return -1;
+-
+ 	if (os_strcmp(config, "mode") == 0) {
+ 		int val = strtol(value, NULL, 10);
+ 
+-		if (val < PP_DISABLE || val > PP_FW_MODE) {
++		switch(val) {
++		case PP_DISABLE:
++		case PP_FW_MODE:
++			break;
++		case PP_USR_MODE:
++		default:
+ 			wpa_printf(MSG_ERROR, "Invalid value for SET_PP");
+ 			return -1;
+ 		}
+ 		hapd->iconf->pp_mode = (u8) val;
++		hapd->iconf->punct_bitmap = 0;
+ 		if (hostapd_drv_pp_mode_set(hapd) != 0)
+ 			return -1;
+ 	} else {
+ 		wpa_printf(MSG_ERROR,
+ 			   "Unsupported parameter %s for SET_PP"
+-			   "Usage: set_pp mode <value> <band_idx>", config);
++			   "Usage: set_pp mode <value>", config);
+ 		return -1;
+ 	}
+ 	return os_snprintf(buf, buflen, "OK\n");
+@@ -5216,15 +5222,6 @@ static int
+ hostapd_ctrl_iface_get_pp(struct hostapd_data *hapd, char *cmd, char *buf,
+ 			  size_t buflen)
+ {
+-	u8 band_idx;
+-
+-	band_idx = strtol(cmd, NULL, 10);
+-
+-	hapd = hostapd_get_hapd_by_band_idx(hapd, band_idx);
+-
+-	if (!hapd)
+-		return -1;
+-
+ 	return os_snprintf(buf, buflen, "pp_mode: %d, punct_bitmap: 0x%04x\n",
+ 			   hapd->iconf->pp_mode, hapd->iconf->punct_bitmap);
+ }
+diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c
+index bfa912dff..12ee0a18f 100644
+--- a/hostapd/hostapd_cli.c
++++ b/hostapd/hostapd_cli.c
+@@ -1764,13 +1764,13 @@ static int hostapd_cli_cmd_dump_csi(struct wpa_ctrl *ctrl, int argc,
+ static int hostapd_cli_cmd_set_pp(struct wpa_ctrl *ctrl, int argc,
+ 					   char *argv[])
+ {
+-	return hostapd_cli_cmd(ctrl, "set_pp", 3, argc, argv);
++	return hostapd_cli_cmd(ctrl, "set_pp", 2, argc, argv);
+ }
+ 
+ static int hostapd_cli_cmd_get_pp(struct wpa_ctrl *ctrl, int argc,
+ 					   char *argv[])
+ {
+-	return hostapd_cli_cmd(ctrl, "get_pp", 1, argc, argv);
++	return hostapd_cli_cmd(ctrl, "get_pp", 0, argc, argv);
+ }
+ 
+ static int hostapd_cli_cmd_wmm(struct wpa_ctrl *ctrl, int argc,
+diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c
+index 95100b25c..4528df823 100644
+--- a/src/ap/ap_config.c
++++ b/src/ap/ap_config.c
+@@ -312,7 +312,7 @@ 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->pp_mode = PP_DISABLE;
++	conf->pp_mode = PP_FW_MODE;
+ 	conf->band_idx = 255;
+ 
+ 	hostapd_set_and_check_bw320_offset(conf, 0);
+diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
+index 8631bf960..f9ec9a689 100644
+--- a/src/ap/ap_drv_ops.c
++++ b/src/ap/ap_drv_ops.c
+@@ -1447,14 +1447,20 @@ int hostapd_drv_background_radar_mode(struct hostapd_data *hapd)
+ 
+ int hostapd_drv_pp_mode_set(struct hostapd_data *hapd)
+ {
++	s8 link_id = -1;
++
+ 	if (!hapd->driver || !hapd->driver->pp_mode_set ||
+-	    hapd->iconf->pp_mode >= PP_USR_MODE ||
++	    hapd->iconf->pp_mode > PP_USR_MODE ||
+ 	    hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
+ 		return 0;
+ 
++	if (hapd->conf->mld_ap)
++		link_id = hapd->mld_link_id;
++
+ 	return hapd->driver->pp_mode_set(hapd->drv_priv,
+ 					 hapd->iconf->pp_mode,
+-					 hapd->iconf->band_idx);
++					 link_id,
++					 hapd->iconf->punct_bitmap);
+ }
+ 
+ int hostapd_drv_beacon_ctrl(struct hostapd_data *hapd, u8 beacon_mode)
+diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
+index 0e7cfd285..420d156c8 100644
+--- a/src/ap/drv_callbacks.c
++++ b/src/ap/drv_callbacks.c
+@@ -43,6 +43,7 @@
+ #include "fils_hlp.h"
+ #include "neighbor_db.h"
+ #include "nan_usd_ap.h"
++#include "ap/beacon.h"
+ 
+ 
+ #ifdef CONFIG_FILS
+@@ -2456,6 +2457,81 @@ static void hostapd_event_color_change(struct hostapd_data *hapd, bool success)
+ #endif  /* CONFIG_IEEE80211AX */
+ 
+ 
++static void hostapd_event_pp_bitmap_update(struct hostapd_data *hapd,
++					   struct ch_switch *ch_switch)
++{
++	struct hostapd_iface *iface = hapd->iface;
++	struct hostapd_hw_modes *cmode = iface->current_mode;
++	int err, freq;
++	struct csa_settings csa_settings;
++	unsigned int i;
++
++	/* Check if CSA in progress */
++	if (hostapd_csa_in_progress(iface))
++		return;
++
++	if (!hw_get_channel_chan(cmode, iface->conf->channel, &freq))
++		return;
++
++	if (iface->conf->punct_bitmap == ch_switch->punct_bitmap ||
++	    freq != ch_switch->freq)
++		return;
++
++	/* Setup CSA request */
++	os_memset(&csa_settings, 0, sizeof(csa_settings));
++	csa_settings.cs_count = 5;
++	csa_settings.block_tx = 0;
++	csa_settings.punct_bitmap = ch_switch->punct_bitmap;
++	csa_settings.link_id = ch_switch->link_id;
++
++	err = hostapd_set_freq_params(&csa_settings.freq_params,
++				      iface->conf->hw_mode,
++				      freq,
++				      iface->conf->channel,
++				      iface->conf->enable_edmg,
++				      iface->conf->edmg_channel,
++				      iface->conf->ieee80211n,
++				      iface->conf->ieee80211ac,
++				      iface->conf->ieee80211ax,
++				      iface->conf->ieee80211be,
++				      iface->conf->secondary_channel,
++				      hostapd_get_oper_chwidth(iface->conf),
++				      hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
++				      hostapd_get_oper_centr_freq_seg1_idx(iface->conf),
++				      cmode->vht_capab,
++				      &cmode->he_capab[IEEE80211_MODE_AP],
++				      &cmode->eht_capab[IEEE80211_MODE_AP],
++				      ch_switch->punct_bitmap);
++
++	if (err) {
++		wpa_printf(MSG_ERROR,
++			   "Failed to calculate CSA freq params");
++		hostapd_disable_iface(iface);
++		return;
++	}
++
++	for (i = 0; i < iface->num_bss; i++) {
++		ieee802_11_set_bss_critical_update(iface->bss[i],
++						   BSS_CRIT_UPDATE_EVENT_CSA);
++
++		err = hostapd_switch_channel(iface->bss[i], &csa_settings);
++		if (err)
++			break;
++
++#ifdef CONFIG_IEEE80211BE
++		if (iface->bss[i]->conf->mld_ap)
++			hostapd_update_aff_link_beacon(iface->bss[i],
++						       csa_settings.cs_count);
++
++		/* FIXME:
++		 * CU flag should be cleared when receiving DTIM event from FW
++		 */
++		iface->bss[i]->eht_mld_bss_critical_update = 0;
++#endif /* CONFIG_IEEE80211BE */
++	}
++}
++
++
+ void hostapd_wpa_event(void *ctx, enum wpa_event_type event,
+ 		       union wpa_event_data *data)
+ {
+@@ -2759,6 +2835,12 @@ void hostapd_wpa_event(void *ctx, enum wpa_event_type event,
+ 		hostapd_event_dfs_cac_started(hapd, &data->dfs_event);
+ 		break;
+ #endif /* NEED_AP_MLME */
++	case EVENT_PP_BITMAP_UPDATE:
++		if (!data)
++			break;
++		hapd = switch_link_hapd(hapd, data->ch_switch.link_id);
++		hostapd_event_pp_bitmap_update(hapd, &data->ch_switch);
++		break;
+ 	case EVENT_INTERFACE_ENABLED:
+ 		wpa_msg(hapd->msg_ctx, MSG_INFO, INTERFACE_ENABLED);
+ 		if (hapd->disabled && hapd->started) {
+diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
+index 937b968d5..933f0099d 100644
+--- a/src/common/mtk_vendor.h
++++ b/src/common/mtk_vendor.h
+@@ -22,6 +22,10 @@ enum mtk_nl80211_vendor_subcmds {
+ 	MTK_NL80211_VENDOR_SUBCMD_EML_CTRL = 0xd3,
+ };
+ 
++enum mtk_nl80211_vendor_subevents {
++	MTK_NL80211_VENDOR_EVENT_PP_BMP_UPDATE = 0x5,
++};
++
+ enum mtk_vendor_attr_edcca_ctrl {
+ 	MTK_VENDOR_ATTR_EDCCA_THRESHOLD_INVALID = 0,
+ 
+@@ -271,7 +275,9 @@ enum mtk_vendor_attr_pp_ctrl {
+ 	MTK_VENDOR_ATTR_PP_CTRL_UNSPEC,
+ 
+ 	MTK_VENDOR_ATTR_PP_MODE,
+-	MTK_VENDOR_ATTR_PP_BAND_IDX,
++	MTK_VENDOR_ATTR_PP_LINK_ID,
++	MTK_VENDOR_ATTR_PP_BITMAP,
++	MTK_VENDOR_ATTR_PP_CURR_FREQ,
+ 
+ 	/* keep last */
+ 	NUM_MTK_VENDOR_ATTRS_PP_CTRL,
+diff --git a/src/drivers/driver.h b/src/drivers/driver.h
+index dacf0a98d..5e65d9e0b 100644
+--- a/src/drivers/driver.h
++++ b/src/drivers/driver.h
+@@ -5381,9 +5381,10 @@ struct wpa_driver_ops {
+ 	 * pp_mode_set - Set preamble puncture operation mode
+ 	 * @priv: Private driver interface data
+ 	 * @pp_mode: Value is defined in enum pp_mode
+-	 * @band_idx: chip band index
++	 * @link_id: MLD link id. -1 if this is an non-MLD AP
++	 * @punct_bitmap: current puncture bitmap
+ 	 */
+-	int (*pp_mode_set)(void *priv, const u8 pp_mode, u8 band_idx);
++	int (*pp_mode_set)(void *priv, const u8 pp_mode, s8 link_id, u16 punct_bitmap);
+ #ifdef CONFIG_IEEE80211BE
+ 	int (*get_mld_addr)(void *priv, u8 *addr);
+ #endif
+@@ -6058,6 +6059,12 @@ enum wpa_event_type {
+ 	 * channel has been updated and operating channel should expand its width.
+ 	 */
+ 	EVENT_DFS_BACKGROUND_CHAN_EXPAND,
++
++	/**
++	 * EVENT_PP_BITMAP_UPDATE - Notification that the new puncture bitmap
++	 * has been applied and a channel switch should be triggered.
++	 */
++	EVENT_PP_BITMAP_UPDATE,
+ };
+ 
+ 
+diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
+index 80fe2e591..5d97317f7 100644
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -160,7 +160,9 @@ amnt_dump_policy[NUM_MTK_VENDOR_ATTRS_AMNT_DUMP] = {
+ static struct nla_policy
+ pp_ctrl_policy[NUM_MTK_VENDOR_ATTRS_PP_CTRL] = {
+ 	[MTK_VENDOR_ATTR_PP_MODE] = { .type = NLA_U8 },
+-	[MTK_VENDOR_ATTR_PP_BAND_IDX] = { .type = NLA_U8 },
++	[MTK_VENDOR_ATTR_PP_LINK_ID] = { .type = NLA_U8 },
++	[MTK_VENDOR_ATTR_PP_BITMAP] = { .type = NLA_U16 },
++	[MTK_VENDOR_ATTR_PP_CURR_FREQ] = { .type = NLA_U32 },
+ };
+ 
+ static struct nla_policy csi_ctrl_policy[NUM_MTK_VENDOR_ATTRS_CSI_CTRL] = {
+@@ -15248,7 +15250,7 @@ static int nl80211_background_radar_mode(void *priv, const u8 background_radar_m
+ 	return ret;
+ }
+ 
+-static int nl80211_pp_mode_set(void *priv, const u8 pp_mode, u8 band_idx)
++static int nl80211_pp_mode_set(void *priv, const u8 pp_mode, s8 link_id, u16 punct_bitmap)
+ {
+ 	struct i802_bss *bss = priv;
+ 	struct wpa_driver_nl80211_data *drv = bss->drv;
+@@ -15275,8 +15277,10 @@ static int nl80211_pp_mode_set(void *priv, const u8 pp_mode, u8 band_idx)
+ 	if (!data)
+ 		goto fail;
+ 
+-	nla_put_u8(msg, MTK_VENDOR_ATTR_PP_BAND_IDX, band_idx);
++	if (link_id > -1)
++		nla_put_u8(msg, MTK_VENDOR_ATTR_PP_LINK_ID, link_id);
+ 	nla_put_u8(msg, MTK_VENDOR_ATTR_PP_MODE, pp_mode);
++	nla_put_u16(msg, MTK_VENDOR_ATTR_PP_BITMAP, punct_bitmap);
+ 
+ 	nla_nest_end(msg, data);
+ 	ret = send_and_recv_cmd(drv, msg);
+diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
+index e95593a5b..efdb8ef7f 100644
+--- a/src/drivers/driver_nl80211_event.c
++++ b/src/drivers/driver_nl80211_event.c
+@@ -19,6 +19,7 @@
+ #include "common/ieee802_11_defs.h"
+ #include "common/ieee802_11_common.h"
+ #include "driver_nl80211.h"
++#include "common/mtk_vendor.h"
+ 
+ 
+ static void
+@@ -3332,6 +3333,50 @@ static void nl80211_vendor_event_brcm(struct wpa_driver_nl80211_data *drv,
+ 
+ #endif /* CONFIG_DRIVER_NL80211_BRCM */
+ 
++static void mtk_nl80211_pp_bitmap_update(struct wpa_driver_nl80211_data *drv,
++					 const u8 *data, size_t len)
++{
++	struct nlattr *tb[MTK_VENDOR_ATTR_PP_CTRL_MAX + 1];
++	union wpa_event_data event;
++
++	wpa_printf(MSG_DEBUG,
++		   "nl80211: MTK pp bitmap update vendor event received");
++
++	if (nla_parse(tb, MTK_VENDOR_ATTR_PP_CTRL_MAX,
++		      (struct nlattr *) data, len, NULL) ||
++	    !tb[MTK_VENDOR_ATTR_PP_CURR_FREQ] ||
++	    !tb[MTK_VENDOR_ATTR_PP_BITMAP])
++		return;
++
++	os_memset(&event, 0, sizeof(event));
++	event.ch_switch.freq = nla_get_u32(tb[MTK_VENDOR_ATTR_PP_CURR_FREQ]);
++
++	event.ch_switch.link_id =
++		nl80211_get_link_id_by_freq(drv->first_bss, event.ch_switch.freq);
++	event.ch_switch.punct_bitmap =
++		nla_get_u16(tb[MTK_VENDOR_ATTR_PP_BITMAP]);
++
++	wpa_printf(MSG_DEBUG,
++		   "nl80211: puncture bitmap: 0x%04x, link_id: %d",
++		   event.ch_switch.punct_bitmap, event.ch_switch.link_id);
++	wpa_supplicant_event(drv->ctx, EVENT_PP_BITMAP_UPDATE, &event);
++}
++
++static void nl80211_vendor_event_mtk(struct wpa_driver_nl80211_data *drv,
++				      u32 subcmd, u8 *data, size_t len)
++{
++	wpa_printf(MSG_DEBUG, "nl80211: Got MTK vendor event %u", subcmd);
++	switch (subcmd) {
++	case MTK_NL80211_VENDOR_EVENT_PP_BMP_UPDATE:
++		mtk_nl80211_pp_bitmap_update(drv, data, len);
++		break;
++	default:
++		wpa_printf(MSG_DEBUG,
++			   "%s: Ignore unsupported MTK vendor event %u",
++			   __func__, subcmd);
++		break;
++	}
++}
+ 
+ static void nl80211_vendor_event(struct wpa_driver_nl80211_data *drv,
+ 				 struct nlattr **tb)
+@@ -3388,6 +3433,9 @@ static void nl80211_vendor_event(struct wpa_driver_nl80211_data *drv,
+ 		nl80211_vendor_event_brcm(drv, subcmd, data, len);
+ 		break;
+ #endif /* CONFIG_DRIVER_NL80211_BRCM */
++	case OUI_MTK:
++		nl80211_vendor_event_mtk(drv, subcmd, data, len);
++		break;
+ 	default:
+ 		wpa_printf(MSG_DEBUG, "nl80211: Ignore unsupported vendor event");
+ 		break;
+-- 
+2.18.0
+