mac80211: sync latest version from trunk - improves stability and performance
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sat, 18 Dec 2010 18:37:58 +0000 (18:37 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sat, 18 Dec 2010 18:37:58 +0000 (18:37 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@24678 3c298f89-4303-0410-b956-a3cf2f4a3e73

30 files changed:
package/mac80211/Makefile
package/mac80211/patches/008-led_default.patch
package/mac80211/patches/013-disable_b43_nphy.patch
package/mac80211/patches/300-ath9k_gpio_settings.patch
package/mac80211/patches/310-ath9k_pending_work.patch [new file with mode: 0644]
package/mac80211/patches/310-mac80211_tpt_led.patch [deleted file]
package/mac80211/patches/320-ath9k_pending_work.patch [deleted file]
package/mac80211/patches/330-ibss_supress_proberesp.patch [deleted file]
package/mac80211/patches/340-pending_regulatory_fixes.patch [deleted file]
package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch
package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch
package/mac80211/patches/409-ath9k_platform_settings.patch
package/mac80211/patches/510-ath9k_led_cleanup.patch
package/mac80211/patches/520-ath9k_paprd_ht40_fix.patch [new file with mode: 0644]
package/mac80211/patches/520-ath9k_slottime_init.patch [deleted file]
package/mac80211/patches/521-ath9k_fix_distance_setting.patch [deleted file]
package/mac80211/patches/530-ath9k_aggr_depth_fix.patch [deleted file]
package/mac80211/patches/530-ath9k_chainmask_read_fix.patch [new file with mode: 0644]
package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch [new file with mode: 0644]
package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch [deleted file]
package/mac80211/patches/540-mac80211_tx_optimization.patch [new file with mode: 0644]
package/mac80211/patches/541-mac80211_fix_skb_copy_crash.patch [new file with mode: 0644]
package/mac80211/patches/542-mac80211_fix_duplicate_skb_data_copy.patch [new file with mode: 0644]
package/mac80211/patches/550-ath9k_chainmask_read_fix.patch [deleted file]
package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch [deleted file]
package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch
package/mac80211/patches/601-rt2x00-fix-hang-on-ifdown.patch
package/mac80211/patches/610-set_pci_mwi.patch
package/mac80211/patches/800-b43-gpio-mask-module-option.patch
package/mac80211/patches/810-b43_no_pio.patch

index 0462578..d8af462 100644 (file)
@@ -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))
index 80d2887..8a36f16 100644 (file)
@@ -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
index 4e970ef..94c09fc 100644 (file)
@@ -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
  
index 56bf8ce..ec2d5a7 100644 (file)
@@ -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/310-ath9k_pending_work.patch b/package/mac80211/patches/310-ath9k_pending_work.patch
new file mode 100644 (file)
index 0000000..ec0a261
--- /dev/null
@@ -0,0 +1,192 @@
+--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+@@ -961,18 +961,6 @@ static void ar5008_hw_rfbus_done(struct 
+       REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
+ }
+-static void ar5008_hw_enable_rfkill(struct ath_hw *ah)
+-{
+-      REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
+-                  AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
+-
+-      REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
+-                  AR_GPIO_INPUT_MUX2_RFSILENT);
+-
+-      ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
+-      REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
+-}
+-
+ static void ar5008_restore_chainmask(struct ath_hw *ah)
+ {
+       int rx_chainmask = ah->rxchainmask;
+@@ -1629,7 +1617,6 @@ void ar5008_hw_attach_phy_ops(struct ath
+       priv_ops->set_delta_slope = ar5008_hw_set_delta_slope;
+       priv_ops->rfbus_req = ar5008_hw_rfbus_req;
+       priv_ops->rfbus_done = ar5008_hw_rfbus_done;
+-      priv_ops->enable_rfkill = ar5008_hw_enable_rfkill;
+       priv_ops->restore_chainmask = ar5008_restore_chainmask;
+       priv_ops->set_diversity = ar5008_set_diversity;
+       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
+@@ -745,28 +745,6 @@ static void ar9003_hw_rfbus_done(struct 
+       REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
+ }
+-/*
+- * Set the interrupt and GPIO values so the ISR can disable RF
+- * on a switch signal.  Assumes GPIO port and interrupt polarity
+- * are set prior to call.
+- */
+-static void ar9003_hw_enable_rfkill(struct ath_hw *ah)
+-{
+-      /* Connect rfsilent_bb_l to baseband */
+-      REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
+-                  AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
+-      /* Set input mux for rfsilent_bb_l to GPIO #0 */
+-      REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
+-                  AR_GPIO_INPUT_MUX2_RFSILENT);
+-
+-      /*
+-       * Configure the desired GPIO port for input and
+-       * enable baseband rf silence.
+-       */
+-      ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
+-      REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
+-}
+-
+ static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value)
+ {
+       u32 v = REG_READ(ah, AR_PHY_CCK_DETECT);
+@@ -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;
+-      priv_ops->enable_rfkill = ar9003_hw_enable_rfkill;
+       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
+       return ath9k_hw_private_ops(ah)->rfbus_done(ah);
+ }
+-static inline void ath9k_enable_rfkill(struct ath_hw *ah)
+-{
+-      return ath9k_hw_private_ops(ah)->enable_rfkill(ah);
+-}
+-
+ static inline void ath9k_hw_restore_chainmask(struct ath_hw *ah)
+ {
+       if (!ath9k_hw_private_ops(ah)->restore_chainmask)
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -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)
+-              ath9k_enable_rfkill(ah);
++              ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
+       ath9k_hw_init_global_settings(ah);
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -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);
+-      void (*enable_rfkill)(struct ath_hw *ah);
+       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<<qnum;
+@@ -1068,6 +1069,12 @@ int ath_cabq_update(struct ath_softc *sc
+       return 0;
+ }
++static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
++{
++    struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->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 (file)
index 9318f8c..0000000
+++ /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 <linux/types.h>
- #include <linux/spinlock.h>
- #include <linux/etherdevice.h>
-+#include <linux/leds.h>
- #include <net/ieee80211_radiotap.h>
- #include <net/cfg80211.h>
- #include <net/mac80211.h>
-@@ -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 (file)
index baeeb06..0000000
+++ /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 (file)
index 0c8d148..0000000
+++ /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 (file)
index 4fdb206..0000000
+++ /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;
index a475523..700854d 100644 (file)
@@ -8,7 +8,7 @@
  #include <asm/unaligned.h>
  
  #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;
        }
