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

[Description]
174f052 [MAC80211][wpa_supplicant][Add sae_pwe config to wpa_supplicant]
393edf7 [mac80211][mt76][Fix kernel crash because wcid may be null]
693a907 [MAC80211][misc][Change the HEMU name]
319b70b [MT7622+Kite WHNAT development]
3040258 [MAC80211][core][refine backports 5.15 patches]

[Release-log]

Change-Id: Icaa248f9381c398c78a71e09d4427594cb536f28
diff --git a/recipes-wifi/atenl/files/iwpriv.sh b/recipes-wifi/atenl/files/iwpriv.sh
index 333852d..8b0d76f 100644
--- a/recipes-wifi/atenl/files/iwpriv.sh
+++ b/recipes-wifi/atenl/files/iwpriv.sh
@@ -1073,7 +1073,7 @@
     echo "  mwctl <interface> set ap_wireless ampdu=<enable>"
     echo "  mwctl <interface> set ap_wireless amsdu=<enable>"
     echo "  mwctl <interface> set ap_wireless cert=<enable>"
-    echo "  mwctl <interface> set hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))"
+    echo "  mwctl <interface> set mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))"
     echo "  mwctl <interface> dump phy_capa"
 }
 
@@ -1121,7 +1121,7 @@
         ## In wifi 7 chipset, testmode & vendor command both use mwctl
         ## Therefore this wrapper would translate it to either mt76-test or mt76-vendor based on the attribute of the command
         ## Translate to mt76-vendor command
-        "csi"|"amnt"|"ap_rfeatures"|"ap_wireless"|"hemu")
+        "csi"|"amnt"|"ap_rfeatures"|"ap_wireless"|"mu")
 	    if [ ${is_eagle} == "1" ]; then
                 do_cmd "hostapd_cli -i $*"
                 skip=1
diff --git a/recipes-wifi/hostapd/files/openwrt_script/hostapd.sh b/recipes-wifi/hostapd/files/openwrt_script/hostapd.sh
index b165995..8c233a4 100644
--- a/recipes-wifi/hostapd/files/openwrt_script/hostapd.sh
+++ b/recipes-wifi/hostapd/files/openwrt_script/hostapd.sh
@@ -24,12 +24,12 @@
 		[1234])
 			for idx in 1 2 3 4; do
 				local zidx
-				zidx=$(($idx - 1))
+				zidx="$(($idx - 1))"
 				json_get_var ckey "key${idx}"
 				[ -n "$ckey" ] && \
 					append $var "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T"
 			done
-			wep_keyidx=$((key - 1))
+			wep_keyidx="$((key - 1))"
 		;;
 		*)
 			append $var "wep_key0=$(prepare_key_wep "$key")" "$N$T"
@@ -787,7 +787,7 @@
 		;;
 	esac
 
-	local auth_algs=$((($auth_mode_shared << 1) | $auth_mode_open))
+	local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))"
 	append bss_conf "auth_algs=${auth_algs:-1}" "$N"
 	append bss_conf "wpa=$wpa" "$N"
 	[ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N"
@@ -1156,7 +1156,7 @@
 		append bss_conf "$val" "$N"
 	done
 
-	bss_md5sum=$(echo $bss_conf | md5sum | cut -d" " -f1)
+	bss_md5sum="$(echo $bss_conf | md5sum | cut -d" " -f1)"
 	append bss_conf "config_id=$bss_md5sum" "$N"
 
 	append "$var" "$bss_conf" "$N"
@@ -1178,7 +1178,7 @@
 	set_default log_iapp   1
 	set_default log_mlme   1
 
-	local log_mask=$(( \
+	local log_mask="$(( \
 		($log_80211  << 0) | \
 		($log_8021x  << 1) | \
 		($log_radius << 2) | \
@@ -1186,7 +1186,7 @@
 		($log_driver << 4) | \
 		($log_iapp   << 5) | \
 		($log_mlme   << 6)   \
-	))
+	))"
 
 	append "$var" "logger_syslog=$log_mask" "$N"
 	append "$var" "logger_syslog_level=$log_level" "$N"
@@ -1372,11 +1372,11 @@
 
 			key_mgmt="$wpa_key_mgmt"
 
-			if [ ${#key} -eq 64 ]; then
-				passphrase="psk=${key}"
+			if [ "$_w_mode" = "mesh" ] || [ "$auth_type" = "sae" ]; then
+				passphrase="sae_password=\"${key}\""
 			else
-				if [ "$_w_mode" = "mesh" ]; then
-					passphrase="sae_password=\"${key}\""
+				if [ ${#key} -eq 64 ]; then
+					passphrase="psk=${key}"
 				else
 					passphrase="psk=\"${key}\""
 				fi
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
similarity index 71%
rename from recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
rename to recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
index 27e71da..07e0d6d 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
@@ -1,7 +1,7 @@
 From 4919444a2dc29c019ec92321109603763c732071 Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Tue, 9 Aug 2022 10:23:44 -0700
-Subject: [PATCH 06/15] hostapd: mtk: Add hostapd HEMU SET/GET control
+Subject: [PATCH 06/15] hostapd: mtk: Add hostapd MU SET/GET control
 
 ---
  hostapd/config_file.c             |   9 +++
@@ -27,15 +27,15 @@
  			return 1;
  		}
  		bss->unsol_bcast_probe_resp_interval = val;
-+	} else if (os_strcmp(buf, "hemu_onoff") == 0) {
++	} else if (os_strcmp(buf, "mu_onoff") == 0) {
 +		int val = atoi(pos);
 +		if (val < 0 || val > 15) {
 +			wpa_printf(MSG_ERROR,
-+				   "Line %d: invalid hemu_onoff value",
++				   "Line %d: invalid mu_onoff value",
 +				   line);
 +			return 1;
 +		}
-+		conf->hemu_onoff = val;
++		conf->mu_onoff = val;
  #endif /* CONFIG_IEEE80211AX */
  	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
  		bss->max_listen_interval = atoi(pos);
@@ -48,7 +48,7 @@
  
  
 +static int
-+hostapd_ctrl_iface_set_hemu(struct hostapd_data *hapd, char *cmd,
++hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd,
 +					 char *buf, size_t buflen)
 +{
 +	char *pos, *config, *value;
@@ -63,19 +63,19 @@
 +	value = pos;
 +
 +	if (os_strcmp(config, "onoff") == 0) {
-+		int hemu = atoi(value);
-+		if (hemu < 0 || hemu > 15) {
-+			wpa_printf(MSG_ERROR, "Invalid value for hemu");
++		int mu = atoi(value);
++		if (mu < 0 || mu > 15) {
++			wpa_printf(MSG_ERROR, "Invalid value for mu");
 +			return -1;
 +		}
-+		hapd->iconf->hemu_onoff = (u8) hemu;
++		hapd->iconf->mu_onoff = (u8) mu;
 +	} else {
 +		wpa_printf(MSG_ERROR,
-+			"Unsupported parameter %s for SET_HEMU", config);
++			"Unsupported parameter %s for SET_MU", config);
 +		return -1;
 +	}
 +
-+	if(hostapd_drv_hemu_ctrl(hapd) == 0) {
++	if(hostapd_drv_mu_ctrl(hapd) == 0) {
 +		return os_snprintf(buf, buflen, "OK\n");
 +	} else {
 +		return -1;
@@ -84,19 +84,19 @@
 +
 +
 +static int
-+hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
++hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
 +					 size_t buflen)
 +{
-+	u8 hemu_onoff;
++	u8 mu_onoff;
 +	char *pos, *end;
 +
 +	pos = buf;
 +	end = buf + buflen;
 +
-+	if (hostapd_drv_hemu_dump(hapd, &hemu_onoff) == 0) {
-+		hapd->iconf->hemu_onoff = hemu_onoff;
++	if (hostapd_drv_mu_dump(hapd, &mu_onoff) == 0) {
++		hapd->iconf->mu_onoff = mu_onoff;
 +		return os_snprintf(pos, end - pos, "[hostapd_cli] = UL MU-MIMO: %d, DL MU-MIMO: %d, UL OFDMA: %d, DL OFDMA: %d\n",
-+			!!(hemu_onoff&BIT(3)), !!(hemu_onoff&BIT(2)), !!(hemu_onoff&BIT(1)), !!(hemu_onoff&BIT(0)));
++			!!(mu_onoff&BIT(3)), !!(mu_onoff&BIT(2)), !!(mu_onoff&BIT(1)), !!(mu_onoff&BIT(0)));
 +	} else {
 +		wpa_printf(MSG_INFO, "ctrl iface failed to call");
 +		return -1;
@@ -111,11 +111,11 @@
  	} else if (os_strncmp(buf, "GET_EDCCA ", 10) == 0) {
  		reply_len = hostapd_ctrl_iface_get_edcca(hapd, buf+10, reply,
  							  reply_size);
-+	} else if (os_strncmp(buf, "SET_HEMU ", 9) == 0) {
-+		reply_len = hostapd_ctrl_iface_set_hemu(hapd, buf+9, reply,
++	} else if (os_strncmp(buf, "SET_MU ", 7) == 0) {
++		reply_len = hostapd_ctrl_iface_set_mu(hapd, buf + 7, reply,
 +							  reply_size);
-+	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
-+		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
++	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
++		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else {
  		os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
  		reply_len = 16;
@@ -127,17 +127,17 @@
  }
  
  
-+static int hostapd_cli_cmd_set_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_set_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "SET_HEMU", 1, argc, argv);
++	return hostapd_cli_cmd(ctrl, "SET_MU", 1, argc, argv);
 +}
 +
 +
-+static int hostapd_cli_cmd_get_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "GET_HEMU", 0, NULL, NULL);
++	return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
 +}
 +
 +
@@ -148,10 +148,10 @@
  	  " = send FTM range request"},
  	{ "driver_flags", hostapd_cli_cmd_driver_flags, NULL,
  	  " = show supported driver flags"},
-+	{ "set_hemu", hostapd_cli_cmd_set_hemu, NULL,
++	{ "set_mu", hostapd_cli_cmd_set_mu, NULL,
 +		"<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
-+	{ "get_hemu", hostapd_cli_cmd_get_hemu, NULL,
-+		" = show hemu onoff value in 0-15 bitmap"},
++	{ "get_mu", hostapd_cli_cmd_get_mu, NULL,
++		" = show mu onoff value in 0-15 bitmap"},
  #ifdef CONFIG_DPP
  	{ "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
  	  "report a scanned DPP URI from a QR Code" },
@@ -163,7 +163,7 @@
  	conf->he_6ghz_max_ampdu_len_exp = 7;
  	conf->he_6ghz_rx_ant_pat = 1;
  	conf->he_6ghz_tx_ant_pat = 1;
-+	conf->hemu_onoff = 13;
++	conf->mu_onoff = 13;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* The third octet of the country string uses an ASCII space character
@@ -175,7 +175,7 @@
  	u8 he_6ghz_rx_ant_pat;
  	u8 he_6ghz_tx_ant_pat;
  	u8 he_6ghz_reg_pwr_type;
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* VHT enable/disable config from CHAN_SWITCH */
@@ -188,18 +188,18 @@
  	return hapd->driver->get_edcca(hapd->drv_priv, mode, value);
  }
 +
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd)
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_ctrl)
++	if (!hapd->driver || !hapd->driver->mu_ctrl)
 +		return 0;
-+	return hapd->driver->hemu_ctrl(hapd->drv_priv, hapd->iconf->hemu_onoff);
++	return hapd->driver->mu_ctrl(hapd->drv_priv, hapd->iconf->mu_onoff);
 +}
 +
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_dump)
++	if (!hapd->driver || !hapd->driver->mu_dump)
 +		return 0;
-+	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
++	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
 +}
 diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
 index 70a99f406..bca39c502 100644
@@ -209,8 +209,8 @@
  int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  					  const int *threshold);
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  
  #include "drivers/driver.h"
  
@@ -222,7 +222,7 @@
  	if (hostapd_drv_configure_edcca_threshold(hapd,
  						  hapd->iconf->edcca_threshold) < 0)
  		goto fail;
-+	if (hostapd_drv_hemu_ctrl(hapd) < 0)
++	if (hostapd_drv_mu_ctrl(hapd) < 0)
 +		goto fail;
  
  	wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
@@ -235,7 +235,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-+	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
++	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 +	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
  };
@@ -244,16 +244,16 @@
  		NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL - 1
  };
  
-+enum mtk_vendor_attr_hemu_ctrl {
-+	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
++enum mtk_vendor_attr_mu_ctrl {
++	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 +
-+	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_DUMP,
++	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
 +
 +	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
++	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
++	MTK_VENDOR_ATTR_MU_CTRL_MAX =
++		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 +};
 +
 +
@@ -270,9 +270,9 @@
  	size_t unsol_bcast_probe_resp_tmpl_len;
 +
 +	/**
-+	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
++	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
 +	 */
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  };
  
  struct wpa_driver_mesh_bss_params {
@@ -282,12 +282,12 @@
  	int (*get_edcca)(void *priv, const u8 mode, u8 *value);
 +
 +	/**
-+	 * hemu_ctrl - ctrl on off for UL/DL MURU
++	 * mu_ctrl - ctrl on off for UL/DL MURU
 +	 * @priv: Private driver interface data
 +	 *
 +	 */
-+	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
-+	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
++	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
++	 int (*mu_dump)(void *priv, u8 *mu_onoff);
  };
  
  /**
@@ -300,7 +300,7 @@
  
  
 +#ifdef CONFIG_IEEE80211AX
-+static int nl80211_hemu_muruonoff(void *priv, u8 hemu_onoff)
++static int nl80211_mu_onoff(void *priv, u8 mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -308,41 +308,41 @@
 +	struct nlattr *data;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL) ||
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL) ||
 +		!(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
-+		nla_put_u8(msg, MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF, hemu_onoff)) {
++		nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, mu_onoff)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
 +	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 hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to set mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +	return ret;
 +}
 +
 +
-+static int hemu_dump_handler(struct nl_msg *msg, void *arg)
++static int mu_dump_handler(struct nl_msg *msg, void *arg)
 +{
-+	u8 *hemu_onoff = (u8 *) arg;
++	u8 *mu_onoff = (u8 *) arg;
 +	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-+	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_MAX + 1];
++	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_MAX + 1];
 +	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
 +	struct nlattr *nl_vend, *attr;
 +
 +	static const struct nla_policy
-+	hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL + 1] = {
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
++	mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL + 1] = {
++		[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
++		[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
 +	};
 +
 +	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -352,22 +352,22 @@
 +	if (!nl_vend)
 +		return NL_SKIP;
 +
-+	nla_parse(tb_vendor, MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
++	nla_parse(tb_vendor, MTK_VENDOR_ATTR_MU_CTRL_MAX,
 +		  nla_data(nl_vend), nla_len(nl_vend), NULL);
 +
-+	attr = tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP];
++	attr = tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_DUMP];
 +	if (!attr) {
-+		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_HEMU_CTRL_DUMP");
++		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_MU_CTRL_DUMP");
 +		return NL_SKIP;
 +	}
 +
-+	*hemu_onoff = nla_get_u8(attr);
-+	wpa_printf(MSG_DEBUG, "nla_get hemu_onoff: %d\n", *hemu_onoff);
++	*mu_onoff = nla_get_u8(attr);
++	wpa_printf(MSG_DEBUG, "nla_get mu_onoff: %d\n", *mu_onoff);
 +
 +	return 0;
 +}
 +
-+static int nl80211_hemu_dump(void *priv, u8 *hemu_onoff)
++static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -375,15 +375,15 @@
 +	struct nlattr *attr;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL)) {
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
@@ -396,10 +396,10 @@
 +
 +	nla_nest_end(msg, attr);
 +
-+	ret = send_and_recv_msgs(drv, msg, hemu_dump_handler, hemu_onoff, NULL, NULL);
++	ret = send_and_recv_msgs(drv, msg, mu_dump_handler, mu_onoff, NULL, NULL);
 +
 +	if(ret){
-+		wpa_printf(MSG_ERROR, "Failed to get hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to get mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +
 +	return ret;
@@ -414,8 +414,8 @@
  	.update_connect_params = nl80211_update_connection_params,
  	.send_external_auth_status = nl80211_send_external_auth_status,
  	.set_4addr_mode = nl80211_set_4addr_mode,
-+	.hemu_ctrl = nl80211_hemu_muruonoff,
-+	.hemu_dump = nl80211_hemu_dump,
++	.mu_ctrl = nl80211_mu_onoff,
++	.mu_dump = nl80211_mu_dump,
  #ifdef CONFIG_DPP
  	.dpp_listen = nl80211_dpp_listen,
  #endif /* CONFIG_DPP */
@@ -427,7 +427,7 @@
  	unsigned int brcm_do_acs:1;
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
-+	unsigned int mtk_hemu_vendor_cmd_avail:1;
++	unsigned int mtk_mu_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
  	u64 remain_on_chan_cookie;
@@ -439,8 +439,8 @@
  				case MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL :
  					drv->mtk_edcca_vendor_cmd_avail = 1;
  					break;
-+				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
-+					drv->mtk_hemu_vendor_cmd_avail = 1;
++				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
++					drv->mtk_mu_vendor_cmd_avail = 1;
 +					break;
  				}
  			}
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
index 4bc3fcd..8ca8c55 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
@@ -74,9 +74,9 @@
 index 4598737a3..a1d83e4ee 100644
 --- a/src/ap/ap_drv_ops.c
 +++ b/src/ap/ap_drv_ops.c
-@@ -1053,3 +1053,14 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
+@@ -1053,3 +1053,14 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
  		return 0;
- 	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
+ 	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
  }
 +
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd)
@@ -95,8 +95,8 @@
 +++ b/src/ap/ap_drv_ops.h
 @@ -144,6 +144,7 @@ int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  
  #include "drivers/driver.h"
@@ -107,7 +107,7 @@
 +++ b/src/ap/hostapd.c
 @@ -2304,6 +2304,8 @@ dfs_offload:
  		goto fail;
- 	if (hostapd_drv_hemu_ctrl(hapd) < 0)
+ 	if (hostapd_drv_mu_ctrl(hapd) < 0)
  		goto fail;
 +	if (hostapd_drv_three_wire_ctrl(hapd) < 0)
 +		goto fail;
