Revert "[wpa_supplicant] Cumulative patch from b8491ae5a"

This reverts commit 878cf7bcbf2d7d8f08c3d060b8c5fbfcf0743eda.

Reason for revert: git_master/sdk_phone_armv7-sdk

Change-Id: I6070fc5c1f9c20867f6dfce90e529e35578d572e
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 8a5cdb8..e7c8f31 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -102,20 +102,6 @@
 };
 
 /**
- * struct hostapd_wmm_rule - WMM regulatory rule
- * @min_cwmin: Lower bound of CW_min value
- * @min_cwmax: Lower bound of CW_max value
- * @min_aifs: Lower bound of AIFS value
- * @max_txop: Upper bound of TXOP, value in units of 32 usec
- */
-struct hostapd_wmm_rule {
-	int min_cwmin;
-	int min_cwmax;
-	int min_aifs;
-	int max_txop;
-};
-
-/**
  * struct hostapd_channel_data - Channel information
  */
 struct hostapd_channel_data {
@@ -170,48 +156,34 @@
 	 * dfs_cac_ms - DFS CAC time in milliseconds
 	 */
 	unsigned int dfs_cac_ms;
-
-	/**
-	 * wmm_rules_valid - Indicates wmm_rules state
-	 */
-	int wmm_rules_valid;
-
-	/**
-	 * wmm_rules - WMM regulatory rules
-	 */
-	struct hostapd_wmm_rule wmm_rules[WMM_AC_NUM];
 };
 
-#define HE_MAX_MAC_CAPAB_SIZE	6
-#define HE_MAX_PHY_CAPAB_SIZE	11
-#define HE_MAX_MCS_CAPAB_SIZE	12
-#define HE_MAX_PPET_CAPAB_SIZE	25
+#define HE_MAX_NUM_SS 		8
+#define HE_MAX_PHY_CAPAB_SIZE	3
+
+/**
+ * struct he_ppe_threshold - IEEE 802.11ax HE PPE Threshold
+ */
+struct he_ppe_threshold {
+	u32 numss_m1;
+	u32 ru_count;
+	u32 ppet16_ppet8_ru3_ru0[HE_MAX_NUM_SS];
+};
 
 /**
  * struct he_capabilities - IEEE 802.11ax HE capabilities
  */
 struct he_capabilities {
 	u8 he_supported;
-	u8 phy_cap[HE_MAX_PHY_CAPAB_SIZE];
-	u8 mac_cap[HE_MAX_MAC_CAPAB_SIZE];
-	u8 mcs[HE_MAX_MCS_CAPAB_SIZE];
-	u8 ppet[HE_MAX_PPET_CAPAB_SIZE];
+	u32 phy_cap[HE_MAX_PHY_CAPAB_SIZE];
+	u32 mac_cap;
+	u32 mcs;
+	struct he_ppe_threshold ppet;
 };
 
 #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
 #define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1)
 
-
-enum ieee80211_op_mode {
-	IEEE80211_MODE_INFRA = 0,
-	IEEE80211_MODE_IBSS = 1,
-	IEEE80211_MODE_AP = 2,
-	IEEE80211_MODE_MESH = 5,
-
-	/* only add new entries before IEEE80211_MODE_NUM */
-	IEEE80211_MODE_NUM
-};
-
 /**
  * struct hostapd_hw_modes - Supported hardware mode information
  */
@@ -271,10 +243,15 @@
 	/**
 	 * he_capab - HE (IEEE 802.11ax) capabilities
 	 */
-	struct he_capabilities he_capab[IEEE80211_MODE_NUM];
+	struct he_capabilities he_capab;
 };
 
 
+#define IEEE80211_MODE_INFRA	0
+#define IEEE80211_MODE_IBSS	1
+#define IEEE80211_MODE_AP	2
+#define IEEE80211_MODE_MESH	5
+
 #define IEEE80211_CAP_ESS	0x0001
 #define IEEE80211_CAP_IBSS	0x0002
 #define IEEE80211_CAP_PRIVACY	0x0010
@@ -722,11 +699,6 @@
 	int vht_enabled;
 
 	/**
-	 * he_enabled - Whether HE is enabled
-	 */
-	int he_enabled;
-
-	/**
 	 * center_freq1 - Segment 0 center frequency in MHz
 	 *
 	 * Valid for both HT and VHT.
@@ -1150,11 +1122,6 @@
 	HIDDEN_SSID_ZERO_CONTENTS
 };
 
-enum ch_switch_state {
-	CH_SW_STARTED,
-	CH_SW_FINISHED
-};
-
 struct wowlan_triggers {
 	u8 any;
 	u8 disconnect;
@@ -1785,7 +1752,6 @@
 struct hostap_sta_driver_data {
 	unsigned long rx_packets, tx_packets;
 	unsigned long long rx_bytes, tx_bytes;
-	unsigned long long rx_airtime, tx_airtime;
 	int bytes_64bit; /* whether 64-bit byte counters are supported */
 	unsigned long current_tx_rate;
 	unsigned long current_rx_rate;
@@ -1795,8 +1761,6 @@
 	unsigned long tx_retry_failed;
 	unsigned long tx_retry_count;
 	s8 last_ack_rssi;
-	unsigned long backlog_packets;
-	unsigned long backlog_bytes;
 	s8 signal;
 	u8 rx_vhtmcs;
 	u8 tx_vhtmcs;
@@ -1817,8 +1781,6 @@
 	const struct ieee80211_vht_capabilities *vht_capabilities;
 	int vht_opmode_enabled;
 	u8 vht_opmode;
-	const struct ieee80211_he_capabilities *he_capab;
-	size_t he_capab_len;
 	u32 flags; /* bitmask of WPA_STA_* flags */
 	u32 flags_mask; /* unset bits in flags */
 #ifdef CONFIG_MESH
@@ -2375,7 +2337,7 @@
 	 *
 	 * Returns: 0 on success, -1 on failure
 	 */
-	int (*deauthenticate)(void *priv, const u8 *addr, u16 reason_code);
+	int (*deauthenticate)(void *priv, const u8 *addr, int reason_code);
 
 	/**
 	 * associate - Request driver to associate
@@ -2844,7 +2806,7 @@
 	 * a Deauthentication frame to be sent to it.
 	 */
 	int (*sta_deauth)(void *priv, const u8 *own_addr, const u8 *addr,
-			  u16 reason);
+			  int reason);
 
 	/**
 	 * sta_disassoc - Disassociate a station (AP only)
@@ -2858,7 +2820,7 @@
 	 * a Disassociation frame to be sent to it.
 	 */
 	int (*sta_disassoc)(void *priv, const u8 *own_addr, const u8 *addr,
-			    u16 reason);
+			    int reason);
 
 	/**
 	 * sta_remove - Remove a station entry (AP only)
@@ -2976,16 +2938,6 @@
 			     unsigned int flags_and);
 
 	/**
-	 * sta_set_airtime_weight - Set station airtime weight (AP only)
-	 * @priv: Private driver interface data
-	 * @addr: Station address
-	 * @weight: New weight for station airtime assignment
-	 * Returns: 0 on success, -1 on failure
-	 */
-	int (*sta_set_airtime_weight)(void *priv, const u8 *addr,
-				      unsigned int weight);
-
-	/**
 	 * set_tx_queue_params - Set TX queue parameters
 	 * @priv: Private driver interface data
 	 * @queue: Queue number (0 = VO, 1 = VI, 2 = BE, 3 = BK)
@@ -4023,18 +3975,6 @@
 	int (*leave_mesh)(void *priv);
 
 	/**
-	 * probe_mesh_link - Inject a frame over direct mesh link to a given
-	 *	peer skipping the next_hop lookup from mpath table.
-	 * @priv: Private driver interface data
-	 * @addr: Peer MAC address
-	 * @eth: Ethernet frame to be sent
-	 * @len: Ethernet frame lengtn in bytes
-	 * Returns 0 on success, -1 on failure
-	 */
-	int (*probe_mesh_link)(void *priv, const u8 *addr, const u8 *eth,
-			       size_t len);
-
-	/**
 	 * do_acs - Automatically select channel
 	 * @priv: Private driver interface data
 	 * @params: Parameters for ACS
@@ -4227,21 +4167,6 @@
 	 * Returns: 0 on success, < 0 on failure
 	 */
 	int (*set_4addr_mode)(void *priv, const char *bridge_ifname, int val);
-
-	/**
-	 * update_dh_ie - Update DH IE
-	 * @priv: Private driver interface data
-	 * @peer_mac: Peer MAC address
-	 * @reason_code: Reacon code
-	 * @ie: DH IE
-	 * @ie_len: DH IE length in bytes
-	 * Returns: 0 on success, -1 on failure
-	 *
-	 * This callback is used to let the driver know the DH processing result
-	 * and DH IE for a pending association.
-	 */
-	int (*update_dh_ie)(void *priv, const u8 *peer_mac, u16 reason_code,
-			    const u8 *ie, size_t ie_len);
 };
 
 /**
@@ -4616,15 +4541,6 @@
 	EVENT_CH_SWITCH,
 
 	/**
-	 * EVENT_CH_SWITCH_STARTED - AP or GO started to switch channels
-	 *
-	 * This is a pre-switch event indicating the shortly following switch
-	 * of operating channels.
-	 *
-	 * Described in wpa_event_data.ch_switch
-	 */
-	EVENT_CH_SWITCH_STARTED,
-	/**
 	 * EVENT_WNM - Request WNM operation
 	 *
 	 * This event can be used to request a WNM operation to be performed.
@@ -4787,11 +4703,6 @@
 	 * This event is emitted when an interface is added/removed for WDS STA.
 	 */
 	EVENT_WDS_STA_INTERFACE_STATUS,
-
-	/**
-	  * EVENT_UPDATE_DH - Notification of updated DH information
-	  */
-	EVENT_UPDATE_DH,
 };
 
 