index 2444db4..daebf33 100644 (file)
@@ -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;
  
index 7b56ee2..7b735a1 100644 (file)
@@ -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;
index b855bb2..be26a88 100644 (file)
@@ -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];
  
  /*    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;
  
        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),
  };
  
  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 (file)
index 0000000..cea8f2e
--- /dev/null
@@ -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 (file)
index 1eb8358..0000000
+++ /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 (file)
index 6d54945..0000000
+++ /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 (file)
index ad0f2e1..0000000
+++ /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<<qnum;
-@@ -1068,6 +1069,12 @@ int ath_cabq_update(struct ath_softc *sc
-       return 0;
- }
-+static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
-+{
-+    struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->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/530-ath9k_chainmask_read_fix.patch b/package/mac80211/patches/530-ath9k_chainmask_read_fix.patch
new file mode 100644 (file)
index 0000000..a0eebf5
--- /dev/null
@@ -0,0 +1,28 @@
+--- a/drivers/net/wireless/ath/ath9k/debug.c
++++ b/drivers/net/wireless/ath/ath9k/debug.c
+@@ -81,11 +81,10 @@ static ssize_t read_file_tx_chainmask(st
+                            size_t count, loff_t *ppos)
+ {
+       struct ath_softc *sc = file->private_data;
+-      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       char buf[32];
+       unsigned int len;
+-      len = sprintf(buf, "0x%08x\n", common->tx_chainmask);
++      len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.tx_chainmask);
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+ }
+@@ -124,11 +123,10 @@ static ssize_t read_file_rx_chainmask(st
+                            size_t count, loff_t *ppos)
+ {
+       struct ath_softc *sc = file->private_data;
+-      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       char buf[32];
+       unsigned int len;
+-      len = sprintf(buf, "0x%08x\n", common->rx_chainmask);
++      len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.rx_chainmask);
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+ }
diff --git a/package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch b/package/mac80211/patches/531-ath9k_legacy_chainmask_fix.patch
new file mode 100644 (file)
index 0000000..df7e5cb
--- /dev/null
@@ -0,0 +1,75 @@
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -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);
+-void ath_update_chainmask(struct ath_softc *sc, int is_ht);
+ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
+                   struct ath9k_channel *hchan);
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -538,32 +538,6 @@ set_timer:
+       }
+ }
+-/*
+- * Update tx/rx chainmask. For legacy association,
+- * hard code chainmask to 1x1, for 11n association, use
+- * the chainmask configuration, for bt coexistence, use
+- * the chainmask configuration even in legacy mode.
+- */
+-void ath_update_chainmask(struct ath_softc *sc, int is_ht)
+-{
+-      struct ath_hw *ah = sc->sc_ah;
+-      struct ath_common *common = ath9k_hw_common(ah);
+-
+-      if ((sc->sc_flags & SC_OP_OFFCHANNEL) || is_ht ||
+-          (ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE)) {
+-              common->tx_chainmask = ah->caps.tx_chainmask;
+-              common->rx_chainmask = ah->caps.rx_chainmask;
+-      } else {
+-              common->tx_chainmask = 1;
+-              common->rx_chainmask = 1;
+-      }
+-
+-      ath_dbg(common, ATH_DBG_CONFIG,
+-              "tx chmask: %d, rx chmask: %d\n",
+-              common->tx_chainmask,
+-              common->rx_chainmask);
+-}
+-
+ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
+ {
+       struct ath_node *an;
+@@ -1676,8 +1650,6 @@ static int ath9k_config(struct ieee80211
+               /* XXX: remove me eventualy */
+               ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
+-              ath_update_chainmask(sc, conf_is_ht(conf));
+-
+               /* update survey stats for the old channel before switching */
+               spin_lock_irqsave(&common->cc_lock, flags);
+               ath_update_survey_stats(sc);
+@@ -1909,10 +1881,6 @@ static void ath9k_bss_info_changed(struc
+               /* Set aggregation protection mode parameters */
+               sc->config.ath_aggr_prot = 0;
+-              /* Only legacy IBSS for now */
+-              if (vif->type == NL80211_IFTYPE_ADHOC)
+-                      ath_update_chainmask(sc, 0);
+-
+               ath_dbg(common, ATH_DBG_CONFIG, "BSSID: %pM aid: 0x%x\n",
+                       common->curbssid, common->curaid);
+--- a/drivers/net/wireless/ath/ath9k/virtual.c
++++ b/drivers/net/wireless/ath/ath9k/virtual.c
+@@ -288,7 +288,6 @@ void ath9k_wiphy_chan_work(struct work_s
+       /* sync hw configuration for hw code */
+       common->hw = aphy->hw;
+-      ath_update_chainmask(sc, sc->chan_is_ht);
+       if (ath_set_channel(sc, aphy->hw,
+                           &sc->sc_ah->channels[sc->chan_idx]) < 0) {
+               printk(KERN_DEBUG "ath9k: Failed to set channel for new "
diff --git a/package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch b/package/mac80211/patches/540-ath9k_disable_hw_rfkill.patch
deleted file mode 100644 (file)
index a74ea0d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -961,18 +961,6 @@ static void ar5008_hw_rfbus_done(struct 
-       REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
- }
--static void ar5008_hw_enable_rfkill(struct ath_hw *ah)
--{
--      REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
--                  AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
--
--      REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
--                  AR_GPIO_INPUT_MUX2_RFSILENT);
--
--      ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
--      REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
--}
--
- static void ar5008_restore_chainmask(struct ath_hw *ah)
- {
-       int rx_chainmask = ah->rxchainmask;
-@@ -1629,7 +1617,6 @@ void ar5008_hw_attach_phy_ops(struct ath
-       priv_ops->set_delta_slope = ar5008_hw_set_delta_slope;
-       priv_ops->rfbus_req = ar5008_hw_rfbus_req;
-       priv_ops->rfbus_done = ar5008_hw_rfbus_done;
--      priv_ops->enable_rfkill = ar5008_hw_enable_rfkill;
-       priv_ops->restore_chainmask = ar5008_restore_chainmask;
-       priv_ops->set_diversity = ar5008_set_diversity;
-       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 
-       REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);
- }
--/*
-- * Set the interrupt and GPIO values so the ISR can disable RF
-- * on a switch signal.  Assumes GPIO port and interrupt polarity
-- * are set prior to call.
-- */
--static void ar9003_hw_enable_rfkill(struct ath_hw *ah)
--{
--      /* Connect rfsilent_bb_l to baseband */
--      REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
--                  AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
--      /* Set input mux for rfsilent_bb_l to GPIO #0 */
--      REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
--                  AR_GPIO_INPUT_MUX2_RFSILENT);
--
--      /*
--       * Configure the desired GPIO port for input and
--       * enable baseband rf silence.
--       */
--      ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
--      REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
--}
--
- 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
-       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;
--      priv_ops->enable_rfkill = ar9003_hw_enable_rfkill;
-       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/hw-ops.h
-+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
-@@ -223,11 +223,6 @@ static inline void ath9k_hw_rfbus_done(s
-       return ath9k_hw_private_ops(ah)->rfbus_done(ah);
- }
--static inline void ath9k_enable_rfkill(struct ath_hw *ah)
--{
--      return ath9k_hw_private_ops(ah)->enable_rfkill(ah);
--}
--
- static inline void ath9k_hw_restore_chainmask(struct ath_hw *ah)
- {
-       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
-       ath9k_hw_init_qos(ah);
-       if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
--              ath9k_enable_rfkill(ah);
-+              ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
-       ath9k_hw_init_global_settings(ah);
---- 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 {
-       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);
--      void (*enable_rfkill)(struct ath_hw *ah);
-       void (*restore_chainmask)(struct ath_hw *ah);
-       void (*set_diversity)(struct ath_hw *ah, bool value);
-       u32 (*compute_pll_control)(struct ath_hw *ah,
diff --git a/package/mac80211/patches/540-mac80211_tx_optimization.patch b/package/mac80211/patches/540-mac80211_tx_optimization.patch
new file mode 100644 (file)
index 0000000..a322078
--- /dev/null
@@ -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 (file)
index 0000000..810df58
--- /dev/null
@@ -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 (file)
index 0000000..e66eee2
--- /dev/null
@@ -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/550-ath9k_chainmask_read_fix.patch b/package/mac80211/patches/550-ath9k_chainmask_read_fix.patch
deleted file mode 100644 (file)
index a0eebf5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -81,11 +81,10 @@ static ssize_t read_file_tx_chainmask(st
-                            size_t count, loff_t *ppos)
- {
-       struct ath_softc *sc = file->private_data;
--      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-       char buf[32];
-       unsigned int len;
--      len = sprintf(buf, "0x%08x\n", common->tx_chainmask);
-+      len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.tx_chainmask);
-       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
- }
-@@ -124,11 +123,10 @@ static ssize_t read_file_rx_chainmask(st
-                            size_t count, loff_t *ppos)
- {
-       struct ath_softc *sc = file->private_data;
--      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-       char buf[32];
-       unsigned int len;
--      len = sprintf(buf, "0x%08x\n", common->rx_chainmask);
-+      len = sprintf(buf, "0x%08x\n", sc->sc_ah->caps.rx_chainmask);
-       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
- }
diff --git a/package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch b/package/mac80211/patches/551-ath9k_legacy_chainmask_fix.patch
deleted file mode 100644 (file)
index a62cf63..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
---- 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
- 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);
--void ath_update_chainmask(struct ath_softc *sc, int is_ht);
- int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
-                   struct ath9k_channel *hchan);
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -522,32 +522,6 @@ set_timer:
-       }
- }
--/*
-- * Update tx/rx chainmask. For legacy association,
-- * hard code chainmask to 1x1, for 11n association, use
-- * the chainmask configuration, for bt coexistence, use
-- * the chainmask configuration even in legacy mode.
-- */
--void ath_update_chainmask(struct ath_softc *sc, int is_ht)
--{
--      struct ath_hw *ah = sc->sc_ah;
--      struct ath_common *common = ath9k_hw_common(ah);
--
--      if ((sc->sc_flags & SC_OP_OFFCHANNEL) || is_ht ||
--          (ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE)) {
--              common->tx_chainmask = ah->caps.tx_chainmask;
--              common->rx_chainmask = ah->caps.rx_chainmask;
--      } else {
--              common->tx_chainmask = 1;
--              common->rx_chainmask = 1;
--      }
--
--      ath_dbg(common, ATH_DBG_CONFIG,
--              "tx chmask: %d, rx chmask: %d\n",
--              common->tx_chainmask,
--              common->rx_chainmask);
--}
--
- 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
-               /* XXX: remove me eventualy */
-               ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
--              ath_update_chainmask(sc, conf_is_ht(conf));
--
-               /* 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
-               /* Set aggregation protection mode parameters */
-               sc->config.ath_aggr_prot = 0;
--              /* Only legacy IBSS for now */
--              if (vif->type == NL80211_IFTYPE_ADHOC)
--                      ath_update_chainmask(sc, 0);
--
-               ath_dbg(common, ATH_DBG_CONFIG, "BSSID: %pM aid: 0x%x\n",
-                       common->curbssid, common->curaid);
---- a/drivers/net/wireless/ath/ath9k/virtual.c
-+++ b/drivers/net/wireless/ath/ath9k/virtual.c
-@@ -288,7 +288,6 @@ void ath9k_wiphy_chan_work(struct work_s
-       /* sync hw configuration for hw code */
-       common->hw = aphy->hw;
--      ath_update_chainmask(sc, sc->chan_is_ht);
-       if (ath_set_channel(sc, aphy->hw,
-                           &sc->sc_ah->channels[sc->chan_idx]) < 0) {
-               printk(KERN_DEBUG "ath9k: Failed to set channel for new "
index 28009bc..0378523 100644 (file)
@@ -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 */
index 50658f1..cb49a80 100644 (file)
@@ -16,14 +16,14 @@ Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
 
 --- 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, &reg);
 +      rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
 +      rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
 +
        rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, &reg);
-       rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX0, (queue->qid == QID_AC_BE));
-       rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX1, (queue->qid == QID_AC_BK));
+       rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX0, 1);
+       rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX1, 1);
index 06933e5..c30ff2d 100644 (file)
@@ -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);
  
index ac0b5c2..8657872 100644 (file)
@@ -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 "
index 8f7e118..b30b417 100644 (file)
@@ -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");