From cee06008ef3360446216a7871f01ba8a893e010f Mon Sep 17 00:00:00 2001 From: "Luis R. Rodriguez" Date: Tue, 25 May 2010 16:05:48 -0700 Subject: [PATCH] compat-wireless: add new set of pending patches for 2010-05-25 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 --- ...9k_hw-add-support-for-the-AR9003-2.2.patch | 18 +- ...the-ar9003_initvals.h-to-ar9003_2p0_.patch | 15 +- ...port-for-the-AR9003-baseband-watchdo.patch | 38 ++- ...-baseband-watchdog-events-for-AR9003.patch | 19 +- ...t-GI-in-20-Mhz-for-ar9287-and-later.patch} | 37 ++- ...ull-func-frame-is-acked-before-goin.patch} | 11 +- ...k-Fix-power-save-with-auto-sleeping.patch} | 13 +- ...h9k_hw-Enable-auto-sleep-for-ar9003.patch} | 11 +- ...mcast-bcast-frames-in-PS-mode-with-a.patch | 45 +++ ...on-allocation-to-prefer-the-first-b.patch} | 11 +- ...th9k-remove-VEOL-support-for-ad-hoc.patch} | 19 +- ...-Enable-TX-IQ-calibration-on-AR9003.patch} | 19 +- ...ve-ath9k-specific-RX-code-to-driver.patch} | 19 +- ...h9k-Move-driver-specific-structures.patch} | 11 +- ...p-few-function-parameters-in-recv.c.patch} | 21 +- ...accessing-skb-data-of-rx-frame-for-.patch} | 13 +- ...validating-received-data-length-for.patch} | 13 +- ..._hw-add-multicast-key-search-support.patch | 57 ++++ ...-allocated-key-cache-entries-for-mul.patch | 94 ++++++ ...y-handling-code-from-ath9k_common-in.patch | 270 ++++++++++++++++++ 20 files changed, 671 insertions(+), 83 deletions(-) rename linux-next-pending/{0006-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch => 0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch} (90%) rename linux-next-pending/{0007-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch => 0006-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch} (72%) rename linux-next-pending/{0008-ath9k-Fix-power-save-with-auto-sleeping.patch => 0007-ath9k-Fix-power-save-with-auto-sleeping.patch} (72%) rename linux-next-pending/{0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch => 0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch} (64%) create mode 100644 linux-next-pending/0009-ath9k-Fix-rx-of-mcast-bcast-frames-in-PS-mode-with-a.patch rename linux-next-pending/{0011-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch => 0010-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch} (73%) rename linux-next-pending/{0012-ath9k-remove-VEOL-support-for-ad-hoc.patch => 0011-ath9k-remove-VEOL-support-for-ad-hoc.patch} (83%) rename linux-next-pending/{0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch => 0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch} (73%) rename linux-next-pending/{0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch => 0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch} (96%) rename linux-next-pending/{0016-ath9k-Move-driver-specific-structures.patch => 0014-ath9k-Move-driver-specific-structures.patch} (91%) rename linux-next-pending/{0017-ath9k-Clean-up-few-function-parameters-in-recv.c.patch => 0015-ath9k-Clean-up-few-function-parameters-in-recv.c.patch} (81%) rename linux-next-pending/{0018-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch => 0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch} (66%) rename linux-next-pending/{0019-ath9k-Fix-bug-in-validating-received-data-length-for.patch => 0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch} (67%) create mode 100644 linux-next-pending/0018-ath9k_hw-add-multicast-key-search-support.patch create mode 100644 linux-next-pending/0019-ath9k_common-use-allocated-key-cache-entries-for-mul.patch create mode 100644 linux-next-pending/0020-ath9k-use-the-key-handling-code-from-ath9k_common-in.patch diff --git a/linux-next-pending/0001-ath9k_hw-add-support-for-the-AR9003-2.2.patch b/linux-next-pending/0001-ath9k_hw-add-support-for-the-AR9003-2.2.patch index 92f57f657eb0..223a93897023 100644 --- a/linux-next-pending/0001-ath9k_hw-add-support-for-the-AR9003-2.2.patch +++ b/linux-next-pending/0001-ath9k_hw-add-support-for-the-AR9003-2.2.patch @@ -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 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 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 +}; + +#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 /* 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 { /* 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 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 break; } } +-- +1.6.3.3 + diff --git a/linux-next-pending/0002-ath9k_hw-rename-the-ar9003_initvals.h-to-ar9003_2p0_.patch b/linux-next-pending/0002-ath9k_hw-rename-the-ar9003_initvals.h-to-ar9003_2p0_.patch index 6de849610111..47770894c94c 100644 --- a/linux-next-pending/0002-ath9k_hw-rename-the-ar9003_initvals.h-to-ar9003_2p0_.patch +++ b/linux-next-pending/0002-ath9k_hw-rename-the-ar9003_initvals.h-to-ar9003_2p0_.patch @@ -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 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 --- @@ -12,6 +12,9 @@ Signed-off-by: Luis R. Rodriguez 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 +}; + +#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 #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 -}; - -#endif /* INITVALS_9003_H */ +-- +1.6.3.3 + diff --git a/linux-next-pending/0003-ath9k_hw-add-support-for-the-AR9003-baseband-watchdo.patch b/linux-next-pending/0003-ath9k_hw-add-support-for-the-AR9003-baseband-watchdo.patch index ba53188dd023..9985e2f9a732 100644 --- a/linux-next-pending/0003-ath9k_hw-add-support-for-the-AR9003-baseband-watchdo.patch +++ b/linux-next-pending/0003-ath9k_hw-add-support-for-the-AR9003-baseband-watchdo.patch @@ -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 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 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 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 } 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 #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 + "==== 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 -#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 +#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 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 } 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 }; 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 /* 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 #define AR_ISR_S2_CST 0x00400000 #define AR_ISR_S2_GTT 0x00800000 #define AR_ISR_S2_TIM 0x01000000 +-- +1.6.3.3 + diff --git a/linux-next-pending/0004-ath9k-enable-the-baseband-watchdog-events-for-AR9003.patch b/linux-next-pending/0004-ath9k-enable-the-baseband-watchdog-events-for-AR9003.patch index 82c4df89c85a..77a0d41c35e1 100644 --- a/linux-next-pending/0004-ath9k-enable-the-baseband-watchdog-events-for-AR9003.patch +++ b/linux-next-pending/0004-ath9k-enable-the-baseband-watchdog-events-for-AR9003.patch @@ -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 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 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 } 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 } 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 }; 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 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 else ah->imask |= ATH9K_INT_RX; +-- +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/0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch similarity index 90% rename from linux-next-pending/0006-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch rename to linux-next-pending/0005-ath9k-Enable-Short-GI-in-20-Mhz-for-ar9287-and-later.patch index dea6f541c881..b2ffdbe57be6 100644 --- a/linux-next-pending/0006-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 @@ -1,7 +1,7 @@ -From 2449106deb1699a46ca4ed8f0b7f03ebca0a3cdb Mon Sep 17 00:00:00 2001 +From e875bd9f35dad054380c95285d63daf139746799 Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan 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 +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. @@ -14,9 +14,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 +@@ -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; @@ -26,6 +28,8 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 { @@ -36,9 +40,11 @@ Signed-off-by: Vasanthakumar Thiagarajan }; 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_soft +@@ -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; @@ -48,9 +54,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 ar541 +@@ -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 */ @@ -160,7 +168,7 @@ Signed-off-by: Vasanthakumar Thiagarajan }, 50, /* probe interval */ WLAN_RC_HT_FLAG, /* Phy rates allowed initially */ -@@ -144,73 +146,75 @@ static const struct ath_rate_table ar541 +@@ -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 */ @@ -270,7 +278,7 @@ Signed-off-by: Vasanthakumar Thiagarajan }, 50, /* probe interval */ WLAN_RC_HT_FLAG, /* Phy rates allowed initially */ -@@ -1193,7 +1197,7 @@ static void ath_rc_init(struct ath_softc +@@ -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, @@ -279,7 +287,7 @@ Signed-off-by: Vasanthakumar Thiagarajan { u8 caps = 0; -@@ -1206,8 +1210,9 @@ static u8 ath_rc_build_ht_caps(struct at +@@ -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; @@ -290,7 +298,7 @@ Signed-off-by: Vasanthakumar Thiagarajan } return caps; -@@ -1300,7 +1305,7 @@ static void ath_rate_init(void *priv, st +@@ -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; @@ -299,7 +307,7 @@ Signed-off-by: Vasanthakumar Thiagarajan int i, j = 0; for (i = 0; i < sband->n_bitrates; i++) { -@@ -1323,7 +1328,11 @@ static void ath_rate_init(void *priv, st +@@ -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; @@ -312,7 +320,7 @@ Signed-off-by: Vasanthakumar Thiagarajan /* Choose rate table first */ -@@ -1336,7 +1345,7 @@ static void ath_rate_init(void *priv, st +@@ -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]; } @@ -321,7 +329,7 @@ Signed-off-by: Vasanthakumar Thiagarajan ath_rc_init(sc, priv_sta, sband, sta, rate_table); } -@@ -1347,10 +1356,10 @@ static void ath_rate_update(void *priv, +@@ -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; @@ -334,7 +342,7 @@ Signed-off-by: Vasanthakumar Thiagarajan true : false; /* FIXME: Handle AP mode later when we support CWM */ -@@ -1363,15 +1372,21 @@ static void ath_rate_update(void *priv, +@@ -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; @@ -360,3 +368,6 @@ Signed-off-by: Vasanthakumar Thiagarajan 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/0007-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 similarity index 72% rename from linux-next-pending/0007-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch rename to linux-next-pending/0006-ath9k-Make-sure-null-func-frame-is-acked-before-goin.patch index ae263dfa76df..8bb9b2b63341 100644 --- a/linux-next-pending/0007-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 @@ -1,7 +1,7 @@ -From b678026133c321be78cbebdfc7f791fa72525ac1 Mon Sep 17 00:00:00 2001 +From 7d603b16b19d6eb85c0ff6d4ff1274c2962cf671 Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan 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 +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(). @@ -11,9 +11,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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_soft +@@ -2277,6 +2277,17 @@ void ath_tx_edma_tasklet(struct ath_softc *sc) txok = !(txs.ts_status & ATH9K_TXERR_MASK); @@ -31,3 +33,6 @@ Signed-off-by: Vasanthakumar Thiagarajan 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/0008-ath9k-Fix-power-save-with-auto-sleeping.patch b/linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch similarity index 72% rename from linux-next-pending/0008-ath9k-Fix-power-save-with-auto-sleeping.patch rename to linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch index 8d2d3d5d8669..82adbcf9de89 100644 --- a/linux-next-pending/0008-ath9k-Fix-power-save-with-auto-sleeping.patch +++ b/linux-next-pending/0007-ath9k-Fix-power-save-with-auto-sleeping.patch @@ -1,7 +1,7 @@ -From f459f43e2490ec2644bc826c3ca3906b1985baa1 Mon Sep 17 00:00:00 2001 +From 3c2af719083444626ba452af6c95e111c7da8f3e Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Mon, 17 May 2010 18:36:00 -0700 -Subject: [PATCH 08/19] ath9k: Fix power save with auto sleeping +Subject: [PATCH 07/20] ath9k: Fix power save with auto sleeping Rx should not be disabed/disabled when hw supports auto sleeping. @@ -10,9 +10,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 +@@ -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); @@ -22,7 +24,7 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 +@@ -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); } @@ -32,3 +34,6 @@ Signed-off-by: Vasanthakumar Thiagarajan } static int ath9k_config(struct ieee80211_hw *hw, u32 changed) +-- +1.6.3.3 + diff --git a/linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch b/linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch similarity index 64% rename from linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch rename to linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch index 66abf9394c4b..76b234577d90 100644 --- a/linux-next-pending/0009-ath9k_hw-Enable-auto-sleep-for-ar9003.patch +++ b/linux-next-pending/0008-ath9k_hw-Enable-auto-sleep-for-ar9003.patch @@ -1,16 +1,18 @@ -From 79e8cb3f106fbb4f8aa1fb2ab442f6e34b992bbc Mon Sep 17 00:00:00 2001 +From a269e97ddf3d7e86b68b8cc007431a1022989430 Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Mon, 17 May 2010 18:38:58 -0700 -Subject: [PATCH 09/19] ath9k_hw: Enable auto sleep for ar9003 +Subject: [PATCH 08/20] ath9k_hw: Enable auto sleep for ar9003 Signed-off-by: Vasanthakumar Thiagarajan --- 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 +@@ -2167,7 +2167,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT; } #endif @@ -19,3 +21,6 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 index 000000000000..a56bf4863cb9 --- /dev/null +++ b/linux-next-pending/0009-ath9k-Fix-rx-of-mcast-bcast-frames-in-PS-mode-with-a.patch @@ -0,0 +1,45 @@ +From 8a4ab8855e064e0695360100d8baa089c3ef17a4 Mon Sep 17 00:00:00 2001 +From: Vasanthakumar Thiagarajan +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 +--- + 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/0011-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 similarity index 73% rename from linux-next-pending/0011-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch rename to linux-next-pending/0010-ath9k-change-beacon-allocation-to-prefer-the-first-b.patch index ec11f43797ee..a2603da0611f 100644 --- a/linux-next-pending/0011-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 @@ -1,7 +1,7 @@ -From 4bd341bdf87c2e17d256526ffc75d9a2200f771b Mon Sep 17 00:00:00 2001 +From 4bf9998d15742540f538706e6a435535e4a2580b Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 13 May 2010 20:37:24 +0200 -Subject: [PATCH 11/19] ath9k: change beacon allocation to prefer the first beacon slot +Subject: [PATCH 10/20] ath9k: change beacon allocation to prefer the first beacon slot This fixes IBSS beacon transmissions without VEOL enabled @@ -10,9 +10,11 @@ Signed-off-by: Felix Fietkau 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 *a +@@ -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) { @@ -33,3 +35,6 @@ Signed-off-by: Felix Fietkau } 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/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch b/linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch similarity index 83% rename from linux-next-pending/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch rename to linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch index 0058398a1dd8..8aca9fdf08a0 100644 --- a/linux-next-pending/0012-ath9k-remove-VEOL-support-for-ad-hoc.patch +++ b/linux-next-pending/0011-ath9k-remove-VEOL-support-for-ad-hoc.patch @@ -1,7 +1,7 @@ -From 6e0f085930fb2df6d2c5701741fcf88b0381a144 Mon Sep 17 00:00:00 2001 +From 6b0d6c3dd1cbc5508420115cc9401c3bccaa8f60 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 13 May 2010 20:37:25 +0200 -Subject: [PATCH 12/19] ath9k: remove VEOL support for ad-hoc +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 @@ -13,9 +13,11 @@ Signed-off-by: Felix Fietkau 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_ +@@ -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; @@ -45,7 +47,7 @@ Signed-off-by: Felix Fietkau 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 +@@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, return bf; } @@ -82,7 +84,7 @@ Signed-off-by: Felix Fietkau 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 +@@ -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 || @@ -92,7 +94,7 @@ Signed-off-by: Felix Fietkau int slot; /* * Assign the vif to a beacon xmit slot. As -@@ -715,8 +677,7 @@ static void ath_beacon_config_adhoc(stru +@@ -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; @@ -102,7 +104,7 @@ Signed-off-by: Felix Fietkau ath_beaconq_config(sc); -@@ -726,10 +687,6 @@ static void ath_beacon_config_adhoc(stru +@@ -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); @@ -113,3 +115,6 @@ Signed-off-by: Felix Fietkau } void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) +-- +1.6.3.3 + diff --git a/linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch b/linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch similarity index 73% rename from linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch rename to linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch index 9ba25a8e17e4..579a04bf8a2e 100644 --- a/linux-next-pending/0014-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch +++ b/linux-next-pending/0012-ath9k_hw-Enable-TX-IQ-calibration-on-AR9003.patch @@ -1,7 +1,7 @@ -From 5d182a53ed8099361d98f88fbed64726b3ad3dc4 Mon Sep 17 00:00:00 2001 +From 540531543f239bf47822d9e70d4323f703525687 Mon Sep 17 00:00:00 2001 From: Luis R. Rodriguez Date: Wed, 19 May 2010 13:42:44 -0700 -Subject: [PATCH 14/19] ath9k_hw: Enable TX IQ calibration on AR9003 +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. @@ -13,9 +13,11 @@ Signed-off-by: Luis R. Rodriguez 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 at +@@ -739,6 +739,12 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah, */ ar9003_hw_set_chain_masks(ah, 0x7, 0x7); @@ -28,7 +30,7 @@ Signed-off-by: Luis R. Rodriguez /* 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 +@@ -753,10 +759,6 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah, return false; } @@ -39,9 +41,11 @@ Signed-off-by: Luis R. Rodriguez /* 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 +@@ -392,12 +392,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) ah->config.rx_intr_mitigation = true; /* @@ -54,6 +58,8 @@ Signed-off-by: Luis R. Rodriguez * 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 { @@ -64,3 +70,6 @@ Signed-off-by: Luis R. Rodriguez int spurmode; u16 spurchans[AR_EEPROM_MODAL_SPURS][2]; u8 max_txtrig_level; +-- +1.6.3.3 + diff --git a/linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch b/linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch similarity index 96% rename from linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch rename to linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch index 7a4b5e494763..ec90e975e8ae 100644 --- a/linux-next-pending/0015-ath9k-Move-ath9k-specific-RX-code-to-driver.patch +++ b/linux-next-pending/0013-ath9k-Move-ath9k-specific-RX-code-to-driver.patch @@ -1,7 +1,7 @@ -From fdeff77508aed952a3b3f42484db09d4e8728bbb Mon Sep 17 00:00:00 2001 +From be5c86be802f5a9e6f6a2771e77d80d4c7d8924b Mon Sep 17 00:00:00 2001 From: Sujith Date: Thu, 20 May 2010 15:34:38 +0530 -Subject: [PATCH 15/19] ath9k: Move ath9k specific RX code to driver +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 @@ -14,6 +14,8 @@ Signed-off-by: Sujith 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"); @@ -287,6 +289,8 @@ Signed-off-by: Sujith 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 { @@ -309,9 +313,11 @@ Signed-off-by: Sujith 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 -@@ -821,6 +821,265 @@ static struct ath_buf *ath_get_next_rx_b +@@ -824,6 +824,265 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, return bf; } @@ -577,7 +583,7 @@ Signed-off-by: Sujith int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) { -@@ -883,8 +1142,8 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -886,8 +1145,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) if (flush) goto requeue; @@ -588,7 +594,7 @@ Signed-off-by: Sujith if (retval) goto requeue; -@@ -908,8 +1167,8 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -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); @@ -599,3 +605,6 @@ Signed-off-by: Sujith /* 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/0016-ath9k-Move-driver-specific-structures.patch b/linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch similarity index 91% rename from linux-next-pending/0016-ath9k-Move-driver-specific-structures.patch rename to linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch index aa85b8088158..772771284360 100644 --- a/linux-next-pending/0016-ath9k-Move-driver-specific-structures.patch +++ b/linux-next-pending/0014-ath9k-Move-driver-specific-structures.patch @@ -1,7 +1,7 @@ -From af9b87568dbd2c07ac41e0c6ae9037526b15712d Mon Sep 17 00:00:00 2001 +From e171efcee117cd713e58334b0d82fb5e612888e4 Mon Sep 17 00:00:00 2001 From: Sujith Date: Thu, 20 May 2010 17:23:19 +0530 -Subject: [PATCH 16/19] ath9k: Move driver specific structures +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. @@ -13,6 +13,8 @@ Signed-off-by: Sujith 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 { @@ -85,6 +87,8 @@ Signed-off-by: Sujith #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 @@ @@ -157,3 +161,6 @@ Signed-off-by: Sujith 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/0017-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 similarity index 81% rename from linux-next-pending/0017-ath9k-Clean-up-few-function-parameters-in-recv.c.patch rename to linux-next-pending/0015-ath9k-Clean-up-few-function-parameters-in-recv.c.patch index 3f2e03c88df7..1e1a882a0d34 100644 --- a/linux-next-pending/0017-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 @@ -1,7 +1,7 @@ -From fead6bb5090ec7db68831d6bd9503dec2f10057f Mon Sep 17 00:00:00 2001 +From 9165102f082775f29be69c0956ae6eccb636e18b Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Thu, 20 May 2010 14:34:46 -0700 -Subject: [PATCH 17/19] ath9k: Clean up few function parameters in recv.c +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 @@ -12,9 +12,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 -@@ -823,16 +823,14 @@ static struct ath_buf *ath_get_next_rx_b +@@ -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, @@ -32,7 +34,7 @@ Signed-off-by: Vasanthakumar Thiagarajan fc = hdr->frame_control; if (!rx_stats->rs_datalen) -@@ -903,8 +901,7 @@ static bool ath9k_rx_accept(struct ath_c +@@ -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, @@ -42,7 +44,7 @@ Signed-off-by: Vasanthakumar Thiagarajan { struct ieee80211_supported_band *sband; enum ieee80211_band band; -@@ -942,25 +939,21 @@ static int ath9k_process_rate(struct ath +@@ -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); @@ -69,7 +71,7 @@ Signed-off-by: Vasanthakumar Thiagarajan fc = hdr->frame_control; rcu_read_lock(); -@@ -999,7 +992,7 @@ static void ath9k_process_rssi(struct at +@@ -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, @@ -78,7 +80,7 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 +@@ -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. */ @@ -94,7 +96,7 @@ Signed-off-by: Vasanthakumar Thiagarajan 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, +@@ -1145,7 +1138,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) if (flush) goto requeue; @@ -103,3 +105,6 @@ Signed-off-by: Vasanthakumar Thiagarajan rxs, &decrypt_error); if (retval) goto requeue; +-- +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/0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch similarity index 66% rename from linux-next-pending/0018-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch rename to linux-next-pending/0016-ath9k-Fix-bug-in-accessing-skb-data-of-rx-frame-for-.patch index 14c7654f61d2..169c31827b1b 100644 --- a/linux-next-pending/0018-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 @@ -1,7 +1,7 @@ -From b5a8d95359c518498d91d0c28673060d58d62d44 Mon Sep 17 00:00:00 2001 +From fd45dc3316a3ccaa961ce9835ca21c705956d1dd Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan 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 +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. @@ -11,9 +11,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 -@@ -1094,6 +1094,7 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -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; @@ -21,7 +23,7 @@ Signed-off-by: Vasanthakumar Thiagarajan if (edma) dma_type = DMA_FROM_DEVICE; -@@ -1121,7 +1122,7 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -1124,7 +1125,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) if (!skb) continue; @@ -30,3 +32,6 @@ Signed-off-by: Vasanthakumar Thiagarajan rxs = IEEE80211_SKB_RXCB(skb); hw = ath_get_virt_hw(sc, hdr); +-- +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/0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch similarity index 67% rename from linux-next-pending/0019-ath9k-Fix-bug-in-validating-received-data-length-for.patch rename to linux-next-pending/0017-ath9k-Fix-bug-in-validating-received-data-length-for.patch index ec9b5dfb7eed..d468551263b5 100644 --- a/linux-next-pending/0019-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 @@ -1,7 +1,7 @@ -From 4532fc82246270aba6d72ed89c76304652c8ddfe Mon Sep 17 00:00:00 2001 +From 66b9e11d56da7b2b05871992f21aa1440294fcd6 Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Thu, 20 May 2010 14:47:38 -0700 -Subject: [PATCH 19/19] ath9k: Fix bug in validating received data length for edma +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. @@ -11,9 +11,11 @@ Signed-off-by: Vasanthakumar Thiagarajan 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 -@@ -830,6 +830,7 @@ static bool ath9k_rx_accept(struct ath_c +@@ -833,6 +833,7 @@ static bool ath9k_rx_accept(struct ath_common *common, { struct ath_hw *ah = common->ah; __le16 fc; @@ -21,7 +23,7 @@ Signed-off-by: Vasanthakumar Thiagarajan fc = hdr->frame_control; -@@ -840,7 +841,7 @@ static bool ath9k_rx_accept(struct ath_c +@@ -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. */ @@ -30,3 +32,6 @@ Signed-off-by: Vasanthakumar Thiagarajan return false; /* +-- +1.6.3.3 + 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 index 000000000000..b60bfe6d7bdb --- /dev/null +++ b/linux-next-pending/0018-ath9k_hw-add-multicast-key-search-support.patch @@ -0,0 +1,57 @@ +From af9f4737b9e305454f2c769565184ed105b618b8 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +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 +--- + 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_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 index 000000000000..8bca68b3213e --- /dev/null +++ b/linux-next-pending/0019-ath9k_common-use-allocated-key-cache-entries-for-mul.patch @@ -0,0 +1,94 @@ +From 54866b981d1a7367a731b6057c02501e1fd32a13 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +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 +--- + 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 index 000000000000..71cf73eab1ad --- /dev/null +++ b/linux-next-pending/0020-ath9k-use-the-key-handling-code-from-ath9k_common-in.patch @@ -0,0 +1,270 @@ +From 2ba6e72953b2b20be3682d2b30accd1b88857ea2 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +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 +--- + 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 + -- 2.30.2