@@ -5625,15 +5536,6 @@
 			INTERFACE_REMOVED
 		} istatus;
 	} wds_sta_interface;
-
-	/**
-	 * struct update_dh - Data for EVENT_UPDATE_DH
-	 */
-	struct update_dh {
-		const u8 *peer;
-		const u8 *ie;
-		size_t ie_len;
-	} update_dh;
 };
 
 /**
diff --git a/src/drivers/driver_atheros.c b/src/drivers/driver_atheros.c
index 840d4ff..807cd94 100644
--- a/src/drivers/driver_atheros.c
+++ b/src/drivers/driver_atheros.c
@@ -86,7 +86,7 @@
 };
 
 static int atheros_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-			      u16 reason_code);
+			      int reason_code);
 static int atheros_set_privacy(void *priv, int enabled);
 
 static const char * athr_get_ioctl_name(int op)
@@ -761,7 +761,7 @@
 
 static int
 atheros_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-		   u16 reason_code)
+		   int reason_code)
 {
 	struct atheros_driver_data *drv = priv;
 	struct ieee80211req_mlme mlme;
@@ -785,7 +785,7 @@
 
 static int
 atheros_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-		     u16 reason_code)
+		     int reason_code)
 {
 	struct atheros_driver_data *drv = priv;
 	struct ieee80211req_mlme mlme;
diff --git a/src/drivers/driver_bsd.c b/src/drivers/driver_bsd.c
index 82ca061..4675496 100644
--- a/src/drivers/driver_bsd.c
+++ b/src/drivers/driver_bsd.c
@@ -663,7 +663,7 @@
 #undef WPA_OUI_TYPE
 
 static int bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-			  u16 reason_code);
+			  int reason_code);
 
 static const char *
 ether_sprintf(const u8 *addr)
@@ -755,7 +755,7 @@
 }
 
 static int
-bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, u16 reason_code)
+bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, int reason_code)
 {
 	return bsd_send_mlme_param(priv, IEEE80211_MLME_DEAUTH, reason_code,
 				   addr);
@@ -763,7 +763,7 @@
 
 static int
 bsd_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-		 u16 reason_code)
+		 int reason_code)
 {
 	return bsd_send_mlme_param(priv, IEEE80211_MLME_DISASSOC, reason_code,
 				   addr);
@@ -1026,7 +1026,7 @@
 }
 
 static int
-wpa_driver_bsd_deauthenticate(void *priv, const u8 *addr, u16 reason_code)
+wpa_driver_bsd_deauthenticate(void *priv, const u8 *addr, int reason_code)
 {
 	return bsd_send_mlme_param(priv, IEEE80211_MLME_DEAUTH, reason_code,
 				   addr);
diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c
index 731c6a3..e55e6cd 100644
--- a/src/drivers/driver_common.c
+++ b/src/drivers/driver_common.c
@@ -67,7 +67,6 @@
 	E2S(DRIVER_CLIENT_POLL_OK);
 	E2S(EAPOL_TX_STATUS);
 	E2S(CH_SWITCH);
-	E2S(CH_SWITCH_STARTED);
 	E2S(WNM);
 	E2S(CONNECT_FAILED_REASON);
 	E2S(DFS_RADAR_DETECTED);
@@ -88,7 +87,6 @@
 	E2S(STATION_OPMODE_CHANGED);
 	E2S(INTERFACE_MAC_CHANGED);
 	E2S(WDS_STA_INTERFACE_STATUS);
-	E2S(UPDATE_DH);
 	}
 
 	return "UNKNOWN";
diff --git a/src/drivers/driver_hostap.c b/src/drivers/driver_hostap.c
index 186eccb..61b39b1 100644
--- a/src/drivers/driver_hostap.c
+++ b/src/drivers/driver_hostap.c
@@ -1028,7 +1028,7 @@
 
 
 static int hostap_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-			     u16 reason)
+			     int reason)
 {
 	struct hostap_driver_data *drv = priv;
 	struct ieee80211_mgmt mgmt;
@@ -1076,7 +1076,7 @@
 
 
 static int hostap_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-			       u16 reason)
+			       int reason)
 {
 	struct hostap_driver_data *drv = priv;
 	struct ieee80211_mgmt mgmt;
diff --git a/src/drivers/driver_macsec_linux.c b/src/drivers/driver_macsec_linux.c
index e922503..9d981bb 100644
--- a/src/drivers/driver_macsec_linux.c
+++ b/src/drivers/driver_macsec_linux.c
@@ -1,7 +1,6 @@
 /*
  * Driver interaction with Linux MACsec kernel module
  * Copyright (c) 2016, Sabrina Dubroca <sd@queasysnail.net> and Red Hat, Inc.
- * Copyright (c) 2019, The Linux Foundation
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -23,7 +22,6 @@
 
 #include "utils/common.h"
 #include "utils/eloop.h"
-#include "common/eapol_common.h"
 #include "pae/ieee802_1x_kay.h"
 #include "driver.h"
 #include "driver_wired_common.h"
@@ -59,7 +57,6 @@
 	char ifname[IFNAMSIZ + 1];
 	int ifi;
 	int parent_ifi;
-	int use_pae_group_addr;
 
 	Boolean created_link;
 
@@ -1402,214 +1399,6 @@
 }
 
 
-#ifdef __linux__
-
-static void macsec_drv_handle_data(void *ctx, unsigned char *buf, size_t len)
-{
-#ifdef HOSTAPD
-	struct ieee8023_hdr *hdr;
-	u8 *pos, *sa;
-	size_t left;
-	union wpa_event_data event;
-
-	/* must contain at least ieee8023_hdr 6 byte source, 6 byte dest,
-	 * 2 byte ethertype */
-	if (len < 14) {
-		wpa_printf(MSG_MSGDUMP, "%s: too short (%lu)",
-			   __func__, (unsigned long) len);
-		return;
-	}
-
-	hdr = (struct ieee8023_hdr *) buf;
-
-	switch (ntohs(hdr->ethertype)) {
-	case ETH_P_PAE:
-		wpa_printf(MSG_MSGDUMP, "Received EAPOL packet");
-		sa = hdr->src;
-		os_memset(&event, 0, sizeof(event));
-		event.new_sta.addr = sa;
-		wpa_supplicant_event(ctx, EVENT_NEW_STA, &event);
-
-		pos = (u8 *) (hdr + 1);
-		left = len - sizeof(*hdr);
-		drv_event_eapol_rx(ctx, sa, pos, left);
-		break;
-
-	default:
-		wpa_printf(MSG_DEBUG, "Unknown ethertype 0x%04x in data frame",
-			   ntohs(hdr->ethertype));
-		break;
-	}
-#endif /* HOSTAPD */
-}
-
-
-static void macsec_drv_handle_read(int sock, void *eloop_ctx, void *sock_ctx)
-{
-	int len;
-	unsigned char buf[3000];
-
-	len = recv(sock, buf, sizeof(buf), 0);
-	if (len < 0) {
-		wpa_printf(MSG_ERROR, "macsec_linux: recv: %s",
-			   strerror(errno));
-		return;
-	}
-
-	macsec_drv_handle_data(eloop_ctx, buf, len);
-}
-
-#endif /* __linux__ */
-
-
-static int macsec_drv_init_sockets(struct macsec_drv_data *drv, u8 *own_addr)
-{
-#ifdef __linux__
-	struct ifreq ifr;
-	struct sockaddr_ll addr;
-
-	drv->common.sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_PAE));
-	if (drv->common.sock < 0) {
-		wpa_printf(MSG_ERROR, "socket[PF_PACKET,SOCK_RAW]: %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	if (eloop_register_read_sock(drv->common.sock, macsec_drv_handle_read,
-				     drv->common.ctx, NULL)) {
-		wpa_printf(MSG_INFO, "Could not register read socket");
-		return -1;
-	}
-
-	os_memset(&ifr, 0, sizeof(ifr));
-	os_strlcpy(ifr.ifr_name, drv->common.ifname, sizeof(ifr.ifr_name));
-	if (ioctl(drv->common.sock, SIOCGIFINDEX, &ifr) != 0) {
-		wpa_printf(MSG_ERROR, "ioctl(SIOCGIFINDEX): %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	os_memset(&addr, 0, sizeof(addr));
-	addr.sll_family = AF_PACKET;
-	addr.sll_ifindex = ifr.ifr_ifindex;
-	wpa_printf(MSG_DEBUG, "Opening raw packet socket for ifindex %d",
-		   addr.sll_ifindex);
-
-	if (bind(drv->common.sock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
-	{
-		wpa_printf(MSG_ERROR, "bind: %s", strerror(errno));
-		return -1;
-	}
-
-	/* filter multicast address */
-	if (wired_multicast_membership(drv->common.sock, ifr.ifr_ifindex,
-				       pae_group_addr, 1) < 0) {
-		wpa_printf(MSG_ERROR, "wired: Failed to add multicast group "
-			   "membership");
-		return -1;
-	}
-
-	os_memset(&ifr, 0, sizeof(ifr));
-	os_strlcpy(ifr.ifr_name, drv->common.ifname, sizeof(ifr.ifr_name));
-	if (ioctl(drv->common.sock, SIOCGIFHWADDR, &ifr) != 0) {
-		wpa_printf(MSG_ERROR, "ioctl(SIOCGIFHWADDR): %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
-		wpa_printf(MSG_INFO, "Invalid HW-addr family 0x%04x",
-			   ifr.ifr_hwaddr.sa_family);
-		return -1;
-	}
-	os_memcpy(own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
-
-	return 0;
-#else /* __linux__ */
-	return -1;
-#endif /* __linux__ */
-}
-
-
-static void * macsec_drv_hapd_init(struct hostapd_data *hapd,
-				   struct wpa_init_params *params)
-{
-	struct macsec_drv_data *drv;
-
-	drv = os_zalloc(sizeof(struct macsec_drv_data));
-	if (drv == NULL) {
-		wpa_printf(MSG_INFO,
-			   "Could not allocate memory for wired driver data");
-		return NULL;
-	}
-
-	drv->common.ctx = hapd;
-	os_strlcpy(drv->common.ifname, params->ifname,
-		   sizeof(drv->common.ifname));
-	drv->use_pae_group_addr = params->use_pae_group_addr;
-
-	if (macsec_drv_init_sockets(drv, params->own_addr)) {
-		os_free(drv);
-		return NULL;
-	}
-
-	return drv;
-}
-
-
-static void macsec_drv_hapd_deinit(void *priv)
-{
-	struct macsec_drv_data *drv = priv;
-
-	if (drv->common.sock >= 0) {
-		eloop_unregister_read_sock(drv->common.sock);
-		close(drv->common.sock);
-	}
-
-	os_free(drv);
-}
-
-
-static int macsec_drv_send_eapol(void *priv, const u8 *addr,
-				 const u8 *data, size_t data_len, int encrypt,
-				 const u8 *own_addr, u32 flags)
-{
-	struct macsec_drv_data *drv = priv;
-	struct ieee8023_hdr *hdr;
-	size_t len;
-	u8 *pos;
-	int res;
-
-	len = sizeof(*hdr) + data_len;
-	hdr = os_zalloc(len);
-	if (hdr == NULL) {
-		wpa_printf(MSG_INFO,
-			   "%s: malloc() failed (len=%lu)",
-			   __func__, (unsigned long) len);
-		return -1;
-	}
-
-	os_memcpy(hdr->dest, drv->use_pae_group_addr ? pae_group_addr : addr,
-		  ETH_ALEN);
-	os_memcpy(hdr->src, own_addr, ETH_ALEN);
-	hdr->ethertype = htons(ETH_P_PAE);
-
-	pos = (u8 *) (hdr + 1);
-	os_memcpy(pos, data, data_len);
-
-	res = send(drv->common.sock, (u8 *) hdr, len, 0);
-	os_free(hdr);
-
-	if (res < 0) {
-		wpa_printf(MSG_ERROR,
-			   "%s: packet len: %lu - failed: send: %s",
-			   __func__, (unsigned long) len, strerror(errno));
-	}
-
-	return res;
-}
-
-
 const struct wpa_driver_ops wpa_driver_macsec_linux_ops = {
 	.name = "macsec_linux",
 	.desc = "MACsec Ethernet driver for Linux",
@@ -1618,9 +1407,6 @@
 	.get_capa = driver_wired_get_capa,
 	.init = macsec_drv_wpa_init,
 	.deinit = macsec_drv_wpa_deinit,
-	.hapd_init = macsec_drv_hapd_init,
-	.hapd_deinit = macsec_drv_hapd_deinit,
-	.hapd_send_eapol = macsec_drv_send_eapol,
 
 	.macsec_init = macsec_drv_macsec_init,
 	.macsec_deinit = macsec_drv_macsec_deinit,
diff --git a/src/drivers/driver_macsec_qca.c b/src/drivers/driver_macsec_qca.c
index f4e55d5..8372393 100644
--- a/src/drivers/driver_macsec_qca.c
+++ b/src/drivers/driver_macsec_qca.c
@@ -3,7 +3,6 @@
  * Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
  * Copyright (c) 2004, Gunter Burchardt <tira@isx.de>
  * Copyright (c) 2013-2014, Qualcomm Atheros, Inc.
- * Copyright (c) 2019, The Linux Foundation
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -30,7 +29,6 @@
 #include "utils/eloop.h"
 #include "common/defs.h"
 #include "common/ieee802_1x_defs.h"
-#include "common/eapol_common.h"
 #include "pae/ieee802_1x_kay.h"
 #include "driver.h"
 #include "driver_wired_common.h"
@@ -66,7 +64,6 @@
 struct macsec_qca_data {
 	struct driver_wired_common_data common;
 
-	int use_pae_group_addr;
 	u32 secy_id;
 
 	/* shadow */
@@ -129,134 +126,6 @@
 }
 
 
-#ifdef __linux__
-
-static void macsec_qca_handle_data(void *ctx, unsigned char *buf, size_t len)
-{
-#ifdef HOSTAPD
-	struct ieee8023_hdr *hdr;
-	u8 *pos, *sa;
-	size_t left;
-	union wpa_event_data event;
-
-	/* at least 6 bytes src macaddress, 6 bytes dst macaddress
-	 * and 2 bytes ethertype
-	*/
-	if (len < 14) {
-		wpa_printf(MSG_MSGDUMP,
-			   "macsec_qca_handle_data: too short (%lu)",
-			   (unsigned long) len);
-		return;
-	}
-	hdr = (struct ieee8023_hdr *) buf;
-
-	switch (ntohs(hdr->ethertype)) {
-	case ETH_P_PAE:
-		wpa_printf(MSG_MSGDUMP, "Received EAPOL packet");
-		sa = hdr->src;
-		os_memset(&event, 0, sizeof(event));
-		event.new_sta.addr = sa;
-		wpa_supplicant_event(ctx, EVENT_NEW_STA, &event);
-
-		pos = (u8 *) (hdr + 1);
-		left = len - sizeof(*hdr);
-		drv_event_eapol_rx(ctx, sa, pos, left);
-		break;
-	default:
-		wpa_printf(MSG_DEBUG, "Unknown ethertype 0x%04x in data frame",
-			   ntohs(hdr->ethertype));
-		break;
-	}
-#endif /* HOSTAPD */
-}
-
-
-static void macsec_qca_handle_read(int sock, void *eloop_ctx, void *sock_ctx)
-{
-	int len;
-	unsigned char buf[3000];
-
-	len = recv(sock, buf, sizeof(buf), 0);
-	if (len < 0) {
-		wpa_printf(MSG_ERROR, "macsec_qca: recv: %s", strerror(errno));
-		return;
-	}
-
-	macsec_qca_handle_data(eloop_ctx, buf, len);
-}
-
-#endif /* __linux__ */
-
-
-static int macsec_qca_init_sockets(struct macsec_qca_data *drv, u8 *own_addr)
-{
-#ifdef __linux__
-	struct ifreq ifr;
-	struct sockaddr_ll addr;
-
-	drv->common.sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_PAE));
-	if (drv->common.sock < 0) {
-		wpa_printf(MSG_ERROR, "socket[PF_PACKET,SOCK_RAW]: %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	if (eloop_register_read_sock(drv->common.sock, macsec_qca_handle_read,
-				     drv->common.ctx, NULL)) {
-		wpa_printf(MSG_INFO, "Could not register read socket");
-		return -1;
-	}
-
-	os_memset(&ifr, 0, sizeof(ifr));
-	os_strlcpy(ifr.ifr_name, drv->common.ifname, sizeof(ifr.ifr_name));
-	if (ioctl(drv->common.sock, SIOCGIFINDEX, &ifr) != 0) {
-		wpa_printf(MSG_ERROR, "ioctl(SIOCGIFINDEX): %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	os_memset(&addr, 0, sizeof(addr));
-	addr.sll_family = AF_PACKET;
-	addr.sll_ifindex = ifr.ifr_ifindex;
-	wpa_printf(MSG_DEBUG, "Opening raw packet socket for ifindex %d",
-		   addr.sll_ifindex);
-
-	if (bind(drv->common.sock, (struct sockaddr *) &addr,
-		 sizeof(addr)) < 0) {
-		wpa_printf(MSG_ERROR, "macsec_qca: bind: %s", strerror(errno));
-		return -1;
-	}
-
-	/* filter multicast address */
-	if (wired_multicast_membership(drv->common.sock, ifr.ifr_ifindex,
-				       pae_group_addr, 1) < 0) {
-		wpa_printf(MSG_ERROR,
-			"macsec_qca_init_sockets: Failed to add multicast group membership");
-		return -1;
-	}
-
-	os_memset(&ifr, 0, sizeof(ifr));
-	os_strlcpy(ifr.ifr_name, drv->common.ifname, sizeof(ifr.ifr_name));
-	if (ioctl(drv->common.sock, SIOCGIFHWADDR, &ifr) != 0) {
-		wpa_printf(MSG_ERROR, "ioctl(SIOCGIFHWADDR): %s",
-			   strerror(errno));
-		return -1;
-	}
-
-	if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
-		wpa_printf(MSG_INFO, "Invalid HW-addr family 0x%04x",
-			   ifr.ifr_hwaddr.sa_family);
-		return -1;
-	}
-	os_memcpy(own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
-
-	return 0;
-#else /* __linux__ */
-	return -1;
-#endif /* __linux__ */
-}
-
-
 static void * macsec_qca_init(void *ctx, const char *ifname)
 {
 	struct macsec_qca_data *drv;
@@ -291,97 +160,6 @@
 }
 
 
-static void * macsec_qca_hapd_init(struct hostapd_data *hapd,
-				   struct wpa_init_params *params)
-{
-	struct macsec_qca_data *drv;
-
-	drv = os_zalloc(sizeof(struct macsec_qca_data));
-	if (!drv) {
-		wpa_printf(MSG_INFO,
-			   "Could not allocate memory for macsec_qca driver data");
-		return NULL;
-	}
-
-	/* Board specific settings */
-	if (os_memcmp("eth2", params->ifname, 4) == 0)
-		drv->secy_id = 1;
-	else if (os_memcmp("eth3", params->ifname, 4) == 0)
-		drv->secy_id = 2;
-	else if (os_memcmp("eth4", params->ifname, 4) == 0)
-		drv->secy_id = 0;
-	else if (os_memcmp("eth5", params->ifname, 4) == 0)
-		drv->secy_id = 1;
-	else
-		drv->secy_id = -1;
-
-	drv->common.ctx = hapd;
-	os_strlcpy(drv->common.ifname, params->ifname,
-		   sizeof(drv->common.ifname));
-	drv->use_pae_group_addr = params->use_pae_group_addr;
-
-	if (macsec_qca_init_sockets(drv, params->own_addr)) {
-		os_free(drv);
-		return NULL;
-	}
-
-	return drv;
-}
-
-
-static void macsec_qca_hapd_deinit(void *priv)
-{
-	struct macsec_qca_data *drv = priv;
-
-	if (drv->common.sock >= 0) {
-		eloop_unregister_read_sock(drv->common.sock);
-		close(drv->common.sock);
-	}
-
-	os_free(drv);
-}
-
-
-static int macsec_qca_send_eapol(void *priv, const u8 *addr,
-				 const u8 *data, size_t data_len, int encrypt,
-				 const u8 *own_addr, u32 flags)
-{
-	struct macsec_qca_data *drv = priv;
-	struct ieee8023_hdr *hdr;
-	size_t len;
-	u8 *pos;
-	int res;
-
-	len = sizeof(*hdr) + data_len;
-	hdr = os_zalloc(len);
-	if (!hdr) {
-		wpa_printf(MSG_INFO,
-			   "malloc() failed for macsec_qca_send_eapol(len=%lu)",
-			   (unsigned long) len);
-		return -1;
-	}
-
-	os_memcpy(hdr->dest, drv->use_pae_group_addr ? pae_group_addr : addr,
-		  ETH_ALEN);
-	os_memcpy(hdr->src, own_addr, ETH_ALEN);
-	hdr->ethertype = htons(ETH_P_PAE);
-
-	pos = (u8 *) (hdr + 1);
-	os_memcpy(pos, data, data_len);
-
-	res = send(drv->common.sock, (u8 *) hdr, len, 0);
-	os_free(hdr);
-
-	if (res < 0) {
-		wpa_printf(MSG_ERROR,
-			   "macsec_qca_send_eapol - packet len: %lu - failed: send: %s",
-			   (unsigned long) len, strerror(errno));
-	}
-
-	return res;
-}
-
-
 static int macsec_qca_macsec_init(void *priv, struct macsec_init_params *params)
 {
 	struct macsec_qca_data *drv = priv;
@@ -1022,9 +800,6 @@
 	.get_capa = driver_wired_get_capa,
 	.init = macsec_qca_init,
 	.deinit = macsec_qca_deinit,
-	.hapd_init = macsec_qca_hapd_init,
-	.hapd_deinit = macsec_qca_hapd_deinit,
-	.hapd_send_eapol = macsec_qca_send_eapol,
 
 	.macsec_init = macsec_qca_macsec_init,
 	.macsec_deinit = macsec_qca_macsec_deinit,
diff --git a/src/drivers/driver_ndis.c b/src/drivers/driver_ndis.c
index 5b4b924..614c452 100644
--- a/src/drivers/driver_ndis.c
+++ b/src/drivers/driver_ndis.c
@@ -719,7 +719,7 @@
 
 
 static int wpa_driver_ndis_deauthenticate(void *priv, const u8 *addr,
-					  u16 reason_code)
+					  int reason_code)
 {
 	struct wpa_driver_ndis_data *drv = priv;
 	return wpa_driver_ndis_disconnect(drv);
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 45835a2..21d1398 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -236,7 +236,7 @@
 				   struct wpa_driver_mesh_bss_params *params);
 #endif /* CONFIG_MESH */
 static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-			     u16 reason);
+			     int reason);
 
 
 /* Converts nl80211_chan_width to a common format */
@@ -2010,8 +2010,9 @@
 	 */
 	drv->set_rekey_offload = 1;
 
-	drv->num_if_indices = ARRAY_SIZE(drv->default_if_indices);
+	drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
 	drv->if_indices = drv->default_if_indices;
+	drv->if_indices_reason = drv->default_if_indices_reason;
 
 	drv->first_bss = os_zalloc(sizeof(*drv->first_bss));
 	if (!drv->first_bss) {
@@ -2788,6 +2789,9 @@
 	if (drv->if_indices != drv->default_if_indices)
 		os_free(drv->if_indices);
 
+	if (drv->if_indices_reason != drv->default_if_indices_reason)
+		os_free(drv->if_indices_reason);
+
 	if (drv->disabled_11b_rates)
 		nl80211_disable_11b_rates(drv, drv->ifindex, 0);
 
@@ -3278,7 +3282,7 @@
 
 
 static int wpa_driver_nl80211_disconnect(struct wpa_driver_nl80211_data *drv,
-					 u16 reason_code,
+					 int reason_code,
 					 struct nl_handle *nl_connect)
 {
 	int ret;
@@ -3300,7 +3304,7 @@
 
 
 static int wpa_driver_nl80211_deauthenticate(struct i802_bss *bss,
-					     const u8 *addr, u16 reason_code)
+					     const u8 *addr, int reason_code)
 {
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	int ret;
@@ -4167,10 +4171,8 @@
 	     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)))
 		goto fail;
 
-	if (drv->device_ap_sme &&
-	    (params->key_mgmt_suites & WPA_KEY_MGMT_SAE) &&
-	    nla_put_flag(msg, NL80211_ATTR_EXTERNAL_AUTH_SUPPORT))
-		goto fail;
+	if (drv->device_ap_sme && (params->key_mgmt_suites & WPA_KEY_MGMT_SAE))
+	     nla_put_flag(msg, NL80211_ATTR_EXTERNAL_AUTH_SUPPORT);
 
 	wpa_printf(MSG_DEBUG, "nl80211: pairwise_ciphers=0x%x",
 		   params->pairwise_ciphers);
@@ -4348,11 +4350,10 @@
 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq))
 		return -ENOBUFS;
 
-	wpa_printf(MSG_DEBUG, "  * he_enabled=%d", freq->he_enabled);
 	wpa_printf(MSG_DEBUG, "  * vht_enabled=%d", freq->vht_enabled);
 	wpa_printf(MSG_DEBUG, "  * ht_enabled=%d", freq->ht_enabled);
 
-	if (freq->vht_enabled || freq->he_enabled) {
+	if (freq->vht_enabled) {
 		enum nl80211_chan_width cw;
 
 		wpa_printf(MSG_DEBUG, "  * bandwidth=%d", freq->bandwidth);
@@ -4427,8 +4428,8 @@
 	int ret;
 
 	wpa_printf(MSG_DEBUG,
-		   "nl80211: Set freq %d (ht_enabled=%d, vht_enabled=%d, he_enabled=%d, bandwidth=%d MHz, cf1=%d MHz, cf2=%d MHz)",
-		   freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled,
+		   "nl80211: Set freq %d (ht_enabled=%d, vht_enabled=%d, bandwidth=%d MHz, cf1=%d MHz, cf2=%d MHz)",
+		   freq->freq, freq->ht_enabled, freq->vht_enabled,
 		   freq->bandwidth, freq->center_freq1, freq->center_freq2);
 
 	msg = nl80211_drv_msg(drv, 0, set_chan ? NL80211_CMD_SET_CHANNEL :
@@ -4560,14 +4561,6 @@
 				goto fail;
 		}
 
-		if (params->he_capab) {
-			wpa_hexdump(MSG_DEBUG, "  * he_capab",
-				    params->he_capab, params->he_capab_len);
-			if (nla_put(msg, NL80211_ATTR_HE_CAPABILITY,
-				    params->he_capab_len, params->he_capab))
-				goto fail;
-		}
-
 		if (params->ext_capab) {
 			wpa_hexdump(MSG_DEBUG, "  * ext_capab",
 				    params->ext_capab, params->ext_capab_len);
@@ -5192,28 +5185,6 @@
 }
 
 
-static int driver_nl80211_sta_set_airtime_weight(void *priv, const u8 *addr,
-						 unsigned int weight)
-{
-	struct i802_bss *bss = priv;
-	struct nl_msg *msg;
-
-	wpa_printf(MSG_DEBUG,
-		   "nl80211: Set STA airtime weight - ifname=%s addr=" MACSTR
-		   " weight=%u", bss->ifname, MAC2STR(addr), weight);
-
-	if (!(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_STATION)) ||
-	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
-	    nla_put_u16(msg, NL80211_ATTR_AIRTIME_WEIGHT, weight))
-		goto fail;
-
-	return send_and_recv_msgs(bss->drv, msg, NULL, NULL);
-fail:
-	nlmsg_free(msg);
-	return -ENOBUFS;
-}
-
-
 static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
 				 struct wpa_driver_associate_params *params)
 {
@@ -6293,36 +6264,6 @@
 }
 
 
-static void get_sta_tid_stats(struct hostap_sta_driver_data *data,
-			      struct nlattr *attr)
-{
-	struct nlattr *tid_stats[NL80211_TID_STATS_MAX + 1], *tidattr;
-	struct nlattr *txq_stats[NL80211_TXQ_STATS_MAX + 1];
-	static struct nla_policy txq_stats_policy[NL80211_TXQ_STATS_MAX + 1] = {
-		[NL80211_TXQ_STATS_BACKLOG_BYTES] = { .type = NLA_U32 },
-		[NL80211_TXQ_STATS_BACKLOG_PACKETS] = { .type = NLA_U32 },
-	};
-	int rem;
-
-	nla_for_each_nested(tidattr, attr, rem) {
-		if (nla_parse_nested(tid_stats, NL80211_TID_STATS_MAX,
-				     tidattr, NULL) != 0 ||
-		    !tid_stats[NL80211_TID_STATS_TXQ_STATS] ||
-		    nla_parse_nested(txq_stats, NL80211_TXQ_STATS_MAX,
-				     tid_stats[NL80211_TID_STATS_TXQ_STATS],
-				     txq_stats_policy) != 0)
-			continue;
-		/* sum the backlogs over all TIDs for station */
-		if (txq_stats[NL80211_TXQ_STATS_BACKLOG_BYTES])
-			data->backlog_bytes += nla_get_u32(
-				txq_stats[NL80211_TXQ_STATS_BACKLOG_BYTES]);
-		if (txq_stats[NL80211_TXQ_STATS_BACKLOG_PACKETS])
-			data->backlog_bytes += nla_get_u32(
-				txq_stats[NL80211_TXQ_STATS_BACKLOG_PACKETS]);
-	}
-}
-
-
 static int get_sta_handler(struct nl_msg *msg, void *arg)
 {
 	struct nlattr *tb[NL80211_ATTR_MAX + 1];
@@ -6340,8 +6281,6 @@
 		[NL80211_STA_INFO_TX_BYTES64] = { .type = NLA_U64 },
 		[NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 },
 		[NL80211_STA_INFO_ACK_SIGNAL] = { .type = NLA_U8 },
-		[NL80211_STA_INFO_RX_DURATION] = { .type = NLA_U64 },
-		[NL80211_STA_INFO_TX_DURATION] = { .type = NLA_U64 },
 	};
 	struct nlattr *rate[NL80211_RATE_INFO_MAX + 1];
 	static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = {
@@ -6399,12 +6338,6 @@
 	if (stats[NL80211_STA_INFO_TX_PACKETS])
 		data->tx_packets =
 			nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
-	if (stats[NL80211_STA_INFO_RX_DURATION])
-		data->rx_airtime =
-			nla_get_u64(stats[NL80211_STA_INFO_RX_DURATION]);
-	if (stats[NL80211_STA_INFO_TX_DURATION])
-		data->tx_airtime =
-			nla_get_u64(stats[NL80211_STA_INFO_TX_DURATION]);
 	if (stats[NL80211_STA_INFO_TX_FAILED])
 		data->tx_retry_failed =
 			nla_get_u32(stats[NL80211_STA_INFO_TX_FAILED]);
@@ -6475,9 +6408,6 @@
 		}
 	}
 