@@ -119,7 +119,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,6 +13,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -154,8 +154,8 @@
 +++ b/src/drivers/driver.h
 @@ -4693,6 +4693,14 @@ struct wpa_driver_ops {
  	 */
- 	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
- 	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
+ 	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
+ 	 int (*mu_dump)(void *priv, u8 *mu_onoff);
 +
 +	/**
 +	 * three_wire_ctrl - set three_wire_ctrl mode
@@ -223,7 +223,7 @@
 @@ -183,6 +183,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
 +	unsigned int mtk_3wire_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
@@ -233,8 +233,8 @@
 --- a/src/drivers/driver_nl80211_capa.c
 +++ b/src/drivers/driver_nl80211_capa.c
 @@ -1059,6 +1059,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
- 				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
- 					drv->mtk_hemu_vendor_cmd_avail = 1;
+ 				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
+ 					drv->mtk_mu_vendor_cmd_avail = 1;
  					break;
 +				case MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL :
 +					drv->mtk_3wire_vendor_cmd_avail = 1;
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
index 6bfe3d0..fc38b4f 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
@@ -38,7 +38,7 @@
 index 5f71aeea9..c881d3717 100644
 --- a/hostapd/ctrl_iface.c
 +++ b/hostapd/ctrl_iface.c
-@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
+@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
  }
  
  
@@ -71,8 +71,8 @@
  					      int reply_size,
 @@ -4055,6 +4079,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
  							  reply_size);
- 	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
 +		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
  	} else {
@@ -165,8 +165,8 @@
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
 @@ -145,6 +145,8 @@ int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -191,7 +191,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,7 +13,8 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 -	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -200,8 +200,8 @@
  };
  
  enum mtk_vendor_attr_edcca_ctrl {
-@@ -204,6 +205,38 @@ enum mtk_vendor_attr_hemu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
+@@ -204,6 +205,38 @@ enum mtk_vendor_attr_mu_ctrl {
+ 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
  };
  
 +enum mtk_vendor_attr_ibf_ctrl {
@@ -244,9 +244,9 @@
 --- a/src/drivers/driver.h
 +++ b/src/drivers/driver.h
 @@ -1628,6 +1628,11 @@ struct wpa_driver_ap_params {
- 	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
+ 	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
  	 */
- 	u8 hemu_onoff;
+ 	u8 mu_onoff;
 +
 +	/**
 +	 * ibf_enable=<val>
@@ -406,7 +406,7 @@
 +++ b/src/drivers/driver_nl80211.h
 @@ -184,6 +184,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
 +	unsigned int mtk_ibf_vendor_cmd_avail:1;
  
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
index 8a387a7..3237aa3 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
@@ -133,7 +133,7 @@
  					      char *buf, char *reply,
  					      int reply_size,
 @@ -4081,6 +4171,11 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
  		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "DFS_DETECT_MODE ", 16) == 0) {
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
index ed796c1..dba90d1 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
@@ -162,7 +162,7 @@
 index ab9aedcee..4406666fd 100644
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
-@@ -147,6 +147,8 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+@@ -147,6 +147,8 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -374,7 +374,7 @@
 --- a/src/drivers/driver_nl80211.h
 +++ b/src/drivers/driver_nl80211.h
 @@ -185,6 +185,7 @@ struct wpa_driver_nl80211_data {
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
  	unsigned int mtk_ibf_vendor_cmd_avail:1;
 +	unsigned int mtk_wireless_vendor_cmd_avail:1;
diff --git a/recipes-wifi/hostapd/files/patches-2.10.3/patches.inc b/recipes-wifi/hostapd/files/patches-2.10.3/patches.inc
index 8cda113..4a42f53 100644
--- a/recipes-wifi/hostapd/files/patches-2.10.3/patches.inc
+++ b/recipes-wifi/hostapd/files/patches-2.10.3/patches.inc
@@ -67,7 +67,7 @@
     file://mtk-0003-hostapd-mtk-add-support-for-runtime-set-in-band-disc.patch \
     file://mtk-0004-hostapd-mtk-Add-mtk_vendor.h.patch \
     file://mtk-0005-hostapd-mtk-Support-EDCCA-hostapd-configuration.patch \
-    file://mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch \
+    file://mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch \
     file://mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch \
     file://mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch \
     file://mtk-0009-hostapd-mtk-Do-not-include-HE-capab-IE-if-associated.patch \
diff --git a/recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch b/recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
similarity index 71%
rename from recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
rename to recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
index 27e71da..07e0d6d 100644
--- a/recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
+++ b/recipes-wifi/hostapd/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
@@ -1,7 +1,7 @@
 From 4919444a2dc29c019ec92321109603763c732071 Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Tue, 9 Aug 2022 10:23:44 -0700
-Subject: [PATCH 06/15] hostapd: mtk: Add hostapd HEMU SET/GET control
+Subject: [PATCH 06/15] hostapd: mtk: Add hostapd MU SET/GET control
 
 ---
  hostapd/config_file.c             |   9 +++
@@ -27,15 +27,15 @@
  			return 1;
  		}
  		bss->unsol_bcast_probe_resp_interval = val;
-+	} else if (os_strcmp(buf, "hemu_onoff") == 0) {
++	} else if (os_strcmp(buf, "mu_onoff") == 0) {
 +		int val = atoi(pos);
 +		if (val < 0 || val > 15) {
 +			wpa_printf(MSG_ERROR,
-+				   "Line %d: invalid hemu_onoff value",
++				   "Line %d: invalid mu_onoff value",
 +				   line);
 +			return 1;
 +		}
-+		conf->hemu_onoff = val;
++		conf->mu_onoff = val;
  #endif /* CONFIG_IEEE80211AX */
  	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
  		bss->max_listen_interval = atoi(pos);
@@ -48,7 +48,7 @@
  
  
 +static int
-+hostapd_ctrl_iface_set_hemu(struct hostapd_data *hapd, char *cmd,
++hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd,
 +					 char *buf, size_t buflen)
 +{
 +	char *pos, *config, *value;
@@ -63,19 +63,19 @@
 +	value = pos;
 +
 +	if (os_strcmp(config, "onoff") == 0) {
-+		int hemu = atoi(value);
-+		if (hemu < 0 || hemu > 15) {
-+			wpa_printf(MSG_ERROR, "Invalid value for hemu");
++		int mu = atoi(value);
++		if (mu < 0 || mu > 15) {
++			wpa_printf(MSG_ERROR, "Invalid value for mu");
 +			return -1;
 +		}
-+		hapd->iconf->hemu_onoff = (u8) hemu;
++		hapd->iconf->mu_onoff = (u8) mu;
 +	} else {
 +		wpa_printf(MSG_ERROR,
-+			"Unsupported parameter %s for SET_HEMU", config);
++			"Unsupported parameter %s for SET_MU", config);
 +		return -1;
 +	}
 +
-+	if(hostapd_drv_hemu_ctrl(hapd) == 0) {
++	if(hostapd_drv_mu_ctrl(hapd) == 0) {
 +		return os_snprintf(buf, buflen, "OK\n");
 +	} else {
 +		return -1;
@@ -84,19 +84,19 @@
 +
 +
 +static int
-+hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
++hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
 +					 size_t buflen)
 +{
-+	u8 hemu_onoff;
++	u8 mu_onoff;
 +	char *pos, *end;
 +
 +	pos = buf;
 +	end = buf + buflen;
 +
-+	if (hostapd_drv_hemu_dump(hapd, &hemu_onoff) == 0) {
-+		hapd->iconf->hemu_onoff = hemu_onoff;
++	if (hostapd_drv_mu_dump(hapd, &mu_onoff) == 0) {
++		hapd->iconf->mu_onoff = mu_onoff;
 +		return os_snprintf(pos, end - pos, "[hostapd_cli] = UL MU-MIMO: %d, DL MU-MIMO: %d, UL OFDMA: %d, DL OFDMA: %d\n",
-+			!!(hemu_onoff&BIT(3)), !!(hemu_onoff&BIT(2)), !!(hemu_onoff&BIT(1)), !!(hemu_onoff&BIT(0)));
++			!!(mu_onoff&BIT(3)), !!(mu_onoff&BIT(2)), !!(mu_onoff&BIT(1)), !!(mu_onoff&BIT(0)));
 +	} else {
 +		wpa_printf(MSG_INFO, "ctrl iface failed to call");
 +		return -1;
@@ -111,11 +111,11 @@
  	} else if (os_strncmp(buf, "GET_EDCCA ", 10) == 0) {
  		reply_len = hostapd_ctrl_iface_get_edcca(hapd, buf+10, reply,
  							  reply_size);
-+	} else if (os_strncmp(buf, "SET_HEMU ", 9) == 0) {
-+		reply_len = hostapd_ctrl_iface_set_hemu(hapd, buf+9, reply,
++	} else if (os_strncmp(buf, "SET_MU ", 7) == 0) {
++		reply_len = hostapd_ctrl_iface_set_mu(hapd, buf + 7, reply,
 +							  reply_size);
-+	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
-+		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
++	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
++		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else {
  		os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
  		reply_len = 16;
@@ -127,17 +127,17 @@
  }
  
  
-+static int hostapd_cli_cmd_set_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_set_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "SET_HEMU", 1, argc, argv);
++	return hostapd_cli_cmd(ctrl, "SET_MU", 1, argc, argv);
 +}
 +
 +
-+static int hostapd_cli_cmd_get_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "GET_HEMU", 0, NULL, NULL);
++	return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
 +}
 +
 +
@@ -148,10 +148,10 @@
  	  " = send FTM range request"},
  	{ "driver_flags", hostapd_cli_cmd_driver_flags, NULL,
  	  " = show supported driver flags"},
-+	{ "set_hemu", hostapd_cli_cmd_set_hemu, NULL,
++	{ "set_mu", hostapd_cli_cmd_set_mu, NULL,
 +		"<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
-+	{ "get_hemu", hostapd_cli_cmd_get_hemu, NULL,
-+		" = show hemu onoff value in 0-15 bitmap"},
++	{ "get_mu", hostapd_cli_cmd_get_mu, NULL,
++		" = show mu onoff value in 0-15 bitmap"},
  #ifdef CONFIG_DPP
  	{ "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
  	  "report a scanned DPP URI from a QR Code" },
@@ -163,7 +163,7 @@
  	conf->he_6ghz_max_ampdu_len_exp = 7;
  	conf->he_6ghz_rx_ant_pat = 1;
  	conf->he_6ghz_tx_ant_pat = 1;
-+	conf->hemu_onoff = 13;
++	conf->mu_onoff = 13;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* The third octet of the country string uses an ASCII space character
@@ -175,7 +175,7 @@
  	u8 he_6ghz_rx_ant_pat;
  	u8 he_6ghz_tx_ant_pat;
  	u8 he_6ghz_reg_pwr_type;
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* VHT enable/disable config from CHAN_SWITCH */
@@ -188,18 +188,18 @@
  	return hapd->driver->get_edcca(hapd->drv_priv, mode, value);
  }
 +
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd)
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_ctrl)
++	if (!hapd->driver || !hapd->driver->mu_ctrl)
 +		return 0;
-+	return hapd->driver->hemu_ctrl(hapd->drv_priv, hapd->iconf->hemu_onoff);
++	return hapd->driver->mu_ctrl(hapd->drv_priv, hapd->iconf->mu_onoff);
 +}
 +
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_dump)
++	if (!hapd->driver || !hapd->driver->mu_dump)
 +		return 0;
-+	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
++	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
 +}
 diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
 index 70a99f406..bca39c502 100644
@@ -209,8 +209,8 @@
  int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  					  const int *threshold);
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  
  #include "drivers/driver.h"
  
@@ -222,7 +222,7 @@
  	if (hostapd_drv_configure_edcca_threshold(hapd,
  						  hapd->iconf->edcca_threshold) < 0)
  		goto fail;
-+	if (hostapd_drv_hemu_ctrl(hapd) < 0)
++	if (hostapd_drv_mu_ctrl(hapd) < 0)
 +		goto fail;
  
  	wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
@@ -235,7 +235,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-+	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
++	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 +	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
  };
@@ -244,16 +244,16 @@
  		NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL - 1
  };
  
-+enum mtk_vendor_attr_hemu_ctrl {
-+	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
++enum mtk_vendor_attr_mu_ctrl {
++	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 +
-+	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_DUMP,
++	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
 +
 +	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
++	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
++	MTK_VENDOR_ATTR_MU_CTRL_MAX =
++		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 +};
 +
 +
@@ -270,9 +270,9 @@
  	size_t unsol_bcast_probe_resp_tmpl_len;
 +
 +	/**
-+	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
++	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
 +	 */
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  };
  
  struct wpa_driver_mesh_bss_params {
@@ -282,12 +282,12 @@
  	int (*get_edcca)(void *priv, const u8 mode, u8 *value);
 +
 +	/**
-+	 * hemu_ctrl - ctrl on off for UL/DL MURU
++	 * mu_ctrl - ctrl on off for UL/DL MURU
 +	 * @priv: Private driver interface data
 +	 *
 +	 */
-+	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
-+	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
++	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
++	 int (*mu_dump)(void *priv, u8 *mu_onoff);
  };
  
  /**
@@ -300,7 +300,7 @@
  
  
 +#ifdef CONFIG_IEEE80211AX
-+static int nl80211_hemu_muruonoff(void *priv, u8 hemu_onoff)
++static int nl80211_mu_onoff(void *priv, u8 mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -308,41 +308,41 @@
 +	struct nlattr *data;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL) ||
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL) ||
 +		!(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
-+		nla_put_u8(msg, MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF, hemu_onoff)) {
++		nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, mu_onoff)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
 +	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 hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to set mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +	return ret;
 +}
 +
 +
-+static int hemu_dump_handler(struct nl_msg *msg, void *arg)
++static int mu_dump_handler(struct nl_msg *msg, void *arg)
 +{
-+	u8 *hemu_onoff = (u8 *) arg;
++	u8 *mu_onoff = (u8 *) arg;
 +	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-+	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_MAX + 1];
++	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_MAX + 1];
 +	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
 +	struct nlattr *nl_vend, *attr;
 +
 +	static const struct nla_policy
-+	hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL + 1] = {
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
++	mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL + 1] = {
++		[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
++		[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
 +	};
 +
 +	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -352,22 +352,22 @@
 +	if (!nl_vend)
 +		return NL_SKIP;
 +
-+	nla_parse(tb_vendor, MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
++	nla_parse(tb_vendor, MTK_VENDOR_ATTR_MU_CTRL_MAX,
 +		  nla_data(nl_vend), nla_len(nl_vend), NULL);
 +
-+	attr = tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP];
++	attr = tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_DUMP];
 +	if (!attr) {
-+		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_HEMU_CTRL_DUMP");
++		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_MU_CTRL_DUMP");
 +		return NL_SKIP;
 +	}
 +
-+	*hemu_onoff = nla_get_u8(attr);
-+	wpa_printf(MSG_DEBUG, "nla_get hemu_onoff: %d\n", *hemu_onoff);
++	*mu_onoff = nla_get_u8(attr);
++	wpa_printf(MSG_DEBUG, "nla_get mu_onoff: %d\n", *mu_onoff);
 +
 +	return 0;
 +}
 +
-+static int nl80211_hemu_dump(void *priv, u8 *hemu_onoff)
++static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -375,15 +375,15 @@
 +	struct nlattr *attr;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL)) {
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
@@ -396,10 +396,10 @@
 +
 +	nla_nest_end(msg, attr);
 +
-+	ret = send_and_recv_msgs(drv, msg, hemu_dump_handler, hemu_onoff, NULL, NULL);
++	ret = send_and_recv_msgs(drv, msg, mu_dump_handler, mu_onoff, NULL, NULL);
 +
 +	if(ret){
-+		wpa_printf(MSG_ERROR, "Failed to get hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to get mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +
 +	return ret;
@@ -414,8 +414,8 @@
  	.update_connect_params = nl80211_update_connection_params,
  	.send_external_auth_status = nl80211_send_external_auth_status,
  	.set_4addr_mode = nl80211_set_4addr_mode,
-+	.hemu_ctrl = nl80211_hemu_muruonoff,
-+	.hemu_dump = nl80211_hemu_dump,
++	.mu_ctrl = nl80211_mu_onoff,
++	.mu_dump = nl80211_mu_dump,
  #ifdef CONFIG_DPP
  	.dpp_listen = nl80211_dpp_listen,
  #endif /* CONFIG_DPP */
@@ -427,7 +427,7 @@
  	unsigned int brcm_do_acs:1;
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
-+	unsigned int mtk_hemu_vendor_cmd_avail:1;
++	unsigned int mtk_mu_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
  	u64 remain_on_chan_cookie;
@@ -439,8 +439,8 @@
  				case MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL :
  					drv->mtk_edcca_vendor_cmd_avail = 1;
  					break;
-+				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
-+					drv->mtk_hemu_vendor_cmd_avail = 1;
++				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
++					drv->mtk_mu_vendor_cmd_avail = 1;
 +					break;
  				}
  			}
diff --git a/recipes-wifi/hostapd/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch b/recipes-wifi/hostapd/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
index 4bc3fcd..8ca8c55 100644
--- a/recipes-wifi/hostapd/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
+++ b/recipes-wifi/hostapd/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
@@ -74,9 +74,9 @@
 index 4598737a3..a1d83e4ee 100644
 --- a/src/ap/ap_drv_ops.c
 +++ b/src/ap/ap_drv_ops.c
-@@ -1053,3 +1053,14 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
+@@ -1053,3 +1053,14 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
  		return 0;
- 	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
+ 	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
  }
 +
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd)
@@ -95,8 +95,8 @@
 +++ b/src/ap/ap_drv_ops.h
 @@ -144,6 +144,7 @@ int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  
  #include "drivers/driver.h"
@@ -107,7 +107,7 @@
 +++ b/src/ap/hostapd.c
 @@ -2304,6 +2304,8 @@ dfs_offload:
  		goto fail;
- 	if (hostapd_drv_hemu_ctrl(hapd) < 0)
+ 	if (hostapd_drv_mu_ctrl(hapd) < 0)
  		goto fail;
 +	if (hostapd_drv_three_wire_ctrl(hapd) < 0)
 +		goto fail;
