compat-wireless: add new set of pending patches for 2010-05-25
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Tue, 25 May 2010 23:05:48 +0000 (16:05 -0700)
committerLuis R. Rodriguez <lrodriguez@atheros.com>
Tue, 25 May 2010 23:05:48 +0000 (16:05 -0700)
This just adds three patches by Felix posted today. To generate
these and merge these back into this tree though I am using
a very crude technique though:

I cherry pick patches from the mailing lists, I then git am
them onto a local wireless-testing tree, then I

git format-patch -o compat-pending-05-25 origin..pending-sha1sum

Then I git rm linux-next-pending/*.patch and add the new series.
This is a bit sloppy, I admit it but it works well for how I am
managing it. If you need a patch sucked into this series let me
know and I'll go ahead and merge it as well. For now I am just
taking in things I see as important for ath9k, mac80211 and
cfg80211. If you want to consider your drivers just ask in the
linux-wireless / linux-bluetooth list (cc'ing me or something)
annotating the patch for me to be picked up. At least lets try
it for now this way and see it how it goes. If you think of
something better let me know.

These pending patches are applied with the -p option of
./scripts/admin-update.sh -p

Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
32 files changed:
linux-next-pending/0001-ath9k_hw-add-support-for-the-AR9003-2.2.patch
linux-next-pending/0002-ath9k_hw-rename-the-ar9003_initvals.h-to-ar9003_2p0_.patch
linux-next-pending/0003-ath9k_hw-add-support-for-the-AR9003-baseband-watchdo.patch
linux-next-pending/0004-ath9k-enable-the-baseband-watchdog-events-for-AR9003.patch
linux-next-pending/0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch [new file with mode: 0644]
linux-next-pending/0006-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch [deleted file]
linux-next-pending/0006-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch [new file with mode: 0644]
linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch [new file with mode: 0644]
linux-next-pending/0007-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch [deleted file]
linux-next-pending/0008-ath9k-Fix-power-save-with-auto-sleeping.patch [deleted file]
linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch [new file with mode: 0644]
linux-next-pending/0009-ath9k-Fix-rx-of-mcast-bcast-frames-in-PS-mode-with-a.patch [new file with mode: 0644]
linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch [deleted file]
linux-next-pending/0010-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch [new file with mode: 0644]
linux-next-pending/0011-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch [deleted file]
linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch [new file with mode: 0644]
linux-next-pending/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch [deleted file]
linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch [new file with mode: 0644]
linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch [new file with mode: 0644]
linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch [new file with mode: 0644]
linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch [deleted file]
linux-next-pending/0015-ath9k-Clean-up-few-function-parameters-in-recv.c.patch [new file with mode: 0644]
linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch [deleted file]
linux-next-pending/0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch [new file with mode: 0644]
linux-next-pending/0016-ath9k-Move-driver-specific-structures.patch [deleted file]
linux-next-pending/0017-ath9k-Clean-up-few-function-parameters-in-recv.c.patch [deleted file]
linux-next-pending/0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch [new file with mode: 0644]
linux-next-pending/0018-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch [deleted file]
linux-next-pending/0018-ath9k_hw-add-multicast-key-search-support.patch [new file with mode: 0644]
linux-next-pending/0019-ath9k-Fix-bug-in-validating-received-data-length-for.patch [deleted file]
linux-next-pending/0019-ath9k_common-use-allocated-key-cache-entries-for-mul.patch [new file with mode: 0644]
linux-next-pending/0020-ath9k-use-the-key-handling-code-from-ath9k_common-in.patch [new file with mode: 0644]

index 92f57f657eb042f003bebef0100abe4cb15bcc04..223a938970232d2070618c3ac826c58c8f87e483 100644 (file)
@@ -1,7 +1,7 @@
-From ad4baba0d48d47ecf52779ec1425f0f34f9c9bb3 Mon Sep 17 00:00:00 2001
+From 9553fe34f7b325a253a5b79f3d3ebe0e81d0dec0 Mon Sep 17 00:00:00 2001
 From: Luis R. Rodriguez <lrodriguez@atheros.com>
 Date: Wed, 12 May 2010 16:56:17 -0700
-Subject: [PATCH 01/19] ath9k_hw: add support for the AR9003 2.2
+Subject: [PATCH 01/20] ath9k_hw: add support for the AR9003 2.2
 
 The checksums of the initvals are:
 
@@ -34,6 +34,9 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  2 files changed, 1921 insertions(+), 25 deletions(-)
  create mode 100644 drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
 
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
+new file mode 100644
+index 0000000..7451505
 --- /dev/null
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
 @@ -0,0 +1,1785 @@
@@ -1822,6 +1825,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 +};
 +
 +#endif /* INITVALS_9003_2P2_H */
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+index b15309c..3c4a446 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
 @@ -17,6 +17,7 @@
@@ -1832,7 +1837,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  
  /* General hardware code for the AR9003 hadware family */
  
-@@ -31,12 +32,8 @@ static bool ar9003_hw_macversion_support
+@@ -31,12 +32,8 @@ static bool ar9003_hw_macversion_supported(u32 macversion)
        return false;
  }
  
@@ -1847,7 +1852,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  {
        /* mac */
        INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
-@@ -106,27 +103,128 @@ static void ar9003_hw_init_mode_regs(str
+@@ -106,27 +103,128 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
                       3);
  }
  
@@ -1988,7 +1993,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
                break;
        }
  }
-@@ -136,15 +234,28 @@ static void ar9003_rx_gain_table_apply(s
+@@ -136,15 +234,28 @@ static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
        switch (ar9003_hw_get_rx_gain_idx(ah)) {
        case 0:
        default:
@@ -2024,3 +2029,6 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
                break;
        }
  }
+-- 
+1.6.3.3
+
index 6de849610111a5e81cb9edd35e36e731e617e353..47770894c94c1bc7aee2bbd4466016a357b0b251 100644 (file)
@@ -1,7 +1,7 @@
-From b5676c6a148172d4e5c83791885a8881b0efa23a Mon Sep 17 00:00:00 2001
+From 04cd804433d054c12654c398ac5b0f77e7a68718 Mon Sep 17 00:00:00 2001
 From: Luis R. Rodriguez <lrodriguez@atheros.com>
 Date: Wed, 12 May 2010 17:00:36 -0700
-Subject: [PATCH 02/19] ath9k_hw: rename the ar9003_initvals.h to ar9003_2p0_initvals.h
+Subject: [PATCH 02/20] ath9k_hw: rename the ar9003_initvals.h to ar9003_2p0_initvals.h
 
 Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 ---
@@ -12,6 +12,9 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  create mode 100644 drivers/net/wireless/ath/ath9k/ar9003_2p0_initvals.h
  delete mode 100644 drivers/net/wireless/ath/ath9k/ar9003_initvals.h
 
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p0_initvals.h
+new file mode 100644
+index 0000000..f82a00d
 --- /dev/null
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p0_initvals.h
 @@ -0,0 +1,1784 @@
@@ -1799,6 +1802,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 +};
 +
 +#endif /* INITVALS_9003_2P0_H */
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+index 3c4a446..863f61e 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
 @@ -16,7 +16,7 @@
@@ -1810,6 +1815,9 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  #include "ar9003_2p2_initvals.h"
  
  /* General hardware code for the AR9003 hadware family */
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_initvals.h
+deleted file mode 100644
+index db019dd..0000000
 --- a/drivers/net/wireless/ath/ath9k/ar9003_initvals.h
 +++ /dev/null
 @@ -1,1784 +0,0 @@
@@ -3597,3 +3605,6 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 -};
 -
 -#endif /* INITVALS_9003_H */
+-- 
+1.6.3.3
+
index ba53188dd023cee1b44b8b2e915ec35c6f18e623..9985e2f9a732fdff1facf65702c31dd2d630aea2 100644 (file)
@@ -1,7 +1,7 @@
-From 21a7073ca9a5360e05445853e4ff4994a5bdb2e5 Mon Sep 17 00:00:00 2001
+From 29539c9b29b8564af7c871998a3be2132028662d Mon Sep 17 00:00:00 2001
 From: Luis R. Rodriguez <lrodriguez@atheros.com>
 Date: Wed, 12 May 2010 11:07:20 -0700
-Subject: [PATCH 03/19] ath9k_hw: add support for the AR9003 baseband watchdog
+Subject: [PATCH 03/20] ath9k_hw: add support for the AR9003 baseband watchdog
 
 The baseband watchdog will monitor blocks of the baseband
 through timers and will issue an interrupt when things are
@@ -23,9 +23,11 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  drivers/net/wireless/ath/ath9k/reg.h        |    1 +
  7 files changed, 169 insertions(+), 34 deletions(-)
 
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+index 37ba374..4073107 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -90,6 +90,8 @@ static bool ar9003_hw_get_isr(struct ath
+@@ -90,6 +90,8 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
                                  MAP_ISR_S2_CST);
                        mask2 |= ((isr2 & AR_ISR_S2_TSFOOR) >>
                                  MAP_ISR_S2_TSFOOR);
@@ -34,7 +36,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  
                        if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
                                REG_WRITE(ah, AR_ISR_S2, isr2);
-@@ -167,6 +169,9 @@ static bool ar9003_hw_get_isr(struct ath
+@@ -167,6 +169,9 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
  
                        (void) REG_READ(ah, AR_ISR);
                }
@@ -44,6 +46,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        }
  
        if (sync_cause) {
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.h b/drivers/net/wireless/ath/ath9k/ar9003_mac.h
+index f17558b..5a7a286 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.h
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.h
 @@ -47,6 +47,7 @@
@@ -54,9 +58,11 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  
  #define AR9003TXC_CONST(_ds) ((const struct ar9003_txc *) _ds)
  
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+index 80431a2..c714579 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -1132,3 +1132,122 @@ void ar9003_hw_attach_phy_ops(struct ath
+@@ -1132,3 +1132,122 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
        priv_ops->do_getnf = ar9003_hw_do_getnf;
        priv_ops->loadnf = ar9003_hw_loadnf;
  }
@@ -179,6 +185,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 +                "==== BB update: done ====\n\n");
 +}
 +EXPORT_SYMBOL(ar9003_hw_bb_watchdog_dbg_info);
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
+index f08cc8b..676d3f1 100644
 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
 @@ -483,10 +483,10 @@
@@ -227,6 +235,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 -#define AR_PHY_BB_WD_AGC_SM_S           24
 -#define AR_PHY_BB_WD_SRCH_SM            0xF0000000
 -#define AR_PHY_BB_WD_SRCH_SM_S          28
+-
+-#define AR_PHY_BB_WD_STATUS_CLR         0x00000008
 +#define AR_PHY_WATCHDOG_NON_IDLE_ENABLE    0x00000001
 +#define AR_PHY_WATCHDOG_IDLE_ENABLE        0x00000002
 +#define AR_PHY_WATCHDOG_IDLE_MASK          0xFFFF0000
@@ -254,15 +264,16 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
 +#define AR_PHY_WATCHDOG_AGC_SM_S           24
 +#define AR_PHY_WATCHDOG_SRCH_SM            0xF0000000
 +#define AR_PHY_WATCHDOG_SRCH_SM_S          28
--#define AR_PHY_BB_WD_STATUS_CLR         0x00000008
++
 +#define AR_PHY_WATCHDOG_STATUS_CLR         0x00000008
  
  void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx);
  
+diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
+index c33f17d..6bfac1c 100644
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -627,6 +627,7 @@ static int __ath9k_hw_init(struct ath_hw
+@@ -627,6 +627,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)
                ar9003_hw_set_nf_limits(ah);
  
        ath9k_init_nfcal_hist_buffer(ah);
@@ -270,7 +281,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  
        common->state = ATH_HW_INITIALIZED;
  
-@@ -1441,6 +1442,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -1441,6 +1442,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
        if (AR_SREV_9300_20_OR_LATER(ah)) {
                ath9k_hw_loadnf(ah, curchan);
                ath9k_hw_start_nfcal(ah);
@@ -278,6 +289,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        }
  
        return 0;
+diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
+index 77245df..bfecde0 100644
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
 @@ -279,6 +279,7 @@ enum ath9k_int {
@@ -298,7 +311,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  };
  
  static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah)
-@@ -910,10 +914,13 @@ void ar9002_hw_enable_async_fifo(struct 
+@@ -910,10 +914,13 @@ void ar9002_hw_enable_async_fifo(struct ath_hw *ah);
  void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah);
  
  /*
@@ -313,6 +326,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  
  /* Hardware family op attach helpers */
  void ar5008_hw_attach_phy_ops(struct ath_hw *ah);
+diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
+index d4371a4..c9a009f 100644
 --- a/drivers/net/wireless/ath/ath9k/reg.h
 +++ b/drivers/net/wireless/ath/ath9k/reg.h
 @@ -222,6 +222,7 @@
@@ -323,3 +338,6 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  #define AR_ISR_S2_CST          0x00400000
  #define AR_ISR_S2_GTT          0x00800000
  #define AR_ISR_S2_TIM          0x01000000
+-- 
+1.6.3.3
+
index 82c4df89c85a882a3f9d6609efd16cc8687776c8..77a0d41c35e1c6d44a025afbf7bb935d1f40edf5 100644 (file)
@@ -1,7 +1,7 @@
-From cdfd0964c1c769a3de7e0c24c2469c7865e423f3 Mon Sep 17 00:00:00 2001
+From 9e472af2e2994b3ce54f2ba41c277bdba8ccd856 Mon Sep 17 00:00:00 2001
 From: Luis R. Rodriguez <lrodriguez@atheros.com>
 Date: Wed, 12 May 2010 11:12:02 -0700
-Subject: [PATCH 04/19] ath9k: enable the baseband watchdog events for AR9003
+Subject: [PATCH 04/20] ath9k: enable the baseband watchdog events for AR9003
 
 This enables the baseband watchdog events for the AR9003
 family on ath9k. Upon an a baseband watchdog interrupt we reset
@@ -22,9 +22,11 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  drivers/net/wireless/ath/ath9k/main.c  |   10 +++++++++-
  3 files changed, 16 insertions(+), 1 deletions(-)
 
+diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
+index 29898f8..ee83877 100644
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -269,6 +269,8 @@ void ath_debug_stat_interrupt(struct ath
+@@ -269,6 +269,8 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status)
                        sc->debug.stats.istats.rxlp++;
                if (status & ATH9K_INT_RXHP)
                        sc->debug.stats.istats.rxhp++;