-	if (stats[NL80211_STA_INFO_TID_STATS])
-		get_sta_tid_stats(data, stats[NL80211_STA_INFO_TID_STATS]);
-
 	return NL_SKIP;
 }
 
@@ -6618,7 +6548,7 @@
 
 
 static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-			   u16 reason)
+			   int reason)
 {
 	struct i802_bss *bss = priv;
 	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -6653,7 +6583,7 @@
 
 
 static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-			     u16 reason)
+			     int reason)
 {
 	struct i802_bss *bss = priv;
 	struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -6688,11 +6618,11 @@
 	end = pos + sizeof(buf);
 
 	for (i = 0; i < drv->num_if_indices; i++) {
-		if (!drv->if_indices[i].ifindex)
+		if (!drv->if_indices[i])
 			continue;
 		res = os_snprintf(pos, end - pos, " %d(%d)",
-				  drv->if_indices[i].ifindex,
-				  drv->if_indices[i].reason);
+				  drv->if_indices[i],
+				  drv->if_indices_reason[i]);
 		if (os_snprintf_error(end - pos, res))
 			break;
 		pos += res;
@@ -6708,7 +6638,7 @@
 		      int ifidx_reason)
 {
 	int i;
-	struct drv_nl80211_if_info *old;
+	int *old, *old_reason;
 
 	wpa_printf(MSG_DEBUG,
 		   "nl80211: Add own interface ifindex %d (ifidx_reason %d)",
@@ -6719,9 +6649,9 @@
 		return;
 	}
 	for (i = 0; i < drv->num_if_indices; i++) {
-		if (drv->if_indices[i].ifindex == 0) {
-			drv->if_indices[i].ifindex = ifidx;
-			drv->if_indices[i].reason = ifidx_reason;
+		if (drv->if_indices[i] == 0) {
+			drv->if_indices[i] = ifidx;
+			drv->if_indices_reason[i] = ifidx_reason;
 			dump_ifidx(drv);
 			return;
 		}
@@ -6732,13 +6662,29 @@
 	else
 		old = NULL;
 
+	if (drv->if_indices_reason != drv->default_if_indices_reason)
+		old_reason = drv->if_indices_reason;
+	else
+		old_reason = NULL;
+
 	drv->if_indices = os_realloc_array(old, drv->num_if_indices + 1,
-					   sizeof(*old));
+					   sizeof(int));
+	drv->if_indices_reason = os_realloc_array(old_reason,
+						  drv->num_if_indices + 1,
+						  sizeof(int));
 	if (!drv->if_indices) {
 		if (!old)
 			drv->if_indices = drv->default_if_indices;
 		else
 			drv->if_indices = old;
+	}
+	if (!drv->if_indices_reason) {
+		if (!old_reason)
+			drv->if_indices_reason = drv->default_if_indices_reason;
+		else
+			drv->if_indices_reason = old_reason;
+	}
+	if (!drv->if_indices || !drv->if_indices_reason) {
 		wpa_printf(MSG_ERROR, "Failed to reallocate memory for "
 			   "interfaces");
 		wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx);
@@ -6747,8 +6693,12 @@
 	if (!old)
 		os_memcpy(drv->if_indices, drv->default_if_indices,
 			  sizeof(drv->default_if_indices));
-	drv->if_indices[drv->num_if_indices].ifindex = ifidx;
-	drv->if_indices[drv->num_if_indices].reason = ifidx_reason;
+	if (!old_reason)
+		os_memcpy(drv->if_indices_reason,
+			  drv->default_if_indices_reason,
+			  sizeof(drv->default_if_indices_reason));
+	drv->if_indices[drv->num_if_indices] = ifidx;
+	drv->if_indices_reason[drv->num_if_indices] = ifidx_reason;
 	drv->num_if_indices++;
 	dump_ifidx(drv);
 }
@@ -6760,12 +6710,10 @@
 	int i;
 
 	for (i = 0; i < drv->num_if_indices; i++) {
-		if ((drv->if_indices[i].ifindex == ifidx ||
-		     ifidx == IFIDX_ANY) &&
-		    (drv->if_indices[i].reason == ifidx_reason ||
+		if ((drv->if_indices[i] == ifidx || ifidx == IFIDX_ANY) &&
+		    (drv->if_indices_reason[i] == ifidx_reason ||
 		     ifidx_reason == IFIDX_ANY)) {
-			drv->if_indices[i].ifindex = 0;
-			drv->if_indices[i].reason = 0;
+			drv->if_indices[i] = 0;
 			break;
 		}
 	}
@@ -6779,8 +6727,8 @@
 	int i;
 
 	for (i = 0; i < drv->num_if_indices; i++)
-		if (drv->if_indices[i].ifindex == ifidx &&
-		    (drv->if_indices[i].reason == ifidx_reason ||
+		if (drv->if_indices[i] == ifidx &&
+		    (drv->if_indices_reason[i] == ifidx_reason ||
 		     ifidx_reason == IFIDX_ANY))
 			return 1;
 
@@ -8422,8 +8370,8 @@
 	struct nl_msg *msg;
 	int ret;
 
-	wpa_printf(MSG_DEBUG, "nl80211: Start radar detection (CAC) %d MHz (ht_enabled=%d, vht_enabled=%d, he_enabled=%d, bandwidth=%d MHz, cf1=%d MHz, cf2=%d MHz)",
-		   freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled,
+	wpa_printf(MSG_DEBUG, "nl80211: Start radar detection (CAC) %d MHz (ht_enabled=%d, vht_enabled=%d, bandwidth=%d MHz, cf1=%d MHz, cf2=%d MHz)",
+		   freq->freq, freq->ht_enabled, freq->vht_enabled,
 		   freq->bandwidth, freq->center_freq1, freq->center_freq2);
 
 	if (!(drv->capa.flags & WPA_DRIVER_FLAGS_RADAR)) {
@@ -8635,7 +8583,7 @@
 
 
 static int driver_nl80211_deauthenticate(void *priv, const u8 *addr,
-					 u16 reason_code)
+					 int reason_code)
 {
 	struct i802_bss *bss = priv;
 	return wpa_driver_nl80211_deauthenticate(bss, addr, reason_code);
@@ -8750,35 +8698,6 @@
 }
 
 
-static int nl80211_update_dh_ie(void *priv, const u8 *peer_mac,
-				u16 reason_code, const u8 *ie, size_t ie_len)
-{
-	int ret;
-	struct nl_msg *msg;
-	struct i802_bss *bss = priv;
-	struct wpa_driver_nl80211_data *drv = bss->drv;
-
-	wpa_printf(MSG_DEBUG, "nl80211: Updating DH IE peer: " MACSTR
-		   " reason %u", MAC2STR(peer_mac), reason_code);
-	if (!(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_UPDATE_OWE_INFO)) ||
-	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_mac) ||
-	    nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, reason_code) ||
-	    (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) {
-		nlmsg_free(msg);
-		return -ENOBUFS;
-	}
-
-	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
-	if (ret) {
-		wpa_printf(MSG_DEBUG,
-			   "nl80211: update_dh_ie failed err=%d (%s)",
-			   ret, strerror(-ret));
-	}
-
-	return ret;
-}
-
-
 static const u8 * wpa_driver_nl80211_get_macaddr(void *priv)
 {
 	struct i802_bss *bss = priv;
@@ -9727,36 +9646,6 @@
 	return ret;
 }
 
-
-static int nl80211_probe_mesh_link(void *priv, const u8 *addr, const u8 *eth,
-				   size_t len)
-{
-	struct i802_bss *bss = priv;
-	struct wpa_driver_nl80211_data *drv = bss->drv;
-	struct nl_msg *msg;
-	int ret;
-
-	msg = nl80211_drv_msg(drv, 0, NL80211_CMD_PROBE_MESH_LINK);
-	if (!msg ||
-	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
-	    nla_put(msg, NL80211_ATTR_FRAME, len, eth)) {
-		nlmsg_free(msg);
-		return -ENOBUFS;
-	}
-
-	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
-	if (ret) {
-		wpa_printf(MSG_DEBUG, "nl80211: mesh link probe to " MACSTR
-			   " failed: ret=%d (%s)",
-			   MAC2STR(addr), ret, strerror(-ret));
-	} else {
-		wpa_printf(MSG_DEBUG, "nl80211: Mesh link to " MACSTR
-			   " probed successfully", MAC2STR(addr));
-	}
-
-	return ret;
-}
-
 #endif /* CONFIG_MESH */
 
 
@@ -10928,7 +10817,7 @@
 	 * SAE) to hostapd/wpa_supplicant. Do nott send the status to drivers
 	 * which do not support AP SME or use wpa_supplicant/hostapd SME.
 	 */
-	if ((is_ap_interface(drv->nlmode) && !bss->drv->device_ap_sme) ||
+	if (!bss->drv->device_ap_sme ||
 	    (drv->capa.flags & WPA_DRIVER_FLAGS_SME))
 		return -1;
 
@@ -11035,7 +10924,6 @@
 	.sta_remove = driver_nl80211_sta_remove,
 	.hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
 	.sta_set_flags = wpa_driver_nl80211_sta_set_flags,
-	.sta_set_airtime_weight = driver_nl80211_sta_set_airtime_weight,
 	.hapd_init = i802_init,
 	.hapd_deinit = i802_deinit,
 	.set_wds_sta = i802_set_wds_sta,
@@ -11081,7 +10969,6 @@
 	.tdls_disable_channel_switch = nl80211_tdls_disable_channel_switch,
 #endif /* CONFIG_TDLS */
 	.update_ft_ies = wpa_driver_nl80211_update_ft_ies,
-	.update_dh_ie = nl80211_update_dh_ie,
 	.get_mac_addr = wpa_driver_nl80211_get_macaddr,
 	.get_survey = wpa_driver_nl80211_get_survey,
 	.status = wpa_driver_nl80211_status,
@@ -11104,7 +10991,6 @@
 	.init_mesh = wpa_driver_nl80211_init_mesh,
 	.join_mesh = wpa_driver_nl80211_join_mesh,
 	.leave_mesh = wpa_driver_nl80211_leave_mesh,
-	.probe_mesh_link = nl80211_probe_mesh_link,
 #endif /* CONFIG_MESH */
 	.br_add_ip_neigh = wpa_driver_br_add_ip_neigh,
 	.br_delete_ip_neigh = wpa_driver_br_delete_ip_neigh,
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 7498269..1e7fe7a 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -83,12 +83,6 @@
 	u8 rand_addr[ETH_ALEN];
 };
 
-struct drv_nl80211_if_info {
-	int ifindex;
-	/* the AP/AP_VLAN iface that is in this bridge */
-	int reason;
-};
-
 struct wpa_driver_nl80211_data {
 	struct nl80211_global *global;
 	struct dl_list list;
@@ -169,6 +163,7 @@
 	unsigned int scan_vendor_cmd_avail:1;
 	unsigned int connect_reassoc:1;
 	unsigned int set_wifi_conf_vendor_cmd_avail:1;
+	unsigned int he_capab_vendor_cmd_avail:1;
 	unsigned int fetch_bss_trans_status:1;
 	unsigned int roam_vendor_cmd_avail:1;
 	unsigned int get_supported_akm_suites_avail:1;
@@ -193,8 +188,11 @@
 
 	struct nl_handle *rtnl_sk; /* nl_sock for NETLINK_ROUTE */
 
-	struct drv_nl80211_if_info default_if_indices[16];
-	struct drv_nl80211_if_info *if_indices;
+	int default_if_indices[16];
+	/* the AP/AP_VLAN iface that is in this bridge */
+	int default_if_indices_reason[16];
+	int *if_indices;
+	int *if_indices_reason;
 	int num_if_indices;
 
 	/* From failed authentication command */
@@ -217,6 +215,8 @@
 	 * (NL80211_CMD_VENDOR). 0 if no pending scan request.
 	 */
 	int last_scan_cmd;
+
+	struct he_capabilities he_capab;
 };
 
 struct nl_msg;
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index 8318b10..37eeb5e 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -778,6 +778,9 @@
 				case QCA_NL80211_VENDOR_SUBCMD_SET_WIFI_CONFIGURATION:
 					drv->set_wifi_conf_vendor_cmd_avail = 1;
 					break;
+				case QCA_NL80211_VENDOR_SUBCMD_GET_HE_CAPABILITIES:
+					drv->he_capab_vendor_cmd_avail = 1;
+					break;
 				case QCA_NL80211_VENDOR_SUBCMD_FETCH_BSS_TRANSITION_STATUS:
 					drv->fetch_bss_trans_status = 1;
 					break;
@@ -1079,6 +1082,100 @@
 }
 
 
+static int qca_nl80211_he_capab_handler(struct nl_msg *msg, void *arg)
+{
+	struct nlattr *tb[NL80211_ATTR_MAX + 1];
+	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
+	struct he_capabilities *he_capab = arg;
+	struct nlattr *nl_vend;
+	struct nlattr *tb_vendor[QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_MAX + 1];
+	size_t len;
+
+	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+		  genlmsg_attrlen(gnlh, 0), NULL);
+
+	if (!tb[NL80211_ATTR_VENDOR_DATA])
+		return NL_SKIP;
+
+	nl_vend = tb[NL80211_ATTR_VENDOR_DATA];
+	nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_MAX,
+		  nla_data(nl_vend), nla_len(nl_vend), NULL);
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED]) {
+		u8 he_supported;
+
+		he_supported = nla_get_u8(
+			tb_vendor[QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED]);
+		wpa_printf(MSG_DEBUG, "nl80211: HE capabilities supported: %u",
+			   he_supported);
+		he_capab->he_supported = he_supported;
+		if (!he_supported)
+			return NL_SKIP;
+	}
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_PHY_CAPAB]) {
+		len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_PHY_CAPAB]);
+
+		if (len > sizeof(he_capab->phy_cap))
+			len = sizeof(he_capab->phy_cap);
+		os_memcpy(he_capab->phy_cap,
+			  nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_PHY_CAPAB]),
+			  len);
+	}
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_MAC_CAPAB])
+		he_capab->mac_cap =
+			nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_MAC_CAPAB]);
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_HE_MCS])
+		he_capab->mcs =
+			nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_HE_MCS]);
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_NUM_SS])
+		he_capab->ppet.numss_m1 =
+			nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NUM_SS]);
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_RU_IDX_MASK])
+		he_capab->ppet.ru_count =
+			nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_RU_IDX_MASK]);
+
+	if (tb_vendor[QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD]) {
+		len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD]);
+
+		if (len > sizeof(he_capab->ppet.ppet16_ppet8_ru3_ru0))
+			len = sizeof(he_capab->ppet.ppet16_ppet8_ru3_ru0);
+		os_memcpy(he_capab->ppet.ppet16_ppet8_ru3_ru0,
+			  nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD]),
+			  len);
+	}
+
+	return NL_SKIP;
+}
+
+
+static void qca_nl80211_check_he_capab(struct wpa_driver_nl80211_data *drv)
+{
+	struct nl_msg *msg;
+	int ret;
+
+	if (!drv->he_capab_vendor_cmd_avail)
+		return;
+
+	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
+		nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) ||
+		nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
+			    QCA_NL80211_VENDOR_SUBCMD_GET_HE_CAPABILITIES)) {
+		nlmsg_free(msg);
+		return;
+	}
+
+	ret = send_and_recv_msgs(drv, msg, qca_nl80211_he_capab_handler,
+				 &drv->he_capab);
+	if (!ret && drv->he_capab.he_supported)
+		drv->capa.flags |= WPA_DRIVER_FLAGS_HE_CAPABILITIES;
+}
+
+
 struct features_info {
 	u8 *flags;
 	size_t flags_len;
@@ -1276,6 +1373,7 @@
 	if (!(info.capa->flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD))
 		qca_nl80211_check_dfs_capa(drv);
 	qca_nl80211_get_features(drv);
+	qca_nl80211_check_he_capab(drv);
 
 	/*
 	 * To enable offchannel simultaneous support in wpa_supplicant, the
@@ -1394,57 +1492,6 @@
 		chan->dfs_cac_ms = nla_get_u32(
 			tb_freq[NL80211_FREQUENCY_ATTR_DFS_CAC_TIME]);
 	}
-
-	chan->wmm_rules_valid = 0;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_WMM]) {
-		static struct nla_policy wmm_policy[NL80211_WMMR_MAX + 1] = {
-			[NL80211_WMMR_CW_MIN] = { .type = NLA_U16 },
-			[NL80211_WMMR_CW_MAX] = { .type = NLA_U16 },
-			[NL80211_WMMR_AIFSN] = { .type = NLA_U8 },
-			[NL80211_WMMR_TXOP] = { .type = NLA_U16 },
-		};
-		struct nlattr *nl_wmm;
-		struct nlattr *tb_wmm[NL80211_WMMR_MAX + 1];
-		int rem_wmm, ac, count = 0;
-
-		nla_for_each_nested(nl_wmm, tb_freq[NL80211_FREQUENCY_ATTR_WMM],
-				    rem_wmm) {
-			if (nla_parse_nested(tb_wmm, NL80211_WMMR_MAX, nl_wmm,
-					     wmm_policy)) {
-				wpa_printf(MSG_DEBUG,
-					   "nl80211: Failed to parse WMM rules attribute");
-				return;
-			}
-			if (!tb_wmm[NL80211_WMMR_CW_MIN] ||
-			    !tb_wmm[NL80211_WMMR_CW_MAX] ||
-			    !tb_wmm[NL80211_WMMR_AIFSN] ||
-			    !tb_wmm[NL80211_WMMR_TXOP]) {
-				wpa_printf(MSG_DEBUG,
-					   "nl80211: Channel is missing WMM rule attribute");
-				return;
-			}
-			ac = nl_wmm->nla_type;
-			if (ac < 0 || ac >= WMM_AC_NUM) {
-				wpa_printf(MSG_DEBUG,
-					   "nl80211: Invalid AC value %d", ac);
-				return;
-			}
-
-			chan->wmm_rules[ac].min_cwmin =
-				nla_get_u16(tb_wmm[NL80211_WMMR_CW_MIN]);
-			chan->wmm_rules[ac].min_cwmax =
-				nla_get_u16(tb_wmm[NL80211_WMMR_CW_MAX]);
-			chan->wmm_rules[ac].min_aifs =
-				nla_get_u8(tb_wmm[NL80211_WMMR_AIFSN]);
-			chan->wmm_rules[ac].max_txop =
-				nla_get_u16(tb_wmm[NL80211_WMMR_TXOP]) / 32;
-			count++;
-		}
-
-		/* Set valid flag if all the AC rules are present */
-		if (count == WMM_AC_NUM)
-			chan->wmm_rules_valid = 1;
-	}
 }
 
 