@@ -119,7 +119,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,6 +13,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -154,8 +154,8 @@
 +++ b/src/drivers/driver.h
 @@ -4693,6 +4693,14 @@ struct wpa_driver_ops {
  	 */
- 	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
- 	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
+ 	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
+ 	 int (*mu_dump)(void *priv, u8 *mu_onoff);
 +
 +	/**
 +	 * three_wire_ctrl - set three_wire_ctrl mode
@@ -223,7 +223,7 @@
 @@ -183,6 +183,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
 +	unsigned int mtk_3wire_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
@@ -233,8 +233,8 @@
 --- a/src/drivers/driver_nl80211_capa.c
 +++ b/src/drivers/driver_nl80211_capa.c
 @@ -1059,6 +1059,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
- 				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
- 					drv->mtk_hemu_vendor_cmd_avail = 1;
+ 				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
+ 					drv->mtk_mu_vendor_cmd_avail = 1;
  					break;
 +				case MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL :
 +					drv->mtk_3wire_vendor_cmd_avail = 1;
diff --git a/recipes-wifi/hostapd/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch b/recipes-wifi/hostapd/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
index 6bfe3d0..fc38b4f 100644
--- a/recipes-wifi/hostapd/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
+++ b/recipes-wifi/hostapd/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
@@ -38,7 +38,7 @@
 index 5f71aeea9..c881d3717 100644
 --- a/hostapd/ctrl_iface.c
 +++ b/hostapd/ctrl_iface.c
-@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
+@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
  }
  
  
@@ -71,8 +71,8 @@
  					      int reply_size,
 @@ -4055,6 +4079,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
  							  reply_size);
- 	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
 +		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
  	} else {
@@ -165,8 +165,8 @@
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
 @@ -145,6 +145,8 @@ int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -191,7 +191,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,7 +13,8 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 -	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -200,8 +200,8 @@
  };
  
  enum mtk_vendor_attr_edcca_ctrl {
-@@ -204,6 +205,38 @@ enum mtk_vendor_attr_hemu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
+@@ -204,6 +205,38 @@ enum mtk_vendor_attr_mu_ctrl {
+ 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
  };
  
 +enum mtk_vendor_attr_ibf_ctrl {
@@ -244,9 +244,9 @@
 --- a/src/drivers/driver.h
 +++ b/src/drivers/driver.h
 @@ -1628,6 +1628,11 @@ struct wpa_driver_ap_params {
- 	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
+ 	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
  	 */
- 	u8 hemu_onoff;
+ 	u8 mu_onoff;
 +
 +	/**
 +	 * ibf_enable=<val>
@@ -406,7 +406,7 @@
 +++ b/src/drivers/driver_nl80211.h
 @@ -184,6 +184,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
 +	unsigned int mtk_ibf_vendor_cmd_avail:1;
  
diff --git a/recipes-wifi/hostapd/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch b/recipes-wifi/hostapd/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
index 8a387a7..3237aa3 100644
--- a/recipes-wifi/hostapd/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
+++ b/recipes-wifi/hostapd/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
@@ -133,7 +133,7 @@
  					      char *buf, char *reply,
  					      int reply_size,
 @@ -4081,6 +4171,11 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
  		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "DFS_DETECT_MODE ", 16) == 0) {
diff --git a/recipes-wifi/hostapd/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch b/recipes-wifi/hostapd/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
index ed796c1..dba90d1 100644
--- a/recipes-wifi/hostapd/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
+++ b/recipes-wifi/hostapd/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
@@ -162,7 +162,7 @@
 index ab9aedcee..4406666fd 100644
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
-@@ -147,6 +147,8 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+@@ -147,6 +147,8 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -374,7 +374,7 @@
 --- a/src/drivers/driver_nl80211.h
 +++ b/src/drivers/driver_nl80211.h
 @@ -185,6 +185,7 @@ struct wpa_driver_nl80211_data {
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
  	unsigned int mtk_ibf_vendor_cmd_avail:1;
 +	unsigned int mtk_wireless_vendor_cmd_avail:1;
diff --git a/recipes-wifi/hostapd/files/patches/patches.inc b/recipes-wifi/hostapd/files/patches/patches.inc
index 4fcacd1..b2f59b9 100644
--- a/recipes-wifi/hostapd/files/patches/patches.inc
+++ b/recipes-wifi/hostapd/files/patches/patches.inc
@@ -67,7 +67,7 @@
     file://mtk-0003-hostapd-mtk-add-support-for-runtime-set-in-band-disc.patch \
     file://mtk-0004-hostapd-mtk-Add-mtk_vendor.h.patch \
     file://mtk-0005-hostapd-mtk-Support-EDCCA-hostapd-configuration.patch \
-    file://mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch \
+    file://mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch \
     file://mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch \
     file://mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch \
     file://mtk-0009-hostapd-mtk-Do-not-include-HE-capab-IE-if-associated.patch \
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/317-wifi-mac80211-fix-qos-on-mesh-interfaces.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/317-wifi-mac80211-fix-qos-on-mesh-interfaces.patch
new file mode 100644
index 0000000..c60a88d
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/317-wifi-mac80211-fix-qos-on-mesh-interfaces.patch
@@ -0,0 +1,35 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Wed, 15 Feb 2023 15:11:54 +0100
+Subject: [PATCH] wifi: mac80211: fix qos on mesh interfaces
+
+When ieee80211_select_queue is called for mesh, the sta pointer is usually
+NULL, since the nexthop is looked up much later in the tx path.
+Explicitly check for unicast address in that case in order to make qos work
+again.
+
+Fixes: 50e2ab392919 ("wifi: mac80211: fix queue selection for mesh/OCB interfaces")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/wme.c
++++ b/net/mac80211/wme.c
+@@ -147,6 +147,7 @@ u16 ieee80211_select_queue_80211(struct
+ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
+ 			   struct sta_info *sta, struct sk_buff *skb)
+ {
++	const struct ethhdr *eth = (void *)skb->data;
+ 	struct mac80211_qos_map *qos_map;
+ 	bool qos;
+ 
+@@ -154,8 +155,9 @@ u16 ieee80211_select_queue(struct ieee80
+ 	skb_get_hash(skb);
+ 
+ 	/* all mesh/ocb stations are required to support WME */
+-	if (sta && (sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
+-		    sdata->vif.type == NL80211_IFTYPE_OCB))
++	if ((sdata->vif.type == NL80211_IFTYPE_MESH_POINT &&
++	    !is_multicast_ether_addr(eth->h_dest)) ||
++	    (sdata->vif.type == NL80211_IFTYPE_OCB && sta))
+ 		qos = true;
+ 	else if (sta)
+ 		qos = sta->sta.wme;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch
new file mode 100644
index 0000000..05e368c
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch
@@ -0,0 +1,37 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Wed, 15 Feb 2023 15:21:37 +0100
+Subject: [PATCH] wifi: mac80211: fix race in mesh sequence number
+ assignment
+
+Since the sequence number is shared across different tx queues, it needs
+to be atomic in order to avoid accidental duplicate assignment
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -695,7 +695,7 @@ struct ieee80211_if_mesh {
+ 	struct mesh_stats mshstats;
+ 	struct mesh_config mshcfg;
+ 	atomic_t estab_plinks;
+-	u32 mesh_seqnum;
++	atomic_t mesh_seqnum;
+ 	bool accepting_plinks;
+ 	int num_gates;
+ 	struct beacon_data __rcu *beacon;
+--- a/net/mac80211/mesh.c
++++ b/net/mac80211/mesh.c
+@@ -752,10 +752,8 @@ unsigned int ieee80211_new_mesh_header(s
+ 
+ 	meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
+ 
+-	/* FIXME: racy -- TX on multiple queues can be concurrent */
+-	put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
+-	sdata->u.mesh.mesh_seqnum++;
+-
++	put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum),
++			   &meshhdr->seqnum);
+ 	if (addr4or5 && !addr6) {
+ 		meshhdr->flags |= MESH_FLAGS_AE_A4;
+ 		memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch
new file mode 100644
index 0000000..4bd3d4c
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch
@@ -0,0 +1,764 @@
+From: Sriram R <quic_srirrama@quicinc.com>
+Date: Thu, 18 Aug 2022 12:35:42 +0530
+Subject: [PATCH] wifi: mac80211: mesh fast xmit support
+
+Currently fast xmit is supported in AP, STA and other device types where
+the destination doesn't change for the lifetime of its association by
+caching the static parts of the header that can be reused directly for
+every Tx such as addresses and updates only mutable header fields such as
+PN.
+This technique is not directly applicable for a Mesh device type due
+to the dynamic nature of the topology and protocol. The header is built
+based on the destination mesh device which is proxying a certain external
+device and based on the Mesh destination the next hop changes.
+And the RA/A1 which is the next hop for reaching the destination can
+vary during runtime as per the best route based on airtime.  To accommodate
+these changes and to come up with a solution to avoid overhead during header
+generation, the headers comprising the MAC, Mesh and LLC part are cached
+whenever data for a certain external destination is sent.
+This cached header is reused every time a data is sent to that external
+destination.
+
+To ensure the changes in network are reflected in these cached headers,
+flush affected cached entries on path changes, as well as other conditions
+that currently trigger a fast xmit check in other modes (key changes etc.)
+
+In order to keep the cache small, use a short timeout for expiring cache
+entries.
+
+Co-developed-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Sriram R <quic_srirrama@quicinc.com>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -37,6 +37,7 @@
+ extern const struct cfg80211_ops mac80211_config_ops;
+ 
+ struct ieee80211_local;
++struct mhdr_cache_entry;
+ 
+ /* Maximum number of broadcast/multicast frames to buffer when some of the
+  * associated stations are using power saving. */
+@@ -655,6 +656,20 @@ struct mesh_table {
+ 	atomic_t entries;		/* Up to MAX_MESH_NEIGHBOURS */
+ };
+ 
++/**
++ * struct mesh_hdr_cache - mesh fast xmit header cache
++ *
++ * @rhead: hash table containing struct mhdr_cache_entry, using skb DA as key
++ * @walk_head: linked list containing all mhdr_cache_entry objects
++ * @walk_lock: lock protecting walk_head and rhead
++ * @enabled: indicates if header cache is initialized
++ */
++struct mesh_hdr_cache {
++	struct rhashtable rhead;
++	struct hlist_head walk_head;
++	spinlock_t walk_lock;
++};
++
+ struct ieee80211_if_mesh {
+ 	struct timer_list housekeeping_timer;
+ 	struct timer_list mesh_path_timer;
+@@ -733,6 +748,7 @@ struct ieee80211_if_mesh {
+ 	struct mesh_table mpp_paths; /* Store paths for MPP&MAP */
+ 	int mesh_paths_generation;
+ 	int mpp_paths_generation;
++	struct mesh_hdr_cache hdr_cache;
+ };
+ 
+ #ifdef CPTCFG_MAC80211_MESH
+@@ -1998,6 +2014,9 @@ int ieee80211_tx_control_port(struct wip
+ 			      int link_id, u64 *cookie);
+ int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
+ 			      const u8 *buf, size_t len);
++void __ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
++				struct mhdr_cache_entry *entry,
++				struct sk_buff *skb);
+ 
+ /* HT */
+ void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
+--- a/net/mac80211/mesh.c
++++ b/net/mac80211/mesh.c
+@@ -780,6 +780,8 @@ static void ieee80211_mesh_housekeeping(
+ 	changed = mesh_accept_plinks_update(sdata);
+ 	ieee80211_mbss_info_change_notify(sdata, changed);
+ 
++	mesh_hdr_cache_gc(sdata);
++
+ 	mod_timer(&ifmsh->housekeeping_timer,
+ 		  round_jiffies(jiffies +
+ 				IEEE80211_MESH_HOUSEKEEPING_INTERVAL));
+--- a/net/mac80211/mesh.h
++++ b/net/mac80211/mesh.h
+@@ -122,11 +122,49 @@ struct mesh_path {
+ 	u8 rann_snd_addr[ETH_ALEN];
+ 	u32 rann_metric;
+ 	unsigned long last_preq_to_root;
++	unsigned long fast_xmit_check;
+ 	bool is_root;
+ 	bool is_gate;
+ 	u32 path_change_count;
+ };
+ 
++#define MESH_HEADER_CACHE_MAX_SIZE		512
++#define MESH_HEADER_CACHE_THRESHOLD_SIZE	384
++#define MESH_HEADER_CACHE_TIMEOUT		8000 /* msecs */
++#define MESH_HEADER_MAX_LEN			68   /* mac+mesh+rfc1042 hdr */
++
++/**
++ * struct mhdr_cache_entry - Cached Mesh header entry
++ * @addr_key: The Ethernet DA which is the key for this entry
++ * @hdr: The cached header
++ * @machdr_len: Total length of the mac header
++ * @hdrlen: Length of this header entry
++ * @key: Key corresponding to the nexthop stored in the header
++ * @pn_offs: Offset to PN which is updated for every xmit
++ * @band:  band used for tx
++ * @walk_list: list containing all the cached header entries
++ * @rhash: rhashtable pointer
++ * @mpath: The Mesh path corresponding to the Mesh DA
++ * @mppath: The MPP entry corresponding to this DA
++ * @timestamp: Last used time of this entry
++ * @rcu: rcu to free this entry
++ * @path_change_count: Stored path change value corresponding to the mpath
++ */
++struct mhdr_cache_entry {
++	u8 addr_key[ETH_ALEN] __aligned(2);
++	u8 hdr[MESH_HEADER_MAX_LEN];
++	u16 machdr_len;
++	u16 hdrlen;
++	u8 pn_offs;
++	u8 band;
++	struct ieee80211_key __rcu *key;
++	struct hlist_node walk_list;
++	struct rhash_head rhash;
++	struct mesh_path *mpath, *mppath;
++	unsigned long timestamp;
++	struct rcu_head rcu;
++};
++
+ /* Recent multicast cache */
+ /* RMC_BUCKETS must be a power of 2, maximum 256 */
+ #define RMC_BUCKETS		256
+@@ -298,6 +336,15 @@ void mesh_path_discard_frame(struct ieee
+ void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata);
+ 
+ bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt);
++struct mhdr_cache_entry *
++mesh_get_cached_hdr(struct ieee80211_sub_if_data *sdata, const u8 *addr);
++void mesh_cache_hdr(struct ieee80211_sub_if_data *sdata,
++		    struct sk_buff *skb, struct mesh_path *mpath);
++void mesh_hdr_cache_gc(struct ieee80211_sub_if_data *sdata);
++void mesh_hdr_cache_flush(struct ieee80211_sub_if_data *sdata, const u8 *addr,
++			  bool is_mpp);
++void mesh_refresh_path(struct ieee80211_sub_if_data *sdata,
++		       struct mesh_path *mpath, const u8 *addr);
+ 
+ #ifdef CPTCFG_MAC80211_MESH
+ static inline
+--- a/net/mac80211/mesh_hwmp.c
++++ b/net/mac80211/mesh_hwmp.c
+@@ -491,8 +491,11 @@ static u32 hwmp_route_info_get(struct ie
+ 		}
+ 
+ 		if (fresh_info) {
+-			if (rcu_access_pointer(mpath->next_hop) != sta)
++			if (rcu_access_pointer(mpath->next_hop) != sta) {
+ 				mpath->path_change_count++;
++				mesh_hdr_cache_flush(mpath->sdata, mpath->dst,
++						     false);
++			}
+ 			mesh_path_assign_nexthop(mpath, sta);
+ 			mpath->flags |= MESH_PATH_SN_VALID;
+ 			mpath->metric = new_metric;
+@@ -539,8 +542,11 @@ static u32 hwmp_route_info_get(struct ie
+ 		}
+ 
+ 		if (fresh_info) {
+-			if (rcu_access_pointer(mpath->next_hop) != sta)
++			if (rcu_access_pointer(mpath->next_hop) != sta) {
+ 				mpath->path_change_count++;
++				mesh_hdr_cache_flush(mpath->sdata, mpath->dst,
++						     false);
++			}
+ 			mesh_path_assign_nexthop(mpath, sta);
+ 			mpath->metric = last_hop_metric;
+ 			mpath->exp_time = time_after(mpath->exp_time, exp_time)
+@@ -977,7 +983,7 @@ free:
+  * Locking: the function must be called from within a rcu read lock block.
+  *
+  */
+-static void mesh_queue_preq(struct mesh_path *mpath, u8 flags)
++void mesh_queue_preq(struct mesh_path *mpath, u8 flags)
+ {
+ 	struct ieee80211_sub_if_data *sdata = mpath->sdata;
+ 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
+@@ -1215,6 +1221,20 @@ static int mesh_nexthop_lookup_nolearn(s
+ 	return 0;
+ }
+ 
++void mesh_refresh_path(struct ieee80211_sub_if_data *sdata,
++		       struct mesh_path *mpath, const u8 *addr)
++{
++	if (mpath->flags & (MESH_PATH_REQ_QUEUED | MESH_PATH_FIXED |
++			    MESH_PATH_RESOLVING))
++		return;
++
++	if (time_after(jiffies,
++		       mpath->exp_time -
++		       msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
++	    (!addr || ether_addr_equal(sdata->vif.addr, addr)))
++		mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
++}
++
+ /**
+  * mesh_nexthop_lookup - put the appropriate next hop on a mesh frame. Calling
+  * this function is considered "using" the associated mpath, so preempt a path
+@@ -1242,19 +1262,18 @@ int mesh_nexthop_lookup(struct ieee80211
+ 	if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE))
+ 		return -ENOENT;
+ 
+-	if (time_after(jiffies,
+-		       mpath->exp_time -
+-		       msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
+-	    ether_addr_equal(sdata->vif.addr, hdr->addr4) &&
+-	    !(mpath->flags & MESH_PATH_RESOLVING) &&
+-	    !(mpath->flags & MESH_PATH_FIXED))
+-		mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
++	mesh_refresh_path(sdata, mpath, hdr->addr4);
+ 
+ 	next_hop = rcu_dereference(mpath->next_hop);
+ 	if (next_hop) {
+ 		memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN);
+ 		memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
+ 		ieee80211_mps_set_frame_flags(sdata, next_hop, hdr);
++		/* Cache the whole header so as to use next time rather than resolving
++		 * and building it every time
++		 */
++		if (ieee80211_hw_check(&sdata->local->hw, SUPPORT_FAST_XMIT))
++			mesh_cache_hdr(sdata, skb, mpath);
+ 		return 0;
+ 	}
+ 
+--- a/net/mac80211/mesh_pathtbl.c
++++ b/net/mac80211/mesh_pathtbl.c
+@@ -14,6 +14,7 @@
+ #include "wme.h"
+ #include "ieee80211_i.h"
+ #include "mesh.h"
++#include <linux/rhashtable.h>
+ 
+ static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
+ 
+@@ -32,6 +33,41 @@ static const struct rhashtable_params me
+ 	.hashfn = mesh_table_hash,
+ };
+ 
++static const struct rhashtable_params mesh_hdr_rht_params = {
++	.nelem_hint = 10,
++	.automatic_shrinking = true,
++	.key_len =  ETH_ALEN,
++	.key_offset = offsetof(struct mhdr_cache_entry, addr_key),
++	.head_offset = offsetof(struct mhdr_cache_entry, rhash),
++	.hashfn = mesh_table_hash,
++};
++
++static void __mesh_hdr_cache_entry_free(void *ptr, void *tblptr)
++{
++	struct mhdr_cache_entry *mhdr = ptr;
++
++	kfree_rcu(mhdr, rcu);
++}
++
++static void mesh_hdr_cache_deinit(struct ieee80211_sub_if_data *sdata)
++{
++	struct mesh_hdr_cache *cache;
++
++	cache = &sdata->u.mesh.hdr_cache;
++	rhashtable_free_and_destroy(&cache->rhead,
++				    __mesh_hdr_cache_entry_free, NULL);
++}
++
++static void mesh_hdr_cache_init(struct ieee80211_sub_if_data *sdata)
++{
++	struct mesh_hdr_cache *cache;
++
++	cache = &sdata->u.mesh.hdr_cache;
++	rhashtable_init(&cache->rhead, &mesh_hdr_rht_params);
++	INIT_HLIST_HEAD(&cache->walk_head);
++	spin_lock_init(&cache->walk_lock);
++}
++
+ static inline bool mpath_expired(struct mesh_path *mpath)
+ {
+ 	return (mpath->flags & MESH_PATH_ACTIVE) &&
+@@ -381,6 +417,211 @@ struct mesh_path *mesh_path_new(struct i
+ 	return new_mpath;
+ }
+ 
++struct mhdr_cache_entry *
++mesh_get_cached_hdr(struct ieee80211_sub_if_data *sdata, const u8 *addr)
++{
++	struct mesh_path *mpath, *mppath;
++	struct mhdr_cache_entry *entry;
++	struct mesh_hdr_cache *cache;
++
++	cache = &sdata->u.mesh.hdr_cache;
++	entry = rhashtable_lookup(&cache->rhead, addr, mesh_hdr_rht_params);
++	if (!entry)
++		return NULL;
++
++	mpath = rcu_dereference(entry->mpath);
++	mppath = rcu_dereference(entry->mppath);
++	if (!(mpath->flags & MESH_PATH_ACTIVE) || mpath_expired(mpath))
++		return NULL;
++
++	mesh_refresh_path(sdata, mpath, NULL);
++	if (mppath)
++		mppath->exp_time = jiffies;
++	entry->timestamp = jiffies;
++
++	return entry;
++}
++
++void mesh_cache_hdr(struct ieee80211_sub_if_data *sdata,
++		    struct sk_buff *skb, struct mesh_path *mpath)
++{
++	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++	struct mesh_hdr_cache *cache;
++	struct mhdr_cache_entry *mhdr, *old_mhdr;
++	struct ieee80211s_hdr *meshhdr;
++	struct sta_info *next_hop;
++	struct ieee80211_key *key;
++	struct mesh_path *mppath;
++	u16 meshhdr_len;
++	u8 pn_offs = 0;
++	int hdrlen;
++
++	if (sdata->noack_map)
++		return;
++
++	if (!ieee80211_is_data_qos(hdr->frame_control))
++		return;
++
++	hdrlen = ieee80211_hdrlen(hdr->frame_control);
++	meshhdr = (struct ieee80211s_hdr *)(skb->data + hdrlen);
++	meshhdr_len = ieee80211_get_mesh_hdrlen(meshhdr);
++
++	cache = &sdata->u.mesh.hdr_cache;
++	if (atomic_read(&cache->rhead.nelems) >= MESH_HEADER_CACHE_MAX_SIZE)
++		return;
++
++	next_hop = rcu_dereference(mpath->next_hop);
++	if (!next_hop)
++		return;
++
++	if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) {
++		/* This is required to keep the mppath alive */
++		mppath = mpp_path_lookup(sdata, meshhdr->eaddr1);
++		if (!mppath)
++			return;
++	} else if (ieee80211_has_a4(hdr->frame_control)) {
++		mppath = mpath;
++	} else {
++		return;
++	}
++
++	/* rate limit, in case fast xmit can't be enabled */
++	if (mppath->fast_xmit_check == jiffies)
++		return;
++
++	mppath->fast_xmit_check = jiffies;
++
++	key = rcu_access_pointer(next_hop->ptk[next_hop->ptk_idx]);
++	if (!key)
++		key = rcu_access_pointer(sdata->default_unicast_key);
++
++	if (key) {
++		bool gen_iv, iv_spc;
++
++		gen_iv = key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV;
++		iv_spc = key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE;
++
++		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) ||
++		    (key->flags & KEY_FLAG_TAINTED))
++			return;
++
++		switch (key->conf.cipher) {
++		case WLAN_CIPHER_SUITE_CCMP:
++		case WLAN_CIPHER_SUITE_CCMP_256:
++			if (gen_iv)
++				pn_offs = hdrlen;
++			if (gen_iv || iv_spc)
++				hdrlen += IEEE80211_CCMP_HDR_LEN;
++			break;
++		case WLAN_CIPHER_SUITE_GCMP:
++		case WLAN_CIPHER_SUITE_GCMP_256:
++			if (gen_iv)
++				pn_offs = hdrlen;
++			if (gen_iv || iv_spc)
++				hdrlen += IEEE80211_GCMP_HDR_LEN;
++			break;
++		default:
++			return;
++		}
++	}
++
++	if (WARN_ON_ONCE(hdrlen + meshhdr_len + sizeof(rfc1042_header) >
++			 MESH_HEADER_MAX_LEN))
++		return;
++
++	mhdr = kzalloc(sizeof(*mhdr), GFP_ATOMIC);
++	if (!mhdr)
++		return;
++
++	memcpy(mhdr->addr_key, mppath->dst, ETH_ALEN);
++	mhdr->machdr_len = hdrlen;
++	mhdr->hdrlen = mhdr->machdr_len + meshhdr_len + sizeof(rfc1042_header);
++	rcu_assign_pointer(mhdr->mpath, mpath);
++	if (meshhdr->flags & MESH_FLAGS_AE)
++		rcu_assign_pointer(mhdr->mppath, mppath);
++	rcu_assign_pointer(mhdr->key, key);
++	mhdr->timestamp = jiffies;
++	mhdr->band = info->band;
++	mhdr->pn_offs = pn_offs;
++
++	if (pn_offs) {
++		memcpy(mhdr->hdr, skb->data, pn_offs);
++		memcpy(mhdr->hdr + mhdr->machdr_len, skb->data + pn_offs,
++		       mhdr->hdrlen - mhdr->machdr_len);
++	} else {
++		memcpy(mhdr->hdr, skb->data, mhdr->hdrlen);
++	}
++
++	if (key) {
++		hdr = (struct ieee80211_hdr *)mhdr->hdr;
++		hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
++	}
++
++	spin_lock_bh(&cache->walk_lock);
++	old_mhdr = rhashtable_lookup_get_insert_fast(&cache->rhead,
++						     &mhdr->rhash,
++						     mesh_hdr_rht_params);
++	if (likely(!old_mhdr))
++		hlist_add_head(&mhdr->walk_list, &cache->walk_head);
++	else
++		kfree(mhdr);
++	spin_unlock_bh(&cache->walk_lock);
++}
++
++static void mesh_hdr_cache_entry_free(struct mesh_hdr_cache *cache,
++				      struct mhdr_cache_entry *entry)
++{
++	hlist_del_rcu(&entry->walk_list);
++	rhashtable_remove_fast(&cache->rhead, &entry->rhash, mesh_hdr_rht_params);
++	kfree_rcu(entry, rcu);
++}
++
++void mesh_hdr_cache_gc(struct ieee80211_sub_if_data *sdata)
++{
++	unsigned long timeout = msecs_to_jiffies(MESH_HEADER_CACHE_TIMEOUT);
++	struct mesh_hdr_cache *cache;
++	struct mhdr_cache_entry *entry;
++	struct hlist_node *n;
++
++	cache = &sdata->u.mesh.hdr_cache;
++	if (atomic_read(&cache->rhead.nelems) < MESH_HEADER_CACHE_THRESHOLD_SIZE)
++		return;
++
++	spin_lock_bh(&cache->walk_lock);
++	hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list)
++		if (!time_is_after_jiffies(entry->timestamp + timeout))
++			mesh_hdr_cache_entry_free(cache, entry);
++	spin_unlock_bh(&cache->walk_lock);
++}
++
++void mesh_hdr_cache_flush(struct ieee80211_sub_if_data *sdata, const u8 *addr,
++			  bool is_mpp)
++{
++	struct mesh_hdr_cache *cache = &sdata->u.mesh.hdr_cache;
++	struct mhdr_cache_entry *entry;
++	struct hlist_node *n;
++
++	cache = &sdata->u.mesh.hdr_cache;
++	spin_lock_bh(&cache->walk_lock);
++
++	/* Only one header per mpp address is expected in the header cache */
++	if (is_mpp) {
++		entry = rhashtable_lookup(&cache->rhead, addr,
++					  mesh_hdr_rht_params);
++		if (entry)
++			mesh_hdr_cache_entry_free(cache, entry);
++		goto out;
++	}
++
++	hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list)
++		if (ether_addr_equal(entry->mpath->dst, addr))
++			mesh_hdr_cache_entry_free(cache, entry);
++
++out:
++	spin_unlock_bh(&cache->walk_lock);
++}
++
+ /**
+  * mesh_path_add - allocate and add a new path to the mesh path table
+  * @dst: destination address of the path (ETH_ALEN length)
+@@ -521,6 +762,8 @@ static void mesh_path_free_rcu(struct me
+ 
+ static void __mesh_path_del(struct mesh_table *tbl, struct mesh_path *mpath)
+ {
++	mesh_hdr_cache_flush(mpath->sdata, mpath->dst,
++			     tbl == &mpath->sdata->u.mesh.mpp_paths);
+ 	hlist_del_rcu(&mpath->walk_list);
+ 	rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params);
+ 	mesh_path_free_rcu(tbl, mpath);
+@@ -747,6 +990,7 @@ void mesh_path_fix_nexthop(struct mesh_p
+ 	mpath->exp_time = 0;
+ 	mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID;
+ 	mesh_path_activate(mpath);
++	mesh_hdr_cache_flush(mpath->sdata, mpath->dst, false);
+ 	spin_unlock_bh(&mpath->state_lock);
+ 	ewma_mesh_fail_avg_init(&next_hop->mesh->fail_avg);
+ 	/* init it at a low value - 0 start is tricky */
+@@ -758,6 +1002,7 @@ void mesh_pathtbl_init(struct ieee80211_
+ {
+ 	mesh_table_init(&sdata->u.mesh.mesh_paths);
+ 	mesh_table_init(&sdata->u.mesh.mpp_paths);
++	mesh_hdr_cache_init(sdata);
+ }
+ 
+ static
+@@ -785,6 +1030,7 @@ void mesh_path_expire(struct ieee80211_s
+ 
+ void mesh_pathtbl_unregister(struct ieee80211_sub_if_data *sdata)
+ {
++	mesh_hdr_cache_deinit(sdata);
+ 	mesh_table_free(&sdata->u.mesh.mesh_paths);
+ 	mesh_table_free(&sdata->u.mesh.mpp_paths);
+ }
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2791,6 +2791,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 	if (mesh_hdr->flags & MESH_FLAGS_AE) {
+ 		struct mesh_path *mppath;
+ 		char *proxied_addr;
++		bool update = false;
+ 
+ 		if (multicast)
+ 			proxied_addr = mesh_hdr->eaddr1;
+@@ -2806,11 +2807,18 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 			mpp_path_add(sdata, proxied_addr, eth->h_source);
+ 		} else {
+ 			spin_lock_bh(&mppath->state_lock);
+-			if (!ether_addr_equal(mppath->mpp, eth->h_source))
++			if (!ether_addr_equal(mppath->mpp, eth->h_source)) {
+ 				memcpy(mppath->mpp, eth->h_source, ETH_ALEN);
++				update = true;
++			}
+ 			mppath->exp_time = jiffies;
+ 			spin_unlock_bh(&mppath->state_lock);
+ 		}
++
++		/* flush fast xmit cache if the address path changed */
++		if (update)
++			mesh_hdr_cache_flush(sdata, proxied_addr, true);
++
+ 		rcu_read_unlock();
+ 	}
+ 
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -3021,6 +3021,9 @@ void ieee80211_check_fast_xmit(struct st
+ 	if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT))
+ 		return;
+ 
++	if (ieee80211_vif_is_mesh(&sdata->vif))
++		mesh_hdr_cache_flush(sdata, sta->addr, false);
++
+ 	/* Locking here protects both the pointer itself, and against concurrent
+ 	 * invocations winning data access races to, e.g., the key pointer that
+ 	 * is used.
+@@ -3723,6 +3726,155 @@ free:
+ 	kfree_skb(skb);
+ }
+ 
++void __ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
++				struct mhdr_cache_entry *entry,
++				struct sk_buff *skb)
++{
++	struct ieee80211_local *local = sdata->local;
++	struct ieee80211_tx_data tx = {};
++	struct ieee80211_tx_info *info;
++	struct ieee80211_key *key;
++	struct ieee80211_hdr *hdr;
++	struct mesh_path *mpath;
++	ieee80211_tx_result r;
++	struct sta_info *sta;
++	u8 tid;
++
++	if (!IS_ENABLED(CPTCFG_MAC80211_MESH))
++		return;
++
++	info = IEEE80211_SKB_CB(skb);
++	memset(info, 0, sizeof(*info));
++	info->band = entry->band;
++	info->control.vif = &sdata->vif;
++	info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT |
++		      IEEE80211_TX_CTL_DONTFRAG;
++
++	info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT;
++
++#ifdef CONFIG_MAC80211_DEBUGFS
++	if (local->force_tx_status)
++		info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
++#endif
++
++	mpath = entry->mpath;
++	key = entry->key;
++	sta = rcu_dereference(mpath->next_hop);
++
++	__skb_queue_head_init(&tx.skbs);
++
++	tx.flags = IEEE80211_TX_UNICAST;
++	tx.local = local;
++	tx.sdata = sdata;
++	tx.sta = sta;
++	tx.key = key;
++	tx.skb = skb;
++
++	hdr = (struct ieee80211_hdr *)skb->data;
++	tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
++	*ieee80211_get_qos_ctl(hdr) = tid;
++
++	ieee80211_aggr_check(sdata, sta, skb);
++
++	if (ieee80211_queue_skb(local, sdata, sta, skb))
++		return;
++
++	r = ieee80211_xmit_fast_finish(sdata, sta, entry->pn_offs, key, &tx);
++	if (r == TX_DROP) {
++		kfree_skb(skb);
++		return;
++	}
++
++	__skb_queue_tail(&tx.skbs, skb);
++	ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false);
++}
++
++
++static bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
++				     struct sk_buff *skb, u32 ctrl_flags)
++{
++	struct ieee80211_local *local = sdata->local;
++	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
++	struct mhdr_cache_entry *entry;
++	struct ieee80211s_hdr *meshhdr;
++	u8 sa[ETH_ALEN] __aligned(2);
++	struct sta_info *sta;
++	bool copy_sa = false;
++	u16 ethertype;
++
++	if (ctrl_flags & IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP)
++		return false;
++
++	if (ifmsh->mshcfg.dot11MeshNolearn)
++		return false;
++
++	if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT))
++		return false;
++
++	/* Add support for these cases later */
++	if (ifmsh->ps_peers_light_sleep || ifmsh->ps_peers_deep_sleep)
++		return false;
++
++	if (is_multicast_ether_addr(skb->data))
++		return false;
++
++	ethertype = (skb->data[12] << 8) | skb->data[13];
++	if (ethertype < ETH_P_802_3_MIN)
++		return false;
++
++	if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
++		return false;
++
++	if (skb->ip_summed == CHECKSUM_PARTIAL) {
++		skb_set_transport_header(skb, skb_checksum_start_offset(skb));
++		if (skb_checksum_help(skb))
++			return false;
++	}
++
++	entry = mesh_get_cached_hdr(sdata, skb->data);
++	if (!entry)
++		return false;
++
++	/* Avoid extra work in this path */
++	if (skb_headroom(skb) < (entry->hdrlen - ETH_HLEN + 2))
++		return false;
++
++	/* If the skb is shared we need to obtain our own copy */
++	if (skb_shared(skb)) {
++		struct sk_buff *oskb = skb;
++
++		skb = skb_clone(skb, GFP_ATOMIC);
++		if (!skb)
++			return false;
++
++		kfree_skb(oskb);
++	}
++
++	sta = rcu_dereference(entry->mpath->next_hop);
++	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
++
++	meshhdr = (struct ieee80211s_hdr *)(entry->hdr + entry->machdr_len);
++	if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) {
++		/* preserve SA from eth header for 6-addr frames */
++		ether_addr_copy(sa, skb->data + ETH_ALEN);
++		copy_sa = true;
++	}
++
++	memcpy(skb_push(skb, entry->hdrlen - 2 * ETH_ALEN), entry->hdr,
++	       entry->hdrlen);
++
++	meshhdr = (struct ieee80211s_hdr *)(skb->data + entry->machdr_len);
++	put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum),
++			   &meshhdr->seqnum);
++	meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
++	if (copy_sa)
++	    ether_addr_copy(meshhdr->eaddr2, sa);
++
++	__ieee80211_mesh_xmit_fast(sdata, entry, skb);
++
++	return true;
++}
++
+ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
+ 				struct sta_info *sta,
+ 				struct ieee80211_fast_tx *fast_tx,
+@@ -4244,8 +4396,14 @@ void __ieee80211_subif_start_xmit(struct
+ 		return;
+ 	}
+ 
++	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
++
+ 	rcu_read_lock();
+ 
++	if (ieee80211_vif_is_mesh(&sdata->vif) &&
++	    ieee80211_mesh_xmit_fast(sdata, skb, ctrl_flags))
++		goto out;
++
+ 	if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
+ 		goto out_free;
+ 
+@@ -4255,8 +4413,6 @@ void __ieee80211_subif_start_xmit(struct
+ 	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
+ 	ieee80211_aggr_check(sdata, sta, skb);
+ 
+-	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
+-
+ 	if (sta) {
+ 		struct ieee80211_fast_tx *fast_tx;
+ 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch
new file mode 100644
index 0000000..e0d4e60
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch
@@ -0,0 +1,70 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 16 Feb 2023 11:07:30 +0100
+Subject: [PATCH] wifi: mac80211: use mesh header cache to speed up mesh
+ forwarding
+
+Use it to look up the next hop address + sta pointer + key and call
+__ieee80211_mesh_xmit_fast to queue the tx frame.
+
+Significantly reduces mesh forwarding path CPU usage and enables the
+use of iTXQ.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2731,6 +2731,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 	struct ieee80211_hdr hdr = {
+ 		.frame_control = cpu_to_le16(fc)
+ 	};
++	struct mhdr_cache_entry *entry = NULL;
+ 	struct ieee80211_hdr *fwd_hdr;
+ 	struct ieee80211s_hdr *mesh_hdr;
+ 	struct ieee80211_tx_info *info;
+@@ -2788,7 +2789,12 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 		return RX_DROP_MONITOR;
+ 	}
+ 
+-	if (mesh_hdr->flags & MESH_FLAGS_AE) {
++	if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
++		entry = mesh_get_cached_hdr(sdata, mesh_hdr->eaddr1);
++	else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
++		entry = mesh_get_cached_hdr(sdata, eth->h_dest);
++
++	if (!entry && (mesh_hdr->flags & MESH_FLAGS_AE)) {
+ 		struct mesh_path *mppath;
+ 		char *proxied_addr;
+ 		bool update = false;
+@@ -2862,11 +2868,23 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 	info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+ 	info->control.vif = &sdata->vif;
+ 	info->control.jiffies = jiffies;
++	fwd_skb->dev = sdata->dev;
+ 	if (multicast) {
+ 		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
+ 		memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
+ 		/* update power mode indication when forwarding */
+ 		ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr);
++	} else if (entry) {
++		struct ieee80211_hdr *ehdr = (struct ieee80211_hdr *)entry->hdr;
++
++		ether_addr_copy(fwd_hdr->addr1, ehdr->addr1);
++		ether_addr_copy(fwd_hdr->addr2, sdata->vif.addr);
++		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
++		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
++		qos[0] = fwd_skb->priority;
++		qos[1] = ieee80211_get_qos_ctl(ehdr)[1];
++		__ieee80211_mesh_xmit_fast(sdata, entry, fwd_skb);
++		return RX_QUEUED;
+ 	} else if (!mesh_nexthop_lookup(sdata, fwd_skb)) {
+ 		/* mesh power mode flags updated in mesh_nexthop_lookup */
+ 		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
+@@ -2883,7 +2901,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 	}
+ 
+ 	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
+-	fwd_skb->dev = sdata->dev;
+ 	ieee80211_add_pending_skb(local, fwd_skb);
+ 
+ rx_accept:
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch
new file mode 100644
index 0000000..d9af8c7
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch
@@ -0,0 +1,32 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Mon, 20 Feb 2023 12:50:50 +0100
+Subject: [PATCH] mac80211: fix mesh forwarding
+
+Linearize packets (needed for forwarding A-MSDU subframes).
+Fix network header offset to fix flow dissector (and fair queueing).
+
+Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2847,6 +2847,9 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 
+ 		if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr)))
+ 			return RX_DROP_UNUSABLE;
++
++		if (skb_linearize(fwd_skb))
++			return RX_DROP_UNUSABLE;
+ 	}
+ 
+ 	fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr));
+@@ -2861,7 +2864,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ 		hdrlen += ETH_ALEN;
+ 	else
+ 		fwd_skb->protocol = htons(fwd_skb->len - hdrlen);
+-	skb_set_network_header(fwd_skb, hdrlen);
++	skb_set_network_header(fwd_skb, hdrlen + 2);
+ 
+ 	info = IEEE80211_SKB_CB(fwd_skb);
+ 	memset(info, 0, sizeof(*info));
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/500-mac80211_configure_antenna_gain.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/500-mac80211_configure_antenna_gain.patch
index 70d4e89..817be9e 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/500-mac80211_configure_antenna_gain.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/500-mac80211_configure_antenna_gain.patch
@@ -87,7 +87,7 @@
  	CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1520,6 +1520,7 @@ struct ieee80211_local {
+@@ -1536,6 +1536,7 @@ struct ieee80211_local {
  	int dynamic_ps_forced_timeout;
  
  	int user_power_level; /* in dBm, for all interfaces */
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
index 884ffa2..45bcf93 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
@@ -21,6 +21,11 @@
     file://314-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch \
     file://315-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch \
     file://316-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch \
+    file://317-wifi-mac80211-fix-qos-on-mesh-interfaces.patch \
+    file://318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch \
+    file://319-wifi-mac80211-mesh-fast-xmit-support.patch \
+    file://320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch \
+    file://321-mac80211-fix-mesh-forwarding.patch \
     file://400-allow-ibss-mixed.patch \
     file://500-mac80211_configure_antenna_gain.patch \
     file://782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch \
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/900-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/900-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/901-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0002-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/901-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0002-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/902-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/902-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/903-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0004-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/903-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0004-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/904-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0005-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/904-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0005-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/905-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0006-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/905-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0006-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/906-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0007-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/906-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0007-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/907-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0008-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/907-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0008-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/908-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0009-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/908-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0009-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/909-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0010-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/909-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0010-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/910-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0011-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/910-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0011-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/911-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0012-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/911-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0012-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/912-mac80211-mtk-check-the-control-channel-before-downgr.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0013-mac80211-mtk-check-the-control-channel-before-downgr.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/912-mac80211-mtk-check-the-control-channel-before-downgr.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0013-mac80211-mtk-check-the-control-channel-before-downgr.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/913-mac80211-mtk-fix-tx-amsdu-aggregation.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0014-mac80211-mtk-fix-tx-amsdu-aggregation.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/913-mac80211-mtk-fix-tx-amsdu-aggregation.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-0014-mac80211-mtk-fix-tx-amsdu-aggregation.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/99900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/99900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/99901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/99901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/99902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch b/recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch
old mode 100755
new mode 100644
similarity index 100%
rename from recipes-wifi/linux-mac80211/files/patches/subsys/99902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch
rename to recipes-wifi/linux-mac80211/files/patches/subsys/mtk-9902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch
diff --git a/recipes-wifi/linux-mac80211/files/patches/subsys/subsys.inc b/recipes-wifi/linux-mac80211/files/patches/subsys/subsys.inc
index 0d24888..86e3ccb 100644
--- a/recipes-wifi/linux-mac80211/files/patches/subsys/subsys.inc
+++ b/recipes-wifi/linux-mac80211/files/patches/subsys/subsys.inc
@@ -49,21 +49,21 @@
     file://782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch \
     file://783-sync-nl80211.patch \
     file://800-mac80211-mask-nested-A-MSDU-support-for-mesh.patch \
-    file://900-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch \
-    file://901-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch \
-    file://902-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch \
-    file://903-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch \
-    file://904-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch \
-    file://905-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch \
-    file://906-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch \
-    file://907-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch \
-    file://908-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch \
-    file://909-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch \
-    file://910-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch \
-    file://911-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch \
-    file://912-mac80211-mtk-check-the-control-channel-before-downgr.patch \
-    file://913-mac80211-mtk-fix-tx-amsdu-aggregation.patch \
-    file://99900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch \
-    file://99901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch \
-    file://99902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch \
+    file://mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch \
+    file://mtk-0002-nl80211-mtk-extend-CAC-time-for-weather-radar-channe.patch \
+    file://mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch \
+    file://mtk-0004-mac80211-mtk-correct-legacy-rates-check-in-ieee80211.patch \
+    file://mtk-0005-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch \
+    file://mtk-0006-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch \
+    file://mtk-0007-mac80211-mtk-add-s1g-category-to-_ieee80211_is_robus.patch \
+    file://mtk-0008-mac80211-mtk-make-4addr-null-frames-using-min_rate-f.patch \
+    file://mtk-0009-mac80211-mtk-remove-timerout-handle-for-ax210-iot-is.patch \
+    file://mtk-0010-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch \
+    file://mtk-0011-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch \
+    file://mtk-0012-mac80211-mtk-fix-the-issue-of-AP-and-STA-starting-on.patch \
+    file://mtk-0013-mac80211-mtk-check-the-control-channel-before-downgr.patch \
+    file://mtk-0014-mac80211-mtk-fix-tx-amsdu-aggregation.patch \
+    file://mtk-9900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch \
+    file://mtk-9901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch \
+    file://mtk-9902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch \
     "
diff --git a/recipes-wifi/linux-mac80211/linux-mac80211_5.15.%.bb b/recipes-wifi/linux-mac80211/linux-mac80211_5.15.%.bb
index 240193c..918cc00 100644
--- a/recipes-wifi/linux-mac80211/linux-mac80211_5.15.%.bb
+++ b/recipes-wifi/linux-mac80211/linux-mac80211_5.15.%.bb
@@ -24,9 +24,9 @@
 require files/patches/build/build.inc
 require files/patches/subsys/subsys.inc
 
-SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://99900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch', d)}"
-SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://99901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch', d)}"
-SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://99902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch', d)}"
+SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://mtk-9900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch', d)}"
+SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://mtk-9901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch', d)}"
+SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://mtk-9902-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch', d)}"
 
 S = "${WORKDIR}/backports-${PV}-1"
 
diff --git a/recipes-wifi/linux-mac80211/linux-mac80211_6.%.bb b/recipes-wifi/linux-mac80211/linux-mac80211_6.%.bb
index 895269c..42dbcb1 100644
--- a/recipes-wifi/linux-mac80211/linux-mac80211_6.%.bb
+++ b/recipes-wifi/linux-mac80211/linux-mac80211_6.%.bb
@@ -24,8 +24,8 @@
 require files/patches-6.x/build/build.inc
 require files/patches-6.x/subsys/subsys.inc
 
-SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://99900-mac80211-mtk-mask-kernel-version-limitation-and-fil.patch', d)}"
-SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://99901-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-i.patch', d)}"
+SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://mtk-0014-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-id.patch', d)}"
+SRC_URI_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'flow_offload', '', 'file://mtk-0015-mac80211-mtk-register-.ndo_setup_tc-to-support-wifi2.patch', d)}"
 
 S = "${WORKDIR}/backports-${PV}"
 
