]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/net/wireless/ath/ath9k/mac.c
ath9k: qinfo never be NULL in setuptxqueue
[mv-sheeva.git] / drivers / net / wireless / ath / ath9k / mac.c
1 /*
2  * Copyright (c) 2008-2011 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include "hw.h"
18 #include "hw-ops.h"
19
20 static void ath9k_hw_set_txq_interrupts(struct ath_hw *ah,
21                                         struct ath9k_tx_queue_info *qi)
22 {
23         ath_dbg(ath9k_hw_common(ah), ATH_DBG_INTERRUPT,
24                 "tx ok 0x%x err 0x%x desc 0x%x eol 0x%x urn 0x%x\n",
25                 ah->txok_interrupt_mask, ah->txerr_interrupt_mask,
26                 ah->txdesc_interrupt_mask, ah->txeol_interrupt_mask,
27                 ah->txurn_interrupt_mask);
28
29         ENABLE_REGWRITE_BUFFER(ah);
30
31         REG_WRITE(ah, AR_IMR_S0,
32                   SM(ah->txok_interrupt_mask, AR_IMR_S0_QCU_TXOK)
33                   | SM(ah->txdesc_interrupt_mask, AR_IMR_S0_QCU_TXDESC));
34         REG_WRITE(ah, AR_IMR_S1,
35                   SM(ah->txerr_interrupt_mask, AR_IMR_S1_QCU_TXERR)
36                   | SM(ah->txeol_interrupt_mask, AR_IMR_S1_QCU_TXEOL));
37
38         ah->imrs2_reg &= ~AR_IMR_S2_QCU_TXURN;
39         ah->imrs2_reg |= (ah->txurn_interrupt_mask & AR_IMR_S2_QCU_TXURN);
40         REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
41
42         REGWRITE_BUFFER_FLUSH(ah);
43 }
44
45 u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q)
46 {
47         return REG_READ(ah, AR_QTXDP(q));
48 }
49 EXPORT_SYMBOL(ath9k_hw_gettxbuf);
50
51 void ath9k_hw_puttxbuf(struct ath_hw *ah, u32 q, u32 txdp)
52 {
53         REG_WRITE(ah, AR_QTXDP(q), txdp);
54 }
55 EXPORT_SYMBOL(ath9k_hw_puttxbuf);
56
57 void ath9k_hw_txstart(struct ath_hw *ah, u32 q)
58 {
59         ath_dbg(ath9k_hw_common(ah), ATH_DBG_QUEUE,
60                 "Enable TXE on queue: %u\n", q);
61         REG_WRITE(ah, AR_Q_TXE, 1 << q);
62 }
63 EXPORT_SYMBOL(ath9k_hw_txstart);
64
65 void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds)
66 {
67         struct ar5416_desc *ads = AR5416DESC(ds);
68
69         ads->ds_txstatus0 = ads->ds_txstatus1 = 0;
70         ads->ds_txstatus2 = ads->ds_txstatus3 = 0;
71         ads->ds_txstatus4 = ads->ds_txstatus5 = 0;
72         ads->ds_txstatus6 = ads->ds_txstatus7 = 0;
73         ads->ds_txstatus8 = ads->ds_txstatus9 = 0;
74 }
75 EXPORT_SYMBOL(ath9k_hw_cleartxdesc);
76
77 u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q)
78 {
79         u32 npend;
80
81         npend = REG_READ(ah, AR_QSTS(q)) & AR_Q_STS_PEND_FR_CNT;
82         if (npend == 0) {
83
84                 if (REG_READ(ah, AR_Q_TXE) & (1 << q))
85                         npend = 1;
86         }
87
88         return npend;
89 }
90 EXPORT_SYMBOL(ath9k_hw_numtxpending);
91
92 /**
93  * ath9k_hw_updatetxtriglevel - adjusts the frame trigger level
94  *
95  * @ah: atheros hardware struct
96  * @bIncTrigLevel: whether or not the frame trigger level should be updated
97  *
98  * The frame trigger level specifies the minimum number of bytes,
99  * in units of 64 bytes, that must be DMA'ed into the PCU TX FIFO
100  * before the PCU will initiate sending the frame on the air. This can
101  * mean we initiate transmit before a full frame is on the PCU TX FIFO.
102  * Resets to 0x1 (meaning 64 bytes or a full frame, whichever occurs
103  * first)
104  *
105  * Caution must be taken to ensure to set the frame trigger level based
106  * on the DMA request size. For example if the DMA request size is set to
107  * 128 bytes the trigger level cannot exceed 6 * 64 = 384. This is because
108  * there need to be enough space in the tx FIFO for the requested transfer
109  * size. Hence the tx FIFO will stop with 512 - 128 = 384 bytes. If we set
110  * the threshold to a value beyond 6, then the transmit will hang.
111  *
112  * Current dual   stream devices have a PCU TX FIFO size of 8 KB.
113  * Current single stream devices have a PCU TX FIFO size of 4 KB, however,
114  * there is a hardware issue which forces us to use 2 KB instead so the
115  * frame trigger level must not exceed 2 KB for these chipsets.
116  */
117 bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel)
118 {
119         u32 txcfg, curLevel, newLevel;
120
121         if (ah->tx_trig_level >= ah->config.max_txtrig_level)
122                 return false;
123
124         ath9k_hw_disable_interrupts(ah);
125
126         txcfg = REG_READ(ah, AR_TXCFG);
127         curLevel = MS(txcfg, AR_FTRIG);
128         newLevel = curLevel;
129         if (bIncTrigLevel) {
130                 if (curLevel < ah->config.max_txtrig_level)
131                         newLevel++;
132         } else if (curLevel > MIN_TX_FIFO_THRESHOLD)
133                 newLevel--;
134         if (newLevel != curLevel)
135                 REG_WRITE(ah, AR_TXCFG,
136                           (txcfg & ~AR_FTRIG) | SM(newLevel, AR_FTRIG));
137
138         ath9k_hw_enable_interrupts(ah);
139
140         ah->tx_trig_level = newLevel;
141
142         return newLevel != curLevel;
143 }
144 EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel);
145
146 void ath9k_hw_abort_tx_dma(struct ath_hw *ah)
147 {
148         int i, q;
149
150         REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M);
151
152         REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF);
153         REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
154         REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF);
155
156         for (q = 0; q < AR_NUM_QCU; q++) {
157                 for (i = 0; i < 1000; i++) {
158                         if (i)
159                                 udelay(5);
160
161                         if (!ath9k_hw_numtxpending(ah, q))
162                                 break;
163                 }
164         }
165
166         REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF);
167         REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
168         REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF);
169
170         REG_WRITE(ah, AR_Q_TXD, 0);
171 }
172 EXPORT_SYMBOL(ath9k_hw_abort_tx_dma);
173
174 bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q)
175 {
176 #define ATH9K_TX_STOP_DMA_TIMEOUT       1000    /* usec */
177 #define ATH9K_TIME_QUANTUM              100     /* usec */
178         int wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM;
179         int wait;
180
181         REG_WRITE(ah, AR_Q_TXD, 1 << q);
182
183         for (wait = wait_time; wait != 0; wait--) {
184                 if (wait != wait_time)
185                         udelay(ATH9K_TIME_QUANTUM);
186
187                 if (ath9k_hw_numtxpending(ah, q) == 0)
188                         break;
189         }
190
191         REG_WRITE(ah, AR_Q_TXD, 0);
192
193         return wait != 0;
194
195 #undef ATH9K_TX_STOP_DMA_TIMEOUT
196 #undef ATH9K_TIME_QUANTUM
197 }
198 EXPORT_SYMBOL(ath9k_hw_stop_dma_queue);
199
200 void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs)
201 {
202         *txqs &= ah->intr_txqs;
203         ah->intr_txqs &= ~(*txqs);
204 }
205 EXPORT_SYMBOL(ath9k_hw_gettxintrtxqs);
206
207 bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q,
208                             const struct ath9k_tx_queue_info *qinfo)
209 {
210         u32 cw;
211         struct ath_common *common = ath9k_hw_common(ah);
212         struct ath9k_tx_queue_info *qi;
213
214         qi = &ah->txq[q];
215         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
216                 ath_dbg(common, ATH_DBG_QUEUE,
217                         "Set TXQ properties, inactive queue: %u\n", q);
218                 return false;
219         }
220
221         ath_dbg(common, ATH_DBG_QUEUE, "Set queue properties for: %u\n", q);
222
223         qi->tqi_ver = qinfo->tqi_ver;
224         qi->tqi_subtype = qinfo->tqi_subtype;
225         qi->tqi_qflags = qinfo->tqi_qflags;
226         qi->tqi_priority = qinfo->tqi_priority;
227         if (qinfo->tqi_aifs != ATH9K_TXQ_USEDEFAULT)
228                 qi->tqi_aifs = min(qinfo->tqi_aifs, 255U);
229         else
230                 qi->tqi_aifs = INIT_AIFS;
231         if (qinfo->tqi_cwmin != ATH9K_TXQ_USEDEFAULT) {
232                 cw = min(qinfo->tqi_cwmin, 1024U);
233                 qi->tqi_cwmin = 1;
234                 while (qi->tqi_cwmin < cw)
235                         qi->tqi_cwmin = (qi->tqi_cwmin << 1) | 1;
236         } else
237                 qi->tqi_cwmin = qinfo->tqi_cwmin;
238         if (qinfo->tqi_cwmax != ATH9K_TXQ_USEDEFAULT) {
239                 cw = min(qinfo->tqi_cwmax, 1024U);
240                 qi->tqi_cwmax = 1;
241                 while (qi->tqi_cwmax < cw)
242                         qi->tqi_cwmax = (qi->tqi_cwmax << 1) | 1;
243         } else
244                 qi->tqi_cwmax = INIT_CWMAX;
245
246         if (qinfo->tqi_shretry != 0)
247                 qi->tqi_shretry = min((u32) qinfo->tqi_shretry, 15U);
248         else
249                 qi->tqi_shretry = INIT_SH_RETRY;
250         if (qinfo->tqi_lgretry != 0)
251                 qi->tqi_lgretry = min((u32) qinfo->tqi_lgretry, 15U);
252         else
253                 qi->tqi_lgretry = INIT_LG_RETRY;
254         qi->tqi_cbrPeriod = qinfo->tqi_cbrPeriod;
255         qi->tqi_cbrOverflowLimit = qinfo->tqi_cbrOverflowLimit;
256         qi->tqi_burstTime = qinfo->tqi_burstTime;
257         qi->tqi_readyTime = qinfo->tqi_readyTime;
258
259         switch (qinfo->tqi_subtype) {
260         case ATH9K_WME_UPSD:
261                 if (qi->tqi_type == ATH9K_TX_QUEUE_DATA)
262                         qi->tqi_intFlags = ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS;
263                 break;
264         default:
265                 break;
266         }
267
268         return true;
269 }
270 EXPORT_SYMBOL(ath9k_hw_set_txq_props);
271
272 bool ath9k_hw_get_txq_props(struct ath_hw *ah, int q,
273                             struct ath9k_tx_queue_info *qinfo)
274 {
275         struct ath_common *common = ath9k_hw_common(ah);
276         struct ath9k_tx_queue_info *qi;
277
278         qi = &ah->txq[q];
279         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
280                 ath_dbg(common, ATH_DBG_QUEUE,
281                         "Get TXQ properties, inactive queue: %u\n", q);
282                 return false;
283         }
284
285         qinfo->tqi_qflags = qi->tqi_qflags;
286         qinfo->tqi_ver = qi->tqi_ver;
287         qinfo->tqi_subtype = qi->tqi_subtype;
288         qinfo->tqi_qflags = qi->tqi_qflags;
289         qinfo->tqi_priority = qi->tqi_priority;
290         qinfo->tqi_aifs = qi->tqi_aifs;
291         qinfo->tqi_cwmin = qi->tqi_cwmin;
292         qinfo->tqi_cwmax = qi->tqi_cwmax;
293         qinfo->tqi_shretry = qi->tqi_shretry;
294         qinfo->tqi_lgretry = qi->tqi_lgretry;
295         qinfo->tqi_cbrPeriod = qi->tqi_cbrPeriod;
296         qinfo->tqi_cbrOverflowLimit = qi->tqi_cbrOverflowLimit;
297         qinfo->tqi_burstTime = qi->tqi_burstTime;
298         qinfo->tqi_readyTime = qi->tqi_readyTime;
299
300         return true;
301 }
302 EXPORT_SYMBOL(ath9k_hw_get_txq_props);
303
304 int ath9k_hw_setuptxqueue(struct ath_hw *ah, enum ath9k_tx_queue type,
305                           const struct ath9k_tx_queue_info *qinfo)
306 {
307         struct ath_common *common = ath9k_hw_common(ah);
308         struct ath9k_tx_queue_info *qi;
309         int q;
310
311         switch (type) {
312         case ATH9K_TX_QUEUE_BEACON:
313                 q = ATH9K_NUM_TX_QUEUES - 1;
314                 break;
315         case ATH9K_TX_QUEUE_CAB:
316                 q = ATH9K_NUM_TX_QUEUES - 2;
317                 break;
318         case ATH9K_TX_QUEUE_PSPOLL:
319                 q = 1;
320                 break;
321         case ATH9K_TX_QUEUE_UAPSD:
322                 q = ATH9K_NUM_TX_QUEUES - 3;
323                 break;
324         case ATH9K_TX_QUEUE_DATA:
325                 for (q = 0; q < ATH9K_NUM_TX_QUEUES; q++)
326                         if (ah->txq[q].tqi_type ==
327                             ATH9K_TX_QUEUE_INACTIVE)
328                                 break;
329                 if (q == ATH9K_NUM_TX_QUEUES) {
330                         ath_err(common, "No available TX queue\n");
331                         return -1;
332                 }
333                 break;
334         default:
335                 ath_err(common, "Invalid TX queue type: %u\n", type);
336                 return -1;
337         }
338
339         ath_dbg(common, ATH_DBG_QUEUE, "Setup TX queue: %u\n", q);
340
341         qi = &ah->txq[q];
342         if (qi->tqi_type != ATH9K_TX_QUEUE_INACTIVE) {
343                 ath_err(common, "TX queue: %u already active\n", q);
344                 return -1;
345         }
346         memset(qi, 0, sizeof(struct ath9k_tx_queue_info));
347         qi->tqi_type = type;
348         qi->tqi_physCompBuf = qinfo->tqi_physCompBuf;
349         (void) ath9k_hw_set_txq_props(ah, q, qinfo);
350
351         return q;
352 }
353 EXPORT_SYMBOL(ath9k_hw_setuptxqueue);
354
355 bool ath9k_hw_releasetxqueue(struct ath_hw *ah, u32 q)
356 {
357         struct ath_common *common = ath9k_hw_common(ah);
358         struct ath9k_tx_queue_info *qi;
359
360         qi = &ah->txq[q];
361         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
362                 ath_dbg(common, ATH_DBG_QUEUE,
363                         "Release TXQ, inactive queue: %u\n", q);
364                 return false;
365         }
366
367         ath_dbg(common, ATH_DBG_QUEUE, "Release TX queue: %u\n", q);
368
369         qi->tqi_type = ATH9K_TX_QUEUE_INACTIVE;
370         ah->txok_interrupt_mask &= ~(1 << q);
371         ah->txerr_interrupt_mask &= ~(1 << q);
372         ah->txdesc_interrupt_mask &= ~(1 << q);
373         ah->txeol_interrupt_mask &= ~(1 << q);
374         ah->txurn_interrupt_mask &= ~(1 << q);
375         ath9k_hw_set_txq_interrupts(ah, qi);
376
377         return true;
378 }
379 EXPORT_SYMBOL(ath9k_hw_releasetxqueue);
380
381 bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q)
382 {
383         struct ath_common *common = ath9k_hw_common(ah);
384         struct ath9k_channel *chan = ah->curchan;
385         struct ath9k_tx_queue_info *qi;
386         u32 cwMin, chanCwMin, value;
387
388         qi = &ah->txq[q];
389         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
390                 ath_dbg(common, ATH_DBG_QUEUE,
391                         "Reset TXQ, inactive queue: %u\n", q);
392                 return true;
393         }
394
395         ath_dbg(common, ATH_DBG_QUEUE, "Reset TX queue: %u\n", q);
396
397         if (qi->tqi_cwmin == ATH9K_TXQ_USEDEFAULT) {
398                 if (chan && IS_CHAN_B(chan))
399                         chanCwMin = INIT_CWMIN_11B;
400                 else
401                         chanCwMin = INIT_CWMIN;
402
403                 for (cwMin = 1; cwMin < chanCwMin; cwMin = (cwMin << 1) | 1);
404         } else
405                 cwMin = qi->tqi_cwmin;
406
407         ENABLE_REGWRITE_BUFFER(ah);
408
409         REG_WRITE(ah, AR_DLCL_IFS(q),
410                   SM(cwMin, AR_D_LCL_IFS_CWMIN) |
411                   SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) |
412                   SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS));
413
414         REG_WRITE(ah, AR_DRETRY_LIMIT(q),
415                   SM(INIT_SSH_RETRY, AR_D_RETRY_LIMIT_STA_SH) |
416                   SM(INIT_SLG_RETRY, AR_D_RETRY_LIMIT_STA_LG) |
417                   SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH));
418
419         REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ);
420
421         if (AR_SREV_9340(ah))
422                 REG_WRITE(ah, AR_DMISC(q),
423                           AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1);
424         else
425                 REG_WRITE(ah, AR_DMISC(q),
426                           AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2);
427
428         if (qi->tqi_cbrPeriod) {
429                 REG_WRITE(ah, AR_QCBRCFG(q),
430                           SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) |
431                           SM(qi->tqi_cbrOverflowLimit, AR_Q_CBRCFG_OVF_THRESH));
432                 REG_SET_BIT(ah, AR_QMISC(q), AR_Q_MISC_FSP_CBR |
433                             (qi->tqi_cbrOverflowLimit ?
434                              AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN : 0));
435         }
436         if (qi->tqi_readyTime && (qi->tqi_type != ATH9K_TX_QUEUE_CAB)) {
437                 REG_WRITE(ah, AR_QRDYTIMECFG(q),
438                           SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_DURATION) |
439                           AR_Q_RDYTIMECFG_EN);
440         }
441
442         REG_WRITE(ah, AR_DCHNTIME(q),
443                   SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) |
444                   (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0));
445
446         if (qi->tqi_burstTime
447             && (qi->tqi_qflags & TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE))
448                 REG_SET_BIT(ah, AR_QMISC(q), AR_Q_MISC_RDYTIME_EXP_POLICY);
449
450         if (qi->tqi_qflags & TXQ_FLAG_BACKOFF_DISABLE)
451                 REG_SET_BIT(ah, AR_DMISC(q), AR_D_MISC_POST_FR_BKOFF_DIS);
452
453         REGWRITE_BUFFER_FLUSH(ah);
454
455         if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE)
456                 REG_SET_BIT(ah, AR_DMISC(q), AR_D_MISC_FRAG_BKOFF_EN);
457
458         switch (qi->tqi_type) {
459         case ATH9K_TX_QUEUE_BEACON:
460                 ENABLE_REGWRITE_BUFFER(ah);
461
462                 REG_SET_BIT(ah, AR_QMISC(q),
463                             AR_Q_MISC_FSP_DBA_GATED
464                             | AR_Q_MISC_BEACON_USE
465                             | AR_Q_MISC_CBR_INCR_DIS1);
466
467                 REG_SET_BIT(ah, AR_DMISC(q),
468                             (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL <<
469                              AR_D_MISC_ARB_LOCKOUT_CNTRL_S)
470                             | AR_D_MISC_BEACON_USE
471                             | AR_D_MISC_POST_FR_BKOFF_DIS);
472
473                 REGWRITE_BUFFER_FLUSH(ah);
474
475                 /*
476                  * cwmin and cwmax should be 0 for beacon queue
477                  * but not for IBSS as we would create an imbalance
478                  * on beaconing fairness for participating nodes.
479                  */
480                 if (AR_SREV_9300_20_OR_LATER(ah) &&
481                     ah->opmode != NL80211_IFTYPE_ADHOC) {
482                         REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN)
483                                   | SM(0, AR_D_LCL_IFS_CWMAX)
484                                   | SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS));
485                 }
486                 break;
487         case ATH9K_TX_QUEUE_CAB:
488                 ENABLE_REGWRITE_BUFFER(ah);
489
490                 REG_SET_BIT(ah, AR_QMISC(q),
491                             AR_Q_MISC_FSP_DBA_GATED
492                             | AR_Q_MISC_CBR_INCR_DIS1
493                             | AR_Q_MISC_CBR_INCR_DIS0);
494                 value = (qi->tqi_readyTime -
495                          (ah->config.sw_beacon_response_time -
496                           ah->config.dma_beacon_response_time) -
497                          ah->config.additional_swba_backoff) * 1024;
498                 REG_WRITE(ah, AR_QRDYTIMECFG(q),
499                           value | AR_Q_RDYTIMECFG_EN);
500                 REG_SET_BIT(ah, AR_DMISC(q),
501                             (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL <<
502                              AR_D_MISC_ARB_LOCKOUT_CNTRL_S));
503
504                 REGWRITE_BUFFER_FLUSH(ah);
505
506                 break;
507         case ATH9K_TX_QUEUE_PSPOLL:
508                 REG_SET_BIT(ah, AR_QMISC(q), AR_Q_MISC_CBR_INCR_DIS1);
509                 break;
510         case ATH9K_TX_QUEUE_UAPSD:
511                 REG_SET_BIT(ah, AR_DMISC(q), AR_D_MISC_POST_FR_BKOFF_DIS);
512                 break;
513         default:
514                 break;
515         }
516
517         if (qi->tqi_intFlags & ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS) {
518                 REG_SET_BIT(ah, AR_DMISC(q),
519                             SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
520                                AR_D_MISC_ARB_LOCKOUT_CNTRL) |
521                             AR_D_MISC_POST_FR_BKOFF_DIS);
522         }
523
524         if (AR_SREV_9300_20_OR_LATER(ah))
525                 REG_WRITE(ah, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN);
526
527         if (qi->tqi_qflags & TXQ_FLAG_TXOKINT_ENABLE)
528                 ah->txok_interrupt_mask |= 1 << q;
529         else
530                 ah->txok_interrupt_mask &= ~(1 << q);
531         if (qi->tqi_qflags & TXQ_FLAG_TXERRINT_ENABLE)
532                 ah->txerr_interrupt_mask |= 1 << q;
533         else
534                 ah->txerr_interrupt_mask &= ~(1 << q);
535         if (qi->tqi_qflags & TXQ_FLAG_TXDESCINT_ENABLE)
536                 ah->txdesc_interrupt_mask |= 1 << q;
537         else
538                 ah->txdesc_interrupt_mask &= ~(1 << q);
539         if (qi->tqi_qflags & TXQ_FLAG_TXEOLINT_ENABLE)
540                 ah->txeol_interrupt_mask |= 1 << q;
541         else
542                 ah->txeol_interrupt_mask &= ~(1 << q);
543         if (qi->tqi_qflags & TXQ_FLAG_TXURNINT_ENABLE)
544                 ah->txurn_interrupt_mask |= 1 << q;
545         else
546                 ah->txurn_interrupt_mask &= ~(1 << q);
547         ath9k_hw_set_txq_interrupts(ah, qi);
548
549         return true;
550 }
551 EXPORT_SYMBOL(ath9k_hw_resettxqueue);
552
553 int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
554                         struct ath_rx_status *rs)
555 {
556         struct ar5416_desc ads;
557         struct ar5416_desc *adsp = AR5416DESC(ds);
558         u32 phyerr;
559
560         if ((adsp->ds_rxstatus8 & AR_RxDone) == 0)
561                 return -EINPROGRESS;
562
563         ads.u.rx = adsp->u.rx;
564
565         rs->rs_status = 0;
566         rs->rs_flags = 0;
567
568         rs->rs_datalen = ads.ds_rxstatus1 & AR_DataLen;
569         rs->rs_tstamp = ads.AR_RcvTimestamp;
570
571         if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
572                 rs->rs_rssi = ATH9K_RSSI_BAD;
573                 rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD;
574                 rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD;
575                 rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD;
576                 rs->rs_rssi_ext0 = ATH9K_RSSI_BAD;
577                 rs->rs_rssi_ext1 = ATH9K_RSSI_BAD;
578                 rs->rs_rssi_ext2 = ATH9K_RSSI_BAD;
579         } else {
580                 rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
581                 rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0,
582                                                 AR_RxRSSIAnt00);
583                 rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0,
584                                                 AR_RxRSSIAnt01);
585                 rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0,
586                                                 AR_RxRSSIAnt02);
587                 rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4,
588                                                 AR_RxRSSIAnt10);
589                 rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4,
590                                                 AR_RxRSSIAnt11);
591                 rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4,
592                                                 AR_RxRSSIAnt12);
593         }
594         if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
595                 rs->rs_keyix = MS(ads.ds_rxstatus8, AR_KeyIdx);
596         else
597                 rs->rs_keyix = ATH9K_RXKEYIX_INVALID;
598
599         rs->rs_rate = RXSTATUS_RATE(ah, (&ads));
600         rs->rs_more = (ads.ds_rxstatus1 & AR_RxMore) ? 1 : 0;
601
602         rs->rs_isaggr = (ads.ds_rxstatus8 & AR_RxAggr) ? 1 : 0;
603         rs->rs_moreaggr =
604                 (ads.ds_rxstatus8 & AR_RxMoreAggr) ? 1 : 0;
605         rs->rs_antenna = MS(ads.ds_rxstatus3, AR_RxAntenna);
606         rs->rs_flags =
607                 (ads.ds_rxstatus3 & AR_GI) ? ATH9K_RX_GI : 0;
608         rs->rs_flags |=
609                 (ads.ds_rxstatus3 & AR_2040) ? ATH9K_RX_2040 : 0;
610
611         if (ads.ds_rxstatus8 & AR_PreDelimCRCErr)
612                 rs->rs_flags |= ATH9K_RX_DELIM_CRC_PRE;
613         if (ads.ds_rxstatus8 & AR_PostDelimCRCErr)
614                 rs->rs_flags |= ATH9K_RX_DELIM_CRC_POST;
615         if (ads.ds_rxstatus8 & AR_DecryptBusyErr)
616                 rs->rs_flags |= ATH9K_RX_DECRYPT_BUSY;
617
618         if ((ads.ds_rxstatus8 & AR_RxFrameOK) == 0) {
619                 /*
620                  * Treat these errors as mutually exclusive to avoid spurious
621                  * extra error reports from the hardware. If a CRC error is
622                  * reported, then decryption and MIC errors are irrelevant,
623                  * the frame is going to be dropped either way
624                  */
625                 if (ads.ds_rxstatus8 & AR_CRCErr)
626                         rs->rs_status |= ATH9K_RXERR_CRC;
627                 else if (ads.ds_rxstatus8 & AR_PHYErr) {
628                         rs->rs_status |= ATH9K_RXERR_PHY;
629                         phyerr = MS(ads.ds_rxstatus8, AR_PHYErrCode);
630                         rs->rs_phyerr = phyerr;
631                 } else if (ads.ds_rxstatus8 & AR_DecryptCRCErr)
632                         rs->rs_status |= ATH9K_RXERR_DECRYPT;
633                 else if (ads.ds_rxstatus8 & AR_MichaelErr)
634                         rs->rs_status |= ATH9K_RXERR_MIC;
635                 else if (ads.ds_rxstatus8 & AR_KeyMiss)
636                         rs->rs_status |= ATH9K_RXERR_DECRYPT;
637         }
638
639         return 0;
640 }
641 EXPORT_SYMBOL(ath9k_hw_rxprocdesc);
642
643 /*
644  * This can stop or re-enables RX.
645  *
646  * If bool is set this will kill any frame which is currently being
647  * transferred between the MAC and baseband and also prevent any new
648  * frames from getting started.
649  */
650 bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set)
651 {
652         u32 reg;
653
654         if (set) {
655                 REG_SET_BIT(ah, AR_DIAG_SW,
656                             (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
657
658                 if (!ath9k_hw_wait(ah, AR_OBS_BUS_1, AR_OBS_BUS_1_RX_STATE,
659                                    0, AH_WAIT_TIMEOUT)) {
660                         REG_CLR_BIT(ah, AR_DIAG_SW,
661                                     (AR_DIAG_RX_DIS |
662                                      AR_DIAG_RX_ABORT));
663
664                         reg = REG_READ(ah, AR_OBS_BUS_1);
665                         ath_err(ath9k_hw_common(ah),
666                                 "RX failed to go idle in 10 ms RXSM=0x%x\n",
667                                 reg);
668
669                         return false;
670                 }
671         } else {
672                 REG_CLR_BIT(ah, AR_DIAG_SW,
673                             (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
674         }
675
676         return true;
677 }
678 EXPORT_SYMBOL(ath9k_hw_setrxabort);
679
680 void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp)
681 {
682         REG_WRITE(ah, AR_RXDP, rxdp);
683 }
684 EXPORT_SYMBOL(ath9k_hw_putrxbuf);
685
686 void ath9k_hw_startpcureceive(struct ath_hw *ah, bool is_scanning)
687 {
688         ath9k_enable_mib_counters(ah);
689
690         ath9k_ani_reset(ah, is_scanning);
691
692         REG_CLR_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
693 }
694 EXPORT_SYMBOL(ath9k_hw_startpcureceive);
695
696 void ath9k_hw_abortpcurecv(struct ath_hw *ah)
697 {
698         REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_ABORT | AR_DIAG_RX_DIS);
699
700         ath9k_hw_disable_mib_counters(ah);
701 }
702 EXPORT_SYMBOL(ath9k_hw_abortpcurecv);
703
704 bool ath9k_hw_stopdmarecv(struct ath_hw *ah, bool *reset)
705 {
706 #define AH_RX_STOP_DMA_TIMEOUT 10000   /* usec */
707         struct ath_common *common = ath9k_hw_common(ah);
708         u32 mac_status, last_mac_status = 0;
709         int i;
710
711         /* Enable access to the DMA observation bus */
712         REG_WRITE(ah, AR_MACMISC,
713                   ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) |
714                    (AR_MACMISC_MISC_OBS_BUS_1 <<
715                     AR_MACMISC_MISC_OBS_BUS_MSB_S)));
716
717         REG_WRITE(ah, AR_CR, AR_CR_RXD);
718
719         /* Wait for rx enable bit to go low */
720         for (i = AH_RX_STOP_DMA_TIMEOUT / AH_TIME_QUANTUM; i != 0; i--) {
721                 if ((REG_READ(ah, AR_CR) & AR_CR_RXE) == 0)
722                         break;
723
724                 if (!AR_SREV_9300_20_OR_LATER(ah)) {
725                         mac_status = REG_READ(ah, AR_DMADBG_7) & 0x7f0;
726                         if (mac_status == 0x1c0 && mac_status == last_mac_status) {
727                                 *reset = true;
728                                 break;
729                         }
730
731                         last_mac_status = mac_status;
732                 }
733
734                 udelay(AH_TIME_QUANTUM);
735         }
736
737         if (i == 0) {
738                 ath_err(common,
739                         "DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
740                         AH_RX_STOP_DMA_TIMEOUT / 1000,
741                         REG_READ(ah, AR_CR),
742                         REG_READ(ah, AR_DIAG_SW),
743                         REG_READ(ah, AR_DMADBG_7));
744                 return false;
745         } else {
746                 return true;
747         }
748
749 #undef AH_RX_STOP_DMA_TIMEOUT
750 }
751 EXPORT_SYMBOL(ath9k_hw_stopdmarecv);
752
753 int ath9k_hw_beaconq_setup(struct ath_hw *ah)
754 {
755         struct ath9k_tx_queue_info qi;
756
757         memset(&qi, 0, sizeof(qi));
758         qi.tqi_aifs = 1;
759         qi.tqi_cwmin = 0;
760         qi.tqi_cwmax = 0;
761         /* NB: don't enable any interrupts */
762         return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi);
763 }
764 EXPORT_SYMBOL(ath9k_hw_beaconq_setup);
765
766 bool ath9k_hw_intrpend(struct ath_hw *ah)
767 {
768         u32 host_isr;
769
770         if (AR_SREV_9100(ah))
771                 return true;
772
773         host_isr = REG_READ(ah, AR_INTR_ASYNC_CAUSE);
774         if ((host_isr & AR_INTR_MAC_IRQ) && (host_isr != AR_INTR_SPURIOUS))
775                 return true;
776
777         host_isr = REG_READ(ah, AR_INTR_SYNC_CAUSE);
778         if ((host_isr & AR_INTR_SYNC_DEFAULT)
779             && (host_isr != AR_INTR_SPURIOUS))
780                 return true;
781
782         return false;
783 }
784 EXPORT_SYMBOL(ath9k_hw_intrpend);
785
786 void ath9k_hw_disable_interrupts(struct ath_hw *ah)
787 {
788         struct ath_common *common = ath9k_hw_common(ah);
789
790         if (!(ah->imask & ATH9K_INT_GLOBAL))
791                 atomic_set(&ah->intr_ref_cnt, -1);
792         else
793                 atomic_dec(&ah->intr_ref_cnt);
794
795         ath_dbg(common, ATH_DBG_INTERRUPT, "disable IER\n");
796         REG_WRITE(ah, AR_IER, AR_IER_DISABLE);
797         (void) REG_READ(ah, AR_IER);
798         if (!AR_SREV_9100(ah)) {
799                 REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, 0);
800                 (void) REG_READ(ah, AR_INTR_ASYNC_ENABLE);
801
802                 REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
803                 (void) REG_READ(ah, AR_INTR_SYNC_ENABLE);
804         }
805 }
806 EXPORT_SYMBOL(ath9k_hw_disable_interrupts);
807
808 void ath9k_hw_enable_interrupts(struct ath_hw *ah)
809 {
810         struct ath_common *common = ath9k_hw_common(ah);
811         u32 sync_default = AR_INTR_SYNC_DEFAULT;
812
813         if (!(ah->imask & ATH9K_INT_GLOBAL))
814                 return;
815
816         if (!atomic_inc_and_test(&ah->intr_ref_cnt)) {
817                 ath_dbg(common, ATH_DBG_INTERRUPT,
818                         "Do not enable IER ref count %d\n",
819                         atomic_read(&ah->intr_ref_cnt));
820                 return;
821         }
822
823         if (AR_SREV_9340(ah))
824                 sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
825
826         ath_dbg(common, ATH_DBG_INTERRUPT, "enable IER\n");
827         REG_WRITE(ah, AR_IER, AR_IER_ENABLE);
828         if (!AR_SREV_9100(ah)) {
829                 REG_WRITE(ah, AR_INTR_ASYNC_ENABLE,
830                           AR_INTR_MAC_IRQ);
831                 REG_WRITE(ah, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ);
832
833
834                 REG_WRITE(ah, AR_INTR_SYNC_ENABLE, sync_default);
835                 REG_WRITE(ah, AR_INTR_SYNC_MASK, sync_default);
836         }
837         ath_dbg(common, ATH_DBG_INTERRUPT, "AR_IMR 0x%x IER 0x%x\n",
838                 REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER));
839 }
840 EXPORT_SYMBOL(ath9k_hw_enable_interrupts);
841
842 void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
843 {
844         enum ath9k_int omask = ah->imask;
845         u32 mask, mask2;
846         struct ath9k_hw_capabilities *pCap = &ah->caps;
847         struct ath_common *common = ath9k_hw_common(ah);
848
849         if (!(ints & ATH9K_INT_GLOBAL))
850                 ath9k_hw_disable_interrupts(ah);
851
852         ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
853
854         mask = ints & ATH9K_INT_COMMON;
855         mask2 = 0;
856
857         if (ints & ATH9K_INT_TX) {
858                 if (ah->config.tx_intr_mitigation)
859                         mask |= AR_IMR_TXMINTR | AR_IMR_TXINTM;
860                 else {
861                         if (ah->txok_interrupt_mask)
862                                 mask |= AR_IMR_TXOK;
863                         if (ah->txdesc_interrupt_mask)
864                                 mask |= AR_IMR_TXDESC;
865                 }
866                 if (ah->txerr_interrupt_mask)
867                         mask |= AR_IMR_TXERR;
868                 if (ah->txeol_interrupt_mask)
869                         mask |= AR_IMR_TXEOL;
870         }
871         if (ints & ATH9K_INT_RX) {
872                 if (AR_SREV_9300_20_OR_LATER(ah)) {
873                         mask |= AR_IMR_RXERR | AR_IMR_RXOK_HP;
874                         if (ah->config.rx_intr_mitigation) {
875                                 mask &= ~AR_IMR_RXOK_LP;
876                                 mask |=  AR_IMR_RXMINTR | AR_IMR_RXINTM;
877                         } else {
878                                 mask |= AR_IMR_RXOK_LP;
879                         }
880                 } else {
881                         if (ah->config.rx_intr_mitigation)
882                                 mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM;
883                         else
884                                 mask |= AR_IMR_RXOK | AR_IMR_RXDESC;
885                 }
886                 if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
887                         mask |= AR_IMR_GENTMR;
888         }
889
890         if (ints & ATH9K_INT_GENTIMER)
891                 mask |= AR_IMR_GENTMR;
892
893         if (ints & (ATH9K_INT_BMISC)) {
894                 mask |= AR_IMR_BCNMISC;
895                 if (ints & ATH9K_INT_TIM)
896                         mask2 |= AR_IMR_S2_TIM;
897                 if (ints & ATH9K_INT_DTIM)
898                         mask2 |= AR_IMR_S2_DTIM;
899                 if (ints & ATH9K_INT_DTIMSYNC)
900                         mask2 |= AR_IMR_S2_DTIMSYNC;
901                 if (ints & ATH9K_INT_CABEND)
902                         mask2 |= AR_IMR_S2_CABEND;
903                 if (ints & ATH9K_INT_TSFOOR)
904                         mask2 |= AR_IMR_S2_TSFOOR;
905         }
906
907         if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) {
908                 mask |= AR_IMR_BCNMISC;
909                 if (ints & ATH9K_INT_GTT)
910                         mask2 |= AR_IMR_S2_GTT;
911                 if (ints & ATH9K_INT_CST)
912                         mask2 |= AR_IMR_S2_CST;
913         }
914
915         ath_dbg(common, ATH_DBG_INTERRUPT, "new IMR 0x%x\n", mask);
916         REG_WRITE(ah, AR_IMR, mask);
917         ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC |
918                            AR_IMR_S2_CABEND | AR_IMR_S2_CABTO |
919                            AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST);
920         ah->imrs2_reg |= mask2;
921         REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
922
923         if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
924                 if (ints & ATH9K_INT_TIM_TIMER)
925                         REG_SET_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
926                 else
927                         REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
928         }
929
930         return;
931 }
932 EXPORT_SYMBOL(ath9k_hw_set_interrupts);