@@ -1551,101 +1598,6 @@
 }
 
 
-static void phy_info_iftype_copy(struct he_capabilities *he_capab,
-				 enum ieee80211_op_mode opmode,
-				 struct nlattr **tb, struct nlattr **tb_flags)
-{
-	enum nl80211_iftype iftype;
-	size_t len;
-
-	switch (opmode) {
-	case IEEE80211_MODE_INFRA:
-		iftype = NL80211_IFTYPE_STATION;
-		break;
-	case IEEE80211_MODE_IBSS:
-		iftype = NL80211_IFTYPE_ADHOC;
-		break;
-	case IEEE80211_MODE_AP:
-		iftype = NL80211_IFTYPE_AP;
-		break;
-	case IEEE80211_MODE_MESH:
-		iftype = NL80211_IFTYPE_MESH_POINT;
-		break;
-	default:
-		return;
-	}
-
-	if (!nla_get_flag(tb_flags[iftype]))
-		return;
-
-	he_capab->he_supported = 1;
-
-	if (tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY]) {
-		len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY]);
-
-		if (len > sizeof(he_capab->phy_cap))
-			len = sizeof(he_capab->phy_cap);
-		os_memcpy(he_capab->phy_cap,
-			  nla_data(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY]),
-			  len);
-	}
-
-	if (tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC]) {
-		len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC]);
-
-		if (len > sizeof(he_capab->mac_cap))
-			len = sizeof(he_capab->mac_cap);
-		os_memcpy(he_capab->mac_cap,
-			  nla_data(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC]),
-			  len);
-	}
-
-	if (tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET]) {
-		len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET]);
-
-		if (len > sizeof(he_capab->mcs))
-			len = sizeof(he_capab->mcs);
-		os_memcpy(he_capab->mcs,
-			  nla_data(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET]),
-			  len);
-	}
-
-	if (tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE]) {
-		len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE]);
-
-		if (len > sizeof(he_capab->ppet))
-			len = sizeof(he_capab->ppet);
-		os_memcpy(&he_capab->ppet,
-			  nla_data(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE]),
-			  len);
-	}
-}
-
-
-static int phy_info_iftype(struct hostapd_hw_modes *mode,
-			   struct nlattr *nl_iftype)
-{
-	struct nlattr *tb[NL80211_BAND_IFTYPE_ATTR_MAX + 1];
-	struct nlattr *tb_flags[NL80211_IFTYPE_MAX + 1];
-	unsigned int i;
-
-	nla_parse(tb, NL80211_BAND_IFTYPE_ATTR_MAX,
-		  nla_data(nl_iftype), nla_len(nl_iftype), NULL);
-
-	if (!tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES])
-		return NL_STOP;
-
-	if (nla_parse_nested(tb_flags, NL80211_IFTYPE_MAX,
-			     tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES], NULL))
-		return NL_STOP;
-
-	for (i = 0; i < IEEE80211_MODE_NUM; i++)
-		phy_info_iftype_copy(&mode->he_capab[i], i, tb, tb_flags);
-
-	return NL_OK;
-}
-
-
 static int phy_info_band(struct phy_info_arg *phy_info, struct nlattr *nl_band)
 {
 	struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1];