diff --git a/recipes-wifi/linux-mt76/files/patches/1007-mt76-mt7915-add-mt76-vendor-muru-onoff-command.patch b/recipes-wifi/linux-mt76/files/patches/1007-mt76-mt7915-add-mt76-vendor-muru-onoff-command.patch
index 92f3f59..050a40b 100644
--- a/recipes-wifi/linux-mt76/files/patches/1007-mt76-mt7915-add-mt76-vendor-muru-onoff-command.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1007-mt76-mt7915-add-mt76-vendor-muru-onoff-command.patch
@@ -18,7 +18,7 @@
  		if (val == 0)
  			phy->muru_onoff = MUMIMO_DL_CERT | MUMIMO_DL;
  		break;
-+	case RATE_PARAM_AUTO_HEMU:
++	case RATE_PARAM_AUTO_MU:
 +		if (val < 0 || val > 15) {
 +			printk("Wrong value! The value is between 0-15.\n");
 +			break;
@@ -36,7 +36,7 @@
  #ifdef CONFIG_MTK_VENDOR
  	RATE_PARAM_FIXED_MIMO = 30,
  	RATE_PARAM_FIXED_OFDMA = 31,
-+	RATE_PARAM_AUTO_HEMU = 32,
++	RATE_PARAM_AUTO_MU = 32,
  #endif
  };
  
