diff options
Diffstat (limited to 'package/mac80211/patches/414-mac80211-slot-time.patch')
-rw-r--r-- | package/mac80211/patches/414-mac80211-slot-time.patch | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/package/mac80211/patches/414-mac80211-slot-time.patch b/package/mac80211/patches/414-mac80211-slot-time.patch new file mode 100644 index 0000000000..145e273e5b --- /dev/null +++ b/package/mac80211/patches/414-mac80211-slot-time.patch @@ -0,0 +1,201 @@ +Subject: mac80211: fix short slot handling + +This patch makes mac80211 handle short slot requests from the AP +properly. Also warn about uses of IEEE80211_CONF_SHORT_SLOT_TIME +and optimise out the code since it cannot ever be hit anyway. + +Signed-off-by: Johannes Berg <johannes@sipsolutions.net> +--- + include/net/mac80211.h | 28 ++++++++++-------- + net/mac80211/main.c | 9 +++-- + net/mac80211/mlme.c | 74 ++++++++++++++++++++++++++----------------------- + 3 files changed, 62 insertions(+), 49 deletions(-) + +--- everything.orig/net/mac80211/main.c 2008-10-07 20:06:43.000000000 +0200 ++++ everything/net/mac80211/main.c 2008-10-08 10:56:29.000000000 +0200 +@@ -346,9 +346,12 @@ void ieee80211_bss_info_change_notify(st + + u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata) + { +- sdata->bss_conf.use_cts_prot = 0; +- sdata->bss_conf.use_short_preamble = 0; +- return BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_ERP_PREAMBLE; ++ sdata->bss_conf.use_cts_prot = false; ++ sdata->bss_conf.use_short_preamble = false; ++ sdata->bss_conf.use_short_slot = false; ++ return BSS_CHANGED_ERP_CTS_PROT | ++ BSS_CHANGED_ERP_PREAMBLE | ++ BSS_CHANGED_ERP_SLOT; + } + + void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, +--- everything.orig/net/mac80211/mlme.c 2008-10-07 20:05:49.000000000 +0200 ++++ everything/net/mac80211/mlme.c 2008-10-08 10:56:38.000000000 +0200 +@@ -568,9 +568,8 @@ static void ieee80211_sta_wmm_params(str + } + } + +-static u32 ieee80211_handle_protect_preamb(struct ieee80211_sub_if_data *sdata, +- bool use_protection, +- bool use_short_preamble) ++static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, ++ u16 capab, bool erp_valid, u8 erp) + { + struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; + #ifdef CONFIG_MAC80211_VERBOSE_DEBUG +@@ -578,6 +577,19 @@ static u32 ieee80211_handle_protect_prea + DECLARE_MAC_BUF(mac); + #endif + u32 changed = 0; ++ bool use_protection; ++ bool use_short_preamble; ++ bool use_short_slot; ++ ++ if (erp_valid) { ++ use_protection = (erp & WLAN_ERP_USE_PROTECTION) != 0; ++ use_short_preamble = (erp & WLAN_ERP_BARKER_PREAMBLE) == 0; ++ } else { ++ use_protection = false; ++ use_short_preamble = !!(capab & WLAN_CAPABILITY_SHORT_PREAMBLE); ++ } ++ ++ use_short_slot = !!(capab & WLAN_CAPABILITY_SHORT_SLOT_TIME); + + if (use_protection != bss_conf->use_cts_prot) { + #ifdef CONFIG_MAC80211_VERBOSE_DEBUG +@@ -607,30 +619,18 @@ static u32 ieee80211_handle_protect_prea + changed |= BSS_CHANGED_ERP_PREAMBLE; + } + +- return changed; +-} +- +-static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata, +- u8 erp_value) +-{ +- bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0; +- bool use_short_preamble = (erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0; +- +- return ieee80211_handle_protect_preamb(sdata, +- use_protection, use_short_preamble); +-} +- +-static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, +- struct ieee80211_bss *bss) +-{ +- u32 changed = 0; +- +- if (bss->has_erp_value) +- changed |= ieee80211_handle_erp_ie(sdata, bss->erp_value); +- else { +- u16 capab = bss->capability; +- changed |= ieee80211_handle_protect_preamb(sdata, false, +- (capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0); ++ if (use_short_slot != bss_conf->use_short_slot) { ++#ifdef CONFIG_MAC80211_VERBOSE_DEBUG ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "%s: switched to %s slot" ++ " (BSSID=%s)\n", ++ sdata->dev->name, ++ use_short_slot ? "short" : "long", ++ print_mac(mac, ifsta->bssid)); ++ } ++#endif ++ bss_conf->use_short_slot = use_short_slot; ++ changed |= BSS_CHANGED_ERP_SLOT; + } + + return changed; +@@ -723,7 +723,8 @@ static void ieee80211_set_associated(str + sdata->bss_conf.timestamp = bss->timestamp; + sdata->bss_conf.dtim_period = bss->dtim_period; + +- changed |= ieee80211_handle_bss_capability(sdata, bss); ++ changed |= ieee80211_handle_bss_capability(sdata, ++ bss->capability, bss->has_erp_value, bss->erp_value); + + ieee80211_rx_bss_put(local, bss); + } +@@ -1675,6 +1676,8 @@ static void ieee80211_rx_mgmt_beacon(str + struct ieee80211_local *local = sdata->local; + struct ieee80211_conf *conf = &local->hw.conf; + u32 changed = 0; ++ bool erp_valid; ++ u8 erp_value = 0; + + /* Process beacon from the current BSS */ + baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; +@@ -1696,13 +1699,16 @@ static void ieee80211_rx_mgmt_beacon(str + ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param, + elems.wmm_param_len); + +- if (elems.erp_info && elems.erp_info_len >= 1) +- changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]); +- else { +- u16 capab = le16_to_cpu(mgmt->u.beacon.capab_info); +- changed |= ieee80211_handle_protect_preamb(sdata, false, +- (capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0); ++ ++ if (elems.erp_info && elems.erp_info_len >= 1) { ++ erp_valid = true; ++ erp_value = elems.erp_info[0]; ++ } else { ++ erp_valid = false; + } ++ changed |= ieee80211_handle_bss_capability(sdata, ++ le16_to_cpu(mgmt->u.beacon.capab_info), ++ erp_valid, erp_value); + + if (elems.ht_cap_elem && elems.ht_info_elem && + elems.wmm_param && conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) { +--- everything.orig/include/net/mac80211.h 2008-10-07 20:06:43.000000000 +0200 ++++ everything/include/net/mac80211.h 2008-10-08 10:57:06.000000000 +0200 +@@ -180,8 +180,12 @@ enum ieee80211_bss_change { + * @assoc: association status + * @aid: association ID number, valid only when @assoc is true + * @use_cts_prot: use CTS protection +- * @use_short_preamble: use 802.11b short preamble +- * @use_short_slot: use short slot time (only relevant for ERP) ++ * @use_short_preamble: use 802.11b short preamble; ++ * if the hardware cannot handle this it must set the ++ * IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE hardware flag ++ * @use_short_slot: use short slot time (only relevant for ERP); ++ * if the hardware cannot handle this it must set the ++ * IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE hardware flag + * @dtim_period: num of beacons before the next DTIM, for PSM + * @timestamp: beacon timestamp + * @beacon_int: beacon interval +@@ -442,23 +446,23 @@ struct ieee80211_rx_status { + * + * Flags to define PHY configuration options + * +- * @IEEE80211_CONF_SHORT_SLOT_TIME: use 802.11g short slot time + * @IEEE80211_CONF_RADIOTAP: add radiotap header at receive time (if supported) + * @IEEE80211_CONF_SUPPORT_HT_MODE: use 802.11n HT capabilities (if supported) + * @IEEE80211_CONF_PS: Enable 802.11 power save mode + */ + enum ieee80211_conf_flags { +- /* +- * TODO: IEEE80211_CONF_SHORT_SLOT_TIME will be removed once drivers +- * have been converted to use bss_info_changed() for slot time +- * configuration +- */ +- IEEE80211_CONF_SHORT_SLOT_TIME = (1<<0), +- IEEE80211_CONF_RADIOTAP = (1<<1), +- IEEE80211_CONF_SUPPORT_HT_MODE = (1<<2), +- IEEE80211_CONF_PS = (1<<3), ++ IEEE80211_CONF_RADIOTAP = (1<<0), ++ IEEE80211_CONF_SUPPORT_HT_MODE = (1<<1), ++ IEEE80211_CONF_PS = (1<<2), + }; + ++/* XXX: remove all this once drivers stop trying to use it */ ++static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void) ++{ ++ return 0; ++} ++#define IEEE80211_CONF_SHORT_SLOT_TIME (__IEEE80211_CONF_SHORT_SLOT_TIME()) ++ + /** + * struct ieee80211_conf - configuration of the device + * |