iPXE
Macros | Functions
ath9k_mac.c File Reference
#include <ipxe/io.h>
#include "hw.h"
#include "hw-ops.h"

Go to the source code of this file.

Macros

#define AH_RX_STOP_DMA_TIMEOUT   10000 /* usec */
 

Functions

 FILE_SECBOOT (FORBIDDEN)
 
static void ath9k_hw_set_txq_interrupts (struct ath_hw *ah, struct ath9k_tx_queue_info *qi __unused)
 
void ath9k_hw_puttxbuf (struct ath_hw *ah, u32 q, u32 txdp)
 
void ath9k_hw_txstart (struct ath_hw *ah, u32 q)
 
u32 ath9k_hw_numtxpending (struct ath_hw *ah, u32 q)
 
int ath9k_hw_updatetxtriglevel (struct ath_hw *ah, int bIncTrigLevel)
 ath9k_hw_updatetxtriglevel - adjusts the frame trigger level More...
 
void ath9k_hw_abort_tx_dma (struct ath_hw *ah)
 
void ath9k_hw_gettxintrtxqs (struct ath_hw *ah, u32 *txqs)
 
int ath9k_hw_set_txq_props (struct ath_hw *ah, int q, const struct ath9k_tx_queue_info *qinfo)
 
int ath9k_hw_setuptxqueue (struct ath_hw *ah, enum ath9k_tx_queue type, const struct ath9k_tx_queue_info *qinfo)
 
int ath9k_hw_releasetxqueue (struct ath_hw *ah, u32 q)
 
int ath9k_hw_resettxqueue (struct ath_hw *ah, u32 q)
 
int ath9k_hw_rxprocdesc (struct ath_hw *ah, struct ath_desc *ds, struct ath_rx_status *rs, u64 tsf __unused)
 
int ath9k_hw_setrxabort (struct ath_hw *ah, int set)
 
void ath9k_hw_putrxbuf (struct ath_hw *ah, u32 rxdp)
 
void ath9k_hw_startpcureceive (struct ath_hw *ah, int is_scanning)
 
void ath9k_hw_abortpcurecv (struct ath_hw *ah)
 
int ath9k_hw_stopdmarecv (struct ath_hw *ah, int *reset)
 
int ath9k_hw_intrpend (struct ath_hw *ah)
 
void ath9k_hw_disable_interrupts (struct ath_hw *ah)
 
void ath9k_hw_enable_interrupts (struct ath_hw *ah)
 
void ath9k_hw_set_interrupts (struct ath_hw *ah, unsigned int ints)
 

Macro Definition Documentation

◆ AH_RX_STOP_DMA_TIMEOUT

#define AH_RX_STOP_DMA_TIMEOUT   10000 /* usec */

Function Documentation

◆ FILE_SECBOOT()

FILE_SECBOOT ( FORBIDDEN  )

◆ ath9k_hw_set_txq_interrupts()

static void ath9k_hw_set_txq_interrupts ( struct ath_hw ah,
struct ath9k_tx_queue_info *qi  __unused 
)
static

Definition at line 27 of file ath9k_mac.c.

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 }
#define AR_IMR_S2_QCU_TXURN
Definition: reg.h:308
#define REGWRITE_BUFFER_FLUSH(_ah)
Definition: hw.h:96
#define AR_IMR_S0_QCU_TXOK
Definition: reg.h:296
#define SM(_v, _f)
Definition: hw.h:102
#define AR_IMR_S1_QCU_TXEOL
Definition: reg.h:304
#define AR_IMR_S2
Definition: reg.h:307
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_IMR_S0
Definition: reg.h:295
#define AR_IMR_S1
Definition: reg.h:301
uint8_t ah
Definition: registers.h:85
#define AR_IMR_S0_QCU_TXDESC
Definition: reg.h:298
#define ENABLE_REGWRITE_BUFFER(_ah)
Definition: hw.h:90
#define AR_IMR_S1_QCU_TXERR
Definition: reg.h:302
#define DBG2(...)
Definition: compiler.h:515

References ah, AR_IMR_S0, AR_IMR_S0_QCU_TXDESC, AR_IMR_S0_QCU_TXOK, AR_IMR_S1, AR_IMR_S1_QCU_TXEOL, AR_IMR_S1_QCU_TXERR, AR_IMR_S2, AR_IMR_S2_QCU_TXURN, DBG2, ENABLE_REGWRITE_BUFFER, REG_WRITE, REGWRITE_BUFFER_FLUSH, and SM.

Referenced by ath9k_hw_releasetxqueue(), and ath9k_hw_resettxqueue().

◆ ath9k_hw_puttxbuf()

void ath9k_hw_puttxbuf ( struct ath_hw ah,
u32  q,
u32  txdp 
)

Definition at line 52 of file ath9k_mac.c.

53 {
54  REG_WRITE(ah, AR_QTXDP(q), txdp);
55 }
#define AR_QTXDP(_i)
Definition: reg.h:382
Definition: sis900.h:30
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
uint8_t ah
Definition: registers.h:85

References ah, AR_QTXDP, REG_WRITE, and txdp.

Referenced by ath_tx_txqaddbuf().

◆ ath9k_hw_txstart()

void ath9k_hw_txstart ( struct ath_hw ah,
u32  q 
)

