diff options
Diffstat (limited to 'package')
| -rw-r--r-- | package/mac80211/patches/330-nl80211_ht40.patch | 303 | ||||
| -rw-r--r-- | package/mac80211/patches/340-ath9k_ap_rc.patch | 210 | 
2 files changed, 513 insertions, 0 deletions
| diff --git a/package/mac80211/patches/330-nl80211_ht40.patch b/package/mac80211/patches/330-nl80211_ht40.patch new file mode 100644 index 000000000..267dd0b3e --- /dev/null +++ b/package/mac80211/patches/330-nl80211_ht40.patch @@ -0,0 +1,303 @@ +This patch adds new NL80211_CMD_SET_WIPHY attributes +NL80211_ATTR_WIPHY_FREQ and NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET to allow +userspace to set the operating channel (e.g., hostapd for AP mode). + +Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com> +Acked-by: Johannes Berg <johannes@sipsolutions.net> + + +Index: wireless-testing/include/linux/nl80211.h +=================================================================== +--- wireless-testing.orig/include/linux/nl80211.h	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/include/linux/nl80211.h	2008-11-26 15:16:59.000000000 +0200 +@@ -26,8 +26,9 @@ +  * @NL80211_CMD_GET_WIPHY: request information about a wiphy or dump request +  *	to get a list of all present wiphys. +  * @NL80211_CMD_SET_WIPHY: set wiphy parameters, needs %NL80211_ATTR_WIPHY or +- *	%NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME +- *	and/or %NL80211_ATTR_WIPHY_TXQ_PARAMS. ++ *	%NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, ++ *	%NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ, and/or ++ *	%NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET. +  * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request +  *	or rename notification. Has attributes %NL80211_ATTR_WIPHY and +  *	%NL80211_ATTR_WIPHY_NAME. +@@ -180,6 +181,14 @@ +  *	/sys/class/ieee80211/<phyname>/index +  * @NL80211_ATTR_WIPHY_NAME: wiphy name (used for renaming) +  * @NL80211_ATTR_WIPHY_TXQ_PARAMS: a nested array of TX queue parameters ++ * @NL80211_ATTR_WIPHY_FREQ: frequency of the selected channel in MHz ++ * @NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET: included with NL80211_ATTR_WIPHY_FREQ ++ *	if HT20 or HT40 are allowed (i.e., 802.11n disabled if not included): ++ *	NL80211_SEC_CHAN_NO_HT = HT not allowed (i.e., same as not including ++ *		this attribute) ++ *	NL80211_SEC_CHAN_DISABLED = HT20 only ++ *	NL80211_SEC_CHAN_BELOW = secondary channel is below the primary channel ++ *	NL80211_SEC_CHAN_ABOVE = secondary channel is above the primary channel +  * +  * @NL80211_ATTR_IFINDEX: network interface index of the device to operate on +  * @NL80211_ATTR_IFNAME: network interface name +@@ -315,6 +324,8 @@ + 	NL80211_ATTR_BSS_BASIC_RATES, +  + 	NL80211_ATTR_WIPHY_TXQ_PARAMS, ++	NL80211_ATTR_WIPHY_FREQ, ++	NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET, +  + 	/* add attributes here, update the policy in nl80211.c */ +  +@@ -329,6 +340,8 @@ + #define NL80211_ATTR_HT_CAPABILITY NL80211_ATTR_HT_CAPABILITY + #define NL80211_ATTR_BSS_BASIC_RATES NL80211_ATTR_BSS_BASIC_RATES + #define NL80211_ATTR_WIPHY_TXQ_PARAMS NL80211_ATTR_WIPHY_TXQ_PARAMS ++#define NL80211_ATTR_WIPHY_FREQ NL80211_ATTR_WIPHY_FREQ ++#define NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET +  + #define NL80211_MAX_SUPP_RATES			32 + #define NL80211_MAX_SUPP_REG_RULES		32 +@@ -742,4 +755,10 @@ + 	NL80211_TXQ_Q_BK + }; +  ++enum nl80211_sec_chan_offset { ++	NL80211_SEC_CHAN_NO_HT /* No HT */, ++	NL80211_SEC_CHAN_DISABLED /* HT20 only */, ++	NL80211_SEC_CHAN_BELOW /* HT40- */, ++	NL80211_SEC_CHAN_ABOVE /* HT40+ */ ++}; + #endif /* __LINUX_NL80211_H */ +Index: wireless-testing/include/net/cfg80211.h +=================================================================== +--- wireless-testing.orig/include/net/cfg80211.h	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/include/net/cfg80211.h	2008-11-26 15:29:50.000000000 +0200 +@@ -392,6 +392,9 @@ + /* from net/wireless.h */ + struct wiphy; +  ++/* from net/ieee80211.h */ ++struct ieee80211_channel; ++ + /** +  * struct cfg80211_ops - backend description for wireless configuration +  * +@@ -450,6 +453,8 @@ +  * @change_bss: Modify parameters for a given BSS. +  * +  * @set_txq_params: Set TX queue parameters ++ * ++ * @set_channel: Set channel +  */ + struct cfg80211_ops { + 	int	(*add_virtual_intf)(struct wiphy *wiphy, char *name, +@@ -513,6 +518,10 @@ +  + 	int	(*set_txq_params)(struct wiphy *wiphy, + 				  struct ieee80211_txq_params *params); ++ ++	int	(*set_channel)(struct wiphy *wiphy, ++			       struct ieee80211_channel *chan, ++			       enum nl80211_sec_chan_offset); + }; +  + #endif /* __NET_CFG80211_H */ +Index: wireless-testing/net/mac80211/cfg.c +=================================================================== +--- wireless-testing.orig/net/mac80211/cfg.c	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/net/mac80211/cfg.c	2008-11-26 15:19:34.000000000 +0200 +@@ -1095,6 +1095,18 @@ + 	return 0; + } +  ++static int ieee80211_set_channel(struct wiphy *wiphy, ++				 struct ieee80211_channel *chan, ++				 enum nl80211_sec_chan_offset sec_chan_offset) ++{ ++	struct ieee80211_local *local = wiphy_priv(wiphy); ++ ++	local->oper_channel = chan; ++	local->oper_sec_chan_offset = sec_chan_offset; ++ ++	return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); ++} ++ + struct cfg80211_ops mac80211_config_ops = { + 	.add_virtual_intf = ieee80211_add_iface, + 	.del_virtual_intf = ieee80211_del_iface, +@@ -1122,4 +1134,5 @@ + #endif + 	.change_bss = ieee80211_change_bss, + 	.set_txq_params = ieee80211_set_txq_params, ++	.set_channel = ieee80211_set_channel, + }; +Index: wireless-testing/net/wireless/nl80211.c +=================================================================== +--- wireless-testing.orig/net/wireless/nl80211.c	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/net/wireless/nl80211.c	2008-11-26 15:31:31.000000000 +0200 +@@ -59,6 +59,8 @@ + 	[NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, + 				      .len = BUS_ID_SIZE-1 }, + 	[NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, ++	[NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, ++	[NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET] = { .type = NLA_U32 }, +  + 	[NL80211_ATTR_IFTYPE] = { .type = NLA_U32 }, + 	[NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, +@@ -359,6 +361,61 @@ + 		} + 	} +  ++	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { ++		enum nl80211_sec_chan_offset sec_chan_offset = ++			NL80211_SEC_CHAN_NO_HT; ++		struct ieee80211_channel *chan; ++		u32 freq, sec_freq; ++ ++		if (!rdev->ops->set_channel) { ++			result = -EOPNOTSUPP; ++			goto bad_res; ++		} ++ ++		if (info->attrs[NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]) { ++			sec_chan_offset = nla_get_u32( ++				info->attrs[ ++					NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]); ++			if (sec_chan_offset != NL80211_SEC_CHAN_NO_HT && ++			    sec_chan_offset != NL80211_SEC_CHAN_DISABLED && ++			    sec_chan_offset != NL80211_SEC_CHAN_BELOW && ++			    sec_chan_offset != NL80211_SEC_CHAN_ABOVE) { ++				result = -EINVAL; ++				goto bad_res; ++			} ++		} ++ ++		freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); ++		chan = ieee80211_get_channel(&rdev->wiphy, freq); ++		if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) { ++			/* Primary channel not allowed */ ++			result = -EINVAL; ++			goto bad_res; ++		} ++		if (sec_chan_offset == NL80211_SEC_CHAN_BELOW) ++			sec_freq = freq - 20; ++		else if (sec_chan_offset == NL80211_SEC_CHAN_ABOVE) ++			sec_freq = freq + 20; ++		else ++			sec_freq = 0; ++ ++		if (sec_freq) { ++			struct ieee80211_channel *schan; ++			schan = ieee80211_get_channel(&rdev->wiphy, sec_freq); ++			if (!schan || schan->flags & IEEE80211_CHAN_DISABLED) { ++				/* Secondary channel not allowed */ ++				result = -EINVAL; ++				goto bad_res; ++			} ++		} ++ ++		result = rdev->ops->set_channel(&rdev->wiphy, chan, ++						sec_chan_offset); ++		if (result) ++			goto bad_res; ++	} ++ ++ + bad_res: + 	cfg80211_put_dev(rdev); + 	return result; +Index: wireless-testing/include/net/mac80211.h +=================================================================== +--- wireless-testing.orig/include/net/mac80211.h	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/include/net/mac80211.h	2008-11-26 15:15:47.000000000 +0200 +@@ -507,6 +507,9 @@ +  + struct ieee80211_ht_conf { + 	bool enabled; ++	int sec_chan_offset; /* 0 = HT40 disabled; -1 = HT40 enabled, secondary ++			      * channel below primary; 1 = HT40 enabled, ++			      * secondary channel above primary */ + }; +  + /** +Index: wireless-testing/net/mac80211/util.c +=================================================================== +--- wireless-testing.orig/net/mac80211/util.c	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/net/mac80211/util.c	2008-11-26 15:20:26.000000000 +0200 +@@ -641,6 +641,7 @@ + 		    chan->flags & IEEE80211_CHAN_NO_IBSS) + 			return ret; + 		local->oper_channel = chan; ++		local->oper_sec_chan_offset = NL80211_SEC_CHAN_NO_HT; +  + 		if (local->sw_scanning || local->hw_scanning) + 			ret = 0; +Index: wireless-testing/net/mac80211/ieee80211_i.h +=================================================================== +--- wireless-testing.orig/net/mac80211/ieee80211_i.h	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/net/mac80211/ieee80211_i.h	2008-11-26 15:20:12.000000000 +0200 +@@ -626,6 +626,7 @@ + 	struct delayed_work scan_work; + 	struct ieee80211_sub_if_data *scan_sdata; + 	struct ieee80211_channel *oper_channel, *scan_channel; ++	enum nl80211_sec_chan_offset oper_sec_chan_offset; + 	u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; + 	size_t scan_ssid_len; + 	struct list_head bss_list; +Index: wireless-testing/net/mac80211/main.c +=================================================================== +--- wireless-testing.orig/net/mac80211/main.c	2008-11-26 15:15:31.000000000 +0200 ++++ wireless-testing/net/mac80211/main.c	2008-11-26 15:29:09.000000000 +0200 +@@ -195,20 +195,42 @@ + 	struct ieee80211_channel *chan; + 	int ret = 0; + 	int power; ++	enum nl80211_sec_chan_offset sec_chan_offset; +  + 	might_sleep(); +  +-	if (local->sw_scanning) ++	if (local->sw_scanning) { + 		chan = local->scan_channel; +-	else ++		sec_chan_offset = NL80211_SEC_CHAN_NO_HT; ++	} else { + 		chan = local->oper_channel; ++		sec_chan_offset = local->oper_sec_chan_offset; ++	} +  +-	if (chan != local->hw.conf.channel) { ++	if (chan != local->hw.conf.channel || ++	    sec_chan_offset != local->hw.conf.ht.sec_chan_offset) { + 		local->hw.conf.channel = chan; ++		switch (sec_chan_offset) { ++		case NL80211_SEC_CHAN_NO_HT: ++			local->hw.conf.ht.enabled = false; ++			local->hw.conf.ht.sec_chan_offset = 0; ++			break; ++		case NL80211_SEC_CHAN_DISABLED: ++			local->hw.conf.ht.enabled = true; ++			local->hw.conf.ht.sec_chan_offset = 0; ++			break; ++		case NL80211_SEC_CHAN_BELOW: ++			local->hw.conf.ht.enabled = true; ++			local->hw.conf.ht.sec_chan_offset = -1; ++			break; ++		case NL80211_SEC_CHAN_ABOVE: ++			local->hw.conf.ht.enabled = true; ++			local->hw.conf.ht.sec_chan_offset = 1; ++			break; ++		} + 		changed |= IEEE80211_CONF_CHANGE_CHANNEL; + 	} +  +- + 	if (!local->hw.conf.power_level) + 		power = chan->max_power; + 	else + +--  +Jouni Malinen                                            PGP id EFC895FA +-- +To unsubscribe from this list: send the line "unsubscribe linux-wireless" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at  http://vger.kernel.org/majordomo-info.html + diff --git a/package/mac80211/patches/340-ath9k_ap_rc.patch b/package/mac80211/patches/340-ath9k_ap_rc.patch new file mode 100644 index 000000000..d6bc232b7 --- /dev/null +++ b/package/mac80211/patches/340-ath9k_ap_rc.patch @@ -0,0 +1,210 @@ +Hostapd now passes the HT parameters through the config() +callback, use these to set the appropriate channel in AP mode. + +Signed-off-by: Sujith <Sujith.Manoharan@atheros.com> +--- +Note: This patch depends on [PATCHv2] nl80211: Add frequency configuration (including HT40) +posted by Jouni. + + drivers/net/wireless/ath9k/main.c |   60 ++++++++++++++++++++++++++---------- + drivers/net/wireless/ath9k/rc.c   |   55 +++++++++++++++++++++++++++++---- + 2 files changed, 91 insertions(+), 24 deletions(-) + +diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c +index 6e103d5..d1ddb07 100644 +--- a/drivers/net/wireless/ath9k/main.c ++++ b/drivers/net/wireless/ath9k/main.c +@@ -622,35 +622,35 @@ static int ath_get_channel(struct ath_softc *sc, + 	return -1; + } +  ++/* ext_chan_offset: (-1, 0, 1) (below, none, above) */ ++ + static u32 ath_get_extchanmode(struct ath_softc *sc, + 			       struct ieee80211_channel *chan, +-			       struct ieee80211_bss_conf *bss_conf) ++			       int ext_chan_offset, ++			       enum ath9k_ht_macmode tx_chan_width) + { + 	u32 chanmode = 0; +-	u8 ext_chan_offset = bss_conf->ht.secondary_channel_offset; +-	enum ath9k_ht_macmode tx_chan_width = (bss_conf->ht.width_40_ok) ? +-		ATH9K_HT_MACMODE_2040 : ATH9K_HT_MACMODE_20; +  + 	switch (chan->band) { + 	case IEEE80211_BAND_2GHZ: +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_NONE) && ++		if ((ext_chan_offset == 0) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_20)) + 			chanmode = CHANNEL_G_HT20; +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE) && ++		if ((ext_chan_offset == 1) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_2040)) + 			chanmode = CHANNEL_G_HT40PLUS; +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW) && ++		if ((ext_chan_offset == -1) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_2040)) + 			chanmode = CHANNEL_G_HT40MINUS; + 		break; + 	case IEEE80211_BAND_5GHZ: +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_NONE) && ++		if ((ext_chan_offset == 0) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_20)) + 			chanmode = CHANNEL_A_HT20; +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE) && ++		if ((ext_chan_offset == 1) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_2040)) + 			chanmode = CHANNEL_A_HT40PLUS; +-		if ((ext_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW) && ++		if ((ext_chan_offset == -1) && + 		    (tx_chan_width == ATH9K_HT_MACMODE_2040)) + 			chanmode = CHANNEL_A_HT40MINUS; + 		break; +@@ -841,6 +841,18 @@ static void ath9k_ht_conf(struct ath_softc *sc, + 	} + } +  ++static inline int ath_sec_offset(u8 ext_offset) ++{ ++	if (ext_offset == IEEE80211_HT_PARAM_CHA_SEC_NONE) ++		return 0; ++	else if (ext_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE) ++		return 1; ++	else if (ext_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW) ++		return -1; ++ ++	return 0; ++} ++ + static void ath9k_bss_assoc_info(struct ath_softc *sc, + 				 struct ieee80211_vif *vif, + 				 struct ieee80211_bss_conf *bss_conf) +@@ -893,13 +905,14 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc, + 		} +  + 		if (hw->conf.ht.enabled) { +-			sc->sc_ah->ah_channels[pos].chanmode = +-				ath_get_extchanmode(sc, curchan, bss_conf); ++			int offset = ++				ath_sec_offset(bss_conf->ht.secondary_channel_offset); ++			sc->tx_chan_width = (bss_conf->ht.width_40_ok) ? ++				ATH9K_HT_MACMODE_2040 : ATH9K_HT_MACMODE_20; +  +-			if (bss_conf->ht.width_40_ok) +-				sc->tx_chan_width = ATH9K_HT_MACMODE_2040; +-			else +-				sc->tx_chan_width = ATH9K_HT_MACMODE_20; ++			sc->sc_ah->ah_channels[pos].chanmode = ++				ath_get_extchanmode(sc, curchan, ++						    offset, sc->tx_chan_width); + 		} else { + 			sc->sc_ah->ah_channels[pos].chanmode = + 				(curchan->band == IEEE80211_BAND_2GHZ) ? +@@ -2172,9 +2185,22 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) + 			(curchan->band == IEEE80211_BAND_2GHZ) ? + 			CHANNEL_G : CHANNEL_A; +  +-		if (ath_set_channel(sc, &sc->sc_ah->ah_channels[pos]) < 0) ++		if ((sc->sc_ah->ah_opmode == ATH9K_M_HOSTAP) && ++		    (conf->ht.enabled)) { ++			sc->tx_chan_width = (!!conf->ht.sec_chan_offset) ? ++				ATH9K_HT_MACMODE_2040 : ATH9K_HT_MACMODE_20; ++ ++			sc->sc_ah->ah_channels[pos].chanmode = ++				ath_get_extchanmode(sc, curchan, ++						    conf->ht.sec_chan_offset, ++						    sc->tx_chan_width); ++		} ++ ++		if (ath_set_channel(sc, &sc->sc_ah->ah_channels[pos]) < 0) { + 			DPRINTF(sc, ATH_DBG_FATAL, + 				"%s: Unable to set channel\n", __func__); ++			return -EINVAL; ++		} + 	} +  + 	if (changed & IEEE80211_CONF_CHANGE_HT) +diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c +index 93dfea8..7c08583 100644 +--- a/drivers/net/wireless/ath9k/rc.c ++++ b/drivers/net/wireless/ath9k/rc.c +@@ -1304,6 +1304,38 @@ static void ath_rc_tx_status(struct ath_softc *sc, + 			 xretries, long_retry); + } +  ++static struct ath_rate_table *ath_choose_rate_table(struct ath_softc *sc, ++						    enum ieee80211_band band, ++						    bool is_ht, bool is_cw_40) ++{ ++	int mode = 0; ++ ++	switch(band) { ++	case IEEE80211_BAND_2GHZ: ++		mode = ATH9K_MODE_11G; ++		if (is_ht) ++			mode = ATH9K_MODE_11NG_HT20; ++		if (is_cw_40) ++			mode = ATH9K_MODE_11NG_HT40PLUS; ++		break; ++	case IEEE80211_BAND_5GHZ: ++		mode = ATH9K_MODE_11A; ++		if (is_ht) ++			mode = ATH9K_MODE_11NA_HT20; ++		if (is_cw_40) ++			mode = ATH9K_MODE_11NA_HT40PLUS; ++		break; ++	default: ++		DPRINTF(sc, ATH_DBG_RATE, "Invalid band\n"); ++		return NULL; ++	} ++ ++	BUG_ON(mode >= ATH9K_MODE_MAX); ++ ++	DPRINTF(sc, ATH_DBG_RATE, "Choosing rate table for mode: %d\n", mode); ++	return sc->hw_rate_table[mode]; ++} ++ + static void ath_rc_init(struct ath_softc *sc, + 			struct ath_rate_priv *ath_rc_priv, + 			struct ieee80211_supported_band *sband, +@@ -1314,16 +1346,25 @@ static void ath_rc_init(struct ath_softc *sc, + 	u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates; + 	u8 i, j, k, hi = 0, hthi = 0; +  +-	rate_table = sc->hw_rate_table[sc->sc_curmode]; ++	/* FIXME: Adhoc */ ++	if ((sc->sc_ah->ah_opmode == ATH9K_M_STA) || ++	    (sc->sc_ah->ah_opmode == ATH9K_M_IBSS)) { ++		bool is_cw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40; ++		rate_table = ath_choose_rate_table(sc, sband->band, ++						   sta->ht_cap.ht_supported, ++						   is_cw_40); ++	} else if (sc->sc_ah->ah_opmode == ATH9K_M_HOSTAP) { ++		/* sc_curmode would be set on init through config() */ ++		rate_table = sc->hw_rate_table[sc->sc_curmode]; ++	} +  +-	if (sta->ht_cap.ht_supported) { +-		if (sband->band == IEEE80211_BAND_2GHZ) +-			rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT20]; +-		else +-			rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT20]; ++	if (!rate_table) { ++		DPRINTF(sc, ATH_DBG_FATAL, "Rate table not initialized\n"); ++		return; ++	} +  ++	if (sta->ht_cap.ht_supported) { + 		ath_rc_priv->ht_cap = (WLAN_RC_HT_FLAG | WLAN_RC_DS_FLAG); +- + 		if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) + 			ath_rc_priv->ht_cap |= WLAN_RC_40_FLAG; + 	} +--  +1.6.0.3 + +-- +To unsubscribe from this list: send the line "unsubscribe linux-wireless" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at  http://vger.kernel.org/majordomo-info.html + | 