@@ -1702,19 +1654,6 @@
 		return ret;
 	}
 
-	if (tb_band[NL80211_BAND_ATTR_IFTYPE_DATA]) {
-		struct nlattr *nl_iftype;
-		int rem_band;
-
-		nla_for_each_nested(nl_iftype,
-				    tb_band[NL80211_BAND_ATTR_IFTYPE_DATA],
-				    rem_band) {
-			ret = phy_info_iftype(mode, nl_iftype);
-			if (ret != NL_OK)
-				return ret;
-		}
-	}
-
 	return NL_OK;
 }
 
diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 7c16330..ee7b4da 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -136,7 +136,6 @@
 	C2S(NL80211_CMD_EXTERNAL_AUTH)
 	C2S(NL80211_CMD_STA_OPMODE_CHANGED)
 	C2S(NL80211_CMD_CONTROL_PORT_FRAME)
-	C2S(NL80211_CMD_UPDATE_OWE_INFO)
 	default:
 		return "NL80211_CMD_UNKNOWN";
 	}
@@ -535,8 +534,7 @@
 static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv,
 				 struct nlattr *ifindex, struct nlattr *freq,
 				 struct nlattr *type, struct nlattr *bw,
-				 struct nlattr *cf1, struct nlattr *cf2,
-				 int finished)
+				 struct nlattr *cf1, struct nlattr *cf2)
 {
 	struct i802_bss *bss;
 	union wpa_event_data data;
@@ -544,8 +542,7 @@
 	int chan_offset = 0;
 	int ifidx;
 
-	wpa_printf(MSG_DEBUG, "nl80211: Channel switch%s event",
-		   finished ? "" : " started");
+	wpa_printf(MSG_DEBUG, "nl80211: Channel switch event");
 
 	if (!freq)
 		return;
@@ -596,12 +593,10 @@
 	if (cf2)
 		data.ch_switch.cf2 = nla_get_u32(cf2);
 
-	if (finished)
-		bss->freq = data.ch_switch.freq;
+	bss->freq = data.ch_switch.freq;
 	drv->assoc_freq = data.ch_switch.freq;
 
-	wpa_supplicant_event(bss->ctx, finished ?
-			     EVENT_CH_SWITCH : EVENT_CH_SWITCH_STARTED, &data);
+	wpa_supplicant_event(bss->ctx, EVENT_CH_SWITCH, &data);
 }
 
 