Definition at line 57 of file ath9k_mac.c.

58 {
59  DBG2("ath9k: "
60  "Enable TXE on queue: %d\n", q);
61  REG_WRITE(ah, AR_Q_TXE, 1 << q);
62 }
#define AR_Q_TXE
Definition: reg.h:387
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
uint8_t ah
Definition: registers.h:85
#define DBG2(...)
Definition: compiler.h:515

References ah, AR_Q_TXE, DBG2, and REG_WRITE.

Referenced by ath_tx_txqaddbuf().

◆ ath9k_hw_numtxpending()

u32 ath9k_hw_numtxpending ( struct ath_hw ah,
u32  q 
)

Definition at line 64 of file ath9k_mac.c.

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 }
#define AR_Q_TXE
Definition: reg.h:387
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define AR_Q_STS_PEND_FR_CNT
Definition: reg.h:471
#define AR_QSTS(_i)
Definition: reg.h:470
uint8_t ah
Definition: registers.h:85
uint32_t u32
Definition: stdint.h:24

References ah, AR_Q_STS_PEND_FR_CNT, AR_Q_TXE, AR_QSTS, and REG_READ.

Referenced by ath9k_hw_abort_tx_dma(), ath9k_hw_channel_change(), and ath_drain_all_txq().

◆ ath9k_hw_updatetxtriglevel()

int ath9k_hw_updatetxtriglevel ( struct ath_hw ah,
int  bIncTrigLevel 
)

ath9k_hw_updatetxtriglevel - adjusts the frame trigger level

@ah: atheros hardware struct @bIncTrigLevel: whether or not the frame trigger level should be updated

The frame trigger level specifies the minimum number of bytes, in units of 64 bytes, that must be DMA'ed into the PCU TX FIFO before the PCU will initiate sending the frame on the air. This can mean we initiate transmit before a full frame is on the PCU TX FIFO. Resets to 0x1 (meaning 64 bytes or a full frame, whichever occurs first)

Caution must be taken to ensure to set the frame trigger level based on the DMA request size. For example if the DMA request size is set to 128 bytes the trigger level cannot exceed 6 * 64 = 384. This is because there need to be enough space in the tx FIFO for the requested transfer size. Hence the tx FIFO will stop with 512 - 128 = 384 bytes. If we set the threshold to a value beyond 6, then the transmit will hang.

Current dual stream devices have a PCU TX FIFO size of 8 KB. Current single stream devices have a PCU TX FIFO size of 4 KB, however, there is a hardware issue which forces us to use 2 KB instead so the frame trigger level must not exceed 2 KB for these chipsets.

Definition at line 103 of file ath9k_mac.c.

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 }
void ath9k_hw_enable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:618
#define AR_FTRIG
Definition: reg.h:90
#define MS(_v, _f)
Definition: hw.h:103
#define SM(_v, _f)
Definition: hw.h:102
#define AR_TXCFG
Definition: reg.h:80
void ath9k_hw_disable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:604
#define MIN_TX_FIFO_THRESHOLD
Definition: mac.h:102
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
uint8_t ah
Definition: registers.h:85
Definition: sis900.h:31
uint32_t u32
Definition: stdint.h:24

References ah, AR_FTRIG, AR_TXCFG, ath9k_hw_disable_interrupts(), ath9k_hw_enable_interrupts(), MIN_TX_FIFO_THRESHOLD, MS, REG_READ, REG_WRITE, SM, and txcfg.

Referenced by ar9002_hw_proc_txdesc(), ar9003_hw_proc_txdesc(), and ath_isr().

◆ ath9k_hw_abort_tx_dma()

void ath9k_hw_abort_tx_dma ( struct ath_hw ah)

Definition at line 131 of file ath9k_mac.c.

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 }
u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q)
Definition: ath9k_mac.c:64
#define REG_CLR_BIT(_a, _r, _f)
Definition: hw.h:110
#define AR_Q_TXD_M
Definition: reg.h:391
#define AR_Q_TXD
Definition: reg.h:390
#define AR_DIAG_FORCE_CH_IDLE_HIGH
Definition: reg.h:1522
#define AR_PCU_MISC
Definition: reg.h:1641
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:61
#define AR_D_GBL_IFS_MISC_IGNORE_BACKOFF
Definition: reg.h:637
#define AR_D_GBL_IFS_MISC
Definition: reg.h:629
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_PCU_FORCE_QUIET_COLL
Definition: reg.h:1650
#define AR_PCU_CLEAR_VMF
Definition: reg.h:1652
#define AR_NUM_QCU
Definition: reg.h:360
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505

References ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF, AR_DIAG_FORCE_CH_IDLE_HIGH, AR_DIAG_SW, AR_NUM_QCU, AR_PCU_CLEAR_VMF, AR_PCU_FORCE_QUIET_COLL, AR_PCU_MISC, AR_Q_TXD, AR_Q_TXD_M, ath9k_hw_numtxpending(), REG_CLR_BIT, REG_SET_BIT, REG_WRITE, and udelay().

Referenced by ath_drain_all_txq().

◆ ath9k_hw_gettxintrtxqs()

void ath9k_hw_gettxintrtxqs ( struct ath_hw ah,
u32 txqs 
)

Definition at line 158 of file ath9k_mac.c.

