diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ahb.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/btcoex.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/debug.c | 43 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 30 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/pci.c | 19 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/rc.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/reg.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 39 |
14 files changed, 111 insertions, 95 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c index 9e62a569e816..ca4994f13151 100644 --- a/drivers/net/wireless/ath/ath9k/ahb.c +++ b/drivers/net/wireless/ath/ath9k/ahb.c | |||
@@ -27,12 +27,6 @@ static void ath_ahb_read_cachesize(struct ath_common *common, int *csz) | |||
27 | *csz = L1_CACHE_BYTES >> 2; | 27 | *csz = L1_CACHE_BYTES >> 2; |
28 | } | 28 | } |
29 | 29 | ||
30 | static void ath_ahb_cleanup(struct ath_common *common) | ||
31 | { | ||
32 | struct ath_softc *sc = (struct ath_softc *)common->priv; | ||
33 | iounmap(sc->mem); | ||
34 | } | ||
35 | |||
36 | static bool ath_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data) | 30 | static bool ath_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data) |
37 | { | 31 | { |
38 | struct ath_softc *sc = (struct ath_softc *)common->priv; | 32 | struct ath_softc *sc = (struct ath_softc *)common->priv; |
@@ -54,8 +48,6 @@ static bool ath_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data) | |||
54 | 48 | ||
55 | static struct ath_bus_ops ath_ahb_bus_ops = { | 49 | static struct ath_bus_ops ath_ahb_bus_ops = { |
56 | .read_cachesize = ath_ahb_read_cachesize, | 50 | .read_cachesize = ath_ahb_read_cachesize, |
57 | .cleanup = ath_ahb_cleanup, | ||
58 | |||
59 | .eeprom_read = ath_ahb_eeprom_read, | 51 | .eeprom_read = ath_ahb_eeprom_read, |
60 | }; | 52 | }; |
61 | 53 | ||
@@ -164,12 +156,12 @@ static int ath_ahb_remove(struct platform_device *pdev) | |||
164 | if (hw) { | 156 | if (hw) { |
165 | struct ath_wiphy *aphy = hw->priv; | 157 | struct ath_wiphy *aphy = hw->priv; |
166 | struct ath_softc *sc = aphy->sc; | 158 | struct ath_softc *sc = aphy->sc; |
167 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 159 | void __iomem *mem = sc->mem; |
168 | 160 | ||
169 | ath9k_deinit_device(sc); | 161 | ath9k_deinit_device(sc); |
170 | free_irq(sc->irq, sc); | 162 | free_irq(sc->irq, sc); |
171 | ieee80211_free_hw(sc->hw); | 163 | ieee80211_free_hw(sc->hw); |
172 | ath_bus_cleanup(common); | 164 | iounmap(mem); |
173 | platform_set_drvdata(pdev, NULL); | 165 | platform_set_drvdata(pdev, NULL); |
174 | } | 166 | } |
175 | 167 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index bf3d4c4bfa52..0ea340fd071c 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -364,6 +364,7 @@ struct ath_btcoex { | |||
364 | int bt_stomp_type; /* Types of BT stomping */ | 364 | int bt_stomp_type; /* Types of BT stomping */ |
365 | u32 btcoex_no_stomp; /* in usec */ | 365 | u32 btcoex_no_stomp; /* in usec */ |
366 | u32 btcoex_period; /* in usec */ | 366 | u32 btcoex_period; /* in usec */ |
367 | u32 btscan_no_stomp; /* in usec */ | ||
367 | struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */ | 368 | struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */ |
368 | }; | 369 | }; |
369 | 370 | ||
@@ -429,6 +430,7 @@ void ath_deinit_leds(struct ath_softc *sc); | |||
429 | #define SC_OP_SCANNING BIT(10) | 430 | #define SC_OP_SCANNING BIT(10) |
430 | #define SC_OP_TSF_RESET BIT(11) | 431 | #define SC_OP_TSF_RESET BIT(11) |
431 | #define SC_OP_BT_PRIORITY_DETECTED BIT(12) | 432 | #define SC_OP_BT_PRIORITY_DETECTED BIT(12) |
433 | #define SC_OP_BT_SCAN BIT(13) | ||
432 | 434 | ||
433 | /* Powersave flags */ | 435 | /* Powersave flags */ |
434 | #define PS_WAIT_FOR_BEACON BIT(0) | 436 | #define PS_WAIT_FOR_BEACON BIT(0) |
@@ -478,6 +480,7 @@ struct ath_softc { | |||
478 | u8 nbcnvifs; | 480 | u8 nbcnvifs; |
479 | u16 nvifs; | 481 | u16 nvifs; |
480 | bool ps_enabled; | 482 | bool ps_enabled; |
483 | bool ps_idle; | ||
481 | unsigned long ps_usecount; | 484 | unsigned long ps_usecount; |
482 | enum ath9k_int imask; | 485 | enum ath9k_int imask; |
483 | 486 | ||
@@ -535,11 +538,6 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz) | |||
535 | common->bus_ops->read_cachesize(common, csz); | 538 | common->bus_ops->read_cachesize(common, csz); |
536 | } | 539 | } |
537 | 540 | ||
538 | static inline void ath_bus_cleanup(struct ath_common *common) | ||
539 | { | ||
540 | common->bus_ops->cleanup(common); | ||
541 | } | ||
542 | |||
543 | extern struct ieee80211_ops ath9k_ops; | 541 | extern struct ieee80211_ops ath9k_ops; |
544 | extern int modparam_nohwcrypt; | 542 | extern int modparam_nohwcrypt; |
545 | 543 | ||
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h index 1ba31a73317c..1ee5a15ccbb1 100644 --- a/drivers/net/wireless/ath/ath9k/btcoex.h +++ b/drivers/net/wireless/ath/ath9k/btcoex.h | |||
@@ -25,10 +25,12 @@ | |||
25 | 25 | ||
26 | #define ATH_BTCOEX_DEF_BT_PERIOD 45 | 26 | #define ATH_BTCOEX_DEF_BT_PERIOD 45 |
27 | #define ATH_BTCOEX_DEF_DUTY_CYCLE 55 | 27 | #define ATH_BTCOEX_DEF_DUTY_CYCLE 55 |
28 | #define ATH_BTCOEX_BTSCAN_DUTY_CYCLE 90 | ||
28 | #define ATH_BTCOEX_BMISS_THRESH 50 | 29 | #define ATH_BTCOEX_BMISS_THRESH 50 |
29 | 30 | ||
30 | #define ATH_BT_PRIORITY_TIME_THRESHOLD 1000 /* ms */ | 31 | #define ATH_BT_PRIORITY_TIME_THRESHOLD 1000 /* ms */ |
31 | #define ATH_BT_CNT_THRESHOLD 3 | 32 | #define ATH_BT_CNT_THRESHOLD 3 |
33 | #define ATH_BT_CNT_SCAN_THRESHOLD 15 | ||
32 | 34 | ||
33 | enum ath_btcoex_scheme { | 35 | enum ath_btcoex_scheme { |
34 | ATH_BTCOEX_CFG_NONE, | 36 | ATH_BTCOEX_CFG_NONE, |
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 9489b6b25b5f..42d2a506845a 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
@@ -75,17 +75,24 @@ static const struct file_operations fops_debug = { | |||
75 | 75 | ||
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #define DMA_BUF_LEN 1024 | ||
79 | |||
78 | static ssize_t read_file_dma(struct file *file, char __user *user_buf, | 80 | static ssize_t read_file_dma(struct file *file, char __user *user_buf, |
79 | size_t count, loff_t *ppos) | 81 | size_t count, loff_t *ppos) |
80 | { | 82 | { |
81 | struct ath_softc *sc = file->private_data; | 83 | struct ath_softc *sc = file->private_data; |
82 | struct ath_hw *ah = sc->sc_ah; | 84 | struct ath_hw *ah = sc->sc_ah; |
83 | char buf[1024]; | 85 | char *buf; |
86 | int retval; | ||
84 | unsigned int len = 0; | 87 | unsigned int len = 0; |
85 | u32 val[ATH9K_NUM_DMA_DEBUG_REGS]; | 88 | u32 val[ATH9K_NUM_DMA_DEBUG_REGS]; |
86 | int i, qcuOffset = 0, dcuOffset = 0; | 89 | int i, qcuOffset = 0, dcuOffset = 0; |
87 | u32 *qcuBase = &val[0], *dcuBase = &val[4]; | 90 | u32 *qcuBase = &val[0], *dcuBase = &val[4]; |
88 | 91 | ||
92 | buf = kmalloc(DMA_BUF_LEN, GFP_KERNEL); | ||
93 | if (!buf) | ||
94 | return 0; | ||
95 | |||
89 | ath9k_ps_wakeup(sc); | 96 | ath9k_ps_wakeup(sc); |
90 | 97 | ||
91 | REG_WRITE_D(ah, AR_MACMISC, | 98 | REG_WRITE_D(ah, AR_MACMISC, |
@@ -93,20 +100,20 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
93 | (AR_MACMISC_MISC_OBS_BUS_1 << | 100 | (AR_MACMISC_MISC_OBS_BUS_1 << |
94 | AR_MACMISC_MISC_OBS_BUS_MSB_S))); | 101 | AR_MACMISC_MISC_OBS_BUS_MSB_S))); |
95 | 102 | ||
96 | len += snprintf(buf + len, sizeof(buf) - len, | 103 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
97 | "Raw DMA Debug values:\n"); | 104 | "Raw DMA Debug values:\n"); |
98 | 105 | ||
99 | for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) { | 106 | for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) { |
100 | if (i % 4 == 0) | 107 | if (i % 4 == 0) |
101 | len += snprintf(buf + len, sizeof(buf) - len, "\n"); | 108 | len += snprintf(buf + len, DMA_BUF_LEN - len, "\n"); |
102 | 109 | ||
103 | val[i] = REG_READ_D(ah, AR_DMADBG_0 + (i * sizeof(u32))); | 110 | val[i] = REG_READ_D(ah, AR_DMADBG_0 + (i * sizeof(u32))); |
104 | len += snprintf(buf + len, sizeof(buf) - len, "%d: %08x ", | 111 | len += snprintf(buf + len, DMA_BUF_LEN - len, "%d: %08x ", |
105 | i, val[i]); | 112 | i, val[i]); |
106 | } | 113 | } |
107 | 114 | ||
108 | len += snprintf(buf + len, sizeof(buf) - len, "\n\n"); | 115 | len += snprintf(buf + len, DMA_BUF_LEN - len, "\n\n"); |
109 | len += snprintf(buf + len, sizeof(buf) - len, | 116 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
110 | "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); | 117 | "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); |
111 | 118 | ||
112 | for (i = 0; i < ATH9K_NUM_QUEUES; i++, qcuOffset += 4, dcuOffset += 5) { | 119 | for (i = 0; i < ATH9K_NUM_QUEUES; i++, qcuOffset += 4, dcuOffset += 5) { |
@@ -120,7 +127,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
120 | dcuBase++; | 127 | dcuBase++; |
121 | } | 128 | } |
122 | 129 | ||
123 | len += snprintf(buf + len, sizeof(buf) - len, | 130 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
124 | "%2d %2x %1x %2x %2x\n", | 131 | "%2d %2x %1x %2x %2x\n", |
125 | i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, | 132 | i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, |
126 | (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), | 133 | (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), |
@@ -128,35 +135,37 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
128 | (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); | 135 | (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); |
129 | } | 136 | } |
130 | 137 | ||
131 | len += snprintf(buf + len, sizeof(buf) - len, "\n"); | 138 | len += snprintf(buf + len, DMA_BUF_LEN - len, "\n"); |
132 | 139 | ||
133 | len += snprintf(buf + len, sizeof(buf) - len, | 140 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
134 | "qcu_stitch state: %2x qcu_fetch state: %2x\n", | 141 | "qcu_stitch state: %2x qcu_fetch state: %2x\n", |
135 | (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22); | 142 | (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22); |
136 | len += snprintf(buf + len, sizeof(buf) - len, | 143 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
137 | "qcu_complete state: %2x dcu_complete state: %2x\n", | 144 | "qcu_complete state: %2x dcu_complete state: %2x\n", |
138 | (val[3] & 0x1c000000) >> 26, (val[6] & 0x3)); | 145 | (val[3] & 0x1c000000) >> 26, (val[6] & 0x3)); |
139 | len += snprintf(buf + len, sizeof(buf) - len, | 146 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
140 | "dcu_arb state: %2x dcu_fp state: %2x\n", | 147 | "dcu_arb state: %2x dcu_fp state: %2x\n", |
141 | (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27); | 148 | (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27); |
142 | len += snprintf(buf + len, sizeof(buf) - len, | 149 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
143 | "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", | 150 | "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", |
144 | (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10); | 151 | (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10); |
145 | len += snprintf(buf + len, sizeof(buf) - len, | 152 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
146 | "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", | 153 | "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", |
147 | (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12); | 154 | (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12); |
148 | len += snprintf(buf + len, sizeof(buf) - len, | 155 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
149 | "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", | 156 | "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", |
150 | (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17); | 157 | (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17); |
151 | 158 | ||
152 | len += snprintf(buf + len, sizeof(buf) - len, "pcu observe: 0x%x \n", | 159 | len += snprintf(buf + len, DMA_BUF_LEN - len, "pcu observe: 0x%x \n", |
153 | REG_READ_D(ah, AR_OBS_BUS_1)); | 160 | REG_READ_D(ah, AR_OBS_BUS_1)); |
154 | len += snprintf(buf + len, sizeof(buf) - len, | 161 | len += snprintf(buf + len, DMA_BUF_LEN - len, |
155 | "AR_CR: 0x%x \n", REG_READ_D(ah, AR_CR)); | 162 | "AR_CR: 0x%x \n", REG_READ_D(ah, AR_CR)); |
156 | 163 | ||
157 | ath9k_ps_restore(sc); | 164 | ath9k_ps_restore(sc); |
158 | 165 | ||
159 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | 166 | retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); |
167 | kfree(buf); | ||
168 | return retval; | ||
160 | } | 169 | } |
161 | 170 | ||
162 | static const struct file_operations fops_dma = { | 171 | static const struct file_operations fops_dma = { |
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index e204bd25ff65..deab8beb0680 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c | |||
@@ -230,12 +230,17 @@ static void ath_detect_bt_priority(struct ath_softc *sc) | |||
230 | 230 | ||
231 | if (time_after(jiffies, btcoex->bt_priority_time + | 231 | if (time_after(jiffies, btcoex->bt_priority_time + |
232 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { | 232 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { |
233 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { | 233 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); |
234 | /* Detect if colocated bt started scanning */ | ||
235 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) { | ||
236 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, | ||
237 | "BT scan detected"); | ||
238 | sc->sc_flags |= (SC_OP_BT_SCAN | | ||
239 | SC_OP_BT_PRIORITY_DETECTED); | ||
240 | } else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { | ||
234 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, | 241 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, |
235 | "BT priority traffic detected"); | 242 | "BT priority traffic detected"); |
236 | sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; | 243 | sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; |
237 | } else { | ||
238 | sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; | ||
239 | } | 244 | } |
240 | 245 | ||
241 | btcoex->bt_priority_cnt = 0; | 246 | btcoex->bt_priority_cnt = 0; |
@@ -316,12 +321,17 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
316 | struct ath_softc *sc = (struct ath_softc *) data; | 321 | struct ath_softc *sc = (struct ath_softc *) data; |
317 | struct ath_hw *ah = sc->sc_ah; | 322 | struct ath_hw *ah = sc->sc_ah; |
318 | struct ath_btcoex *btcoex = &sc->btcoex; | 323 | struct ath_btcoex *btcoex = &sc->btcoex; |
324 | u32 timer_period; | ||
325 | bool is_btscan; | ||
319 | 326 | ||
320 | ath_detect_bt_priority(sc); | 327 | ath_detect_bt_priority(sc); |
321 | 328 | ||
329 | is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | ||
330 | |||
322 | spin_lock_bh(&btcoex->btcoex_lock); | 331 | spin_lock_bh(&btcoex->btcoex_lock); |
323 | 332 | ||
324 | ath9k_btcoex_bt_stomp(sc, btcoex->bt_stomp_type); | 333 | ath9k_btcoex_bt_stomp(sc, is_btscan ? ATH_BTCOEX_STOMP_ALL : |
334 | btcoex->bt_stomp_type); | ||
325 | 335 | ||
326 | spin_unlock_bh(&btcoex->btcoex_lock); | 336 | spin_unlock_bh(&btcoex->btcoex_lock); |
327 | 337 | ||
@@ -329,11 +339,12 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
329 | if (btcoex->hw_timer_enabled) | 339 | if (btcoex->hw_timer_enabled) |
330 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); | 340 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); |
331 | 341 | ||
342 | timer_period = is_btscan ? btcoex->btscan_no_stomp : | ||
343 | btcoex->btcoex_no_stomp; | ||
332 | ath9k_gen_timer_start(ah, | 344 | ath9k_gen_timer_start(ah, |
333 | btcoex->no_stomp_timer, | 345 | btcoex->no_stomp_timer, |
334 | (ath9k_hw_gettsf32(ah) + | 346 | (ath9k_hw_gettsf32(ah) + |
335 | btcoex->btcoex_no_stomp), | 347 | timer_period), timer_period * 10); |
336 | btcoex->btcoex_no_stomp * 10); | ||
337 | btcoex->hw_timer_enabled = true; | 348 | btcoex->hw_timer_enabled = true; |
338 | } | 349 | } |
339 | 350 | ||
@@ -350,13 +361,14 @@ static void ath_btcoex_no_stomp_timer(void *arg) | |||
350 | struct ath_softc *sc = (struct ath_softc *)arg; | 361 | struct ath_softc *sc = (struct ath_softc *)arg; |
351 | struct ath_hw *ah = sc->sc_ah; | 362 | struct ath_hw *ah = sc->sc_ah; |
352 | struct ath_btcoex *btcoex = &sc->btcoex; | 363 | struct ath_btcoex *btcoex = &sc->btcoex; |
364 | bool is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | ||
353 | 365 | ||
354 | ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX, | 366 | ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX, |
355 | "no stomp timer running \n"); | 367 | "no stomp timer running \n"); |
356 | 368 | ||
357 | spin_lock_bh(&btcoex->btcoex_lock); | 369 | spin_lock_bh(&btcoex->btcoex_lock); |
358 | 370 | ||
359 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW) | 371 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan) |
360 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_NONE); | 372 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_NONE); |
361 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) | 373 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) |
362 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_LOW); | 374 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_LOW); |
@@ -371,6 +383,8 @@ int ath_init_btcoex_timer(struct ath_softc *sc) | |||
371 | btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; | 383 | btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; |
372 | btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * | 384 | btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * |
373 | btcoex->btcoex_period / 100; | 385 | btcoex->btcoex_period / 100; |
386 | btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * | ||
387 | btcoex->btcoex_period / 100; | ||
374 | 388 | ||
375 | setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, | 389 | setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, |
376 | (unsigned long) sc); | 390 | (unsigned long) sc); |
@@ -405,7 +419,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc) | |||
405 | 419 | ||
406 | btcoex->bt_priority_cnt = 0; | 420 | btcoex->bt_priority_cnt = 0; |
407 | btcoex->bt_priority_time = jiffies; | 421 | btcoex->bt_priority_time = jiffies; |
408 | sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; | 422 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); |
409 | 423 | ||
410 | mod_timer(&btcoex->period_timer, jiffies); | 424 | mod_timer(&btcoex->period_timer, jiffies); |
411 | } | 425 | } |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 1a27f39c1adc..f15fee76a4e2 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -334,7 +334,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
334 | ah->config.pcie_clock_req = 0; | 334 | ah->config.pcie_clock_req = 0; |
335 | ah->config.pcie_waen = 0; | 335 | ah->config.pcie_waen = 0; |
336 | ah->config.analog_shiftreg = 1; | 336 | ah->config.analog_shiftreg = 1; |
337 | ah->config.ht_enable = 1; | ||
338 | ah->config.ofdm_trig_low = 200; | 337 | ah->config.ofdm_trig_low = 200; |
339 | ah->config.ofdm_trig_high = 500; | 338 | ah->config.ofdm_trig_high = 500; |
340 | ah->config.cck_trig_high = 200; | 339 | ah->config.cck_trig_high = 200; |
@@ -346,6 +345,11 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
346 | ah->config.spurchans[i][1] = AR_NO_SPUR; | 345 | ah->config.spurchans[i][1] = AR_NO_SPUR; |
347 | } | 346 | } |
348 | 347 | ||
348 | if (ah->hw_version.devid != AR2427_DEVID_PCIE) | ||
349 | ah->config.ht_enable = 1; | ||
350 | else | ||
351 | ah->config.ht_enable = 0; | ||
352 | |||
349 | ah->config.rx_intr_mitigation = true; | 353 | ah->config.rx_intr_mitigation = true; |
350 | 354 | ||
351 | /* | 355 | /* |
@@ -542,6 +546,7 @@ static bool ath9k_hw_devid_supported(u16 devid) | |||
542 | case AR5416_DEVID_AR9287_PCI: | 546 | case AR5416_DEVID_AR9287_PCI: |
543 | case AR5416_DEVID_AR9287_PCIE: | 547 | case AR5416_DEVID_AR9287_PCIE: |
544 | case AR9271_USB: | 548 | case AR9271_USB: |
549 | case AR2427_DEVID_PCIE: | ||
545 | return true; | 550 | return true; |
546 | default: | 551 | default: |
547 | break; | 552 | break; |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index ab1f1981d857..dbbf7ca5f97d 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -40,6 +40,7 @@ | |||
40 | #define AR9280_DEVID_PCI 0x0029 | 40 | #define AR9280_DEVID_PCI 0x0029 |
41 | #define AR9280_DEVID_PCIE 0x002a | 41 | #define AR9280_DEVID_PCIE 0x002a |
42 | #define AR9285_DEVID_PCIE 0x002b | 42 | #define AR9285_DEVID_PCIE 0x002b |
43 | #define AR2427_DEVID_PCIE 0x002c | ||
43 | 44 | ||
44 | #define AR5416_AR9100_DEVID 0x000b | 45 | #define AR5416_AR9100_DEVID 0x000b |
45 | 46 | ||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 5f78d7a5ff22..4b5e54848683 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -620,11 +620,13 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
620 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | | 620 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | |
621 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | 621 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
622 | IEEE80211_HW_SIGNAL_DBM | | 622 | IEEE80211_HW_SIGNAL_DBM | |
623 | IEEE80211_HW_AMPDU_AGGREGATION | | ||
624 | IEEE80211_HW_SUPPORTS_PS | | 623 | IEEE80211_HW_SUPPORTS_PS | |
625 | IEEE80211_HW_PS_NULLFUNC_STACK | | 624 | IEEE80211_HW_PS_NULLFUNC_STACK | |
626 | IEEE80211_HW_SPECTRUM_MGMT; | 625 | IEEE80211_HW_SPECTRUM_MGMT; |
627 | 626 | ||
627 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) | ||
628 | hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; | ||
629 | |||
628 | if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt) | 630 | if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt) |
629 | hw->flags |= IEEE80211_HW_MFP_CAPABLE; | 631 | hw->flags |= IEEE80211_HW_MFP_CAPABLE; |
630 | 632 | ||
@@ -640,8 +642,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
640 | hw->max_rates = 4; | 642 | hw->max_rates = 4; |
641 | hw->channel_change_time = 5000; | 643 | hw->channel_change_time = 5000; |
642 | hw->max_listen_interval = 10; | 644 | hw->max_listen_interval = 10; |
643 | /* Hardware supports 10 but we use 4 */ | 645 | hw->max_rate_tries = 10; |
644 | hw->max_rate_tries = 4; | ||
645 | hw->sta_data_size = sizeof(struct ath_node); | 646 | hw->sta_data_size = sizeof(struct ath_node); |
646 | hw->vif_data_size = sizeof(struct ath_vif); | 647 | hw->vif_data_size = sizeof(struct ath_vif); |
647 | 648 | ||
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 6aaca0026da8..6796d5cdc293 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -143,8 +143,10 @@ void ath9k_ps_restore(struct ath_softc *sc) | |||
143 | if (--sc->ps_usecount != 0) | 143 | if (--sc->ps_usecount != 0) |
144 | goto unlock; | 144 | goto unlock; |
145 | 145 | ||
146 | if (sc->ps_enabled && | 146 | if (sc->ps_idle) |
147 | !(sc->ps_flags & (PS_WAIT_FOR_BEACON | | 147 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); |
148 | else if (sc->ps_enabled && | ||
149 | !(sc->ps_flags & (PS_WAIT_FOR_BEACON | | ||
148 | PS_WAIT_FOR_CAB | | 150 | PS_WAIT_FOR_CAB | |
149 | PS_WAIT_FOR_PSPOLL_DATA | | 151 | PS_WAIT_FOR_PSPOLL_DATA | |
150 | PS_WAIT_FOR_TX_ACK))) | 152 | PS_WAIT_FOR_TX_ACK))) |
@@ -204,7 +206,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, | |||
204 | r = ath9k_hw_reset(ah, hchan, fastcc); | 206 | r = ath9k_hw_reset(ah, hchan, fastcc); |
205 | if (r) { | 207 | if (r) { |
206 | ath_print(common, ATH_DBG_FATAL, | 208 | ath_print(common, ATH_DBG_FATAL, |
207 | "Unable to reset channel (%u Mhz) " | 209 | "Unable to reset channel (%u MHz), " |
208 | "reset status %d\n", | 210 | "reset status %d\n", |
209 | channel->center_freq, r); | 211 | channel->center_freq, r); |
210 | spin_unlock_bh(&sc->sc_resetlock); | 212 | spin_unlock_bh(&sc->sc_resetlock); |
@@ -867,7 +869,7 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
867 | r = ath9k_hw_reset(ah, ah->curchan, false); | 869 | r = ath9k_hw_reset(ah, ah->curchan, false); |
868 | if (r) { | 870 | if (r) { |
869 | ath_print(common, ATH_DBG_FATAL, | 871 | ath_print(common, ATH_DBG_FATAL, |
870 | "Unable to reset channel %u (%uMhz) ", | 872 | "Unable to reset channel (%u MHz), " |
871 | "reset status %d\n", | 873 | "reset status %d\n", |
872 | channel->center_freq, r); | 874 | channel->center_freq, r); |
873 | } | 875 | } |
@@ -922,7 +924,7 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
922 | r = ath9k_hw_reset(ah, ah->curchan, false); | 924 | r = ath9k_hw_reset(ah, ah->curchan, false); |
923 | if (r) { | 925 | if (r) { |
924 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL, | 926 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL, |
925 | "Unable to reset channel %u (%uMhz) " | 927 | "Unable to reset channel (%u MHz), " |
926 | "reset status %d\n", | 928 | "reset status %d\n", |
927 | channel->center_freq, r); | 929 | channel->center_freq, r); |
928 | } | 930 | } |
@@ -1528,6 +1530,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) | |||
1528 | spin_unlock_bh(&sc->wiphy_lock); | 1530 | spin_unlock_bh(&sc->wiphy_lock); |
1529 | 1531 | ||
1530 | if (enable_radio) { | 1532 | if (enable_radio) { |
1533 | sc->ps_idle = false; | ||
1531 | ath_radio_enable(sc, hw); | 1534 | ath_radio_enable(sc, hw); |
1532 | ath_print(common, ATH_DBG_CONFIG, | 1535 | ath_print(common, ATH_DBG_CONFIG, |
1533 | "not-idle: enabling radio\n"); | 1536 | "not-idle: enabling radio\n"); |
@@ -1624,8 +1627,10 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) | |||
1624 | } | 1627 | } |
1625 | 1628 | ||
1626 | skip_chan_change: | 1629 | skip_chan_change: |
1627 | if (changed & IEEE80211_CONF_CHANGE_POWER) | 1630 | if (changed & IEEE80211_CONF_CHANGE_POWER) { |
1628 | sc->config.txpowlimit = 2 * conf->power_level; | 1631 | sc->config.txpowlimit = 2 * conf->power_level; |
1632 | ath_update_txpow(sc); | ||
1633 | } | ||
1629 | 1634 | ||
1630 | spin_lock_bh(&sc->wiphy_lock); | 1635 | spin_lock_bh(&sc->wiphy_lock); |
1631 | disable_radio = ath9k_all_wiphys_idle(sc); | 1636 | disable_radio = ath9k_all_wiphys_idle(sc); |
@@ -1633,6 +1638,7 @@ skip_chan_change: | |||
1633 | 1638 | ||
1634 | if (disable_radio) { | 1639 | if (disable_radio) { |
1635 | ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); | 1640 | ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); |
1641 | sc->ps_idle = true; | ||
1636 | ath_radio_disable(sc, hw); | 1642 | ath_radio_disable(sc, hw); |
1637 | } | 1643 | } |
1638 | 1644 | ||
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index fe2c3a644a6e..9441c6718a30 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -25,6 +25,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = { | |||
25 | { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ | 25 | { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ |
26 | { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ | 26 | { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ |
27 | { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ | 27 | { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ |
28 | { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ | ||
28 | { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ | 29 | { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ |
29 | { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ | 30 | { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ |
30 | { 0 } | 31 | { 0 } |
@@ -49,16 +50,6 @@ static void ath_pci_read_cachesize(struct ath_common *common, int *csz) | |||
49 | *csz = DEFAULT_CACHELINE >> 2; /* Use the default size */ | 50 | *csz = DEFAULT_CACHELINE >> 2; /* Use the default size */ |
50 | } | 51 | } |
51 | 52 | ||
52 | static void ath_pci_cleanup(struct ath_common *common) | ||
53 | { | ||
54 | struct ath_softc *sc = (struct ath_softc *) common->priv; | ||
55 | struct pci_dev *pdev = to_pci_dev(sc->dev); | ||
56 | |||
57 | pci_iounmap(pdev, sc->mem); | ||
58 | pci_disable_device(pdev); | ||
59 | pci_release_region(pdev, 0); | ||
60 | } | ||
61 | |||
62 | static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data) | 53 | static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data) |
63 | { | 54 | { |
64 | struct ath_hw *ah = (struct ath_hw *) common->ah; | 55 | struct ath_hw *ah = (struct ath_hw *) common->ah; |
@@ -98,7 +89,6 @@ static void ath_pci_bt_coex_prep(struct ath_common *common) | |||
98 | 89 | ||
99 | static const struct ath_bus_ops ath_pci_bus_ops = { | 90 | static const struct ath_bus_ops ath_pci_bus_ops = { |
100 | .read_cachesize = ath_pci_read_cachesize, | 91 | .read_cachesize = ath_pci_read_cachesize, |
101 | .cleanup = ath_pci_cleanup, | ||
102 | .eeprom_read = ath_pci_eeprom_read, | 92 | .eeprom_read = ath_pci_eeprom_read, |
103 | .bt_coex_prep = ath_pci_bt_coex_prep, | 93 | .bt_coex_prep = ath_pci_bt_coex_prep, |
104 | }; | 94 | }; |
@@ -245,12 +235,15 @@ static void ath_pci_remove(struct pci_dev *pdev) | |||
245 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | 235 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
246 | struct ath_wiphy *aphy = hw->priv; | 236 | struct ath_wiphy *aphy = hw->priv; |
247 | struct ath_softc *sc = aphy->sc; | 237 | struct ath_softc *sc = aphy->sc; |
248 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 238 | void __iomem *mem = sc->mem; |
249 | 239 | ||
250 | ath9k_deinit_device(sc); | 240 | ath9k_deinit_device(sc); |
251 | free_irq(sc->irq, sc); | 241 | free_irq(sc->irq, sc); |
252 | ieee80211_free_hw(sc->hw); | 242 | ieee80211_free_hw(sc->hw); |
253 | ath_bus_cleanup(common); | 243 | |
244 | pci_iounmap(pdev, mem); | ||
245 | pci_disable_device(pdev); | ||
246 | pci_release_region(pdev, 0); | ||
254 | } | 247 | } |
255 | 248 | ||
256 | #ifdef CONFIG_PM | 249 | #ifdef CONFIG_PM |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 70fdb9d8db82..11968843c773 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -678,13 +678,13 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
678 | * For Multi Rate Retry we use a different number of | 678 | * For Multi Rate Retry we use a different number of |
679 | * retry attempt counts. This ends up looking like this: | 679 | * retry attempt counts. This ends up looking like this: |
680 | * | 680 | * |
681 | * MRR[0] = 2 | 681 | * MRR[0] = 4 |
682 | * MRR[1] = 2 | 682 | * MRR[1] = 4 |
683 | * MRR[2] = 2 | 683 | * MRR[2] = 4 |
684 | * MRR[3] = 4 | 684 | * MRR[3] = 8 |
685 | * | 685 | * |
686 | */ | 686 | */ |
687 | try_per_rate = sc->hw->max_rate_tries; | 687 | try_per_rate = 4; |
688 | 688 | ||
689 | rate_table = sc->cur_rate_table; | 689 | rate_table = sc->cur_rate_table; |
690 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); | 690 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); |
@@ -714,7 +714,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
714 | for ( ; i < 4; i++) { | 714 | for ( ; i < 4; i++) { |
715 | /* Use twice the number of tries for the last MRR segment. */ | 715 | /* Use twice the number of tries for the last MRR segment. */ |
716 | if (i + 1 == 4) | 716 | if (i + 1 == 4) |
717 | try_per_rate = 4; | 717 | try_per_rate = 8; |
718 | 718 | ||
719 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); | 719 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); |
720 | /* All other rates in the series have RTS enabled */ | 720 | /* All other rates in the series have RTS enabled */ |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 40b5d05edcce..1ca42e5148c8 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -429,7 +429,7 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb) | |||
429 | sc->ps_flags &= ~PS_WAIT_FOR_PSPOLL_DATA; | 429 | sc->ps_flags &= ~PS_WAIT_FOR_PSPOLL_DATA; |
430 | ath_print(common, ATH_DBG_PS, | 430 | ath_print(common, ATH_DBG_PS, |
431 | "Going back to sleep after having received " | 431 | "Going back to sleep after having received " |
432 | "PS-Poll data (0x%x)\n", | 432 | "PS-Poll data (0x%lx)\n", |
433 | sc->ps_flags & (PS_WAIT_FOR_BEACON | | 433 | sc->ps_flags & (PS_WAIT_FOR_BEACON | |
434 | PS_WAIT_FOR_CAB | | 434 | PS_WAIT_FOR_CAB | |
435 | PS_WAIT_FOR_PSPOLL_DATA | | 435 | PS_WAIT_FOR_PSPOLL_DATA | |
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 8e653fb937a1..72cfa8ebd9ae 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
@@ -1547,9 +1547,9 @@ enum { | |||
1547 | 1547 | ||
1548 | #define AR_BT_COEX_WEIGHT 0x8174 | 1548 | #define AR_BT_COEX_WEIGHT 0x8174 |
1549 | #define AR_BT_COEX_WGHT 0xff55 | 1549 | #define AR_BT_COEX_WGHT 0xff55 |
1550 | #define AR_STOMP_ALL_WLAN_WGHT 0xffcc | 1550 | #define AR_STOMP_ALL_WLAN_WGHT 0xfcfc |
1551 | #define AR_STOMP_LOW_WLAN_WGHT 0xaaa8 | 1551 | #define AR_STOMP_LOW_WLAN_WGHT 0xa8a8 |
1552 | #define AR_STOMP_NONE_WLAN_WGHT 0xaa00 | 1552 | #define AR_STOMP_NONE_WLAN_WGHT 0x0000 |
1553 | #define AR_BTCOEX_BT_WGHT 0x0000ffff | 1553 | #define AR_BTCOEX_BT_WGHT 0x0000ffff |
1554 | #define AR_BTCOEX_BT_WGHT_S 0 | 1554 | #define AR_BTCOEX_BT_WGHT_S 0 |
1555 | #define AR_BTCOEX_WL_WGHT 0xffff0000 | 1555 | #define AR_BTCOEX_WL_WGHT 0xffff0000 |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index a821bb687b3b..3c790a4f38f7 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -1498,26 +1498,6 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
1498 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | 1498 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
1499 | ctsrate |= rate->hw_value_short; | 1499 | ctsrate |= rate->hw_value_short; |
1500 | 1500 | ||
1501 | /* | ||
1502 | * ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. | ||
1503 | * Check the first rate in the series to decide whether RTS/CTS | ||
1504 | * or CTS-to-self has to be used. | ||
1505 | */ | ||
1506 | if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) | ||
1507 | flags = ATH9K_TXDESC_CTSENA; | ||
1508 | else if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) | ||
1509 | flags = ATH9K_TXDESC_RTSENA; | ||
1510 | |||
1511 | /* FIXME: Handle aggregation protection */ | ||
1512 | if (sc->config.ath_aggr_prot && | ||
1513 | (!bf_isaggr(bf) || (bf_isaggr(bf) && bf->bf_al < 8192))) { | ||
1514 | flags = ATH9K_TXDESC_RTSENA; | ||
1515 | } | ||
1516 | |||
1517 | /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ | ||
1518 | if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) | ||
1519 | flags &= ~(ATH9K_TXDESC_RTSENA); | ||
1520 | |||
1521 | for (i = 0; i < 4; i++) { | 1501 | for (i = 0; i < 4; i++) { |
1522 | bool is_40, is_sgi, is_sp; | 1502 | bool is_40, is_sgi, is_sp; |
1523 | int phy; | 1503 | int phy; |
@@ -1529,8 +1509,15 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
1529 | series[i].Tries = rates[i].count; | 1509 | series[i].Tries = rates[i].count; |
1530 | series[i].ChSel = common->tx_chainmask; | 1510 | series[i].ChSel = common->tx_chainmask; |
1531 | 1511 | ||
1532 | if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) | 1512 | if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) || |
1513 | (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) { | ||
1533 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; | 1514 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; |
1515 | flags |= ATH9K_TXDESC_RTSENA; | ||
1516 | } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { | ||
1517 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; | ||
1518 | flags |= ATH9K_TXDESC_CTSENA; | ||
1519 | } | ||
1520 | |||
1534 | if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | 1521 | if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) |
1535 | series[i].RateFlags |= ATH9K_RATESERIES_2040; | 1522 | series[i].RateFlags |= ATH9K_RATESERIES_2040; |
1536 | if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) | 1523 | if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) |
@@ -1568,6 +1555,14 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
1568 | phy, rate->bitrate * 100, bf->bf_frmlen, rix, is_sp); | 1555 | phy, rate->bitrate * 100, bf->bf_frmlen, rix, is_sp); |
1569 | } | 1556 | } |
1570 | 1557 | ||
1558 | /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ | ||
1559 | if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit)) | ||
1560 | flags &= ~ATH9K_TXDESC_RTSENA; | ||
1561 | |||
1562 | /* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */ | ||
1563 | if (flags & ATH9K_TXDESC_RTSENA) | ||
1564 | flags &= ~ATH9K_TXDESC_CTSENA; | ||
1565 | |||
1571 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ | 1566 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ |
1572 | ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, | 1567 | ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, |
1573 | bf->bf_lastbf->bf_desc, | 1568 | bf->bf_lastbf->bf_desc, |
@@ -1862,7 +1857,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, | |||
1862 | sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; | 1857 | sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; |
1863 | ath_print(common, ATH_DBG_PS, | 1858 | ath_print(common, ATH_DBG_PS, |
1864 | "Going back to sleep after having " | 1859 | "Going back to sleep after having " |
1865 | "received TX status (0x%x)\n", | 1860 | "received TX status (0x%lx)\n", |
1866 | sc->ps_flags & (PS_WAIT_FOR_BEACON | | 1861 | sc->ps_flags & (PS_WAIT_FOR_BEACON | |
1867 | PS_WAIT_FOR_CAB | | 1862 | PS_WAIT_FOR_CAB | |
1868 | PS_WAIT_FOR_PSPOLL_DATA | | 1863 | PS_WAIT_FOR_PSPOLL_DATA | |