diff options
31 files changed, 544 insertions, 708 deletions
diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index 58961a49be..25df7aa319 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2011-11-04 +PKG_VERSION:=2011-11-15 PKG_RELEASE:=1 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources -PKG_MD5SUM:=baed52c81864c72887a6d3a88447e0d0 +PKG_MD5SUM:=0bb667c7fecbc244840d806df0604661 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) diff --git a/package/mac80211/patches/050-compat_firmware.patch b/package/mac80211/patches/050-compat_firmware.patch index f4cc27d405..c51c672139 100644 --- a/package/mac80211/patches/050-compat_firmware.patch +++ b/package/mac80211/patches/050-compat_firmware.patch @@ -59,7 +59,7 @@ static int __init compat_init(void) { /* pm-qos for kernels <= 2.6.24, this is a no-op on newer kernels */ -@@ -45,15 +56,15 @@ static int __init compat_init(void) +@@ -46,7 +57,8 @@ static int __init compat_init(void) COMPAT_BASE_TREE " " COMPAT_BASE_TREE_VERSION "\n"); @@ -69,12 +69,13 @@ } module_init(compat_init); - static void __exit compat_exit(void) - { +@@ -55,7 +67,8 @@ static void __exit compat_exit(void) compat_pm_qos_power_deinit(); -- + compat_system_workqueue_destroy(); + - return; + firmware_class_exit(); ++ return; } module_exit(compat_exit); diff --git a/package/mac80211/patches/100-disable_pcmcia_compat.patch b/package/mac80211/patches/100-disable_pcmcia_compat.patch index 99f250ab3c..52979ad880 100644 --- a/package/mac80211/patches/100-disable_pcmcia_compat.patch +++ b/package/mac80211/patches/100-disable_pcmcia_compat.patch @@ -51,7 +51,7 @@ #include <pcmcia/cs_types.h> #include <pcmcia/cistpl.h> #include <pcmcia/ds.h> -@@ -65,9 +65,9 @@ static inline struct sk_buff *netdev_all +@@ -68,9 +68,9 @@ static inline struct sk_buff *netdev_all return skb; } diff --git a/package/mac80211/patches/120-pr_fmt_warnings.patch b/package/mac80211/patches/120-pr_fmt_warnings.patch index 920398e501..53add829ba 100644 --- a/package/mac80211/patches/120-pr_fmt_warnings.patch +++ b/package/mac80211/patches/120-pr_fmt_warnings.patch @@ -147,7 +147,7 @@ +#undef pr_fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - #include <linux/moduleparam.h> + #include <linux/module.h> --- a/drivers/net/wireless/libertas/mesh.c +++ b/drivers/net/wireless/libertas/mesh.c @@ -1,3 +1,4 @@ diff --git a/package/mac80211/patches/140-mesh_pathtbl_backport.patch b/package/mac80211/patches/140-mesh_pathtbl_backport.patch index aae5559e86..2a3591373d 100644 --- a/package/mac80211/patches/140-mesh_pathtbl_backport.patch +++ b/package/mac80211/patches/140-mesh_pathtbl_backport.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/mesh_pathtbl.c +++ b/net/mac80211/mesh_pathtbl.c -@@ -844,7 +844,6 @@ static void table_flush_by_iface(struct +@@ -841,7 +841,6 @@ static void table_flush_by_iface(struct struct hlist_node *p; int i; diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 371e82bcae..3a4a059b45 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -1,6 +1,363 @@ +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -118,7 +118,7 @@ void ath9k_ps_restore(struct ath_softc * + if (--sc->ps_usecount != 0) + goto unlock; + +- if (sc->ps_idle) ++ if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK)) + mode = ATH9K_PM_FULL_SLEEP; + else if (sc->ps_enabled && + !(sc->ps_flags & (PS_WAIT_FOR_BEACON | +@@ -332,7 +332,8 @@ static int ath_reset_internal(struct ath + hchan = ah->curchan; + } + +- if (fastcc && !ath9k_hw_check_alive(ah)) ++ if (fastcc && (ah->chip_fullsleep || ++ !ath9k_hw_check_alive(ah))) + fastcc = false; + + if (!ath_prepare_reset(sc, retry_tx, flush)) +@@ -882,82 +883,6 @@ chip_reset: + #undef SCHED_INTR + } + +-static void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw) +-{ +- struct ath_hw *ah = sc->sc_ah; +- struct ath_common *common = ath9k_hw_common(ah); +- struct ieee80211_channel *channel = hw->conf.channel; +- int r; +- +- ath9k_ps_wakeup(sc); +- spin_lock_bh(&sc->sc_pcu_lock); +- atomic_set(&ah->intr_ref_cnt, -1); +- +- ath9k_hw_configpcipowersave(ah, false); +- +- if (!ah->curchan) +- ah->curchan = ath9k_cmn_get_curchannel(sc->hw, ah); +- +- r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); +- if (r) { +- ath_err(common, +- "Unable to reset channel (%u MHz), reset status %d\n", +- channel->center_freq, r); +- } +- +- ath_complete_reset(sc, true); +- +- /* Enable LED */ +- ath9k_hw_cfg_output(ah, ah->led_pin, +- AR_GPIO_OUTPUT_MUX_AS_OUTPUT); +- ath9k_hw_set_gpio(ah, ah->led_pin, 0); +- +- spin_unlock_bh(&sc->sc_pcu_lock); +- +- ath9k_ps_restore(sc); +-} +- +-void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) +-{ +- struct ath_hw *ah = sc->sc_ah; +- struct ieee80211_channel *channel = hw->conf.channel; +- int r; +- +- ath9k_ps_wakeup(sc); +- +- ath_cancel_work(sc); +- +- spin_lock_bh(&sc->sc_pcu_lock); +- +- /* +- * Keep the LED on when the radio is disabled +- * during idle unassociated state. +- */ +- if (!sc->ps_idle) { +- ath9k_hw_set_gpio(ah, ah->led_pin, 1); +- ath9k_hw_cfg_gpio_input(ah, ah->led_pin); +- } +- +- ath_prepare_reset(sc, false, true); +- +- if (!ah->curchan) +- ah->curchan = ath9k_cmn_get_curchannel(hw, ah); +- +- r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); +- if (r) { +- ath_err(ath9k_hw_common(sc->sc_ah), +- "Unable to reset channel (%u MHz), reset status %d\n", +- channel->center_freq, r); +- } +- +- ath9k_hw_phy_disable(ah); +- +- ath9k_hw_configpcipowersave(ah, true); +- +- spin_unlock_bh(&sc->sc_pcu_lock); +- ath9k_ps_restore(sc); +-} +- + static int ath_reset(struct ath_softc *sc, bool retry_tx) + { + int r; +@@ -1093,6 +1018,9 @@ static int ath9k_start(struct ieee80211_ + * and then setup of the interrupt mask. + */ + spin_lock_bh(&sc->sc_pcu_lock); ++ ++ atomic_set(&ah->intr_ref_cnt, -1); ++ + r = ath9k_hw_reset(ah, init_channel, ah->caldata, false); + if (r) { + ath_err(common, +@@ -1131,6 +1059,18 @@ static int ath9k_start(struct ieee80211_ + goto mutex_unlock; + } + ++ if (ah->led_pin >= 0) { ++ ath9k_hw_cfg_output(ah, ah->led_pin, ++ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_set_gpio(ah, ah->led_pin, 0); ++ } ++ ++ /* ++ * Reset key cache to sane defaults (all entries cleared) instead of ++ * semi-random values after suspend/resume. ++ */ ++ ath9k_cmn_init_crypto(sc->sc_ah); ++ + spin_unlock_bh(&sc->sc_pcu_lock); + + if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) && +@@ -1176,6 +1116,13 @@ static void ath9k_tx(struct ieee80211_hw + } + } + ++ /* ++ * Cannot tx while the hardware is in full sleep, it first needs a full ++ * chip reset to recover from that ++ */ ++ if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) ++ goto exit; ++ + if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) { + /* + * We are using PS-Poll and mac80211 can request TX while in +@@ -1222,6 +1169,7 @@ static void ath9k_stop(struct ieee80211_ + struct ath_softc *sc = hw->priv; + struct ath_hw *ah = sc->sc_ah; + struct ath_common *common = ath9k_hw_common(ah); ++ bool prev_idle; + + mutex_lock(&sc->mutex); + +@@ -1252,35 +1200,45 @@ static void ath9k_stop(struct ieee80211_ + * before setting the invalid flag. */ + ath9k_hw_disable_interrupts(ah); + +- if (!(sc->sc_flags & SC_OP_INVALID)) { +- ath_drain_all_txq(sc, false); +- ath_stoprecv(sc); +- ath9k_hw_phy_disable(ah); +- } else +- sc->rx.rxlink = NULL; ++ spin_unlock_bh(&sc->sc_pcu_lock); ++ ++ /* we can now sync irq and kill any running tasklets, since we already ++ * disabled interrupts and not holding a spin lock */ ++ synchronize_irq(sc->irq); ++ tasklet_kill(&sc->intr_tq); ++ tasklet_kill(&sc->bcon_tasklet); ++ ++ prev_idle = sc->ps_idle; ++ sc->ps_idle = true; ++ ++ spin_lock_bh(&sc->sc_pcu_lock); ++ ++ if (ah->led_pin >= 0) { ++ ath9k_hw_set_gpio(ah, ah->led_pin, 1); ++ ath9k_hw_cfg_gpio_input(ah, ah->led_pin); ++ } ++ ++ ath_prepare_reset(sc, false, true); + + if (sc->rx.frag) { + dev_kfree_skb_any(sc->rx.frag); + sc->rx.frag = NULL; + } + +- /* disable HAL and put h/w to sleep */ +- ath9k_hw_disable(ah); ++ if (!ah->curchan) ++ ah->curchan = ath9k_cmn_get_curchannel(hw, ah); + +- spin_unlock_bh(&sc->sc_pcu_lock); ++ ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); ++ ath9k_hw_phy_disable(ah); + +- /* we can now sync irq and kill any running tasklets, since we already +- * disabled interrupts and not holding a spin lock */ +- synchronize_irq(sc->irq); +- tasklet_kill(&sc->intr_tq); +- tasklet_kill(&sc->bcon_tasklet); ++ ath9k_hw_configpcipowersave(ah, true); + +- ath9k_ps_restore(sc); ++ spin_unlock_bh(&sc->sc_pcu_lock); + +- sc->ps_idle = true; +- ath_radio_disable(sc, hw); ++ ath9k_ps_restore(sc); + + sc->sc_flags |= SC_OP_INVALID; ++ sc->ps_idle = prev_idle; + + mutex_unlock(&sc->mutex); + +@@ -1620,8 +1578,8 @@ static int ath9k_config(struct ieee80211 + struct ath_hw *ah = sc->sc_ah; + struct ath_common *common = ath9k_hw_common(ah); + struct ieee80211_conf *conf = &hw->conf; +- bool disable_radio = false; + ++ ath9k_ps_wakeup(sc); + mutex_lock(&sc->mutex); + + /* +@@ -1632,13 +1590,8 @@ static int ath9k_config(struct ieee80211 + */ + if (changed & IEEE80211_CONF_CHANGE_IDLE) { + sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); +- if (!sc->ps_idle) { +- ath_radio_enable(sc, hw); +- ath_dbg(common, ATH_DBG_CONFIG, +- "not-idle: enabling radio\n"); +- } else { +- disable_radio = true; +- } ++ if (sc->ps_idle) ++ ath_cancel_work(sc); + } + + /* +@@ -1745,18 +1698,12 @@ static int ath9k_config(struct ieee80211 + ath_dbg(common, ATH_DBG_CONFIG, + "Set power: %d\n", conf->power_level); + sc->config.txpowlimit = 2 * conf->power_level; +- ath9k_ps_wakeup(sc); + ath9k_cmn_update_txpow(ah, sc->curtxpow, + sc->config.txpowlimit, &sc->curtxpow); +- ath9k_ps_restore(sc); +- } +- +- if (disable_radio) { +- ath_dbg(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); +- ath_radio_disable(sc, hw); + } + + mutex_unlock(&sc->mutex); ++ ath9k_ps_restore(sc); + + return 0; + } +@@ -2324,9 +2271,6 @@ static void ath9k_flush(struct ieee80211 + return; + } + +- if (drop) +- timeout = 1; +- + for (j = 0; j < timeout; j++) { + bool npend = false; + +@@ -2344,21 +2288,22 @@ static void ath9k_flush(struct ieee80211 + } + + if (!npend) +- goto out; ++ break; + } + +- ath9k_ps_wakeup(sc); +- spin_lock_bh(&sc->sc_pcu_lock); +- drain_txq = ath_drain_all_txq(sc, false); +- spin_unlock_bh(&sc->sc_pcu_lock); ++ if (drop) { ++ ath9k_ps_wakeup(sc); ++ spin_lock_bh(&sc->sc_pcu_lock); ++ drain_txq = ath_drain_all_txq(sc, false); ++ spin_unlock_bh(&sc->sc_pcu_lock); + +- if (!drain_txq) +- ath_reset(sc, false); ++ if (!drain_txq) ++ ath_reset(sc, false); + +- ath9k_ps_restore(sc); +- ieee80211_wake_queues(hw); ++ ath9k_ps_restore(sc); ++ ieee80211_wake_queues(hw); ++ } + +-out: + ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); + mutex_unlock(&sc->mutex); + } +--- a/drivers/net/wireless/ath/ath9k/pci.c ++++ b/drivers/net/wireless/ath/ath9k/pci.c +@@ -307,12 +307,11 @@ static int ath_pci_suspend(struct device + struct ieee80211_hw *hw = pci_get_drvdata(pdev); + struct ath_softc *sc = hw->priv; + +- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); +- + /* The device has to be moved to FULLSLEEP forcibly. + * Otherwise the chip never moved to full sleep, + * when no interface is up. + */ ++ ath9k_hw_disable(sc->sc_ah); + ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); + + return 0; +@@ -334,22 +333,6 @@ static int ath_pci_resume(struct device + if ((val & 0x0000ff00) != 0) + pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); + +- ath9k_ps_wakeup(sc); +- /* Enable LED */ +- ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, +- AR_GPIO_OUTPUT_MUX_AS_OUTPUT); +- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); +- +- /* +- * Reset key cache to sane defaults (all entries cleared) instead of +- * semi-random values after suspend/resume. +- */ +- ath9k_cmn_init_crypto(sc->sc_ah); +- ath9k_ps_restore(sc); +- +- sc->ps_idle = true; +- ath_radio_disable(sc, hw); +- + return 0; + } + +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -1955,7 +1955,7 @@ static void ath_tx_complete(struct ath_s + skb_pull(skb, padsize); + } + +- if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) { ++ if ((sc->ps_flags & PS_WAIT_FOR_TX_ACK) && !txq->axq_depth) { + sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; + ath_dbg(common, ATH_DBG_PS, + "Going back to sleep after having received TX status (0x%lx)\n", --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -1122,6 +1122,7 @@ struct cfg80211_ibss_params { +@@ -1130,6 +1130,7 @@ struct cfg80211_ibss_params { u8 *ssid; u8 *bssid; struct ieee80211_channel *channel; @@ -8,9 +365,9 @@ u8 *ie; u8 ssid_len, ie_len; u16 beacon_interval; -@@ -3188,6 +3189,16 @@ void cfg80211_gtk_rekey_notify(struct ne - void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, - const u8 *bssid, bool preauth, gfp_t gfp); +@@ -3292,6 +3293,16 @@ void cfg80211_report_obss_beacon(struct + const u8 *frame, size_t len, + int freq, gfp_t gfp); +/** + * cfg80211_can_use_ext_chan - test if ht40 on extension channel can be used @@ -27,7 +384,7 @@ /* wiphy_printk helpers, similar to dev_printk */ --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c -@@ -180,6 +180,10 @@ static void ieee80211_send_addba_resp(st +@@ -182,6 +182,10 @@ static void ieee80211_send_addba_resp(st memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); @@ -40,12 +397,12 @@ IEEE80211_STYPE_ACTION); --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c -@@ -77,10 +77,13 @@ static void ieee80211_send_addba_request - memcpy(mgmt->da, da, ETH_ALEN); +@@ -79,10 +79,13 @@ static void ieee80211_send_addba_request memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); if (sdata->vif.type == NL80211_IFTYPE_AP || -- sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN || + sdata->vif.type == NL80211_IFTYPE_AP_VLAN || +- sdata->vif.type == NL80211_IFTYPE_MESH_POINT) ++ sdata->vif.type == NL80211_IFTYPE_MESH_POINT || + sdata->vif.type == NL80211_IFTYPE_WDS) memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) @@ -55,9 +412,9 @@ mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION); -@@ -397,7 +400,9 @@ int ieee80211_start_tx_ba_session(struct - */ +@@ -394,7 +397,9 @@ int ieee80211_start_tx_ba_session(struct if (sdata->vif.type != NL80211_IFTYPE_STATION && + sdata->vif.type != NL80211_IFTYPE_MESH_POINT && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && - sdata->vif.type != NL80211_IFTYPE_AP) + sdata->vif.type != NL80211_IFTYPE_AP && @@ -84,7 +441,7 @@ TEST(TDLS_PEER_AUTH)); --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c -@@ -199,6 +199,8 @@ void ieee80211_send_delba(struct ieee802 +@@ -201,6 +201,8 @@ void ieee80211_send_delba(struct ieee802 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); @@ -103,7 +460,7 @@ lockdep_assert_held(&ifibss->mtx); -@@ -104,8 +105,16 @@ static void __ieee80211_sta_join_ibss(st +@@ -105,8 +106,16 @@ static void __ieee80211_sta_join_ibss(st sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; @@ -122,7 +479,7 @@ ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); sband = local->hw.wiphy->bands[chan->band]; -@@ -171,6 +180,18 @@ static void __ieee80211_sta_join_ibss(st +@@ -172,6 +181,18 @@ static void __ieee80211_sta_join_ibss(st memcpy(skb_put(skb, ifibss->ie_len), ifibss->ie, ifibss->ie_len); @@ -141,7 +498,7 @@ if (local->hw.queues >= 4) { pos = skb_put(skb, 9); *pos++ = WLAN_EID_VENDOR_SPECIFIC; -@@ -194,6 +215,7 @@ static void __ieee80211_sta_join_ibss(st +@@ -195,6 +216,7 @@ static void __ieee80211_sta_join_ibss(st bss_change |= BSS_CHANGED_BEACON; bss_change |= BSS_CHANGED_BEACON_ENABLED; bss_change |= BSS_CHANGED_BASIC_RATES; @@ -149,7 +506,7 @@ bss_change |= BSS_CHANGED_IBSS; sdata->vif.bss_conf.ibss_joined = true; ieee80211_bss_info_change_notify(sdata, bss_change); -@@ -266,6 +288,7 @@ static void ieee80211_rx_bss_info(struct +@@ -268,6 +290,7 @@ static void ieee80211_rx_bss_info(struct u64 beacon_timestamp, rx_timestamp; u32 supp_rates = 0; enum ieee80211_band band = rx_status->band; @@ -157,7 +514,7 @@ if (elems->ds_params && elems->ds_params_len == 1) freq = ieee80211_channel_to_frequency(elems->ds_params[0], -@@ -275,7 +298,10 @@ static void ieee80211_rx_bss_info(struct +@@ -277,7 +300,10 @@ static void ieee80211_rx_bss_info(struct channel = ieee80211_get_channel(local->hw.wiphy, freq); @@ -169,7 +526,7 @@ return; if (sdata->vif.type == NL80211_IFTYPE_ADHOC && -@@ -313,8 +339,41 @@ static void ieee80211_rx_bss_info(struct +@@ -315,8 +341,41 @@ static void ieee80211_rx_bss_info(struct GFP_ATOMIC); } @@ -213,7 +570,7 @@ rcu_read_unlock(); } -@@ -896,10 +955,15 @@ int ieee80211_ibss_join(struct ieee80211 +@@ -898,10 +957,15 @@ int ieee80211_ibss_join(struct ieee80211 struct sk_buff *skb; skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + @@ -233,7 +590,7 @@ params->ie_len); if (!skb) return -ENOMEM; -@@ -920,13 +984,15 @@ int ieee80211_ibss_join(struct ieee80211 +@@ -922,13 +986,15 @@ int ieee80211_ibss_join(struct ieee80211 sdata->vif.bss_conf.beacon_int = params->beacon_interval; sdata->u.ibss.channel = params->channel; @@ -253,7 +610,7 @@ if (params->ie) { --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -465,6 +465,7 @@ struct ieee80211_if_ibss { +@@ -470,6 +470,7 @@ struct ieee80211_if_ibss { u8 ssid_len, ie_len; u8 *ie; struct ieee80211_channel *channel; @@ -261,28 +618,6 @@ unsigned long ibss_join_req; /* probe response/beacon for IBSS */ -@@ -1339,6 +1340,12 @@ void ieee80211_recalc_smps(struct ieee80 - size_t ieee80211_ie_split(const u8 *ies, size_t ielen, - const u8 *ids, int n_ids, size_t offset); - size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset); -+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, -+ u16 cap); -+u8 *ieee80211_ie_build_ht_info(u8 *pos, -+ struct ieee80211_sta_ht_cap *ht_cap, -+ struct ieee80211_channel *channel, -+ enum nl80211_channel_type channel_type); - - /* internal work items */ - void ieee80211_work_init(struct ieee80211_local *local); -@@ -1367,6 +1374,8 @@ ieee80211_get_channel_mode(struct ieee80 - bool ieee80211_set_channel_type(struct ieee80211_local *local, - struct ieee80211_sub_if_data *sdata, - enum nl80211_channel_type chantype); -+enum nl80211_channel_type -+ieee80211_ht_info_to_channel_type(struct ieee80211_ht_info *ht_info); - - #ifdef CONFIG_MAC80211_NOINLINE - #define debug_noinline noinline --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -178,7 +178,6 @@ static int ieee80211_do_open(struct net_ @@ -293,7 +628,7 @@ u32 changed = 0; int res; u32 hw_reconf_flags = 0; -@@ -290,27 +289,6 @@ static int ieee80211_do_open(struct net_ +@@ -309,27 +308,6 @@ static int ieee80211_do_open(struct net_ set_bit(SDATA_STATE_RUNNING, &sdata->state); @@ -321,17 +656,17 @@ /* * set_multicast_list will be invoked by the networking core * which will check whether any increments here were done in -@@ -344,8 +322,7 @@ static int ieee80211_do_open(struct net_ +@@ -356,8 +334,7 @@ static int ieee80211_do_open(struct net_ netif_tx_start_all_queues(dev); return 0; - err_del_interface: -- drv_remove_interface(local, &sdata->vif); +- drv_remove_interface(local, sdata); + err_stop: if (!local->open_count) drv_stop(local); -@@ -716,6 +693,70 @@ static void ieee80211_if_setup(struct ne +@@ -732,6 +709,70 @@ static void ieee80211_if_setup(struct ne dev->destructor = free_netdev; } @@ -402,7 +737,7 @@ static void ieee80211_iface_work(struct work_struct *work) { struct ieee80211_sub_if_data *sdata = -@@ -820,6 +861,9 @@ static void ieee80211_iface_work(struct +@@ -836,6 +877,9 @@ static void ieee80211_iface_work(struct break; ieee80211_mesh_rx_queued_mgmt(sdata, skb); break; @@ -412,11 +747,76 @@ default: WARN(1, "frame for unexpected interface type"); break; +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -1359,9 +1359,6 @@ static void __ieee80211_connection_loss( + ieee80211_set_disassoc(sdata, true, true); + mutex_unlock(&ifmgd->mtx); + +- mutex_lock(&local->mtx); +- ieee80211_recalc_idle(local); +- mutex_unlock(&local->mtx); + /* + * must be outside lock due to cfg80211, + * but that's not a problem. +@@ -1370,6 +1367,10 @@ static void __ieee80211_connection_loss( + IEEE80211_STYPE_DEAUTH, + WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, + NULL, true); ++ ++ mutex_lock(&local->mtx); ++ ieee80211_recalc_idle(local); ++ mutex_unlock(&local->mtx); + } + + void ieee80211_beacon_connection_loss_work(struct work_struct *work) +@@ -2136,9 +2137,6 @@ static void ieee80211_sta_connection_los + + ieee80211_set_disassoc(sdata, true, true); + mutex_unlock(&ifmgd->mtx); +- mutex_lock(&local->mtx); +- ieee80211_recalc_idle(local); +- mutex_unlock(&local->mtx); + /* + * must be outside lock due to cfg80211, + * but that's not a problem. +@@ -2146,6 +2144,11 @@ static void ieee80211_sta_connection_los + ieee80211_send_deauth_disassoc(sdata, bssid, + IEEE80211_STYPE_DEAUTH, reason, + NULL, true); ++ ++ mutex_lock(&local->mtx); ++ ieee80211_recalc_idle(local); ++ mutex_unlock(&local->mtx); ++ + mutex_lock(&ifmgd->mtx); + } + +--- a/net/mac80211/offchannel.c ++++ b/net/mac80211/offchannel.c +@@ -212,8 +212,6 @@ static void ieee80211_hw_roc_start(struc + return; + } + +- ieee80211_recalc_idle(local); +- + if (local->hw_roc_skb) { + sdata = IEEE80211_DEV_TO_SUB_IF(local->hw_roc_dev); + ieee80211_tx_skb(sdata, local->hw_roc_skb); +@@ -227,6 +225,8 @@ static void ieee80211_hw_roc_start(struc + GFP_KERNEL); + } + ++ ieee80211_recalc_idle(local); ++ + mutex_unlock(&local->mtx); + } + --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -2211,7 +2211,9 @@ ieee80211_rx_h_action(struct ieee80211_r - */ +@@ -2250,7 +2250,9 @@ ieee80211_rx_h_action(struct ieee80211_r if (sdata->vif.type != NL80211_IFTYPE_STATION && + sdata->vif.type != NL80211_IFTYPE_MESH_POINT && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && - sdata->vif.type != NL80211_IFTYPE_AP) + sdata->vif.type != NL80211_IFTYPE_AP && @@ -425,7 +825,7 @@ break; /* verify action_code is present */ -@@ -2426,13 +2428,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ +@@ -2465,13 +2467,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ if (!ieee80211_vif_is_mesh(&sdata->vif) && sdata->vif.type != NL80211_IFTYPE_ADHOC && @@ -442,7 +842,7 @@ break; case cpu_to_le16(IEEE80211_STYPE_DEAUTH): case cpu_to_le16(IEEE80211_STYPE_DISASSOC): -@@ -2775,10 +2778,16 @@ static int prepare_for_handlers(struct i +@@ -2818,10 +2821,16 @@ static int prepare_for_handlers(struct i } break; case NL80211_IFTYPE_WDS: @@ -471,7 +871,7 @@ * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the * IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next * frame to this station is transmitted. -@@ -61,7 +60,6 @@ enum ieee80211_sta_info_flags { +@@ -62,7 +61,6 @@ enum ieee80211_sta_info_flags { WLAN_STA_SHORT_PREAMBLE, WLAN_STA_ASSOC_AP, WLAN_STA_WME, @@ -479,181 +879,6 @@ WLAN_STA_CLEAR_PS_FILT, WLAN_STA_MFP, WLAN_STA_BLOCK_BA, ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -836,23 +836,8 @@ int ieee80211_build_preq_ies(struct ieee - offset = noffset; - } - -- if (sband->ht_cap.ht_supported) { -- u16 cap = sband->ht_cap.cap; -- __le16 tmp; -- -- *pos++ = WLAN_EID_HT_CAPABILITY; -- *pos++ = sizeof(struct ieee80211_ht_cap); -- memset(pos, 0, sizeof(struct ieee80211_ht_cap)); -- tmp = cpu_to_le16(cap); -- memcpy(pos, &tmp, sizeof(u16)); -- pos += sizeof(u16); -- *pos++ = sband->ht_cap.ampdu_factor | -- (sband->ht_cap.ampdu_density << -- IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); -- memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); -- pos += sizeof(sband->ht_cap.mcs); -- pos += 2 + 4 + 1; /* ext info, BF cap, antsel */ -- } -+ if (sband->ht_cap.ht_supported) -+ pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap); - - /* - * If adding more here, adjust code in main.c -@@ -1443,3 +1428,100 @@ int ieee80211_add_ext_srates_ie(struct i - } - return 0; - } -+ -+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, -+ u16 cap) -+{ -+ __le16 tmp; -+ -+ *pos++ = WLAN_EID_HT_CAPABILITY; -+ *pos++ = sizeof(struct ieee80211_ht_cap); -+ memset(pos, 0, sizeof(struct ieee80211_ht_cap)); -+ -+ /* capability flags */ -+ tmp = cpu_to_le16(cap); -+ memcpy(pos, &tmp, sizeof(u16)); -+ pos += sizeof(u16); -+ -+ /* AMPDU parameters */ -+ *pos++ = sband->ht_cap.ampdu_factor | -+ (sband->ht_cap.ampdu_density << -+ IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); -+ -+ /* MCS set */ -+ memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); -+ pos += sizeof(sband->ht_cap.mcs); -+ -+ /* extended capabilities */ -+ pos += sizeof(__le16); -+ -+ /* BF capabilities */ -+ pos += sizeof(__le32); -+ -+ /* antenna selection */ -+ pos += sizeof(u8); -+ -+ return pos; -+} -+ -+u8 *ieee80211_ie_build_ht_info(u8 *pos, -+ struct ieee80211_sta_ht_cap *ht_cap, -+ struct ieee80211_channel *channel, -+ enum nl80211_channel_type channel_type) -+{ -+ struct ieee80211_ht_info *ht_info; -+ /* Build HT Information */ -+ *pos++ = WLAN_EID_HT_INFORMATION; -+ *pos++ = sizeof(struct ieee80211_ht_info); -+ ht_info = (struct ieee80211_ht_info *)pos; -+ ht_info->control_chan = -+ ieee80211_frequency_to_channel(channel->center_freq); -+ switch (channel_type) { -+ case NL80211_CHAN_HT40MINUS: -+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW; -+ break; -+ case NL80211_CHAN_HT40PLUS: -+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; -+ break; -+ case NL80211_CHAN_HT20: -+ default: -+ ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE; -+ break; -+ } -+ if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) -+ ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; -+ ht_info->operation_mode = 0x0000; -+ ht_info->stbc_param = 0x0000; -+ -+ /* It seems that Basic MCS set and Supported MCS set -+ are identical for the first 10 bytes */ -+ memset(&ht_info->basic_set, 0, 16); -+ memcpy(&ht_info->basic_set, &ht_cap->mcs, 10); -+ -+ return pos + sizeof(struct ieee80211_ht_info); -+} -+ -+enum nl80211_channel_type -+ieee80211_ht_info_to_channel_type(struct ieee80211_ht_info *ht_info) -+{ -+ enum nl80211_channel_type channel_type; -+ -+ if (!ht_info) -+ return NL80211_CHAN_NO_HT; -+ -+ switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { -+ case IEEE80211_HT_PARAM_CHA_SEC_NONE: -+ channel_type = NL80211_CHAN_HT20; -+ break; -+ case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: -+ channel_type = NL80211_CHAN_HT40PLUS; -+ break; -+ case IEEE80211_HT_PARAM_CHA_SEC_BELOW: -+ channel_type = NL80211_CHAN_HT40MINUS; -+ break; -+ default: -+ channel_type = NL80211_CHAN_NO_HT; -+ } -+ -+ return channel_type; -+} ---- a/net/mac80211/work.c -+++ b/net/mac80211/work.c -@@ -118,7 +118,6 @@ static void ieee80211_add_ht_ie(struct s - u8 *pos; - u32 flags = channel->flags; - u16 cap = sband->ht_cap.cap; -- __le16 tmp; - - if (!sband->ht_cap.ht_supported) - return; -@@ -169,34 +168,8 @@ static void ieee80211_add_ht_ie(struct s - } - - /* reserve and fill IE */ -- - pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2); -- *pos++ = WLAN_EID_HT_CAPABILITY; -- *pos++ = sizeof(struct ieee80211_ht_cap); -- memset(pos, 0, sizeof(struct ieee80211_ht_cap)); -- -- /* capability flags */ -- tmp = cpu_to_le16(cap); -- memcpy(pos, &tmp, sizeof(u16)); -- pos += sizeof(u16); -- -- /* AMPDU parameters */ -- *pos++ = sband->ht_cap.ampdu_factor | -- (sband->ht_cap.ampdu_density << -- IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); -- -- /* MCS set */ -- memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); -- pos += sizeof(sband->ht_cap.mcs); -- -- /* extended capabilities */ -- pos += sizeof(__le16); -- -- /* BF capabilities */ -- pos += sizeof(__le32); -- -- /* antenna selection */ -- pos += sizeof(u8); -+ ieee80211_ie_build_ht_cap(pos, sband, cap); - } - - static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -44,9 +44,9 @@ rdev_freq_to_chan(struct cfg80211_regist @@ -690,7 +915,7 @@ "allowed to initiate communication\n"); --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -4574,13 +4574,34 @@ static int nl80211_join_ibss(struct sk_b +@@ -4604,13 +4604,34 @@ static int nl80211_join_ibss(struct sk_b ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); } diff --git a/package/mac80211/patches/402-ath9k_blink_default.patch b/package/mac80211/patches/402-ath9k_blink_default.patch index 0721227b94..6fa7f734c4 100644 --- a/package/mac80211/patches/402-ath9k_blink_default.patch +++ b/package/mac80211/patches/402-ath9k_blink_default.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -35,7 +35,7 @@ int ath9k_modparam_nohwcrypt; +@@ -36,7 +36,7 @@ int ath9k_modparam_nohwcrypt; module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444); MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption"); diff --git a/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch b/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch index bd4354813b..65853b970a 100644 --- a/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch +++ b/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch @@ -1,14 +1,14 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -16,6 +16,7 @@ - +@@ -17,6 +17,7 @@ #include <linux/io.h> #include <linux/slab.h> + #include <linux/module.h> +#include <linux/etherdevice.h> #include <asm/unaligned.h> #include "hw.h" -@@ -464,8 +465,16 @@ static int ath9k_hw_init_macaddr(struct +@@ -465,8 +466,16 @@ static int ath9k_hw_init_macaddr(struct common->macaddr[2 * i] = eeval >> 8; common->macaddr[2 * i + 1] = eeval & 0xff; } diff --git a/package/mac80211/patches/404-ath_regd_optional.patch b/package/mac80211/patches/404-ath_regd_optional.patch index e3e37e8001..2cae8234e7 100644 --- a/package/mac80211/patches/404-ath_regd_optional.patch +++ b/package/mac80211/patches/404-ath_regd_optional.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/regd.c +++ b/drivers/net/wireless/ath/regd.c -@@ -193,6 +193,10 @@ ath_reg_apply_beaconing_flags(struct wip +@@ -194,6 +194,10 @@ ath_reg_apply_beaconing_flags(struct wip u32 bandwidth = 0; int r; @@ -11,7 +11,7 @@ for (band = 0; band < IEEE80211_NUM_BANDS; band++) { if (!wiphy->bands[band]) -@@ -252,6 +256,10 @@ ath_reg_apply_active_scan_flags(struct w +@@ -253,6 +257,10 @@ ath_reg_apply_active_scan_flags(struct w u32 bandwidth = 0; int r; @@ -20,9 +20,9 @@ +#endif + sband = wiphy->bands[IEEE80211_BAND_2GHZ]; - - /* -@@ -299,6 +307,10 @@ static void ath_reg_apply_radar_flags(st + if (!sband) + return; +@@ -302,6 +310,10 @@ static void ath_reg_apply_radar_flags(st struct ieee80211_channel *ch; unsigned int i; @@ -33,7 +33,7 @@ if (!wiphy->bands[IEEE80211_BAND_5GHZ]) return; -@@ -466,6 +478,10 @@ ath_regd_init_wiphy(struct ath_regulator +@@ -469,6 +481,10 @@ ath_regd_init_wiphy(struct ath_regulator { const struct ieee80211_regdomain *regd; diff --git a/package/mac80211/patches/405-world_regd_fixup.patch b/package/mac80211/patches/405-world_regd_fixup.patch index f08063c8f4..48dc3fd882 100644 --- a/package/mac80211/patches/405-world_regd_fixup.patch +++ b/package/mac80211/patches/405-world_regd_fixup.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/regd.c +++ b/drivers/net/wireless/ath/regd.c -@@ -37,7 +37,8 @@ +@@ -38,7 +38,8 @@ NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM) /* We allow IBSS on these on a case by case basis by regulatory domain */ @@ -10,7 +10,7 @@ NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) #define ATH9K_5GHZ_5470_5850 REG_RULE(5470-10, 5850+10, 40, 0, 30,\ NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) -@@ -55,57 +56,56 @@ +@@ -56,57 +57,56 @@ #define ATH9K_5GHZ_NO_MIDBAND ATH9K_5GHZ_5150_5350, \ ATH9K_5GHZ_5725_5850 diff --git a/package/mac80211/patches/406-regd_no_assoc_hints.patch b/package/mac80211/patches/406-regd_no_assoc_hints.patch index c99cce4679..19336830fe 100644 --- a/package/mac80211/patches/406-regd_no_assoc_hints.patch +++ b/package/mac80211/patches/406-regd_no_assoc_hints.patch @@ -1,6 +1,6 @@ --- a/net/wireless/reg.c +++ b/net/wireless/reg.c -@@ -1654,6 +1654,8 @@ void regulatory_hint_11d(struct wiphy *w +@@ -1656,6 +1656,8 @@ void regulatory_hint_11d(struct wiphy *w enum environment_cap env = ENVIRON_ANY; struct regulatory_request *request; @@ -9,7 +9,7 @@ mutex_lock(®_mutex); if (unlikely(!last_request)) -@@ -1860,6 +1862,8 @@ static void restore_regulatory_settings( +@@ -1862,6 +1864,8 @@ static void restore_regulatory_settings( void regulatory_hint_disconnect(void) { diff --git a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch index e909806b1b..0dbb950319 100644 --- a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch +++ b/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1486,15 +1486,6 @@ static int ath9k_add_interface(struct ie +@@ -1448,15 +1448,6 @@ static int ath9k_add_interface(struct ie } } @@ -16,7 +16,7 @@ ath_dbg(common, ATH_DBG_CONFIG, "Attach a VIF of type: %d\n", vif->type); -@@ -1520,15 +1511,6 @@ static int ath9k_change_interface(struct +@@ -1482,15 +1473,6 @@ static int ath9k_change_interface(struct mutex_lock(&sc->mutex); ath9k_ps_wakeup(sc); diff --git a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch index 16e7ff8313..91ef8c4018 100644 --- a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1610,6 +1610,53 @@ static const struct file_operations fops +@@ -1616,6 +1616,53 @@ static const struct file_operations fops }; @@ -54,7 +54,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1668,6 +1715,9 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1674,6 +1721,9 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); diff --git a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch index 9e18cb07b8..72da8d8315 100644 --- a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch +++ b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1714,8 +1714,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1715,8 +1715,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st REG_WRITE(ah, AR_OBS, 8); if (ah->config.rx_intr_mitigation) { diff --git a/package/mac80211/patches/511-ath9k_increase_bcbuf.patch b/package/mac80211/patches/511-ath9k_increase_bcbuf.patch index 5f6c01772f..b7bc7d2280 100644 --- a/package/mac80211/patches/511-ath9k_increase_bcbuf.patch +++ b/package/mac80211/patches/511-ath9k_increase_bcbuf.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -364,7 +364,7 @@ struct ath_vif { +@@ -366,7 +366,7 @@ struct ath_vif { * number of beacon intervals, the game's up. */ #define BSTUCK_THRESH 9 @@ -11,7 +11,7 @@ #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -387,8 +387,8 @@ static void ath9k_hw_init_config(struct +@@ -388,8 +388,8 @@ static void ath9k_hw_init_config(struct { int i; diff --git a/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch b/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch index cf03404e90..79d51e8e50 100644 --- a/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch +++ b/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -120,7 +120,7 @@ void ath_descdma_cleanup(struct ath_soft +@@ -121,7 +121,7 @@ void ath_descdma_cleanup(struct ath_soft /* RX / TX */ /***********/ diff --git a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch index ebf582048f..e2cf507b68 100644 --- a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch +++ b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -587,6 +587,7 @@ struct ath_softc { +@@ -591,6 +591,7 @@ struct ath_softc { struct ieee80211_hw *hw; struct device *dev; @@ -10,7 +10,7 @@ struct survey_info *cur_survey; --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1718,6 +1718,9 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1724,6 +1724,9 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); @@ -22,7 +22,7 @@ sc->debug.sampidx = 0; --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1649,9 +1649,10 @@ static int ath9k_config(struct ieee80211 +@@ -1606,9 +1606,10 @@ static int ath9k_config(struct ieee80211 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { struct ieee80211_channel *curchan = hw->conf.channel; @@ -34,7 +34,7 @@ unsigned long flags; if (ah->curchan) -@@ -1704,7 +1705,23 @@ static int ath9k_config(struct ieee80211 +@@ -1661,7 +1662,23 @@ static int ath9k_config(struct ieee80211 memset(&sc->survey[pos], 0, sizeof(struct survey_info)); } @@ -61,7 +61,7 @@ return -EINVAL; --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1548,6 +1548,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1549,6 +1549,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st caldata->rtt_hist.num_readings) allow_fbs = true; diff --git a/package/mac80211/patches/521-mac80211_ht_change_rate_update.patch b/package/mac80211/patches/521-mac80211_ht_change_rate_update.patch index d2f1982339..75087028a2 100644 --- a/package/mac80211/patches/521-mac80211_ht_change_rate_update.patch +++ b/package/mac80211/patches/521-mac80211_ht_change_rate_update.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/main.c +++ b/net/mac80211/main.c -@@ -239,7 +239,9 @@ void ieee80211_bss_info_change_notify(st +@@ -237,7 +237,9 @@ void ieee80211_bss_info_change_notify(st u32 changed) { struct ieee80211_local *local = sdata->local; @@ -10,7 +10,7 @@ if (!changed) return; -@@ -269,6 +271,22 @@ void ieee80211_bss_info_change_notify(st +@@ -267,6 +269,22 @@ void ieee80211_bss_info_change_notify(st switch (sdata->vif.type) { case NL80211_IFTYPE_AP: diff --git a/package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch b/package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch index aa4cd0c2ff..51e649ee81 100644 --- a/package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch +++ b/package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c -@@ -683,6 +683,7 @@ static const struct net_device_ops ieee8 +@@ -699,6 +699,7 @@ static const struct net_device_ops ieee8 static void ieee80211_if_setup(struct net_device *dev) { ether_setup(dev); diff --git a/package/mac80211/patches/530-mac80211_cur_txpower.patch b/package/mac80211/patches/530-mac80211_cur_txpower.patch index f93512d7b8..0fa6a229fd 100644 --- a/package/mac80211/patches/530-mac80211_cur_txpower.patch +++ b/package/mac80211/patches/530-mac80211_cur_txpower.patch @@ -1,6 +1,6 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -815,7 +815,7 @@ enum ieee80211_smps_mode { +@@ -816,7 +816,7 @@ enum ieee80211_smps_mode { */ struct ieee80211_conf { u32 flags; @@ -11,7 +11,7 @@ u16 listen_interval; --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1615,7 +1615,7 @@ static int ieee80211_get_tx_power(struct +@@ -1677,7 +1677,7 @@ static int ieee80211_get_tx_power(struct { struct ieee80211_local *local = wiphy_priv(wiphy); @@ -22,7 +22,7 @@ } --- a/net/mac80211/main.c +++ b/net/mac80211/main.c -@@ -210,6 +210,7 @@ int ieee80211_hw_config(struct ieee80211 +@@ -208,6 +208,7 @@ int ieee80211_hw_config(struct ieee80211 if (local->hw.conf.power_level != power) { changed |= IEEE80211_CONF_CHANGE_POWER; diff --git a/package/mac80211/patches/531-ath9k_cur_txpower.patch b/package/mac80211/patches/531-ath9k_cur_txpower.patch index 0c044abb1a..a8eb8a6cf3 100644 --- a/package/mac80211/patches/531-ath9k_cur_txpower.patch +++ b/package/mac80211/patches/531-ath9k_cur_txpower.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1727,6 +1727,8 @@ static int ath9k_config(struct ieee80211 +@@ -1684,6 +1684,8 @@ static int ath9k_config(struct ieee80211 return -EINVAL; } @@ -9,11 +9,11 @@ /* * The most recent snapshot of channel->noisefloor for the old * channel is only available after the hardware reset. Copy it to -@@ -1744,6 +1746,7 @@ static int ath9k_config(struct ieee80211 +@@ -1699,6 +1701,7 @@ static int ath9k_config(struct ieee80211 + sc->config.txpowlimit = 2 * conf->power_level; ath9k_cmn_update_txpow(ah, sc->curtxpow, sc->config.txpowlimit, &sc->curtxpow); - ath9k_ps_restore(sc); + conf->cur_power_level = sc->curtxpow / 2; } - if (disable_radio) { + mutex_unlock(&sc->mutex); diff --git a/package/mac80211/patches/540-ath9k_limit_qlen.patch b/package/mac80211/patches/540-ath9k_limit_qlen.patch index 6f616752bf..0831392ea8 100644 --- a/package/mac80211/patches/540-ath9k_limit_qlen.patch +++ b/package/mac80211/patches/540-ath9k_limit_qlen.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -237,6 +237,7 @@ struct ath_atx_tid { +@@ -238,6 +238,7 @@ struct ath_atx_tid { struct ath_node *an; struct ath_atx_ac *ac; unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; @@ -8,7 +8,7 @@ u16 seq_start; u16 seq_next; u16 baw_size; -@@ -282,6 +283,9 @@ struct ath_tx_control { +@@ -284,6 +285,9 @@ struct ath_tx_control { * (axq_qnum). */ struct ath_tx { @@ -20,7 +20,7 @@ spinlock_t txbuflock; --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1679,6 +1679,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1685,6 +1685,10 @@ int ath9k_init_debug(struct ath_hw *ah) sc, &fops_wiphy); debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_xmit); @@ -57,7 +57,7 @@ while (bf) { u16 seqno = bf->bf_state.seqno; -@@ -821,6 +831,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ +@@ -824,6 +834,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ ath_tx_addto_baw(sc, tid, seqno); bf->bf_state.ndelim = ndelim; @@ -65,7 +65,7 @@ __skb_unlink(skb, &tid->buf_q); list_add_tail(&bf->list, bf_q); if (bf_prev) -@@ -1680,6 +1691,8 @@ static void ath_tx_send_ampdu(struct ath +@@ -1683,6 +1694,8 @@ static void ath_tx_send_ampdu(struct ath /* Add sub-frame to BAW */ ath_tx_addto_baw(sc, tid, bf->bf_state.seqno); @@ -74,7 +74,7 @@ /* Queue to h/w without aggregation */ TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); bf->bf_lastbf = bf; -@@ -1808,23 +1821,13 @@ error: +@@ -1811,23 +1824,13 @@ error: /* FIXME: tx power */ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb, @@ -100,7 +100,7 @@ if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { /* -@@ -1859,6 +1862,7 @@ int ath_tx_start(struct ieee80211_hw *hw +@@ -1862,6 +1865,7 @@ int ath_tx_start(struct ieee80211_hw *hw struct ieee80211_vif *vif = info->control.vif; struct ath_softc *sc = hw->priv; struct ath_txq *txq = txctl->txq; @@ -108,7 +108,7 @@ int padpos, padsize; int frmlen = skb->len + FCS_LEN; int q; -@@ -1901,6 +1905,24 @@ int ath_tx_start(struct ieee80211_hw *hw +@@ -1904,6 +1908,24 @@ int ath_tx_start(struct ieee80211_hw *hw setup_frame_info(hw, skb, frmlen); @@ -133,7 +133,7 @@ /* * At this point, the vif, hw_key and sta pointers in the tx control * info are no longer valid (overwritten by the ath_frame_info data. -@@ -1915,7 +1937,7 @@ int ath_tx_start(struct ieee80211_hw *hw +@@ -1918,7 +1940,7 @@ int ath_tx_start(struct ieee80211_hw *hw } spin_unlock_bh(&txq->axq_lock); diff --git a/package/mac80211/patches/541-ath9k_sw_retry_reduce.patch b/package/mac80211/patches/541-ath9k_sw_retry_reduce.patch index 06a17a2fb4..79f138df67 100644 --- a/package/mac80211/patches/541-ath9k_sw_retry_reduce.patch +++ b/package/mac80211/patches/541-ath9k_sw_retry_reduce.patch @@ -51,7 +51,7 @@ } else { --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -542,7 +542,7 @@ struct ath_ant_comb { +@@ -546,7 +546,7 @@ struct ath_ant_comb { #define DEFAULT_CACHELINE 32 #define ATH_REGCLASSIDS_MAX 10 #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ diff --git a/package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch b/package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch index 89be9e1fdf..fe7afdedc5 100644 --- a/package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch +++ b/package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1381,10 +1381,16 @@ static bool ath9k_hw_set_reset_reg(struc +@@ -1382,10 +1382,16 @@ static bool ath9k_hw_set_reset_reg(struc static bool ath9k_hw_chip_reset(struct ath_hw *ah, struct ath9k_channel *chan) { diff --git a/package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch b/package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch index 79eaf86b0e..4bd3d552f9 100644 --- a/package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch +++ b/package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -963,34 +963,6 @@ static ssize_t read_file_recv(struct fil +@@ -969,34 +969,6 @@ static ssize_t read_file_recv(struct fil "%18s : %10u\n", "DECRYPT BUSY ERR", sc->debug.stats.rxstats.decrypt_busy_err); @@ -35,7 +35,7 @@ PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN); PHY_ERR("TIMING", ATH9K_PHYERR_TIMING); PHY_ERR("PARITY", ATH9K_PHYERR_PARITY); -@@ -1067,16 +1039,6 @@ void ath_debug_stat_rx(struct ath_softc +@@ -1073,16 +1045,6 @@ void ath_debug_stat_rx(struct ath_softc RX_PHY_ERR_INC(phyerr); } diff --git a/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch b/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch index bb64537b7e..378fb090b0 100644 --- a/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch +++ b/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch @@ -1,6 +1,6 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -683,6 +683,9 @@ enum mac80211_rx_flags { +@@ -684,6 +684,9 @@ enum mac80211_rx_flags { * @mactime: value in microseconds of the 64-bit Time Synchronization Function * (TSF) timer when the first data symbol (MPDU) arrived at the hardware. * @band: the active band when this frame was received @@ -10,7 +10,7 @@ * @freq: frequency the radio was tuned to when receiving this frame, in MHz * @signal: signal strength when receiving this frame, either in dBm, in dB or * unspecified depending on the hardware capabilities flags -@@ -696,6 +699,10 @@ enum mac80211_rx_flags { +@@ -697,6 +700,10 @@ enum mac80211_rx_flags { struct ieee80211_rx_status { u64 mactime; enum ieee80211_band band; @@ -23,7 +23,7 @@ int antenna; --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h -@@ -300,6 +300,11 @@ struct sta_info { +@@ -302,6 +302,11 @@ struct sta_info { unsigned long rx_dropped; int last_signal; struct ewma avg_signal; @@ -37,7 +37,7 @@ --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -1244,6 +1244,7 @@ ieee80211_rx_h_sta_process(struct ieee80 +@@ -1267,6 +1267,7 @@ ieee80211_rx_h_sta_process(struct ieee80 struct sk_buff *skb = rx->skb; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; @@ -45,7 +45,7 @@ if (!sta) return RX_CONTINUE; -@@ -1286,6 +1287,19 @@ ieee80211_rx_h_sta_process(struct ieee80 +@@ -1309,6 +1310,19 @@ ieee80211_rx_h_sta_process(struct ieee80 sta->last_signal = status->signal; ewma_add(&sta->avg_signal, -status->signal); @@ -78,7 +78,7 @@ kfree(sta); --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -498,6 +498,8 @@ struct station_parameters { +@@ -505,6 +505,8 @@ struct station_parameters { * @STATION_INFO_CONNECTED_TIME: @connected_time filled * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled * @STATION_INFO_STA_FLAGS: @sta_flags filled @@ -87,7 +87,7 @@ */ enum station_info_flags { STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -518,7 +520,9 @@ enum station_info_flags { +@@ -525,7 +527,9 @@ enum station_info_flags { STATION_INFO_BSS_PARAM = 1<<15, STATION_INFO_CONNECTED_TIME = 1<<16, STATION_INFO_ASSOC_REQ_IES = 1<<17, @@ -98,7 +98,7 @@ }; /** -@@ -598,6 +602,9 @@ struct sta_bss_parameters { +@@ -605,6 +609,9 @@ struct sta_bss_parameters { * @plink_state: mesh peer link state * @signal: signal strength of last received packet in dBm * @signal_avg: signal strength average in dBm @@ -108,7 +108,7 @@ * @txrate: current unicast bitrate from this station * @rxrate: current unicast bitrate to this station * @rx_packets: packets received from this station -@@ -627,6 +634,11 @@ struct station_info { +@@ -635,6 +642,11 @@ struct station_info { u8 plink_state; s8 signal; s8 signal_avg; @@ -189,7 +189,7 @@ /* Record packet only when both main_rssi and alt_rssi is positive */ --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c -@@ -451,12 +451,12 @@ int ath9k_hw_process_rxdesc_edma(struct +@@ -452,12 +452,12 @@ int ath9k_hw_process_rxdesc_edma(struct /* XXX: Keycache */ rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); @@ -210,7 +210,7 @@ rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx); --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -558,25 +558,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a +@@ -559,25 +559,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { rs->rs_rssi = ATH9K_RSSI_BAD; @@ -250,7 +250,7 @@ if (ads.ds_rxstatus8 & AR_RxKeyIdxValid) --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1041,12 +1041,12 @@ void ath_debug_stat_rx(struct ath_softc +@@ -1047,12 +1047,12 @@ void ath_debug_stat_rx(struct ath_softc spin_lock(&sc->debug.samp_lock); RX_SAMP_DBG(jiffies) = jiffies; @@ -271,7 +271,7 @@ RX_SAMP_DBG(rate) = rs->rs_rate; --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h -@@ -1549,6 +1549,8 @@ enum nl80211_sta_bss_param { +@@ -1621,6 +1621,8 @@ 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. @@ -280,7 +280,7 @@ * @__NL80211_STA_INFO_AFTER_LAST: internal * @NL80211_STA_INFO_MAX: highest possible station info attribute */ -@@ -1571,6 +1573,8 @@ enum nl80211_sta_info { +@@ -1643,6 +1645,8 @@ enum nl80211_sta_info { NL80211_STA_INFO_BSS_PARAM, NL80211_STA_INFO_CONNECTED_TIME, NL80211_STA_INFO_STA_FLAGS, @@ -291,7 +291,7 @@ __NL80211_STA_INFO_AFTER_LAST, --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -2257,6 +2257,33 @@ nla_put_failure: +@@ -2287,6 +2287,33 @@ nla_put_failure: return false; } @@ -325,7 +325,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, int flags, struct net_device *dev, const u8 *mac_addr, struct station_info *sinfo) -@@ -2303,6 +2330,18 @@ static int nl80211_send_station(struct s +@@ -2333,6 +2360,18 @@ static int nl80211_send_station(struct s if (sinfo->filled & STATION_INFO_SIGNAL_AVG) NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG, sinfo->signal_avg); diff --git a/package/mac80211/patches/560-ath9k_reset_after_full_sleep.patch b/package/mac80211/patches/560-ath9k_reset_after_full_sleep.patch deleted file mode 100644 index 9a5b580019..0000000000 --- a/package/mac80211/patches/560-ath9k_reset_after_full_sleep.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -619,6 +619,7 @@ struct ath_softc { - u16 curtxpow; - bool ps_enabled; - bool ps_idle; -+ bool ps_fullsleep; - short nbcnvifs; - short nvifs; - unsigned long ps_usecount; ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -118,9 +118,10 @@ void ath9k_ps_restore(struct ath_softc * - if (--sc->ps_usecount != 0) - goto unlock; - -- if (sc->ps_idle) -+ if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK)) { - mode = ATH9K_PM_FULL_SLEEP; -- else if (sc->ps_enabled && -+ sc->ps_fullsleep = true; -+ } else if (sc->ps_enabled && - !(sc->ps_flags & (PS_WAIT_FOR_BEACON | - PS_WAIT_FOR_CAB | - PS_WAIT_FOR_PSPOLL_DATA | -@@ -275,6 +276,7 @@ static bool ath_complete_reset(struct at - sc->config.txpowlimit, &sc->curtxpow); - ath9k_hw_set_interrupts(ah); - ath9k_hw_enable_interrupts(ah); -+ sc->ps_fullsleep = false; - - if (!(sc->sc_flags & (SC_OP_OFFCHANNEL)) && start) { - if (sc->sc_flags & SC_OP_BEACONS) -@@ -332,7 +334,8 @@ static int ath_reset_internal(struct ath - hchan = ah->curchan; - } - -- if (fastcc && !ath9k_hw_check_alive(ah)) -+ if (fastcc && (sc->ps_fullsleep || -+ !ath9k_hw_check_alive(ah))) - fastcc = false; - - if (!ath_prepare_reset(sc, retry_tx, flush)) -@@ -1173,6 +1176,13 @@ static void ath9k_tx(struct ieee80211_hw - } - } - -+ /* -+ * Cannot tx while the hardware is in full sleep, it first needs a full -+ * chip reset to recover from that -+ */ -+ if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) -+ goto exit; -+ - if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) { - /* - * We are using PS-Poll and mac80211 can request TX while in ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1983,7 +1983,7 @@ static void ath_tx_complete(struct ath_s - skb_pull(skb, padsize); - } - -- if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) { -+ if ((sc->ps_flags & PS_WAIT_FOR_TX_ACK) && !txq->axq_depth) { - sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; - ath_dbg(common, ATH_DBG_PS, - "Going back to sleep after having received TX status (0x%lx)\n", diff --git a/package/mac80211/patches/561-ath9k_fix_ps_idle_handling.patch b/package/mac80211/patches/561-ath9k_fix_ps_idle_handling.patch deleted file mode 100644 index 40f24e1eca..0000000000 --- a/package/mac80211/patches/561-ath9k_fix_ps_idle_handling.patch +++ /dev/null @@ -1,273 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -883,82 +883,6 @@ chip_reset: - #undef SCHED_INTR - } - --static void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw) --{ -- struct ath_hw *ah = sc->sc_ah; -- struct ath_common *common = ath9k_hw_common(ah); -- struct ieee80211_channel *channel = hw->conf.channel; -- int r; -- -- ath9k_ps_wakeup(sc); -- spin_lock_bh(&sc->sc_pcu_lock); -- atomic_set(&ah->intr_ref_cnt, -1); -- -- ath9k_hw_configpcipowersave(ah, false); -- -- if (!ah->curchan) -- ah->curchan = ath9k_cmn_get_curchannel(sc->hw, ah); -- -- r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); -- if (r) { -- ath_err(common, -- "Unable to reset channel (%u MHz), reset status %d\n", -- channel->center_freq, r); -- } -- -- ath_complete_reset(sc, true); -- -- /* Enable LED */ -- ath9k_hw_cfg_output(ah, ah->led_pin, -- AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -- ath9k_hw_set_gpio(ah, ah->led_pin, 0); -- -- spin_unlock_bh(&sc->sc_pcu_lock); -- -- ath9k_ps_restore(sc); --} -- --void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) --{ -- struct ath_hw *ah = sc->sc_ah; -- struct ieee80211_channel *channel = hw->conf.channel; -- int r; -- -- ath9k_ps_wakeup(sc); -- -- ath_cancel_work(sc); -- -- spin_lock_bh(&sc->sc_pcu_lock); -- -- /* -- * Keep the LED on when the radio is disabled -- * during idle unassociated state. -- */ -- if (!sc->ps_idle) { -- ath9k_hw_set_gpio(ah, ah->led_pin, 1); -- ath9k_hw_cfg_gpio_input(ah, ah->led_pin); -- } -- -- ath_prepare_reset(sc, false, true); -- -- if (!ah->curchan) -- ah->curchan = ath9k_cmn_get_curchannel(hw, ah); -- -- r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); -- if (r) { -- ath_err(ath9k_hw_common(sc->sc_ah), -- "Unable to reset channel (%u MHz), reset status %d\n", -- channel->center_freq, r); -- } -- -- ath9k_hw_phy_disable(ah); -- -- ath9k_hw_configpcipowersave(ah, true); -- -- spin_unlock_bh(&sc->sc_pcu_lock); -- ath9k_ps_restore(sc); --} -- - static int ath_reset(struct ath_softc *sc, bool retry_tx) - { - int r; -@@ -1094,6 +1018,9 @@ static int ath9k_start(struct ieee80211_ - * and then setup of the interrupt mask. - */ - spin_lock_bh(&sc->sc_pcu_lock); -+ -+ atomic_set(&ah->intr_ref_cnt, -1); -+ - r = ath9k_hw_reset(ah, init_channel, ah->caldata, false); - if (r) { - ath_err(common, -@@ -1132,6 +1059,18 @@ static int ath9k_start(struct ieee80211_ - goto mutex_unlock; - } - -+ if (ah->led_pin >= 0) { -+ ath9k_hw_cfg_output(ah, ah->led_pin, -+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -+ ath9k_hw_set_gpio(ah, ah->led_pin, 0); -+ } -+ -+ /* -+ * Reset key cache to sane defaults (all entries cleared) instead of -+ * semi-random values after suspend/resume. -+ */ -+ ath9k_cmn_init_crypto(sc->sc_ah); -+ - spin_unlock_bh(&sc->sc_pcu_lock); - - if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) && -@@ -1229,6 +1168,7 @@ static void ath9k_stop(struct ieee80211_ - struct ath_softc *sc = hw->priv; - struct ath_hw *ah = sc->sc_ah; - struct ath_common *common = ath9k_hw_common(ah); -+ bool prev_idle; - - mutex_lock(&sc->mutex); - -@@ -1258,35 +1198,45 @@ static void ath9k_stop(struct ieee80211_ - * before setting the invalid flag. */ - ath9k_hw_disable_interrupts(ah); - -- if (!(sc->sc_flags & SC_OP_INVALID)) { -- ath_drain_all_txq(sc, false); -- ath_stoprecv(sc); -- ath9k_hw_phy_disable(ah); -- } else -- sc->rx.rxlink = NULL; -+ spin_unlock_bh(&sc->sc_pcu_lock); -+ -+ /* we can now sync irq and kill any running tasklets, since we already -+ * disabled interrupts and not holding a spin lock */ -+ synchronize_irq(sc->irq); -+ tasklet_kill(&sc->intr_tq); -+ tasklet_kill(&sc->bcon_tasklet); -+ -+ prev_idle = sc->ps_idle; -+ sc->ps_idle = true; -+ -+ spin_lock_bh(&sc->sc_pcu_lock); -+ -+ if (ah->led_pin >= 0) { -+ ath9k_hw_set_gpio(ah, ah->led_pin, 1); -+ ath9k_hw_cfg_gpio_input(ah, ah->led_pin); -+ } -+ -+ ath_prepare_reset(sc, false, true); - - if (sc->rx.frag) { - dev_kfree_skb_any(sc->rx.frag); - sc->rx.frag = NULL; - } - -- /* disable HAL and put h/w to sleep */ -- ath9k_hw_disable(ah); -+ if (!ah->curchan) -+ ah->curchan = ath9k_cmn_get_curchannel(hw, ah); - -- spin_unlock_bh(&sc->sc_pcu_lock); -+ ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); -+ ath9k_hw_phy_disable(ah); - -- /* we can now sync irq and kill any running tasklets, since we already -- * disabled interrupts and not holding a spin lock */ -- synchronize_irq(sc->irq); -- tasklet_kill(&sc->intr_tq); -- tasklet_kill(&sc->bcon_tasklet); -+ ath9k_hw_configpcipowersave(ah, true); - -- ath9k_ps_restore(sc); -+ spin_unlock_bh(&sc->sc_pcu_lock); - -- sc->ps_idle = true; -- ath_radio_disable(sc, hw); -+ ath9k_ps_restore(sc); - - sc->sc_flags |= SC_OP_INVALID; -+ sc->ps_idle = prev_idle; - - mutex_unlock(&sc->mutex); - -@@ -1608,8 +1558,8 @@ static int ath9k_config(struct ieee80211 - struct ath_hw *ah = sc->sc_ah; - struct ath_common *common = ath9k_hw_common(ah); - struct ieee80211_conf *conf = &hw->conf; -- bool disable_radio = false; - -+ ath9k_ps_wakeup(sc); - mutex_lock(&sc->mutex); - - /* -@@ -1618,16 +1568,8 @@ static int ath9k_config(struct ieee80211 - * of the changes. Likewise we must only disable the radio towards - * the end. - */ -- if (changed & IEEE80211_CONF_CHANGE_IDLE) { -+ if (changed & IEEE80211_CONF_CHANGE_IDLE) - sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); -- if (!sc->ps_idle) { -- ath_radio_enable(sc, hw); -- ath_dbg(common, ATH_DBG_CONFIG, -- "not-idle: enabling radio\n"); -- } else { -- disable_radio = true; -- } -- } - - /* - * We just prepare to enable PS. We have to wait until our AP has -@@ -1752,19 +1694,13 @@ static int ath9k_config(struct ieee80211 - ath_dbg(common, ATH_DBG_CONFIG, - "Set power: %d\n", conf->power_level); - sc->config.txpowlimit = 2 * conf->power_level; -- ath9k_ps_wakeup(sc); - ath9k_cmn_update_txpow(ah, sc->curtxpow, - sc->config.txpowlimit, &sc->curtxpow); -- ath9k_ps_restore(sc); - conf->cur_power_level = sc->curtxpow / 2; - } - -- if (disable_radio) { -- ath_dbg(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); -- ath_radio_disable(sc, hw); -- } -- - mutex_unlock(&sc->mutex); -+ ath9k_ps_restore(sc); - - return 0; - } ---- a/drivers/net/wireless/ath/ath9k/pci.c -+++ b/drivers/net/wireless/ath/ath9k/pci.c -@@ -306,12 +306,11 @@ static int ath_pci_suspend(struct device - struct ieee80211_hw *hw = pci_get_drvdata(pdev); - struct ath_softc *sc = hw->priv; - -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); -- - /* The device has to be moved to FULLSLEEP forcibly. - * Otherwise the chip never moved to full sleep, - * when no interface is up. - */ -+ ath9k_hw_disable(sc->sc_ah); - ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); - - return 0; -@@ -333,22 +332,6 @@ static int ath_pci_resume(struct device - if ((val & 0x0000ff00) != 0) - pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); - -- ath9k_ps_wakeup(sc); -- /* Enable LED */ -- ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, -- AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); -- -- /* -- * Reset key cache to sane defaults (all entries cleared) instead of -- * semi-random values after suspend/resume. -- */ -- ath9k_cmn_init_crypto(sc->sc_ah); -- ath9k_ps_restore(sc); -- -- sc->ps_idle = true; -- ath_radio_disable(sc, hw); -- - return 0; - } - diff --git a/package/mac80211/patches/562-ath9k_fix_flush.patch b/package/mac80211/patches/562-ath9k_fix_flush.patch deleted file mode 100644 index a5329adc96..0000000000 --- a/package/mac80211/patches/562-ath9k_fix_flush.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -2268,9 +2268,6 @@ static void ath9k_flush(struct ieee80211 - return; - } - -- if (drop) -- timeout = 1; -- - for (j = 0; j < timeout; j++) { - bool npend = false; - -@@ -2288,21 +2285,22 @@ static void ath9k_flush(struct ieee80211 - } - - if (!npend) -- goto out; -+ break; - } - -- ath9k_ps_wakeup(sc); -- spin_lock_bh(&sc->sc_pcu_lock); -- drain_txq = ath_drain_all_txq(sc, false); -- spin_unlock_bh(&sc->sc_pcu_lock); -+ if (drop) { -+ ath9k_ps_wakeup(sc); -+ spin_lock_bh(&sc->sc_pcu_lock); -+ drain_txq = ath_drain_all_txq(sc, false); -+ spin_unlock_bh(&sc->sc_pcu_lock); - -- if (!drain_txq) -- ath_reset(sc, false); -+ if (!drain_txq) -+ ath_reset(sc, false); - -- ath9k_ps_restore(sc); -- ieee80211_wake_queues(hw); -+ ath9k_ps_restore(sc); -+ ieee80211_wake_queues(hw); -+ } - --out: - ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); - mutex_unlock(&sc->mutex); - } diff --git a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch index e8a9fd45f8..0fb42f9fed 100644 --- a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch @@ -117,7 +117,7 @@ /* * Capabilities -@@ -960,6 +962,11 @@ struct rt2x00_dev { +@@ -961,6 +963,11 @@ struct rt2x00_dev { const struct firmware *fw; /* @@ -239,18 +239,18 @@ .get_entry_state = rt2800pci_get_entry_state, --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c -@@ -1142,6 +1142,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de - INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); - INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); +@@ -1145,6 +1145,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de + BIT(NL80211_IFTYPE_MESH_POINT) | + BIT(NL80211_IFTYPE_WDS); + retval = rt2x00lib_load_eeprom_file(rt2x00dev); + if (retval) + goto exit; + /* - * Let the driver probe the device to detect the capabilities. + * Initialize work. */ -@@ -1243,6 +1247,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ +@@ -1261,6 +1265,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ * Free queue structures. */ rt2x00queue_free(rt2x00dev); diff --git a/package/mac80211/patches/605-rt2x00-pci-eeprom.patch b/package/mac80211/patches/605-rt2x00-pci-eeprom.patch index c2e574d058..088d474092 100644 --- a/package/mac80211/patches/605-rt2x00-pci-eeprom.patch +++ b/package/mac80211/patches/605-rt2x00-pci-eeprom.patch @@ -1,8 +1,6 @@ -Index: compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2800pci.c -=================================================================== ---- compat-wireless-2011-11-04.orig/drivers/net/wireless/rt2x00/rt2800pci.c 2011-11-12 19:34:24.760314206 +0100 -+++ compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2800pci.c 2011-11-12 19:34:24.956314211 +0100 -@@ -84,7 +84,7 @@ +--- a/drivers/net/wireless/rt2x00/rt2800pci.c ++++ b/drivers/net/wireless/rt2x00/rt2800pci.c +@@ -84,7 +84,7 @@ static void rt2800pci_mcu_status(struct rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); } @@ -11,7 +9,7 @@ Index: compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2800pci.c { memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE); } -@@ -938,8 +938,9 @@ +@@ -938,8 +938,9 @@ static int rt2800pci_validate_eeprom(str /* * Read EEPROM into buffer */ @@ -23,11 +21,9 @@ Index: compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2800pci.c else if (rt2800pci_efuse_detect(rt2x00dev)) rt2800pci_read_eeprom_efuse(rt2x00dev); else -Index: compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2x00pci.c -=================================================================== ---- compat-wireless-2011-11-04.orig/drivers/net/wireless/rt2x00/rt2x00pci.c 2011-11-12 19:34:24.704314204 +0100 -+++ compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2x00pci.c 2011-11-12 19:34:24.956314211 +0100 -@@ -255,6 +255,7 @@ +--- a/drivers/net/wireless/rt2x00/rt2x00pci.c ++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c +@@ -255,6 +255,7 @@ exit: int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops) { struct ieee80211_hw *hw; @@ -35,7 +31,7 @@ Index: compat-wireless-2011-11-04/drivers/net/wireless/rt2x00/rt2x00pci.c struct rt2x00_dev *rt2x00dev; int retval; -@@ -299,6 +300,12 @@ +@@ -299,6 +300,12 @@ int rt2x00pci_probe(struct pci_dev *pci_ rt2x00dev->irq = pci_dev->irq; rt2x00dev->name = pci_name(pci_dev); |