159 {
160  *txqs &= ah->intr_txqs;
161  ah->intr_txqs &= ~(*txqs);
162 }
uint8_t ah
Definition: registers.h:85

References ah.

Referenced by ath_tx_tasklet().

◆ ath9k_hw_set_txq_props()

int ath9k_hw_set_txq_props ( struct ath_hw ah,
int  q,
const struct ath9k_tx_queue_info qinfo 
)

Definition at line 164 of file ath9k_mac.c.

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 }
u32 tqi_priority
Definition: mac.h:620
#define min(x, y)
Definition: ath.h:36
#define INIT_AIFS
Definition: mac.h:71
#define ATH9K_TXQ_USEDEFAULT
Definition: mac.h:598
enum ath9k_tx_queue_flags tqi_qflags
Definition: mac.h:619
u32 tqi_cbrPeriod
Definition: mac.h:626
#define INIT_SH_RETRY
Definition: mac.h:75
#define INIT_LG_RETRY
Definition: mac.h:76
u32 tqi_readyTime
Definition: mac.h:629
u32 tqi_cbrOverflowLimit
Definition: mac.h:627
enum ath9k_tx_queue tqi_type
Definition: mac.h:617
#define INIT_CWMAX
Definition: mac.h:74
uint8_t ah
Definition: registers.h:85
u32 tqi_burstTime
Definition: mac.h:628
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
uint32_t u32
Definition: stdint.h:24
#define DBG2(...)
Definition: compiler.h:515

References ah, ATH9K_TX_QUEUE_INACTIVE, ATH9K_TXQ_USEDEFAULT, DBG, DBG2, INIT_AIFS, INIT_CWMAX, INIT_LG_RETRY, INIT_SH_RETRY, min, ath9k_tx_queue_info::tqi_aifs, ath9k_tx_queue_info::tqi_burstTime, ath9k_tx_queue_info::tqi_cbrOverflowLimit, ath9k_tx_queue_info::tqi_cbrPeriod, ath9k_tx_queue_info::tqi_cwmax, ath9k_tx_queue_info::tqi_cwmin, ath9k_tx_queue_info::tqi_lgretry, ath9k_tx_queue_info::tqi_priority, ath9k_tx_queue_info::tqi_qflags, ath9k_tx_queue_info::tqi_readyTime, ath9k_tx_queue_info::tqi_shretry, ath9k_tx_queue_info::tqi_subtype, ath9k_tx_queue_info::tqi_type, and ath9k_tx_queue_info::tqi_ver.

Referenced by ath9k_hw_setuptxqueue().

◆ ath9k_hw_setuptxqueue()

int ath9k_hw_setuptxqueue ( struct ath_hw ah,
enum ath9k_tx_queue  type,
const struct ath9k_tx_queue_info qinfo 
)

Definition at line 218 of file ath9k_mac.c.

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 }
uint32_t type
Operating system type.
Definition: ena.h:12
#define INIT_AIFS
Definition: mac.h:71
int ath9k_hw_set_txq_props(struct ath_hw *ah, int q, const struct ath9k_tx_queue_info *qinfo)
Definition: ath9k_mac.c:164
#define ATH9K_TXQ_USEDEFAULT
Definition: mac.h:598
enum ath9k_tx_queue_flags tqi_qflags
Definition: mac.h:619
#define INIT_SH_RETRY
Definition: mac.h:75
#define INIT_LG_RETRY
Definition: mac.h:76
#define ATH9K_NUM_TX_QUEUES
Definition: mac.h:581
u32 tqi_physCompBuf
Definition: mac.h:630
enum ath9k_tx_queue tqi_type
Definition: mac.h:617
#define INIT_CWMAX
Definition: mac.h:74
uint8_t ah
Definition: registers.h:85
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define DBG2(...)
Definition: compiler.h:515
void * memset(void *dest, int character, size_t len) __nonnull

References ah, ath9k_hw_set_txq_props(), ATH9K_NUM_TX_QUEUES, ATH9K_TX_QUEUE_INACTIVE, ATH9K_TXQ_USEDEFAULT, DBG, DBG2, INIT_AIFS, INIT_CWMAX, INIT_LG_RETRY, INIT_SH_RETRY, memset(), NULL, ath9k_tx_queue_info::tqi_aifs, ath9k_tx_queue_info::tqi_cwmax, ath9k_tx_queue_info::tqi_cwmin, ath9k_tx_queue_info::tqi_lgretry, ath9k_tx_queue_info::tqi_physCompBuf, ath9k_tx_queue_info::tqi_qflags, ath9k_tx_queue_info::tqi_shretry, ath9k_tx_queue_info::tqi_type, TXQ_FLAG_TXDESCINT_ENABLE, TXQ_FLAG_TXERRINT_ENABLE, TXQ_FLAG_TXOKINT_ENABLE, TXQ_FLAG_TXURNINT_ENABLE, and type.

Referenced by ath_txq_setup().

◆ ath9k_hw_releasetxqueue()

int ath9k_hw_releasetxqueue ( struct ath_hw ah,
u32  q 
)

Definition at line 261 of file ath9k_mac.c.

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 }
static void ath9k_hw_set_txq_interrupts(struct ath_hw *ah, struct ath9k_tx_queue_info *qi __unused)
Definition: ath9k_mac.c:27
enum ath9k_tx_queue tqi_type
Definition: mac.h:617
uint8_t ah
Definition: registers.h:85
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define DBG2(...)
Definition: compiler.h:515