@@ -49,8 +49,8 @@
  };
  
 +static const struct nla_policy
-+hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL] = {
-+	[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
++mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
++	[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
 +};
 +
  static const struct nla_policy
@@ -60,25 +60,25 @@
  	return 0;
  }
  
-+static int mt7915_vendor_hemu_ctrl(struct wiphy *wiphy,
++static int mt7915_vendor_mu_ctrl(struct wiphy *wiphy,
 +				  struct wireless_dev *wdev,
 +				  const void *data,
 +				  int data_len)
 +{
 +	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL];
++	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_MU_CTRL];
 +	int err;
 +	u8 val8;
 +	u32 val32 = 0;
 +
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_HEMU_CTRL_MAX, data, data_len,
-+			hemu_ctrl_policy, NULL);
++	err = nla_parse(tb, MTK_VENDOR_ATTR_MU_CTRL_MAX, data, data_len,
++			mu_ctrl_policy, NULL);
 +	if (err)
 +		return err;
 +
-+	if (tb[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF]);
-+		val32 |= FIELD_PREP(RATE_CFG_MODE, RATE_PARAM_AUTO_HEMU) |
++	if (tb[MTK_VENDOR_ATTR_MU_CTRL_ONOFF]) {
++		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_MU_CTRL_ONOFF]);
++		val32 |= FIELD_PREP(RATE_CFG_MODE, RATE_PARAM_AUTO_MU) |
 +			 FIELD_PREP(RATE_CFG_VAL, val8);
 +		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
 +			mt7915_set_wireless_vif, &val32);
@@ -98,13 +98,13 @@
 +	{
 +		.info = {
 +			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL,
++			.subcmd = MTK_NL80211_VENDOR_SUBCMD_MU_CTRL,
 +		},
 +		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
 +			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7915_vendor_hemu_ctrl,
-+		.policy = hemu_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
++		.doit = mt7915_vendor_mu_ctrl,
++		.policy = mu_ctrl_policy,
++		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
  	}
  };
  
@@ -116,7 +116,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-+	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
++	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  };
  
  enum mtk_capi_control_changed {
@@ -124,15 +124,15 @@
  		NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL - 1
  };
  
