From: Felix Fietkau Date: Sun, 17 Jan 2010 01:38:07 +0000 (+0000) Subject: mac80211: upgrade to compat-wireless 2010-01-15 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=20daaf74805b5adfae2874edcd049b2c827d05df;p=openwrt%2Fstaging%2Fluka.git mac80211: upgrade to compat-wireless 2010-01-15 SVN-Revision: 19176 --- diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index b173300db9..0d0e975b9a 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2010-01-13 +PKG_VERSION:=2010-01-15 PKG_RELEASE:=1 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources # http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \ # http://wireless.kernel.org/download/compat-wireless-2.6 -PKG_MD5SUM:=b773266f141a1a6349b6e09b84948f02 +PKG_MD5SUM:=aa6f80ad3fcc2b663e62c7b80d37abd3 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) @@ -42,9 +42,10 @@ define KernelPackage/mac80211 DEPENDS+= +kmod-crypto-arc4 +kmod-crypto-aes +wireless-tools +iw @!LINUX_2_6_21 @!LINUX_2_6_25 FILES:= \ $(PKG_BUILD_DIR)/compat/compat.$(LINUX_KMOD_SUFFIX) \ + $(PKG_BUILD_DIR)/compat/compat_firmware_class.$(LINUX_KMOD_SUFFIX) \ $(PKG_BUILD_DIR)/net/mac80211/mac80211.$(LINUX_KMOD_SUFFIX) \ $(PKG_BUILD_DIR)/net/wireless/cfg80211.$(LINUX_KMOD_SUFFIX) - AUTOLOAD:=$(call AutoLoad,20,compat cfg80211 mac80211) + AUTOLOAD:=$(call AutoLoad,20,compat compat_firmware_class cfg80211 mac80211) endef define KernelPackage/mac80211/config diff --git a/package/mac80211/patches/020-fix_compat_h.patch b/package/mac80211/patches/020-fix_compat_h.patch index 7f90cf4dc9..b001cf2edd 100644 --- a/package/mac80211/patches/020-fix_compat_h.patch +++ b/package/mac80211/patches/020-fix_compat_h.patch @@ -1,6 +1,6 @@ --- a/include/linux/compat-2.6.32.h +++ b/include/linux/compat-2.6.32.h -@@ -7,7 +7,7 @@ +@@ -6,7 +6,7 @@ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) #include @@ -8,4 +8,4 @@ +#include #include #include - + #include diff --git a/package/mac80211/patches/021-fix_missing_ifdefs.patch b/package/mac80211/patches/021-fix_missing_ifdefs.patch deleted file mode 100644 index 2c838ebac5..0000000000 --- a/package/mac80211/patches/021-fix_missing_ifdefs.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/compat/compat-2.6.33.c -+++ b/compat/compat-2.6.33.c -@@ -12,6 +12,7 @@ - - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) - -+#ifdef CONFIG_PCCARD - - /** - * pccard_loop_tuple() - loop over tuples in the CIS -@@ -125,6 +126,7 @@ int pcmcia_loop_tuple(struct pcmcia_devi - EXPORT_SYMBOL(pcmcia_loop_tuple); - /* Source: drivers/pcmcia/pcmcia_resource.c */ - -+#endif - - #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) */ - diff --git a/package/mac80211/patches/300-ath9k_fix_init_crash.patch b/package/mac80211/patches/300-ath9k_fix_init_crash.patch deleted file mode 100644 index 8f3540b5d4..0000000000 --- a/package/mac80211/patches/300-ath9k_fix_init_crash.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ahb.c -+++ b/drivers/net/wireless/ath/ath9k/ahb.c -@@ -121,6 +121,9 @@ static int ath_ahb_probe(struct platform - sc->mem = mem; - sc->irq = irq; - -+ /* Will be cleared in ath9k_start() */ -+ sc->sc_flags |= SC_OP_INVALID; -+ - ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc); - if (ret) { - dev_err(&pdev->dev, "request_irq failed\n"); ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -534,8 +534,6 @@ static int ath9k_init_softc(u16 devid, s - int ret = 0, i; - int csz = 0; - -- sc->sc_flags |= SC_OP_INVALID; -- - ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL); - if (!ah) - return -ENOMEM; ---- a/drivers/net/wireless/ath/ath9k/pci.c -+++ b/drivers/net/wireless/ath/ath9k/pci.c -@@ -202,6 +202,9 @@ static int ath_pci_probe(struct pci_dev - sc->dev = &pdev->dev; - sc->mem = mem; - -+ /* Will be cleared in ath9k_start() */ -+ sc->sc_flags |= SC_OP_INVALID; -+ - ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc); - if (ret) { - dev_err(&pdev->dev, "request_irq failed\n"); diff --git a/package/mac80211/patches/301-mac80211_tx_queue_wake.patch b/package/mac80211/patches/301-mac80211_tx_queue_wake.patch deleted file mode 100644 index 1934fccac8..0000000000 --- a/package/mac80211/patches/301-mac80211_tx_queue_wake.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/mac80211/offchannel.c -+++ b/net/mac80211/offchannel.c -@@ -153,9 +153,11 @@ void ieee80211_offchannel_return(struct - if (sdata->vif.type == NL80211_IFTYPE_STATION) { - if (sdata->u.mgd.associated) - ieee80211_offchannel_ps_disable(sdata); -- netif_tx_wake_all_queues(sdata->dev); - } - -+ if (sdata->vif.type != NL80211_IFTYPE_MONITOR) -+ netif_tx_wake_all_queues(sdata->dev); -+ - /* re-enable beaconing */ - if (enable_beaconing && - (sdata->vif.type == NL80211_IFTYPE_AP || diff --git a/package/mac80211/patches/302-mac80211_pwr_mgmt_fix.patch b/package/mac80211/patches/302-mac80211_pwr_mgmt_fix.patch index 628fc1d20d..30a91840eb 100644 --- a/package/mac80211/patches/302-mac80211_pwr_mgmt_fix.patch +++ b/package/mac80211/patches/302-mac80211_pwr_mgmt_fix.patch @@ -1,8 +1,8 @@ --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1384,6 +1384,9 @@ static int ieee80211_set_power_mgmt(stru - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); - struct ieee80211_conf *conf = &local->hw.conf; +@@ -1394,6 +1394,9 @@ static int ieee80211_set_power_mgmt(stru + if (sdata->vif.type != NL80211_IFTYPE_STATION) + return -EOPNOTSUPP; + if (sdata->vif.type != NL80211_IFTYPE_STATION) + return 0; 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 63cb3d979e..c414951752 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 @@ -8,7 +8,7 @@ #include #include "hw.h" -@@ -461,8 +462,18 @@ static int ath9k_hw_init_macaddr(struct +@@ -437,8 +438,18 @@ 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/406-ath9k-set-AH_USE_EEPROM-only-if-no-platform-data-present.patch b/package/mac80211/patches/406-ath9k-set-AH_USE_EEPROM-only-if-no-platform-data-present.patch index c09935ee75..a83242f919 100644 --- a/package/mac80211/patches/406-ath9k-set-AH_USE_EEPROM-only-if-no-platform-data-present.patch +++ b/package/mac80211/patches/406-ath9k-set-AH_USE_EEPROM-only-if-no-platform-data-present.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -403,11 +403,8 @@ static void ath9k_hw_init_defaults(struc +@@ -381,11 +381,8 @@ static void ath9k_hw_init_defaults(struc ah->hw_version.magic = AR5416_MAGIC; ah->hw_version.subvendorid = 0; diff --git a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch index 615de77a59..dae663dd7a 100644 --- a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch +++ b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch @@ -11,7 +11,7 @@ #include "hw.h" #include "rc.h" #include "initvals.h" -@@ -448,17 +450,23 @@ static int ath9k_hw_rf_claim(struct ath_ +@@ -424,17 +426,23 @@ static int ath9k_hw_rf_claim(struct ath_ static int ath9k_hw_init_macaddr(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); diff --git a/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch b/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch index b900f411f6..e3df0ad14a 100644 --- a/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch +++ b/package/mac80211/patches/408-ath9k_tweak_rx_intr_mitigation.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -2109,7 +2109,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -2088,7 +2088,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st if (ah->config.rx_intr_mitigation) { REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500); diff --git a/package/mac80211/patches/540-ath9k_fix_rts_cts.patch b/package/mac80211/patches/540-ath9k_fix_rts_cts.patch new file mode 100644 index 0000000000..789623c674 --- /dev/null +++ b/package/mac80211/patches/540-ath9k_fix_rts_cts.patch @@ -0,0 +1,61 @@ +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -1498,26 +1498,6 @@ static void ath_buf_set_rate(struct ath_ + if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) + ctsrate |= rate->hw_value_short; + +- /* +- * ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. +- * Check the first rate in the series to decide whether RTS/CTS +- * or CTS-to-self has to be used. +- */ +- if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- flags = ATH9K_TXDESC_CTSENA; +- else if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) +- flags = ATH9K_TXDESC_RTSENA; +- +- /* FIXME: Handle aggregation protection */ +- if (sc->config.ath_aggr_prot && +- (!bf_isaggr(bf) || (bf_isaggr(bf) && bf->bf_al < 8192))) { +- flags = ATH9K_TXDESC_RTSENA; +- } +- +- /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ +- if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) +- flags &= ~(ATH9K_TXDESC_RTSENA); +- + for (i = 0; i < 4; i++) { + bool is_40, is_sgi, is_sp; + int phy; +@@ -1529,8 +1509,15 @@ static void ath_buf_set_rate(struct ath_ + series[i].Tries = rates[i].count; + series[i].ChSel = common->tx_chainmask; + +- if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) ++ if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) || ++ (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) { + series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; ++ flags |= ATH9K_TXDESC_RTSENA; ++ } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; ++ flags |= ATH9K_TXDESC_CTSENA; ++ } ++ + if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) + series[i].RateFlags |= ATH9K_RATESERIES_2040; + if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) +@@ -1568,6 +1555,14 @@ static void ath_buf_set_rate(struct ath_ + phy, rate->bitrate * 100, bf->bf_frmlen, rix, is_sp); + } + ++ /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ ++ if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) ++ flags &= ~ATH9K_TXDESC_RTSENA; ++ ++ /* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */ ++ if (flags & ATH9K_TXDESC_RTSENA) ++ flags &= ~ATH9K_TXDESC_CTSENA; ++ + /* set dur_update_en for l-sig computation except for PS-Poll frames */ + ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, + bf->bf_lastbf->bf_desc, diff --git a/package/mac80211/patches/540-short_slot_handling.patch b/package/mac80211/patches/540-short_slot_handling.patch deleted file mode 100644 index 70341473e1..0000000000 --- a/package/mac80211/patches/540-short_slot_handling.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/net/mac80211/mlme.c -+++ b/net/mac80211/mlme.c -@@ -670,6 +670,8 @@ static u32 ieee80211_handle_bss_capabili - } - - use_short_slot = !!(capab & WLAN_CAPABILITY_SHORT_SLOT_TIME); -+ if (sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) -+ use_short_slot = true; - - if (use_protection != bss_conf->use_cts_prot) { - bss_conf->use_cts_prot = use_protection; ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -1087,6 +1087,13 @@ static int ieee80211_change_bss(struct w - params->use_short_preamble; - changed |= BSS_CHANGED_ERP_PREAMBLE; - } -+ -+ if (!sdata->vif.bss_conf.use_short_slot && -+ sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) { -+ sdata->vif.bss_conf.use_short_slot = true; -+ changed |= BSS_CHANGED_ERP_SLOT; -+ } -+ - if (params->use_short_slot_time >= 0) { - sdata->vif.bss_conf.use_short_slot = - params->use_short_slot_time; diff --git a/package/mac80211/patches/550-ath9k_ack_timeout_workaround.patch b/package/mac80211/patches/550-ath9k_ack_timeout_workaround.patch new file mode 100644 index 0000000000..953c07af6f --- /dev/null +++ b/package/mac80211/patches/550-ath9k_ack_timeout_workaround.patch @@ -0,0 +1,14 @@ +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1229,6 +1229,11 @@ void ath9k_hw_init_global_settings(struc + /* As defined by IEEE 802.11-2007 17.3.8.6 */ + slottime = ah->slottime + 3 * ah->coverage_class; + acktimeout = slottime + sifstime; ++ ++ /* Workaround for a hw issue */ ++ if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) ++ acktimeout = max(64, acktimeout); ++ + ath9k_hw_setslottime(ah, slottime); + ath9k_hw_set_ack_timeout(ah, acktimeout); + ath9k_hw_set_cts_timeout(ah, acktimeout); diff --git a/package/mac80211/patches/550-ath9k_clean_up_timing_handling.patch b/package/mac80211/patches/550-ath9k_clean_up_timing_handling.patch deleted file mode 100644 index dc6502274d..0000000000 --- a/package/mac80211/patches/550-ath9k_clean_up_timing_handling.patch +++ /dev/null @@ -1,229 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1790,6 +1790,7 @@ static void ath9k_bss_info_changed(struc - struct ath_hw *ah = sc->sc_ah; - struct ath_common *common = ath9k_hw_common(ah); - struct ath_vif *avp = (void *)vif->drv_priv; -+ int slottime; - int error; - - mutex_lock(&sc->mutex); -@@ -1825,6 +1826,25 @@ static void ath9k_bss_info_changed(struc - ath_beacon_config(sc, vif); - } - -+ if (changed & BSS_CHANGED_ERP_SLOT) { -+ if (bss_conf->use_short_slot) -+ slottime = 9; -+ else -+ slottime = 20; -+ if (vif->type == NL80211_IFTYPE_AP) { -+ /* -+ * Defer update, so that connected stations can adjust -+ * their settings at the same time. -+ * See beacon.c for more details -+ */ -+ sc->beacon.slottime = slottime; -+ sc->beacon.updateslot = UPDATE; -+ } else { -+ ah->slottime = slottime; -+ ath9k_hw_init_global_settings(ah); -+ } -+ } -+ - /* Disable transmission of beacons */ - if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) - ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -55,28 +55,6 @@ module_exit(ath9k_exit); - /* Helper Functions */ - /********************/ - --static u32 ath9k_hw_mac_usec(struct ath_hw *ah, u32 clks) --{ -- struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -- -- if (!ah->curchan) /* should really check for CCK instead */ -- return clks / ATH9K_CLOCK_RATE_CCK; -- if (conf->channel->band == IEEE80211_BAND_2GHZ) -- return clks / ATH9K_CLOCK_RATE_2GHZ_OFDM; -- -- return clks / ATH9K_CLOCK_RATE_5GHZ_OFDM; --} -- --static u32 ath9k_hw_mac_to_usec(struct ath_hw *ah, u32 clks) --{ -- struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -- -- if (conf_is_ht40(conf)) -- return ath9k_hw_mac_usec(ah, clks) / 2; -- else -- return ath9k_hw_mac_usec(ah, clks); --} -- - static u32 ath9k_hw_mac_clks(struct ath_hw *ah, u32 usecs) - { - struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -@@ -413,8 +391,6 @@ static void ath9k_hw_init_defaults(struc - ah->beacon_interval = 100; - ah->enable_32kHz_clock = DONT_USE_32KHZ; - ah->slottime = (u32) -1; -- ah->acktimeout = (u32) -1; -- ah->ctstimeout = (u32) -1; - ah->globaltxtimeout = (u32) -1; - ah->power_mode = ATH9K_PM_UNDEFINED; - } -@@ -1196,34 +1172,25 @@ static void ath9k_hw_init_interrupt_mask - } - } - --static bool ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us) -+static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us) - { -- if (us > ath9k_hw_mac_to_usec(ah, MS(0xffffffff, AR_TIME_OUT_ACK))) { -- ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, -- "bad ack timeout %u\n", us); -- ah->acktimeout = (u32) -1; -- return false; -- } else { -- REG_RMW_FIELD(ah, AR_TIME_OUT, -- AR_TIME_OUT_ACK, ath9k_hw_mac_to_clks(ah, us)); -- ah->acktimeout = us; -- return true; -- } -+ u32 val = ath9k_hw_mac_to_clks(ah, us); -+ val = min(val, (u32) 0xFFFF); -+ REG_WRITE(ah, AR_D_GBL_IFS_SLOT, val); - } - --static bool ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us) -+static void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us) - { -- if (us > ath9k_hw_mac_to_usec(ah, MS(0xffffffff, AR_TIME_OUT_CTS))) { -- ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, -- "bad cts timeout %u\n", us); -- ah->ctstimeout = (u32) -1; -- return false; -- } else { -- REG_RMW_FIELD(ah, AR_TIME_OUT, -- AR_TIME_OUT_CTS, ath9k_hw_mac_to_clks(ah, us)); -- ah->ctstimeout = us; -- return true; -- } -+ u32 val = ath9k_hw_mac_to_clks(ah, us); -+ val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_ACK)); -+ REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_ACK, val); -+} -+ -+static void ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us) -+{ -+ u32 val = ath9k_hw_mac_to_clks(ah, us); -+ val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_CTS)); -+ REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_CTS, val); - } - - static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu) -@@ -1240,23 +1207,32 @@ static bool ath9k_hw_set_global_txtimeou - } - } - --static void ath9k_hw_init_user_settings(struct ath_hw *ah) -+void ath9k_hw_init_global_settings(struct ath_hw *ah) - { -+ struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; -+ int acktimeout; -+ int sifstime; -+ - ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n", - ah->misc_mode); - - if (ah->misc_mode != 0) - REG_WRITE(ah, AR_PCU_MISC, - REG_READ(ah, AR_PCU_MISC) | ah->misc_mode); -- if (ah->slottime != (u32) -1) -- ath9k_hw_setslottime(ah, ah->slottime); -- if (ah->acktimeout != (u32) -1) -- ath9k_hw_set_ack_timeout(ah, ah->acktimeout); -- if (ah->ctstimeout != (u32) -1) -- ath9k_hw_set_cts_timeout(ah, ah->ctstimeout); -+ -+ if (conf->channel && conf->channel->band == IEEE80211_BAND_5GHZ) -+ sifstime = 16; -+ else -+ sifstime = 10; -+ -+ acktimeout = ah->slottime + sifstime; -+ ath9k_hw_setslottime(ah, ah->slottime); -+ ath9k_hw_set_ack_timeout(ah, acktimeout); -+ ath9k_hw_set_cts_timeout(ah, acktimeout); - if (ah->globaltxtimeout != (u32) -1) - ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout); - } -+EXPORT_SYMBOL(ath9k_hw_init_global_settings); - - void ath9k_hw_deinit(struct ath_hw *ah) - { -@@ -2077,7 +2053,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st - if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) - ath9k_enable_rfkill(ah); - -- ath9k_hw_init_user_settings(ah); -+ ath9k_hw_init_global_settings(ah); - - if (AR_SREV_9287_12_OR_LATER(ah)) { - REG_WRITE(ah, AR_D_GBL_IFS_SIFS, -@@ -3674,21 +3650,6 @@ u64 ath9k_hw_extend_tsf(struct ath_hw *a - } - EXPORT_SYMBOL(ath9k_hw_extend_tsf); - --bool ath9k_hw_setslottime(struct ath_hw *ah, u32 us) --{ -- if (us < ATH9K_SLOT_TIME_9 || us > ath9k_hw_mac_to_usec(ah, 0xffff)) { -- ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, -- "bad slot time %u\n", us); -- ah->slottime = (u32) -1; -- return false; -- } else { -- REG_WRITE(ah, AR_D_GBL_IFS_SLOT, ath9k_hw_mac_to_clks(ah, us)); -- ah->slottime = us; -- return true; -- } --} --EXPORT_SYMBOL(ath9k_hw_setslottime); -- - void ath9k_hw_set11nmac2040(struct ath_hw *ah) - { - struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -553,8 +553,6 @@ struct ath_hw { - int16_t txpower_indexoffset; - u32 beacon_interval; - u32 slottime; -- u32 acktimeout; -- u32 ctstimeout; - u32 globaltxtimeout; - - /* ANI */ -@@ -668,7 +666,7 @@ void ath9k_hw_settsf64(struct ath_hw *ah - void ath9k_hw_reset_tsf(struct ath_hw *ah); - void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting); - u64 ath9k_hw_extend_tsf(struct ath_hw *ah, u32 rstamp); --bool ath9k_hw_setslottime(struct ath_hw *ah, u32 us); -+void ath9k_hw_init_global_settings(struct ath_hw *ah); - void ath9k_hw_set11nmac2040(struct ath_hw *ah); - void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period); - void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, ---- a/drivers/net/wireless/ath/ath9k/beacon.c -+++ b/drivers/net/wireless/ath/ath9k/beacon.c -@@ -480,7 +480,8 @@ void ath_beacon_tasklet(unsigned long da - sc->beacon.updateslot = COMMIT; /* commit next beacon */ - sc->beacon.slotupdate = slot; - } else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) { -- ath9k_hw_setslottime(sc->sc_ah, sc->beacon.slottime); -+ ah->slottime = sc->beacon.slottime; -+ ath9k_hw_init_global_settings(ah); - sc->beacon.updateslot = OK; - } - if (bfaddr != 0) { diff --git a/package/mac80211/patches/560-ath9k_coverage_class.patch b/package/mac80211/patches/560-ath9k_coverage_class.patch deleted file mode 100644 index 035eabb1fa..0000000000 --- a/package/mac80211/patches/560-ath9k_coverage_class.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1211,6 +1211,7 @@ void ath9k_hw_init_global_settings(struc - { - struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; - int acktimeout; -+ int slottime; - int sifstime; - - ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n", -@@ -1225,8 +1226,10 @@ void ath9k_hw_init_global_settings(struc - else - sifstime = 10; - -- acktimeout = ah->slottime + sifstime; -- ath9k_hw_setslottime(ah, ah->slottime); -+ /* As defined by IEEE 802.11-2007 17.3.8.6 */ -+ slottime = ah->slottime + 3 * ah->coverage_class; -+ acktimeout = slottime + sifstime; -+ ath9k_hw_setslottime(ah, slottime); - ath9k_hw_set_ack_timeout(ah, acktimeout); - ath9k_hw_set_cts_timeout(ah, acktimeout); - if (ah->globaltxtimeout != (u32) -1) ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -551,6 +551,7 @@ struct ath_hw { - u32 *bank6Temp; - - int16_t txpower_indexoffset; -+ int coverage_class; - u32 beacon_interval; - u32 slottime; - u32 globaltxtimeout; ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -2015,6 +2015,18 @@ static void ath9k_sw_scan_complete(struc - mutex_unlock(&sc->mutex); - } - -+static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class) -+{ -+ struct ath_wiphy *aphy = hw->priv; -+ struct ath_softc *sc = aphy->sc; -+ struct ath_hw *ah = sc->sc_ah; -+ -+ mutex_lock(&sc->mutex); -+ ah->coverage_class = coverage_class; -+ ath9k_hw_init_global_settings(ah); -+ mutex_unlock(&sc->mutex); -+} -+ - struct ieee80211_ops ath9k_ops = { - .tx = ath9k_tx, - .start = ath9k_start, -@@ -2034,4 +2046,5 @@ struct ieee80211_ops ath9k_ops = { - .sw_scan_start = ath9k_sw_scan_start, - .sw_scan_complete = ath9k_sw_scan_complete, - .rfkill_poll = ath9k_rfkill_poll_state, -+ .set_coverage_class = ath9k_set_coverage_class, - }; diff --git a/package/mac80211/patches/570-ath9k_fix_rts_cts.patch b/package/mac80211/patches/570-ath9k_fix_rts_cts.patch deleted file mode 100644 index 789623c674..0000000000 --- a/package/mac80211/patches/570-ath9k_fix_rts_cts.patch +++ /dev/null @@ -1,61 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1498,26 +1498,6 @@ static void ath_buf_set_rate(struct ath_ - if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) - ctsrate |= rate->hw_value_short; - -- /* -- * ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. -- * Check the first rate in the series to decide whether RTS/CTS -- * or CTS-to-self has to be used. -- */ -- if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) -- flags = ATH9K_TXDESC_CTSENA; -- else if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) -- flags = ATH9K_TXDESC_RTSENA; -- -- /* FIXME: Handle aggregation protection */ -- if (sc->config.ath_aggr_prot && -- (!bf_isaggr(bf) || (bf_isaggr(bf) && bf->bf_al < 8192))) { -- flags = ATH9K_TXDESC_RTSENA; -- } -- -- /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ -- if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) -- flags &= ~(ATH9K_TXDESC_RTSENA); -- - for (i = 0; i < 4; i++) { - bool is_40, is_sgi, is_sp; - int phy; -@@ -1529,8 +1509,15 @@ static void ath_buf_set_rate(struct ath_ - series[i].Tries = rates[i].count; - series[i].ChSel = common->tx_chainmask; - -- if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) -+ if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) || -+ (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) { - series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; -+ flags |= ATH9K_TXDESC_RTSENA; -+ } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { -+ series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; -+ flags |= ATH9K_TXDESC_CTSENA; -+ } -+ - if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) - series[i].RateFlags |= ATH9K_RATESERIES_2040; - if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) -@@ -1568,6 +1555,14 @@ static void ath_buf_set_rate(struct ath_ - phy, rate->bitrate * 100, bf->bf_frmlen, rix, is_sp); - } - -+ /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ -+ if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) -+ flags &= ~ATH9K_TXDESC_RTSENA; -+ -+ /* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */ -+ if (flags & ATH9K_TXDESC_RTSENA) -+ flags &= ~ATH9K_TXDESC_CTSENA; -+ - /* set dur_update_en for l-sig computation except for PS-Poll frames */ - ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, - bf->bf_lastbf->bf_desc, diff --git a/package/mac80211/patches/580-ath9k_ack_timeout_workaround.patch b/package/mac80211/patches/580-ath9k_ack_timeout_workaround.patch deleted file mode 100644 index 953c07af6f..0000000000 --- a/package/mac80211/patches/580-ath9k_ack_timeout_workaround.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1229,6 +1229,11 @@ void ath9k_hw_init_global_settings(struc - /* As defined by IEEE 802.11-2007 17.3.8.6 */ - slottime = ah->slottime + 3 * ah->coverage_class; - acktimeout = slottime + sifstime; -+ -+ /* Workaround for a hw issue */ -+ if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) -+ acktimeout = max(64, acktimeout); -+ - ath9k_hw_setslottime(ah, slottime); - ath9k_hw_set_ack_timeout(ah, acktimeout); - ath9k_hw_set_cts_timeout(ah, acktimeout);