References ah, ath9k_hw_set_txq_interrupts(), ATH9K_TX_QUEUE_INACTIVE, DBG, DBG2, and ath9k_tx_queue_info::tqi_type.

Referenced by ath_tx_cleanupq(), and ath_txq_setup().

◆ ath9k_hw_resettxqueue()

int ath9k_hw_resettxqueue ( struct ath_hw ah,
u32  q 
)

Definition at line 285 of file ath9k_mac.c.

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 }
#define AR_DMISC(_i)
Definition: reg.h:578
#define AR_QCBRCFG(_i)
Definition: reg.h:403
#define ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS
Definition: mac.h:599
#define AR_QMISC(_i)
Definition: reg.h:442
#define AR_DRETRY_LIMIT(_i)
Definition: reg.h:543
#define AR_D_LCL_IFS_CWMIN
Definition: reg.h:524
#define AR_D_MISC_FRAG_BKOFF_EN
Definition: reg.h:583
#define AR_D_RETRY_LIMIT_STA_SH
Definition: reg.h:546
#define AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL
Definition: reg.h:594
#define IS_CHAN_B(_c)
Definition: ath5k.h:660
u32 tqi_intFlags
Definition: mac.h:631
#define REGWRITE_BUFFER_FLUSH(_ah)
Definition: hw.h:96
#define AR_D_LCL_IFS_CWMAX
Definition: reg.h:526
#define AR_D_MISC_CW_BKOFF_EN
Definition: reg.h:584
#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_D_LCL_IFS_AIFS
Definition: reg.h:528
#define INIT_SSH_RETRY
Definition: mac.h:77
#define AR_Q_RDYTIMECFG_DURATION
Definition: reg.h:420
#define AR_D_RETRY_LIMIT_STA_LG
Definition: reg.h:548
#define AR_DCHNTIME(_i)
Definition: reg.h:562
#define AR_DLCL_IFS(_i)
Definition: reg.h:523
#define AR_SREV_9300_20_OR_LATER(_ah)
Definition: reg.h:865
#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 ATH9K_TXQ_USEDEFAULT
Definition: mac.h:598
enum ath9k_tx_queue_flags tqi_qflags
Definition: mac.h:619
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 AR_D_MISC_ARB_LOCKOUT_CNTRL
Definition: reg.h:590
u32 tqi_cbrPeriod
Definition: mac.h:626
#define INIT_SLG_RETRY
Definition: mac.h:78
#define AR_Q_MISC_RDYTIME_EXP_POLICY
Definition: reg.h:455
#define AR_SREV_9340(_ah)
Definition: reg.h:879
u32 tqi_readyTime
Definition: mac.h:629
u32 tqi_cbrOverflowLimit
Definition: mac.h:627
#define INIT_CWMIN_11B
Definition: mac.h:73
#define AR_Q_CBRCFG_INTERVAL
Definition: reg.h:404
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
#define INIT_CWMIN
Definition: mac.h:72
#define AR_Q_CBRCFG_OVF_THRESH
Definition: reg.h:406
enum ath9k_tx_queue tqi_type
Definition: mac.h:617
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_QRDYTIMECFG(_i)
Definition: reg.h:419
uint8_t ah
Definition: registers.h:85
#define AR_Q_DESC_CRCCHK
Definition: reg.h:480
#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 DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define AR_Q_MISC_DCU_EARLY_TERM_REQ
Definition: reg.h:457
#define AR_D_RETRY_LIMIT_FR_SH
Definition: reg.h:544
uint32_t u32
Definition: stdint.h:24
#define ENABLE_REGWRITE_BUFFER(_ah)
Definition: hw.h:90
#define AR_D_CHNTIME_EN
Definition: reg.h:565
#define DBG2(...)
Definition: compiler.h:515
#define AR_Q_MISC_FSP_CBR
Definition: reg.h:445