-+enum mtk_vendor_attr_hemu_ctrl {
-+	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
++enum mtk_vendor_attr_mu_ctrl {
++	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 +
-+	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
 +
 +	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
++	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
++	MTK_VENDOR_ATTR_MU_CTRL_MAX =
++		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 +};
 +
  enum mtk_vendor_attr_rfeature_ctrl {
diff --git a/recipes-wifi/linux-mt76/files/patches/1120-mt76-mt7915-add-phy-capability-vendor-command.patch b/recipes-wifi/linux-mt76/files/patches/1120-mt76-mt7915-add-phy-capability-vendor-command.patch
index d9f1eec..302d0ab 100644
--- a/recipes-wifi/linux-mt76/files/patches/1120-mt76-mt7915-add-phy-capability-vendor-command.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1120-mt76-mt7915-add-phy-capability-vendor-command.patch
@@ -44,7 +44,7 @@
  struct csi_null_tone {
  	u8 start;
  	u8 end;
-@@ -974,6 +986,35 @@ static int mt7915_vendor_hemu_ctrl(struct wiphy *wiphy,
+@@ -974,6 +986,35 @@ static int mt7915_vendor_mu_ctrl(struct wiphy *wiphy,
  	return 0;
  }
  
@@ -81,9 +81,9 @@
  	{
  		.info = {
 @@ -1031,6 +1072,17 @@ static const struct wiphy_vendor_command mt7915_vendor_commands[] = {
- 		.doit = mt7915_vendor_hemu_ctrl,
- 		.policy = hemu_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
+ 		.doit = mt7915_vendor_mu_ctrl,
+ 		.policy = mu_ctrl_policy,
+ 		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
 +	},
 +	{
 +		.info = {
@@ -105,7 +105,7 @@
 @@ -9,6 +9,7 @@ enum mtk_nl80211_vendor_subcmds {
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 +	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
  };
  
diff --git a/recipes-wifi/linux-mt76/files/patches/1121-mt76-mt7915-add-vendor-subcmd-EDCCA-ctrl-enable-thre.patch b/recipes-wifi/linux-mt76/files/patches/1121-mt76-mt7915-add-vendor-subcmd-EDCCA-ctrl-enable-thre.patch
index 9472892..ca559be 100644
--- a/recipes-wifi/linux-mt76/files/patches/1121-mt76-mt7915-add-vendor-subcmd-EDCCA-ctrl-enable-thre.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1121-mt76-mt7915-add-vendor-subcmd-EDCCA-ctrl-enable-thre.patch
@@ -339,7 +339,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
 @@ -10,6 +11,38 @@ enum mtk_nl80211_vendor_subcmds {
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
 +	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +};
diff --git a/recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-hemu-dump-support.patch b/recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-mu-dump-support.patch
similarity index 64%
rename from recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-hemu-dump-support.patch
rename to recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-mu-dump-support.patch
index 0fcde9d..b3789c3 100644
--- a/recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-hemu-dump-support.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1124-mt76-mt7915-Add-mu-dump-support.patch
@@ -1,7 +1,7 @@
 From dc1ea53db698073c61765925cdb17d28043c6f2d Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Thu, 11 Aug 2022 18:09:45 -0700
-Subject: [PATCH 1124/1133] mt76: mt7915: Add hemu dump support
+Subject: [PATCH 1124/1133] mt76: mt7915: Add mu dump support
 
 Change-Id: I521214f3feb6f0d528a9f550255050ffd1ec96d2
 ---
@@ -15,19 +15,19 @@
 +++ b/mt7915/vendor.c
 @@ -37,6 +37,7 @@ wireless_ctrl_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL] = {
  static const struct nla_policy
- hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL] = {
- 	[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
+ mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
+ 	[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
++	[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
  };
  
  static const struct nla_policy
-@@ -1004,6 +1005,28 @@ static int mt7915_vendor_hemu_ctrl(struct wiphy *wiphy,
+@@ -1004,6 +1005,28 @@ static int mt7915_vendor_mu_ctrl(struct wiphy *wiphy,
  	return 0;
  }
  
 +
 +static int
-+mt7915_vendor_hemu_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
++mt7915_vendor_mu_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
 +			     struct sk_buff *skb, const void *data, int data_len,
 +			     unsigned long *storage)
 +{
@@ -39,7 +39,7 @@
 +		return -ENOENT;
 +	*storage = 1;
 +
-+	if (nla_put_u8(skb, MTK_VENDOR_ATTR_HEMU_CTRL_DUMP, phy->muru_onoff))
++	if (nla_put_u8(skb, MTK_VENDOR_ATTR_MU_CTRL_DUMP, phy->muru_onoff))
 +		return -ENOMEM;
 +	len += 1;
 +
@@ -53,23 +53,23 @@
 @@ -1190,6 +1213,7 @@ static const struct wiphy_vendor_command mt7915_vendor_commands[] = {
  		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
  			WIPHY_VENDOR_CMD_NEED_RUNNING,
- 		.doit = mt7915_vendor_hemu_ctrl,
-+		.dumpit = mt7915_vendor_hemu_ctrl_dump,
- 		.policy = hemu_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
+ 		.doit = mt7915_vendor_mu_ctrl,
++		.dumpit = mt7915_vendor_mu_ctrl_dump,
+ 		.policy = mu_ctrl_policy,
+ 		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
  	},
 diff --git a/mt7915/vendor.h b/mt7915/vendor.h
 index 72319717..c19ffe72 100644
 --- a/mt7915/vendor.h
 +++ b/mt7915/vendor.h
-@@ -72,6 +72,7 @@ enum mtk_vendor_attr_hemu_ctrl {
- 	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
+@@ -72,6 +72,7 @@ enum mtk_vendor_attr_mu_ctrl {
+ 	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
  
- 	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_DUMP,
+ 	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
  
  	/* keep last */
- 	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
+ 	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
 -- 
 2.18.0
 
diff --git a/recipes-wifi/linux-mt76/files/patches/1125-mt76-mt7915-add-vendor-subcmd-three-wire-PTA-ctrl.patch b/recipes-wifi/linux-mt76/files/patches/1125-mt76-mt7915-add-vendor-subcmd-three-wire-PTA-ctrl.patch
index 370bbcf..cd5fd8f 100644
--- a/recipes-wifi/linux-mt76/files/patches/1125-mt76-mt7915-add-vendor-subcmd-three-wire-PTA-ctrl.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1125-mt76-mt7915-add-vendor-subcmd-three-wire-PTA-ctrl.patch
@@ -149,8 +149,8 @@
 index 83f38e07..48d124e0 100644
 --- a/mt7915/vendor.c
 +++ b/mt7915/vendor.c
-@@ -40,6 +40,11 @@ hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL] = {
- 	[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
+@@ -40,6 +40,11 @@ mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
+ 	[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
  };
  
 +static const struct nla_policy
@@ -233,7 +233,7 @@
 --- a/mt7915/vendor.h
 +++ b/mt7915/vendor.h
 @@ -12,6 +12,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
diff --git a/recipes-wifi/linux-mt76/files/patches/1126-mt76-mt7915-add-ibf-control-vendor-cmd.patch b/recipes-wifi/linux-mt76/files/patches/1126-mt76-mt7915-add-ibf-control-vendor-cmd.patch
index 899c849..1fa6a9a 100644
--- a/recipes-wifi/linux-mt76/files/patches/1126-mt76-mt7915-add-ibf-control-vendor-cmd.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1126-mt76-mt7915-add-ibf-control-vendor-cmd.patch
@@ -104,7 +104,7 @@
 --- a/mt7915/vendor.h
 +++ b/mt7915/vendor.h
 @@ -12,7 +12,8 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 -	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
diff --git a/recipes-wifi/linux-mt76/files/patches/1130-mt76-mt7915-amsdu-set-and-get-control.patch b/recipes-wifi/linux-mt76/files/patches/1130-mt76-mt7915-amsdu-set-and-get-control.patch
index 6db0006..54ca9d2 100644
--- a/recipes-wifi/linux-mt76/files/patches/1130-mt76-mt7915-amsdu-set-and-get-control.patch
+++ b/recipes-wifi/linux-mt76/files/patches/1130-mt76-mt7915-amsdu-set-and-get-control.patch
@@ -62,8 +62,8 @@
 +};
 +
  static const struct nla_policy
- hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL] = {
- 	[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
+ mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
+ 	[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
 @@ -983,11 +989,35 @@ static int mt7915_vendor_wireless_ctrl(struct wiphy *wiphy,
  		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT]);
  		mt7915_mcu_set_cfg(phy, CFGINFO_CERT_CFG, val8); /* Cert Enable for OMI */
@@ -97,7 +97,7 @@
 +	return len;
 +}
 +
- static int mt7915_vendor_hemu_ctrl(struct wiphy *wiphy,
+ static int mt7915_vendor_mu_ctrl(struct wiphy *wiphy,
  				  struct wireless_dev *wdev,
  				  const void *data,
 @@ -1286,6 +1316,7 @@ static const struct wiphy_vendor_command mt7915_vendor_commands[] = {
@@ -135,8 +135,8 @@
 +		NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
 +};
 +
- enum mtk_vendor_attr_hemu_ctrl {
- 	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
+ enum mtk_vendor_attr_mu_ctrl {
+ 	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
  
 -- 
 2.18.0
diff --git a/recipes-wifi/linux-mt76/files/patches/3013-wifi-mt76-mt7915-get-tx-retries-from-tx-free-done-ev.patch b/recipes-wifi/linux-mt76/files/patches/3013-wifi-mt76-mt7915-get-tx-retries-from-tx-free-done-ev.patch
index b2560bb..e596240 100644
--- a/recipes-wifi/linux-mt76/files/patches/3013-wifi-mt76-mt7915-get-tx-retries-from-tx-free-done-ev.patch
+++ b/recipes-wifi/linux-mt76/files/patches/3013-wifi-mt76-mt7915-get-tx-retries-from-tx-free-done-ev.patch
@@ -1,8 +1,8 @@
-From 28eed1babbb1cc80d74d5d7fa433ee9d7acd1287 Mon Sep 17 00:00:00 2001
+From be812eb6a9ceafc732c518070458fed74a09cd2e Mon Sep 17 00:00:00 2001
 From: Peter Chiu <chui-hao.chiu@mediatek.com>
 Date: Tue, 17 Jan 2023 21:15:00 +0800
-Subject: [PATCH 3013/3015] wifi: mt76: mt7915: get tx retries from tx free
- done event for sw path
+Subject: [PATCH] wifi: mt76: mt7915: get tx retries from tx free done event
+ for sw path
 
 ---
  mt7915/mac.c  | 14 +++++++++++---
@@ -11,7 +11,7 @@
  3 files changed, 18 insertions(+), 7 deletions(-)
 
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 175498b1..b7559182 100644
+index 175498b1..180c1ae3 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
 @@ -1005,6 +1005,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
@@ -49,7 +49,7 @@
 +		else if (!v3 && (info & MT_TX_FREE_MPDU_HEADER))
 +			retries = u32_get_bits(info, MT_TX_FREE_TX_COUNT) - 1;
 +
-+		if (!mtk_wed_device_active(&mdev->mmio.wed))
++		if (!mtk_wed_device_active(&mdev->mmio.wed) && wcid)
 +			wcid->stats.tx_retries += retries;
 +
 +		if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
diff --git a/recipes-wifi/linux-mt76/files/patches/patches.inc b/recipes-wifi/linux-mt76/files/patches/patches.inc
index 84cafb7..c041c72 100644
--- a/recipes-wifi/linux-mt76/files/patches/patches.inc
+++ b/recipes-wifi/linux-mt76/files/patches/patches.inc
@@ -23,7 +23,7 @@
     file://1121-mt76-mt7915-add-vendor-subcmd-EDCCA-ctrl-enable-thre.patch \
     file://1122-mt76-mt7915-implement-bin-file-mode.patch \
     file://1123-mt76-mt7915-initialize-wcid.patch \
-    file://1124-mt76-mt7915-Add-hemu-dump-support.patch \
+    file://1124-mt76-mt7915-Add-mu-dump-support.patch \
     file://1125-mt76-mt7915-add-vendor-subcmd-three-wire-PTA-ctrl.patch \
     file://1126-mt76-mt7915-add-ibf-control-vendor-cmd.patch \
     file://1127-mt76-mt7915-add-E3-re-bonding-for-low-yield-rate-iss.patch \
diff --git a/recipes-wifi/mt76-vendor/files/src/CMakeLists.txt b/recipes-wifi/mt76-vendor/files/src/CMakeLists.txt
index dd6ef76..bca3897 100644
--- a/recipes-wifi/mt76-vendor/files/src/CMakeLists.txt
+++ b/recipes-wifi/mt76-vendor/files/src/CMakeLists.txt
@@ -3,7 +3,7 @@
 PROJECT(mt76-vendor C)
 ADD_DEFINITIONS(-Os -Wall --std=gnu99 -g3)
 
-ADD_EXECUTABLE(mt76-vendor main.c csi.c amnt.c capi.c hemu.c phy_capa.c)
+ADD_EXECUTABLE(mt76-vendor main.c csi.c amnt.c capi.c mu.c phy_capa.c)
 TARGET_LINK_LIBRARIES(mt76-vendor nl-tiny)
 
 SET(CMAKE_INSTALL_PREFIX /usr)
diff --git a/recipes-wifi/mt76-vendor/files/src/main.c b/recipes-wifi/mt76-vendor/files/src/main.c
index f308d9c..e0bf9d9 100644
--- a/recipes-wifi/mt76-vendor/files/src/main.c
+++ b/recipes-wifi/mt76-vendor/files/src/main.c
@@ -32,7 +32,7 @@
 		"set ap_wireless amsdu=<enable>",
 		"set ap_wireless cert=<enable>",
 
-		"set hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))",
+		"set mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))",
 
 		"dump phy_capa",
 	};
@@ -81,8 +81,8 @@
 			ret = mt76_ap_rfeatures_set(if_idx, argc, argv);
 		else if (!strncmp(subcmd, "ap_wireless", 11))
 			ret = mt76_ap_wireless_set(if_idx, argc, argv);
-		else if (!strncmp(subcmd, "hemu", 4))
-			ret = mt76_hemu_onoff_set(if_idx, argc, argv);
+		else if (!strncmp(subcmd, "mu", 2))
+			ret = mt76_mu_onoff_set(if_idx, argc, argv);
 	} else {
 		usage();
 	}
diff --git a/recipes-wifi/mt76-vendor/files/src/mt76-vendor.h b/recipes-wifi/mt76-vendor/files/src/mt76-vendor.h
index 7e11b91..61b0426 100644
--- a/recipes-wifi/mt76-vendor/files/src/mt76-vendor.h
+++ b/recipes-wifi/mt76-vendor/files/src/mt76-vendor.h
@@ -38,7 +38,7 @@
 	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
 	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
 	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
 };
 
@@ -148,15 +148,15 @@
 		NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL - 1
 };
 
-enum mtk_vendor_attr_hemu_ctrl {
-	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
+enum mtk_vendor_attr_mu_ctrl {
+	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 
-	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
+	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
 
 	/* keep last */
-	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
+	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
+	MTK_VENDOR_ATTR_MU_CTRL_MAX =
+		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 };
 
 enum mtk_vendor_attr_rfeature_ctrl {
@@ -236,7 +236,7 @@
 int mt76_ap_rfeatures_set(int idx, int argc, char **argv);
 int mt76_ap_wireless_set(int idx, int argc, char **argv);
 
-int mt76_hemu_onoff_set(int idx, int argc, char **argv);
+int mt76_mu_onoff_set(int idx, int argc, char **argv);
 
 int mt76_phy_capa_dump(int idx, int argc, char **argv);
 #endif
diff --git a/recipes-wifi/mt76-vendor/files/src/mu.c b/recipes-wifi/mt76-vendor/files/src/mu.c
new file mode 100755
index 0000000..fb4157e
--- /dev/null
+++ b/recipes-wifi/mt76-vendor/files/src/mu.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2021 Mediatek Inc. */
+#define _GNU_SOURCE
+
+#include "mt76-vendor.h"
+
+static int mt76_mu_onoff_set_attr(struct nl_msg *msg, int argc, char **argv)
+{
+	char *val;
+
+	val = strchr(argv[0], '=');
+	if (!val)
+		return -EINVAL;
+
+	*(val++) = 0;
+
+	if (!strncmp(argv[0], "onoff", 5))
+		nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
+			   strtoul(val, NULL, 0));
+
+	return 0;
+}
+
+int mt76_mu_onoff_set(int idx, int argc, char **argv)
+{
+	struct nl_msg *msg;
+	void *data;
+	int ret;
+
+	if (argc < 1)
+		return 1;
+
+	if (unl_genl_init(&unl, "nl80211") < 0) {
+		fprintf(stderr, "Failed to connect to nl80211\n");
+		return 2;
+	}
+
+	msg = unl_genl_msg(&unl, NL80211_CMD_VENDOR, false);
+
+	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, idx) ||
+	    nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, MTK_NL80211_VENDOR_ID) ||
+	    nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
+			MTK_NL80211_VENDOR_SUBCMD_MU_CTRL))
+		return false;
+
+	data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA | NLA_F_NESTED);
+	if (!data)
+		return -ENOMEM;
+
+	mt76_mu_onoff_set_attr(msg, argc, argv);
+
+	nla_nest_end(msg, data);
+
+	ret = unl_genl_request(&unl, msg, NULL, NULL);
+	if (ret)
+		fprintf(stderr, "nl80211 call failed: %s\n", strerror(-ret));
+
+	unl_free(&unl);
+
+	return ret;
+}
diff --git a/recipes-wifi/wireless-regdb/wireless-regdb_2022.08.12.bb b/recipes-wifi/wireless-regdb/wireless-regdb_2023.02.13.bb
similarity index 94%
rename from recipes-wifi/wireless-regdb/wireless-regdb_2022.08.12.bb
rename to recipes-wifi/wireless-regdb/wireless-regdb_2023.02.13.bb
index 1f07d03..b4388d9 100644
--- a/recipes-wifi/wireless-regdb/wireless-regdb_2022.08.12.bb
+++ b/recipes-wifi/wireless-regdb/wireless-regdb_2023.02.13.bb
@@ -5,7 +5,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=07c4f6dea3845b02a18dc00c8c87699c"
 
 SRC_URI = "https://www.kernel.org/pub/software/network/${BPN}/${BP}.tar.xz"
-SRC_URI[sha256sum] = "59c8f7d17966db71b27f90e735ee8f5b42ca3527694a8c5e6e9b56bd379c3b84"
+SRC_URI[sha256sum] = "fe81e8a8694dc4753a45087a1c4c7e1b48dee5a59f5f796ce374ea550f0b2e73"
 
 FILESEXTRAPATHS_prepend := "${THISDIR}/files/patches:"
 require files/patches/patches.inc
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
similarity index 71%
rename from recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
rename to recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
index 27e71da..07e0d6d 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
@@ -1,7 +1,7 @@
 From 4919444a2dc29c019ec92321109603763c732071 Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Tue, 9 Aug 2022 10:23:44 -0700
-Subject: [PATCH 06/15] hostapd: mtk: Add hostapd HEMU SET/GET control
+Subject: [PATCH 06/15] hostapd: mtk: Add hostapd MU SET/GET control
 
 ---
  hostapd/config_file.c             |   9 +++
@@ -27,15 +27,15 @@
  			return 1;
  		}
  		bss->unsol_bcast_probe_resp_interval = val;
-+	} else if (os_strcmp(buf, "hemu_onoff") == 0) {
++	} else if (os_strcmp(buf, "mu_onoff") == 0) {
 +		int val = atoi(pos);
 +		if (val < 0 || val > 15) {
 +			wpa_printf(MSG_ERROR,
-+				   "Line %d: invalid hemu_onoff value",
++				   "Line %d: invalid mu_onoff value",
 +				   line);
 +			return 1;
 +		}
-+		conf->hemu_onoff = val;
++		conf->mu_onoff = val;
  #endif /* CONFIG_IEEE80211AX */
  	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
  		bss->max_listen_interval = atoi(pos);
@@ -48,7 +48,7 @@
  
  
 +static int
-+hostapd_ctrl_iface_set_hemu(struct hostapd_data *hapd, char *cmd,
++hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd,
 +					 char *buf, size_t buflen)
 +{
 +	char *pos, *config, *value;
@@ -63,19 +63,19 @@
 +	value = pos;
 +
 +	if (os_strcmp(config, "onoff") == 0) {
-+		int hemu = atoi(value);
-+		if (hemu < 0 || hemu > 15) {
-+			wpa_printf(MSG_ERROR, "Invalid value for hemu");
++		int mu = atoi(value);
++		if (mu < 0 || mu > 15) {
++			wpa_printf(MSG_ERROR, "Invalid value for mu");
 +			return -1;
 +		}
-+		hapd->iconf->hemu_onoff = (u8) hemu;
++		hapd->iconf->mu_onoff = (u8) mu;
 +	} else {
 +		wpa_printf(MSG_ERROR,
-+			"Unsupported parameter %s for SET_HEMU", config);
++			"Unsupported parameter %s for SET_MU", config);
 +		return -1;
 +	}
 +
-+	if(hostapd_drv_hemu_ctrl(hapd) == 0) {
++	if(hostapd_drv_mu_ctrl(hapd) == 0) {
 +		return os_snprintf(buf, buflen, "OK\n");
 +	} else {
 +		return -1;
@@ -84,19 +84,19 @@
 +
 +
 +static int
-+hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
++hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
 +					 size_t buflen)
 +{
-+	u8 hemu_onoff;
++	u8 mu_onoff;
 +	char *pos, *end;
 +
 +	pos = buf;
 +	end = buf + buflen;
 +
-+	if (hostapd_drv_hemu_dump(hapd, &hemu_onoff) == 0) {
-+		hapd->iconf->hemu_onoff = hemu_onoff;
++	if (hostapd_drv_mu_dump(hapd, &mu_onoff) == 0) {
++		hapd->iconf->mu_onoff = mu_onoff;
 +		return os_snprintf(pos, end - pos, "[hostapd_cli] = UL MU-MIMO: %d, DL MU-MIMO: %d, UL OFDMA: %d, DL OFDMA: %d\n",
-+			!!(hemu_onoff&BIT(3)), !!(hemu_onoff&BIT(2)), !!(hemu_onoff&BIT(1)), !!(hemu_onoff&BIT(0)));
++			!!(mu_onoff&BIT(3)), !!(mu_onoff&BIT(2)), !!(mu_onoff&BIT(1)), !!(mu_onoff&BIT(0)));
 +	} else {
 +		wpa_printf(MSG_INFO, "ctrl iface failed to call");
 +		return -1;
@@ -111,11 +111,11 @@
  	} else if (os_strncmp(buf, "GET_EDCCA ", 10) == 0) {
  		reply_len = hostapd_ctrl_iface_get_edcca(hapd, buf+10, reply,
  							  reply_size);
-+	} else if (os_strncmp(buf, "SET_HEMU ", 9) == 0) {
-+		reply_len = hostapd_ctrl_iface_set_hemu(hapd, buf+9, reply,
++	} else if (os_strncmp(buf, "SET_MU ", 7) == 0) {
++		reply_len = hostapd_ctrl_iface_set_mu(hapd, buf + 7, reply,
 +							  reply_size);
-+	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
-+		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
++	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
++		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else {
  		os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
  		reply_len = 16;
@@ -127,17 +127,17 @@
  }
  
  
-+static int hostapd_cli_cmd_set_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_set_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "SET_HEMU", 1, argc, argv);
++	return hostapd_cli_cmd(ctrl, "SET_MU", 1, argc, argv);
 +}
 +
 +
-+static int hostapd_cli_cmd_get_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "GET_HEMU", 0, NULL, NULL);
++	return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
 +}
 +
 +
@@ -148,10 +148,10 @@
  	  " = send FTM range request"},
  	{ "driver_flags", hostapd_cli_cmd_driver_flags, NULL,
  	  " = show supported driver flags"},
-+	{ "set_hemu", hostapd_cli_cmd_set_hemu, NULL,
++	{ "set_mu", hostapd_cli_cmd_set_mu, NULL,
 +		"<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
-+	{ "get_hemu", hostapd_cli_cmd_get_hemu, NULL,
-+		" = show hemu onoff value in 0-15 bitmap"},
++	{ "get_mu", hostapd_cli_cmd_get_mu, NULL,
++		" = show mu onoff value in 0-15 bitmap"},
  #ifdef CONFIG_DPP
  	{ "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
  	  "report a scanned DPP URI from a QR Code" },
@@ -163,7 +163,7 @@
  	conf->he_6ghz_max_ampdu_len_exp = 7;
  	conf->he_6ghz_rx_ant_pat = 1;
  	conf->he_6ghz_tx_ant_pat = 1;
-+	conf->hemu_onoff = 13;
++	conf->mu_onoff = 13;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* The third octet of the country string uses an ASCII space character
@@ -175,7 +175,7 @@
  	u8 he_6ghz_rx_ant_pat;
  	u8 he_6ghz_tx_ant_pat;
  	u8 he_6ghz_reg_pwr_type;
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* VHT enable/disable config from CHAN_SWITCH */
@@ -188,18 +188,18 @@
  	return hapd->driver->get_edcca(hapd->drv_priv, mode, value);
  }
 +
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd)
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_ctrl)
++	if (!hapd->driver || !hapd->driver->mu_ctrl)
 +		return 0;
-+	return hapd->driver->hemu_ctrl(hapd->drv_priv, hapd->iconf->hemu_onoff);
++	return hapd->driver->mu_ctrl(hapd->drv_priv, hapd->iconf->mu_onoff);
 +}
 +
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_dump)
++	if (!hapd->driver || !hapd->driver->mu_dump)
 +		return 0;
-+	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
++	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
 +}
 diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
 index 70a99f406..bca39c502 100644
@@ -209,8 +209,8 @@
  int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  					  const int *threshold);
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  
  #include "drivers/driver.h"
  
@@ -222,7 +222,7 @@
  	if (hostapd_drv_configure_edcca_threshold(hapd,
  						  hapd->iconf->edcca_threshold) < 0)
  		goto fail;
-+	if (hostapd_drv_hemu_ctrl(hapd) < 0)
++	if (hostapd_drv_mu_ctrl(hapd) < 0)
 +		goto fail;
  
  	wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
@@ -235,7 +235,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-+	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
++	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 +	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
  };
@@ -244,16 +244,16 @@
  		NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL - 1
  };
  
-+enum mtk_vendor_attr_hemu_ctrl {
-+	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
++enum mtk_vendor_attr_mu_ctrl {
++	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 +
-+	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_DUMP,
++	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
 +
 +	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
++	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
++	MTK_VENDOR_ATTR_MU_CTRL_MAX =
++		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 +};
 +
 +
@@ -270,9 +270,9 @@
  	size_t unsol_bcast_probe_resp_tmpl_len;
 +
 +	/**
-+	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
++	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
 +	 */
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  };
  
  struct wpa_driver_mesh_bss_params {
@@ -282,12 +282,12 @@
  	int (*get_edcca)(void *priv, const u8 mode, u8 *value);
 +
 +	/**
-+	 * hemu_ctrl - ctrl on off for UL/DL MURU
++	 * mu_ctrl - ctrl on off for UL/DL MURU
 +	 * @priv: Private driver interface data
 +	 *
 +	 */
-+	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
-+	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
++	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
++	 int (*mu_dump)(void *priv, u8 *mu_onoff);
  };
  
  /**
@@ -300,7 +300,7 @@
  
  
 +#ifdef CONFIG_IEEE80211AX
-+static int nl80211_hemu_muruonoff(void *priv, u8 hemu_onoff)
++static int nl80211_mu_onoff(void *priv, u8 mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -308,41 +308,41 @@
 +	struct nlattr *data;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL) ||
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL) ||
 +		!(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
-+		nla_put_u8(msg, MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF, hemu_onoff)) {
++		nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, mu_onoff)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
 +	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 hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to set mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +	return ret;
 +}
 +
 +
-+static int hemu_dump_handler(struct nl_msg *msg, void *arg)
++static int mu_dump_handler(struct nl_msg *msg, void *arg)
 +{
-+	u8 *hemu_onoff = (u8 *) arg;
++	u8 *mu_onoff = (u8 *) arg;
 +	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-+	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_MAX + 1];
++	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_MAX + 1];
 +	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
 +	struct nlattr *nl_vend, *attr;
 +
 +	static const struct nla_policy
-+	hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL + 1] = {
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
++	mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL + 1] = {
++		[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
++		[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
 +	};
 +
 +	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -352,22 +352,22 @@
 +	if (!nl_vend)
 +		return NL_SKIP;
 +
-+	nla_parse(tb_vendor, MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
++	nla_parse(tb_vendor, MTK_VENDOR_ATTR_MU_CTRL_MAX,
 +		  nla_data(nl_vend), nla_len(nl_vend), NULL);
 +
-+	attr = tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP];
++	attr = tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_DUMP];
 +	if (!attr) {
-+		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_HEMU_CTRL_DUMP");
++		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_MU_CTRL_DUMP");
 +		return NL_SKIP;
 +	}
 +
-+	*hemu_onoff = nla_get_u8(attr);
-+	wpa_printf(MSG_DEBUG, "nla_get hemu_onoff: %d\n", *hemu_onoff);
++	*mu_onoff = nla_get_u8(attr);
++	wpa_printf(MSG_DEBUG, "nla_get mu_onoff: %d\n", *mu_onoff);
 +
 +	return 0;
 +}
 +
-+static int nl80211_hemu_dump(void *priv, u8 *hemu_onoff)
++static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -375,15 +375,15 @@
 +	struct nlattr *attr;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL)) {
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
@@ -396,10 +396,10 @@
 +
 +	nla_nest_end(msg, attr);
 +
-+	ret = send_and_recv_msgs(drv, msg, hemu_dump_handler, hemu_onoff, NULL, NULL);
++	ret = send_and_recv_msgs(drv, msg, mu_dump_handler, mu_onoff, NULL, NULL);
 +
 +	if(ret){
-+		wpa_printf(MSG_ERROR, "Failed to get hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to get mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +
 +	return ret;
@@ -414,8 +414,8 @@
  	.update_connect_params = nl80211_update_connection_params,
  	.send_external_auth_status = nl80211_send_external_auth_status,
  	.set_4addr_mode = nl80211_set_4addr_mode,
-+	.hemu_ctrl = nl80211_hemu_muruonoff,
-+	.hemu_dump = nl80211_hemu_dump,
++	.mu_ctrl = nl80211_mu_onoff,
++	.mu_dump = nl80211_mu_dump,
  #ifdef CONFIG_DPP
  	.dpp_listen = nl80211_dpp_listen,
  #endif /* CONFIG_DPP */
@@ -427,7 +427,7 @@
  	unsigned int brcm_do_acs:1;
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
-+	unsigned int mtk_hemu_vendor_cmd_avail:1;
++	unsigned int mtk_mu_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
  	u64 remain_on_chan_cookie;
@@ -439,8 +439,8 @@
  				case MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL :
  					drv->mtk_edcca_vendor_cmd_avail = 1;
  					break;
-+				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
-+					drv->mtk_hemu_vendor_cmd_avail = 1;
++				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
++					drv->mtk_mu_vendor_cmd_avail = 1;
 +					break;
  				}
  			}
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
index 4bc3fcd..8ca8c55 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
@@ -74,9 +74,9 @@
 index 4598737a3..a1d83e4ee 100644
 --- a/src/ap/ap_drv_ops.c
 +++ b/src/ap/ap_drv_ops.c