@@ -33,7 +35,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        } else {
                if (status & ATH9K_INT_RX)
                        sc->debug.stats.istats.rxok++;
-@@ -319,6 +321,9 @@ static ssize_t read_file_interrupt(struc
+@@ -319,6 +321,9 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf,
                        "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp);
                len += snprintf(buf + len, sizeof(buf) - len,
                        "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp);
@@ -43,6 +45,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        } else {
                len += snprintf(buf + len, sizeof(buf) - len,
                        "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok);
+diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h
+index 5147b87..5d21704 100644
 --- a/drivers/net/wireless/ath/ath9k/debug.h
 +++ b/drivers/net/wireless/ath/ath9k/debug.h
 @@ -53,6 +53,7 @@ struct ath_buf;
@@ -61,6 +65,8 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
  };
  
  struct ath_rc_stats {
+diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
+index abfa049..b98b2f2 100644
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
 @@ -520,6 +520,12 @@ irqreturn_t ath_isr(int irq, void *dev)
@@ -76,7 +82,7 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        if (status & ATH9K_INT_SWBA)
                tasklet_schedule(&sc->bcon_tasklet);
  
-@@ -1195,7 +1201,9 @@ static int ath9k_start(struct ieee80211_
+@@ -1195,7 +1201,9 @@ static int ath9k_start(struct ieee80211_hw *hw)
                    ATH9K_INT_GLOBAL;
  
        if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
@@ -87,3 +93,6 @@ Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
        else
                ah->imask |= ATH9K_INT_RX;
  
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch b/linux-next-pending/0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch
new file mode 100644 (file)
index 0000000..b2ffdbe
--- /dev/null
@@ -0,0 +1,373 @@
+From e875bd9f35dad054380c95285d63daf139746799 Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Thu, 13 May 2010 17:57:51 -0700
+Subject: [PATCH 05/20] ath9k: Enable Short GI in 20 Mhz for ar9287 and later chips
+
+This patch enables short GI rx at all rates and tx at mcs15
+for 20 Mhz channel width also.
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/hw.c   |    3 +
+ drivers/net/wireless/ath/ath9k/hw.h   |    1 +
+ drivers/net/wireless/ath/ath9k/init.c |    3 +
+ drivers/net/wireless/ath/ath9k/rc.c   |  173 ++++++++++++++++++---------------
+ 4 files changed, 101 insertions(+), 79 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
+index 6bfac1c..2fd6254 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -2234,6 +2234,9 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
+       if (AR_SREV_9300_20_OR_LATER(ah))
+               pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;
++      if (AR_SREV_9287_10_OR_LATER(ah))
++              pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;
++
+       return 0;
+ }
+diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
+index bfecde0..5cf0714 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -199,6 +199,7 @@ enum ath9k_hw_caps {
+       ATH9K_HW_CAP_RAC_SUPPORTED              = BIT(18),
+       ATH9K_HW_CAP_LDPC                       = BIT(19),
+       ATH9K_HW_CAP_FASTCLOCK                  = BIT(20),
++      ATH9K_HW_CAP_SGI_20                     = BIT(21),
+ };
+ enum ath9k_capability_type {
+diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
+index d457cb3..f388dcc 100644
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -208,6 +208,9 @@ static void setup_ht_cap(struct ath_softc *sc,
+       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_LDPC)
+               ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
++      if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
++              ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
++
+       ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
+       ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
+diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
+index 8519452..f5180d3 100644
+--- a/drivers/net/wireless/ath/ath9k/rc.c
++++ b/drivers/net/wireless/ath/ath9k/rc.c
+@@ -40,73 +40,75 @@ static const struct ath_rate_table ar5416_11na_ratetable = {
+               { VALID, VALID, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
+                       29300, 7, 108, 4, 7, 7, 7, 7 },
+               { VALID_2040, VALID_2040, WLAN_RC_PHY_HT_20_SS, 6500, /* 6.5 Mb */
+-                      6400, 0, 0, 0, 8, 24, 8, 24 },
++                      6400, 0, 0, 0, 8, 25, 8, 25 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 13000, /* 13 Mb */
+-                      12700, 1, 1, 2, 9, 25, 9, 25 },
++                      12700, 1, 1, 2, 9, 26, 9, 26 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 19500, /* 19.5 Mb */
+-                      18800, 2, 2, 2, 10, 26, 10, 26 },
++                      18800, 2, 2, 2, 10, 27, 10, 27 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 26000, /* 26 Mb */
+-                      25000, 3, 3, 4, 11, 27, 11, 27 },
++                      25000, 3, 3, 4, 11, 28, 11, 28 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 39000, /* 39 Mb */
+-                      36700, 4, 4, 4, 12, 28, 12, 28 },
++                      36700, 4, 4, 4, 12, 29, 12, 29 },
+               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 52000, /* 52 Mb */
+-                      48100, 5, 5, 4, 13, 29, 13, 29 },
++                      48100, 5, 5, 4, 13, 30, 13, 30 },
+               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 58500, /* 58.5 Mb */
+-                      53500, 6, 6, 4, 14, 30, 14, 30 },
++                      53500, 6, 6, 4, 14, 31, 14, 31 },
+               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 65000, /* 65 Mb */
+-                      59000, 7, 7, 4, 15, 31, 15, 32 },
++                      59000, 7, 7, 4, 15, 32, 15, 33 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 13000, /* 13 Mb */
+-                      12700, 8, 8, 3, 16, 33, 16, 33 },
++                      12700, 8, 8, 3, 16, 34, 16, 34 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 26000, /* 26 Mb */
+-                      24800, 9, 9, 2, 17, 34, 17, 34 },
++                      24800, 9, 9, 2, 17, 35, 17, 35 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 39000, /* 39 Mb */
+-                      36600, 10, 10, 2, 18, 35, 18, 35 },
++                      36600, 10, 10, 2, 18, 36, 18, 36 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 52000, /* 52 Mb */
+-                      48100, 11, 11, 4, 19, 36, 19, 36 },
++                      48100, 11, 11, 4, 19, 37, 19, 37 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 78000, /* 78 Mb */
+-                      69500, 12, 12, 4, 20, 37, 20, 37 },
++                      69500, 12, 12, 4, 20, 38, 20, 38 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 104000, /* 104 Mb */
+-                      89500, 13, 13, 4, 21, 38, 21, 38 },
++                      89500, 13, 13, 4, 21, 39, 21, 39 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 117000, /* 117 Mb */
+-                      98900, 14, 14, 4, 22, 39, 22, 39 },
++                      98900, 14, 14, 4, 22, 40, 22, 40 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 130000, /* 130 Mb */
+-                      108300, 15, 15, 4, 23, 40, 23, 41 },
++                      108300, 15, 15, 4, 23, 41, 24, 42 },
++              { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS_HGI, 144400, /* 144.4 Mb */
++                      12000, 15, 15, 4, 23, 41, 24, 42 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 13500, /* 13.5 Mb */
+-                      13200, 0, 0, 0, 8, 24, 24, 24 },
++                      13200, 0, 0, 0, 8, 25, 25, 25 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 27500, /* 27.0 Mb */
+-                      25900, 1, 1, 2, 9, 25, 25, 25 },
++                      25900, 1, 1, 2, 9, 26, 26, 26 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 40500, /* 40.5 Mb */
+-                      38600, 2, 2, 2, 10, 26, 26, 26 },
++                      38600, 2, 2, 2, 10, 27, 27, 27 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 54000, /* 54 Mb */
+-                      49800, 3, 3, 4, 11, 27, 27, 27 },
++                      49800, 3, 3, 4, 11, 28, 28, 28 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 81500, /* 81 Mb */
+-                      72200, 4, 4, 4, 12, 28, 28, 28 },
++                      72200, 4, 4, 4, 12, 29, 29, 29 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 108000, /* 108 Mb */
+-                      92900, 5, 5, 4, 13, 29, 29, 29 },
++                      92900, 5, 5, 4, 13, 30, 30, 30 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 121500, /* 121.5 Mb */
+-                      102700, 6, 6, 4, 14, 30, 30, 30 },
++                      102700, 6, 6, 4, 14, 31, 31, 31 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 135000, /* 135 Mb */
+-                      112000, 7, 7, 4, 15, 31, 32, 32 },
++                      112000, 7, 7, 4, 15, 32, 33, 33 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
+-                      122000, 7, 7, 4, 15, 31, 32, 32 },
++                      122000, 7, 7, 4, 15, 32, 33, 33 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 27000, /* 27 Mb */
+-                      25800, 8, 8, 0, 16, 33, 33, 33 },
++                      25800, 8, 8, 0, 16, 34, 34, 34 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 54000, /* 54 Mb */
+-                      49800, 9, 9, 2, 17, 34, 34, 34 },
++                      49800, 9, 9, 2, 17, 35, 35, 35 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 81000, /* 81 Mb */
+-                      71900, 10, 10, 2, 18, 35, 35, 35 },
++                      71900, 10, 10, 2, 18, 36, 36, 36 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 108000, /* 108 Mb */
+-                      92500, 11, 11, 4, 19, 36, 36, 36 },
++                      92500, 11, 11, 4, 19, 37, 37, 37 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 162000, /* 162 Mb */
+-                      130300, 12, 12, 4, 20, 37, 37, 37 },
++                      130300, 12, 12, 4, 20, 38, 38, 38 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 216000, /* 216 Mb */
+-                      162800, 13, 13, 4, 21, 38, 38, 38 },
++                      162800, 13, 13, 4, 21, 39, 39, 39 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 243000, /* 243 Mb */
+-                      178200, 14, 14, 4, 22, 39, 39, 39 },
++                      178200, 14, 14, 4, 22, 40, 40, 40 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 270000, /* 270 Mb */
+-                      192100, 15, 15, 4, 23, 40, 41, 41 },
++                      192100, 15, 15, 4, 23, 41, 42, 42 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
+-                      207000, 15, 15, 4, 23, 40, 41, 41 },
++                      207000, 15, 15, 4, 23, 41, 42, 42 },
+       },
+       50,  /* probe interval */
+       WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
+@@ -144,73 +146,75 @@ static const struct ath_rate_table ar5416_11ng_ratetable = {
+               { VALID, VALID, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
+                       30900, 11, 108, 8, 11, 11, 11, 11 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_SS, 6500, /* 6.5 Mb */
+-                      6400, 0, 0, 4, 12, 28, 12, 28 },
++                      6400, 0, 0, 4, 12, 29, 12, 29 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 13000, /* 13 Mb */
+-                      12700, 1, 1, 6, 13, 29, 13, 29 },
++                      12700, 1, 1, 6, 13, 30, 13, 30 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 19500, /* 19.5 Mb */
+-                      18800, 2, 2, 6, 14, 30, 14, 30 },
++                      18800, 2, 2, 6, 14, 31, 14, 31 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 26000, /* 26 Mb */
+-                      25000, 3, 3, 8, 15, 31, 15, 31 },
++                      25000, 3, 3, 8, 15, 32, 15, 32 },
+               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 39000, /* 39 Mb */
+-                      36700, 4, 4, 8, 16, 32, 16, 32 },
++                      36700, 4, 4, 8, 16, 33, 16, 33 },
+               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 52000, /* 52 Mb */
+-                      48100, 5, 5, 8, 17, 33, 17, 33 },
++                      48100, 5, 5, 8, 17, 34, 17, 34 },
+               { INVALID,  VALID_20, WLAN_RC_PHY_HT_20_SS, 58500, /* 58.5 Mb */
+-                      53500, 6, 6, 8, 18, 34, 18, 34 },
++                      53500, 6, 6, 8, 18, 35, 18, 35 },
+               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 65000, /* 65 Mb */
+-                      59000, 7, 7, 8, 19, 35, 19, 36 },
++                      59000, 7, 7, 8, 19, 36, 19, 37 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 13000, /* 13 Mb */
+-                      12700, 8, 8, 4, 20, 37, 20, 37 },
++                      12700, 8, 8, 4, 20, 38, 20, 38 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 26000, /* 26 Mb */
+-                      24800, 9, 9, 6, 21, 38, 21, 38 },
++                      24800, 9, 9, 6, 21, 39, 21, 39 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 39000, /* 39 Mb */
+-                      36600, 10, 10, 6, 22, 39, 22, 39 },
++                      36600, 10, 10, 6, 22, 40, 22, 40 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 52000, /* 52 Mb */
+-                      48100, 11, 11, 8, 23, 40, 23, 40 },
++                      48100, 11, 11, 8, 23, 41, 23, 41 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 78000, /* 78 Mb */
+-                      69500, 12, 12, 8, 24, 41, 24, 41 },
++                      69500, 12, 12, 8, 24, 42, 24, 42 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 104000, /* 104 Mb */
+-                      89500, 13, 13, 8, 25, 42, 25, 42 },
++                      89500, 13, 13, 8, 25, 43, 25, 43 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 117000, /* 117 Mb */
+-                      98900, 14, 14, 8, 26, 43, 26, 44 },
++                      98900, 14, 14, 8, 26, 44, 26, 44 },
+               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 130000, /* 130 Mb */
+-                      108300, 15, 15, 8, 27, 44, 27, 45 },
++                      108300, 15, 15, 8, 27, 45, 28, 46 },
++              { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS_HGI, 144400, /* 130 Mb */
++                      120000, 15, 15, 8, 27, 45, 28, 46 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 13500, /* 13.5 Mb */
+-                      13200, 0, 0, 8, 12, 28, 28, 28 },
++                      13200, 0, 0, 8, 12, 29, 29, 29 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 27500, /* 27.0 Mb */
+-                      25900, 1, 1, 8, 13, 29, 29, 29 },
++                      25900, 1, 1, 8, 13, 30, 30, 30 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 40500, /* 40.5 Mb */
+-                      38600, 2, 2, 8, 14, 30, 30, 30 },
++                      38600, 2, 2, 8, 14, 31, 31, 31 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 54000, /* 54 Mb */
+-                      49800, 3, 3, 8,  15, 31, 31, 31 },
++                      49800, 3, 3, 8,  15, 32, 32, 32 },
+               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 81500, /* 81 Mb */
+-                      72200, 4, 4, 8, 16, 32, 32, 32 },
++                      72200, 4, 4, 8, 16, 33, 33, 33 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 108000, /* 108 Mb */
+-                      92900, 5, 5, 8, 17, 33, 33, 33 },
++                      92900, 5, 5, 8, 17, 34, 34, 34 },
+               { INVALID,  VALID_40, WLAN_RC_PHY_HT_40_SS, 121500, /* 121.5 Mb */
+-                      102700, 6, 6, 8, 18, 34, 34, 34 },
++                      102700, 6, 6, 8, 18, 35, 35, 35 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 135000, /* 135 Mb */
+-                      112000, 7, 7, 8, 19, 35, 36, 36 },
++                      112000, 7, 7, 8, 19, 36, 37, 37 },
+               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
+-                      122000, 7, 7, 8, 19, 35, 36, 36 },
++                      122000, 7, 7, 8, 19, 36, 37, 37 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 27000, /* 27 Mb */
+-                      25800, 8, 8, 8, 20, 37, 37, 37 },
++                      25800, 8, 8, 8, 20, 38, 38, 38 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 54000, /* 54 Mb */
+-                      49800, 9, 9, 8, 21, 38, 38, 38 },
++                      49800, 9, 9, 8, 21, 39, 39, 39 },
+               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 81000, /* 81 Mb */
+-                      71900, 10, 10, 8, 22, 39, 39, 39 },
++                      71900, 10, 10, 8, 22, 40, 40, 40 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 108000, /* 108 Mb */
+-                      92500, 11, 11, 8, 23, 40, 40, 40 },
++                      92500, 11, 11, 8, 23, 41, 41, 41 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 162000, /* 162 Mb */
+-                      130300, 12, 12, 8, 24, 41, 41, 41 },
++                      130300, 12, 12, 8, 24, 42, 42, 42 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 216000, /* 216 Mb */
+-                      162800, 13, 13, 8, 25, 42, 42, 42 },
++                      162800, 13, 13, 8, 25, 43, 43, 43 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 243000, /* 243 Mb */
+-                      178200, 14, 14, 8, 26, 43, 43, 43 },
++                      178200, 14, 14, 8, 26, 44, 44, 44 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 270000, /* 270 Mb */
+-                      192100, 15, 15, 8, 27, 44, 45, 45 },
++                      192100, 15, 15, 8, 27, 45, 46, 46 },
+               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
+-                      207000, 15, 15, 8, 27, 44, 45, 45 },
++                      207000, 15, 15, 8, 27, 45, 46, 46 },
+       },
+       50,  /* probe interval */
+       WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
+@@ -1193,7 +1197,7 @@ static void ath_rc_init(struct ath_softc *sc,
+ }
+ static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
+-                             bool is_cw40, bool is_sgi40)
++                             bool is_cw40, bool is_sgi)
+ {
+       u8 caps = 0;
+@@ -1206,8 +1210,9 @@ static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
+               }
+               if (is_cw40)
+                       caps |= WLAN_RC_40_FLAG;
+-              if (is_sgi40)
++              if (is_sgi)
+                       caps |= WLAN_RC_SGI_FLAG;
++
+       }
+       return caps;
+@@ -1300,7 +1305,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
+       struct ath_softc *sc = priv;
+       struct ath_rate_priv *ath_rc_priv = priv_sta;
+       const struct ath_rate_table *rate_table;
+-      bool is_cw40, is_sgi40;
++      bool is_cw40, is_sgi = false;
+       int i, j = 0;
+       for (i = 0; i < sband->n_bitrates; i++) {
+@@ -1323,7 +1328,11 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
+       }
+       is_cw40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+-      is_sgi40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
++
++      if (is_cw40)
++              is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
++      else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
++              is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
+       /* Choose rate table first */
+@@ -1336,7 +1345,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
+               rate_table = hw_rate_table[sc->cur_rate_mode];
+       }
+-      ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi40);
++      ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi);
+       ath_rc_init(sc, priv_sta, sband, sta, rate_table);
+ }
+@@ -1347,10 +1356,10 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
+       struct ath_softc *sc = priv;
+       struct ath_rate_priv *ath_rc_priv = priv_sta;
+       const struct ath_rate_table *rate_table = NULL;
+-      bool oper_cw40 = false, oper_sgi40;
++      bool oper_cw40 = false, oper_sgi;
+       bool local_cw40 = (ath_rc_priv->ht_cap & WLAN_RC_40_FLAG) ?
+               true : false;
+-      bool local_sgi40 = (ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG) ?
++      bool local_sgi = (ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG) ?
+               true : false;
+       /* FIXME: Handle AP mode later when we support CWM */
+@@ -1363,15 +1372,21 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
+                   oper_chan_type == NL80211_CHAN_HT40PLUS)
+                       oper_cw40 = true;
+-              oper_sgi40 = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+-                      true : false;
++              if (oper_cw40)
++                      oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
++                                 true : false;
++              else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
++                      oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
++                                 true : false;
++              else
++                      oper_sgi = false;
+-              if ((local_cw40 != oper_cw40) || (local_sgi40 != oper_sgi40)) {
++              if ((local_cw40 != oper_cw40) || (local_sgi != oper_sgi)) {
+                       rate_table = ath_choose_rate_table(sc, sband->band,
+                                                  sta->ht_cap.ht_supported,
+                                                  oper_cw40);
+                       ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta,
+-                                                 oper_cw40, oper_sgi40);
++                                                 oper_cw40, oper_sgi);
+                       ath_rc_init(sc, priv_sta, sband, sta, rate_table);
+                       ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0006-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch b/linux-next-pending/0006-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch
deleted file mode 100644 (file)
index dea6f54..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-From 2449106deb1699a46ca4ed8f0b7f03ebca0a3cdb Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Thu, 13 May 2010 17:57:51 -0700
-Subject: [PATCH 06/19] ath9k: Enable Short GI in 20 Mhz for ar9287 and later chips
-
-This patch enables short GI rx at all rates and tx at mcs15
-for 20 Mhz channel width also.
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/hw.c   |    3 +
- drivers/net/wireless/ath/ath9k/hw.h   |    1 +
- drivers/net/wireless/ath/ath9k/init.c |    3 +
- drivers/net/wireless/ath/ath9k/rc.c   |  173 ++++++++++++++++++---------------
- 4 files changed, 101 insertions(+), 79 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2234,6 +2234,9 @@ int ath9k_hw_fill_cap_info(struct ath_hw
-       if (AR_SREV_9300_20_OR_LATER(ah))
-               pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;
-+      if (AR_SREV_9287_10_OR_LATER(ah))
-+              pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;
-+
-       return 0;
- }
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -199,6 +199,7 @@ enum ath9k_hw_caps {
-       ATH9K_HW_CAP_RAC_SUPPORTED              = BIT(18),
-       ATH9K_HW_CAP_LDPC                       = BIT(19),
-       ATH9K_HW_CAP_FASTCLOCK                  = BIT(20),
-+      ATH9K_HW_CAP_SGI_20                     = BIT(21),
- };
- enum ath9k_capability_type {
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -208,6 +208,9 @@ static void setup_ht_cap(struct ath_soft
-       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_LDPC)
-               ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
-+      if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
-+              ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
-+
-       ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
-       ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
---- a/drivers/net/wireless/ath/ath9k/rc.c
-+++ b/drivers/net/wireless/ath/ath9k/rc.c
-@@ -40,73 +40,75 @@ static const struct ath_rate_table ar541
-               { VALID, VALID, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
-                       29300, 7, 108, 4, 7, 7, 7, 7 },
-               { VALID_2040, VALID_2040, WLAN_RC_PHY_HT_20_SS, 6500, /* 6.5 Mb */
--                      6400, 0, 0, 0, 8, 24, 8, 24 },
-+                      6400, 0, 0, 0, 8, 25, 8, 25 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 13000, /* 13 Mb */
--                      12700, 1, 1, 2, 9, 25, 9, 25 },
-+                      12700, 1, 1, 2, 9, 26, 9, 26 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 19500, /* 19.5 Mb */
--                      18800, 2, 2, 2, 10, 26, 10, 26 },
-+                      18800, 2, 2, 2, 10, 27, 10, 27 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 26000, /* 26 Mb */
--                      25000, 3, 3, 4, 11, 27, 11, 27 },
-+                      25000, 3, 3, 4, 11, 28, 11, 28 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 39000, /* 39 Mb */
--                      36700, 4, 4, 4, 12, 28, 12, 28 },
-+                      36700, 4, 4, 4, 12, 29, 12, 29 },
-               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 52000, /* 52 Mb */
--                      48100, 5, 5, 4, 13, 29, 13, 29 },
-+                      48100, 5, 5, 4, 13, 30, 13, 30 },
-               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 58500, /* 58.5 Mb */
--                      53500, 6, 6, 4, 14, 30, 14, 30 },
-+                      53500, 6, 6, 4, 14, 31, 14, 31 },
-               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 65000, /* 65 Mb */
--                      59000, 7, 7, 4, 15, 31, 15, 32 },
-+                      59000, 7, 7, 4, 15, 32, 15, 33 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 13000, /* 13 Mb */
--                      12700, 8, 8, 3, 16, 33, 16, 33 },
-+                      12700, 8, 8, 3, 16, 34, 16, 34 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 26000, /* 26 Mb */
--                      24800, 9, 9, 2, 17, 34, 17, 34 },
-+                      24800, 9, 9, 2, 17, 35, 17, 35 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 39000, /* 39 Mb */
--                      36600, 10, 10, 2, 18, 35, 18, 35 },
-+                      36600, 10, 10, 2, 18, 36, 18, 36 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 52000, /* 52 Mb */
--                      48100, 11, 11, 4, 19, 36, 19, 36 },
-+                      48100, 11, 11, 4, 19, 37, 19, 37 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 78000, /* 78 Mb */
--                      69500, 12, 12, 4, 20, 37, 20, 37 },
-+                      69500, 12, 12, 4, 20, 38, 20, 38 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 104000, /* 104 Mb */
--                      89500, 13, 13, 4, 21, 38, 21, 38 },
-+                      89500, 13, 13, 4, 21, 39, 21, 39 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 117000, /* 117 Mb */
--                      98900, 14, 14, 4, 22, 39, 22, 39 },
-+                      98900, 14, 14, 4, 22, 40, 22, 40 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 130000, /* 130 Mb */
--                      108300, 15, 15, 4, 23, 40, 23, 41 },
-+                      108300, 15, 15, 4, 23, 41, 24, 42 },
-+              { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS_HGI, 144400, /* 144.4 Mb */
-+                      12000, 15, 15, 4, 23, 41, 24, 42 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 13500, /* 13.5 Mb */
--                      13200, 0, 0, 0, 8, 24, 24, 24 },
-+                      13200, 0, 0, 0, 8, 25, 25, 25 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 27500, /* 27.0 Mb */
--                      25900, 1, 1, 2, 9, 25, 25, 25 },
-+                      25900, 1, 1, 2, 9, 26, 26, 26 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 40500, /* 40.5 Mb */
--                      38600, 2, 2, 2, 10, 26, 26, 26 },
-+                      38600, 2, 2, 2, 10, 27, 27, 27 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 54000, /* 54 Mb */
--                      49800, 3, 3, 4, 11, 27, 27, 27 },
-+                      49800, 3, 3, 4, 11, 28, 28, 28 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 81500, /* 81 Mb */
--                      72200, 4, 4, 4, 12, 28, 28, 28 },
-+                      72200, 4, 4, 4, 12, 29, 29, 29 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 108000, /* 108 Mb */
--                      92900, 5, 5, 4, 13, 29, 29, 29 },
-+                      92900, 5, 5, 4, 13, 30, 30, 30 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 121500, /* 121.5 Mb */
--                      102700, 6, 6, 4, 14, 30, 30, 30 },
-+                      102700, 6, 6, 4, 14, 31, 31, 31 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 135000, /* 135 Mb */
--                      112000, 7, 7, 4, 15, 31, 32, 32 },
-+                      112000, 7, 7, 4, 15, 32, 33, 33 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
--                      122000, 7, 7, 4, 15, 31, 32, 32 },
-+                      122000, 7, 7, 4, 15, 32, 33, 33 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 27000, /* 27 Mb */
--                      25800, 8, 8, 0, 16, 33, 33, 33 },
-+                      25800, 8, 8, 0, 16, 34, 34, 34 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 54000, /* 54 Mb */
--                      49800, 9, 9, 2, 17, 34, 34, 34 },
-+                      49800, 9, 9, 2, 17, 35, 35, 35 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 81000, /* 81 Mb */
--                      71900, 10, 10, 2, 18, 35, 35, 35 },
-+                      71900, 10, 10, 2, 18, 36, 36, 36 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 108000, /* 108 Mb */
--                      92500, 11, 11, 4, 19, 36, 36, 36 },
-+                      92500, 11, 11, 4, 19, 37, 37, 37 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 162000, /* 162 Mb */
--                      130300, 12, 12, 4, 20, 37, 37, 37 },
-+                      130300, 12, 12, 4, 20, 38, 38, 38 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 216000, /* 216 Mb */
--                      162800, 13, 13, 4, 21, 38, 38, 38 },
-+                      162800, 13, 13, 4, 21, 39, 39, 39 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 243000, /* 243 Mb */
--                      178200, 14, 14, 4, 22, 39, 39, 39 },
-+                      178200, 14, 14, 4, 22, 40, 40, 40 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 270000, /* 270 Mb */
--                      192100, 15, 15, 4, 23, 40, 41, 41 },
-+                      192100, 15, 15, 4, 23, 41, 42, 42 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
--                      207000, 15, 15, 4, 23, 40, 41, 41 },
-+                      207000, 15, 15, 4, 23, 41, 42, 42 },
-       },
-       50,  /* probe interval */
-       WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
-@@ -144,73 +146,75 @@ static const struct ath_rate_table ar541
-               { VALID, VALID, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
-                       30900, 11, 108, 8, 11, 11, 11, 11 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_SS, 6500, /* 6.5 Mb */
--                      6400, 0, 0, 4, 12, 28, 12, 28 },
-+                      6400, 0, 0, 4, 12, 29, 12, 29 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 13000, /* 13 Mb */
--                      12700, 1, 1, 6, 13, 29, 13, 29 },
-+                      12700, 1, 1, 6, 13, 30, 13, 30 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 19500, /* 19.5 Mb */
--                      18800, 2, 2, 6, 14, 30, 14, 30 },
-+                      18800, 2, 2, 6, 14, 31, 14, 31 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 26000, /* 26 Mb */
--                      25000, 3, 3, 8, 15, 31, 15, 31 },
-+                      25000, 3, 3, 8, 15, 32, 15, 32 },
-               { VALID_20, VALID_20, WLAN_RC_PHY_HT_20_SS, 39000, /* 39 Mb */
--                      36700, 4, 4, 8, 16, 32, 16, 32 },
-+                      36700, 4, 4, 8, 16, 33, 16, 33 },
-               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 52000, /* 52 Mb */
--                      48100, 5, 5, 8, 17, 33, 17, 33 },
-+                      48100, 5, 5, 8, 17, 34, 17, 34 },
-               { INVALID,  VALID_20, WLAN_RC_PHY_HT_20_SS, 58500, /* 58.5 Mb */
--                      53500, 6, 6, 8, 18, 34, 18, 34 },
-+                      53500, 6, 6, 8, 18, 35, 18, 35 },
-               { INVALID, VALID_20, WLAN_RC_PHY_HT_20_SS, 65000, /* 65 Mb */
--                      59000, 7, 7, 8, 19, 35, 19, 36 },
-+                      59000, 7, 7, 8, 19, 36, 19, 37 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 13000, /* 13 Mb */
--                      12700, 8, 8, 4, 20, 37, 20, 37 },
-+                      12700, 8, 8, 4, 20, 38, 20, 38 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 26000, /* 26 Mb */
--                      24800, 9, 9, 6, 21, 38, 21, 38 },
-+                      24800, 9, 9, 6, 21, 39, 21, 39 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_20_DS, 39000, /* 39 Mb */
--                      36600, 10, 10, 6, 22, 39, 22, 39 },
-+                      36600, 10, 10, 6, 22, 40, 22, 40 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 52000, /* 52 Mb */
--                      48100, 11, 11, 8, 23, 40, 23, 40 },
-+                      48100, 11, 11, 8, 23, 41, 23, 41 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 78000, /* 78 Mb */
--                      69500, 12, 12, 8, 24, 41, 24, 41 },
-+                      69500, 12, 12, 8, 24, 42, 24, 42 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 104000, /* 104 Mb */
--                      89500, 13, 13, 8, 25, 42, 25, 42 },
-+                      89500, 13, 13, 8, 25, 43, 25, 43 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 117000, /* 117 Mb */
--                      98900, 14, 14, 8, 26, 43, 26, 44 },
-+                      98900, 14, 14, 8, 26, 44, 26, 44 },
-               { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS, 130000, /* 130 Mb */
--                      108300, 15, 15, 8, 27, 44, 27, 45 },
-+                      108300, 15, 15, 8, 27, 45, 28, 46 },
-+              { VALID_20, INVALID, WLAN_RC_PHY_HT_20_DS_HGI, 144400, /* 130 Mb */
-+                      120000, 15, 15, 8, 27, 45, 28, 46 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 13500, /* 13.5 Mb */
--                      13200, 0, 0, 8, 12, 28, 28, 28 },
-+                      13200, 0, 0, 8, 12, 29, 29, 29 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 27500, /* 27.0 Mb */
--                      25900, 1, 1, 8, 13, 29, 29, 29 },
-+                      25900, 1, 1, 8, 13, 30, 30, 30 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 40500, /* 40.5 Mb */
--                      38600, 2, 2, 8, 14, 30, 30, 30 },
-+                      38600, 2, 2, 8, 14, 31, 31, 31 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 54000, /* 54 Mb */
--                      49800, 3, 3, 8,  15, 31, 31, 31 },
-+                      49800, 3, 3, 8,  15, 32, 32, 32 },
-               { VALID_40, VALID_40, WLAN_RC_PHY_HT_40_SS, 81500, /* 81 Mb */
--                      72200, 4, 4, 8, 16, 32, 32, 32 },
-+                      72200, 4, 4, 8, 16, 33, 33, 33 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 108000, /* 108 Mb */
--                      92900, 5, 5, 8, 17, 33, 33, 33 },
-+                      92900, 5, 5, 8, 17, 34, 34, 34 },
-               { INVALID,  VALID_40, WLAN_RC_PHY_HT_40_SS, 121500, /* 121.5 Mb */
--                      102700, 6, 6, 8, 18, 34, 34, 34 },
-+                      102700, 6, 6, 8, 18, 35, 35, 35 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS, 135000, /* 135 Mb */
--                      112000, 7, 7, 8, 19, 35, 36, 36 },
-+                      112000, 7, 7, 8, 19, 36, 37, 37 },
-               { INVALID, VALID_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
--                      122000, 7, 7, 8, 19, 35, 36, 36 },
-+                      122000, 7, 7, 8, 19, 36, 37, 37 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 27000, /* 27 Mb */
--                      25800, 8, 8, 8, 20, 37, 37, 37 },
-+                      25800, 8, 8, 8, 20, 38, 38, 38 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 54000, /* 54 Mb */
--                      49800, 9, 9, 8, 21, 38, 38, 38 },
-+                      49800, 9, 9, 8, 21, 39, 39, 39 },
-               { INVALID, INVALID, WLAN_RC_PHY_HT_40_DS, 81000, /* 81 Mb */
--                      71900, 10, 10, 8, 22, 39, 39, 39 },
-+                      71900, 10, 10, 8, 22, 40, 40, 40 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 108000, /* 108 Mb */
--                      92500, 11, 11, 8, 23, 40, 40, 40 },
-+                      92500, 11, 11, 8, 23, 41, 41, 41 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 162000, /* 162 Mb */
--                      130300, 12, 12, 8, 24, 41, 41, 41 },
-+                      130300, 12, 12, 8, 24, 42, 42, 42 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 216000, /* 216 Mb */
--                      162800, 13, 13, 8, 25, 42, 42, 42 },
-+                      162800, 13, 13, 8, 25, 43, 43, 43 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 243000, /* 243 Mb */
--                      178200, 14, 14, 8, 26, 43, 43, 43 },
-+                      178200, 14, 14, 8, 26, 44, 44, 44 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS, 270000, /* 270 Mb */
--                      192100, 15, 15, 8, 27, 44, 45, 45 },
-+                      192100, 15, 15, 8, 27, 45, 46, 46 },
-               { VALID_40, INVALID, WLAN_RC_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
--                      207000, 15, 15, 8, 27, 44, 45, 45 },
-+                      207000, 15, 15, 8, 27, 45, 46, 46 },
-       },
-       50,  /* probe interval */
-       WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
-@@ -1193,7 +1197,7 @@ static void ath_rc_init(struct ath_softc
- }
- static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
--                             bool is_cw40, bool is_sgi40)
-+                             bool is_cw40, bool is_sgi)
- {
-       u8 caps = 0;
-@@ -1206,8 +1210,9 @@ static u8 ath_rc_build_ht_caps(struct at
-               }
-               if (is_cw40)
-                       caps |= WLAN_RC_40_FLAG;
--              if (is_sgi40)
-+              if (is_sgi)
-                       caps |= WLAN_RC_SGI_FLAG;
-+
-       }
-       return caps;
-@@ -1300,7 +1305,7 @@ static void ath_rate_init(void *priv, st
-       struct ath_softc *sc = priv;
-       struct ath_rate_priv *ath_rc_priv = priv_sta;
-       const struct ath_rate_table *rate_table;
--      bool is_cw40, is_sgi40;
-+      bool is_cw40, is_sgi = false;
-       int i, j = 0;
-       for (i = 0; i < sband->n_bitrates; i++) {
-@@ -1323,7 +1328,11 @@ static void ath_rate_init(void *priv, st
-       }
-       is_cw40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
--      is_sgi40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
-+
-+      if (is_cw40)
-+              is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
-+      else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
-+              is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
-       /* Choose rate table first */
-@@ -1336,7 +1345,7 @@ static void ath_rate_init(void *priv, st
-               rate_table = hw_rate_table[sc->cur_rate_mode];
-       }
--      ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi40);
-+      ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi);
-       ath_rc_init(sc, priv_sta, sband, sta, rate_table);
- }
-@@ -1347,10 +1356,10 @@ static void ath_rate_update(void *priv, 
-       struct ath_softc *sc = priv;
-       struct ath_rate_priv *ath_rc_priv = priv_sta;
-       const struct ath_rate_table *rate_table = NULL;
--      bool oper_cw40 = false, oper_sgi40;
-+      bool oper_cw40 = false, oper_sgi;
-       bool local_cw40 = (ath_rc_priv->ht_cap & WLAN_RC_40_FLAG) ?
-               true : false;
--      bool local_sgi40 = (ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG) ?
-+      bool local_sgi = (ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG) ?
-               true : false;
-       /* FIXME: Handle AP mode later when we support CWM */
-@@ -1363,15 +1372,21 @@ static void ath_rate_update(void *priv, 
-                   oper_chan_type == NL80211_CHAN_HT40PLUS)
-                       oper_cw40 = true;
--              oper_sgi40 = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
--                      true : false;
-+              if (oper_cw40)
-+                      oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
-+                                 true : false;
-+              else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
-+                      oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
-+                                 true : false;
-+              else
-+                      oper_sgi = false;
--              if ((local_cw40 != oper_cw40) || (local_sgi40 != oper_sgi40)) {
-+              if ((local_cw40 != oper_cw40) || (local_sgi != oper_sgi)) {
-                       rate_table = ath_choose_rate_table(sc, sband->band,
-                                                  sta->ht_cap.ht_supported,
-                                                  oper_cw40);
-                       ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta,
--                                                 oper_cw40, oper_sgi40);
-+                                                 oper_cw40, oper_sgi);
-                       ath_rc_init(sc, priv_sta, sband, sta, rate_table);
-                       ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
diff --git a/linux-next-pending/0006-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch b/linux-next-pending/0006-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch
new file mode 100644 (file)
index 0000000..8bb9b2b
--- /dev/null
@@ -0,0 +1,38 @@
+From 7d603b16b19d6eb85c0ff6d4ff1274c2962cf671 Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Mon, 17 May 2010 11:34:10 -0700
+Subject: [PATCH 06/20] ath9k: Make sure null func frame is acked before going into PS for ar9003
+
+Add missing code to handle nullfunc frame completion in
+ath_tx_edma_tasklet().
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/xmit.c |   11 +++++++++++
+ 1 files changed, 11 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
+index 3db1917..debb62d 100644
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -2277,6 +2277,17 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
+               txok = !(txs.ts_status & ATH9K_TXERR_MASK);
++              /*
++               * Make sure null func frame is acked before configuring
++               * hw into ps mode.
++               */
++              if (bf->bf_isnullfunc && txok) {
++                      if ((sc->ps_flags & PS_ENABLED))
++                              ath9k_enable_ps(sc);
++                      else
++                              sc->ps_flags |= PS_NULLFUNC_COMPLETED;
++              }
++
+               if (!bf_isampdu(bf)) {
+                       bf->bf_retries = txs.ts_longretry;
+                       if (txs.ts_status & ATH9K_TXERR_XRETRY)
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch b/linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch
new file mode 100644 (file)
index 0000000..82adbcf
--- /dev/null
@@ -0,0 +1,39 @@
+From 3c2af719083444626ba452af6c95e111c7da8f3e Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Mon, 17 May 2010 18:36:00 -0700
+Subject: [PATCH 07/20] ath9k: Fix power save with auto sleeping
+
+Rx should not be disabed/disabled when hw supports auto sleeping.
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/main.c |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
+index b98b2f2..d6e8be0 100644
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -1282,7 +1282,8 @@ static int ath9k_tx(struct ieee80211_hw *hw,
+                * completed and if needed, also for RX of buffered frames.
+                */
+               ath9k_ps_wakeup(sc);
+-              ath9k_hw_setrxabort(sc->sc_ah, 0);
++              if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
++                      ath9k_hw_setrxabort(sc->sc_ah, 0);
+               if (ieee80211_is_pspoll(hdr->frame_control)) {
+                       ath_print(common, ATH_DBG_PS,
+                                 "Sending PS-Poll to pick a buffered frame\n");
+@@ -1546,8 +1547,8 @@ void ath9k_enable_ps(struct ath_softc *sc)
+                       ah->imask |= ATH9K_INT_TIM_TIMER;
+                       ath9k_hw_set_interrupts(ah, ah->imask);
+               }
++              ath9k_hw_setrxabort(ah, 1);
+       }
+-      ath9k_hw_setrxabort(ah, 1);
+ }
+ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0007-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch b/linux-next-pending/0007-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch
deleted file mode 100644 (file)
index ae263df..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From b678026133c321be78cbebdfc7f791fa72525ac1 Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Mon, 17 May 2010 11:34:10 -0700
-Subject: [PATCH 07/19] ath9k: Make sure null func frame is acked before going into PS for ar9003
-
-Add missing code to handle nullfunc frame completion in
-ath_tx_edma_tasklet().
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/xmit.c |   11 +++++++++++
- 1 files changed, 11 insertions(+), 0 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -2277,6 +2277,17 @@ void ath_tx_edma_tasklet(struct ath_soft
-               txok = !(txs.ts_status & ATH9K_TXERR_MASK);
-+              /*
-+               * Make sure null func frame is acked before configuring
-+               * hw into ps mode.
-+               */
-+              if (bf->bf_isnullfunc && txok) {
-+                      if ((sc->ps_flags & PS_ENABLED))
-+                              ath9k_enable_ps(sc);
-+                      else
-+                              sc->ps_flags |= PS_NULLFUNC_COMPLETED;
-+              }
-+
-               if (!bf_isampdu(bf)) {
-                       bf->bf_retries = txs.ts_longretry;
-                       if (txs.ts_status & ATH9K_TXERR_XRETRY)
diff --git a/linux-next-pending/0008-ath9k-Fix-power-save-with-auto-sleeping.patch b/linux-next-pending/0008-ath9k-Fix-power-save-with-auto-sleeping.patch
deleted file mode 100644 (file)
index 8d2d3d5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From f459f43e2490ec2644bc826c3ca3906b1985baa1 Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Mon, 17 May 2010 18:36:00 -0700
-Subject: [PATCH 08/19] ath9k: Fix power save with auto sleeping
-
-Rx should not be disabed/disabled when hw supports auto sleeping.
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/main.c |    5 +++--
- 1 files changed, 3 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1282,7 +1282,8 @@ static int ath9k_tx(struct ieee80211_hw 
-                * completed and if needed, also for RX of buffered frames.
-                */
-               ath9k_ps_wakeup(sc);
--              ath9k_hw_setrxabort(sc->sc_ah, 0);
-+              if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
-+                      ath9k_hw_setrxabort(sc->sc_ah, 0);
-               if (ieee80211_is_pspoll(hdr->frame_control)) {
-                       ath_print(common, ATH_DBG_PS,
-                                 "Sending PS-Poll to pick a buffered frame\n");
-@@ -1546,8 +1547,8 @@ void ath9k_enable_ps(struct ath_softc *s
-                       ah->imask |= ATH9K_INT_TIM_TIMER;
-                       ath9k_hw_set_interrupts(ah, ah->imask);
-               }
-+              ath9k_hw_setrxabort(ah, 1);
-       }
--      ath9k_hw_setrxabort(ah, 1);
- }
- static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
diff --git a/linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch b/linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch
new file mode 100644 (file)
index 0000000..76b2345
--- /dev/null
@@ -0,0 +1,26 @@
+From a269e97ddf3d7e86b68b8cc007431a1022989430 Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Mon, 17 May 2010 18:38:58 -0700
+Subject: [PATCH 08/20] ath9k_hw: Enable auto sleep for ar9003
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/hw.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
+index 2fd6254..b2301bd 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -2167,7 +2167,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
+               pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
+       }
+ #endif
+-      if (AR_SREV_9271(ah))
++      if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
+               pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
+       else
+               pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0009-ath9k-Fix-rx-of-mcast-bcast-frames-in-PS-mode-with-a.patch b/linux-next-pending/0009-ath9k-Fix-rx-of-mcast-bcast-frames-in-PS-mode-with-a.patch
new file mode 100644 (file)
index 0000000..a56bf48
--- /dev/null
@@ -0,0 +1,45 @@
+From 8a4ab8855e064e0695360100d8baa089c3ef17a4 Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Tue, 18 May 2010 17:20:39 -0700
+Subject: [PATCH 09/20] ath9k: Fix rx of mcast/bcast frames in PS mode with auto sleep
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/recv.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
+index ca6065b..90c3e0e 100644
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -18,6 +18,9 @@
+ #include "ar9003_mac.h"
+ #define SKB_CB_ATHBUF(__skb)  (*((struct ath_buf **)__skb->cb))
++#define ATH9K_CHECK_AUTO_SLEEP(__sc) \
++      (__sc->ps_enabled && \
++      (__sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
+ static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)
+ {
+@@ -622,7 +625,7 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb)
+       hdr = (struct ieee80211_hdr *)skb->data;
+       /* Process Beacon and CAB receive in PS state */
+-      if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc))
++      if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ATH9K_CHECK_AUTO_SLEEP(sc))
+           && ieee80211_is_beacon(hdr->frame_control))
+               ath_rx_ps_beacon(sc, skb);
+       else if ((sc->ps_flags & PS_WAIT_FOR_CAB) &&
+@@ -938,7 +941,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+                       sc->rx.rxotherant = 0;
+               }
+-              if (unlikely(ath9k_check_auto_sleep(sc) ||
++              if (unlikely(ATH9K_CHECK_AUTO_SLEEP(sc) ||
+                            (sc->ps_flags & (PS_WAIT_FOR_BEACON |
+                                             PS_WAIT_FOR_CAB |
+                                             PS_WAIT_FOR_PSPOLL_DATA))))
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch b/linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch
deleted file mode 100644 (file)
index 66abf93..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-From 79e8cb3f106fbb4f8aa1fb2ab442f6e34b992bbc Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Mon, 17 May 2010 18:38:58 -0700
-Subject: [PATCH 09/19] ath9k_hw: Enable auto sleep for ar9003
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/hw.c |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2167,7 +2167,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw
-               pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
-       }
- #endif
--      if (AR_SREV_9271(ah))
-+      if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
-               pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
-       else
-               pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
diff --git a/linux-next-pending/0010-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch b/linux-next-pending/0010-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch
new file mode 100644 (file)
index 0000000..a2603da
--- /dev/null
@@ -0,0 +1,40 @@
+From 4bf9998d15742540f538706e6a435535e4a2580b Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 13 May 2010 20:37:24 +0200
+Subject: [PATCH 10/20] ath9k: change beacon allocation to prefer the first beacon slot
+
+This fixes IBSS beacon transmissions without VEOL enabled
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+ drivers/net/wireless/ath/ath9k/beacon.c |   12 +++---------
+ 1 files changed, 3 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
+index c8a4558..77face7 100644
+--- a/drivers/net/wireless/ath/ath9k/beacon.c
++++ b/drivers/net/wireless/ath/ath9k/beacon.c
+@@ -274,17 +274,11 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
+                       avp->av_bslot = 0;
+                       for (slot = 0; slot < ATH_BCBUF; slot++)
+                               if (sc->beacon.bslot[slot] == NULL) {
+-                                      /*
+-                                       * XXX hack, space out slots to better
+-                                       * deal with misses
+-                                       */
+-                                      if (slot+1 < ATH_BCBUF &&
+-                                          sc->beacon.bslot[slot+1] == NULL) {
+-                                              avp->av_bslot = slot+1;
+-                                              break;
+-                                      }
+                                       avp->av_bslot = slot;
++
+                                       /* NB: keep looking for a double slot */
++                                      if (slot == 0 || !sc->beacon.bslot[slot-1])
++                                              break;
+                               }
+                       BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
+                       sc->beacon.bslot[avp->av_bslot] = vif;
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0011-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch b/linux-next-pending/0011-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch
deleted file mode 100644 (file)
index ec11f43..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 4bd341bdf87c2e17d256526ffc75d9a2200f771b Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Thu, 13 May 2010 20:37:24 +0200
-Subject: [PATCH 11/19] ath9k: change beacon allocation to prefer the first beacon slot
-
-This fixes IBSS beacon transmissions without VEOL enabled
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
- drivers/net/wireless/ath/ath9k/beacon.c |   12 +++---------
- 1 files changed, 3 insertions(+), 9 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -274,17 +274,11 @@ int ath_beacon_alloc(struct ath_wiphy *a
-                       avp->av_bslot = 0;
-                       for (slot = 0; slot < ATH_BCBUF; slot++)
-                               if (sc->beacon.bslot[slot] == NULL) {
--                                      /*
--                                       * XXX hack, space out slots to better
--                                       * deal with misses
--                                       */
--                                      if (slot+1 < ATH_BCBUF &&
--                                          sc->beacon.bslot[slot+1] == NULL) {
--                                              avp->av_bslot = slot+1;
--                                              break;
--                                      }
-                                       avp->av_bslot = slot;
-+
-                                       /* NB: keep looking for a double slot */
-+                                      if (slot == 0 || !sc->beacon.bslot[slot-1])
-+                                              break;
-                               }
-                       BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
-                       sc->beacon.bslot[avp->av_bslot] = vif;
diff --git a/linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch b/linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch
new file mode 100644 (file)
index 0000000..8aca9fd
--- /dev/null
@@ -0,0 +1,120 @@
+From 6b0d6c3dd1cbc5508420115cc9401c3bccaa8f60 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 13 May 2010 20:37:25 +0200
+Subject: [PATCH 11/20] ath9k: remove VEOL support for ad-hoc
+
+With VEOL, Beacon transmission in ad-hoc does not currently work.
+I believe for larger ad-hoc networks, VEOL is too unreliable, as
+it can get beacon transmissions stuck during synchronization.
+Use SWBA based beacon trasmission similar to AP mode instead.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+ drivers/net/wireless/ath/ath9k/beacon.c |   63 +++++--------------------------
+ 1 files changed, 10 insertions(+), 53 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
+index 77face7..f43d85a 100644
+--- a/drivers/net/wireless/ath/ath9k/beacon.c
++++ b/drivers/net/wireless/ath/ath9k/beacon.c
+@@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
+       ds = bf->bf_desc;
+       flags = ATH9K_TXDESC_NOACK;
+-      if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
+-           (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) &&
+-          (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
+-              ds->ds_link = bf->bf_daddr; /* self-linked */
+-              flags |= ATH9K_TXDESC_VEOL;
+-              /* Let hardware handle antenna switching. */
+-              antenna = 0;
+-      } else {
+-              ds->ds_link = 0;
+-              /*
+-               * Switch antenna every beacon.
+-               * Should only switch every beacon period, not for every SWBA
+-               * XXX assumes two antennae
+-               */
+-              antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
+-      }
++      ds->ds_link = 0;
++      /*
++       * Switch antenna every beacon.
++       * Should only switch every beacon period, not for every SWBA
++       * XXX assumes two antennae
++       */
++      antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
+       sband = &sc->sbands[common->hw->conf.channel->band];
+       rate = sband->bitrates[rateidx].hw_value;
+@@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
+       return bf;
+ }
+-/*
+- * Startup beacon transmission for adhoc mode when they are sent entirely
+- * by the hardware using the self-linked descriptor + veol trick.
+-*/
+-static void ath_beacon_start_adhoc(struct ath_softc *sc,
+-                                 struct ieee80211_vif *vif)
+-{
+-      struct ath_hw *ah = sc->sc_ah;
+-      struct ath_common *common = ath9k_hw_common(ah);
+-      struct ath_buf *bf;
+-      struct ath_vif *avp;
+-      struct sk_buff *skb;
+-
+-      avp = (void *)vif->drv_priv;
+-
+-      if (avp->av_bcbuf == NULL)
+-              return;
+-
+-      bf = avp->av_bcbuf;
+-      skb = bf->bf_mpdu;
+-
+-      ath_beacon_setup(sc, avp, bf, 0);
+-
+-      /* NB: caller is known to have already stopped tx dma */
+-      ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
+-      ath9k_hw_txstart(ah, sc->beacon.beaconq);
+-      ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n",
+-                sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc);
+-}
+-
+ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
+ {
+       struct ath_softc *sc = aphy->sc;
+@@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
+               list_del(&avp->av_bcbuf->list);
+               if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
+-                  !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
++                  sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC ||
++                  sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) {
+                       int slot;
+                       /*
+                        * Assign the vif to a beacon xmit slot. As
+@@ -715,8 +677,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
+        * self-linked tx descriptor and let the hardware deal with things.
+        */
+       intval |= ATH9K_BEACON_ENA;
+-      if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
+-              ah->imask |= ATH9K_INT_SWBA;
++      ah->imask |= ATH9K_INT_SWBA;
+       ath_beaconq_config(sc);
+@@ -726,10 +687,6 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
+       ath9k_beacon_init(sc, nexttbtt, intval);
+       sc->beacon.bmisscnt = 0;
+       ath9k_hw_set_interrupts(ah, ah->imask);
+-
+-      /* FIXME: Handle properly when vif is NULL */
+-      if (vif && ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
+-              ath_beacon_start_adhoc(sc, vif);
+ }
+ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch b/linux-next-pending/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch
deleted file mode 100644 (file)
index 0058398..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-From 6e0f085930fb2df6d2c5701741fcf88b0381a144 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Thu, 13 May 2010 20:37:25 +0200
-Subject: [PATCH 12/19] ath9k: remove VEOL support for ad-hoc
-
-With VEOL, Beacon transmission in ad-hoc does not currently work.
-I believe for larger ad-hoc networks, VEOL is too unreliable, as
-it can get beacon transmissions stuck during synchronization.
-Use SWBA based beacon trasmission similar to AP mode instead.
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
- drivers/net/wireless/ath/ath9k/beacon.c |   63 +++++--------------------------
- 1 files changed, 10 insertions(+), 53 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_
-       ds = bf->bf_desc;
-       flags = ATH9K_TXDESC_NOACK;
--      if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
--           (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) &&
--          (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
--              ds->ds_link = bf->bf_daddr; /* self-linked */
--              flags |= ATH9K_TXDESC_VEOL;
--              /* Let hardware handle antenna switching. */
--              antenna = 0;
--      } else {
--              ds->ds_link = 0;
--              /*
--               * Switch antenna every beacon.
--               * Should only switch every beacon period, not for every SWBA
--               * XXX assumes two antennae
--               */
--              antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
--      }
-+      ds->ds_link = 0;
-+      /*
-+       * Switch antenna every beacon.
-+       * Should only switch every beacon period, not for every SWBA
-+       * XXX assumes two antennae
-+       */
-+      antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
-       sband = &sc->sbands[common->hw->conf.channel->band];
-       rate = sband->bitrates[rateidx].hw_value;
-@@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_genera
-       return bf;
- }
--/*
-- * Startup beacon transmission for adhoc mode when they are sent entirely
-- * by the hardware using the self-linked descriptor + veol trick.
--*/
--static void ath_beacon_start_adhoc(struct ath_softc *sc,
--                                 struct ieee80211_vif *vif)
--{
--      struct ath_hw *ah = sc->sc_ah;
--      struct ath_common *common = ath9k_hw_common(ah);
--      struct ath_buf *bf;
--      struct ath_vif *avp;
--      struct sk_buff *skb;
--
--      avp = (void *)vif->drv_priv;
--
--      if (avp->av_bcbuf == NULL)
--              return;
--
--      bf = avp->av_bcbuf;
--      skb = bf->bf_mpdu;
--
--      ath_beacon_setup(sc, avp, bf, 0);
--
--      /* NB: caller is known to have already stopped tx dma */
--      ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
--      ath9k_hw_txstart(ah, sc->beacon.beaconq);
--      ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n",
--                sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc);
--}
--
- int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
- {
-       struct ath_softc *sc = aphy->sc;
-@@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *a
-               list_del(&avp->av_bcbuf->list);
-               if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
--                  !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
-+                  sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC ||
-+                  sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) {
-                       int slot;
-                       /*
-                        * Assign the vif to a beacon xmit slot. As
-@@ -715,8 +677,7 @@ static void ath_beacon_config_adhoc(stru
-        * self-linked tx descriptor and let the hardware deal with things.
-        */
-       intval |= ATH9K_BEACON_ENA;
--      if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
--              ah->imask |= ATH9K_INT_SWBA;
-+      ah->imask |= ATH9K_INT_SWBA;
-       ath_beaconq_config(sc);
-@@ -726,10 +687,6 @@ static void ath_beacon_config_adhoc(stru
-       ath9k_beacon_init(sc, nexttbtt, intval);
-       sc->beacon.bmisscnt = 0;
-       ath9k_hw_set_interrupts(ah, ah->imask);
--
--      /* FIXME: Handle properly when vif is NULL */
--      if (vif && ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
--              ath_beacon_start_adhoc(sc, vif);
- }
- void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
diff --git a/linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch b/linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch
new file mode 100644 (file)
index 0000000..579a04b
--- /dev/null
@@ -0,0 +1,75 @@
+From 540531543f239bf47822d9e70d4323f703525687 Mon Sep 17 00:00:00 2001
+From: Luis R. Rodriguez <lrodriguez@atheros.com>
+Date: Wed, 19 May 2010 13:42:44 -0700
+Subject: [PATCH 12/20] ath9k_hw: Enable TX IQ calibration on AR9003
+
+To enable it we now disable and re-enable the PHY chips
+after TX IQ calibration.
+
+Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/ar9003_calib.c |   10 ++++++----
+ drivers/net/wireless/ath/ath9k/hw.c           |    6 ------
+ drivers/net/wireless/ath/ath9k/hw.h           |    1 -
+ 3 files changed, 6 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+index 56a9e5f..5a06503 100644
+--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+@@ -739,6 +739,12 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
+        */
+       ar9003_hw_set_chain_masks(ah, 0x7, 0x7);
++      /* Do Tx IQ Calibration */
++      ar9003_hw_tx_iq_cal(ah);
++      REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
++      udelay(5);
++      REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
++
+       /* Calibrate the AGC */
+       REG_WRITE(ah, AR_PHY_AGC_CONTROL,
+                 REG_READ(ah, AR_PHY_AGC_CONTROL) |
+@@ -753,10 +759,6 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
+               return false;
+       }
+-      /* Do Tx IQ Calibration */
+-      if (ah->config.tx_iq_calibration)
+-              ar9003_hw_tx_iq_cal(ah);
+-
+       /* Revert chainmasks to their original values before NF cal */
+       ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
+diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
+index b2301bd..1ded0b7 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -392,12 +392,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
+       ah->config.rx_intr_mitigation = true;
+       /*
+-       * Tx IQ Calibration (ah->config.tx_iq_calibration) is only
+-       * used by AR9003, but it is showing reliability issues.
+-       * It will take a while to fix so this is currently disabled.
+-       */
+-
+-      /*
+        * We need this for PCI devices only (Cardbus, PCI, miniPCI)
+        * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
+        * This means we use it for all AR5416 devices, and the few
+diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
+index 5cf0714..ba77506 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -263,7 +263,6 @@ struct ath9k_ops_config {
+ #define AR_BASE_FREQ_5GHZ     4900
+ #define AR_SPUR_FEEQ_BOUND_HT40 19
+ #define AR_SPUR_FEEQ_BOUND_HT20 10
+-      bool tx_iq_calibration; /* Only available for >= AR9003 */
+       int spurmode;
+       u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
+       u8 max_txtrig_level;
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch b/linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch
new file mode 100644 (file)
index 0000000..ec90e97
--- /dev/null
@@ -0,0 +1,610 @@
+From be5c86be802f5a9e6f6a2771e77d80d4c7d8924b Mon Sep 17 00:00:00 2001
+From: Sujith <Sujith.Manoharan@atheros.com>
+Date: Thu, 20 May 2010 15:34:38 +0530
+Subject: [PATCH 13/20] ath9k: Move ath9k specific RX code to driver
+
+This patch relocates RX processing code from the
+common module to ath9k. This reduces the size
+of the common module which is also used by ath9k_htc.
+
+Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/common.c |  264 ------------------------------
+ drivers/net/wireless/ath/ath9k/common.h |   13 --
+ drivers/net/wireless/ath/ath9k/recv.c   |  267 ++++++++++++++++++++++++++++++-
+ 3 files changed, 263 insertions(+), 281 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
+index 7707341..27f9ae5 100644
+--- a/drivers/net/wireless/ath/ath9k/common.c
++++ b/drivers/net/wireless/ath/ath9k/common.c
+@@ -27,270 +27,6 @@ MODULE_AUTHOR("Atheros Communications");
+ MODULE_DESCRIPTION("Shared library for Atheros wireless 802.11n LAN cards.");
+ MODULE_LICENSE("Dual BSD/GPL");
+-/* Common RX processing */
+-
+-/* Assumes you've already done the endian to CPU conversion */
+-static bool ath9k_rx_accept(struct ath_common *common,
+-                          struct sk_buff *skb,
+-                          struct ieee80211_rx_status *rxs,
+-                          struct ath_rx_status *rx_stats,
+-                          bool *decrypt_error)
+-{
+-      struct ath_hw *ah = common->ah;
+-      struct ieee80211_hdr *hdr;
+-      __le16 fc;
+-
+-      hdr = (struct ieee80211_hdr *) skb->data;
+-      fc = hdr->frame_control;
+-
+-      if (!rx_stats->rs_datalen)
+-              return false;
+-        /*
+-         * rs_status follows rs_datalen so if rs_datalen is too large
+-         * we can take a hint that hardware corrupted it, so ignore
+-         * those frames.
+-         */
+-      if (rx_stats->rs_datalen > common->rx_bufsize)
+-              return false;
+-
+-      /*
+-       * rs_more indicates chained descriptors which can be used
+-       * to link buffers together for a sort of scatter-gather
+-       * operation.
+-       * reject the frame, we don't support scatter-gather yet and
+-       * the frame is probably corrupt anyway
+-       */
+-      if (rx_stats->rs_more)
+-              return false;
+-
+-      /*
+-       * The rx_stats->rs_status will not be set until the end of the
+-       * chained descriptors so it can be ignored if rs_more is set. The
+-       * rs_more will be false at the last element of the chained
+-       * descriptors.
+-       */
+-      if (rx_stats->rs_status != 0) {
+-              if (rx_stats->rs_status & ATH9K_RXERR_CRC)
+-                      rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
+-              if (rx_stats->rs_status & ATH9K_RXERR_PHY)
+-                      return false;
+-
+-              if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
+-                      *decrypt_error = true;
+-              } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
+-                      if (ieee80211_is_ctl(fc))
+-                              /*
+-                               * Sometimes, we get invalid
+-                               * MIC failures on valid control frames.
+-                               * Remove these mic errors.
+-                               */
+-                              rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
+-                      else
+-                              rxs->flag |= RX_FLAG_MMIC_ERROR;
+-              }
+-              /*
+-               * Reject error frames with the exception of
+-               * decryption and MIC failures. For monitor mode,
+-               * we also ignore the CRC error.
+-               */
+-              if (ah->opmode == NL80211_IFTYPE_MONITOR) {
+-                      if (rx_stats->rs_status &
+-                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
+-                            ATH9K_RXERR_CRC))
+-                              return false;
+-              } else {
+-                      if (rx_stats->rs_status &
+-                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
+-                              return false;
+-                      }
+-              }
+-      }
+-      return true;
+-}
+-
+-static int ath9k_process_rate(struct ath_common *common,
+-                            struct ieee80211_hw *hw,
+-                            struct ath_rx_status *rx_stats,
+-                            struct ieee80211_rx_status *rxs,
+-                            struct sk_buff *skb)
+-{
+-      struct ieee80211_supported_band *sband;
+-      enum ieee80211_band band;
+-      unsigned int i = 0;
+-
+-      band = hw->conf.channel->band;
+-      sband = hw->wiphy->bands[band];
+-
+-      if (rx_stats->rs_rate & 0x80) {
+-              /* HT rate */
+-              rxs->flag |= RX_FLAG_HT;
+-              if (rx_stats->rs_flags & ATH9K_RX_2040)
+-                      rxs->flag |= RX_FLAG_40MHZ;
+-              if (rx_stats->rs_flags & ATH9K_RX_GI)
+-                      rxs->flag |= RX_FLAG_SHORT_GI;
+-              rxs->rate_idx = rx_stats->rs_rate & 0x7f;
+-              return 0;
+-      }
+-
+-      for (i = 0; i < sband->n_bitrates; i++) {
+-              if (sband->bitrates[i].hw_value == rx_stats->rs_rate) {
+-                      rxs->rate_idx = i;
+-                      return 0;
+-              }
+-              if (sband->bitrates[i].hw_value_short == rx_stats->rs_rate) {
+-                      rxs->flag |= RX_FLAG_SHORTPRE;
+-                      rxs->rate_idx = i;
+-                      return 0;
+-              }
+-      }
+-
+-      /*
+-       * No valid hardware bitrate found -- we should not get here
+-       * because hardware has already validated this frame as OK.
+-       */
+-      ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
+-                "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
+-      if ((common->debug_mask & ATH_DBG_XMIT))
+-              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
+-
+-      return -EINVAL;
+-}
+-
+-static void ath9k_process_rssi(struct ath_common *common,
+-                             struct ieee80211_hw *hw,
+-                             struct sk_buff *skb,
+-                             struct ath_rx_status *rx_stats)
+-{
+-      struct ath_hw *ah = common->ah;
+-      struct ieee80211_sta *sta;
+-      struct ieee80211_hdr *hdr;
+-      struct ath_node *an;
+-      int last_rssi = ATH_RSSI_DUMMY_MARKER;
+-      __le16 fc;
+-
+-      hdr = (struct ieee80211_hdr *)skb->data;
+-      fc = hdr->frame_control;
+-
+-      rcu_read_lock();
+-      /*
+-       * XXX: use ieee80211_find_sta! This requires quite a bit of work
+-       * under the current ath9k virtual wiphy implementation as we have
+-       * no way of tying a vif to wiphy. Typically vifs are attached to
+-       * at least one sdata of a wiphy on mac80211 but with ath9k virtual
+-       * wiphy you'd have to iterate over every wiphy and each sdata.
+-       */
+-      sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);
+-      if (sta) {
+-              an = (struct ath_node *) sta->drv_priv;
+-              if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
+-                 !rx_stats->rs_moreaggr)
+-                      ATH_RSSI_LPF(an->last_rssi, rx_stats->rs_rssi);
+-              last_rssi = an->last_rssi;
+-      }
+-      rcu_read_unlock();
+-
+-      if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
+-              rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
+-                                            ATH_RSSI_EP_MULTIPLIER);
+-      if (rx_stats->rs_rssi < 0)
+-              rx_stats->rs_rssi = 0;
+-
+-      /* Update Beacon RSSI, this is used by ANI. */
+-      if (ieee80211_is_beacon(fc))
+-              ah->stats.avgbrssi = rx_stats->rs_rssi;
+-}
+-
+-/*
+- * For Decrypt or Demic errors, we only mark packet status here and always push
+- * up the frame up to let mac80211 handle the actual error case, be it no
+- * decryption key or real decryption error. This let us keep statistics there.
+- */
+-int ath9k_cmn_rx_skb_preprocess(struct ath_common *common,
+-                              struct ieee80211_hw *hw,
+-                              struct sk_buff *skb,
+-                              struct ath_rx_status *rx_stats,
+-                              struct ieee80211_rx_status *rx_status,
+-                              bool *decrypt_error)
+-{
+-      struct ath_hw *ah = common->ah;
+-
+-      memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
+-
+-      /*
+-       * everything but the rate is checked here, the rate check is done
+-       * separately to avoid doing two lookups for a rate for each frame.
+-       */
+-      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
+-              return -EINVAL;
+-
+-      ath9k_process_rssi(common, hw, skb, rx_stats);
+-
+-      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
+-              return -EINVAL;
+-
+-      rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
+-      rx_status->band = hw->conf.channel->band;
+-      rx_status->freq = hw->conf.channel->center_freq;
+-      rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
+-      rx_status->antenna = rx_stats->rs_antenna;
+-      rx_status->flag |= RX_FLAG_TSFT;
+-
+-      return 0;
+-}
+-EXPORT_SYMBOL(ath9k_cmn_rx_skb_preprocess);
+-
+-void ath9k_cmn_rx_skb_postprocess(struct ath_common *common,
+-                                struct sk_buff *skb,
+-                                struct ath_rx_status *rx_stats,
+-                                struct ieee80211_rx_status *rxs,
+-                                bool decrypt_error)
+-{
+-      struct ath_hw *ah = common->ah;
+-      struct ieee80211_hdr *hdr;
+-      int hdrlen, padpos, padsize;
+-      u8 keyix;
+-      __le16 fc;
+-
+-      /* see if any padding is done by the hw and remove it */
+-      hdr = (struct ieee80211_hdr *) skb->data;
+-      hdrlen = ieee80211_get_hdrlen_from_skb(skb);
+-      fc = hdr->frame_control;
+-      padpos = ath9k_cmn_padpos(hdr->frame_control);
+-
+-      /* The MAC header is padded to have 32-bit boundary if the
+-       * packet payload is non-zero. The general calculation for
+-       * padsize would take into account odd header lengths:
+-       * padsize = (4 - padpos % 4) % 4; However, since only
+-       * even-length headers are used, padding can only be 0 or 2
+-       * bytes and we can optimize this a bit. In addition, we must
+-       * not try to remove padding from short control frames that do
+-       * not have payload. */
+-      padsize = padpos & 3;
+-      if (padsize && skb->len>=padpos+padsize+FCS_LEN) {
+-              memmove(skb->data + padsize, skb->data, padpos);
+-              skb_pull(skb, padsize);
+-      }
+-
+-      keyix = rx_stats->rs_keyix;
+-
+-      if (!(keyix == ATH9K_RXKEYIX_INVALID) && !decrypt_error &&
+-          ieee80211_has_protected(fc)) {
+-              rxs->flag |= RX_FLAG_DECRYPTED;
+-      } else if (ieee80211_has_protected(fc)
+-                 && !decrypt_error && skb->len >= hdrlen + 4) {
+-              keyix = skb->data[hdrlen + 3] >> 6;
+-
+-              if (test_bit(keyix, common->keymap))
+-                      rxs->flag |= RX_FLAG_DECRYPTED;
+-      }
+-      if (ah->sw_mgmt_crypto &&
+-          (rxs->flag & RX_FLAG_DECRYPTED) &&
+-          ieee80211_is_mgmt(fc))
+-              /* Use software decrypt for management frames. */
+-              rxs->flag &= ~RX_FLAG_DECRYPTED;
+-}
+-EXPORT_SYMBOL(ath9k_cmn_rx_skb_postprocess);
+-
+ int ath9k_cmn_padpos(__le16 frame_control)
+ {
+       int padpos = 24;
+diff --git a/drivers/net/wireless/ath/ath9k/common.h b/drivers/net/wireless/ath/ath9k/common.h
+index e08f7e5..1e6f360 100644
+--- a/drivers/net/wireless/ath/ath9k/common.h
++++ b/drivers/net/wireless/ath/ath9k/common.h
+@@ -115,19 +115,6 @@ struct ath_node {
+       int last_rssi;
+ };
+-int ath9k_cmn_rx_skb_preprocess(struct ath_common *common,
+-                              struct ieee80211_hw *hw,
+-                              struct sk_buff *skb,
+-                              struct ath_rx_status *rx_stats,
+-                              struct ieee80211_rx_status *rx_status,
+-                              bool *decrypt_error);
+-
+-void ath9k_cmn_rx_skb_postprocess(struct ath_common *common,
+-                                struct sk_buff *skb,
+-                                struct ath_rx_status *rx_stats,
+-                                struct ieee80211_rx_status *rxs,
+-                                bool decrypt_error);
+-
+ int ath9k_cmn_padpos(__le16 frame_control);
+ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
+ void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
+diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
+index 90c3e0e..d5b3ea7 100644
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -824,6 +824,265 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc,
+       return bf;
+ }
++/* Assumes you've already done the endian to CPU conversion */
++static bool ath9k_rx_accept(struct ath_common *common,
++                          struct sk_buff *skb,
++                          struct ieee80211_rx_status *rxs,
++                          struct ath_rx_status *rx_stats,
++                          bool *decrypt_error)
++{
++      struct ath_hw *ah = common->ah;
++      struct ieee80211_hdr *hdr;
++      __le16 fc;
++
++      hdr = (struct ieee80211_hdr *) skb->data;
++      fc = hdr->frame_control;
++
++      if (!rx_stats->rs_datalen)
++              return false;
++        /*
++         * rs_status follows rs_datalen so if rs_datalen is too large
++         * we can take a hint that hardware corrupted it, so ignore
++         * those frames.
++         */
++      if (rx_stats->rs_datalen > common->rx_bufsize)
++              return false;
++
++      /*
++       * rs_more indicates chained descriptors which can be used
++       * to link buffers together for a sort of scatter-gather
++       * operation.
++       * reject the frame, we don't support scatter-gather yet and
++       * the frame is probably corrupt anyway
++       */
++      if (rx_stats->rs_more)
++              return false;
++
++      /*
++       * The rx_stats->rs_status will not be set until the end of the
++       * chained descriptors so it can be ignored if rs_more is set. The
++       * rs_more will be false at the last element of the chained
++       * descriptors.
++       */
++      if (rx_stats->rs_status != 0) {
++              if (rx_stats->rs_status & ATH9K_RXERR_CRC)
++                      rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
++              if (rx_stats->rs_status & ATH9K_RXERR_PHY)
++                      return false;
++
++              if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
++                      *decrypt_error = true;
++              } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
++                      if (ieee80211_is_ctl(fc))
++                              /*
++                               * Sometimes, we get invalid
++                               * MIC failures on valid control frames.
++                               * Remove these mic errors.
++                               */
++                              rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
++                      else
++                              rxs->flag |= RX_FLAG_MMIC_ERROR;
++              }
++              /*
++               * Reject error frames with the exception of
++               * decryption and MIC failures. For monitor mode,
++               * we also ignore the CRC error.
++               */
++              if (ah->opmode == NL80211_IFTYPE_MONITOR) {
++                      if (rx_stats->rs_status &
++                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
++                            ATH9K_RXERR_CRC))
++                              return false;
++              } else {
++                      if (rx_stats->rs_status &
++                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
++                              return false;
++                      }
++              }
++      }
++      return true;
++}
++
++static int ath9k_process_rate(struct ath_common *common,
++                            struct ieee80211_hw *hw,
++                            struct ath_rx_status *rx_stats,
++                            struct ieee80211_rx_status *rxs,
++                            struct sk_buff *skb)
++{
++      struct ieee80211_supported_band *sband;
++      enum ieee80211_band band;
++      unsigned int i = 0;
++
++      band = hw->conf.channel->band;
++      sband = hw->wiphy->bands[band];
++
++      if (rx_stats->rs_rate & 0x80) {
++              /* HT rate */
++              rxs->flag |= RX_FLAG_HT;
++              if (rx_stats->rs_flags & ATH9K_RX_2040)
++                      rxs->flag |= RX_FLAG_40MHZ;
++              if (rx_stats->rs_flags & ATH9K_RX_GI)
++                      rxs->flag |= RX_FLAG_SHORT_GI;
++              rxs->rate_idx = rx_stats->rs_rate & 0x7f;
++              return 0;
++      }
++
++      for (i = 0; i < sband->n_bitrates; i++) {
++              if (sband->bitrates[i].hw_value == rx_stats->rs_rate) {
++                      rxs->rate_idx = i;
++                      return 0;
++              }
++              if (sband->bitrates[i].hw_value_short == rx_stats->rs_rate) {
++                      rxs->flag |= RX_FLAG_SHORTPRE;
++                      rxs->rate_idx = i;
++                      return 0;
++              }
++      }
++
++      /*
++       * No valid hardware bitrate found -- we should not get here
++       * because hardware has already validated this frame as OK.
++       */
++      ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
++                "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
++      if ((common->debug_mask & ATH_DBG_XMIT))
++              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
++
++      return -EINVAL;
++}
++
++static void ath9k_process_rssi(struct ath_common *common,
++                             struct ieee80211_hw *hw,
++                             struct sk_buff *skb,
++                             struct ath_rx_status *rx_stats)
++{
++      struct ath_hw *ah = common->ah;
++      struct ieee80211_sta *sta;
++      struct ieee80211_hdr *hdr;
++      struct ath_node *an;
++      int last_rssi = ATH_RSSI_DUMMY_MARKER;
++      __le16 fc;
++
++      hdr = (struct ieee80211_hdr *)skb->data;
++      fc = hdr->frame_control;
++
++      rcu_read_lock();
++      /*
++       * XXX: use ieee80211_find_sta! This requires quite a bit of work
++       * under the current ath9k virtual wiphy implementation as we have
++       * no way of tying a vif to wiphy. Typically vifs are attached to
++       * at least one sdata of a wiphy on mac80211 but with ath9k virtual
++       * wiphy you'd have to iterate over every wiphy and each sdata.
++       */
++      sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);
++      if (sta) {
++              an = (struct ath_node *) sta->drv_priv;
++              if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
++                 !rx_stats->rs_moreaggr)
++                      ATH_RSSI_LPF(an->last_rssi, rx_stats->rs_rssi);
++              last_rssi = an->last_rssi;
++      }
++      rcu_read_unlock();
++
++      if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
++              rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
++                                            ATH_RSSI_EP_MULTIPLIER);
++      if (rx_stats->rs_rssi < 0)
++              rx_stats->rs_rssi = 0;
++
++      /* Update Beacon RSSI, this is used by ANI. */
++      if (ieee80211_is_beacon(fc))
++              ah->stats.avgbrssi = rx_stats->rs_rssi;
++}
++
++/*
++ * For Decrypt or Demic errors, we only mark packet status here and always push
++ * up the frame up to let mac80211 handle the actual error case, be it no
++ * decryption key or real decryption error. This let us keep statistics there.
++ */
++static int ath9k_rx_skb_preprocess(struct ath_common *common,
++                                 struct ieee80211_hw *hw,
++                                 struct sk_buff *skb,
++                                 struct ath_rx_status *rx_stats,
++                                 struct ieee80211_rx_status *rx_status,
++                                 bool *decrypt_error)
++{
++      struct ath_hw *ah = common->ah;
++
++      memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
++
++      /*
++       * everything but the rate is checked here, the rate check is done
++       * separately to avoid doing two lookups for a rate for each frame.
++       */
++      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
++              return -EINVAL;
++
++      ath9k_process_rssi(common, hw, skb, rx_stats);
++
++      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
++              return -EINVAL;
++
++      rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
++      rx_status->band = hw->conf.channel->band;
++      rx_status->freq = hw->conf.channel->center_freq;
++      rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
++      rx_status->antenna = rx_stats->rs_antenna;
++      rx_status->flag |= RX_FLAG_TSFT;
++
++      return 0;
++}
++
++static void ath9k_rx_skb_postprocess(struct ath_common *common,
++                                   struct sk_buff *skb,
++                                   struct ath_rx_status *rx_stats,
++                                   struct ieee80211_rx_status *rxs,
++                                   bool decrypt_error)
++{
++      struct ath_hw *ah = common->ah;
++      struct ieee80211_hdr *hdr;
++      int hdrlen, padpos, padsize;
++      u8 keyix;
++      __le16 fc;
++
++      /* see if any padding is done by the hw and remove it */
++      hdr = (struct ieee80211_hdr *) skb->data;
++      hdrlen = ieee80211_get_hdrlen_from_skb(skb);
++      fc = hdr->frame_control;
++      padpos = ath9k_cmn_padpos(hdr->frame_control);
++
++      /* The MAC header is padded to have 32-bit boundary if the
++       * packet payload is non-zero. The general calculation for
++       * padsize would take into account odd header lengths:
++       * padsize = (4 - padpos % 4) % 4; However, since only
++       * even-length headers are used, padding can only be 0 or 2
++       * bytes and we can optimize this a bit. In addition, we must
++       * not try to remove padding from short control frames that do
++       * not have payload. */
++      padsize = padpos & 3;
++      if (padsize && skb->len>=padpos+padsize+FCS_LEN) {
++              memmove(skb->data + padsize, skb->data, padpos);
++              skb_pull(skb, padsize);
++      }
++
++      keyix = rx_stats->rs_keyix;
++
++      if (!(keyix == ATH9K_RXKEYIX_INVALID) && !decrypt_error &&
++          ieee80211_has_protected(fc)) {
++              rxs->flag |= RX_FLAG_DECRYPTED;
++      } else if (ieee80211_has_protected(fc)
++                 && !decrypt_error && skb->len >= hdrlen + 4) {
++              keyix = skb->data[hdrlen + 3] >> 6;
++
++              if (test_bit(keyix, common->keymap))
++                      rxs->flag |= RX_FLAG_DECRYPTED;
++      }
++      if (ah->sw_mgmt_crypto &&
++          (rxs->flag & RX_FLAG_DECRYPTED) &&
++          ieee80211_is_mgmt(fc))
++              /* Use software decrypt for management frames. */
++              rxs->flag &= ~RX_FLAG_DECRYPTED;
++}
+ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+ {
+@@ -886,8 +1145,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+               if (flush)
+                       goto requeue;
+-              retval = ath9k_cmn_rx_skb_preprocess(common, hw, skb, &rs,
+-                                                   rxs, &decrypt_error);
++              retval = ath9k_rx_skb_preprocess(common, hw, skb, &rs,
++                                               rxs, &decrypt_error);
+               if (retval)
+                       goto requeue;
+@@ -911,8 +1170,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+               if (ah->caps.rx_status_len)
+                       skb_pull(skb, ah->caps.rx_status_len);
+-              ath9k_cmn_rx_skb_postprocess(common, skb, &rs,
+-                                           rxs, decrypt_error);
++              ath9k_rx_skb_postprocess(common, skb, &rs,
++                                       rxs, decrypt_error);
+               /* We will now give hardware our shiny new allocated skb */
+               bf->bf_mpdu = requeue_skb;
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch b/linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch
new file mode 100644 (file)
index 0000000..7727712
--- /dev/null
@@ -0,0 +1,166 @@
+From e171efcee117cd713e58334b0d82fb5e612888e4 Mon Sep 17 00:00:00 2001
+From: Sujith <Sujith.Manoharan@atheros.com>
+Date: Thu, 20 May 2010 17:23:19 +0530
+Subject: [PATCH 14/20] ath9k: Move driver specific structures
+
+A bunch of data structures are present in the
+common module, which are internal to ath9k.
+Move them to ath9k.h
+
+Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/ath9k.h  |   63 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ath/ath9k/common.h |   63 -------------------------------
+ 2 files changed, 63 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
+index fbb7dec..cc6ea42 100644
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -206,6 +206,69 @@ struct ath_txq {
+       u8 txq_tailidx;
+ };
++struct ath_atx_ac {
++      int sched;
++      int qnum;
++      struct list_head list;
++      struct list_head tid_q;
++};
++
++struct ath_buf_state {
++      int bfs_nframes;
++      u16 bfs_al;
++      u16 bfs_frmlen;
++      int bfs_seqno;
++      int bfs_tidno;
++      int bfs_retries;
++      u8 bf_type;
++      u32 bfs_keyix;
++      enum ath9k_key_type bfs_keytype;
++};
++
++struct ath_buf {
++      struct list_head list;
++      struct ath_buf *bf_lastbf;      /* last buf of this unit (a frame or
++                                         an aggregate) */
++      struct ath_buf *bf_next;        /* next subframe in the aggregate */
++      struct sk_buff *bf_mpdu;        /* enclosing frame structure */
++      void *bf_desc;                  /* virtual addr of desc */
++      dma_addr_t bf_daddr;            /* physical addr of desc */
++      dma_addr_t bf_buf_addr;         /* physical addr of data buffer */
++      bool bf_stale;
++      bool bf_isnullfunc;
++      bool bf_tx_aborted;
++      u16 bf_flags;
++      struct ath_buf_state bf_state;
++      dma_addr_t bf_dmacontext;
++      struct ath_wiphy *aphy;
++};
++
++struct ath_atx_tid {
++      struct list_head list;
++      struct list_head buf_q;
++      struct ath_node *an;
++      struct ath_atx_ac *ac;
++      struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
++      u16 seq_start;
++      u16 seq_next;
++      u16 baw_size;
++      int tidno;
++      int baw_head;   /* first un-acked tx buffer */
++      int baw_tail;   /* next unused tx buffer slot */
++      int sched;
++      int paused;
++      u8 state;
++};
++
++struct ath_node {
++      struct ath_common *common;
++      struct ath_atx_tid tid[WME_NUM_TID];
++      struct ath_atx_ac ac[WME_NUM_AC];
++      u16 maxampdu;
++      u8 mpdudensity;
++      int last_rssi;
++};
++
+ #define AGGR_CLEANUP         BIT(1)
+ #define AGGR_ADDBA_COMPLETE  BIT(2)
+ #define AGGR_ADDBA_PROGRESS  BIT(3)
+diff --git a/drivers/net/wireless/ath/ath9k/common.h b/drivers/net/wireless/ath/ath9k/common.h
+index 1e6f360..283cca8 100644
+--- a/drivers/net/wireless/ath/ath9k/common.h
++++ b/drivers/net/wireless/ath/ath9k/common.h
+@@ -52,69 +52,6 @@
+ #define ATH_EP_RND(x, mul)                                            \
+       ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
+-struct ath_atx_ac {
+-      int sched;
+-      int qnum;
+-      struct list_head list;
+-      struct list_head tid_q;
+-};
+-
+-struct ath_buf_state {
+-      int bfs_nframes;
+-      u16 bfs_al;
+-      u16 bfs_frmlen;
+-      int bfs_seqno;
+-      int bfs_tidno;
+-      int bfs_retries;
+-      u8 bf_type;
+-      u32 bfs_keyix;
+-      enum ath9k_key_type bfs_keytype;
+-};
+-
+-struct ath_buf {
+-      struct list_head list;
+-      struct ath_buf *bf_lastbf;      /* last buf of this unit (a frame or
+-                                         an aggregate) */
+-      struct ath_buf *bf_next;        /* next subframe in the aggregate */
+-      struct sk_buff *bf_mpdu;        /* enclosing frame structure */
+-      void *bf_desc;                  /* virtual addr of desc */
+-      dma_addr_t bf_daddr;            /* physical addr of desc */
+-      dma_addr_t bf_buf_addr;         /* physical addr of data buffer */
+-      bool bf_stale;
+-      bool bf_isnullfunc;
+-      bool bf_tx_aborted;
+-      u16 bf_flags;
+-      struct ath_buf_state bf_state;
+-      dma_addr_t bf_dmacontext;
+-      struct ath_wiphy *aphy;
+-};
+-
+-struct ath_atx_tid {
+-      struct list_head list;
+-      struct list_head buf_q;
+-      struct ath_node *an;
+-      struct ath_atx_ac *ac;
+-      struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
+-      u16 seq_start;
+-      u16 seq_next;
+-      u16 baw_size;
+-      int tidno;
+-      int baw_head;   /* first un-acked tx buffer */
+-      int baw_tail;   /* next unused tx buffer slot */
+-      int sched;
+-      int paused;
+-      u8 state;
+-};
+-
+-struct ath_node {
+-      struct ath_common *common;
+-      struct ath_atx_tid tid[WME_NUM_TID];
+-      struct ath_atx_ac ac[WME_NUM_AC];
+-      u16 maxampdu;
+-      u8 mpdudensity;
+-      int last_rssi;
+-};
+-
+ int ath9k_cmn_padpos(__le16 frame_control);
+ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
+ void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch b/linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch
deleted file mode 100644 (file)
index 9ba25a8..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From 5d182a53ed8099361d98f88fbed64726b3ad3dc4 Mon Sep 17 00:00:00 2001
-From: Luis R. Rodriguez <lrodriguez@atheros.com>
-Date: Wed, 19 May 2010 13:42:44 -0700
-Subject: [PATCH 14/19] ath9k_hw: Enable TX IQ calibration on AR9003
-
-To enable it we now disable and re-enable the PHY chips
-after TX IQ calibration.
-
-Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
----
- drivers/net/wireless/ath/ath9k/ar9003_calib.c |   10 ++++++----
- drivers/net/wireless/ath/ath9k/hw.c           |    6 ------
- drivers/net/wireless/ath/ath9k/hw.h           |    1 -
- 3 files changed, 6 insertions(+), 11 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-@@ -739,6 +739,12 @@ static bool ar9003_hw_init_cal(struct at
-        */
-       ar9003_hw_set_chain_masks(ah, 0x7, 0x7);
-+      /* Do Tx IQ Calibration */
-+      ar9003_hw_tx_iq_cal(ah);
-+      REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
-+      udelay(5);
-+      REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
-+
-       /* Calibrate the AGC */
-       REG_WRITE(ah, AR_PHY_AGC_CONTROL,
-                 REG_READ(ah, AR_PHY_AGC_CONTROL) |
-@@ -753,10 +759,6 @@ static bool ar9003_hw_init_cal(struct at
-               return false;
-       }
--      /* Do Tx IQ Calibration */
--      if (ah->config.tx_iq_calibration)
--              ar9003_hw_tx_iq_cal(ah);
--
-       /* Revert chainmasks to their original values before NF cal */
-       ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -392,12 +392,6 @@ static void ath9k_hw_init_config(struct 
-       ah->config.rx_intr_mitigation = true;
-       /*
--       * Tx IQ Calibration (ah->config.tx_iq_calibration) is only
--       * used by AR9003, but it is showing reliability issues.
--       * It will take a while to fix so this is currently disabled.
--       */
--
--      /*
-        * We need this for PCI devices only (Cardbus, PCI, miniPCI)
-        * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
-        * This means we use it for all AR5416 devices, and the few
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -263,7 +263,6 @@ struct ath9k_ops_config {
- #define AR_BASE_FREQ_5GHZ     4900
- #define AR_SPUR_FEEQ_BOUND_HT40 19
- #define AR_SPUR_FEEQ_BOUND_HT20 10
--      bool tx_iq_calibration; /* Only available for >= AR9003 */
-       int spurmode;
-       u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
-       u8 max_txtrig_level;
diff --git a/linux-next-pending/0015-ath9k-Clean-up-few-function-parameters-in-recv.c.patch b/linux-next-pending/0015-ath9k-Clean-up-few-function-parameters-in-recv.c.patch
new file mode 100644 (file)
index 0000000..1e1a882
--- /dev/null
@@ -0,0 +1,110 @@
+From 9165102f082775f29be69c0956ae6eccb636e18b Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Thu, 20 May 2010 14:34:46 -0700
+Subject: [PATCH 15/20] ath9k: Clean up few function parameters in recv.c
+
+ath9k_rx_skb_preprocess() needs only ieee80211 frame header,
+pass only frame headers instead of skb to that function. Also
+remove ineffective frame dump in ath9k_process_rate().
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/recv.c |   23 ++++++++---------------
+ 1 files changed, 8 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
+index d5b3ea7..48049f8 100644
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -826,16 +826,14 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc,
+ /* Assumes you've already done the endian to CPU conversion */
+ static bool ath9k_rx_accept(struct ath_common *common,
+-                          struct sk_buff *skb,
++                          struct ieee80211_hdr *hdr,
+                           struct ieee80211_rx_status *rxs,
+                           struct ath_rx_status *rx_stats,
+                           bool *decrypt_error)
+ {
+       struct ath_hw *ah = common->ah;
+-      struct ieee80211_hdr *hdr;
+       __le16 fc;
+-      hdr = (struct ieee80211_hdr *) skb->data;
+       fc = hdr->frame_control;
+       if (!rx_stats->rs_datalen)
+@@ -906,8 +904,7 @@ static bool ath9k_rx_accept(struct ath_common *common,
+ static int ath9k_process_rate(struct ath_common *common,
+                             struct ieee80211_hw *hw,
+                             struct ath_rx_status *rx_stats,
+-                            struct ieee80211_rx_status *rxs,
+-                            struct sk_buff *skb)
++                            struct ieee80211_rx_status *rxs)
+ {
+       struct ieee80211_supported_band *sband;
+       enum ieee80211_band band;
+@@ -945,25 +942,21 @@ static int ath9k_process_rate(struct ath_common *common,
+        */
+       ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
+                 "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
+-      if ((common->debug_mask & ATH_DBG_XMIT))
+-              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
+       return -EINVAL;
+ }
+ static void ath9k_process_rssi(struct ath_common *common,
+                              struct ieee80211_hw *hw,
+-                             struct sk_buff *skb,
++                             struct ieee80211_hdr *hdr,
+                              struct ath_rx_status *rx_stats)
+ {
+       struct ath_hw *ah = common->ah;
+       struct ieee80211_sta *sta;
+-      struct ieee80211_hdr *hdr;
+       struct ath_node *an;
+       int last_rssi = ATH_RSSI_DUMMY_MARKER;
+       __le16 fc;
+-      hdr = (struct ieee80211_hdr *)skb->data;
+       fc = hdr->frame_control;
+       rcu_read_lock();
+@@ -1002,7 +995,7 @@ static void ath9k_process_rssi(struct ath_common *common,
+  */
+ static int ath9k_rx_skb_preprocess(struct ath_common *common,
+                                  struct ieee80211_hw *hw,
+-                                 struct sk_buff *skb,
++                                 struct ieee80211_hdr *hdr,
+                                  struct ath_rx_status *rx_stats,
+                                  struct ieee80211_rx_status *rx_status,
+                                  bool *decrypt_error)
+@@ -1015,12 +1008,12 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
+        * everything but the rate is checked here, the rate check is done
+        * separately to avoid doing two lookups for a rate for each frame.
+        */
+-      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
++      if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error))
+               return -EINVAL;
+-      ath9k_process_rssi(common, hw, skb, rx_stats);
++      ath9k_process_rssi(common, hw, hdr, rx_stats);
+-      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
++      if (ath9k_process_rate(common, hw, rx_stats, rx_status))
+               return -EINVAL;
+       rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
+@@ -1145,7 +1138,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+               if (flush)
+                       goto requeue;
+-              retval = ath9k_rx_skb_preprocess(common, hw, skb, &rs,
++              retval = ath9k_rx_skb_preprocess(common, hw, hdr, &rs,
+                                                rxs, &decrypt_error);
+               if (retval)
+                       goto requeue;
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch b/linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch
deleted file mode 100644 (file)
index 7a4b5e4..0000000
+++ /dev/null
@@ -1,601 +0,0 @@
-From fdeff77508aed952a3b3f42484db09d4e8728bbb Mon Sep 17 00:00:00 2001
-From: Sujith <Sujith.Manoharan@atheros.com>
-Date: Thu, 20 May 2010 15:34:38 +0530
-Subject: [PATCH 15/19] ath9k: Move ath9k specific RX code to driver
-
-This patch relocates RX processing code from the
-common module to ath9k. This reduces the size
-of the common module which is also used by ath9k_htc.
-
-Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
----
- drivers/net/wireless/ath/ath9k/common.c |  264 ------------------------------
- drivers/net/wireless/ath/ath9k/common.h |   13 --
- drivers/net/wireless/ath/ath9k/recv.c   |  267 ++++++++++++++++++++++++++++++-
- 3 files changed, 263 insertions(+), 281 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/common.c
-+++ b/drivers/net/wireless/ath/ath9k/common.c
-@@ -27,270 +27,6 @@ MODULE_AUTHOR("Atheros Communications");
- MODULE_DESCRIPTION("Shared library for Atheros wireless 802.11n LAN cards.");
- MODULE_LICENSE("Dual BSD/GPL");
--/* Common RX processing */
--
--/* Assumes you've already done the endian to CPU conversion */
--static bool ath9k_rx_accept(struct ath_common *common,
--                          struct sk_buff *skb,
--                          struct ieee80211_rx_status *rxs,
--                          struct ath_rx_status *rx_stats,
--                          bool *decrypt_error)
--{
--      struct ath_hw *ah = common->ah;
--      struct ieee80211_hdr *hdr;
--      __le16 fc;
--
--      hdr = (struct ieee80211_hdr *) skb->data;
--      fc = hdr->frame_control;
--
--      if (!rx_stats->rs_datalen)
--              return false;
--        /*
--         * rs_status follows rs_datalen so if rs_datalen is too large
--         * we can take a hint that hardware corrupted it, so ignore
--         * those frames.
--         */
--      if (rx_stats->rs_datalen > common->rx_bufsize)
--              return false;
--
--      /*
--       * rs_more indicates chained descriptors which can be used
--       * to link buffers together for a sort of scatter-gather
--       * operation.
--       * reject the frame, we don't support scatter-gather yet and
--       * the frame is probably corrupt anyway
--       */
--      if (rx_stats->rs_more)
--              return false;
--
--      /*
--       * The rx_stats->rs_status will not be set until the end of the
--       * chained descriptors so it can be ignored if rs_more is set. The
--       * rs_more will be false at the last element of the chained
--       * descriptors.
--       */
--      if (rx_stats->rs_status != 0) {
--              if (rx_stats->rs_status & ATH9K_RXERR_CRC)
--                      rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
--              if (rx_stats->rs_status & ATH9K_RXERR_PHY)
--                      return false;
--
--              if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
--                      *decrypt_error = true;
--              } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
--                      if (ieee80211_is_ctl(fc))
--                              /*
--                               * Sometimes, we get invalid
--                               * MIC failures on valid control frames.
--                               * Remove these mic errors.
--                               */
--                              rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
--                      else
--                              rxs->flag |= RX_FLAG_MMIC_ERROR;
--              }
--              /*
--               * Reject error frames with the exception of
--               * decryption and MIC failures. For monitor mode,
--               * we also ignore the CRC error.
--               */
--              if (ah->opmode == NL80211_IFTYPE_MONITOR) {
--                      if (rx_stats->rs_status &
--                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
--                            ATH9K_RXERR_CRC))
--                              return false;
--              } else {
--                      if (rx_stats->rs_status &
--                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
--                              return false;
--                      }
--              }
--      }
--      return true;
--}
--
--static int ath9k_process_rate(struct ath_common *common,
--                            struct ieee80211_hw *hw,
--                            struct ath_rx_status *rx_stats,
--                            struct ieee80211_rx_status *rxs,
--                            struct sk_buff *skb)
--{
--      struct ieee80211_supported_band *sband;
--      enum ieee80211_band band;
--      unsigned int i = 0;
--
--      band = hw->conf.channel->band;
--      sband = hw->wiphy->bands[band];
--
--      if (rx_stats->rs_rate & 0x80) {
--              /* HT rate */
--              rxs->flag |= RX_FLAG_HT;
--              if (rx_stats->rs_flags & ATH9K_RX_2040)
--                      rxs->flag |= RX_FLAG_40MHZ;
--              if (rx_stats->rs_flags & ATH9K_RX_GI)
--                      rxs->flag |= RX_FLAG_SHORT_GI;
--              rxs->rate_idx = rx_stats->rs_rate & 0x7f;
--              return 0;
--      }
--
--      for (i = 0; i < sband->n_bitrates; i++) {
--              if (sband->bitrates[i].hw_value == rx_stats->rs_rate) {
--                      rxs->rate_idx = i;
--                      return 0;
--              }
--              if (sband->bitrates[i].hw_value_short == rx_stats->rs_rate) {
--                      rxs->flag |= RX_FLAG_SHORTPRE;
--                      rxs->rate_idx = i;
--                      return 0;
--              }
--      }
--
--      /*
--       * No valid hardware bitrate found -- we should not get here
--       * because hardware has already validated this frame as OK.
--       */
--      ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
--                "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
--      if ((common->debug_mask & ATH_DBG_XMIT))
--              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
--
--      return -EINVAL;
--}
--
--static void ath9k_process_rssi(struct ath_common *common,
--                             struct ieee80211_hw *hw,
--                             struct sk_buff *skb,
--                             struct ath_rx_status *rx_stats)
--{
--      struct ath_hw *ah = common->ah;
--      struct ieee80211_sta *sta;
--      struct ieee80211_hdr *hdr;
--      struct ath_node *an;
--      int last_rssi = ATH_RSSI_DUMMY_MARKER;
--      __le16 fc;
--
--      hdr = (struct ieee80211_hdr *)skb->data;
--      fc = hdr->frame_control;
--
--      rcu_read_lock();
--      /*
--       * XXX: use ieee80211_find_sta! This requires quite a bit of work
--       * under the current ath9k virtual wiphy implementation as we have
--       * no way of tying a vif to wiphy. Typically vifs are attached to
--       * at least one sdata of a wiphy on mac80211 but with ath9k virtual
--       * wiphy you'd have to iterate over every wiphy and each sdata.
--       */
--      sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);
--      if (sta) {
--              an = (struct ath_node *) sta->drv_priv;
--              if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
--                 !rx_stats->rs_moreaggr)
--                      ATH_RSSI_LPF(an->last_rssi, rx_stats->rs_rssi);
--              last_rssi = an->last_rssi;
--      }
--      rcu_read_unlock();
--
--      if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
--              rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
--                                            ATH_RSSI_EP_MULTIPLIER);
--      if (rx_stats->rs_rssi < 0)
--              rx_stats->rs_rssi = 0;
--
--      /* Update Beacon RSSI, this is used by ANI. */
--      if (ieee80211_is_beacon(fc))
--              ah->stats.avgbrssi = rx_stats->rs_rssi;
--}
--
--/*
-- * For Decrypt or Demic errors, we only mark packet status here and always push
-- * up the frame up to let mac80211 handle the actual error case, be it no
-- * decryption key or real decryption error. This let us keep statistics there.
-- */
--int ath9k_cmn_rx_skb_preprocess(struct ath_common *common,
--                              struct ieee80211_hw *hw,
--                              struct sk_buff *skb,
--                              struct ath_rx_status *rx_stats,
--                              struct ieee80211_rx_status *rx_status,
--                              bool *decrypt_error)
--{
--      struct ath_hw *ah = common->ah;
--
--      memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
--
--      /*
--       * everything but the rate is checked here, the rate check is done
--       * separately to avoid doing two lookups for a rate for each frame.
--       */
--      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
--              return -EINVAL;
--
--      ath9k_process_rssi(common, hw, skb, rx_stats);
--
--      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
--              return -EINVAL;
--
--      rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
--      rx_status->band = hw->conf.channel->band;
--      rx_status->freq = hw->conf.channel->center_freq;
--      rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
--      rx_status->antenna = rx_stats->rs_antenna;
--      rx_status->flag |= RX_FLAG_TSFT;
--
--      return 0;
--}
--EXPORT_SYMBOL(ath9k_cmn_rx_skb_preprocess);
--
--void ath9k_cmn_rx_skb_postprocess(struct ath_common *common,
--                                struct sk_buff *skb,
--                                struct ath_rx_status *rx_stats,
--                                struct ieee80211_rx_status *rxs,
--                                bool decrypt_error)
--{
--      struct ath_hw *ah = common->ah;
--      struct ieee80211_hdr *hdr;
--      int hdrlen, padpos, padsize;
--      u8 keyix;
--      __le16 fc;
--
--      /* see if any padding is done by the hw and remove it */
--      hdr = (struct ieee80211_hdr *) skb->data;
--      hdrlen = ieee80211_get_hdrlen_from_skb(skb);
--      fc = hdr->frame_control;
--      padpos = ath9k_cmn_padpos(hdr->frame_control);
--
--      /* The MAC header is padded to have 32-bit boundary if the
--       * packet payload is non-zero. The general calculation for
--       * padsize would take into account odd header lengths:
--       * padsize = (4 - padpos % 4) % 4; However, since only
--       * even-length headers are used, padding can only be 0 or 2
--       * bytes and we can optimize this a bit. In addition, we must
--       * not try to remove padding from short control frames that do
--       * not have payload. */
--      padsize = padpos & 3;
--      if (padsize && skb->len>=padpos+padsize+FCS_LEN) {
--              memmove(skb->data + padsize, skb->data, padpos);
--              skb_pull(skb, padsize);
--      }
--
--      keyix = rx_stats->rs_keyix;
--
--      if (!(keyix == ATH9K_RXKEYIX_INVALID) && !decrypt_error &&
--          ieee80211_has_protected(fc)) {
--              rxs->flag |= RX_FLAG_DECRYPTED;
--      } else if (ieee80211_has_protected(fc)
--                 && !decrypt_error && skb->len >= hdrlen + 4) {
--              keyix = skb->data[hdrlen + 3] >> 6;
--
--              if (test_bit(keyix, common->keymap))
--                      rxs->flag |= RX_FLAG_DECRYPTED;
--      }
--      if (ah->sw_mgmt_crypto &&
--          (rxs->flag & RX_FLAG_DECRYPTED) &&
--          ieee80211_is_mgmt(fc))
--              /* Use software decrypt for management frames. */
--              rxs->flag &= ~RX_FLAG_DECRYPTED;
--}
--EXPORT_SYMBOL(ath9k_cmn_rx_skb_postprocess);
--
- int ath9k_cmn_padpos(__le16 frame_control)
- {
-       int padpos = 24;
---- a/drivers/net/wireless/ath/ath9k/common.h
-+++ b/drivers/net/wireless/ath/ath9k/common.h
-@@ -115,19 +115,6 @@ struct ath_node {
-       int last_rssi;
- };
--int ath9k_cmn_rx_skb_preprocess(struct ath_common *common,
--                              struct ieee80211_hw *hw,
--                              struct sk_buff *skb,
--                              struct ath_rx_status *rx_stats,
--                              struct ieee80211_rx_status *rx_status,
--                              bool *decrypt_error);
--
--void ath9k_cmn_rx_skb_postprocess(struct ath_common *common,
--                                struct sk_buff *skb,
--                                struct ath_rx_status *rx_stats,
--                                struct ieee80211_rx_status *rxs,
--                                bool decrypt_error);
--
- int ath9k_cmn_padpos(__le16 frame_control);
- int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
- void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -821,6 +821,265 @@ static struct ath_buf *ath_get_next_rx_b
-       return bf;
- }
-+/* Assumes you've already done the endian to CPU conversion */
-+static bool ath9k_rx_accept(struct ath_common *common,
-+                          struct sk_buff *skb,
-+                          struct ieee80211_rx_status *rxs,
-+                          struct ath_rx_status *rx_stats,
-+                          bool *decrypt_error)
-+{
-+      struct ath_hw *ah = common->ah;
-+      struct ieee80211_hdr *hdr;
-+      __le16 fc;
-+
-+      hdr = (struct ieee80211_hdr *) skb->data;
-+      fc = hdr->frame_control;
-+
-+      if (!rx_stats->rs_datalen)
-+              return false;
-+        /*
-+         * rs_status follows rs_datalen so if rs_datalen is too large
-+         * we can take a hint that hardware corrupted it, so ignore
-+         * those frames.
-+         */
-+      if (rx_stats->rs_datalen > common->rx_bufsize)
-+              return false;
-+
-+      /*
-+       * rs_more indicates chained descriptors which can be used
-+       * to link buffers together for a sort of scatter-gather
-+       * operation.
-+       * reject the frame, we don't support scatter-gather yet and
-+       * the frame is probably corrupt anyway
-+       */
-+      if (rx_stats->rs_more)
-+              return false;
-+
-+      /*
-+       * The rx_stats->rs_status will not be set until the end of the
-+       * chained descriptors so it can be ignored if rs_more is set. The
-+       * rs_more will be false at the last element of the chained
-+       * descriptors.
-+       */
-+      if (rx_stats->rs_status != 0) {
-+              if (rx_stats->rs_status & ATH9K_RXERR_CRC)
-+                      rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
-+              if (rx_stats->rs_status & ATH9K_RXERR_PHY)
-+                      return false;
-+
-+              if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
-+                      *decrypt_error = true;
-+              } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
-+                      if (ieee80211_is_ctl(fc))
-+                              /*
-+                               * Sometimes, we get invalid
-+                               * MIC failures on valid control frames.
-+                               * Remove these mic errors.
-+                               */
-+                              rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
-+                      else
-+                              rxs->flag |= RX_FLAG_MMIC_ERROR;
-+              }
-+              /*
-+               * Reject error frames with the exception of
-+               * decryption and MIC failures. For monitor mode,
-+               * we also ignore the CRC error.
-+               */
-+              if (ah->opmode == NL80211_IFTYPE_MONITOR) {
-+                      if (rx_stats->rs_status &
-+                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
-+                            ATH9K_RXERR_CRC))
-+                              return false;
-+              } else {
-+                      if (rx_stats->rs_status &
-+                          ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
-+                              return false;
-+                      }
-+              }
-+      }
-+      return true;
-+}
-+
-+static int ath9k_process_rate(struct ath_common *common,
-+                            struct ieee80211_hw *hw,
-+                            struct ath_rx_status *rx_stats,
-+                            struct ieee80211_rx_status *rxs,
-+                            struct sk_buff *skb)
-+{
-+      struct ieee80211_supported_band *sband;
-+      enum ieee80211_band band;
-+      unsigned int i = 0;
-+
-+      band = hw->conf.channel->band;
-+      sband = hw->wiphy->bands[band];
-+
-+      if (rx_stats->rs_rate & 0x80) {
-+              /* HT rate */
-+              rxs->flag |= RX_FLAG_HT;
-+              if (rx_stats->rs_flags & ATH9K_RX_2040)
-+                      rxs->flag |= RX_FLAG_40MHZ;
-+              if (rx_stats->rs_flags & ATH9K_RX_GI)
-+                      rxs->flag |= RX_FLAG_SHORT_GI;
-+              rxs->rate_idx = rx_stats->rs_rate & 0x7f;
-+              return 0;
-+      }
-+
-+      for (i = 0; i < sband->n_bitrates; i++) {
-+              if (sband->bitrates[i].hw_value == rx_stats->rs_rate) {
-+                      rxs->rate_idx = i;
-+                      return 0;
-+              }
-+              if (sband->bitrates[i].hw_value_short == rx_stats->rs_rate) {
-+                      rxs->flag |= RX_FLAG_SHORTPRE;
-+                      rxs->rate_idx = i;
-+                      return 0;
-+              }
-+      }
-+
-+      /*
-+       * No valid hardware bitrate found -- we should not get here
-+       * because hardware has already validated this frame as OK.
-+       */
-+      ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
-+                "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
-+      if ((common->debug_mask & ATH_DBG_XMIT))
-+              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
-+
-+      return -EINVAL;
-+}
-+
-+static void ath9k_process_rssi(struct ath_common *common,
-+                             struct ieee80211_hw *hw,
-+                             struct sk_buff *skb,
-+                             struct ath_rx_status *rx_stats)
-+{
-+      struct ath_hw *ah = common->ah;
-+      struct ieee80211_sta *sta;
-+      struct ieee80211_hdr *hdr;
-+      struct ath_node *an;
-+      int last_rssi = ATH_RSSI_DUMMY_MARKER;
-+      __le16 fc;
-+
-+      hdr = (struct ieee80211_hdr *)skb->data;
-+      fc = hdr->frame_control;
-+
-+      rcu_read_lock();
-+      /*
-+       * XXX: use ieee80211_find_sta! This requires quite a bit of work
-+       * under the current ath9k virtual wiphy implementation as we have
-+       * no way of tying a vif to wiphy. Typically vifs are attached to
-+       * at least one sdata of a wiphy on mac80211 but with ath9k virtual
-+       * wiphy you'd have to iterate over every wiphy and each sdata.
-+       */
-+      sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);
-+      if (sta) {
-+              an = (struct ath_node *) sta->drv_priv;
-+              if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
-+                 !rx_stats->rs_moreaggr)
-+                      ATH_RSSI_LPF(an->last_rssi, rx_stats->rs_rssi);
-+              last_rssi = an->last_rssi;
-+      }
-+      rcu_read_unlock();
-+
-+      if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
-+              rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
-+                                            ATH_RSSI_EP_MULTIPLIER);
-+      if (rx_stats->rs_rssi < 0)
-+              rx_stats->rs_rssi = 0;
-+
-+      /* Update Beacon RSSI, this is used by ANI. */
-+      if (ieee80211_is_beacon(fc))
-+              ah->stats.avgbrssi = rx_stats->rs_rssi;
-+}
-+
-+/*
-+ * For Decrypt or Demic errors, we only mark packet status here and always push
-+ * up the frame up to let mac80211 handle the actual error case, be it no
-+ * decryption key or real decryption error. This let us keep statistics there.
-+ */
-+static int ath9k_rx_skb_preprocess(struct ath_common *common,
-+                                 struct ieee80211_hw *hw,
-+                                 struct sk_buff *skb,
-+                                 struct ath_rx_status *rx_stats,
-+                                 struct ieee80211_rx_status *rx_status,
-+                                 bool *decrypt_error)
-+{
-+      struct ath_hw *ah = common->ah;
-+
-+      memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
-+
-+      /*
-+       * everything but the rate is checked here, the rate check is done
-+       * separately to avoid doing two lookups for a rate for each frame.
-+       */
-+      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
-+              return -EINVAL;
-+
-+      ath9k_process_rssi(common, hw, skb, rx_stats);
-+
-+      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
-+              return -EINVAL;
-+
-+      rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
-+      rx_status->band = hw->conf.channel->band;
-+      rx_status->freq = hw->conf.channel->center_freq;
-+      rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
-+      rx_status->antenna = rx_stats->rs_antenna;
-+      rx_status->flag |= RX_FLAG_TSFT;
-+
-+      return 0;
-+}
-+
-+static void ath9k_rx_skb_postprocess(struct ath_common *common,
-+                                   struct sk_buff *skb,
-+                                   struct ath_rx_status *rx_stats,
-+                                   struct ieee80211_rx_status *rxs,
-+                                   bool decrypt_error)
-+{
-+      struct ath_hw *ah = common->ah;
-+      struct ieee80211_hdr *hdr;
-+      int hdrlen, padpos, padsize;
-+      u8 keyix;
-+      __le16 fc;
-+
-+      /* see if any padding is done by the hw and remove it */
-+      hdr = (struct ieee80211_hdr *) skb->data;
-+      hdrlen = ieee80211_get_hdrlen_from_skb(skb);
-+      fc = hdr->frame_control;
-+      padpos = ath9k_cmn_padpos(hdr->frame_control);
-+
-+      /* The MAC header is padded to have 32-bit boundary if the
-+       * packet payload is non-zero. The general calculation for
-+       * padsize would take into account odd header lengths:
-+       * padsize = (4 - padpos % 4) % 4; However, since only
-+       * even-length headers are used, padding can only be 0 or 2
-+       * bytes and we can optimize this a bit. In addition, we must
-+       * not try to remove padding from short control frames that do
-+       * not have payload. */
-+      padsize = padpos & 3;
-+      if (padsize && skb->len>=padpos+padsize+FCS_LEN) {
-+              memmove(skb->data + padsize, skb->data, padpos);
-+              skb_pull(skb, padsize);
-+      }
-+
-+      keyix = rx_stats->rs_keyix;
-+
-+      if (!(keyix == ATH9K_RXKEYIX_INVALID) && !decrypt_error &&
-+          ieee80211_has_protected(fc)) {
-+              rxs->flag |= RX_FLAG_DECRYPTED;
-+      } else if (ieee80211_has_protected(fc)
-+                 && !decrypt_error && skb->len >= hdrlen + 4) {
-+              keyix = skb->data[hdrlen + 3] >> 6;
-+
-+              if (test_bit(keyix, common->keymap))
-+                      rxs->flag |= RX_FLAG_DECRYPTED;
-+      }
-+      if (ah->sw_mgmt_crypto &&
-+          (rxs->flag & RX_FLAG_DECRYPTED) &&
-+          ieee80211_is_mgmt(fc))
-+              /* Use software decrypt for management frames. */
-+              rxs->flag &= ~RX_FLAG_DECRYPTED;
-+}
- int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
- {
-@@ -883,8 +1142,8 @@ int ath_rx_tasklet(struct ath_softc *sc,
-               if (flush)
-                       goto requeue;
--              retval = ath9k_cmn_rx_skb_preprocess(common, hw, skb, &rs,
--                                                   rxs, &decrypt_error);
-+              retval = ath9k_rx_skb_preprocess(common, hw, skb, &rs,
-+                                               rxs, &decrypt_error);
-               if (retval)
-                       goto requeue;
-@@ -908,8 +1167,8 @@ int ath_rx_tasklet(struct ath_softc *sc,
-               if (ah->caps.rx_status_len)
-                       skb_pull(skb, ah->caps.rx_status_len);
--              ath9k_cmn_rx_skb_postprocess(common, skb, &rs,
--                                           rxs, decrypt_error);
-+              ath9k_rx_skb_postprocess(common, skb, &rs,
-+                                       rxs, decrypt_error);
-               /* We will now give hardware our shiny new allocated skb */
-               bf->bf_mpdu = requeue_skb;
diff --git a/linux-next-pending/0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch b/linux-next-pending/0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch
new file mode 100644 (file)
index 0000000..169c318
--- /dev/null
@@ -0,0 +1,37 @@
+From fd45dc3316a3ccaa961ce9835ca21c705956d1dd Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Thu, 20 May 2010 14:47:28 -0700
+Subject: [PATCH 16/20] ath9k: Fix bug in accessing skb->data of rx frame for edma
+
+Skip the rx status portion in skb->data before accessing ieee80211
+frame header.
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/recv.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
+index 48049f8..e8eb15f 100644
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -1097,6 +1097,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+       enum ath9k_rx_qtype qtype;
+       bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
+       int dma_type;
++      u8 rx_status_len = ah->caps.rx_status_len;
+       if (edma)
+               dma_type = DMA_FROM_DEVICE;
+@@ -1124,7 +1125,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
+               if (!skb)
+                       continue;
+-              hdr = (struct ieee80211_hdr *) skb->data;
++              hdr = (struct ieee80211_hdr *) (skb->data + rx_status_len);
+               rxs =  IEEE80211_SKB_RXCB(skb);
+               hw = ath_get_virt_hw(sc, hdr);
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0016-ath9k-Move-driver-specific-structures.patch b/linux-next-pending/0016-ath9k-Move-driver-specific-structures.patch
deleted file mode 100644 (file)
index aa85b80..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-From af9b87568dbd2c07ac41e0c6ae9037526b15712d Mon Sep 17 00:00:00 2001
-From: Sujith <Sujith.Manoharan@atheros.com>
-Date: Thu, 20 May 2010 17:23:19 +0530
-Subject: [PATCH 16/19] ath9k: Move driver specific structures
-
-A bunch of data structures are present in the
-common module, which are internal to ath9k.
-Move them to ath9k.h
-
-Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
----
- drivers/net/wireless/ath/ath9k/ath9k.h  |   63 +++++++++++++++++++++++++++++++
- drivers/net/wireless/ath/ath9k/common.h |   63 -------------------------------
- 2 files changed, 63 insertions(+), 63 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -206,6 +206,69 @@ struct ath_txq {
-       u8 txq_tailidx;
- };
-+struct ath_atx_ac {
-+      int sched;
-+      int qnum;
-+      struct list_head list;
-+      struct list_head tid_q;
-+};
-+
-+struct ath_buf_state {
-+      int bfs_nframes;
-+      u16 bfs_al;
-+      u16 bfs_frmlen;
-+      int bfs_seqno;
-+      int bfs_tidno;
-+      int bfs_retries;
-+      u8 bf_type;
-+      u32 bfs_keyix;
-+      enum ath9k_key_type bfs_keytype;
-+};
-+
-+struct ath_buf {
-+      struct list_head list;
-+      struct ath_buf *bf_lastbf;      /* last buf of this unit (a frame or
-+                                         an aggregate) */
-+      struct ath_buf *bf_next;        /* next subframe in the aggregate */
-+      struct sk_buff *bf_mpdu;        /* enclosing frame structure */
-+      void *bf_desc;                  /* virtual addr of desc */
-+      dma_addr_t bf_daddr;            /* physical addr of desc */
-+      dma_addr_t bf_buf_addr;         /* physical addr of data buffer */
-+      bool bf_stale;
-+      bool bf_isnullfunc;
-+      bool bf_tx_aborted;
-+      u16 bf_flags;
-+      struct ath_buf_state bf_state;
-+      dma_addr_t bf_dmacontext;
-+      struct ath_wiphy *aphy;
-+};
-+
-+struct ath_atx_tid {
-+      struct list_head list;
-+      struct list_head buf_q;
-+      struct ath_node *an;
-+      struct ath_atx_ac *ac;
-+      struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
-+      u16 seq_start;
-+      u16 seq_next;
-+      u16 baw_size;
-+      int tidno;
-+      int baw_head;   /* first un-acked tx buffer */
-+      int baw_tail;   /* next unused tx buffer slot */
-+      int sched;
-+      int paused;
-+      u8 state;
-+};
-+
-+struct ath_node {
-+      struct ath_common *common;
-+      struct ath_atx_tid tid[WME_NUM_TID];
-+      struct ath_atx_ac ac[WME_NUM_AC];
-+      u16 maxampdu;
-+      u8 mpdudensity;
-+      int last_rssi;
-+};
-+
- #define AGGR_CLEANUP         BIT(1)
- #define AGGR_ADDBA_COMPLETE  BIT(2)
- #define AGGR_ADDBA_PROGRESS  BIT(3)
---- a/drivers/net/wireless/ath/ath9k/common.h
-+++ b/drivers/net/wireless/ath/ath9k/common.h
-@@ -52,69 +52,6 @@
- #define ATH_EP_RND(x, mul)                                            \
-       ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
--struct ath_atx_ac {
--      int sched;
--      int qnum;
--      struct list_head list;
--      struct list_head tid_q;
--};
--
--struct ath_buf_state {
--      int bfs_nframes;
--      u16 bfs_al;
--      u16 bfs_frmlen;
--      int bfs_seqno;
--      int bfs_tidno;
--      int bfs_retries;
--      u8 bf_type;
--      u32 bfs_keyix;
--      enum ath9k_key_type bfs_keytype;
--};
--
--struct ath_buf {
--      struct list_head list;
--      struct ath_buf *bf_lastbf;      /* last buf of this unit (a frame or
--                                         an aggregate) */
--      struct ath_buf *bf_next;        /* next subframe in the aggregate */
--      struct sk_buff *bf_mpdu;        /* enclosing frame structure */
--      void *bf_desc;                  /* virtual addr of desc */
--      dma_addr_t bf_daddr;            /* physical addr of desc */
--      dma_addr_t bf_buf_addr;         /* physical addr of data buffer */
--      bool bf_stale;
--      bool bf_isnullfunc;
--      bool bf_tx_aborted;
--      u16 bf_flags;
--      struct ath_buf_state bf_state;
--      dma_addr_t bf_dmacontext;
--      struct ath_wiphy *aphy;
--};
--
--struct ath_atx_tid {
--      struct list_head list;
--      struct list_head buf_q;
--      struct ath_node *an;
--      struct ath_atx_ac *ac;
--      struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
--      u16 seq_start;
--      u16 seq_next;
--      u16 baw_size;
--      int tidno;
--      int baw_head;   /* first un-acked tx buffer */
--      int baw_tail;   /* next unused tx buffer slot */
--      int sched;
--      int paused;
--      u8 state;
--};
--
--struct ath_node {
--      struct ath_common *common;
--      struct ath_atx_tid tid[WME_NUM_TID];
--      struct ath_atx_ac ac[WME_NUM_AC];
--      u16 maxampdu;
--      u8 mpdudensity;
--      int last_rssi;
--};
--
- int ath9k_cmn_padpos(__le16 frame_control);
- int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
- void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
diff --git a/linux-next-pending/0017-ath9k-Clean-up-few-function-parameters-in-recv.c.patch b/linux-next-pending/0017-ath9k-Clean-up-few-function-parameters-in-recv.c.patch
deleted file mode 100644 (file)
index 3f2e03c..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From fead6bb5090ec7db68831d6bd9503dec2f10057f Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Thu, 20 May 2010 14:34:46 -0700
-Subject: [PATCH 17/19] ath9k: Clean up few function parameters in recv.c
-
-ath9k_rx_skb_preprocess() needs only ieee80211 frame header,
-pass only frame headers instead of skb to that function. Also
-remove ineffective frame dump in ath9k_process_rate().
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/recv.c |   23 ++++++++---------------
- 1 files changed, 8 insertions(+), 15 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -823,16 +823,14 @@ static struct ath_buf *ath_get_next_rx_b
- /* Assumes you've already done the endian to CPU conversion */
- static bool ath9k_rx_accept(struct ath_common *common,
--                          struct sk_buff *skb,
-+                          struct ieee80211_hdr *hdr,
-                           struct ieee80211_rx_status *rxs,
-                           struct ath_rx_status *rx_stats,
-                           bool *decrypt_error)
- {
-       struct ath_hw *ah = common->ah;
--      struct ieee80211_hdr *hdr;
-       __le16 fc;
--      hdr = (struct ieee80211_hdr *) skb->data;
-       fc = hdr->frame_control;
-       if (!rx_stats->rs_datalen)
-@@ -903,8 +901,7 @@ static bool ath9k_rx_accept(struct ath_c
- static int ath9k_process_rate(struct ath_common *common,
-                             struct ieee80211_hw *hw,
-                             struct ath_rx_status *rx_stats,
--                            struct ieee80211_rx_status *rxs,
--                            struct sk_buff *skb)
-+                            struct ieee80211_rx_status *rxs)
- {
-       struct ieee80211_supported_band *sband;
-       enum ieee80211_band band;
-@@ -942,25 +939,21 @@ static int ath9k_process_rate(struct ath
-        */
-       ath_print(common, ATH_DBG_XMIT, "unsupported hw bitrate detected "
-                 "0x%02x using 1 Mbit\n", rx_stats->rs_rate);
--      if ((common->debug_mask & ATH_DBG_XMIT))
--              print_hex_dump_bytes("", DUMP_PREFIX_NONE, skb->data, skb->len);
-       return -EINVAL;
- }
- static void ath9k_process_rssi(struct ath_common *common,
-                              struct ieee80211_hw *hw,
--                             struct sk_buff *skb,
-+                             struct ieee80211_hdr *hdr,
-                              struct ath_rx_status *rx_stats)
- {
-       struct ath_hw *ah = common->ah;
-       struct ieee80211_sta *sta;
--      struct ieee80211_hdr *hdr;
-       struct ath_node *an;
-       int last_rssi = ATH_RSSI_DUMMY_MARKER;
-       __le16 fc;
--      hdr = (struct ieee80211_hdr *)skb->data;
-       fc = hdr->frame_control;
-       rcu_read_lock();
-@@ -999,7 +992,7 @@ static void ath9k_process_rssi(struct at
-  */
- static int ath9k_rx_skb_preprocess(struct ath_common *common,
-                                  struct ieee80211_hw *hw,
--                                 struct sk_buff *skb,
-+                                 struct ieee80211_hdr *hdr,
-                                  struct ath_rx_status *rx_stats,
-                                  struct ieee80211_rx_status *rx_status,
-                                  bool *decrypt_error)
-@@ -1012,12 +1005,12 @@ static int ath9k_rx_skb_preprocess(struc
-        * everything but the rate is checked here, the rate check is done
-        * separately to avoid doing two lookups for a rate for each frame.
-        */
--      if (!ath9k_rx_accept(common, skb, rx_status, rx_stats, decrypt_error))
-+      if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error))
-               return -EINVAL;
--      ath9k_process_rssi(common, hw, skb, rx_stats);
-+      ath9k_process_rssi(common, hw, hdr, rx_stats);
--      if (ath9k_process_rate(common, hw, rx_stats, rx_status, skb))
-+      if (ath9k_process_rate(common, hw, rx_stats, rx_status))
-               return -EINVAL;
-       rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
-@@ -1142,7 +1135,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
-               if (flush)
-                       goto requeue;
--              retval = ath9k_rx_skb_preprocess(common, hw, skb, &rs,
-+              retval = ath9k_rx_skb_preprocess(common, hw, hdr, &rs,
-                                                rxs, &decrypt_error);
-               if (retval)
-                       goto requeue;
diff --git a/linux-next-pending/0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch b/linux-next-pending/0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch
new file mode 100644 (file)
index 0000000..d468551
--- /dev/null
@@ -0,0 +1,37 @@
+From 66b9e11d56da7b2b05871992f21aa1440294fcd6 Mon Sep 17 00:00:00 2001
+From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+Date: Thu, 20 May 2010 14:47:38 -0700
+Subject: [PATCH 17/20] ath9k: Fix bug in validating received data length for edma
+
+The rx status length should also be taken into account while
+validating the length of a received frame.
+
+Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
+---
+ drivers/net/wireless/ath/ath9k/recv.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
+index e8eb15f..777f6a3 100644
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -833,6 +833,7 @@ static bool ath9k_rx_accept(struct ath_common *common,
+ {
+       struct ath_hw *ah = common->ah;
+       __le16 fc;
++      u8 rx_status_len = ah->caps.rx_status_len;
+       fc = hdr->frame_control;
+@@ -843,7 +844,7 @@ static bool ath9k_rx_accept(struct ath_common *common,
+          * we can take a hint that hardware corrupted it, so ignore
+          * those frames.
+          */
+-      if (rx_stats->rs_datalen > common->rx_bufsize)
++      if (rx_stats->rs_datalen > (common->rx_bufsize - rx_status_len))
+               return false;
+       /*
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0018-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch b/linux-next-pending/0018-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch
deleted file mode 100644 (file)
index 14c7654..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-From b5a8d95359c518498d91d0c28673060d58d62d44 Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Thu, 20 May 2010 14:47:28 -0700
-Subject: [PATCH 18/19] ath9k: Fix bug in accessing skb->data of rx frame for edma
-
-Skip the rx status portion in skb->data before accessing ieee80211
-frame header.
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/recv.c |    3 ++-
- 1 files changed, 2 insertions(+), 1 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -1094,6 +1094,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
-       enum ath9k_rx_qtype qtype;
-       bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
-       int dma_type;
-+      u8 rx_status_len = ah->caps.rx_status_len;
-       if (edma)
-               dma_type = DMA_FROM_DEVICE;
-@@ -1121,7 +1122,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
-               if (!skb)
-                       continue;
--              hdr = (struct ieee80211_hdr *) skb->data;
-+              hdr = (struct ieee80211_hdr *) (skb->data + rx_status_len);
-               rxs =  IEEE80211_SKB_RXCB(skb);
-               hw = ath_get_virt_hw(sc, hdr);
diff --git a/linux-next-pending/0018-ath9k_hw-add-multicast-key-search-support.patch b/linux-next-pending/0018-ath9k_hw-add-multicast-key-search-support.patch
new file mode 100644 (file)
index 0000000..b60bfe6
--- /dev/null
@@ -0,0 +1,57 @@
+From af9f4737b9e305454f2c769565184ed105b618b8 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 25 May 2010 19:42:44 +0200
+Subject: [PATCH 18/20] ath9k_hw: add multicast key search support
+
+If a MAC address for a key table entry is flagged with the
+multicast bit (0x01), indicate to the hardware that multicast
+lookup instead of unicast lookup should be used. The multicast
+bit itself never makes it to the actual keytable entry register,
+as it is shifted out.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+ drivers/net/wireless/ath/ath9k/hw.c |   13 ++++++++++++-
+ 1 files changed, 12 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
+index 1ded0b7..e70d7fe 100644
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1485,6 +1485,7 @@ EXPORT_SYMBOL(ath9k_hw_keyreset);
+ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
+ {
+       u32 macHi, macLo;
++      u32 unicast_flag = AR_KEYTABLE_VALID;
+       if (entry >= ah->caps.keycache_size) {
+               ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
+@@ -1493,6 +1494,16 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
+       }
+       if (mac != NULL) {
++              /*
++               * AR_KEYTABLE_VALID indicates that the address is a unicast
++               * address, which must match the transmitter address for
++               * decrypting frames.
++               * Not setting this bit allows the hardware to use the key
++               * for multicast frame decryption.
++               */
++              if (mac[0] & 0x01)
++                      unicast_flag = 0;
++
+               macHi = (mac[5] << 8) | mac[4];
+               macLo = (mac[3] << 24) |
+                       (mac[2] << 16) |
+@@ -1505,7 +1516,7 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
+               macLo = macHi = 0;
+       }
+       REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo);
+-      REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | AR_KEYTABLE_VALID);
++      REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | unicast_flag);
+       return true;
+ }
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0019-ath9k-Fix-bug-in-validating-received-data-length-for.patch b/linux-next-pending/0019-ath9k-Fix-bug-in-validating-received-data-length-for.patch
deleted file mode 100644 (file)
index ec9b5df..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-From 4532fc82246270aba6d72ed89c76304652c8ddfe Mon Sep 17 00:00:00 2001
-From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
-Date: Thu, 20 May 2010 14:47:38 -0700
-Subject: [PATCH 19/19] ath9k: Fix bug in validating received data length for edma
-
-The rx status length should also be taken into account while
-validating the length of a received frame.
-
-Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
----
- drivers/net/wireless/ath/ath9k/recv.c |    3 ++-
- 1 files changed, 2 insertions(+), 1 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -830,6 +830,7 @@ static bool ath9k_rx_accept(struct ath_c
- {
-       struct ath_hw *ah = common->ah;
-       __le16 fc;
-+      u8 rx_status_len = ah->caps.rx_status_len;
-       fc = hdr->frame_control;
-@@ -840,7 +841,7 @@ static bool ath9k_rx_accept(struct ath_c
-          * we can take a hint that hardware corrupted it, so ignore
-          * those frames.
-          */
--      if (rx_stats->rs_datalen > common->rx_bufsize)
-+      if (rx_stats->rs_datalen > (common->rx_bufsize - rx_status_len))
-               return false;
-       /*
diff --git a/linux-next-pending/0019-ath9k_common-use-allocated-key-cache-entries-for-mul.patch b/linux-next-pending/0019-ath9k_common-use-allocated-key-cache-entries-for-mul.patch
new file mode 100644 (file)
index 0000000..8bca68b
--- /dev/null
@@ -0,0 +1,94 @@
+From 54866b981d1a7367a731b6057c02501e1fd32a13 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 25 May 2010 19:42:45 +0200
+Subject: [PATCH 19/20] ath9k_common: use allocated key cache entries for multi BSS crypto support
+
+This patch replaces the buggy 'ath9k: Group Key fix for VAPs' change.
+
+For AP mode group keys, use the BSSID as lookup mac address, with
+the multicast keysearch bit set.
+For IBSS mode, use the peer's MAC address with multicast keysearch.
+For STA mode, keep using the group key slots.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+ drivers/net/wireless/ath/ath9k/common.c |   37 ++++++++++++++++++++++--------
+ 1 files changed, 27 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
+index 27f9ae5..03590f0 100644
+--- a/drivers/net/wireless/ath/ath9k/common.c
++++ b/drivers/net/wireless/ath/ath9k/common.c
+@@ -211,10 +211,14 @@ static int ath_reserve_key_cache_slot_tkip(struct ath_common *common)
+       return -1;
+ }
+-static int ath_reserve_key_cache_slot(struct ath_common *common)
++static int ath_reserve_key_cache_slot(struct ath_common *common,
++                                    enum ieee80211_key_alg alg)
+ {
+       int i;
++      if (alg == ALG_TKIP)
++              return ath_reserve_key_cache_slot_tkip(common);
++
+       /* First, try to find slots that would not be available for TKIP. */
+       if (common->splitmic) {
+               for (i = IEEE80211_WEP_NKID; i < common->keymax / 4; i++) {
+@@ -283,6 +287,7 @@ int ath9k_cmn_key_config(struct ath_common *common,
+       struct ath_hw *ah = common->ah;
+       struct ath9k_keyval hk;
+       const u8 *mac = NULL;
++      u8 gmac[ETH_ALEN];
+       int ret = 0;
+       int idx;
+@@ -306,9 +311,23 @@ int ath9k_cmn_key_config(struct ath_common *common,
+       memcpy(hk.kv_val, key->key, key->keylen);
+       if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
+-              /* For now, use the default keys for broadcast keys. This may
+-               * need to change with virtual interfaces. */
+-              idx = key->keyidx;
++              switch (vif->type) {
++              case NL80211_IFTYPE_AP:
++                      memcpy(gmac, vif->addr, ETH_ALEN);
++                      gmac[0] |= 0x01;
++                      mac = gmac;
++                      idx = ath_reserve_key_cache_slot(common, key->alg);
++                      break;
++              case NL80211_IFTYPE_ADHOC:
++                      memcpy(gmac, sta->addr, ETH_ALEN);
++                      gmac[0] |= 0x01;
++                      mac = gmac;
++                      idx = ath_reserve_key_cache_slot(common, key->alg);
++                      break;
++              default:
++                      idx = key->keyidx;
++                      break;
++              }
+       } else if (key->keyidx) {
+               if (WARN_ON(!sta))
+                       return -EOPNOTSUPP;
+@@ -325,14 +344,12 @@ int ath9k_cmn_key_config(struct ath_common *common,
+                       return -EOPNOTSUPP;
+               mac = sta->addr;
+-              if (key->alg == ALG_TKIP)
+-                      idx = ath_reserve_key_cache_slot_tkip(common);
+-              else
+-                      idx = ath_reserve_key_cache_slot(common);
+-              if (idx < 0)
+-                      return -ENOSPC; /* no free key cache entries */
++              idx = ath_reserve_key_cache_slot(common, key->alg);
+       }
++      if (idx < 0)
++              return -ENOSPC; /* no free key cache entries */
++
+       if (key->alg == ALG_TKIP)
+               ret = ath_setkey_tkip(common, idx, key->key, &hk, mac,
+                                     vif->type == NL80211_IFTYPE_AP);
+-- 
+1.6.3.3
+
diff --git a/linux-next-pending/0020-ath9k-use-the-key-handling-code-from-ath9k_common-in.patch b/linux-next-pending/0020-ath9k-use-the-key-handling-code-from-ath9k_common-in.patch
new file mode 100644 (file)
index 0000000..71cf73e
--- /dev/null
@@ -0,0 +1,270 @@
+From 2ba6e72953b2b20be3682d2b30accd1b88857ea2 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 25 May 2010 19:42:46 +0200
+Subject: [PATCH 20/20] ath9k: use the key handling code from ath9k_common instead of duplicating it
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+ drivers/net/wireless/ath/ath9k/main.c |  232 +--------------------------------
+ 1 files changed, 2 insertions(+), 230 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
+index d6e8be0..120708d 100644
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -621,234 +621,6 @@ static u32 ath_get_extchanmode(struct ath_softc *sc,
+       return chanmode;
+ }
+-static int ath_setkey_tkip(struct ath_common *common, u16 keyix, const u8 *key,
+-                         struct ath9k_keyval *hk, const u8 *addr,
+-                         bool authenticator)
+-{
+-      struct ath_hw *ah = common->ah;
+-      const u8 *key_rxmic;
+-      const u8 *key_txmic;
+-
+-      key_txmic = key + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY;
+-      key_rxmic = key + NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY;
+-
+-      if (addr == NULL) {
+-              /*
+-               * Group key installation - only two key cache entries are used
+-               * regardless of splitmic capability since group key is only
+-               * used either for TX or RX.
+-               */
+-              if (authenticator) {
+-                      memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic));
+-                      memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_mic));
+-              } else {
+-                      memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
+-                      memcpy(hk->kv_txmic, key_rxmic, sizeof(hk->kv_mic));
+-              }
+-              return ath9k_hw_set_keycache_entry(ah, keyix, hk, addr);
+-      }
+-      if (!common->splitmic) {
+-              /* TX and RX keys share the same key cache entry. */
+-              memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
+-              memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_txmic));
+-              return ath9k_hw_set_keycache_entry(ah, keyix, hk, addr);
+-      }
+-
+-      /* Separate key cache entries for TX and RX */
+-
+-      /* TX key goes at first index, RX key at +32. */
+-      memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic));
+-      if (!ath9k_hw_set_keycache_entry(ah, keyix, hk, NULL)) {
+-              /* TX MIC entry failed. No need to proceed further */
+-              ath_print(common, ATH_DBG_FATAL,
+-                        "Setting TX MIC Key Failed\n");
+-              return 0;
+-      }
+-
+-      memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
+-      /* XXX delete tx key on failure? */
+-      return ath9k_hw_set_keycache_entry(ah, keyix + 32, hk, addr);
+-}
+-
+-static int ath_reserve_key_cache_slot_tkip(struct ath_common *common)
+-{
+-      int i;
+-
+-      for (i = IEEE80211_WEP_NKID; i < common->keymax / 2; i++) {
+-              if (test_bit(i, common->keymap) ||
+-                  test_bit(i + 64, common->keymap))
+-                      continue; /* At least one part of TKIP key allocated */
+-              if (common->splitmic &&
+-                  (test_bit(i + 32, common->keymap) ||
+-                   test_bit(i + 64 + 32, common->keymap)))
+-                      continue; /* At least one part of TKIP key allocated */
+-
+-              /* Found a free slot for a TKIP key */
+-              return i;
+-      }
+-      return -1;
+-}
+-
+-static int ath_reserve_key_cache_slot(struct ath_common *common)
+-{
+-      int i;
+-
+-      /* First, try to find slots that would not be available for TKIP. */
+-      if (common->splitmic) {
+-              for (i = IEEE80211_WEP_NKID; i < common->keymax / 4; i++) {
+-                      if (!test_bit(i, common->keymap) &&
+-                          (test_bit(i + 32, common->keymap) ||
+-                           test_bit(i + 64, common->keymap) ||
+-                           test_bit(i + 64 + 32, common->keymap)))
+-                              return i;
+-                      if (!test_bit(i + 32, common->keymap) &&
+-                          (test_bit(i, common->keymap) ||
+-                           test_bit(i + 64, common->keymap) ||
+-                           test_bit(i + 64 + 32, common->keymap)))
+-                              return i + 32;
+-                      if (!test_bit(i + 64, common->keymap) &&
+-                          (test_bit(i , common->keymap) ||
+-                           test_bit(i + 32, common->keymap) ||
+-                           test_bit(i + 64 + 32, common->keymap)))
+-                              return i + 64;
+-                      if (!test_bit(i + 64 + 32, common->keymap) &&
+-                          (test_bit(i, common->keymap) ||
+-                           test_bit(i + 32, common->keymap) ||
+-                           test_bit(i + 64, common->keymap)))
+-                              return i + 64 + 32;
+-              }
+-      } else {
+-              for (i = IEEE80211_WEP_NKID; i < common->keymax / 2; i++) {
+-                      if (!test_bit(i, common->keymap) &&
+-                          test_bit(i + 64, common->keymap))
+-                              return i;
+-                      if (test_bit(i, common->keymap) &&
+-                          !test_bit(i + 64, common->keymap))
+-                              return i + 64;
+-              }
+-      }
+-
+-      /* No partially used TKIP slots, pick any available slot */
+-      for (i = IEEE80211_WEP_NKID; i < common->keymax; i++) {
+-              /* Do not allow slots that could be needed for TKIP group keys
+-               * to be used. This limitation could be removed if we know that
+-               * TKIP will not be used. */
+-              if (i >= 64 && i < 64 + IEEE80211_WEP_NKID)
+-                      continue;
+-              if (common->splitmic) {
+-                      if (i >= 32 && i < 32 + IEEE80211_WEP_NKID)
+-                              continue;
+-                      if (i >= 64 + 32 && i < 64 + 32 + IEEE80211_WEP_NKID)
+-                              continue;
+-              }
+-
+-              if (!test_bit(i, common->keymap))
+-                      return i; /* Found a free slot for a key */
+-      }
+-
+-      /* No free slot found */
+-      return -1;
+-}
+-
+-static int ath_key_config(struct ath_common *common,
+-                        struct ieee80211_vif *vif,
+-                        struct ieee80211_sta *sta,
+-                        struct ieee80211_key_conf *key)
+-{
+-      struct ath_hw *ah = common->ah;
+-      struct ath9k_keyval hk;
+-      const u8 *mac = NULL;
+-      int ret = 0;
+-      int idx;
+-
+-      memset(&hk, 0, sizeof(hk));
+-
+-      switch (key->alg) {
+-      case ALG_WEP:
+-              hk.kv_type = ATH9K_CIPHER_WEP;
+-              break;
+-      case ALG_TKIP:
+-              hk.kv_type = ATH9K_CIPHER_TKIP;
+-              break;
+-      case ALG_CCMP:
+-              hk.kv_type = ATH9K_CIPHER_AES_CCM;
+-              break;
+-      default:
+-              return -EOPNOTSUPP;
+-      }
+-
+-      hk.kv_len = key->keylen;
+-      memcpy(hk.kv_val, key->key, key->keylen);
+-
+-      if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
+-              /* For now, use the default keys for broadcast keys. This may
+-               * need to change with virtual interfaces. */
+-              idx = key->keyidx;
+-      } else if (key->keyidx) {
+-              if (WARN_ON(!sta))
+-                      return -EOPNOTSUPP;
+-              mac = sta->addr;
+-
+-              if (vif->type != NL80211_IFTYPE_AP) {
+-                      /* Only keyidx 0 should be used with unicast key, but
+-                       * allow this for client mode for now. */
+-                      idx = key->keyidx;
+-              } else
+-                      return -EIO;
+-      } else {
+-              if (WARN_ON(!sta))
+-                      return -EOPNOTSUPP;
+-              mac = sta->addr;
+-
+-              if (key->alg == ALG_TKIP)
+-                      idx = ath_reserve_key_cache_slot_tkip(common);
+-              else
+-                      idx = ath_reserve_key_cache_slot(common);
+-              if (idx < 0)
+-                      return -ENOSPC; /* no free key cache entries */
+-      }
+-
+-      if (key->alg == ALG_TKIP)
+-              ret = ath_setkey_tkip(common, idx, key->key, &hk, mac,
+-                                    vif->type == NL80211_IFTYPE_AP);
+-      else
+-              ret = ath9k_hw_set_keycache_entry(ah, idx, &hk, mac);
+-
+-      if (!ret)
+-              return -EIO;
+-
+-      set_bit(idx, common->keymap);
+-      if (key->alg == ALG_TKIP) {
+-              set_bit(idx + 64, common->keymap);
+-              if (common->splitmic) {
+-                      set_bit(idx + 32, common->keymap);
+-                      set_bit(idx + 64 + 32, common->keymap);
+-              }
+-      }
+-
+-      return idx;
+-}
+-
+-static void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key)
+-{
+-      struct ath_hw *ah = common->ah;
+-
+-      ath9k_hw_keyreset(ah, key->hw_key_idx);
+-      if (key->hw_key_idx < IEEE80211_WEP_NKID)
+-              return;
+-
+-      clear_bit(key->hw_key_idx, common->keymap);
+-      if (key->alg != ALG_TKIP)
+-              return;
+-
+-      clear_bit(key->hw_key_idx + 64, common->keymap);
+-      if (common->splitmic) {
+-              ath9k_hw_keyreset(ah, key->hw_key_idx + 32);
+-              clear_bit(key->hw_key_idx + 32, common->keymap);
+-              clear_bit(key->hw_key_idx + 64 + 32, common->keymap);
+-      }
+-}
+-
+ static void ath9k_bss_assoc_info(struct ath_softc *sc,
+                                struct ieee80211_vif *vif,
+                                struct ieee80211_bss_conf *bss_conf)
+@@ -1813,7 +1585,7 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
+       switch (cmd) {
+       case SET_KEY:
+-              ret = ath_key_config(common, vif, sta, key);
++              ret = ath9k_cmn_key_config(common, vif, sta, key);
+               if (ret >= 0) {
+                       key->hw_key_idx = ret;
+                       /* push IV and Michael MIC generation to stack */
+@@ -1826,7 +1598,7 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
+               }
+               break;
+       case DISABLE_KEY:
+-              ath_key_delete(common, key);
++              ath9k_cmn_key_delete(common, key);
+               break;
+       default:
+               ret = -EINVAL;
+-- 
+1.6.3.3
+