aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/ar9003_mac.c
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vasanth@atheros.com>2010-04-15 17:38:28 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-16 15:43:22 -0400
commitad7b806065f5791696a1c9a4c2665f6421cbbf05 (patch)
tree89c106bfc49e6407e51a3c2dabfec0feff3090b7 /drivers/net/wireless/ath/ath9k/ar9003_mac.c
parentae3bb6d4628dae7ead588263177a0674221fea78 (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.c95
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
30void 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}
34EXPORT_SYMBOL(ath9k_hw_set_rx_bufsize);
35
36void 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}
44EXPORT_SYMBOL(ath9k_hw_addrxbuf_edma);
45
46int 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}
123EXPORT_SYMBOL(ath9k_hw_process_rxdesc_edma);