References __unused, ah, AR_D_CHNTIME_DUR, AR_D_CHNTIME_EN, AR_D_LCL_IFS_AIFS, AR_D_LCL_IFS_CWMAX, AR_D_LCL_IFS_CWMIN, AR_D_MISC_ARB_LOCKOUT_CNTRL, AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, AR_D_MISC_CW_BKOFF_EN, AR_D_MISC_FRAG_BKOFF_EN, AR_D_MISC_FRAG_WAIT_EN, AR_D_MISC_POST_FR_BKOFF_DIS, AR_D_RETRY_LIMIT_FR_SH, AR_D_RETRY_LIMIT_STA_LG, AR_D_RETRY_LIMIT_STA_SH, AR_DCHNTIME, AR_DLCL_IFS, AR_DMISC, AR_DRETRY_LIMIT, AR_Q_CBRCFG_INTERVAL, AR_Q_CBRCFG_OVF_THRESH, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN, AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN, AR_Q_MISC_DCU_EARLY_TERM_REQ, AR_Q_MISC_FSP_CBR, AR_Q_MISC_RDYTIME_EXP_POLICY, AR_Q_RDYTIMECFG_DURATION, AR_Q_RDYTIMECFG_EN, AR_QCBRCFG, AR_QMISC, AR_QRDYTIMECFG, AR_SREV_9300_20_OR_LATER, AR_SREV_9340, ath9k_hw_set_txq_interrupts(), ATH9K_TX_QUEUE_INACTIVE, ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS, ATH9K_TXQ_USEDEFAULT, ath9k_channel::chan, DBG, DBG2, ENABLE_REGWRITE_BUFFER, INIT_CWMIN, INIT_CWMIN_11B, INIT_SLG_RETRY, INIT_SSH_RETRY, IS_CHAN_B, REG_SET_BIT, REG_WRITE, REGWRITE_BUFFER_FLUSH, SM, ath9k_tx_queue_info::tqi_aifs, ath9k_tx_queue_info::tqi_burstTime, ath9k_tx_queue_info::tqi_cbrOverflowLimit, ath9k_tx_queue_info::tqi_cbrPeriod, ath9k_tx_queue_info::tqi_cwmax, ath9k_tx_queue_info::tqi_cwmin, ath9k_tx_queue_info::tqi_intFlags, ath9k_tx_queue_info::tqi_qflags, ath9k_tx_queue_info::tqi_readyTime, ath9k_tx_queue_info::tqi_shretry, ath9k_tx_queue_info::tqi_type, TXQ_FLAG_BACKOFF_DISABLE, TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE, TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE, TXQ_FLAG_TXDESCINT_ENABLE, TXQ_FLAG_TXEOLINT_ENABLE, TXQ_FLAG_TXERRINT_ENABLE, TXQ_FLAG_TXOKINT_ENABLE, TXQ_FLAG_TXURNINT_ENABLE, and value.

Referenced by ath9k_hw_reset().

◆ ath9k_hw_rxprocdesc()

int ath9k_hw_rxprocdesc ( struct ath_hw ah,
struct ath_desc ds,
struct ath_rx_status rs,
u64 tsf  __unused 
)

Definition at line 396 of file ath9k_mac.c.

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 }
u8 rs_moreaggr
Definition: mac.h:154
#define ATH9K_RX_DELIM_CRC_PRE
Definition: mac.h:200
int8_t rs_rssi_ext0
Definition: mac.h:150
#define AR_GI
Definition: mac.h:535
u8 rs_more
Definition: mac.h:146
#define AR_RxRSSIAnt01
Definition: mac.h:519
#define AR_RxRSSIAnt02
Definition: mac.h:521
u8 rs_flags
Definition: mac.h:156
int8_t rs_rssi_ctl0
Definition: mac.h:147
#define ATH9K_RXERR_MIC
Definition: mac.h:194
u32 rs_tstamp
Definition: mac.h:138
struct ar5416_desc::@34::@36 rx
#define MS(_v, _f)
Definition: hw.h:103
u8 rs_rate
Definition: mac.h:144
#define AR_2040
Definition: mac.h:536
#define AR_RxDone
Definition: mac.h:556
#define ATH9K_RXERR_CRC
Definition: mac.h:190
#define AR_PHYErrCode
Definition: mac.h:567
int8_t rs_rssi_ext1
Definition: mac.h:151
#define AR_RxRSSIAnt00
Definition: mac.h:517
#define AR_RxMoreAggr
Definition: mac.h:569
#define ATH9K_RX_DECRYPT_BUSY
Definition: mac.h:202
#define AR_RxRSSIAnt12
Definition: mac.h:547
#define ATH9K_RX_DELIM_CRC_POST
Definition: mac.h:201
int8_t rs_rssi_ext2
Definition: mac.h:152
#define ATH9K_RXKEYIX_INVALID
Definition: mac.h:204
#define AR_RxRSSICombined
Definition: mac.h:549
#define ATH9K_RSSI_BAD
Definition: hw.h:73
#define AR_PostDelimCRCErr
Definition: mac.h:571
#define AR_RxKeyIdxValid
Definition: mac.h:564
u16 rs_datalen
Definition: mac.h:139
#define AR_RxRSSIAnt11
Definition: mac.h:545
#define AR_MichaelErr
Definition: mac.h:561
u8 rs_antenna
Definition: mac.h:145
#define AR5416DESC(_ds)
Definition: mac.h:319
#define AR_KeyMiss
Definition: mac.h:574
u8 rs_status
Definition: mac.h:140
#define EINPROGRESS
Operation in progress.
Definition: errno.h:419
#define AR_RxAggr
Definition: mac.h:570
#define RXSTATUS_RATE(ah, ads)
Definition: mac.h:28
#define ATH9K_RXERR_PHY
Definition: mac.h:191
#define AR_RxMore
Definition: mac.h:528
union ar5416_desc::@34 u
int8_t rs_rssi
Definition: mac.h:142
#define AR_PreDelimCRCErr
Definition: mac.h:562
u8 rs_keyix
Definition: mac.h:143
uint32_t ds
Definition: librm.h:140
#define AR_CRCErr
Definition: mac.h:558
#define ATH9K_RX_GI
Definition: mac.h:198
#define ATH9K_RX_2040
Definition: mac.h:199
u8 rs_isaggr
Definition: mac.h:153
#define ATH9K_RXERR_DECRYPT
Definition: mac.h:193
int8_t rs_rssi_ctl1
Definition: mac.h:148
#define AR_RxRSSIAnt10
Definition: mac.h:543
#define AR_DecryptCRCErr
Definition: mac.h:559
uint8_t ah
Definition: registers.h:85
#define AR_DecryptBusyErr
Definition: mac.h:573
#define AR_PHYErr
Definition: mac.h:560
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_RxFrameOK
Definition: mac.h:557
#define AR_DataLen
Definition: mac.h:527
u8 rs_phyerr
Definition: mac.h:141
#define AR_KeyIdx
Definition: mac.h:565

