diff options
author | Vasanthakumar Thiagarajan <vasanth@atheros.com> | 2010-04-15 17:38:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-16 15:43:22 -0400 |
commit | ad7b806065f5791696a1c9a4c2665f6421cbbf05 (patch) | |
tree | 89c106bfc49e6407e51a3c2dabfec0feff3090b7 /drivers/net/wireless/ath/ath9k/ar9003_mac.c | |
parent | ae3bb6d4628dae7ead588263177a0674221fea78 (diff) |
ath9k_hw: Add few routines for rx edma support
* Set rx buf size in register 0x60
* Set rxdp on the respective hw rx queue (HP and LP queues)
* Process rx descriptor
Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_mac.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index ee84e64b8b0c..20890060ee2c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | |||
@@ -26,3 +26,98 @@ void ar9003_hw_attach_mac_ops(struct ath_hw *hw) | |||
26 | 26 | ||
27 | ops->rx_enable = ar9003_hw_rx_enable; | 27 | ops->rx_enable = ar9003_hw_rx_enable; |
28 | } | 28 | } |
29 | |||
30 | void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size) | ||
31 | { | ||
32 | REG_WRITE(ah, AR_DATABUF_SIZE, buf_size & AR_DATABUF_SIZE_MASK); | ||
33 | } | ||
34 | EXPORT_SYMBOL(ath9k_hw_set_rx_bufsize); | ||
35 | |||
36 | void ath9k_hw_addrxbuf_edma(struct ath_hw *ah, u32 rxdp, | ||
37 | enum ath9k_rx_qtype qtype) | ||
38 | { | ||
39 | if (qtype == ATH9K_RX_QUEUE_HP) | ||
40 | REG_WRITE(ah, AR_HP_RXDP, rxdp); | ||
41 | else | ||
42 | REG_WRITE(ah, AR_LP_RXDP, rxdp); | ||
43 | } | ||
44 | EXPORT_SYMBOL(ath9k_hw_addrxbuf_edma); | ||
45 | |||
46 | int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, | ||
47 | void *buf_addr) | ||
48 | { | ||
49 | struct ar9003_rxs *rxsp = (struct ar9003_rxs *) buf_addr; | ||
50 | unsigned int phyerr; | ||
51 | |||
52 | /* TODO: byte swap on big endian for ar9300_10 */ | ||
53 | |||
54 | if ((rxsp->status11 & AR_RxDone) == 0) | ||
55 | return -EINPROGRESS; | ||
56 | |||
57 | if (MS(rxsp->ds_info, AR_DescId) != 0x168c) | ||
58 | return -EINVAL; | ||
59 | |||
60 | if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0) | ||
61 | return -EINPROGRESS; | ||
62 | |||
63 | rxs->rs_status = 0; | ||
64 | rxs->rs_flags = 0; | ||
65 | |||
66 | rxs->rs_datalen = rxsp->status2 & AR_DataLen; | ||
67 | rxs->rs_tstamp = rxsp->status3; | ||
68 | |||
69 | /* XXX: Keycache */ | ||
70 | rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); | ||
71 | rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00); | ||
72 | rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01); | ||
73 | rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02); | ||
74 | rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10); | ||
75 | rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11); | ||
76 | rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12); | ||
77 | |||
78 | if (rxsp->status11 & AR_RxKeyIdxValid) | ||
79 | rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx); | ||
80 | else | ||
81 | rxs->rs_keyix = ATH9K_RXKEYIX_INVALID; | ||
82 | |||
83 | rxs->rs_rate = MS(rxsp->status1, AR_RxRate); | ||
84 | rxs->rs_more = (rxsp->status2 & AR_RxMore) ? 1 : 0; | ||
85 | |||
86 | rxs->rs_isaggr = (rxsp->status11 & AR_RxAggr) ? 1 : 0; | ||
87 | rxs->rs_moreaggr = (rxsp->status11 & AR_RxMoreAggr) ? 1 : 0; | ||
88 | rxs->rs_antenna = (MS(rxsp->status4, AR_RxAntenna) & 0x7); | ||
89 | rxs->rs_flags = (rxsp->status4 & AR_GI) ? ATH9K_RX_GI : 0; | ||
90 | rxs->rs_flags |= (rxsp->status4 & AR_2040) ? ATH9K_RX_2040 : 0; | ||
91 | |||
92 | rxs->evm0 = rxsp->status6; | ||
93 | rxs->evm1 = rxsp->status7; | ||
94 | rxs->evm2 = rxsp->status8; | ||
95 | rxs->evm3 = rxsp->status9; | ||
96 | rxs->evm4 = (rxsp->status10 & 0xffff); | ||
97 | |||
98 | if (rxsp->status11 & AR_PreDelimCRCErr) | ||
99 | rxs->rs_flags |= ATH9K_RX_DELIM_CRC_PRE; | ||
100 | |||
101 | if (rxsp->status11 & AR_PostDelimCRCErr) | ||
102 | rxs->rs_flags |= ATH9K_RX_DELIM_CRC_POST; | ||
103 | |||
104 | if (rxsp->status11 & AR_DecryptBusyErr) | ||
105 | rxs->rs_flags |= ATH9K_RX_DECRYPT_BUSY; | ||
106 | |||
107 | if ((rxsp->status11 & AR_RxFrameOK) == 0) { | ||
108 | if (rxsp->status11 & AR_CRCErr) { | ||
109 | rxs->rs_status |= ATH9K_RXERR_CRC; | ||
110 | } else if (rxsp->status11 & AR_PHYErr) { | ||
111 | rxs->rs_status |= ATH9K_RXERR_PHY; | ||
112 | phyerr = MS(rxsp->status11, AR_PHYErrCode); | ||
113 | rxs->rs_phyerr = phyerr; | ||
114 | } else if (rxsp->status11 & AR_DecryptCRCErr) { | ||
115 | rxs->rs_status |= ATH9K_RXERR_DECRYPT; | ||
116 | } else if (rxsp->status11 & AR_MichaelErr) { | ||
117 | rxs->rs_status |= ATH9K_RXERR_MIC; | ||
118 | } | ||
119 | } | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | EXPORT_SYMBOL(ath9k_hw_process_rxdesc_edma); | ||