From 1827efa54460402b0b5530e2af2d55def530f4ad Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 7 Feb 2012 11:28:21 +0000
Subject: [PATCH] iw: update to version 3.3, sync with latest nl80211.h changes

SVN-Revision: 30347
---
 package/iw/Makefile                           |   8 +-
 package/iw/patches/001-nl80211_h_sync.patch   | 274 ++++--------------
 package/iw/patches/100-rx_rate.patch          |  10 +-
 package/iw/patches/110-ibss_ht.patch          | 113 --------
 ...ch => 110-per_chain_signal_strength.patch} |   8 +-
 .../patches/120-tdls_peer_indentation.patch   |  11 +
 package/iw/patches/130-fix_txpower.patch      |  11 -
 7 files changed, 73 insertions(+), 362 deletions(-)
 delete mode 100644 package/iw/patches/110-ibss_ht.patch
 rename package/iw/patches/{120-per_chain_signal_strength.patch => 110-per_chain_signal_strength.patch} (88%)
 create mode 100644 package/iw/patches/120-tdls_peer_indentation.patch
 delete mode 100644 package/iw/patches/130-fix_txpower.patch

diff --git a/package/iw/Makefile b/package/iw/Makefile
index 159d69a10b..f758631a75 100644
--- a/package/iw/Makefile
+++ b/package/iw/Makefile
@@ -8,13 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iw
-PKG_VERSION:=3.1
-PKG_RELEASE:=2
+PKG_VERSION:=3.3
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://wireless.kernel.org/download/iw/
-PKG_MD5SUM:=2b63438a12b7dc481140cb9a69c86e4a
-PKG_BUILD_DEPENDS:=mac80211
+PKG_MD5SUM:=146ad14cdeb39fb88b21efdbb28787d1
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -35,7 +34,6 @@ endef
 
 TARGET_CPPFLAGS:= \
 	-I$(STAGING_DIR)/usr/include/libnl-tiny \
-	-I$(STAGING_DIR)/usr/include/mac80211 \
 	$(TARGET_CPPFLAGS) \
 	-DCONFIG_LIBNL20 \
 	-D_GNU_SOURCE
diff --git a/package/iw/patches/001-nl80211_h_sync.patch b/package/iw/patches/001-nl80211_h_sync.patch
index 1c425273a4..544df9dffa 100644
--- a/package/iw/patches/001-nl80211_h_sync.patch
+++ b/package/iw/patches/001-nl80211_h_sync.patch
@@ -1,251 +1,77 @@
 --- a/nl80211.h
 +++ b/nl80211.h
