iPXE
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
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 */

Referenced by ath9k_hw_stopdmarecv().

Function Documentation

◆ FILE_SECBOOT()

FILE_SECBOOT ( FORBIDDEN )

◆ ath9k_hw_set_txq_interrupts()

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

References __unused, 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{
55}
#define AR_QTXDP(_i)
Definition reg.h:382
@ txdp
Definition sis900.h:30

References ah, AR_QTXDP, REG_WRITE, txdp, and u32.

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

References ah, AR_Q_TXE, DBG2, REG_WRITE, and u32.

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
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_QSTS(_i)
Definition reg.h:470
#define AR_Q_STS_PEND_FR_CNT
Definition reg.h:471
#define REG_READ(_ah, _reg)
Definition hw.h:81
#define u32
Definition vga.h:21

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

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}
#define AR_FTRIG
Definition reg.h:90
#define AR_TXCFG
Definition reg.h:80
void ath9k_hw_enable_interrupts(struct ath_hw *ah)
Definition ath9k_mac.c:618
void ath9k_hw_disable_interrupts(struct ath_hw *ah)
Definition ath9k_mac.c:604
#define MS(_v, _f)
Definition hw.h:103
#define MIN_TX_FIFO_THRESHOLD
Definition mac.h:102
@ txcfg
Definition sis900.h:31

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

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}
#define AR_PCU_CLEAR_VMF
Definition reg.h:1652
#define AR_D_GBL_IFS_MISC_IGNORE_BACKOFF
Definition reg.h:637
#define AR_DIAG_FORCE_CH_IDLE_HIGH
Definition reg.h:1522
#define AR_NUM_QCU
Definition reg.h:360
#define AR_D_GBL_IFS_MISC
Definition reg.h:629
#define AR_Q_TXD_M
Definition reg.h:391
#define AR_PCU_MISC
Definition reg.h:1641
#define AR_PCU_FORCE_QUIET_COLL
Definition reg.h:1650
#define AR_DIAG_SW
Definition reg.h:1505
#define AR_Q_TXD
Definition reg.h:390
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 REG_SET_BIT(_a, _r, _f)
Definition hw.h:108
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition timer.c:61

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}