@@ -1106,29 +1101,6 @@
 }
 
 
-static void mlme_event_dh_event(struct wpa_driver_nl80211_data *drv,
-				struct i802_bss *bss,
-				struct nlattr *tb[])
-{
-	union wpa_event_data data;
-
-	if (!is_ap_interface(drv->nlmode))
-		return;
-	if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_IE])
-		return;
-
-	os_memset(&data, 0, sizeof(data));
-	data.update_dh.peer = nla_data(tb[NL80211_ATTR_MAC]);
-	data.update_dh.ie = nla_data(tb[NL80211_ATTR_IE]);
-	data.update_dh.ie_len = nla_len(tb[NL80211_ATTR_IE]);
-
-	wpa_printf(MSG_DEBUG, "nl80211: DH event - peer " MACSTR,
-		   MAC2STR(data.update_dh.peer));
-
-	wpa_supplicant_event(bss->ctx, EVENT_UPDATE_DH, &data);
-}
-
-
 static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted,
 			    struct nlattr *tb[], int external_scan)
 {
@@ -2536,16 +2508,6 @@
 				   tb[NL80211_ATTR_PMK],
 				   tb[NL80211_ATTR_PMKID]);
 		break;
-	case NL80211_CMD_CH_SWITCH_STARTED_NOTIFY:
-		mlme_event_ch_switch(drv,
-				     tb[NL80211_ATTR_IFINDEX],
-				     tb[NL80211_ATTR_WIPHY_FREQ],
-				     tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
-				     tb[NL80211_ATTR_CHANNEL_WIDTH],
-				     tb[NL80211_ATTR_CENTER_FREQ1],
-				     tb[NL80211_ATTR_CENTER_FREQ2],
-				     0);
-		break;
 	case NL80211_CMD_CH_SWITCH_NOTIFY:
 		mlme_event_ch_switch(drv,
 				     tb[NL80211_ATTR_IFINDEX],
@@ -2553,8 +2515,7 @@
 				     tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
 				     tb[NL80211_ATTR_CHANNEL_WIDTH],
 				     tb[NL80211_ATTR_CENTER_FREQ1],
-				     tb[NL80211_ATTR_CENTER_FREQ2],
-				     1);
+				     tb[NL80211_ATTR_CENTER_FREQ2]);
 		break;
 	case NL80211_CMD_DISCONNECT:
 		mlme_event_disconnect(drv, tb[NL80211_ATTR_REASON_CODE],
@@ -2625,9 +2586,6 @@
 	case NL80211_CMD_STA_OPMODE_CHANGED:
 		nl80211_sta_opmode_change_event(drv, tb);
 		break;
-	case NL80211_CMD_UPDATE_OWE_INFO:
-		mlme_event_dh_event(drv, bss, tb);
-		break;
 	default:
 		wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event "
 			"(cmd=%d)", cmd);