-@@ -6,7 +6,7 @@
-  * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
-  * Copyright 2008 Michael Wu <flamingice@sourmilk.net>
-  * Copyright 2008 Luis Carlos Cobo <luisca@cozybit.com>
-- * Copyright 2008 Michael Buesch <mb@bu3sch.de>
-+ * Copyright 2008 Michael Buesch <m@bues.ch>
-  * Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
-  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
-  * Copyright 2008 Colin McCabe <colin@cozybit.com>
-@@ -161,6 +161,13 @@
-  * @NL80211_CMD_SET_BEACON: set the beacon on an access point interface
-  *	using the %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD,
-  *	%NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes.
-+ *	Following attributes are provided for drivers that generate full Beacon
-+ *	and Probe Response frames internally: %NL80211_ATTR_SSID,
-+ *	%NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE,
-+ *	%NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS,
-+ *	%NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY,
-+ *	%NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP,
-+ *	%NL80211_ATTR_IE_ASSOC_RESP.
-  * @NL80211_CMD_NEW_BEACON: add a new beacon to an access point interface,
-  *	parameters are like for %NL80211_CMD_SET_BEACON.
-  * @NL80211_CMD_DEL_BEACON: remove the beacon, stop sending it
-@@ -762,6 +769,8 @@ enum nl80211_commands {
-  *	that can be added to a scan request
-  * @NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN: maximum length of information
-  *	elements that can be added to a scheduled scan request
-+ * @NL80211_ATTR_MAX_MATCH_SETS: maximum number of sets that can be
-+ *	used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute.
-  *
-  * @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz)
-  * @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive
-@@ -842,18 +851,20 @@ enum nl80211_commands {
-  * @NL80211_ATTR_STATUS_CODE: StatusCode for the %NL80211_CMD_CONNECT
-  *	event (u16)
-  * @NL80211_ATTR_PRIVACY: Flag attribute, used with connect(), indicating
-- *	that protected APs should be used.
-+ *	that protected APs should be used. This is also used with NEW_BEACON to
-+ *	indicate that the BSS is to use protection.
-  *
-- * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT and ASSOCIATE to
-- *	indicate which unicast key ciphers will be used with the connection
-+ * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT, ASSOCIATE, and NEW_BEACON
-+ *	to indicate which unicast key ciphers will be used with the connection
-  *	(an array of u32).
-- * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT and ASSOCIATE to indicate
-- *	which group key cipher will be used with the connection (a u32).
-- * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT and ASSOCIATE to indicate
-- *	which WPA version(s) the AP we want to associate with is using
-+ * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ *	indicate which group key cipher will be used with the connection (a
-+ *	u32).
-+ * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ *	indicate which WPA version(s) the AP we want to associate with is using
-  *	(a u32 with flags from &enum nl80211_wpa_versions).
-- * @NL80211_ATTR_AKM_SUITES: Used with CONNECT and ASSOCIATE to indicate
-- *	which key management algorithm(s) to use (an array of u32).
-+ * @NL80211_ATTR_AKM_SUITES: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ *	indicate which key management algorithm(s) to use (an array of u32).
-  *
-  * @NL80211_ATTR_REQ_IE: (Re)association request information elements as
-  *	sent out by the card, for ROAM and successful CONNECT events.
-@@ -1002,6 +1013,24 @@ enum nl80211_commands {
+@@ -1475,6 +1475,7 @@ enum nl80211_attrs {
+ #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
  
-  * @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan
-  *	cycles, in msecs.
-+
-+ * @NL80211_ATTR_SCHED_SCAN_MATCH: Nested attribute with one or more
-+ *	sets of attributes to match during scheduled scans.  Only BSSs
-+ *	that match any of the sets will be reported.  These are
-+ *	pass-thru filter rules.
-+ *	For a match to succeed, the BSS must match all attributes of a
-+ *	set.  Since not every hardware supports matching all types of
-+ *	attributes, there is no guarantee that the reported BSSs are
-+ *	fully complying with the match sets and userspace needs to be
-+ *	able to ignore them by itself.
-+ *	Thus, the implementation is somewhat hardware-dependent, but
-+ *	this is only an optimization and the userspace application
-+ *	needs to handle all the non-filtered results anyway.
-+ *	If the match attributes don't make sense when combined with
-+ *	the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID
-+ *	is included in the probe request, but the match attributes
-+ *	will never let it go through), -EINVAL may be returned.
-+ *	If ommited, no filtering is done.
-  *
-  * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported
-  *	interface combinations. In each nested item, it contains attributes
-@@ -1014,6 +1043,33 @@ enum nl80211_commands {
-  * @%NL80211_ATTR_REKEY_DATA: nested attribute containing the information
-  *	necessary for GTK rekeying in the device, see &enum nl80211_rekey_data.
-  *
-+ * @NL80211_ATTR_SCAN_SUPP_RATES: rates per to be advertised as supported in scan,
-+ *	nested array attribute containing an entry for each band, with the entry
-+ *	being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but
-+ *	without the length restriction (at most %NL80211_MAX_SUPP_RATES).
-+ *
-+ * @NL80211_ATTR_HIDDEN_SSID: indicates whether SSID is to be hidden from Beacon
-+ *	and Probe Response (when response to wildcard Probe Request); see
-+ *	&enum nl80211_hidden_ssid, represented as a u32
-+ *
-+ * @NL80211_ATTR_IE_PROBE_RESP: Information element(s) for Probe Response frame.
-+ *	This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to
-+ *	provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the
-+ *	driver (or firmware) replies to Probe Request frames.
-+ * @NL80211_ATTR_IE_ASSOC_RESP: Information element(s) for (Re)Association
-+ *	Response frames. This is used with %NL80211_CMD_NEW_BEACON and
-+ *	%NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into
-+ *	(Re)Association Response frames when the driver (or firmware) replies to
-+ *	(Re)Association Request frames.
-+ *
-+ * @NL80211_ATTR_STA_WME: Nested attribute containing the wme configuration
-+ *	of the station, see &enum nl80211_sta_wme_attr.
-+ * @NL80211_ATTR_SUPPORT_AP_UAPSD: the device supports uapsd when working
-+ *	as AP.
-+ *
-+ * @NL80211_ATTR_ROAM_SUPPORT: Indicates whether the firmware is capable of
-+ *	roaming to another AP in the same ESS if the signal lever is low.
-+ *
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
+ #define NL80211_MAX_SUPP_RATES			32
++#define NL80211_MAX_SUPP_HT_RATES		77
+ #define NL80211_MAX_SUPP_REG_RULES		32
+ #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY	0
+ #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY	16
+@@ -1536,7 +1537,11 @@ enum nl80211_iftype {
+  * @NL80211_STA_FLAG_WME: station is WME/QoS capable
+  * @NL80211_STA_FLAG_MFP: station uses management frame protection
+  * @NL80211_STA_FLAG_AUTHENTICATED: station is authenticated
+- * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer
++ * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer -- this flag should
++ *	only be used in managed mode (even in the flags mask). Note that the
++ *	flag can't be changed, it is only valid while adding a station, and
++ *	attempts to change it will silently be ignored (rather than rejected
++ *	as errors.)
+  * @NL80211_STA_FLAG_MAX: highest station flag number currently defined
+  * @__NL80211_STA_FLAG_AFTER_LAST: internal use
   */
-@@ -1217,6 +1273,21 @@ enum nl80211_attrs {
- 	NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
- 	NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
- 
-+	NL80211_ATTR_SCAN_SUPP_RATES,
-+
-+	NL80211_ATTR_HIDDEN_SSID,
-+
-+	NL80211_ATTR_IE_PROBE_RESP,
-+	NL80211_ATTR_IE_ASSOC_RESP,
-+
-+	NL80211_ATTR_STA_WME,
-+	NL80211_ATTR_SUPPORT_AP_UAPSD,
-+
-+	NL80211_ATTR_ROAM_SUPPORT,
-+
-+	NL80211_ATTR_SCHED_SCAN_MATCH,
-+	NL80211_ATTR_MAX_MATCH_SETS,
-+
- 	/* add attributes here, update the policy in nl80211.c */
- 
- 	__NL80211_ATTR_AFTER_LAST,
-@@ -1426,6 +1497,8 @@ enum nl80211_sta_bss_param {
-  * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute
+@@ -1651,6 +1656,9 @@ enum nl80211_sta_bss_param {
   *     containing info as possible, see &enum nl80211_sta_bss_param
   * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
+  * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
++ * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
 + * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
 + * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   */
-@@ -1447,6 +1520,8 @@ enum nl80211_sta_info {
- 	NL80211_STA_INFO_RX_BITRATE,
+@@ -1673,6 +1681,9 @@ enum nl80211_sta_info {
  	NL80211_STA_INFO_BSS_PARAM,
  	NL80211_STA_INFO_CONNECTED_TIME,
+ 	NL80211_STA_INFO_STA_FLAGS,
++	NL80211_STA_INFO_BEACON_LOSS,
 +	NL80211_STA_INFO_CHAIN_SIGNAL,
 +	NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
  
  	/* keep last */
  	__NL80211_STA_INFO_AFTER_LAST,
-@@ -1676,6 +1751,26 @@ enum nl80211_reg_rule_attr {
- };
- 
- /**
-+ * enum nl80211_sched_scan_match_attr - scheduled scan match attributes
-+ * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
-+ * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
-+ * only report BSS with matching SSID.
-+ * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
-+ *	attribute number currently defined
-+ * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
-+ */
-+enum nl80211_sched_scan_match_attr {
-+	__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID,
-+
-+	NL80211_ATTR_SCHED_SCAN_MATCH_SSID,
-+
-+	/* keep last */
-+	__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST,
-+	NL80211_SCHED_SCAN_MATCH_ATTR_MAX =
-+		__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST - 1
-+};
-+
-+/**
-  * enum nl80211_reg_rule_flags - regulatory rule flags
+@@ -2098,6 +2109,9 @@ enum nl80211_mntr_flags {
+  * TUs) during which a mesh STA can send only one Action frame containing a
+  * PERR element.
   *
-  * @NL80211_RRF_NO_OFDM: OFDM modulation not allowed
-@@ -1826,6 +1921,13 @@ enum nl80211_mntr_flags {
-  * @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a
-  * source mesh point for path selection elements.
-  *
-+ * @NL80211_MESHCONF_HWMP_RANN_INTERVAL:  The interval of time (in TUs) between
-+ * root announcements are transmitted.
-+ *
-+ * @NL80211_MESHCONF_GATE_ANNOUNCEMENTS: Advertise that this mesh station has
-+ * access to a broader network beyond the MBSS.  This is done via Root
-+ * Announcement frames.
++ * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding
++ * or forwarding entity (default is TRUE - forwarding entity)
 + *
   * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
   *
   * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
-@@ -1847,6 +1949,8 @@ enum nl80211_meshconf_params {
- 	NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
- 	NL80211_MESHCONF_HWMP_ROOTMODE,
- 	NL80211_MESHCONF_ELEMENT_TTL,
-+	NL80211_MESHCONF_HWMP_RANN_INTERVAL,
-+	NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
+@@ -2122,6 +2136,7 @@ enum nl80211_meshconf_params {
+ 	NL80211_MESHCONF_HWMP_RANN_INTERVAL,
+ 	NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
+ 	NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
++	NL80211_MESHCONF_FORWARDING,
  
  	/* keep last */
  	__NL80211_MESHCONF_ATTR_AFTER_LAST,
-@@ -2423,4 +2527,37 @@ enum nl80211_rekey_data {
- 	MAX_NL80211_REKEY_DATA = NUM_NL80211_REKEY_DATA - 1
- };
+@@ -2395,12 +2410,15 @@ enum nl80211_key_attributes {
+  *	in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with
+  *	1 = 500 kbps) but without the IE length restriction (at most
+  *	%NL80211_MAX_SUPP_RATES in a single array).
++ * @NL80211_TXRATE_MCS: HT (MCS) rates allowed for TX rate selection
++ *	in an array of MCS numbers.
+  * @__NL80211_TXRATE_AFTER_LAST: internal
+  * @NL80211_TXRATE_MAX: highest TX rate attribute
+  */
+ enum nl80211_tx_rate_attributes {
+ 	__NL80211_TXRATE_INVALID,
+ 	NL80211_TXRATE_LEGACY,
++	NL80211_TXRATE_MCS,
  
-+/**
-+ * enum nl80211_hidden_ssid - values for %NL80211_ATTR_HIDDEN_SSID
-+ * @NL80211_HIDDEN_SSID_NOT_IN_USE: do not hide SSID (i.e., broadcast it in
-+ *	Beacon frames)
-+ * @NL80211_HIDDEN_SSID_ZERO_LEN: hide SSID by using zero-length SSID element
-+ *	in Beacon frames
-+ * @NL80211_HIDDEN_SSID_ZERO_CONTENTS: hide SSID by using correct length of SSID
-+ *	element in Beacon frames but zero out each byte in the SSID
-+ */
-+enum nl80211_hidden_ssid {
-+	NL80211_HIDDEN_SSID_NOT_IN_USE,
-+	NL80211_HIDDEN_SSID_ZERO_LEN,
-+	NL80211_HIDDEN_SSID_ZERO_CONTENTS
-+};
-+
-+/**
-+ * enum nl80211_sta_wme_attr - station WME attributes
-+ * @__NL80211_STA_WME_INVALID: invalid number for nested attribute
-+ * @NL80211_STA_WME_QUEUES: bitmap of uapsd queues.
-+ * @NL80211_STA_WME_MAX_SP: max service period.
-+ * @__NL80211_STA_WME_AFTER_LAST: internal
-+ * @NL80211_STA_WME_MAX: highest station WME attribute
-+ */
-+enum nl80211_sta_wme_attr {
-+	__NL80211_STA_WME_INVALID,
-+	NL80211_STA_WME_UAPSD_QUEUES,
-+	NL80211_STA_WME_MAX_SP,
-+
-+	/* keep last */
-+	__NL80211_STA_WME_AFTER_LAST,
-+	NL80211_STA_WME_MAX = __NL80211_STA_WME_AFTER_LAST - 1
-+};
-+
- #endif /* __LINUX_NL80211_H */
+ 	/* keep last */
+ 	__NL80211_TXRATE_AFTER_LAST,
diff --git a/package/iw/patches/100-rx_rate.patch b/package/iw/patches/100-rx_rate.patch
index e3df6ca092..780a7d4396 100644
--- a/package/iw/patches/100-rx_rate.patch
+++ b/package/iw/patches/100-rx_rate.patch
@@ -43,9 +43,9 @@
  	struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1];
 -	struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1];
  	char mac_addr[20], state_name[10], dev[20];
+ 	struct nl80211_sta_flag_update *sta_flags;
  	static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
- 		[NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
-@@ -45,6 +75,7 @@ static int print_sta_handler(struct nl_m
+@@ -46,6 +76,7 @@ static int print_sta_handler(struct nl_m
  		[NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
  		[NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 },
  		[NL80211_STA_INFO_TX_BITRATE] = { .type = NLA_NESTED },
@@ -53,8 +53,8 @@
  		[NL80211_STA_INFO_LLID] = { .type = NLA_U16 },
  		[NL80211_STA_INFO_PLID] = { .type = NLA_U16 },
  		[NL80211_STA_INFO_PLINK_STATE] = { .type = NLA_U8 },
-@@ -52,13 +83,6 @@ static int print_sta_handler(struct nl_m
- 		[NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 },
+@@ -55,13 +86,6 @@ static int print_sta_handler(struct nl_m
+ 			{ .minlen = sizeof(struct nl80211_sta_flag_update) },
  	};
  
 -	static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = {
@@ -67,7 +67,7 @@
  	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  		  genlmsg_attrlen(gnlh, 0), NULL);
  
-@@ -111,25 +135,8 @@ static int print_sta_handler(struct nl_m
+@@ -114,25 +138,8 @@ static int print_sta_handler(struct nl_m
  		printf("\n\tsignal avg:\t%d dBm",
  			(int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG]));
  
diff --git a/package/iw/patches/110-ibss_ht.patch b/package/iw/patches/110-ibss_ht.patch
deleted file mode 100644
index 1b5dbd3e99..0000000000
--- a/package/iw/patches/110-ibss_ht.patch
+++ /dev/null
@@ -1,113 +0,0 @@
---- a/ibss.c
-+++ b/ibss.c
-@@ -27,6 +27,7 @@ static int join_ibss(struct nl80211_stat
- 	char *value = NULL, *sptr = NULL;
- 	float rate;
- 	int bintval;
-+	unsigned int htval;
- 
- 	if (argc < 2)
- 		return 1;
-@@ -44,6 +45,12 @@ static int join_ibss(struct nl80211_stat
- 	argv++;
- 	argc--;
- 
-+	if (argc && parse_channel_type(argv[0], &htval)) {
-+		NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval);
-+		argv++;
-+		argc--;
-+	}
-+
- 	if (argc && strcmp(argv[0], "fixed-freq") == 0) {
- 		NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
- 		argv++;
-@@ -134,7 +141,7 @@ COMMAND(ibss, leave, NULL,
- 	NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
- 	"Leave the current IBSS cell.");
- COMMAND(ibss, join,
--	"<SSID> <freq in MHz> [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
-+	"<SSID> <freq in MHz> [HT20|HT40+|HT40-] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
- 	" [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
- 	"[key d:0:abcde]",
- 	NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
---- a/iw.h
-+++ b/iw.h
-@@ -133,6 +133,7 @@ int parse_hex_mask(char *hexmask, unsign
- unsigned char *parse_hex(char *hex, size_t *outlen);
- 
- int parse_keys(struct nl_msg *msg, char **argv, int argc);
-+int parse_channel_type(const char *str, unsigned int *htval);
- 
- void print_ht_mcs(const __u8 *mcs);
- void print_ampdu_length(__u8 exponent);
---- a/phy.c
-+++ b/phy.c
-@@ -33,30 +33,14 @@ static int handle_freqchan(struct nl_msg
- 			   int argc, char **argv)
- {
- 	char *end;
--	static const struct {
--		const char *name;
--		unsigned int val;
--	} htmap[] = {
--		{ .name = "HT20", .val = NL80211_CHAN_HT20, },
--		{ .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
--		{ .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
--	};
- 	unsigned int htval = NL80211_CHAN_NO_HT;
- 	unsigned int freq;
--	int i;
- 
- 	if (!argc || argc > 2)
- 		return 1;
- 
--	if (argc == 2) {
--		for (i = 0; i < ARRAY_SIZE(htmap); i++) {
--			if (strcasecmp(htmap[i].name, argv[1]) == 0) {
--				htval = htmap[i].val;
--				break;
--			}
--		}
--		if (htval == NL80211_CHAN_NO_HT)
--			return 1;
-+	if (argc == 2 && !parse_channel_type(argv[1], &htval)) {
-+		return 1;
- 	}
- 
- 	if (!*argv[0])
---- a/util.c
-+++ b/util.c
-@@ -382,6 +382,33 @@ int parse_keys(struct nl_msg *msg, char 
- 	return 2;
- }
- 
-+/*
-+ * Convert a string "HT20", "HT40+" or "HT40-" into nl80211
-+ * value. Conversion is case insensitive. Returns 1 on success, 0 on error.
-+ */
-+
-+int parse_channel_type(const char *str, unsigned int *htval)
-+{
-+	static const struct {
-+		const char *name;
-+		unsigned int val;
-+	} htmap[] = {
-+		{ .name = "HT20", .val = NL80211_CHAN_HT20, },
-+		{ .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
-+		{ .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
-+	};
-+	int i;
-+
-+	for (i = 0; i < ARRAY_SIZE(htmap); i++) {
-+		if (strcasecmp(htmap[i].name, str) == 0) {
-+			*htval = htmap[i].val;
-+			return 1;
-+		}
-+	}
-+
-+	return 0;
-+}
-+
- static void print_mcs_index(const __u8 *mcs)
- {
- 	unsigned int mcs_bit, prev_bit = -2, prev_cont = 0;
diff --git a/package/iw/patches/120-per_chain_signal_strength.patch b/package/iw/patches/110-per_chain_signal_strength.patch
similarity index 88%
rename from package/iw/patches/120-per_chain_signal_strength.patch
rename to package/iw/patches/110-per_chain_signal_strength.patch
index 411b51e3d0..0bc5607921 100644
--- a/package/iw/patches/120-per_chain_signal_strength.patch
+++ b/package/iw/patches/110-per_chain_signal_strength.patch
@@ -34,10 +34,10 @@
  static int print_sta_handler(struct nl_msg *msg, void *arg)
  {
  	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-@@ -81,7 +108,10 @@ static int print_sta_handler(struct nl_m
- 		[NL80211_STA_INFO_PLINK_STATE] = { .type = NLA_U8 },
- 		[NL80211_STA_INFO_TX_RETRIES] = { .type = NLA_U32 },
+@@ -84,7 +111,10 @@ static int print_sta_handler(struct nl_m
  		[NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 },
+ 		[NL80211_STA_INFO_STA_FLAGS] =
+ 			{ .minlen = sizeof(struct nl80211_sta_flag_update) },
 +		[NL80211_STA_INFO_CHAIN_SIGNAL] = { .type = NLA_NESTED },
 +		[NL80211_STA_INFO_CHAIN_SIGNAL_AVG] = { .type = NLA_NESTED },
  	};
@@ -45,7 +45,7 @@
  
  	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  		  genlmsg_attrlen(gnlh, 0), NULL);
-@@ -128,12 +158,18 @@ static int print_sta_handler(struct nl_m
+@@ -131,12 +161,18 @@ static int print_sta_handler(struct nl_m
  	if (sinfo[NL80211_STA_INFO_TX_FAILED])
  		printf("\n\ttx failed:\t%u",
  			nla_get_u32(sinfo[NL80211_STA_INFO_TX_FAILED]));
diff --git a/package/iw/patches/120-tdls_peer_indentation.patch b/package/iw/patches/120-tdls_peer_indentation.patch
new file mode 100644
index 0000000000..937b9dd3de
--- /dev/null
+++ b/package/iw/patches/120-tdls_peer_indentation.patch
@@ -0,0 +1,11 @@
+--- a/station.c
++++ b/station.c
+@@ -258,7 +258,7 @@ static int print_sta_handler(struct nl_m
+ 		}
+ 
+ 		if (sta_flags->mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) {
+-			printf("\n\tTDLS peer:\t\t");
++			printf("\n\tTDLS peer:\t");
+ 			if (sta_flags->set & BIT(NL80211_STA_FLAG_TDLS_PEER))
+ 				printf("yes");
+ 			else
diff --git a/package/iw/patches/130-fix_txpower.patch b/package/iw/patches/130-fix_txpower.patch
deleted file mode 100644
index 9e0c2df323..0000000000
--- a/package/iw/patches/130-fix_txpower.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/phy.c
-+++ b/phy.c
-@@ -277,7 +277,7 @@ static int handle_txpower(struct nl80211
- 		}
- 
- 		mbm = strtol(argv[1], &endptr, 10);
--		if (!*endptr)
-+		if (*endptr)
- 			return 2;
- 		NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, mbm);
- 	} else if (argc != 1)
-- 
2.30.2