References ah, and u32.

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];
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}
#define min(x, y)
Definition ath.h:36
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
#define ATH9K_TXQ_USEDEFAULT
Definition mac.h:598
#define INIT_SH_RETRY
Definition mac.h:75
#define INIT_AIFS
Definition mac.h:71
@ ATH9K_TX_QUEUE_INACTIVE
Definition mac.h:577
#define INIT_LG_RETRY
Definition mac.h:76
#define INIT_CWMAX
Definition mac.h:74
u32 tqi_cbrOverflowLimit
Definition mac.h:627
enum ath9k_tx_queue_flags tqi_qflags
Definition mac.h:619
enum ath9k_tx_queue tqi_type
Definition mac.h:617

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, ath9k_tx_queue_info::tqi_ver, and u32.

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];
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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
int ath9k_hw_set_txq_props(struct ath_hw *ah, int q, const struct ath9k_tx_queue_info *qinfo)
Definition ath9k_mac.c:164
uint32_t type
Operating system type.
Definition ena.h:1
void * memset(void *dest, int character, size_t len) __nonnull
#define ATH9K_NUM_TX_QUEUES
Definition mac.h:581
@ TXQ_FLAG_TXERRINT_ENABLE
Definition mac.h:588
@ TXQ_FLAG_TXDESCINT_ENABLE
Definition mac.h:589
@ TXQ_FLAG_TXURNINT_ENABLE
Definition mac.h:591
@ TXQ_FLAG_TXOKINT_ENABLE
Definition mac.h:587
u32 tqi_physCompBuf
Definition mac.h:630

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];
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

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

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];
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))
327 else
330
331 if (qi->tqi_cbrPeriod) {
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
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}
pseudo_bit_t value[0x00020]
Definition arbel.h:2
#define IS_CHAN_B(_c)
Definition ath5k.h:660
#define AR_D_CHNTIME_DUR
Definition reg.h:563
#define AR_D_MISC_ARB_LOCKOUT_CNTRL
Definition reg.h:590
#define AR_D_LCL_IFS_CWMIN
Definition reg.h:524
#define AR_D_MISC_FRAG_BKOFF_EN
Definition reg.h:583
#define AR_Q_MISC_FSP_CBR
Definition reg.h:445
#define AR_QMISC(_i)
Definition reg.h:442
#define AR_DRETRY_LIMIT(_i)
Definition reg.h:543
#define AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL
Definition reg.h:594
#define AR_D_MISC_FRAG_WAIT_EN
Definition reg.h:582
#define AR_Q_DESC_CRCCHK
Definition reg.h:480
#define AR_DLCL_IFS(_i)
Definition reg.h:523
#define AR_QRDYTIMECFG(_i)
Definition reg.h:419
#define AR_D_MISC_CW_BKOFF_EN
Definition reg.h:584
#define AR_D_LCL_IFS_CWMAX
Definition reg.h:526
#define AR_Q_DESC_CRCCHK_EN
Definition reg.h:482
#define AR_D_CHNTIME_EN
Definition reg.h:565
#define AR_Q_MISC_RDYTIME_EXP_POLICY
Definition reg.h:455
#define AR_DMISC(_i)
Definition reg.h:578
#define AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN
Definition reg.h:454
#define AR_Q_CBRCFG_INTERVAL
Definition reg.h:404
#define AR_Q_RDYTIMECFG_DURATION
Definition reg.h:420
#define AR_D_RETRY_LIMIT_FR_SH
Definition reg.h:544
#define AR_D_LCL_IFS_AIFS
Definition reg.h:528
#define AR_DCHNTIME(_i)
Definition reg.h:562
#define AR_D_RETRY_LIMIT_STA_SH
Definition reg.h:546
#define AR_D_RETRY_LIMIT_STA_LG
Definition reg.h:548
#define AR_Q_CBRCFG_OVF_THRESH
Definition reg.h:406
#define AR_Q_MISC_DCU_EARLY_TERM_REQ
Definition reg.h:457
#define AR_D_MISC_POST_FR_BKOFF_DIS
Definition reg.h:597
#define AR_Q_RDYTIMECFG_EN
Definition reg.h:422
#define AR_QCBRCFG(_i)
Definition reg.h:403
#define AR_SREV_9340(_ah)
Definition reg.h:879
#define AR_SREV_9300_20_OR_LATER(_ah)
Definition reg.h:865
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define INIT_CWMIN_11B
Definition mac.h:73
#define ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS
Definition mac.h:599
@ TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE
Definition mac.h:594
@ TXQ_FLAG_BACKOFF_DISABLE
Definition mac.h:592
@ TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE
Definition mac.h:595
@ TXQ_FLAG_TXEOLINT_ENABLE
Definition mac.h:590
#define INIT_SSH_RETRY
Definition mac.h:77
#define INIT_CWMIN
Definition mac.h:72
#define INIT_SLG_RETRY
Definition mac.h:78
struct net80211_channel * chan
Definition hw.h:348

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

