diff options
author | Bruno Randolf <br1@einfach.org> | 2010-06-16 06:12:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-06-16 14:59:06 -0400 |
commit | 1884a3678c97c953dcfc2ee17bd43e354514d657 (patch) | |
tree | 4e3480c12bbbca1da39ee39bfa42d7375d6a0968 /drivers | |
parent | 2237e928840c9a1d8bc5143daf28c419d9ca0bda (diff) |
ath5k: take descriptor differences between 5210 and 5211 into account
There are some differences between 5210 and 5211 descriptors which we did not
take into account before.
Signed-off-by: Bruno Randolf <br1@einfach.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/desc.c | 29 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/desc.h | 6 |
2 files changed, 25 insertions, 10 deletions
diff --git a/drivers/net/wireless/ath/ath5k/desc.c b/drivers/net/wireless/ath/ath5k/desc.c index f1f1a22ce475..019525d6c0eb 100644 --- a/drivers/net/wireless/ath/ath5k/desc.c +++ b/drivers/net/wireless/ath/ath5k/desc.c | |||
@@ -91,8 +91,7 @@ ath5k_hw_setup_2word_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc, | |||
91 | tx_ctl->tx_control_1 = pkt_len & AR5K_2W_TX_DESC_CTL1_BUF_LEN; | 91 | tx_ctl->tx_control_1 = pkt_len & AR5K_2W_TX_DESC_CTL1_BUF_LEN; |
92 | 92 | ||
93 | /* | 93 | /* |
94 | * Verify and set header length | 94 | * Verify and set header length (only 5210) |
95 | * XXX: I only found that on 5210 code, does it work on 5211 ? | ||
96 | */ | 95 | */ |
97 | if (ah->ah_version == AR5K_AR5210) { | 96 | if (ah->ah_version == AR5K_AR5210) { |
98 | if (hdr_len & ~AR5K_2W_TX_DESC_CTL0_HEADER_LEN_5210) | 97 | if (hdr_len & ~AR5K_2W_TX_DESC_CTL0_HEADER_LEN_5210) |
@@ -125,19 +124,28 @@ ath5k_hw_setup_2word_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc, | |||
125 | tx_ctl->tx_control_1 |= | 124 | tx_ctl->tx_control_1 |= |
126 | AR5K_REG_SM(type, AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211); | 125 | AR5K_REG_SM(type, AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211); |
127 | } | 126 | } |
127 | |||
128 | #define _TX_FLAGS(_c, _flag) \ | 128 | #define _TX_FLAGS(_c, _flag) \ |
129 | if (flags & AR5K_TXDESC_##_flag) { \ | 129 | if (flags & AR5K_TXDESC_##_flag) { \ |
130 | tx_ctl->tx_control_##_c |= \ | 130 | tx_ctl->tx_control_##_c |= \ |
131 | AR5K_2W_TX_DESC_CTL##_c##_##_flag; \ | 131 | AR5K_2W_TX_DESC_CTL##_c##_##_flag; \ |
132 | } | 132 | } |
133 | 133 | #define _TX_FLAGS_5211(_c, _flag) \ | |
134 | if (flags & AR5K_TXDESC_##_flag) { \ | ||
135 | tx_ctl->tx_control_##_c |= \ | ||
136 | AR5K_2W_TX_DESC_CTL##_c##_##_flag##_5211; \ | ||
137 | } | ||
134 | _TX_FLAGS(0, CLRDMASK); | 138 | _TX_FLAGS(0, CLRDMASK); |
135 | _TX_FLAGS(0, VEOL); | ||
136 | _TX_FLAGS(0, INTREQ); | 139 | _TX_FLAGS(0, INTREQ); |
137 | _TX_FLAGS(0, RTSENA); | 140 | _TX_FLAGS(0, RTSENA); |
138 | _TX_FLAGS(1, NOACK); | 141 | |
142 | if (ah->ah_version == AR5K_AR5211) { | ||
143 | _TX_FLAGS_5211(0, VEOL); | ||
144 | _TX_FLAGS_5211(1, NOACK); | ||
145 | } | ||
139 | 146 | ||
140 | #undef _TX_FLAGS | 147 | #undef _TX_FLAGS |
148 | #undef _TX_FLAGS_5211 | ||
141 | 149 | ||
142 | /* | 150 | /* |
143 | * WEP crap | 151 | * WEP crap |
@@ -526,13 +534,20 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah, | |||
526 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL); | 534 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL); |
527 | rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0, | 535 | rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0, |
528 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE); | 536 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE); |
529 | rs->rs_antenna = AR5K_REG_MS(rx_status->rx_status_0, | ||
530 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANT_5211); | ||
531 | rs->rs_more = !!(rx_status->rx_status_0 & | 537 | rs->rs_more = !!(rx_status->rx_status_0 & |
532 | AR5K_5210_RX_DESC_STATUS0_MORE); | 538 | AR5K_5210_RX_DESC_STATUS0_MORE); |
533 | /* TODO: this timestamp is 13 bit, later on we assume 15 bit */ | 539 | /* TODO: this timestamp is 13 bit, later on we assume 15 bit */ |
534 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, | 540 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, |
535 | AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); | 541 | AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); |
542 | |||
543 | if (ah->ah_version == AR5K_AR5211) | ||
544 | rs->rs_antenna = AR5K_REG_MS(rx_status->rx_status_0, | ||
545 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANT_5211); | ||
546 | else | ||
547 | rs->rs_antenna = (rx_status->rx_status_0 & | ||
548 | AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANT_5210) | ||
549 | ? 2 : 1; | ||
550 | |||
536 | rs->rs_status = 0; | 551 | rs->rs_status = 0; |
537 | rs->rs_phyerr = 0; | 552 | rs->rs_phyerr = 0; |
538 | 553 | ||
diff --git a/drivers/net/wireless/ath/ath5k/desc.h b/drivers/net/wireless/ath/ath5k/desc.h index 1aca4af2f79f..b2adb2a281c2 100644 --- a/drivers/net/wireless/ath/ath5k/desc.h +++ b/drivers/net/wireless/ath/ath5k/desc.h | |||
@@ -45,7 +45,7 @@ struct ath5k_hw_rx_status { | |||
45 | /* RX status word 0 fields/flags */ | 45 | /* RX status word 0 fields/flags */ |
46 | #define AR5K_5210_RX_DESC_STATUS0_DATA_LEN 0x00000fff /* RX data length */ | 46 | #define AR5K_5210_RX_DESC_STATUS0_DATA_LEN 0x00000fff /* RX data length */ |
47 | #define AR5K_5210_RX_DESC_STATUS0_MORE 0x00001000 /* more desc for this frame */ | 47 | #define AR5K_5210_RX_DESC_STATUS0_MORE 0x00001000 /* more desc for this frame */ |
48 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANT_5210 0x00004000 /* [5210] receive on ant 1 TODO */ | 48 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANT_5210 0x00004000 /* [5210] receive on ant 1 */ |
49 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE 0x00078000 /* reception rate */ | 49 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE 0x00078000 /* reception rate */ |
50 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE_S 15 | 50 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE_S 15 |
51 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL 0x07f80000 /* rssi */ | 51 | #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL 0x07f80000 /* rssi */ |
@@ -139,7 +139,7 @@ struct ath5k_hw_2w_tx_ctl { | |||
139 | #define AR5K_2W_TX_DESC_CTL0_XMIT_RATE_S 18 | 139 | #define AR5K_2W_TX_DESC_CTL0_XMIT_RATE_S 18 |
140 | #define AR5K_2W_TX_DESC_CTL0_RTSENA 0x00400000 /* RTS/CTS enable */ | 140 | #define AR5K_2W_TX_DESC_CTL0_RTSENA 0x00400000 /* RTS/CTS enable */ |
141 | #define AR5K_2W_TX_DESC_CTL0_LONG_PACKET_5210 0x00800000 /* [5210] long packet */ | 141 | #define AR5K_2W_TX_DESC_CTL0_LONG_PACKET_5210 0x00800000 /* [5210] long packet */ |
142 | #define AR5K_2W_TX_DESC_CTL0_VEOL 0x00800000 /* [5211] virtual end-of-list TODO */ | 142 | #define AR5K_2W_TX_DESC_CTL0_VEOL_5211 0x00800000 /* [5211] virtual end-of-list */ |
143 | #define AR5K_2W_TX_DESC_CTL0_CLRDMASK 0x01000000 /* clear destination mask */ | 143 | #define AR5K_2W_TX_DESC_CTL0_CLRDMASK 0x01000000 /* clear destination mask */ |
144 | #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5210 0x02000000 /* [5210] antenna selection */ | 144 | #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5210 0x02000000 /* [5210] antenna selection */ |
145 | #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5211 0x1e000000 /* [5211] antenna selection */ | 145 | #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5211 0x1e000000 /* [5211] antenna selection */ |
@@ -165,7 +165,7 @@ struct ath5k_hw_2w_tx_ctl { | |||
165 | #define AR5K_2W_TX_DESC_CTL1_ENC_KEY_IDX_S 13 | 165 | #define AR5K_2W_TX_DESC_CTL1_ENC_KEY_IDX_S 13 |
166 | #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211 0x00700000 /* [5211] frame type */ | 166 | #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211 0x00700000 /* [5211] frame type */ |
167 | #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211_S 20 | 167 | #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_5211_S 20 |
168 | #define AR5K_2W_TX_DESC_CTL1_NOACK 0x00800000 /* [5211] no ACK TODO */ | 168 | #define AR5K_2W_TX_DESC_CTL1_NOACK_5211 0x00800000 /* [5211] no ACK */ |
169 | #define AR5K_2W_TX_DESC_CTL1_RTS_DURATION_5210 0xfff80000 /* [5210] lower 13 bit of duration */ | 169 | #define AR5K_2W_TX_DESC_CTL1_RTS_DURATION_5210 0xfff80000 /* [5210] lower 13 bit of duration */ |
170 | 170 | ||
171 | /* Frame types */ | 171 | /* Frame types */ |