@@ -2676,9 +2634,8 @@
 			}
 		}
 		wpa_printf(MSG_DEBUG,
-			   "nl80211: Ignored event %d (%s) for foreign interface (ifindex %d wdev 0x%llx)",
-			   gnlh->cmd, nl80211_command_to_string(gnlh->cmd),
-			   ifidx, (long long unsigned int) wdev_id);
+			   "nl80211: Ignored event (cmd=%d) for foreign interface (ifindex %d wdev 0x%llx)",
+			   gnlh->cmd, ifidx, (long long unsigned int) wdev_id);
 	}
 
 	return NL_SKIP;
diff --git a/src/drivers/driver_privsep.c b/src/drivers/driver_privsep.c
index 55cf618..a3f0837 100644
--- a/src/drivers/driver_privsep.c
+++ b/src/drivers/driver_privsep.c
@@ -368,7 +368,7 @@
 
 
 static int wpa_driver_privsep_deauthenticate(void *priv, const u8 *addr,
-					     u16 reason_code)
+					  int reason_code)
 {
 	//struct wpa_driver_privsep_data *drv = priv;
 	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
diff --git a/src/drivers/driver_wext.c b/src/drivers/driver_wext.c
index 4d4a05d..f7755cc 100644
--- a/src/drivers/driver_wext.c
+++ b/src/drivers/driver_wext.c
@@ -1915,7 +1915,7 @@
 
 
 static int wpa_driver_wext_mlme(struct wpa_driver_wext_data *drv,
-				const u8 *addr, int cmd, u16 reason_code)
+				const u8 *addr, int cmd, int reason_code)
 {
 	struct iwreq iwr;
 	struct iw_mlme mlme;
@@ -1998,7 +1998,7 @@
 
 
 static int wpa_driver_wext_deauthenticate(void *priv, const u8 *addr,
-					  u16 reason_code)
+					  int reason_code)
 {
 	struct wpa_driver_wext_data *drv = priv;
 	int ret;
diff --git a/src/drivers/nl80211_copy.h b/src/drivers/nl80211_copy.h
index 6f09d15..dd4f86e 100644
--- a/src/drivers/nl80211_copy.h
+++ b/src/drivers/nl80211_copy.h
@@ -11,7 +11,7 @@
  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
  * Copyright 2008 Colin McCabe <colin@cozybit.com>
  * Copyright 2015-2017	Intel Deutschland GmbH
- * Copyright (C) 2018-2019 Intel Corporation
+ * Copyright (C) 2018 Intel Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -1065,26 +1065,6 @@
  *	indicated by %NL80211_ATTR_WIPHY_FREQ and other attributes
  *	determining the width and type.
  *
- * @NL80211_CMD_UPDATE_OWE_INFO: This interface allows the host driver to
- *	offload OWE processing to user space. This intends to support
- *	OWE AKM by the host drivers that implement SME but rely
- *	on the user space for the cryptographic/DH IE processing in AP mode.
- *
- * @NL80211_CMD_PROBE_MESH_LINK: The requirement for mesh link metric
- *	refreshing, is that from one mesh point we be able to send some data
- *	frames to other mesh points which are not currently selected as a
- *	primary traffic path, but which are only 1 hop away. The absence of
- *	the primary path to the chosen node makes it necessary to apply some
- *	form of marking on a chosen packet stream so that the packets can be
- *	properly steered to the selected node for testing, and not by the
- *	regular mesh path lookup. Further, the packets must be of type data
- *	so that the rate control (often embedded in firmware) is used for
- *	rate selection.
- *
- *	Here attribute %NL80211_ATTR_MAC is used to specify connected mesh
- *	peer MAC address and %NL80211_ATTR_FRAME is used to specify the frame
- *	content. The frame is ethernet data.
- *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
  */
@@ -1305,10 +1285,6 @@
 
 	NL80211_CMD_NOTIFY_RADAR,
 
-	NL80211_CMD_UPDATE_OWE_INFO,
-
-	NL80211_CMD_PROBE_MESH_LINK,
-
 	/* add new commands above here */
 
 	/* used to define NL80211_CMD_MAX below */
@@ -2332,15 +2308,6 @@
  * @NL80211_ATTR_AIRTIME_WEIGHT: Station's weight when scheduled by the airtime
  *	scheduler.
  *
- * @NL80211_ATTR_STA_TX_POWER_SETTING: Transmit power setting type (u8) for
- *	station associated with the AP. See &enum nl80211_tx_power_setting for
- *	possible values.
- * @NL80211_ATTR_STA_TX_POWER: Transmit power level (s16) in dBm units. This
- *	allows to set Tx power for a station. If this attribute is not included,
- *	the default per-interface tx power setting will be overriding. Driver
- *	should be picking up the lowest tx power, either tx power per-interface
- *	or per-station.
- *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2791,8 +2758,6 @@
 	NL80211_ATTR_PEER_MEASUREMENTS,
 
 	NL80211_ATTR_AIRTIME_WEIGHT,
-	NL80211_ATTR_STA_TX_POWER_SETTING,
-	NL80211_ATTR_STA_TX_POWER,
 
 	/* add attributes here, update the policy in nl80211.c */
 
@@ -2837,7 +2802,7 @@
 
 #define NL80211_MAX_SUPP_RATES			32
 #define NL80211_MAX_SUPP_HT_RATES		77
-#define NL80211_MAX_SUPP_REG_RULES		128
+#define NL80211_MAX_SUPP_REG_RULES		64
 #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY	0
 #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY	16
 #define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY	24
@@ -3174,7 +3139,6 @@
  * @NL80211_STA_INFO_TX_DURATION: aggregate PPDU duration for all frames
  *	sent to the station (u64, usec)
  * @NL80211_STA_INFO_AIRTIME_WEIGHT: current airtime weight for station (u16)
- * @NL80211_STA_INFO_AIRTIME_LINK_METRIC: airtime link metric for mesh station
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -3220,7 +3184,6 @@
 	NL80211_STA_INFO_CONNECTED_TO_GATE,
 	NL80211_STA_INFO_TX_DURATION,
 	NL80211_STA_INFO_AIRTIME_WEIGHT,
-	NL80211_STA_INFO_AIRTIME_LINK_METRIC,
 
 	/* keep last */
 	__NL80211_STA_INFO_AFTER_LAST,
@@ -3675,14 +3638,6 @@
  *	value as specified by &struct nl80211_bss_select_rssi_adjust.
  * @NL80211_SCHED_SCAN_MATCH_ATTR_BSSID: BSSID to be used for matching
  *	(this cannot be used together with SSID).
- * @NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI: Nested attribute that carries the
- *	band specific minimum rssi thresholds for the bands defined in
- *	enum nl80211_band. The minimum rssi threshold value(s32) specific to a
- *	band shall be encapsulated in attribute with type value equals to one
- *	of the NL80211_BAND_* defined in enum nl80211_band. For example, the
- *	minimum rssi threshold value for 2.4GHZ band shall be encapsulated
- *	within an attribute of type NL80211_BAND_2GHZ. And one or more of such
- *	attributes will be nested within this attribute.
  * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
  *	attribute number currently defined
  * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
@@ -3695,7 +3650,6 @@
 	NL80211_SCHED_SCAN_MATCH_ATTR_RELATIVE_RSSI,
 	NL80211_SCHED_SCAN_MATCH_ATTR_RSSI_ADJUST,
 	NL80211_SCHED_SCAN_MATCH_ATTR_BSSID,
-	NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI,
 
 	/* keep last */
 	__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST,
@@ -4181,27 +4135,6 @@
 };
 
 /**
- * enum nl80211_key_mode - Key mode
- *
- * @NL80211_KEY_RX_TX: (Default)
- *	Key can be used for Rx and Tx immediately
- *
- * The following modes can only be selected for unicast keys and when the
- * driver supports @NL80211_EXT_FEATURE_EXT_KEY_ID:
- *
- * @NL80211_KEY_NO_TX: Only allowed in combination with @NL80211_CMD_NEW_KEY:
- *	Unicast key can only be used for Rx, Tx not allowed, yet
- * @NL80211_KEY_SET_TX: Only allowed in combination with @NL80211_CMD_SET_KEY:
- *	The unicast key identified by idx and mac is cleared for Tx and becomes
- *	the preferred Tx key for the station.
- */
-enum nl80211_key_mode {
-	NL80211_KEY_RX_TX,
-	NL80211_KEY_NO_TX,
-	NL80211_KEY_SET_TX
-};
-
-/**
  * enum nl80211_chan_width - channel width definitions
  *
  * These values are used with the %NL80211_ATTR_CHANNEL_WIDTH
@@ -4444,9 +4377,6 @@
  * @NL80211_KEY_DEFAULT_TYPES: A nested attribute containing flags
  *	attributes, specifying what a key should be set as default as.
  *	See &enum nl80211_key_default_types.
- * @NL80211_KEY_MODE: the mode from enum nl80211_key_mode.
- *	Defaults to @NL80211_KEY_RX_TX.
- *
  * @__NL80211_KEY_AFTER_LAST: internal
  * @NL80211_KEY_MAX: highest key attribute
  */