References __unused, 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, ar5416_desc::u, and u32.

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)) {
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_OBS_BUS_1
Definition reg.h:1559
#define AR_DIAG_RX_ABORT
Definition reg.h:1525
#define AR_OBS_BUS_1_RX_STATE
Definition reg.h:1574
#define AR_DIAG_RX_DIS
Definition reg.h:1511
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
static unsigned int unsigned int reg
Definition myson.h:162
struct option_descriptor set[0]
Definition nvo_cmd.c:112

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, set, and u32.

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
@ rxdp
Definition sis900.h:32

References ah, AR_RXDP, REG_WRITE, rxdp, and u32.

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}
void ath9k_ani_reset(struct ath_hw *ah, int is_scanning)
Definition ath9k_ani.c:468

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.

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",
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_MACMISC_MISC_OBS_BUS_1
Definition reg.h:148
#define AR_MACMISC
Definition reg.h:129
#define AR_MACMISC_DMA_OBS_LINE_8
Definition reg.h:141
#define AR_CR_RXD
Definition reg.h:27
#define AR_MACMISC_MISC_OBS_BUS_MSB_S
Definition reg.h:147
#define AR_CR
Definition reg.h:25
#define AR_CR_RXE
Definition reg.h:26
#define AR_MACMISC_DMA_OBS_S
Definition reg.h:132
#define AR_DMADBG_7
Definition reg.h:358
#define AH_RX_STOP_DMA_TIMEOUT
#define AH_TIME_QUANTUM
Definition hw.h:148

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, u32, 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_MAC_IRQ
Definition reg.h:916
#define AR_IER_ENABLE
Definition reg.h:56
#define AR_SREV_9100(ah)
Definition reg.h:811
#define AR_INTR_SPURIOUS
Definition reg.h:920
#define AR_INTR_ASYNC_CAUSE
Definition reg.h:976
#define AR_INTR_SYNC_CAUSE
Definition reg.h:923
@ AR_INTR_SYNC_DEFAULT
Definition reg.h:953

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, REG_READ, and u32.

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_INTR_ASYNC_ENABLE
Definition reg.h:978
#define AR_INTR_SYNC_ENABLE
Definition reg.h:927
#define AR_IER
Definition reg.h:55

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_IMR
Definition reg.h:259
#define AR_INTR_SYNC_MASK
Definition reg.h:971
#define AR_INTR_ASYNC_MASK
Definition reg.h:967
@ AR_INTR_SYNC_HOST1_FATAL
Definition reg.h:937
@ ATH9K_INT_GLOBAL
Definition hw.h:281

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, REG_WRITE, and u32.

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)
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) {
675 if (ah->config.rx_intr_mitigation) {
676 mask &= ~AR_IMR_RXOK_LP;
678 } else {
679 mask |= AR_IMR_RXOK_LP;
680 }
681 } else {
682 if (ah->config.rx_intr_mitigation)
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);
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_TXERR
Definition reg.h:270
#define AR_IMR_S2_TSFOOR
Definition reg.h:318
#define AR_IMR_RXERR
Definition reg.h:264
#define AR_IMR_BCNMISC
Definition reg.h:283
#define AR_IMR_RXOK_HP
Definition reg.h:262
#define AR_IMR_S5
Definition reg.h:247
#define AR_IMR_TXEOL
Definition reg.h:272
#define AR_IMR_TXMINTR
Definition reg.h:290
#define AR_IMR_S2_GTT
Definition reg.h:311
#define AR_IMR_S2_CST
Definition reg.h:310
#define AR_IMR_RXOK_LP
Definition reg.h:263
#define AR_IMR_S2_CABTO
Definition reg.h:316
#define AR_IMR_S5_TIM_TIMER
Definition reg.h:248
#define AR_IMR_S2_DTIM
Definition reg.h:317
#define AR_IMR_S2_TIM
Definition reg.h:312
#define AR_IMR_RXDESC
Definition reg.h:261
#define AR_IMR_TXDESC
Definition reg.h:269
#define AR_IMR_TXINTM
Definition reg.h:292
#define AR_IMR_TXOK
Definition reg.h:268
#define AR_IMR_S2_CABEND
Definition reg.h:313
#define AR_IMR_GENTMR
Definition reg.h:288
#define AR_IMR_RXINTM
Definition reg.h:293
#define AR_IMR_RXMINTR
Definition reg.h:291
#define AR_IMR_S2_DTIMSYNC
Definition reg.h:314
#define AR_IMR_RXOK
Definition reg.h:260
@ ATH9K_HW_CAP_AUTOSLEEP
Definition hw.h:185
ath9k_int
Definition hw.h:252
@ ATH9K_INT_CST
Definition hw.h:278
@ ATH9K_INT_GENTIMER
Definition hw.h:277
@ ATH9K_INT_RX
Definition hw.h:253
@ ATH9K_INT_GTT
Definition hw.h:279
@ ATH9K_INT_COMMON
Definition hw.h:287
@ ATH9K_INT_CABEND
Definition hw.h:275
@ ATH9K_INT_TX
Definition hw.h:260
@ ATH9K_INT_DTIM
Definition hw.h:272
@ ATH9K_INT_DTIMSYNC
Definition hw.h:273
@ ATH9K_INT_TIM
Definition hw.h:271
@ ATH9K_INT_BMISC
Definition hw.h:282
@ ATH9K_INT_TSFOOR
Definition hw.h:276
@ ATH9K_INT_TIM_TIMER
Definition hw.h:262

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, REG_WRITE, and u32.

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