-@@ -1053,3 +1053,14 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
+@@ -1053,3 +1053,14 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
  		return 0;
- 	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
+ 	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
  }
 +
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd)
@@ -95,8 +95,8 @@
 +++ b/src/ap/ap_drv_ops.h
 @@ -144,6 +144,7 @@ int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  
  #include "drivers/driver.h"
@@ -107,7 +107,7 @@
 +++ b/src/ap/hostapd.c
 @@ -2304,6 +2304,8 @@ dfs_offload:
  		goto fail;
- 	if (hostapd_drv_hemu_ctrl(hapd) < 0)
+ 	if (hostapd_drv_mu_ctrl(hapd) < 0)
  		goto fail;
 +	if (hostapd_drv_three_wire_ctrl(hapd) < 0)
 +		goto fail;
@@ -119,7 +119,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,6 +13,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -154,8 +154,8 @@
 +++ b/src/drivers/driver.h
 @@ -4693,6 +4693,14 @@ struct wpa_driver_ops {
  	 */
- 	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
- 	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
+ 	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
+ 	 int (*mu_dump)(void *priv, u8 *mu_onoff);
 +
 +	/**
 +	 * three_wire_ctrl - set three_wire_ctrl mode
@@ -223,7 +223,7 @@
 @@ -183,6 +183,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
 +	unsigned int mtk_3wire_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
@@ -233,8 +233,8 @@
 --- a/src/drivers/driver_nl80211_capa.c
 +++ b/src/drivers/driver_nl80211_capa.c
 @@ -1059,6 +1059,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
- 				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
- 					drv->mtk_hemu_vendor_cmd_avail = 1;
+ 				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
+ 					drv->mtk_mu_vendor_cmd_avail = 1;
  					break;
 +				case MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL :
 +					drv->mtk_3wire_vendor_cmd_avail = 1;
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
index 6bfe3d0..fc38b4f 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
@@ -38,7 +38,7 @@
 index 5f71aeea9..c881d3717 100644
 --- a/hostapd/ctrl_iface.c
 +++ b/hostapd/ctrl_iface.c
-@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
+@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
  }
  
  
@@ -71,8 +71,8 @@
  					      int reply_size,
 @@ -4055,6 +4079,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
  							  reply_size);
- 	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
 +		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
  	} else {
@@ -165,8 +165,8 @@
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
 @@ -145,6 +145,8 @@ int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -191,7 +191,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,7 +13,8 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 -	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -200,8 +200,8 @@
  };
  
  enum mtk_vendor_attr_edcca_ctrl {
-@@ -204,6 +205,38 @@ enum mtk_vendor_attr_hemu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
+@@ -204,6 +205,38 @@ enum mtk_vendor_attr_mu_ctrl {
+ 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
  };
  
 +enum mtk_vendor_attr_ibf_ctrl {
@@ -244,9 +244,9 @@
 --- a/src/drivers/driver.h
 +++ b/src/drivers/driver.h
 @@ -1628,6 +1628,11 @@ struct wpa_driver_ap_params {
- 	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
+ 	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
  	 */
- 	u8 hemu_onoff;
+ 	u8 mu_onoff;
 +
 +	/**
 +	 * ibf_enable=<val>
@@ -406,7 +406,7 @@
 +++ b/src/drivers/driver_nl80211.h
 @@ -184,6 +184,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
 +	unsigned int mtk_ibf_vendor_cmd_avail:1;
  
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
index 8a387a7..3237aa3 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
@@ -133,7 +133,7 @@
  					      char *buf, char *reply,
  					      int reply_size,
 @@ -4081,6 +4171,11 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
  		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "DFS_DETECT_MODE ", 16) == 0) {
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
index ed796c1..dba90d1 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
@@ -162,7 +162,7 @@
 index ab9aedcee..4406666fd 100644
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
-@@ -147,6 +147,8 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+@@ -147,6 +147,8 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -374,7 +374,7 @@
 --- a/src/drivers/driver_nl80211.h
 +++ b/src/drivers/driver_nl80211.h
 @@ -185,6 +185,7 @@ struct wpa_driver_nl80211_data {
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
  	unsigned int mtk_ibf_vendor_cmd_avail:1;
 +	unsigned int mtk_wireless_vendor_cmd_avail:1;
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/patches.inc b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/patches.inc
index 8cda113..4a42f53 100644
--- a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/patches.inc
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/patches.inc
@@ -67,7 +67,7 @@
     file://mtk-0003-hostapd-mtk-add-support-for-runtime-set-in-band-disc.patch \
     file://mtk-0004-hostapd-mtk-Add-mtk_vendor.h.patch \
     file://mtk-0005-hostapd-mtk-Support-EDCCA-hostapd-configuration.patch \
-    file://mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch \
+    file://mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch \
     file://mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch \
     file://mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch \
     file://mtk-0009-hostapd-mtk-Do-not-include-HE-capab-IE-if-associated.patch \
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
similarity index 71%
rename from recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
rename to recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
index 27e71da..07e0d6d 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch
@@ -1,7 +1,7 @@
 From 4919444a2dc29c019ec92321109603763c732071 Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Tue, 9 Aug 2022 10:23:44 -0700
-Subject: [PATCH 06/15] hostapd: mtk: Add hostapd HEMU SET/GET control
+Subject: [PATCH 06/15] hostapd: mtk: Add hostapd MU SET/GET control
 
 ---
  hostapd/config_file.c             |   9 +++
@@ -27,15 +27,15 @@
  			return 1;
  		}
  		bss->unsol_bcast_probe_resp_interval = val;
-+	} else if (os_strcmp(buf, "hemu_onoff") == 0) {
++	} else if (os_strcmp(buf, "mu_onoff") == 0) {
 +		int val = atoi(pos);
 +		if (val < 0 || val > 15) {
 +			wpa_printf(MSG_ERROR,
-+				   "Line %d: invalid hemu_onoff value",
++				   "Line %d: invalid mu_onoff value",
 +				   line);
 +			return 1;
 +		}
-+		conf->hemu_onoff = val;
++		conf->mu_onoff = val;
  #endif /* CONFIG_IEEE80211AX */
  	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
  		bss->max_listen_interval = atoi(pos);
@@ -48,7 +48,7 @@
  
  
 +static int
-+hostapd_ctrl_iface_set_hemu(struct hostapd_data *hapd, char *cmd,
++hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd,
 +					 char *buf, size_t buflen)
 +{
 +	char *pos, *config, *value;
@@ -63,19 +63,19 @@
 +	value = pos;
 +
 +	if (os_strcmp(config, "onoff") == 0) {
-+		int hemu = atoi(value);
-+		if (hemu < 0 || hemu > 15) {
-+			wpa_printf(MSG_ERROR, "Invalid value for hemu");
++		int mu = atoi(value);
++		if (mu < 0 || mu > 15) {
++			wpa_printf(MSG_ERROR, "Invalid value for mu");
 +			return -1;
 +		}
-+		hapd->iconf->hemu_onoff = (u8) hemu;
++		hapd->iconf->mu_onoff = (u8) mu;
 +	} else {
 +		wpa_printf(MSG_ERROR,
-+			"Unsupported parameter %s for SET_HEMU", config);
++			"Unsupported parameter %s for SET_MU", config);
 +		return -1;
 +	}
 +
-+	if(hostapd_drv_hemu_ctrl(hapd) == 0) {
++	if(hostapd_drv_mu_ctrl(hapd) == 0) {
 +		return os_snprintf(buf, buflen, "OK\n");
 +	} else {
 +		return -1;
@@ -84,19 +84,19 @@
 +
 +
 +static int
-+hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
++hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
 +					 size_t buflen)
 +{
-+	u8 hemu_onoff;
++	u8 mu_onoff;
 +	char *pos, *end;
 +
 +	pos = buf;
 +	end = buf + buflen;
 +
-+	if (hostapd_drv_hemu_dump(hapd, &hemu_onoff) == 0) {
-+		hapd->iconf->hemu_onoff = hemu_onoff;
++	if (hostapd_drv_mu_dump(hapd, &mu_onoff) == 0) {
++		hapd->iconf->mu_onoff = mu_onoff;
 +		return os_snprintf(pos, end - pos, "[hostapd_cli] = UL MU-MIMO: %d, DL MU-MIMO: %d, UL OFDMA: %d, DL OFDMA: %d\n",
-+			!!(hemu_onoff&BIT(3)), !!(hemu_onoff&BIT(2)), !!(hemu_onoff&BIT(1)), !!(hemu_onoff&BIT(0)));
++			!!(mu_onoff&BIT(3)), !!(mu_onoff&BIT(2)), !!(mu_onoff&BIT(1)), !!(mu_onoff&BIT(0)));
 +	} else {
 +		wpa_printf(MSG_INFO, "ctrl iface failed to call");
 +		return -1;
@@ -111,11 +111,11 @@
  	} else if (os_strncmp(buf, "GET_EDCCA ", 10) == 0) {
  		reply_len = hostapd_ctrl_iface_get_edcca(hapd, buf+10, reply,
  							  reply_size);
-+	} else if (os_strncmp(buf, "SET_HEMU ", 9) == 0) {
-+		reply_len = hostapd_ctrl_iface_set_hemu(hapd, buf+9, reply,
++	} else if (os_strncmp(buf, "SET_MU ", 7) == 0) {
++		reply_len = hostapd_ctrl_iface_set_mu(hapd, buf + 7, reply,
 +							  reply_size);
-+	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
-+		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
++	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
++		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else {
  		os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
  		reply_len = 16;
@@ -127,17 +127,17 @@
  }
  
  
-+static int hostapd_cli_cmd_set_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_set_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "SET_HEMU", 1, argc, argv);
++	return hostapd_cli_cmd(ctrl, "SET_MU", 1, argc, argv);
 +}
 +
 +
-+static int hostapd_cli_cmd_get_hemu(struct wpa_ctrl *ctrl, int argc,
++static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
 +					   char *argv[])
 +{
-+	return hostapd_cli_cmd(ctrl, "GET_HEMU", 0, NULL, NULL);
++	return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
 +}
 +
 +
@@ -148,10 +148,10 @@
  	  " = send FTM range request"},
  	{ "driver_flags", hostapd_cli_cmd_driver_flags, NULL,
  	  " = show supported driver flags"},
-+	{ "set_hemu", hostapd_cli_cmd_set_hemu, NULL,
++	{ "set_mu", hostapd_cli_cmd_set_mu, NULL,
 +		"<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
-+	{ "get_hemu", hostapd_cli_cmd_get_hemu, NULL,
-+		" = show hemu onoff value in 0-15 bitmap"},
++	{ "get_mu", hostapd_cli_cmd_get_mu, NULL,
++		" = show mu onoff value in 0-15 bitmap"},
  #ifdef CONFIG_DPP
  	{ "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
  	  "report a scanned DPP URI from a QR Code" },
@@ -163,7 +163,7 @@
  	conf->he_6ghz_max_ampdu_len_exp = 7;
  	conf->he_6ghz_rx_ant_pat = 1;
  	conf->he_6ghz_tx_ant_pat = 1;
-+	conf->hemu_onoff = 13;
++	conf->mu_onoff = 13;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* The third octet of the country string uses an ASCII space character
@@ -175,7 +175,7 @@
  	u8 he_6ghz_rx_ant_pat;
  	u8 he_6ghz_tx_ant_pat;
  	u8 he_6ghz_reg_pwr_type;
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  #endif /* CONFIG_IEEE80211AX */
  
  	/* VHT enable/disable config from CHAN_SWITCH */
@@ -188,18 +188,18 @@
  	return hapd->driver->get_edcca(hapd->drv_priv, mode, value);
  }
 +
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd)
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_ctrl)
++	if (!hapd->driver || !hapd->driver->mu_ctrl)
 +		return 0;
-+	return hapd->driver->hemu_ctrl(hapd->drv_priv, hapd->iconf->hemu_onoff);
++	return hapd->driver->mu_ctrl(hapd->drv_priv, hapd->iconf->mu_onoff);
 +}
 +
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
 +{
-+	if (!hapd->driver || !hapd->driver->hemu_dump)
++	if (!hapd->driver || !hapd->driver->mu_dump)
 +		return 0;
-+	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
++	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
 +}
 diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
 index 70a99f406..bca39c502 100644
@@ -209,8 +209,8 @@
  int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  					  const int *threshold);
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
-+int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
-+int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
++int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
++int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  
  #include "drivers/driver.h"
  