References ah, AR5416DESC, AR_2040, AR_CRCErr, AR_DataLen, AR_DecryptBusyErr, AR_DecryptCRCErr, AR_GI, AR_KeyIdx, AR_KeyMiss, AR_MichaelErr, AR_PHYErr, AR_PHYErrCode, AR_PostDelimCRCErr, AR_PreDelimCRCErr, AR_RxAggr, AR_RxAntenna, AR_RxDone, AR_RxFrameOK, AR_RxKeyIdxValid, AR_RxMore, AR_RxMoreAggr, AR_RxRSSIAnt00, AR_RxRSSIAnt01, AR_RxRSSIAnt02, AR_RxRSSIAnt10, AR_RxRSSIAnt11, AR_RxRSSIAnt12, AR_RxRSSICombined, ATH9K_RSSI_BAD, ATH9K_RX_2040, ATH9K_RX_DECRYPT_BUSY, ATH9K_RX_DELIM_CRC_POST, ATH9K_RX_DELIM_CRC_PRE, ATH9K_RX_GI, ATH9K_RXERR_CRC, ATH9K_RXERR_DECRYPT, ATH9K_RXERR_MIC, ATH9K_RXERR_PHY, ATH9K_RXKEYIX_INVALID, ds, EINPROGRESS, MS, ath_rx_status::rs_antenna, ath_rx_status::rs_datalen, ath_rx_status::rs_flags, ath_rx_status::rs_isaggr, ath_rx_status::rs_keyix, ath_rx_status::rs_more, ath_rx_status::rs_moreaggr, ath_rx_status::rs_phyerr, ath_rx_status::rs_rate, ath_rx_status::rs_rssi, ath_rx_status::rs_rssi_ctl0, ath_rx_status::rs_rssi_ctl1, ath_rx_status::rs_rssi_ctl2, ath_rx_status::rs_rssi_ext0, ath_rx_status::rs_rssi_ext1, ath_rx_status::rs_rssi_ext2, ath_rx_status::rs_status, ath_rx_status::rs_tstamp, ar5416_desc::rx, RXSTATUS_RATE, and ar5416_desc::u.

Referenced by ath_get_next_rx_buf().

◆ ath9k_hw_setrxabort()

int ath9k_hw_setrxabort ( struct ath_hw ah,
int  set 
)

Definition at line 492 of file ath9k_mac.c.

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 }
#define AR_DIAG_RX_ABORT
Definition: reg.h:1525
static unsigned int unsigned int reg
Definition: myson.h:162
#define AR_OBS_BUS_1
Definition: reg.h:1559
struct option_descriptor set[0]
Definition: nvo_cmd.c:112
#define AR_OBS_BUS_1_RX_STATE
Definition: reg.h:1574
#define REG_CLR_BIT(_a, _r, _f)
Definition: hw.h:110
#define AR_DIAG_RX_DIS
Definition: reg.h:1511
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
int ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
Definition: ath9k_hw.c:95
#define AH_WAIT_TIMEOUT
Definition: hw.h:146
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
uint32_t u32
Definition: stdint.h:24

References ah, AH_WAIT_TIMEOUT, AR_DIAG_RX_ABORT, AR_DIAG_RX_DIS, AR_DIAG_SW, AR_OBS_BUS_1, AR_OBS_BUS_1_RX_STATE, ath9k_hw_wait(), DBG, reg, REG_CLR_BIT, REG_READ, REG_SET_BIT, and set.

Referenced by ath_isr().

◆ ath9k_hw_putrxbuf()

void ath9k_hw_putrxbuf ( struct ath_hw ah,
u32  rxdp 
)

Definition at line 521 of file ath9k_mac.c.

522 {
524 }
#define AR_RXDP
Definition: reg.h:30
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
Definition: sis900.h:32
uint8_t ah
Definition: registers.h:85

References ah, AR_RXDP, REG_WRITE, and rxdp.

Referenced by ath_rx_buf_link(), and ath_startrecv().

◆ ath9k_hw_startpcureceive()

void ath9k_hw_startpcureceive ( struct ath_hw ah,
int  is_scanning 
)

Definition at line 526 of file ath9k_mac.c.

527 {
528  ath9k_ani_reset(ah, is_scanning);
529 
531 }
#define AR_DIAG_RX_ABORT
Definition: reg.h:1525
void ath9k_ani_reset(struct ath_hw *ah, int is_scanning)
Definition: ath9k_ani.c:468
#define REG_CLR_BIT(_a, _r, _f)
Definition: hw.h:110
#define AR_DIAG_RX_DIS
Definition: reg.h:1511
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505

References ah, AR_DIAG_RX_ABORT, AR_DIAG_RX_DIS, AR_DIAG_SW, ath9k_ani_reset(), and REG_CLR_BIT.

