iPXE
ath9k_mac.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008-2011 Atheros Communications Inc.
3  *
4  * Modified for iPXE by Scott K Logan <logans@cottsay.net> July 2011
5  * Original from Linux kernel 3.0.1
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 FILE_SECBOOT ( FORBIDDEN );
21 
22 #include <ipxe/io.h>
23 
24 #include "hw.h"
25 #include "hw-ops.h"
26 
28  struct ath9k_tx_queue_info *qi __unused)
29 {
30  DBG2("ath9k: "
31  "tx ok 0x%x err 0x%x desc 0x%x eol 0x%x urn 0x%x\n",
32  ah->txok_interrupt_mask, ah->txerr_interrupt_mask,
33  ah->txdesc_interrupt_mask, ah->txeol_interrupt_mask,
34  ah->txurn_interrupt_mask);
35 
37 
39  SM(ah->txok_interrupt_mask, AR_IMR_S0_QCU_TXOK)
40  | SM(ah->txdesc_interrupt_mask, AR_IMR_S0_QCU_TXDESC));
42  SM(ah->txerr_interrupt_mask, AR_IMR_S1_QCU_TXERR)
43  | SM(ah->txeol_interrupt_mask, AR_IMR_S1_QCU_TXEOL));
44 
45  ah->imrs2_reg &= ~AR_IMR_S2_QCU_TXURN;
46  ah->imrs2_reg |= (ah->txurn_interrupt_mask & AR_IMR_S2_QCU_TXURN);
47  REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
48 
50 }
51 
53 {
54  REG_WRITE(ah, AR_QTXDP(q), txdp);
55 }
56 
57 void ath9k_hw_txstart(struct ath_hw *ah, u32 q)
58 {
59  DBG2("ath9k: "
60  "Enable TXE on queue: %d\n", q);
61  REG_WRITE(ah, AR_Q_TXE, 1 << q);
62 }
63 
65 {
66  u32 npend;
67 
68  npend = REG_READ(ah, AR_QSTS(q)) & AR_Q_STS_PEND_FR_CNT;
69  if (npend == 0) {
70 
71  if (REG_READ(ah, AR_Q_TXE) & (1 << q))
72  npend = 1;
73  }
74 
75  return npend;
76 }
77 
78 /**
79  * ath9k_hw_updatetxtriglevel - adjusts the frame trigger level
80  *
81  * @ah: atheros hardware struct
82  * @bIncTrigLevel: whether or not the frame trigger level should be updated
83  *
84  * The frame trigger level specifies the minimum number of bytes,
85  * in units of 64 bytes, that must be DMA'ed into the PCU TX FIFO
86  * before the PCU will initiate sending the frame on the air. This can
87  * mean we initiate transmit before a full frame is on the PCU TX FIFO.
88  * Resets to 0x1 (meaning 64 bytes or a full frame, whichever occurs
89  * first)
90  *
91  * Caution must be taken to ensure to set the frame trigger level based
92  * on the DMA request size. For example if the DMA request size is set to
93  * 128 bytes the trigger level cannot exceed 6 * 64 = 384. This is because
94  * there need to be enough space in the tx FIFO for the requested transfer
95  * size. Hence the tx FIFO will stop with 512 - 128 = 384 bytes. If we set
96  * the threshold to a value beyond 6, then the transmit will hang.
97  *
98  * Current dual stream devices have a PCU TX FIFO size of 8 KB.
99  * Current single stream devices have a PCU TX FIFO size of 4 KB, however,
100  * there is a hardware issue which forces us to use 2 KB instead so the
101  * frame trigger level must not exceed 2 KB for these chipsets.
102  */
103 int ath9k_hw_updatetxtriglevel(struct ath_hw *ah, int bIncTrigLevel)
104 {
105  u32 txcfg, curLevel, newLevel;
106 
107  if (ah->tx_trig_level >= ah->config.max_txtrig_level)
108  return 0;
109 
111 
113  curLevel = MS(txcfg, AR_FTRIG);
114  newLevel = curLevel;
115  if (bIncTrigLevel) {
116  if (curLevel < ah->config.max_txtrig_level)
117  newLevel++;
118  } else if (curLevel > MIN_TX_FIFO_THRESHOLD)
119  newLevel--;
120  if (newLevel != curLevel)
122  (txcfg & ~AR_FTRIG) | SM(newLevel, AR_FTRIG));
123 
125 
126  ah->tx_trig_level = newLevel;
127 
128  return newLevel != curLevel;
129 }
130 
132 {
133  int i, q;
134 
136 
140 
141  for (q = 0; q < AR_NUM_QCU; q++) {
142  for (i = 0; i < 1000; i++) {
143  if (i)
144  udelay(5);
145 
146  if (!ath9k_hw_numtxpending(ah, q))
147  break;
148  }
149  }
150 
154 
155  REG_WRITE(ah, AR_Q_TXD, 0);
156 }
157 
158 void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs)
159 {
160  *txqs &= ah->intr_txqs;
161  ah->intr_txqs &= ~(*txqs);
162 }
163 
164 int ath9k_hw_set_txq_props(struct ath_hw *ah, int q,
165  const struct ath9k_tx_queue_info *qinfo)
166 {
167  u32 cw;
168  struct ath9k_tx_queue_info *qi;
169 
170  qi = &ah->txq[q];
171  if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
172  DBG("ath9k: "
173  "Set TXQ properties, inactive queue: %d\n", q);
174  return 0;
175  }
176 
177  DBG2("ath9k: Set queue properties for: %d\n", q);
178 
179  qi->tqi_ver = qinfo->tqi_ver;
180  qi->tqi_subtype = qinfo->tqi_subtype;
181  qi->tqi_qflags = qinfo->tqi_qflags;
182  qi->tqi_priority = qinfo->tqi_priority;
183  if (qinfo->tqi_aifs != ATH9K_TXQ_USEDEFAULT)
184  qi->tqi_aifs = min(qinfo->tqi_aifs, 255U);
185  else
186  qi->tqi_aifs = INIT_AIFS;
187  if (qinfo->tqi_cwmin != ATH9K_TXQ_USEDEFAULT) {
188  cw = min(qinfo->tqi_cwmin, 1024U);
189  qi->tqi_cwmin = 1;
190  while (qi->tqi_cwmin < cw)
191  qi->tqi_cwmin = (qi->tqi_cwmin << 1) | 1;
192  } else
193  qi->tqi_cwmin = qinfo->tqi_cwmin;
194  if (qinfo->tqi_cwmax != ATH9K_TXQ_USEDEFAULT) {
195  cw = min(qinfo->tqi_cwmax, 1024U);
196  qi->tqi_cwmax = 1;
197  while (qi->tqi_cwmax < cw)
198  qi->tqi_cwmax = (qi->tqi_cwmax << 1) | 1;
199  } else
200  qi->tqi_cwmax = INIT_CWMAX;
201 
202  if (qinfo->tqi_shretry != 0)
203  qi->tqi_shretry = min((u32) qinfo->tqi_shretry, 15U);
204  else
206  if (qinfo->tqi_lgretry != 0)
207  qi->tqi_lgretry = min((u32) qinfo->tqi_lgretry, 15U);
208  else
210  qi->tqi_cbrPeriod = qinfo->tqi_cbrPeriod;
212  qi->tqi_burstTime = qinfo->tqi_burstTime;
213  qi->tqi_readyTime = qinfo->tqi_readyTime;
214 
215  return 1;
216 }
217 
219  const struct ath9k_tx_queue_info *qinfo)
220 {
221  struct ath9k_tx_queue_info *qi;
222  int q;
223 
224  for (q = 0; q < ATH9K_NUM_TX_QUEUES; q++)
225  if (ah->txq[q].tqi_type ==
227  break;
228  if (q == ATH9K_NUM_TX_QUEUES) {
229  DBG("No available TX queue\n");
230  return -1;
231  }
232 
233  DBG2("ath9K: Setup TX queue: %d\n", q);
234 
235  qi = &ah->txq[q];
236  if (qi->tqi_type != ATH9K_TX_QUEUE_INACTIVE) {
237  DBG("ath9k: TX queue: %d already active\n", q);
238  return -1;
239  }
240  memset(qi, 0, sizeof(struct ath9k_tx_queue_info));
241  qi->tqi_type = type;
242  if (qinfo == NULL) {
243  qi->tqi_qflags =
247  qi->tqi_aifs = INIT_AIFS;
249  qi->tqi_cwmax = INIT_CWMAX;
252  qi->tqi_physCompBuf = 0;
253  } else {
254  qi->tqi_physCompBuf = qinfo->tqi_physCompBuf;
255  (void) ath9k_hw_set_txq_props(ah, q, qinfo);
256  }
257 
258  return q;
259 }
260 
262 {
263  struct ath9k_tx_queue_info *qi;
264 
265  qi = &ah->txq[q];
266  if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
267  DBG("ath9k: "
268  "Release TXQ, inactive queue: %d\n", q);
269  return 0;
270  }
271 
272  DBG2("ath9k: Release TX queue: %d\n", q);
273 
275  ah->txok_interrupt_mask &= ~(1 << q);
276  ah->txerr_interrupt_mask &= ~(1 << q);
277  ah->txdesc_interrupt_mask &= ~(1 << q);
278  ah->txeol_interrupt_mask &= ~(1 << q);
279  ah->txurn_interrupt_mask &= ~(1 << q);
281 
282  return 1;
283 }
284 
286 {
287  struct ath9k_channel *chan = ah->curchan;
288  struct ath9k_tx_queue_info *qi;
289  u32 cwMin, chanCwMin, value __unused;
290 
291  qi = &ah->txq[q];
292  if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
293  DBG("ath9k: "
294  "Reset TXQ, inactive queue: %d\n", q);
295  return 1;
296  }
297 
298  DBG2("ath9k: Reset TX queue: %d\n", q);
299 
300  if (qi->tqi_cwmin == ATH9K_TXQ_USEDEFAULT) {
301  if (chan && IS_CHAN_B(chan))
302  chanCwMin = INIT_CWMIN_11B;
303  else
304  chanCwMin = INIT_CWMIN;
305 
306  for (cwMin = 1; cwMin < chanCwMin; cwMin = (cwMin << 1) | 1);
307  } else
308  cwMin = qi->tqi_cwmin;
309 
311 
313  SM(cwMin, AR_D_LCL_IFS_CWMIN) |
316 
321 
323 
324  if (AR_SREV_9340(ah))
325  REG_WRITE(ah, AR_DMISC(q),
327  else
328  REG_WRITE(ah, AR_DMISC(q),
330 
331  if (qi->tqi_cbrPeriod) {
332  REG_WRITE(ah, AR_QCBRCFG(q),
336  (qi->tqi_cbrOverflowLimit ?
338  }
339  if (qi->tqi_readyTime) {
343  }
344 
347  (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0));
348 
349  if (qi->tqi_burstTime
352 
355 
357 
360 
362  REG_SET_BIT(ah, AR_DMISC(q),
366  }
367 
370 
372  ah->txok_interrupt_mask |= 1 << q;
373  else
374  ah->txok_interrupt_mask &= ~(1 << q);
376  ah->txerr_interrupt_mask |= 1 << q;
377  else
378  ah->txerr_interrupt_mask &= ~(1 << q);
380  ah->txdesc_interrupt_mask |= 1 << q;
381  else
382  ah->txdesc_interrupt_mask &= ~(1 << q);
384  ah->txeol_interrupt_mask |= 1 << q;
385  else
386  ah->txeol_interrupt_mask &= ~(1 << q);
388  ah->txurn_interrupt_mask |= 1 << q;
389  else
390  ah->txurn_interrupt_mask &= ~(1 << q);
392 
393  return 1;
394 }
395 
396 int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
397  struct ath_rx_status *rs, u64 tsf __unused)
398 {
399  struct ar5416_desc ads;
400  struct ar5416_desc *adsp = AR5416DESC(ds);
401  u32 phyerr;
402 
403  if ((adsp->ds_rxstatus8 & AR_RxDone) == 0)
404  return -EINPROGRESS;
405 
406  ads.u.rx = adsp->u.rx;
407 
408  rs->rs_status = 0;
409  rs->rs_flags = 0;
410 
411  rs->rs_datalen = ads.ds_rxstatus1 & AR_DataLen;
412  rs->rs_tstamp = ads.AR_RcvTimestamp;
413 
414  if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
415  rs->rs_rssi = ATH9K_RSSI_BAD;
422  } else {
423  rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
424  rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0,
426  rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0,
428  rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0,
430  rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4,
432  rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4,
434  rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4,
436  }
437  if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
438  rs->rs_keyix = MS(ads.ds_rxstatus8, AR_KeyIdx);
439  else
441 
442  rs->rs_rate = RXSTATUS_RATE(ah, (&ads));
443  rs->rs_more = (ads.ds_rxstatus1 & AR_RxMore) ? 1 : 0;
444 
445  rs->rs_isaggr = (ads.ds_rxstatus8 & AR_RxAggr) ? 1 : 0;
446  rs->rs_moreaggr =
447  (ads.ds_rxstatus8 & AR_RxMoreAggr) ? 1 : 0;
448  rs->rs_antenna = MS(ads.ds_rxstatus3, AR_RxAntenna);
449  rs->rs_flags =
450  (ads.ds_rxstatus3 & AR_GI) ? ATH9K_RX_GI : 0;
451  rs->rs_flags |=
452  (ads.ds_rxstatus3 & AR_2040) ? ATH9K_RX_2040 : 0;
453 
454  if (ads.ds_rxstatus8 & AR_PreDelimCRCErr)
456  if (ads.ds_rxstatus8 & AR_PostDelimCRCErr)
458  if (ads.ds_rxstatus8 & AR_DecryptBusyErr)
460 
461  if ((ads.ds_rxstatus8 & AR_RxFrameOK) == 0) {
462  /*
463  * Treat these errors as mutually exclusive to avoid spurious
464  * extra error reports from the hardware. If a CRC error is
465  * reported, then decryption and MIC errors are irrelevant,
466  * the frame is going to be dropped either way
467  */
468  if (ads.ds_rxstatus8 & AR_CRCErr)
469  rs->rs_status |= ATH9K_RXERR_CRC;
470  else if (ads.ds_rxstatus8 & AR_PHYErr) {
471  rs->rs_status |= ATH9K_RXERR_PHY;
472  phyerr = MS(ads.ds_rxstatus8, AR_PHYErrCode);
473  rs->rs_phyerr = phyerr;
474  } else if (ads.ds_rxstatus8 & AR_DecryptCRCErr)
476  else if (ads.ds_rxstatus8 & AR_MichaelErr)
477  rs->rs_status |= ATH9K_RXERR_MIC;
478  else if (ads.ds_rxstatus8 & AR_KeyMiss)
480  }
481 
482  return 0;
483 }
484 
485 /*
486  * This can stop or re-enables RX.
487  *
488  * If bool is set this will kill any frame which is currently being
489  * transferred between the MAC and baseband and also prevent any new
490  * frames from getting started.
491  */
492 int ath9k_hw_setrxabort(struct ath_hw *ah, int set)
493 {
494  u32 reg;
495 
496  if (set) {
499 
501  0, AH_WAIT_TIMEOUT)) {
503  (AR_DIAG_RX_DIS |
505 
507  DBG("ath9k: "
508  "RX failed to go idle in 10 ms RXSM=0x%x\n",
509  reg);
510 
511  return 0;
512  }
513  } else {
516  }
517 
518  return 1;
519 }
520 
522 {
524 }
525 
526 void ath9k_hw_startpcureceive(struct ath_hw *ah, int is_scanning)
527 {
528  ath9k_ani_reset(ah, is_scanning);
529 
531 }
532 
534 {
536 }
537 
538 int ath9k_hw_stopdmarecv(struct ath_hw *ah, int *reset)
539 {
540 #define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */
541  u32 mac_status, last_mac_status = 0;
542  int i;
543 
544  /* Enable access to the DMA observation bus */
549 
551 
552  /* Wait for rx enable bit to go low */
553  for (i = AH_RX_STOP_DMA_TIMEOUT / AH_TIME_QUANTUM; i != 0; i--) {
554  if ((REG_READ(ah, AR_CR) & AR_CR_RXE) == 0)
555  break;
556 
558  mac_status = REG_READ(ah, AR_DMADBG_7) & 0x7f0;
559  if (mac_status == 0x1c0 && mac_status == last_mac_status) {
560  *reset = 1;
561  break;
562  }
563 
564  last_mac_status = mac_status;
565  }
566 
568  }
569 
570  if (i == 0) {
571  DBG("ath9k: "
572  "DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
573  AH_RX_STOP_DMA_TIMEOUT / 1000,
574  REG_READ(ah, AR_CR),
577  return 0;
578  } else {
579  return 1;
580  }
581 
582 #undef AH_RX_STOP_DMA_TIMEOUT
583 }
584 
586 {
587  u32 host_isr;
588 
589  if (AR_SREV_9100(ah) || !(ah->ah_ier & AR_IER_ENABLE))
590  return 1;
591 
592  host_isr = REG_READ(ah, AR_INTR_ASYNC_CAUSE);
593  if ((host_isr & AR_INTR_MAC_IRQ) && (host_isr != AR_INTR_SPURIOUS))
594  return 1;
595 
596  host_isr = REG_READ(ah, AR_INTR_SYNC_CAUSE);
597  if ((host_isr & AR_INTR_SYNC_DEFAULT)
598  && (host_isr != AR_INTR_SPURIOUS))
599  return 1;
600 
601  return 0;
602 }
603 
605 {
606  DBG2("ath9k: disable IER\n");
607  REG_WRITE(ah, AR_IER, ah->ah_ier);
608  (void) REG_READ(ah, AR_IER);
609  if (!AR_SREV_9100(ah)) {
612 
615  }
616 }
617 
619 {
620  u32 sync_default = AR_INTR_SYNC_DEFAULT;
621 
622  if (!(ah->imask & ATH9K_INT_GLOBAL))
623  return;
624 
625  if (AR_SREV_9340(ah))
626  sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
627 
628  DBG2("ath9k: enable IER\n");
629  REG_WRITE(ah, AR_IER, ah->ah_ier);
630  if (!AR_SREV_9100(ah)) {
634 
635 
636  REG_WRITE(ah, AR_INTR_SYNC_ENABLE, sync_default);
637  REG_WRITE(ah, AR_INTR_SYNC_MASK, sync_default);
638  }
639  DBG2("ath9k: AR_IMR 0x%x IER 0x%x\n",
641 }
642 
643 void ath9k_hw_set_interrupts(struct ath_hw *ah, unsigned int ints)
644 {
645  enum ath9k_int omask = ah->imask;
646  u32 mask, mask2;
647  struct ath9k_hw_capabilities *pCap = &ah->caps;
648 
649  if (!(ints & ATH9K_INT_GLOBAL))
651 
652  DBG2("ath9k: 0x%x => 0x%x\n", omask, ints);
653 
654  /* TODO: global int Ref count */
655  mask = ints & ATH9K_INT_COMMON;
656  mask2 = 0;
657 
658  if (ints & ATH9K_INT_TX) {
659  if (ah->config.tx_intr_mitigation)
660  mask |= AR_IMR_TXMINTR | AR_IMR_TXINTM;
661  else {
662  if (ah->txok_interrupt_mask)
663  mask |= AR_IMR_TXOK;
664  if (ah->txdesc_interrupt_mask)
665  mask |= AR_IMR_TXDESC;
666  }
667  if (ah->txerr_interrupt_mask)
668  mask |= AR_IMR_TXERR;
669  if (ah->txeol_interrupt_mask)
670  mask |= AR_IMR_TXEOL;
671  }
672  if (ints & ATH9K_INT_RX) {
674  mask |= AR_IMR_RXERR | AR_IMR_RXOK_HP;
675  if (ah->config.rx_intr_mitigation) {
676  mask &= ~AR_IMR_RXOK_LP;
677  mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM;
678  } else {
679  mask |= AR_IMR_RXOK_LP;
680  }
681  } else {
682  if (ah->config.rx_intr_mitigation)
683  mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM;
684  else
685  mask |= AR_IMR_RXOK | AR_IMR_RXDESC;
686  }
687  if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
688  mask |= AR_IMR_GENTMR;
689  }
690 
691  if (ints & ATH9K_INT_GENTIMER)
692  mask |= AR_IMR_GENTMR;
693 
694  if (ints & (ATH9K_INT_BMISC)) {
695  mask |= AR_IMR_BCNMISC;
696  if (ints & ATH9K_INT_TIM)
697  mask2 |= AR_IMR_S2_TIM;
698  if (ints & ATH9K_INT_DTIM)
699  mask2 |= AR_IMR_S2_DTIM;
700  if (ints & ATH9K_INT_DTIMSYNC)
701  mask2 |= AR_IMR_S2_DTIMSYNC;
702  if (ints & ATH9K_INT_CABEND)
703  mask2 |= AR_IMR_S2_CABEND;
704  if (ints & ATH9K_INT_TSFOOR)
705  mask2 |= AR_IMR_S2_TSFOOR;
706  }
707 
708  if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) {
709  mask |= AR_IMR_BCNMISC;
710  if (ints & ATH9K_INT_GTT)
711  mask2 |= AR_IMR_S2_GTT;
712  if (ints & ATH9K_INT_CST)
713  mask2 |= AR_IMR_S2_CST;
714  }
715 
716  DBG2("ath9k: new IMR 0x%x\n", mask);
717  REG_WRITE(ah, AR_IMR, mask);
718  ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC |
721  ah->imrs2_reg |= mask2;
722  REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
723 
724  if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
725  if (ints & ATH9K_INT_TIM_TIMER)
727  else
729  }
730 
731  if (ints & ATH9K_INT_GLOBAL)
733 
734  return;
735 }
#define AR_CR_RXE
Definition: reg.h:26
#define AR_DMISC(_i)
Definition: reg.h:578
int ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q)
Definition: ath9k_mac.c:285
u8 rs_moreaggr
Definition: mac.h:154
#define AR_QCBRCFG(_i)
Definition: reg.h:403
#define ATH9K_RX_DELIM_CRC_PRE
Definition: mac.h:200
#define AR_IMR_S2_CABEND
Definition: reg.h:313
int8_t rs_rssi_ext0
Definition: mac.h:150
ath9k_tx_queue
Definition: mac.h:576
iPXE I/O API
#define AR_DIAG_RX_ABORT
Definition: reg.h:1525
Definition: hw.h:657
int ath9k_hw_setrxabort(struct ath_hw *ah, int set)
Definition: ath9k_mac.c:492
#define ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS
Definition: mac.h:599
#define AR_GI
Definition: mac.h:535
#define AR_QMISC(_i)
Definition: reg.h:442
u8 rs_more
Definition: mac.h:146
#define AR_IMR_S2_TIM
Definition: reg.h:312
#define AR_RxRSSIAnt01
Definition: mac.h:519
#define AR_DRETRY_LIMIT(_i)
Definition: reg.h:543
void ath9k_hw_enable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:618
#define AR_RxRSSIAnt02
Definition: mac.h:521
#define AR_D_LCL_IFS_CWMIN
Definition: reg.h:524
static unsigned int unsigned int reg
Definition: myson.h:162
u8 rs_flags
Definition: mac.h:156
#define AR_INTR_ASYNC_CAUSE
Definition: reg.h:976
#define AR_OBS_BUS_1
Definition: reg.h:1559
#define AR_D_MISC_FRAG_BKOFF_EN
Definition: reg.h:583
#define AR_D_RETRY_LIMIT_STA_SH
Definition: reg.h:546
#define AR_IMR_S2_QCU_TXURN
Definition: reg.h:308
#define AR_FTRIG
Definition: reg.h:90
#define AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL
Definition: reg.h:594
#define AR_IMR_RXMINTR
Definition: reg.h:291
struct option_descriptor set[0]
Definition: nvo_cmd.c:112
#define IS_CHAN_B(_c)
Definition: ath5k.h:660
#define AR_IMR_RXOK_HP
Definition: reg.h:262
int8_t rs_rssi_ctl0
Definition: mac.h:147
#define ATH9K_RXERR_MIC
Definition: mac.h:194
#define AR_QTXDP(_i)
Definition: reg.h:382
u32 tqi_intFlags
Definition: mac.h:631
u32 rs_tstamp
Definition: mac.h:138
#define AR_MACMISC_MISC_OBS_BUS_1
Definition: reg.h:148
u32 tqi_priority
Definition: mac.h:620
int ath9k_hw_stopdmarecv(struct ath_hw *ah, int *reset)
Definition: ath9k_mac.c:538
void ath9k_ani_reset(struct ath_hw *ah, int is_scanning)
Definition: ath9k_ani.c:468
struct ar5416_desc::@34::@36 rx
#define MS(_v, _f)
Definition: hw.h:103
#define AR_OBS_BUS_1_RX_STATE
Definition: reg.h:1574
u8 rs_rate
Definition: mac.h:144
u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q)
Definition: ath9k_mac.c:64
uint32_t type
Operating system type.
Definition: ena.h:12
#define REG_CLR_BIT(_a, _r, _f)
Definition: hw.h:110
#define AR_IMR_TXERR
Definition: reg.h:270
#define AR_Q_TXD_M
Definition: reg.h:391
#define AR_IER
Definition: reg.h:55
#define REGWRITE_BUFFER_FLUSH(_ah)
Definition: hw.h:96
#define AR_2040
Definition: mac.h:536
#define AR_RxDone
Definition: mac.h:556
#define AR_Q_TXD
Definition: reg.h:390
#define AR_RXDP
Definition: reg.h:30
#define ATH9K_RXERR_CRC
Definition: mac.h:190
#define AR_IMR_RXDESC
Definition: reg.h:261
ath9k_int
Definition: hw.h:252
#define min(x, y)
Definition: ath.h:36
#define AR_PHYErrCode
Definition: mac.h:567
#define AR_IMR_GENTMR
Definition: reg.h:288
void ath9k_hw_puttxbuf(struct ath_hw *ah, u32 q, u32 txdp)
Definition: ath9k_mac.c:52
#define AR_D_LCL_IFS_CWMAX
Definition: reg.h:526
int8_t rs_rssi_ext1
Definition: mac.h:151
void ath9k_hw_abortpcurecv(struct ath_hw *ah)
Definition: ath9k_mac.c:533
#define AR_RxRSSIAnt00
Definition: mac.h:517
#define AR_SREV_9100(ah)
Definition: reg.h:811
#define AR_IMR_TXINTM
Definition: reg.h:292
#define AR_RxMoreAggr
Definition: mac.h:569
#define ATH9K_RX_DECRYPT_BUSY
Definition: mac.h:202
#define AR_D_MISC_CW_BKOFF_EN
Definition: reg.h:584
#define AR_CR
Definition: reg.h:25
#define AR_IMR_RXOK
Definition: reg.h:260
#define AR_Q_DESC_CRCCHK_EN
Definition: reg.h:482
#define AR_Q_RDYTIMECFG_EN
Definition: reg.h:422
struct net80211_channel * chan
Definition: hw.h:348
#define AR_DIAG_FORCE_CH_IDLE_HIGH
Definition: reg.h:1522
#define AR_D_LCL_IFS_AIFS
Definition: reg.h:528
Definition: mac.h:241
#define INIT_SSH_RETRY
Definition: mac.h:77
#define AR_RxRSSIAnt12
Definition: mac.h:547
#define AR_Q_RDYTIMECFG_DURATION
Definition: reg.h:420
#define AR_DMADBG_7
Definition: reg.h:358
#define ATH9K_RX_DELIM_CRC_POST
Definition: mac.h:201
int8_t rs_rssi_ext2
Definition: mac.h:152
#define AR_D_RETRY_LIMIT_STA_LG
Definition: reg.h:548
#define AR_IER_ENABLE
Definition: reg.h:56
#define ATH9K_RXKEYIX_INVALID
Definition: mac.h:204
#define AR_RxRSSICombined
Definition: mac.h:549
#define AR_DCHNTIME(_i)
Definition: reg.h:562
#define ATH9K_RSSI_BAD
Definition: hw.h:73
void ath9k_hw_txstart(struct ath_hw *ah, u32 q)
Definition: ath9k_mac.c:57
#define AR_PostDelimCRCErr
Definition: mac.h:571
#define AR_RxKeyIdxValid
Definition: mac.h:564
#define AR_DLCL_IFS(_i)
Definition: reg.h:523
#define AR_IMR_S2_CABTO
Definition: reg.h:316
u16 rs_datalen
Definition: mac.h:139
#define AR_SREV_9300_20_OR_LATER(_ah)
Definition: reg.h:865
#define INIT_AIFS
Definition: mac.h:71
#define AR_IMR_S0_QCU_TXOK
Definition: reg.h:296
int ath9k_hw_set_txq_props(struct ath_hw *ah, int q, const struct ath9k_tx_queue_info *qinfo)
Definition: ath9k_mac.c:164
int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, struct ath_rx_status *rs, u64 tsf __unused)
Definition: ath9k_mac.c:396
#define AR_IMR_S2_GTT
Definition: reg.h:311
#define AR_D_CHNTIME_DUR
Definition: reg.h:563
static void ath9k_hw_set_txq_interrupts(struct ath_hw *ah, struct ath9k_tx_queue_info *qi __unused)
Definition: ath9k_mac.c:27
#define SM(_v, _f)
Definition: hw.h:102
#define AR_Q_TXE
Definition: reg.h:387
#define AR_IMR_TXOK
Definition: reg.h:268
#define AR_RxRSSIAnt11
Definition: mac.h:545
FILE_SECBOOT(FORBIDDEN)
int ath9k_hw_releasetxqueue(struct ath_hw *ah, u32 q)
Definition: ath9k_mac.c:261
#define AR_PCU_MISC
Definition: reg.h:1641
#define AR_MichaelErr
Definition: mac.h:561
u8 rs_antenna
Definition: mac.h:145
#define AR5416DESC(_ds)
Definition: mac.h:319
#define ATH9K_TXQ_USEDEFAULT
Definition: mac.h:598
enum ath9k_tx_queue_flags tqi_qflags
Definition: mac.h:619
#define AR_TXCFG
Definition: reg.h:80
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
#define AR_D_MISC_POST_FR_BKOFF_DIS
Definition: reg.h:597
#define AH_RX_STOP_DMA_TIMEOUT
#define AR_IMR_S5
Definition: reg.h:329
#define AR_MACMISC_DMA_OBS_LINE_8
Definition: reg.h:141
#define AR_D_MISC_ARB_LOCKOUT_CNTRL
Definition: reg.h:590
#define AR_KeyMiss
Definition: mac.h:574
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:61
u32 tqi_cbrPeriod
Definition: mac.h:626
uint64_t u64
Definition: stdint.h:26
int ath9k_hw_intrpend(struct ath_hw *ah)
Definition: ath9k_mac.c:585
#define INIT_SLG_RETRY
Definition: mac.h:78
void ath9k_hw_set_interrupts(struct ath_hw *ah, unsigned int ints)
Definition: ath9k_mac.c:643
#define AR_INTR_SPURIOUS
Definition: reg.h:920
#define AR_Q_MISC_RDYTIME_EXP_POLICY
Definition: reg.h:455
void ath9k_hw_abort_tx_dma(struct ath_hw *ah)
Definition: ath9k_mac.c:131
#define INIT_SH_RETRY
Definition: mac.h:75
void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs)
Definition: ath9k_mac.c:158
u8 rs_status
Definition: mac.h:140
#define AR_D_GBL_IFS_MISC_IGNORE_BACKOFF
Definition: reg.h:637
#define INIT_LG_RETRY
Definition: mac.h:76
#define AR_SREV_9340(_ah)
Definition: reg.h:879
void ath9k_hw_disable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:604
u32 tqi_readyTime
Definition: mac.h:629
#define EINPROGRESS
Operation in progress.
Definition: errno.h:419
#define AR_RxAggr
Definition: mac.h:570
#define AR_INTR_SYNC_CAUSE
Definition: reg.h:923
#define AR_IMR_S2_TSFOOR
Definition: reg.h:318
#define RXSTATUS_RATE(ah, ads)
Definition: mac.h:28
#define AR_DIAG_RX_DIS
Definition: reg.h:1511
u32 tqi_cbrOverflowLimit
Definition: mac.h:627
#define INIT_CWMIN_11B
Definition: mac.h:73
#define AR_IMR_S2_DTIMSYNC
Definition: reg.h:314
void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp)
Definition: ath9k_mac.c:521
int ath9k_hw_setuptxqueue(struct ath_hw *ah, enum ath9k_tx_queue type, const struct ath9k_tx_queue_info *qinfo)
Definition: ath9k_mac.c:218
#define AR_IMR_RXOK_LP
Definition: reg.h:263
#define ATH9K_RXERR_PHY
Definition: mac.h:191
#define AR_IMR_S1_QCU_TXEOL
Definition: reg.h:304
#define AR_RxMore
Definition: mac.h:528
#define ATH9K_NUM_TX_QUEUES
Definition: mac.h:581
union ar5416_desc::@34 u
#define AR_IMR_TXDESC
Definition: reg.h:269
#define AR_IMR_S2_CST
Definition: reg.h:310
#define AR_INTR_ASYNC_MASK
Definition: reg.h:967
#define MIN_TX_FIFO_THRESHOLD
Definition: mac.h:102
int ath9k_hw_updatetxtriglevel(struct ath_hw *ah, int bIncTrigLevel)
ath9k_hw_updatetxtriglevel - adjusts the frame trigger level
Definition: ath9k_mac.c:103
#define AR_IMR_S2
Definition: reg.h:307
int8_t rs_rssi
Definition: mac.h:142
#define AR_PreDelimCRCErr
Definition: mac.h:562
Definition: sis900.h:30
#define AR_Q_CBRCFG_INTERVAL
Definition: reg.h:404
u32 tqi_physCompBuf
Definition: mac.h:630
u8 rs_keyix
Definition: mac.h:143
uint32_t ds
Definition: librm.h:140
#define AR_D_GBL_IFS_MISC
Definition: reg.h:629
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define AR_CR_RXD
Definition: reg.h:27
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
#define INIT_CWMIN
Definition: mac.h:72
#define AR_CRCErr
Definition: mac.h:558
#define ATH9K_RX_GI
Definition: mac.h:198
#define AR_Q_STS_PEND_FR_CNT
Definition: reg.h:471
#define AR_MACMISC_MISC_OBS_BUS_MSB_S
Definition: reg.h:147
#define AR_Q_CBRCFG_OVF_THRESH
Definition: reg.h:406
#define AR_IMR_S5_TIM_TIMER
Definition: reg.h:248
#define ATH9K_RX_2040
Definition: mac.h:199
enum ath9k_tx_queue tqi_type
Definition: mac.h:617
u8 rs_isaggr
Definition: mac.h:153
#define ATH9K_RXERR_DECRYPT
Definition: mac.h:193
#define AR_IMR_RXERR
Definition: reg.h:264
int ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
Definition: ath9k_hw.c:95
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_INTR_MAC_IRQ
Definition: reg.h:916
#define AR_IMR_S2_DTIM
Definition: reg.h:317
#define AR_QSTS(_i)
Definition: reg.h:470
#define AR_IMR_TXEOL
Definition: reg.h:272
#define AR_INTR_SYNC_ENABLE
Definition: reg.h:927
#define INIT_CWMAX
Definition: mac.h:74
#define AH_WAIT_TIMEOUT
Definition: hw.h:146
#define AR_PCU_FORCE_QUIET_COLL
Definition: reg.h:1650
#define AR_IMR_S0
Definition: reg.h:295
#define AR_IMR_RXINTM
Definition: reg.h:293
#define AR_IMR_S1
Definition: reg.h:301
int8_t rs_rssi_ctl1
Definition: mac.h:148
Definition: sis900.h:32
#define AR_RxRSSIAnt10
Definition: mac.h:543
#define AR_PCU_CLEAR_VMF
Definition: reg.h:1652
#define AR_QRDYTIMECFG(_i)
Definition: reg.h:419
#define AR_MACMISC
Definition: reg.h:129
#define AH_TIME_QUANTUM
Definition: hw.h:148
#define AR_INTR_ASYNC_ENABLE
Definition: reg.h:978
#define AR_NUM_QCU
Definition: reg.h:360
#define AR_DecryptCRCErr
Definition: mac.h:559
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505
#define AR_Q_DESC_CRCCHK
Definition: reg.h:480
Definition: sis900.h:31
#define AR_IMR_TXMINTR
Definition: reg.h:290
#define AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN
Definition: reg.h:454
#define AR_D_MISC_FRAG_WAIT_EN
Definition: reg.h:582
u32 tqi_burstTime
Definition: mac.h:628
#define AR_DecryptBusyErr
Definition: mac.h:573
#define AR_INTR_SYNC_MASK
Definition: reg.h:971
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define AR_MACMISC_DMA_OBS_S
Definition: reg.h:132
#define AR_Q_MISC_DCU_EARLY_TERM_REQ
Definition: reg.h:457
#define AR_IMR_BCNMISC
Definition: reg.h:283
void ath9k_hw_startpcureceive(struct ath_hw *ah, int is_scanning)
Definition: ath9k_mac.c:526
#define AR_IMR_S0_QCU_TXDESC
Definition: reg.h:298
#define AR_PHYErr
Definition: mac.h:560
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define AR_D_RETRY_LIMIT_FR_SH
Definition: reg.h:544
int8_t rs_rssi_ctl2
Definition: mac.h:149
#define AR_RxAntenna
Definition: mac.h:540
uint32_t u32
Definition: stdint.h:24
#define AR_IMR
Definition: reg.h:259
#define AR_RxFrameOK
Definition: mac.h:557
#define ENABLE_REGWRITE_BUFFER(_ah)
Definition: hw.h:90
#define AR_D_CHNTIME_EN
Definition: reg.h:565
#define AR_IMR_S1_QCU_TXERR
Definition: reg.h:302
#define DBG2(...)
Definition: compiler.h:515
#define AR_Q_MISC_FSP_CBR
Definition: reg.h:445
#define AR_DataLen
Definition: mac.h:527
void * memset(void *dest, int character, size_t len) __nonnull
u8 rs_phyerr
Definition: mac.h:141
#define AR_KeyIdx
Definition: mac.h:565