@@ -4460,7 +4390,6 @@
 	NL80211_KEY_DEFAULT_MGMT,
 	NL80211_KEY_TYPE,
 	NL80211_KEY_DEFAULT_TYPES,
-	NL80211_KEY_MODE,
 
 	/* keep last */
 	__NL80211_KEY_AFTER_LAST,
@@ -5406,8 +5335,6 @@
  *      able to rekey an in-use key correctly. Userspace must not rekey PTK keys
  *      if this flag is not set. Ignoring this can leak clear text packets and/or
  *      freeze the connection.
- * @NL80211_EXT_FEATURE_EXT_KEY_ID: Driver supports "Extended Key ID for
- *      Individually Addressed Frames" from IEEE802.11-2016.
  *
  * @NL80211_EXT_FEATURE_AIRTIME_FAIRNESS: Driver supports getting airtime
  *	fairness for transmitted packets and has enabled airtime fairness
@@ -5416,12 +5343,6 @@
  * @NL80211_EXT_FEATURE_AP_PMKSA_CACHING: Driver/device supports PMKSA caching
  *	(set/del PMKSA operations) in AP mode.
  *
- * @NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD: Driver supports
- *	filtering of sched scan results using band specific RSSI thresholds.
- *
- * @NL80211_EXT_FEATURE_STA_TX_PWR: This driver supports controlling tx power
- *	to a station.
- *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
  */
@@ -5463,9 +5384,6 @@
 	NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER,
 	NL80211_EXT_FEATURE_AIRTIME_FAIRNESS,
 	NL80211_EXT_FEATURE_AP_PMKSA_CACHING,
-	NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD,
-	NL80211_EXT_FEATURE_EXT_KEY_ID,
-	NL80211_EXT_FEATURE_STA_TX_PWR,
 
 	/* add new features before the definition below */
 	NUM_NL80211_EXT_FEATURES,