Referenced by ath_startrecv().

◆ ath9k_hw_abortpcurecv()

void ath9k_hw_abortpcurecv ( struct ath_hw ah)

Definition at line 533 of file ath9k_mac.c.

534 {
536 }
#define AR_DIAG_RX_ABORT
Definition: reg.h:1525
#define AR_DIAG_RX_DIS
Definition: reg.h:1511
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505

References ah, AR_DIAG_RX_ABORT, AR_DIAG_RX_DIS, AR_DIAG_SW, and REG_SET_BIT.

Referenced by ath_stoprecv().

◆ ath9k_hw_stopdmarecv()

int ath9k_hw_stopdmarecv ( struct ath_hw ah,
int *  reset 
)

Definition at line 538 of file ath9k_mac.c.

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 }
#define AR_CR_RXE
Definition: reg.h:26
#define AR_MACMISC_MISC_OBS_BUS_1
Definition: reg.h:148
#define AR_CR
Definition: reg.h:25
#define AR_DMADBG_7
Definition: reg.h:358
#define AR_SREV_9300_20_OR_LATER(_ah)
Definition: reg.h:865
#define AH_RX_STOP_DMA_TIMEOUT
#define AR_MACMISC_DMA_OBS_LINE_8
Definition: reg.h:141
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:61
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define AR_CR_RXD
Definition: reg.h:27
#define AR_MACMISC_MISC_OBS_BUS_MSB_S
Definition: reg.h:147
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_MACMISC
Definition: reg.h:129
#define AH_TIME_QUANTUM
Definition: hw.h:148
uint8_t ah
Definition: registers.h:85
#define AR_DIAG_SW
Definition: reg.h:1505
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define AR_MACMISC_DMA_OBS_S
Definition: reg.h:132
uint32_t u32
Definition: stdint.h:24

References ah, AH_RX_STOP_DMA_TIMEOUT, AH_TIME_QUANTUM, AR_CR, AR_CR_RXD, AR_CR_RXE, AR_DIAG_SW, AR_DMADBG_7, AR_MACMISC, AR_MACMISC_DMA_OBS_LINE_8, AR_MACMISC_DMA_OBS_S, AR_MACMISC_MISC_OBS_BUS_1, AR_MACMISC_MISC_OBS_BUS_MSB_S, AR_SREV_9300_20_OR_LATER, DBG, REG_READ, REG_WRITE, and udelay().

Referenced by ath_stoprecv().

◆ ath9k_hw_intrpend()

int ath9k_hw_intrpend ( struct ath_hw ah)

Definition at line 585 of file ath9k_mac.c.

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 }
#define AR_INTR_ASYNC_CAUSE
Definition: reg.h:976
#define AR_SREV_9100(ah)
Definition: reg.h:811
#define AR_IER_ENABLE
Definition: reg.h:56
#define AR_INTR_SPURIOUS
Definition: reg.h:920
#define AR_INTR_SYNC_CAUSE
Definition: reg.h:923
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define AR_INTR_MAC_IRQ
Definition: reg.h:916
uint8_t ah
Definition: registers.h:85
uint32_t u32
Definition: stdint.h:24

References ah, AR_IER_ENABLE, AR_INTR_ASYNC_CAUSE, AR_INTR_MAC_IRQ, AR_INTR_SPURIOUS, AR_INTR_SYNC_CAUSE, AR_INTR_SYNC_DEFAULT, AR_SREV_9100, and REG_READ.

Referenced by ath_isr().

◆ ath9k_hw_disable_interrupts()

void ath9k_hw_disable_interrupts ( struct ath_hw ah)

Definition at line 604 of file ath9k_mac.c.

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 }
#define AR_IER
Definition: reg.h:55
#define AR_SREV_9100(ah)
Definition: reg.h:811
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_INTR_SYNC_ENABLE
Definition: reg.h:927
#define AR_INTR_ASYNC_ENABLE
Definition: reg.h:978
uint8_t ah
Definition: registers.h:85
#define DBG2(...)
Definition: compiler.h:515

References ah, AR_IER, AR_INTR_ASYNC_ENABLE, AR_INTR_SYNC_ENABLE, AR_SREV_9100, DBG2, REG_READ, and REG_WRITE.

Referenced by ath9k_hw_set_interrupts(), ath9k_hw_updatetxtriglevel(), ath9k_stop(), ath_isr(), ath_radio_disable(), ath_reset(), and ath_set_channel().

◆ ath9k_hw_enable_interrupts()

void ath9k_hw_enable_interrupts ( struct ath_hw ah)

Definition at line 618 of file ath9k_mac.c.

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 }
#define AR_IER
Definition: reg.h:55
#define AR_SREV_9100(ah)
Definition: reg.h:811
#define AR_SREV_9340(_ah)
Definition: reg.h:879
#define AR_INTR_ASYNC_MASK
Definition: reg.h:967
#define REG_READ(_ah, _reg)
Definition: hw.h:81
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_INTR_MAC_IRQ
Definition: reg.h:916
#define AR_INTR_SYNC_ENABLE
Definition: reg.h:927
#define AR_INTR_ASYNC_ENABLE
Definition: reg.h:978
uint8_t ah
Definition: registers.h:85
#define AR_INTR_SYNC_MASK
Definition: reg.h:971
uint32_t u32
Definition: stdint.h:24
#define AR_IMR
Definition: reg.h:259
#define DBG2(...)
Definition: compiler.h:515

