From d250cd4ca7be09c3ad97550716905cb8d7a35c43 Mon Sep 17 00:00:00 2001 From: nbd Date: Sat, 18 Dec 2010 18:37:58 +0000 Subject: [PATCH] mac80211: sync latest version from trunk - improves stability and performance git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@24678 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/Makefile | 73 +++- package/mac80211/patches/008-led_default.patch | 4 +- .../mac80211/patches/013-disable_b43_nphy.patch | 4 +- .../mac80211/patches/300-ath9k_gpio_settings.patch | 4 +- ...w_rfkill.patch => 310-ath9k_pending_work.patch} | 97 ++++- .../mac80211/patches/310-mac80211_tpt_led.patch | 470 --------------------- .../mac80211/patches/320-ath9k_pending_work.patch | 80 ---- .../patches/330-ibss_supress_proberesp.patch | 11 - .../patches/340-pending_regulatory_fixes.patch | 42 -- ...03-ath9k-fix-invalid-mac-address-handling.patch | 2 +- ...k-override-mac-address-from-platform-data.patch | 6 +- .../patches/409-ath9k_platform_settings.patch | 4 +- .../mac80211/patches/510-ath9k_led_cleanup.patch | 13 +- .../patches/520-ath9k_paprd_ht40_fix.patch | 57 +++ .../mac80211/patches/520-ath9k_slottime_init.patch | 11 - .../patches/521-ath9k_fix_distance_setting.patch | 11 - .../patches/530-ath9k_aggr_depth_fix.patch | 89 ---- ...ix.patch => 530-ath9k_chainmask_read_fix.patch} | 0 ....patch => 531-ath9k_legacy_chainmask_fix.patch} | 8 +- .../patches/540-mac80211_tx_optimization.patch | 14 + .../patches/541-mac80211_fix_skb_copy_crash.patch | 19 + .../542-mac80211_fix_duplicate_skb_data_copy.patch | 11 + ...isable-pci-code-if-CONFIG_PCI-not-defined.patch | 4 +- .../patches/601-rt2x00-fix-hang-on-ifdown.patch | 10 +- package/mac80211/patches/610-set_pci_mwi.patch | 2 +- .../patches/800-b43-gpio-mask-module-option.patch | 4 +- package/mac80211/patches/810-b43_no_pio.patch | 2 +- 27 files changed, 295 insertions(+), 757 deletions(-) rename package/mac80211/patches/{540-ath9k_disable_hw_rfkill.patch => 310-ath9k_pending_work.patch} (54%) delete mode 100644 package/mac80211/patches/310-mac80211_tpt_led.patch delete mode 100644 package/mac80211/patches/320-ath9k_pending_work.patch delete mode 100644 package/mac80211/patches/330-ibss_supress_proberesp.patch delete mode 100644 package/mac80211/patches/340-pending_regulatory_fixes.patch create mode 100644 package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch delete mode 100644 package/mac80211/patches/520-ath9k_slottime_init.patch delete mode 100644 package/mac80211/patches/521-ath9k_fix_distance_setting.patch delete mode 100644 package/mac80211/patches/530-ath9k_aggr_depth_fix.patch rename package/mac80211/patches/{550-ath9k_chainmask_read_fix.patch => 530-ath9k_chainmask_read_fix.patch} (100%) rename package/mac80211/patches/{551-ath9k_legacy_chainmask_fix.patch => 531-ath9k_legacy_chainmask_fix.patch} (91%) create mode 100644 package/mac80211/patches/540-mac80211_tx_optimization.patch create mode 100644 package/mac80211/patches/541-mac80211_fix_skb_copy_crash.patch create mode 100644 package/mac80211/patches/542-mac80211_fix_duplicate_skb_data_copy.patch diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index 046257832..d8af462bb 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,12 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2010-12-09 +PKG_VERSION:=2010-12-16 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:=94b6eaaa2c8245d1b5d6b6f16b75a701 +PKG_MD5SUM:=39196307aa67c1f19f498b570b994112 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) @@ -43,7 +41,7 @@ endef define KernelPackage/cfg80211 $(call KernelPackage/mac80211/Default) TITLE:=cfg80211 - wireless configuration API - DEPENDS+= +wireless-tools +iw @!LINUX_2_6_25 @!LINUX_2_4 +crda + DEPENDS+= +wireless-tools +iw +crda ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,2.6.33)),1) FILES:= \ $(PKG_BUILD_DIR)/compat/compat.ko \ @@ -577,6 +575,55 @@ define KernelPackage/net-ipw2200/description endef +define KernelPackage/net-hermes + $(call KernelPackage/mac80211/Default) + TITLE:=Hermes 802.11b chipset support + DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211 + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco.ko + AUTOLOAD:=$(call AutoLoad,50,orinoco) +endef + +define KernelPackage/net-hermes/description + Kernel support for Hermes 802.11b chipsets +endef + +define KernelPackage/net-hermes-pci + $(call KernelPackage/mac80211/Default) + TITLE:=Intersil Prism 2.5 PCI support + DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211 + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_pci.ko + AUTOLOAD:=$(call AutoLoad,55,orinoco_pci) +endef + +define KernelPackage/net-hermes-pci/description + Kernel modules for Intersil Prism 2.5 PCI support +endef + +define KernelPackage/net-hermes-plx + $(call KernelPackage/mac80211/Default) + TITLE:=PLX9052 based PCI adaptor + DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211 + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_plx.ko + AUTOLOAD:=$(call AutoLoad,55,orinoco_plx) +endef + +define KernelPackage/net-hermes-plx/description + Kernel modules for Hermes in PLX9052 based PCI adaptors +endef + +define KernelPackage/net-hermes-pcmcia + $(call KernelPackage/mac80211/Default) + TITLE:=Hermes based PCMCIA adaptors + DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes +kmod-cfg80211 @BROKEN + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_cs.ko + AUTOLOAD:=$(call AutoLoad,55,orinoco_cs) +endef + +define KernelPackage/net-hermes-pcmcia/description + Kernel modules for Hermes based PCMCIA adaptors +endef + + define KernelPackage/mwl8k $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards @@ -924,7 +971,17 @@ MAKE_OPTS:= \ CONFIG_AT76C50X_USB= \ CONFIG_WL12XX= \ CONFIG_EEPROM_93CX6= \ - CONFIG_HERMES= \ + CONFIG_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes),m) \ + CONFIG_HERMES_CACHE_FW_ON_INIT= \ + CONFIG_PCI_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pci),m) \ + CONFIG_PLX_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-plx),m) \ + CONFIG_PCMCIA_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pcmcia),m) \ + CONFIG_HERMES_PRISM= \ + CONFIG_APPLE_AIRPORT= \ + CONFIG_TMD_HERMES= \ + CONFIG_NORTEL_HERMES= \ + CONFIG_PCMCIA_SPECTRUM= \ + CONFIG_ORINOCO_USB= \ CONFIG_AR9170_USB=$(if $(CONFIG_PACKAGE_kmod-ar9170),m) \ CONFIG_AR9170_LEDS=$(CONFIG_LEDS_TRIGGERS) \ CONFIG_IWM= \ @@ -1129,3 +1186,7 @@ $(eval $(call KernelPackage,net-libipw)) $(eval $(call KernelPackage,net-ipw2100)) $(eval $(call KernelPackage,net-ipw2200)) $(eval $(call KernelPackage,mwl8k)) +$(eval $(call KernelPackage,net-hermes)) +$(eval $(call KernelPackage,net-hermes-pci)) +$(eval $(call KernelPackage,net-hermes-plx)) +$(eval $(call KernelPackage,net-hermes-pcmcia)) diff --git a/package/mac80211/patches/008-led_default.patch b/package/mac80211/patches/008-led_default.patch index 80d288708..8a36f1669 100644 --- a/package/mac80211/patches/008-led_default.patch +++ b/package/mac80211/patches/008-led_default.patch @@ -16,9 +16,9 @@ -CONFIG_B43_LEDS=y +# CONFIG_B43_LEDS=y CONFIG_B43_PHY_LP=y - CONFIG_B43_NPHY=y + CONFIG_B43_PHY_N=y # CONFIG_B43_FORCE_PIO=y -@@ -251,7 +251,7 @@ CONFIG_B43_NPHY=y +@@ -251,7 +251,7 @@ CONFIG_B43_PHY_N=y CONFIG_B43LEGACY=m CONFIG_B43LEGACY_HWRNG=y CONFIG_B43LEGACY_PCI_AUTOSELECT=y diff --git a/package/mac80211/patches/013-disable_b43_nphy.patch b/package/mac80211/patches/013-disable_b43_nphy.patch index 4e970ef13..94c09fce7 100644 --- a/package/mac80211/patches/013-disable_b43_nphy.patch +++ b/package/mac80211/patches/013-disable_b43_nphy.patch @@ -4,8 +4,8 @@ endif #CONFIG_PCMCIA # CONFIG_B43_LEDS=y CONFIG_B43_PHY_LP=y --CONFIG_B43_NPHY=y -+# CONFIG_B43_NPHY is not set +-CONFIG_B43_PHY_N=y ++# CONFIG_B43_PHY_N=y # CONFIG_B43_FORCE_PIO=y # CONFIG_B43_DEBUG=y diff --git a/package/mac80211/patches/300-ath9k_gpio_settings.patch b/package/mac80211/patches/300-ath9k_gpio_settings.patch index 56bf8ceee..ec2d5a72e 100644 --- a/package/mac80211/patches/300-ath9k_gpio_settings.patch +++ b/package/mac80211/patches/300-ath9k_gpio_settings.patch @@ -15,7 +15,7 @@ err: --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -795,6 +795,8 @@ struct ath_hw { +@@ -788,6 +788,8 @@ struct ath_hw { int initPDADC; int PDADCdelta; u8 led_pin; @@ -47,7 +47,7 @@ bool ath9k_hw_check_alive(struct ath_hw *ah) { int count = 50; -@@ -1457,6 +1471,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1459,6 +1473,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st if (AR_SREV_9300_20_OR_LATER(ah)) ar9003_hw_bb_watchdog_config(ah); diff --git a/package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch b/package/mac80211/patches/310-ath9k_pending_work.patch similarity index 54% rename from package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch rename to package/mac80211/patches/310-ath9k_pending_work.patch index a74ea0da9..ec0a26197 100644 --- a/package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch +++ b/package/mac80211/patches/310-ath9k_pending_work.patch @@ -29,7 +29,7 @@ priv_ops->do_getnf = ar5008_hw_do_getnf; --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -748,28 +748,6 @@ static void ar9003_hw_rfbus_done(struct +@@ -745,28 +745,6 @@ static void ar9003_hw_rfbus_done(struct REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0); } @@ -58,7 +58,7 @@ static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value) { u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); -@@ -1206,7 +1184,6 @@ void ar9003_hw_attach_phy_ops(struct ath +@@ -1203,7 +1181,6 @@ void ar9003_hw_attach_phy_ops(struct ath priv_ops->set_delta_slope = ar9003_hw_set_delta_slope; priv_ops->rfbus_req = ar9003_hw_rfbus_req; priv_ops->rfbus_done = ar9003_hw_rfbus_done; @@ -66,6 +66,16 @@ priv_ops->set_diversity = ar9003_hw_set_diversity; priv_ops->ani_control = ar9003_hw_ani_control; priv_ops->do_getnf = ar9003_hw_do_getnf; +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -189,6 +189,7 @@ struct ath_txq { + struct list_head axq_q; + spinlock_t axq_lock; + u32 axq_depth; ++ u32 axq_ampdu_depth; + bool stopped; + bool axq_tx_inprogress; + struct list_head axq_acq; --- a/drivers/net/wireless/ath/ath9k/hw-ops.h +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h @@ -223,11 +223,6 @@ static inline void ath9k_hw_rfbus_done(s @@ -82,7 +92,7 @@ if (!ath9k_hw_private_ops(ah)->restore_chainmask) --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1402,7 +1402,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1399,7 +1399,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st ath9k_hw_init_qos(ah); if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) @@ -93,7 +103,7 @@ --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -581,7 +581,6 @@ struct ath_hw_private_ops { +@@ -576,7 +576,6 @@ struct ath_hw_private_ops { void (*set_delta_slope)(struct ath_hw *ah, struct ath9k_channel *chan); bool (*rfbus_req)(struct ath_hw *ah); void (*rfbus_done)(struct ath_hw *ah); @@ -101,3 +111,82 @@ void (*restore_chainmask)(struct ath_hw *ah); void (*set_diversity)(struct ath_hw *ah, bool value); u32 (*compute_pll_control)(struct ath_hw *ah, +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -838,7 +838,7 @@ static void ath_tx_sched_aggr(struct ath + ath_tx_txqaddbuf(sc, txq, &bf_q); + TX_STAT_INC(txq->axq_qnum, a_aggr); + +- } while (txq->axq_depth < ATH_AGGR_MIN_QDEPTH && ++ } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && + status != ATH_AGGR_BAW_CLOSED); + } + +@@ -999,6 +999,7 @@ struct ath_txq *ath_txq_setup(struct ath + INIT_LIST_HEAD(&txq->axq_acq); + spin_lock_init(&txq->axq_lock); + txq->axq_depth = 0; ++ txq->axq_ampdu_depth = 0; + txq->axq_tx_inprogress = false; + sc->tx.txqsetup |= 1<bf_mpdu); ++ return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); ++} ++ + /* + * Drain a given TX queue (could be Beacon or Data) + * +@@ -1126,7 +1133,8 @@ void ath_draintxq(struct ath_softc *sc, + } + + txq->axq_depth--; +- ++ if (bf_is_ampdu_not_probing(bf)) ++ txq->axq_ampdu_depth--; + spin_unlock_bh(&txq->axq_lock); + + if (bf_isampdu(bf)) +@@ -1316,6 +1324,8 @@ static void ath_tx_txqaddbuf(struct ath_ + ath9k_hw_txstart(ah, txq->axq_qnum); + } + txq->axq_depth++; ++ if (bf_is_ampdu_not_probing(bf)) ++ txq->axq_ampdu_depth++; + } + + static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, +@@ -1336,7 +1346,7 @@ static void ath_tx_send_ampdu(struct ath + */ + if (!list_empty(&tid->buf_q) || tid->paused || + !BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno) || +- txctl->txq->axq_depth >= ATH_AGGR_MIN_QDEPTH) { ++ txctl->txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) { + /* + * Add this frame to software queue for scheduling later + * for aggregation. +@@ -2040,6 +2050,9 @@ static void ath_tx_processq(struct ath_s + txq->axq_tx_inprogress = false; + if (bf_held) + list_del(&bf_held->list); ++ ++ if (bf_is_ampdu_not_probing(bf)) ++ txq->axq_ampdu_depth--; + spin_unlock_bh(&txq->axq_lock); + + if (bf_held) +@@ -2168,6 +2181,8 @@ void ath_tx_edma_tasklet(struct ath_soft + INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); + txq->axq_depth--; + txq->axq_tx_inprogress = false; ++ if (bf_is_ampdu_not_probing(bf)) ++ txq->axq_ampdu_depth--; + spin_unlock_bh(&txq->axq_lock); + + txok = !(txs.ts_status & ATH9K_TXERR_MASK); diff --git a/package/mac80211/patches/310-mac80211_tpt_led.patch b/package/mac80211/patches/310-mac80211_tpt_led.patch deleted file mode 100644 index 9318f8c46..000000000 --- a/package/mac80211/patches/310-mac80211_tpt_led.patch +++ /dev/null @@ -1,470 +0,0 @@ ---- a/net/mac80211/led.c -+++ b/net/mac80211/led.c -@@ -54,12 +54,22 @@ void ieee80211_led_radio(struct ieee8021 - led_trigger_event(local->radio_led, LED_OFF); - } - -+void ieee80211_led_names(struct ieee80211_local *local) -+{ -+ snprintf(local->rx_led_name, sizeof(local->rx_led_name), -+ "%srx", wiphy_name(local->hw.wiphy)); -+ snprintf(local->tx_led_name, sizeof(local->tx_led_name), -+ "%stx", wiphy_name(local->hw.wiphy)); -+ snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), -+ "%sassoc", wiphy_name(local->hw.wiphy)); -+ snprintf(local->radio_led_name, sizeof(local->radio_led_name), -+ "%sradio", wiphy_name(local->hw.wiphy)); -+} -+ - void ieee80211_led_init(struct ieee80211_local *local) - { - local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - if (local->rx_led) { -- snprintf(local->rx_led_name, sizeof(local->rx_led_name), -- "%srx", wiphy_name(local->hw.wiphy)); - local->rx_led->name = local->rx_led_name; - if (led_trigger_register(local->rx_led)) { - kfree(local->rx_led); -@@ -69,8 +79,6 @@ void ieee80211_led_init(struct ieee80211 - - local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - if (local->tx_led) { -- snprintf(local->tx_led_name, sizeof(local->tx_led_name), -- "%stx", wiphy_name(local->hw.wiphy)); - local->tx_led->name = local->tx_led_name; - if (led_trigger_register(local->tx_led)) { - kfree(local->tx_led); -@@ -80,8 +88,6 @@ void ieee80211_led_init(struct ieee80211 - - local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - if (local->assoc_led) { -- snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), -- "%sassoc", wiphy_name(local->hw.wiphy)); - local->assoc_led->name = local->assoc_led_name; - if (led_trigger_register(local->assoc_led)) { - kfree(local->assoc_led); -@@ -91,14 +97,19 @@ void ieee80211_led_init(struct ieee80211 - - local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - if (local->radio_led) { -- snprintf(local->radio_led_name, sizeof(local->radio_led_name), -- "%sradio", wiphy_name(local->hw.wiphy)); - local->radio_led->name = local->radio_led_name; - if (led_trigger_register(local->radio_led)) { - kfree(local->radio_led); - local->radio_led = NULL; - } - } -+ -+ if (local->tpt_led_trigger) { -+ if (led_trigger_register(&local->tpt_led_trigger->trig)) { -+ kfree(local->tpt_led_trigger); -+ local->tpt_led_trigger = NULL; -+ } -+ } - } - - void ieee80211_led_exit(struct ieee80211_local *local) -@@ -119,15 +130,18 @@ void ieee80211_led_exit(struct ieee80211 - led_trigger_unregister(local->rx_led); - kfree(local->rx_led); - } -+ -+ if (local->tpt_led_trigger) { -+ led_trigger_unregister(&local->tpt_led_trigger->trig); -+ kfree(local->tpt_led_trigger); -+ } - } - - char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw) - { - struct ieee80211_local *local = hw_to_local(hw); - -- if (local->radio_led) -- return local->radio_led_name; -- return NULL; -+ return local->radio_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_radio_led_name); - -@@ -135,9 +149,7 @@ char *__ieee80211_get_assoc_led_name(str - { - struct ieee80211_local *local = hw_to_local(hw); - -- if (local->assoc_led) -- return local->assoc_led_name; -- return NULL; -+ return local->assoc_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_assoc_led_name); - -@@ -145,9 +157,7 @@ char *__ieee80211_get_tx_led_name(struct - { - struct ieee80211_local *local = hw_to_local(hw); - -- if (local->tx_led) -- return local->tx_led_name; -- return NULL; -+ return local->tx_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_tx_led_name); - -@@ -155,8 +165,115 @@ char *__ieee80211_get_rx_led_name(struct - { - struct ieee80211_local *local = hw_to_local(hw); - -- if (local->rx_led) -- return local->rx_led_name; -- return NULL; -+ return local->rx_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_rx_led_name); -+ -+static unsigned long tpt_trig_traffic(struct ieee80211_local *local, -+ struct tpt_led_trigger *tpt_trig) -+{ -+ unsigned long traffic, delta; -+ -+ traffic = tpt_trig->tx_bytes + tpt_trig->rx_bytes; -+ -+ delta = traffic - tpt_trig->prev_traffic; -+ tpt_trig->prev_traffic = traffic; -+ return DIV_ROUND_UP(delta, 1024 / 8); -+} -+ -+static void tpt_trig_timer(unsigned long data) -+{ -+ struct ieee80211_local *local = (void *)data; -+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+ struct led_classdev *led_cdev; -+ unsigned long on, off, tpt; -+ int i; -+ -+ if (!tpt_trig->running) -+ return; -+ -+ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); -+ -+ tpt = tpt_trig_traffic(local, tpt_trig); -+ -+ /* default to just solid on */ -+ on = 1; -+ off = 0; -+ -+ for (i = tpt_trig->blink_table_len - 1; i >= 0; i--) { -+ if (tpt_trig->blink_table[i].throughput < 0 || -+ tpt > tpt_trig->blink_table[i].throughput) { -+ off = tpt_trig->blink_table[i].blink_time / 2; -+ on = tpt_trig->blink_table[i].blink_time - off; -+ break; -+ } -+ } -+ -+ read_lock(&tpt_trig->trig.leddev_list_lock); -+ list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) -+ led_blink_set(led_cdev, &on, &off); -+ read_unlock(&tpt_trig->trig.leddev_list_lock); -+} -+ -+extern char *__ieee80211_create_tpt_led_trigger( -+ struct ieee80211_hw *hw, -+ const struct ieee80211_tpt_blink *blink_table, -+ unsigned int blink_table_len) -+{ -+ struct ieee80211_local *local = hw_to_local(hw); -+ struct tpt_led_trigger *tpt_trig; -+ -+ if (WARN_ON(local->tpt_led_trigger)) -+ return NULL; -+ -+ tpt_trig = kzalloc(sizeof(struct tpt_led_trigger), GFP_KERNEL); -+ if (!tpt_trig) -+ return NULL; -+ -+ snprintf(tpt_trig->name, sizeof(tpt_trig->name), -+ "%stpt", wiphy_name(local->hw.wiphy)); -+ -+ tpt_trig->trig.name = tpt_trig->name; -+ -+ tpt_trig->blink_table = blink_table; -+ tpt_trig->blink_table_len = blink_table_len; -+ -+ setup_timer(&tpt_trig->timer, tpt_trig_timer, (unsigned long)local); -+ -+ local->tpt_led_trigger = tpt_trig; -+ -+ return tpt_trig->name; -+} -+EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger); -+ -+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) -+{ -+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+ -+ if (!tpt_trig) -+ return; -+ -+ /* reset traffic */ -+ tpt_trig_traffic(local, tpt_trig); -+ tpt_trig->running = true; -+ -+ tpt_trig_timer((unsigned long)local); -+ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); -+} -+ -+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) -+{ -+ struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+ struct led_classdev *led_cdev; -+ -+ if (!tpt_trig) -+ return; -+ -+ tpt_trig->running = false; -+ del_timer_sync(&tpt_trig->timer); -+ -+ read_lock(&tpt_trig->trig.leddev_list_lock); -+ list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) -+ led_brightness_set(led_cdev, LED_OFF); -+ read_unlock(&tpt_trig->trig.leddev_list_lock); -+} ---- a/net/mac80211/led.h -+++ b/net/mac80211/led.h -@@ -12,14 +12,17 @@ - #include "ieee80211_i.h" - - #ifdef CONFIG_MAC80211_LEDS --extern void ieee80211_led_rx(struct ieee80211_local *local); --extern void ieee80211_led_tx(struct ieee80211_local *local, int q); --extern void ieee80211_led_assoc(struct ieee80211_local *local, -- bool associated); --extern void ieee80211_led_radio(struct ieee80211_local *local, -- bool enabled); --extern void ieee80211_led_init(struct ieee80211_local *local); --extern void ieee80211_led_exit(struct ieee80211_local *local); -+void ieee80211_led_rx(struct ieee80211_local *local); -+void ieee80211_led_tx(struct ieee80211_local *local, int q); -+void ieee80211_led_assoc(struct ieee80211_local *local, -+ bool associated); -+void ieee80211_led_radio(struct ieee80211_local *local, -+ bool enabled); -+void ieee80211_led_names(struct ieee80211_local *local); -+void ieee80211_led_init(struct ieee80211_local *local); -+void ieee80211_led_exit(struct ieee80211_local *local); -+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local); -+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local); - #else - static inline void ieee80211_led_rx(struct ieee80211_local *local) - { -@@ -35,10 +38,37 @@ static inline void ieee80211_led_radio(s - bool enabled) - { - } -+static inline void ieee80211_led_names(struct ieee80211_local *local) -+{ -+} - static inline void ieee80211_led_init(struct ieee80211_local *local) - { - } - static inline void ieee80211_led_exit(struct ieee80211_local *local) - { - } -+static inline void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) -+{ -+} -+static inline void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) -+{ -+} -+#endif -+ -+static inline void -+ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+ if (local->tpt_led_trigger && ieee80211_is_data(fc)) -+ local->tpt_led_trigger->tx_bytes += bytes; -+#endif -+} -+ -+static inline void -+ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+ if (local->tpt_led_trigger && ieee80211_is_data(fc)) -+ local->tpt_led_trigger->rx_bytes += bytes; - #endif -+} ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -602,6 +602,8 @@ struct ieee80211_hw *ieee80211_alloc_hw( - /* init dummy netdev for use w/ NAPI */ - init_dummy_netdev(&local->napi_dev); - -+ ieee80211_led_names(local); -+ - return local_to_hw(local); - } - EXPORT_SYMBOL(ieee80211_alloc_hw); ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -1856,11 +1856,26 @@ struct ieee80211_hw *ieee80211_alloc_hw( - */ - int ieee80211_register_hw(struct ieee80211_hw *hw); - -+/** -+ * struct ieee80211_tpt_blink - throughput blink description -+ * @throughput: throughput in Kbit/sec -+ * @blink_time: blink time in milliseconds -+ * (full cycle, ie. one off + one on period) -+ */ -+struct ieee80211_tpt_blink { -+ int throughput; -+ int blink_time; -+}; -+ - #ifdef CONFIG_MAC80211_LEDS - extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw); -+extern char *__ieee80211_create_tpt_led_trigger( -+ struct ieee80211_hw *hw, -+ const struct ieee80211_tpt_blink *blink_table, -+ unsigned int blink_table_len); - #endif - /** - * ieee80211_get_tx_led_name - get name of TX LED -@@ -1939,6 +1954,29 @@ static inline char *ieee80211_get_radio_ - } - - /** -+ * ieee80211_create_tpt_led_trigger - create throughput LED trigger -+ * @hw: the hardware to create the trigger for -+ * @blink_table: the blink table -- needs to be ordered by throughput -+ * @blink_table_len: size of the blink table -+ * -+ * This function returns %NULL (in case of error, or if no LED -+ * triggers are configured) or the name of the new trigger. -+ * This function must be called before ieee80211_register_hw(). -+ */ -+static inline char * -+ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, -+ const struct ieee80211_tpt_blink *blink_table, -+ unsigned int blink_table_len) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+ return __ieee80211_create_tpt_led_trigger(hw, blink_table, -+ blink_table_len); -+#else -+ return NULL; -+#endif -+} -+ -+/** - * ieee80211_unregister_hw - Unregister a hardware device - * - * This function instructs mac80211 to free allocated resources ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -629,6 +630,19 @@ enum queue_stop_reason { - IEEE80211_QUEUE_STOP_REASON_SKB_ADD, - }; - -+#ifdef CONFIG_MAC80211_LEDS -+struct tpt_led_trigger { -+ struct led_trigger trig; -+ char name[32]; -+ const struct ieee80211_tpt_blink *blink_table; -+ unsigned int blink_table_len; -+ struct timer_list timer; -+ bool running; -+ unsigned long prev_traffic; -+ unsigned long tx_bytes, rx_bytes; -+}; -+#endif -+ - /** - * mac80211 scan flags - currently active scan mode - * -@@ -842,6 +856,7 @@ struct ieee80211_local { - #ifdef CONFIG_MAC80211_LEDS - int tx_led_counter, rx_led_counter; - struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led; -+ struct tpt_led_trigger *tpt_led_trigger; - char tx_led_name[32], rx_led_name[32], - assoc_led_name[32], radio_led_name[32]; - #endif ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -220,6 +220,7 @@ static int ieee80211_do_open(struct net_ - /* we're brought up, everything changes */ - hw_reconf_flags = ~0; - ieee80211_led_radio(local, true); -+ ieee80211_start_tpt_led_trig(local); - } - - /* ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -2888,6 +2888,9 @@ void ieee80211_rx(struct ieee80211_hw *h - return; - } - -+ ieee80211_tpt_led_trig_rx(local, -+ ((struct ieee80211_hdr *)skb->data)->frame_control, -+ skb->len); - __ieee80211_rx_handle_packet(hw, skb); - - rcu_read_unlock(); ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -1293,6 +1293,7 @@ static int __ieee80211_tx(struct ieee802 - - while (skb) { - int q = skb_get_queue_mapping(skb); -+ __le16 fc; - - spin_lock_irqsave(&local->queue_stop_reason_lock, flags); - ret = IEEE80211_TX_OK; -@@ -1335,6 +1336,7 @@ static int __ieee80211_tx(struct ieee802 - else - info->control.sta = NULL; - -+ fc = ((struct ieee80211_hdr *)skb->data)->frame_control; - ret = drv_tx(local, skb); - if (WARN_ON(ret != NETDEV_TX_OK && skb->len != len)) { - dev_kfree_skb(skb); -@@ -1345,6 +1347,7 @@ static int __ieee80211_tx(struct ieee802 - return IEEE80211_TX_AGAIN; - } - -+ ieee80211_tpt_led_trig_tx(local, fc, len); - *skbp = skb = next; - ieee80211_led_tx(local, 1); - fragm = true; ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -1141,6 +1141,7 @@ u32 ieee80211_sta_get_rates(struct ieee8 - void ieee80211_stop_device(struct ieee80211_local *local) - { - ieee80211_led_radio(local, false); -+ ieee80211_stop_tpt_led_trig(local); - - cancel_work_sync(&local->reconfig_filter); - -@@ -1175,6 +1176,7 @@ int ieee80211_reconfig(struct ieee80211_ - } - - ieee80211_led_radio(local, true); -+ ieee80211_start_tpt_led_trig(local); - } - - /* add interfaces */ diff --git a/package/mac80211/patches/320-ath9k_pending_work.patch b/package/mac80211/patches/320-ath9k_pending_work.patch deleted file mode 100644 index baeeb064b..000000000 --- a/package/mac80211/patches/320-ath9k_pending_work.patch +++ /dev/null @@ -1,80 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1685,17 +1685,20 @@ static void ath_tx_start_dma(struct ath_ - struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - struct list_head bf_head; -- struct ath_atx_tid *tid; -+ struct ath_atx_tid *tid = NULL; - u8 tidno; - - spin_lock_bh(&txctl->txq->axq_lock); - -- if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && txctl->an) { -+ if (ieee80211_is_data_qos(hdr->frame_control) && txctl->an) { - tidno = ieee80211_get_qos_ctl(hdr)[0] & - IEEE80211_QOS_CTL_TID_MASK; - tid = ATH_AN_2_TID(txctl->an, tidno); - - WARN_ON(tid->ac->txq != txctl->txq); -+ } -+ -+ if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { - /* - * Try aggregation if it's a unicast data frame - * and the destination is HT capable. -@@ -1712,7 +1715,7 @@ static void ath_tx_start_dma(struct ath_ - ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, - bf->bf_state.bfs_paprd); - -- ath_tx_send_normal(sc, txctl->txq, NULL, &bf_head); -+ ath_tx_send_normal(sc, txctl->txq, tid, &bf_head); - } - - spin_unlock_bh(&txctl->txq->axq_lock); ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -284,11 +284,9 @@ static void ath9k_hw_read_revisions(stru - - static void ath9k_hw_disablepcie(struct ath_hw *ah) - { -- if (AR_SREV_9100(ah)) -+ if (!AR_SREV_5416(ah)) - return; - -- ENABLE_REGWRITE_BUFFER(ah); -- - REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); - REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); - REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); -@@ -300,8 +298,6 @@ static void ath9k_hw_disablepcie(struct - REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); - - REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); -- -- REGWRITE_BUFFER_FLUSH(ah); - } - - /* This should work for all families including legacy */ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1940,7 +1940,9 @@ static u64 ath9k_get_tsf(struct ieee8021 - struct ath_softc *sc = aphy->sc; - - mutex_lock(&sc->mutex); -+ ath9k_ps_wakeup(sc); - tsf = ath9k_hw_gettsf64(sc->sc_ah); -+ ath9k_ps_restore(sc); - mutex_unlock(&sc->mutex); - - return tsf; -@@ -1952,7 +1954,9 @@ static void ath9k_set_tsf(struct ieee802 - struct ath_softc *sc = aphy->sc; - - mutex_lock(&sc->mutex); -+ ath9k_ps_wakeup(sc); - ath9k_hw_settsf64(sc->sc_ah, tsf); -+ ath9k_ps_restore(sc); - mutex_unlock(&sc->mutex); - } - diff --git a/package/mac80211/patches/330-ibss_supress_proberesp.patch b/package/mac80211/patches/330-ibss_supress_proberesp.patch deleted file mode 100644 index 0c8d1481b..000000000 --- a/package/mac80211/patches/330-ibss_supress_proberesp.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/mac80211/driver-ops.h -+++ b/net/mac80211/driver-ops.h -@@ -381,7 +381,7 @@ static inline void drv_reset_tsf(struct - - static inline int drv_tx_last_beacon(struct ieee80211_local *local) - { -- int ret = 1; -+ int ret = 0; /* default unsuported op for less congestion */ - - might_sleep(); - diff --git a/package/mac80211/patches/340-pending_regulatory_fixes.patch b/package/mac80211/patches/340-pending_regulatory_fixes.patch deleted file mode 100644 index 4fdb2067c..000000000 --- a/package/mac80211/patches/340-pending_regulatory_fixes.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- a/drivers/net/wireless/ath/regd.c -+++ b/drivers/net/wireless/ath/regd.c -@@ -342,6 +342,14 @@ int ath_reg_notifier_apply(struct wiphy - /* We always apply this */ - ath_reg_apply_radar_flags(wiphy); - -+ /* -+ * This would happen when we have sent a custom regulatory request -+ * a world regulatory domain and the scheduler hasn't yet processed -+ * any pending requests in the queue. -+ */ -+ if (!request) -+ return 0; -+ - switch (request->initiator) { - case NL80211_REGDOM_SET_BY_DRIVER: - case NL80211_REGDOM_SET_BY_CORE: ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -1417,7 +1417,9 @@ struct ieee80211_txrx_stypes { - - /** - * struct wiphy - wireless hardware description -- * @reg_notifier: the driver's regulatory notification callback -+ * @reg_notifier: the driver's regulatory notification callback, -+ * note that if your driver uses wiphy_apply_custom_regulatory() -+ * the reg_notifier's request can be passed as NULL - * @regd: the driver's regulatory domain, if one was requested via - * the regulatory_hint() API. This can be used by the driver - * on the reg_notifier() if it chooses to ignore future ---- a/net/wireless/reg.c -+++ b/net/wireless/reg.c -@@ -662,7 +662,8 @@ static int freq_reg_info_regd(struct wip - * Follow the driver's regulatory domain, if present, unless a country - * IE has been processed or a user wants to help complaince further - */ -- if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && -+ if (!custom_regd && -+ last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && - last_request->initiator != NL80211_REGDOM_SET_BY_USER && - wiphy->regd) - regd = wiphy->regd; 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 a47552399..700854d21 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" -@@ -436,8 +437,16 @@ static int ath9k_hw_init_macaddr(struct +@@ -428,8 +429,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/407-ath9k-override-mac-address-from-platform-data.patch b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch index 2444db4bc..daebf33b4 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 @@ -18,7 +18,7 @@ #include "ath9k.h" -@@ -522,6 +523,7 @@ static void ath9k_init_misc(struct ath_s +@@ -526,6 +527,7 @@ static void ath9k_init_misc(struct ath_s static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, const struct ath_bus_ops *bus_ops) { @@ -26,7 +26,7 @@ struct ath_hw *ah = NULL; struct ath_common *common; int ret = 0, i; -@@ -535,7 +537,7 @@ static int ath9k_init_softc(u16 devid, s +@@ -539,7 +541,7 @@ static int ath9k_init_softc(u16 devid, s ah->hw_version.subsysid = subsysid; sc->sc_ah = ah; @@ -35,7 +35,7 @@ ah->ah_flags |= AH_USE_EEPROM; common = ath9k_hw_common(ah); -@@ -568,6 +570,9 @@ static int ath9k_init_softc(u16 devid, s +@@ -572,6 +574,9 @@ static int ath9k_init_softc(u16 devid, s if (ret) goto err_hw; diff --git a/package/mac80211/patches/409-ath9k_platform_settings.patch b/package/mac80211/patches/409-ath9k_platform_settings.patch index 7b56ee23d..7b735a10b 100644 --- a/package/mac80211/patches/409-ath9k_platform_settings.patch +++ b/package/mac80211/patches/409-ath9k_platform_settings.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -537,8 +537,14 @@ static int ath9k_init_softc(u16 devid, s +@@ -541,8 +541,14 @@ static int ath9k_init_softc(u16 devid, s ah->hw_version.subsysid = subsysid; sc->sc_ah = ah; @@ -18,7 +18,7 @@ common->ops = &ath9k_common_ops; --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -794,7 +794,7 @@ struct ath_hw { +@@ -786,7 +786,7 @@ struct ath_hw { u32 originalGain[22]; int initPDADC; int PDADCdelta; diff --git a/package/mac80211/patches/510-ath9k_led_cleanup.patch b/package/mac80211/patches/510-ath9k_led_cleanup.patch index b855bb295..be26a883c 100644 --- a/package/mac80211/patches/510-ath9k_led_cleanup.patch +++ b/package/mac80211/patches/510-ath9k_led_cleanup.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -438,26 +438,20 @@ void ath9k_btcoex_timer_pause(struct ath +@@ -441,26 +441,20 @@ void ath9k_btcoex_timer_pause(struct ath #define ATH_LED_PIN_DEF 1 #define ATH_LED_PIN_9287 8 @@ -38,7 +38,7 @@ /* Antenna diversity/combining */ #define ATH_ANT_RX_CURRENT_SHIFT 4 -@@ -608,15 +602,11 @@ struct ath_softc { +@@ -611,15 +605,11 @@ struct ath_softc { struct ath_beacon beacon; struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; @@ -253,7 +253,7 @@ /* Rfkill */ --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1275,9 +1275,6 @@ static void ath9k_stop(struct ieee80211_ +@@ -1295,9 +1295,6 @@ static void ath9k_stop(struct ieee80211_ aphy->state = ATH_WIPHY_INACTIVE; @@ -265,7 +265,7 @@ cancel_work_sync(&sc->hw_check_work); --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -139,6 +139,21 @@ static struct ieee80211_rate ath9k_legac +@@ -143,6 +143,21 @@ static struct ieee80211_rate ath9k_legac RATE(540, 0x0c, 0), }; @@ -287,14 +287,15 @@ static void ath9k_deinit_softc(struct ath_softc *sc); /* -@@ -742,6 +757,12 @@ int ath9k_init_device(u16 devid, struct +@@ -746,6 +761,13 @@ int ath9k_init_device(u16 devid, struct ath9k_init_txpower_limits(sc); +#ifdef CONFIG_MAC80211_LEDS + /* must be initialized before ieee80211_register_hw */ + sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw, -+ ath9k_tpt_blink, ARRAY_SIZE(ath9k_tpt_blink)); ++ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink, ++ ARRAY_SIZE(ath9k_tpt_blink)); +#endif + /* Register with mac80211 */ diff --git a/package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch b/package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch new file mode 100644 index 000000000..cea8f2e37 --- /dev/null +++ b/package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch @@ -0,0 +1,57 @@ +--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +@@ -4762,6 +4762,7 @@ static void ath9k_hw_ar9300_set_txpower( + struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); + struct ath_common *common = ath9k_hw_common(ah); + struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; ++ struct ar9300_modal_eep_header *modal_hdr; + u8 targetPowerValT2[ar9300RateSize]; + u8 target_power_val_t2_eep[ar9300RateSize]; + unsigned int i = 0, paprd_scale_factor = 0; +@@ -4771,15 +4772,17 @@ static void ath9k_hw_ar9300_set_txpower( + + if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) { + if (IS_CHAN_2GHZ(chan)) +- ah->paprd_ratemask = (IS_CHAN_HT40(chan) ? +- le32_to_cpu(eep->modalHeader2G.papdRateMaskHt40) : +- le32_to_cpu(eep->modalHeader2G.papdRateMaskHt20)) +- & AR9300_PAPRD_RATE_MASK; ++ modal_hdr = &eep->modalHeader2G; + else +- ah->paprd_ratemask = (IS_CHAN_HT40(chan) ? +- le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40) : +- le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20)) +- & AR9300_PAPRD_RATE_MASK; ++ modal_hdr = &eep->modalHeader5G; ++ ++ ah->paprd_ratemask = ++ le32_to_cpu(modal_hdr->papdRateMaskHt20) & ++ AR9300_PAPRD_RATE_MASK; ++ ++ ah->paprd_ratemask_ht40 = ++ le32_to_cpu(modal_hdr->papdRateMaskHt40) & ++ AR9300_PAPRD_RATE_MASK; + + paprd_scale_factor = ar9003_get_paprd_scale_factor(ah, chan); + min_pwridx = IS_CHAN_HT40(chan) ? ALL_TARGET_HT40_0_8_16 : +--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c +@@ -134,7 +134,7 @@ static int ar9003_paprd_setup_single_tab + REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, + ah->paprd_ratemask); + REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, +- AR_PHY_PAPRD_HT40_MASK); ++ ah->paprd_ratemask_ht40); + + for (i = 0; i < ah->caps.max_txchains; i++) { + REG_RMW_FIELD(ah, ctrl0[i], +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -837,6 +837,7 @@ struct ath_hw { + unsigned int paprd_target_power; + unsigned int paprd_training_power; + unsigned int paprd_ratemask; ++ unsigned int paprd_ratemask_ht40; + bool paprd_table_write_done; + u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES]; + u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES]; diff --git a/package/mac80211/patches/520-ath9k_slottime_init.patch b/package/mac80211/patches/520-ath9k_slottime_init.patch deleted file mode 100644 index 1eb83583b..000000000 --- a/package/mac80211/patches/520-ath9k_slottime_init.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -417,7 +417,7 @@ static void ath9k_hw_init_defaults(struc - AR_STA_ID1_MCAST_KSRCH; - ah->beacon_interval = 100; - ah->enable_32kHz_clock = DONT_USE_32KHZ; -- ah->slottime = (u32) -1; -+ ah->slottime = 9; - ah->globaltxtimeout = (u32) -1; - ah->power_mode = ATH9K_PM_UNDEFINED; - } diff --git a/package/mac80211/patches/521-ath9k_fix_distance_setting.patch b/package/mac80211/patches/521-ath9k_fix_distance_setting.patch deleted file mode 100644 index 6d54945d1..000000000 --- a/package/mac80211/patches/521-ath9k_fix_distance_setting.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -813,7 +813,7 @@ void ath9k_hw_init_global_settings(struc - if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) - acktimeout += 64 - sifstime - ah->slottime; - -- ath9k_hw_setslottime(ah, slottime); -+ 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) diff --git a/package/mac80211/patches/530-ath9k_aggr_depth_fix.patch b/package/mac80211/patches/530-ath9k_aggr_depth_fix.patch deleted file mode 100644 index ad0f2e1e9..000000000 --- a/package/mac80211/patches/530-ath9k_aggr_depth_fix.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -838,7 +838,7 @@ static void ath_tx_sched_aggr(struct ath - ath_tx_txqaddbuf(sc, txq, &bf_q); - TX_STAT_INC(txq->axq_qnum, a_aggr); - -- } while (txq->axq_depth < ATH_AGGR_MIN_QDEPTH && -+ } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && - status != ATH_AGGR_BAW_CLOSED); - } - -@@ -999,6 +999,7 @@ struct ath_txq *ath_txq_setup(struct ath - INIT_LIST_HEAD(&txq->axq_acq); - spin_lock_init(&txq->axq_lock); - txq->axq_depth = 0; -+ txq->axq_ampdu_depth = 0; - txq->axq_tx_inprogress = false; - sc->tx.txqsetup |= 1<bf_mpdu); -+ return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); -+} -+ - /* - * Drain a given TX queue (could be Beacon or Data) - * -@@ -1126,7 +1133,8 @@ void ath_draintxq(struct ath_softc *sc, - } - - txq->axq_depth--; -- -+ if (bf_is_ampdu_not_probing(bf)) -+ txq->axq_ampdu_depth--; - spin_unlock_bh(&txq->axq_lock); - - if (bf_isampdu(bf)) -@@ -1316,6 +1324,8 @@ static void ath_tx_txqaddbuf(struct ath_ - ath9k_hw_txstart(ah, txq->axq_qnum); - } - txq->axq_depth++; -+ if (bf_is_ampdu_not_probing(bf)) -+ txq->axq_ampdu_depth++; - } - - static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, -@@ -1336,7 +1346,7 @@ static void ath_tx_send_ampdu(struct ath - */ - if (!list_empty(&tid->buf_q) || tid->paused || - !BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno) || -- txctl->txq->axq_depth >= ATH_AGGR_MIN_QDEPTH) { -+ txctl->txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) { - /* - * Add this frame to software queue for scheduling later - * for aggregation. -@@ -2040,6 +2050,9 @@ static void ath_tx_processq(struct ath_s - txq->axq_tx_inprogress = false; - if (bf_held) - list_del(&bf_held->list); -+ -+ if (bf_is_ampdu_not_probing(bf)) -+ txq->axq_ampdu_depth--; - spin_unlock_bh(&txq->axq_lock); - - if (bf_held) -@@ -2168,6 +2181,8 @@ void ath_tx_edma_tasklet(struct ath_soft - INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); - txq->axq_depth--; - txq->axq_tx_inprogress = false; -+ if (bf_is_ampdu_not_probing(bf)) -+ txq->axq_ampdu_depth--; - spin_unlock_bh(&txq->axq_lock); - - txok = !(txs.ts_status & ATH9K_TXERR_MASK); ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -187,6 +187,7 @@ struct ath_txq { - struct list_head axq_q; - spinlock_t axq_lock; - u32 axq_depth; -+ u32 axq_ampdu_depth; - bool stopped; - bool axq_tx_inprogress; - struct list_head axq_acq; diff --git a/package/mac80211/patches/550-ath9k_chainmask_read_fix.patch b/package/mac80211/patches/530-ath9k_chainmask_read_fix.patch similarity index 100% rename from package/mac80211/patches/550-ath9k_chainmask_read_fix.patch rename to package/mac80211/patches/530-ath9k_chainmask_read_fix.patch diff --git a/package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch b/package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch similarity index 91% rename from package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch rename to package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch index a62cf63d9..df7e5cbbf 100644 --- a/package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch +++ b/package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -662,7 +662,6 @@ void ath9k_deinit_device(struct ath_soft +@@ -665,7 +665,6 @@ void ath9k_deinit_device(struct ath_soft void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw); void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw, struct ath9k_channel *ichan); @@ -10,7 +10,7 @@ --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -522,32 +522,6 @@ set_timer: +@@ -538,32 +538,6 @@ set_timer: } } @@ -43,7 +43,7 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta) { struct ath_node *an; -@@ -1609,8 +1583,6 @@ static int ath9k_config(struct ieee80211 +@@ -1676,8 +1650,6 @@ static int ath9k_config(struct ieee80211 /* XXX: remove me eventualy */ ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]); @@ -52,7 +52,7 @@ /* update survey stats for the old channel before switching */ spin_lock_irqsave(&common->cc_lock, flags); ath_update_survey_stats(sc); -@@ -1842,10 +1814,6 @@ static void ath9k_bss_info_changed(struc +@@ -1909,10 +1881,6 @@ static void ath9k_bss_info_changed(struc /* Set aggregation protection mode parameters */ sc->config.ath_aggr_prot = 0; diff --git a/package/mac80211/patches/540-mac80211_tx_optimization.patch b/package/mac80211/patches/540-mac80211_tx_optimization.patch new file mode 100644 index 000000000..a32207822 --- /dev/null +++ b/package/mac80211/patches/540-mac80211_tx_optimization.patch @@ -0,0 +1,14 @@ +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1549,8 +1549,10 @@ static int ieee80211_skb_resize(struct i + + if (skb_header_cloned(skb)) + I802_DEBUG_INC(local->tx_expand_skb_head_cloned); +- else ++ else if (head_need || tail_need) + I802_DEBUG_INC(local->tx_expand_skb_head); ++ else ++ return 0; + + if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) { + wiphy_debug(local->hw.wiphy, diff --git a/package/mac80211/patches/541-mac80211_fix_skb_copy_crash.patch b/package/mac80211/patches/541-mac80211_fix_skb_copy_crash.patch new file mode 100644 index 000000000..810df5850 --- /dev/null +++ b/package/mac80211/patches/541-mac80211_fix_skb_copy_crash.patch @@ -0,0 +1,19 @@ +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1748,7 +1748,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s + { + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + struct ieee80211_local *local = sdata->local; +- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_tx_info *info; + int ret = NETDEV_TX_BUSY, head_need; + u16 ethertype, hdrlen, meshhdrlen = 0; + __le16 fc; +@@ -2039,6 +2039,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s + skb_set_network_header(skb, nh_pos); + skb_set_transport_header(skb, h_pos); + ++ info = IEEE80211_SKB_CB(skb); + memset(info, 0, sizeof(*info)); + + dev->trans_start = jiffies; diff --git a/package/mac80211/patches/542-mac80211_fix_duplicate_skb_data_copy.patch b/package/mac80211/patches/542-mac80211_fix_duplicate_skb_data_copy.patch new file mode 100644 index 000000000..e66eee2e4 --- /dev/null +++ b/package/mac80211/patches/542-mac80211_fix_duplicate_skb_data_copy.patch @@ -0,0 +1,11 @@ +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1943,7 +1943,7 @@ netdev_tx_t ieee80211_subif_start_xmit(s + */ + if (skb_shared(skb)) { + tmp_skb = skb; +- skb = skb_copy(skb, GFP_ATOMIC); ++ skb = skb_clone(skb, GFP_ATOMIC); + kfree_skb(tmp_skb); + + if (!skb) { diff --git a/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch b/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch index 28009bce0..037852371 100644 --- a/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch +++ b/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c -@@ -202,6 +202,7 @@ void rt2x00pci_uninitialize(struct rt2x0 +@@ -209,6 +209,7 @@ void rt2x00pci_uninitialize(struct rt2x0 } EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize); @@ -8,7 +8,7 @@ /* * PCI driver handlers. */ -@@ -381,6 +382,7 @@ int rt2x00pci_resume(struct pci_dev *pci +@@ -388,6 +389,7 @@ int rt2x00pci_resume(struct pci_dev *pci } EXPORT_SYMBOL_GPL(rt2x00pci_resume); #endif /* CONFIG_PM */ diff --git a/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch b/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch index 50658f145..cb49a8014 100644 --- a/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch +++ b/package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch @@ -16,14 +16,14 @@ Signed-off-by: Helmut Schaa --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c -@@ -592,6 +592,10 @@ static void rt2800pci_kill_tx_queue(stru - return; - } +@@ -481,6 +481,10 @@ static void rt2800pci_disable_radio(stru + + rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001280); + rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0); + rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); + rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®); - rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, (queue->qid == QID_AC_BE)); - rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, (queue->qid == QID_AC_BK)); + rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, 1); + rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1); diff --git a/package/mac80211/patches/610-set_pci_mwi.patch b/package/mac80211/patches/610-set_pci_mwi.patch index 06933e571..c30ff2d2a 100644 --- a/package/mac80211/patches/610-set_pci_mwi.patch +++ b/package/mac80211/patches/610-set_pci_mwi.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c -@@ -270,8 +270,10 @@ int rt2x00pci_probe(struct pci_dev *pci_ +@@ -277,8 +277,10 @@ int rt2x00pci_probe(struct pci_dev *pci_ pci_set_master(pci_dev); diff --git a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch index ac0b5c24f..86578724d 100644 --- a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch +++ b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch @@ -22,7 +22,7 @@ static int modparam_bad_frames_preempt; module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); MODULE_PARM_DESC(bad_frames_preempt, -@@ -2540,10 +2545,10 @@ static int b43_gpio_init(struct b43_wlde +@@ -2536,10 +2541,10 @@ static int b43_gpio_init(struct b43_wlde & ~B43_MACCTL_GPOUTSMSK); b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK) @@ -35,7 +35,7 @@ if (dev->dev->bus->chip_id == 0x4301) { mask |= 0x0060; set |= 0x0060; -@@ -5100,10 +5105,10 @@ static void b43_print_driverinfo(void) +@@ -5096,10 +5101,10 @@ static void b43_print_driverinfo(void) feat_sdio = "S"; #endif printk(KERN_INFO "Broadcom 43xx driver loaded " diff --git a/package/mac80211/patches/810-b43_no_pio.patch b/package/mac80211/patches/810-b43_no_pio.patch index 8f7e118de..b30b417d8 100644 --- a/package/mac80211/patches/810-b43_no_pio.patch +++ b/package/mac80211/patches/810-b43_no_pio.patch @@ -11,7 +11,7 @@ b43-$(CONFIG_B43_PCMCIA) += pcmcia.o --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c -@@ -1816,9 +1816,11 @@ static void b43_do_interrupt_thread(stru +@@ -1812,9 +1812,11 @@ static void b43_do_interrupt_thread(stru dma_reason[4], dma_reason[5]); b43err(dev->wl, "This device does not support DMA " "on your system. It will now be switched to PIO.\n"); -- 2.11.0