diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-05-11 14:24:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-05-11 14:24:55 -0400 |
commit | cc755896a4274f11283bca32d1d658203844057a (patch) | |
tree | 218970ece71df99f686b9416b7fd88b921690ebb /drivers/net/wireless/rt2x00/rt2500usb.c | |
parent | d250fe91ae129bff0968e685cc9c466d3a5e3482 (diff) | |
parent | 9459d59fbf0bc82ff4c804679fa8bc22788eca63 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts:
drivers/net/wireless/ath/ar9170/main.c
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 66 |
1 files changed, 27 insertions, 39 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 41d9996c80e6..e88d7033fbc9 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1083,7 +1083,8 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1083 | */ | 1083 | */ |
1084 | static void rt2500usb_beacondone(struct urb *urb); | 1084 | static void rt2500usb_beacondone(struct urb *urb); |
1085 | 1085 | ||
1086 | static void rt2500usb_write_beacon(struct queue_entry *entry) | 1086 | static void rt2500usb_write_beacon(struct queue_entry *entry, |
1087 | struct txentry_desc *txdesc) | ||
1087 | { | 1088 | { |
1088 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 1089 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
1089 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); | 1090 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); |
@@ -1091,7 +1092,7 @@ static void rt2500usb_write_beacon(struct queue_entry *entry) | |||
1091 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | 1092 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); |
1092 | int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint); | 1093 | int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint); |
1093 | int length; | 1094 | int length; |
1094 | u16 reg; | 1095 | u16 reg, reg0; |
1095 | 1096 | ||
1096 | /* | 1097 | /* |
1097 | * Add the descriptor in front of the skb. | 1098 | * Add the descriptor in front of the skb. |
@@ -1133,6 +1134,26 @@ static void rt2500usb_write_beacon(struct queue_entry *entry) | |||
1133 | * Send out the guardian byte. | 1134 | * Send out the guardian byte. |
1134 | */ | 1135 | */ |
1135 | usb_submit_urb(bcn_priv->guardian_urb, GFP_ATOMIC); | 1136 | usb_submit_urb(bcn_priv->guardian_urb, GFP_ATOMIC); |
1137 | |||
1138 | /* | ||
1139 | * Enable beaconing again. | ||
1140 | */ | ||
1141 | rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1); | ||
1142 | rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1); | ||
1143 | reg0 = reg; | ||
1144 | rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 1); | ||
1145 | /* | ||
1146 | * Beacon generation will fail initially. | ||
1147 | * To prevent this we need to change the TXRX_CSR19 | ||
1148 | * register several times (reg0 is the same as reg | ||
1149 | * except for TXRX_CSR19_BEACON_GEN, which is 0 in reg0 | ||
1150 | * and 1 in reg). | ||
1151 | */ | ||
1152 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1153 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0); | ||
1154 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1155 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0); | ||
1156 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1136 | } | 1157 | } |
1137 | 1158 | ||
1138 | static int rt2500usb_get_tx_data_len(struct queue_entry *entry) | 1159 | static int rt2500usb_get_tx_data_len(struct queue_entry *entry) |
@@ -1149,37 +1170,6 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry) | |||
1149 | return length; | 1170 | return length; |
1150 | } | 1171 | } |
1151 | 1172 | ||
1152 | static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | ||
1153 | const enum data_queue_qid queue) | ||
1154 | { | ||
1155 | u16 reg, reg0; | ||
1156 | |||
1157 | if (queue != QID_BEACON) { | ||
1158 | rt2x00usb_kick_tx_queue(rt2x00dev, queue); | ||
1159 | return; | ||
1160 | } | ||
1161 | |||
1162 | rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®); | ||
1163 | if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) { | ||
1164 | rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1); | ||
1165 | rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1); | ||
1166 | reg0 = reg; | ||
1167 | rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 1); | ||
1168 | /* | ||
1169 | * Beacon generation will fail initially. | ||
1170 | * To prevent this we need to change the TXRX_CSR19 | ||
1171 | * register several times (reg0 is the same as reg | ||
1172 | * except for TXRX_CSR19_BEACON_GEN, which is 0 in reg0 | ||
1173 | * and 1 in reg). | ||
1174 | */ | ||
1175 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1176 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0); | ||
1177 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1178 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0); | ||
1179 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
1180 | } | ||
1181 | } | ||
1182 | |||
1183 | /* | 1173 | /* |
1184 | * RX control handlers | 1174 | * RX control handlers |
1185 | */ | 1175 | */ |
@@ -1214,11 +1204,9 @@ static void rt2500usb_fill_rxdone(struct queue_entry *entry, | |||
1214 | if (rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR)) | 1204 | if (rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR)) |
1215 | rxdesc->flags |= RX_FLAG_FAILED_PLCP_CRC; | 1205 | rxdesc->flags |= RX_FLAG_FAILED_PLCP_CRC; |
1216 | 1206 | ||
1217 | if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) { | 1207 | rxdesc->cipher = rt2x00_get_field32(word0, RXD_W0_CIPHER); |
1218 | rxdesc->cipher = rt2x00_get_field32(word0, RXD_W0_CIPHER); | 1208 | if (rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR)) |
1219 | if (rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR)) | 1209 | rxdesc->cipher_status = RX_CRYPTO_FAIL_KEY; |
1220 | rxdesc->cipher_status = RX_CRYPTO_FAIL_KEY; | ||
1221 | } | ||
1222 | 1210 | ||
1223 | if (rxdesc->cipher != CIPHER_NONE) { | 1211 | if (rxdesc->cipher != CIPHER_NONE) { |
1224 | _rt2x00_desc_read(rxd, 2, &rxdesc->iv[0]); | 1212 | _rt2x00_desc_read(rxd, 2, &rxdesc->iv[0]); |
@@ -1780,7 +1768,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | |||
1780 | .write_tx_data = rt2x00usb_write_tx_data, | 1768 | .write_tx_data = rt2x00usb_write_tx_data, |
1781 | .write_beacon = rt2500usb_write_beacon, | 1769 | .write_beacon = rt2500usb_write_beacon, |
1782 | .get_tx_data_len = rt2500usb_get_tx_data_len, | 1770 | .get_tx_data_len = rt2500usb_get_tx_data_len, |
1783 | .kick_tx_queue = rt2500usb_kick_tx_queue, | 1771 | .kick_tx_queue = rt2x00usb_kick_tx_queue, |
1784 | .kill_tx_queue = rt2x00usb_kill_tx_queue, | 1772 | .kill_tx_queue = rt2x00usb_kill_tx_queue, |
1785 | .fill_rxdone = rt2500usb_fill_rxdone, | 1773 | .fill_rxdone = rt2500usb_fill_rxdone, |
1786 | .config_shared_key = rt2500usb_config_key, | 1774 | .config_shared_key = rt2500usb_config_key, |