References ah, AR_IER, AR_IMR, AR_INTR_ASYNC_ENABLE, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ, AR_INTR_SYNC_DEFAULT, AR_INTR_SYNC_ENABLE, AR_INTR_SYNC_HOST1_FATAL, AR_INTR_SYNC_MASK, AR_SREV_9100, AR_SREV_9340, ATH9K_INT_GLOBAL, DBG2, REG_READ, and REG_WRITE.

Referenced by ath9k_hw_set_interrupts(), ath9k_hw_updatetxtriglevel(), and ath9k_tasklet().

◆ ath9k_hw_set_interrupts()

void ath9k_hw_set_interrupts ( struct ath_hw ah,
unsigned int  ints 
)

Definition at line 643 of file ath9k_mac.c.

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_IMR_S2_CABEND
Definition: reg.h:313
#define AR_IMR_S2_TIM
Definition: reg.h:312
void ath9k_hw_enable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:618
#define AR_IMR_RXMINTR
Definition: reg.h:291
#define AR_IMR_RXOK_HP
Definition: reg.h:262
#define REG_CLR_BIT(_a, _r, _f)
Definition: hw.h:110
#define AR_IMR_TXERR
Definition: reg.h:270
#define AR_IMR_RXDESC
Definition: reg.h:261
ath9k_int
Definition: hw.h:252
#define AR_IMR_GENTMR
Definition: reg.h:288
#define AR_IMR_TXINTM
Definition: reg.h:292
#define AR_IMR_RXOK
Definition: reg.h:260
#define AR_IMR_S2_CABTO
Definition: reg.h:316
#define AR_SREV_9300_20_OR_LATER(_ah)
Definition: reg.h:865
#define AR_IMR_S2_GTT
Definition: reg.h:311
#define AR_IMR_TXOK
Definition: reg.h:268
#define AR_IMR_S5
Definition: reg.h:329
void ath9k_hw_disable_interrupts(struct ath_hw *ah)
Definition: ath9k_mac.c:604
#define AR_IMR_S2_TSFOOR
Definition: reg.h:318
#define AR_IMR_S2_DTIMSYNC
Definition: reg.h:314
#define AR_IMR_RXOK_LP
Definition: reg.h:263
#define AR_IMR_TXDESC
Definition: reg.h:269
#define AR_IMR_S2_CST
Definition: reg.h:310
#define AR_IMR_S2
Definition: reg.h:307
#define REG_SET_BIT(_a, _r, _f)
Definition: hw.h:108
#define AR_IMR_S5_TIM_TIMER
Definition: reg.h:248
#define AR_IMR_RXERR
Definition: reg.h:264
#define REG_WRITE(_ah, _reg, _val)
Definition: hw.h:78
#define AR_IMR_S2_DTIM
Definition: reg.h:317
#define AR_IMR_TXEOL
Definition: reg.h:272
#define AR_IMR_RXINTM
Definition: reg.h:293
uint8_t ah
Definition: registers.h:85
#define AR_IMR_TXMINTR
Definition: reg.h:290
#define AR_IMR_BCNMISC
Definition: reg.h:283
uint32_t u32
Definition: stdint.h:24
#define AR_IMR
Definition: reg.h:259
#define DBG2(...)
Definition: compiler.h:515

References ah, AR_IMR, AR_IMR_BCNMISC, AR_IMR_GENTMR, AR_IMR_RXDESC, AR_IMR_RXERR, AR_IMR_RXINTM, AR_IMR_RXMINTR, AR_IMR_RXOK, AR_IMR_RXOK_HP, AR_IMR_RXOK_LP, AR_IMR_S2, AR_IMR_S2_CABEND, AR_IMR_S2_CABTO, AR_IMR_S2_CST, AR_IMR_S2_DTIM, AR_IMR_S2_DTIMSYNC, AR_IMR_S2_GTT, AR_IMR_S2_TIM, AR_IMR_S2_TSFOOR, AR_IMR_S5, AR_IMR_S5_TIM_TIMER, AR_IMR_TXDESC, AR_IMR_TXEOL, AR_IMR_TXERR, AR_IMR_TXINTM, AR_IMR_TXMINTR, AR_IMR_TXOK, AR_SREV_9300_20_OR_LATER, ATH9K_HW_CAP_AUTOSLEEP, ath9k_hw_disable_interrupts(), ath9k_hw_enable_interrupts(), ATH9K_INT_BMISC, ATH9K_INT_CABEND, ATH9K_INT_COMMON, ATH9K_INT_CST, ATH9K_INT_DTIM, ATH9K_INT_DTIMSYNC, ATH9K_INT_GENTIMER, ATH9K_INT_GLOBAL, ATH9K_INT_GTT, ATH9K_INT_RX, ATH9K_INT_TIM, ATH9K_INT_TIM_TIMER, ATH9K_INT_TSFOOR, ATH9K_INT_TX, DBG2, ath9k_hw_capabilities::hw_caps, REG_CLR_BIT, REG_SET_BIT, and REG_WRITE.

Referenced by ath9k_irq(), ath9k_start(), ath_reset(), and ath_set_channel().