@@ -222,7 +222,7 @@
  	if (hostapd_drv_configure_edcca_threshold(hapd,
  						  hapd->iconf->edcca_threshold) < 0)
  		goto fail;
-+	if (hostapd_drv_hemu_ctrl(hapd) < 0)
++	if (hostapd_drv_mu_ctrl(hapd) < 0)
 +		goto fail;
  
  	wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
@@ -235,7 +235,7 @@
  	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
  	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
  	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
-+	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
++	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
 +	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
  };
@@ -244,16 +244,16 @@
  		NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL - 1
  };
  
-+enum mtk_vendor_attr_hemu_ctrl {
-+	MTK_VENDOR_ATTR_HEMU_CTRL_UNSPEC,
++enum mtk_vendor_attr_mu_ctrl {
++	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
 +
-+	MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_DUMP,
++	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
++	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
 +
 +	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_HEMU_CTRL,
-+	MTK_VENDOR_ATTR_HEMU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
++	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
++	MTK_VENDOR_ATTR_MU_CTRL_MAX =
++		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
 +};
 +
 +
@@ -270,9 +270,9 @@
  	size_t unsol_bcast_probe_resp_tmpl_len;
 +
 +	/**
-+	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
++	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
 +	 */
-+	u8 hemu_onoff;
++	u8 mu_onoff;
  };
  
  struct wpa_driver_mesh_bss_params {
@@ -282,12 +282,12 @@
  	int (*get_edcca)(void *priv, const u8 mode, u8 *value);
 +
 +	/**
-+	 * hemu_ctrl - ctrl on off for UL/DL MURU
++	 * mu_ctrl - ctrl on off for UL/DL MURU
 +	 * @priv: Private driver interface data
 +	 *
 +	 */
-+	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
-+	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
++	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
++	 int (*mu_dump)(void *priv, u8 *mu_onoff);
  };
  
  /**
@@ -300,7 +300,7 @@
  
  
 +#ifdef CONFIG_IEEE80211AX
-+static int nl80211_hemu_muruonoff(void *priv, u8 hemu_onoff)
++static int nl80211_mu_onoff(void *priv, u8 mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -308,41 +308,41 @@
 +	struct nlattr *data;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL) ||
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL) ||
 +		!(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
-+		nla_put_u8(msg, MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF, hemu_onoff)) {
++		nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, mu_onoff)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
 +	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 hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to set mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +	return ret;
 +}
 +
 +
-+static int hemu_dump_handler(struct nl_msg *msg, void *arg)
++static int mu_dump_handler(struct nl_msg *msg, void *arg)
 +{
-+	u8 *hemu_onoff = (u8 *) arg;
++	u8 *mu_onoff = (u8 *) arg;
 +	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-+	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_MAX + 1];
++	struct nlattr *tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_MAX + 1];
 +	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
 +	struct nlattr *nl_vend, *attr;
 +
 +	static const struct nla_policy
-+	hemu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_HEMU_CTRL + 1] = {
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_ONOFF] = {.type = NLA_U8 },
-+		[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP] = {.type = NLA_U8 },
++	mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL + 1] = {
++		[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
++		[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
 +	};
 +
 +	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -352,22 +352,22 @@
 +	if (!nl_vend)
 +		return NL_SKIP;
 +
-+	nla_parse(tb_vendor, MTK_VENDOR_ATTR_HEMU_CTRL_MAX,
++	nla_parse(tb_vendor, MTK_VENDOR_ATTR_MU_CTRL_MAX,
 +		  nla_data(nl_vend), nla_len(nl_vend), NULL);
 +
-+	attr = tb_vendor[MTK_VENDOR_ATTR_HEMU_CTRL_DUMP];
++	attr = tb_vendor[MTK_VENDOR_ATTR_MU_CTRL_DUMP];
 +	if (!attr) {
-+		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_HEMU_CTRL_DUMP");
++		wpa_printf(MSG_ERROR, "nl80211: cannot find MTK_VENDOR_ATTR_MU_CTRL_DUMP");
 +		return NL_SKIP;
 +	}
 +
-+	*hemu_onoff = nla_get_u8(attr);
-+	wpa_printf(MSG_DEBUG, "nla_get hemu_onoff: %d\n", *hemu_onoff);
++	*mu_onoff = nla_get_u8(attr);
++	wpa_printf(MSG_DEBUG, "nla_get mu_onoff: %d\n", *mu_onoff);
 +
 +	return 0;
 +}
 +
-+static int nl80211_hemu_dump(void *priv, u8 *hemu_onoff)
++static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
 +{
 +	struct i802_bss *bss = priv;
 +	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -375,15 +375,15 @@
 +	struct nlattr *attr;
 +	int ret;
 +
-+	if (!drv->mtk_hemu_vendor_cmd_avail) {
++	if (!drv->mtk_mu_vendor_cmd_avail) {
 +		wpa_printf(MSG_INFO,
-+			   "nl80211: Driver does not support setting hemu control");
++			   "nl80211: Driver does not support setting mu control");
 +		return 0;
 +	}
 +
 +	if (!(msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_VENDOR)) ||
 +		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
-+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL)) {
++		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL)) {
 +		nlmsg_free(msg);
 +		return -ENOBUFS;
 +	}
@@ -396,10 +396,10 @@
 +
 +	nla_nest_end(msg, attr);
 +
-+	ret = send_and_recv_msgs(drv, msg, hemu_dump_handler, hemu_onoff, NULL, NULL);
++	ret = send_and_recv_msgs(drv, msg, mu_dump_handler, mu_onoff, NULL, NULL);
 +
 +	if(ret){
-+		wpa_printf(MSG_ERROR, "Failed to get hemu_onoff. ret=%d (%s)", ret, strerror(-ret));
++		wpa_printf(MSG_ERROR, "Failed to get mu_onoff. ret=%d (%s)", ret, strerror(-ret));
 +	}
 +
 +	return ret;
@@ -414,8 +414,8 @@
  	.update_connect_params = nl80211_update_connection_params,
  	.send_external_auth_status = nl80211_send_external_auth_status,
  	.set_4addr_mode = nl80211_set_4addr_mode,
-+	.hemu_ctrl = nl80211_hemu_muruonoff,
-+	.hemu_dump = nl80211_hemu_dump,
++	.mu_ctrl = nl80211_mu_onoff,
++	.mu_dump = nl80211_mu_dump,
  #ifdef CONFIG_DPP
  	.dpp_listen = nl80211_dpp_listen,
  #endif /* CONFIG_DPP */
@@ -427,7 +427,7 @@
  	unsigned int brcm_do_acs:1;
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
-+	unsigned int mtk_hemu_vendor_cmd_avail:1;
++	unsigned int mtk_mu_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
  	u64 remain_on_chan_cookie;
@@ -439,8 +439,8 @@
  				case MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL :
  					drv->mtk_edcca_vendor_cmd_avail = 1;
  					break;
-+				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
-+					drv->mtk_hemu_vendor_cmd_avail = 1;
++				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
++					drv->mtk_mu_vendor_cmd_avail = 1;
 +					break;
  				}
  			}
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
index 4bc3fcd..8ca8c55 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch
@@ -74,9 +74,9 @@
 index 4598737a3..a1d83e4ee 100644
 --- a/src/ap/ap_drv_ops.c
 +++ b/src/ap/ap_drv_ops.c
-@@ -1053,3 +1053,14 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff)
+@@ -1053,3 +1053,14 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff)
  		return 0;
- 	return hapd->driver->hemu_dump(hapd->drv_priv, hemu_onoff);
+ 	return hapd->driver->mu_dump(hapd->drv_priv, mu_onoff);
  }
 +
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd)
@@ -95,8 +95,8 @@
 +++ b/src/ap/ap_drv_ops.h
 @@ -144,6 +144,7 @@ int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd,
  int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
 +int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  
  #include "drivers/driver.h"
@@ -107,7 +107,7 @@
 +++ b/src/ap/hostapd.c
 @@ -2304,6 +2304,8 @@ dfs_offload:
  		goto fail;
- 	if (hostapd_drv_hemu_ctrl(hapd) < 0)
+ 	if (hostapd_drv_mu_ctrl(hapd) < 0)
  		goto fail;
 +	if (hostapd_drv_three_wire_ctrl(hapd) < 0)
 +		goto fail;
@@ -119,7 +119,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,6 +13,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 +	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -154,8 +154,8 @@
 +++ b/src/drivers/driver.h
 @@ -4693,6 +4693,14 @@ struct wpa_driver_ops {
  	 */
- 	 int (*hemu_ctrl)(void *priv, u8 hemu_onoff);
- 	 int (*hemu_dump)(void *priv, u8 *hemu_onoff);
+ 	 int (*mu_ctrl)(void *priv, u8 mu_onoff);
+ 	 int (*mu_dump)(void *priv, u8 *mu_onoff);
 +
 +	/**
 +	 * three_wire_ctrl - set three_wire_ctrl mode
@@ -223,7 +223,7 @@
 @@ -183,6 +183,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int uses_6ghz:1;
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
 +	unsigned int mtk_3wire_vendor_cmd_avail:1;
  
  	u64 vendor_scan_cookie;
@@ -233,8 +233,8 @@
 --- a/src/drivers/driver_nl80211_capa.c
 +++ b/src/drivers/driver_nl80211_capa.c
 @@ -1059,6 +1059,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
- 				case MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL :
- 					drv->mtk_hemu_vendor_cmd_avail = 1;
+ 				case MTK_NL80211_VENDOR_SUBCMD_MU_CTRL :
+ 					drv->mtk_mu_vendor_cmd_avail = 1;
  					break;
 +				case MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL :
 +					drv->mtk_3wire_vendor_cmd_avail = 1;
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
index 6bfe3d0..fc38b4f 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch
@@ -38,7 +38,7 @@
 index 5f71aeea9..c881d3717 100644
 --- a/hostapd/ctrl_iface.c
 +++ b/hostapd/ctrl_iface.c
-@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_hemu(struct hostapd_data *hapd, char *buf,
+@@ -3498,6 +3498,30 @@ hostapd_ctrl_iface_get_mu(struct hostapd_data *hapd, char *buf,
  }
  
  
@@ -71,8 +71,8 @@
  					      int reply_size,
 @@ -4055,6 +4079,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
  							  reply_size);
- 	} else if (os_strncmp(buf, "GET_HEMU", 8) == 0) {
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 	} else if (os_strncmp(buf, "GET_MU", 6) == 0) {
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
 +		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
  	} else {
@@ -165,8 +165,8 @@
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
 @@ -145,6 +145,8 @@ int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value);
- int hostapd_drv_hemu_ctrl(struct hostapd_data *hapd);
- int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+ int hostapd_drv_mu_ctrl(struct hostapd_data *hapd);
+ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
 +int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -191,7 +191,7 @@
 --- a/src/common/mtk_vendor.h
 +++ b/src/common/mtk_vendor.h
 @@ -13,7 +13,8 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
+ 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
  	MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL= 0xc6,
  	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
 -	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8
@@ -200,8 +200,8 @@
  };
  
  enum mtk_vendor_attr_edcca_ctrl {
-@@ -204,6 +205,38 @@ enum mtk_vendor_attr_hemu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_HEMU_CTRL - 1
+@@ -204,6 +205,38 @@ enum mtk_vendor_attr_mu_ctrl {
+ 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
  };
  
 +enum mtk_vendor_attr_ibf_ctrl {
@@ -244,9 +244,9 @@
 --- a/src/drivers/driver.h
 +++ b/src/drivers/driver.h
 @@ -1628,6 +1628,11 @@ struct wpa_driver_ap_params {
- 	 * hemu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
+ 	 * mu onoff=<val> (bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0))
  	 */
- 	u8 hemu_onoff;
+ 	u8 mu_onoff;
 +
 +	/**
 +	 * ibf_enable=<val>
@@ -406,7 +406,7 @@
 +++ b/src/drivers/driver_nl80211.h
 @@ -184,6 +184,7 @@ struct wpa_driver_nl80211_data {
  	unsigned int mtk_edcca_vendor_cmd_avail:1;
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
 +	unsigned int mtk_ibf_vendor_cmd_avail:1;
  
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
index 8a387a7..3237aa3 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0010-hostapd-mtk-Add-DFS-and-ZWDFS-support.patch
@@ -133,7 +133,7 @@
  					      char *buf, char *reply,
  					      int reply_size,
 @@ -4081,6 +4171,11 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
- 		reply_len = hostapd_ctrl_iface_get_hemu(hapd, reply, reply_size);
+ 		reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
  	} else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
  		reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
 +	} else if (os_strncmp(buf, "DFS_DETECT_MODE ", 16) == 0) {
diff --git a/recipes-wifi/wpa-supplicant/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch b/recipes-wifi/wpa-supplicant/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
index ed796c1..dba90d1 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
+++ b/recipes-wifi/wpa-supplicant/files/patches/mtk-0011-hostapd-mtk-Add-amsdu-set-get-ctrl.patch
@@ -162,7 +162,7 @@
 index ab9aedcee..4406666fd 100644
 --- a/src/ap/ap_drv_ops.h
 +++ b/src/ap/ap_drv_ops.h
-@@ -147,6 +147,8 @@ int hostapd_drv_hemu_dump(struct hostapd_data *hapd, u8 *hemu_onoff);
+@@ -147,6 +147,8 @@ int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff);
  int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd);
  int hostapd_drv_ibf_dump(struct hostapd_data *hapd, u8 *ibf_enable);
@@ -374,7 +374,7 @@
 --- a/src/drivers/driver_nl80211.h
 +++ b/src/drivers/driver_nl80211.h
 @@ -185,6 +185,7 @@ struct wpa_driver_nl80211_data {
- 	unsigned int mtk_hemu_vendor_cmd_avail:1;
+ 	unsigned int mtk_mu_vendor_cmd_avail:1;
  	unsigned int mtk_3wire_vendor_cmd_avail:1;
  	unsigned int mtk_ibf_vendor_cmd_avail:1;
 +	unsigned int mtk_wireless_vendor_cmd_avail:1;
diff --git a/recipes-wifi/wpa-supplicant/files/patches/patches.inc b/recipes-wifi/wpa-supplicant/files/patches/patches.inc
index 4fcacd1..b2f59b9 100644
--- a/recipes-wifi/wpa-supplicant/files/patches/patches.inc
+++ b/recipes-wifi/wpa-supplicant/files/patches/patches.inc
@@ -67,7 +67,7 @@
     file://mtk-0003-hostapd-mtk-add-support-for-runtime-set-in-band-disc.patch \
     file://mtk-0004-hostapd-mtk-Add-mtk_vendor.h.patch \
     file://mtk-0005-hostapd-mtk-Support-EDCCA-hostapd-configuration.patch \
-    file://mtk-0006-hostapd-mtk-Add-hostapd-HEMU-SET-GET-control.patch \
+    file://mtk-0006-hostapd-mtk-Add-hostapd-MU-SET-GET-control.patch \
     file://mtk-0007-hostapd-mtk-Add-three-wire-PTA-ctrl-hostapd-vendor-c.patch \
     file://mtk-0008-hostapd-mtk-Add-hostapd-iBF-control.patch \
     file://mtk-0009-hostapd-mtk-Do-not-include-HE-capab-IE-if-associated.patch \