diff options
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, | 
