diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-05-17 13:57:43 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-05-17 13:57:43 -0400 |
commit | 6fe70aae0d128339febfabc073ba4c4a03de4f45 (patch) | |
tree | 711dff90df5ca4e07b5bddf11b2819e5cf2b7a93 /drivers/net/wireless/rt2x00/rt2500usb.c | |
parent | 278554bd6579206921f5d8a523649a7a57f8850d (diff) | |
parent | 0c348d7c1422d59a86d6fb37b53d75788043e50b (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index e88d7033fbc..9ae96a626e6 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1034,12 +1034,30 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1034 | struct txentry_desc *txdesc) | 1034 | struct txentry_desc *txdesc) |
1035 | { | 1035 | { |
1036 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 1036 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
1037 | __le32 *txd = skbdesc->desc; | 1037 | __le32 *txd = (__le32 *)(skb->data - TXD_DESC_SIZE); |
1038 | u32 word; | 1038 | u32 word; |
1039 | 1039 | ||
1040 | /* | 1040 | /* |
1041 | * Start writing the descriptor words. | 1041 | * Start writing the descriptor words. |
1042 | */ | 1042 | */ |
1043 | rt2x00_desc_read(txd, 0, &word); | ||
1044 | rt2x00_set_field32(&word, TXD_W0_RETRY_LIMIT, txdesc->retry_limit); | ||
1045 | rt2x00_set_field32(&word, TXD_W0_MORE_FRAG, | ||
1046 | test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags)); | ||
1047 | rt2x00_set_field32(&word, TXD_W0_ACK, | ||
1048 | test_bit(ENTRY_TXD_ACK, &txdesc->flags)); | ||
1049 | rt2x00_set_field32(&word, TXD_W0_TIMESTAMP, | ||
1050 | test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags)); | ||
1051 | rt2x00_set_field32(&word, TXD_W0_OFDM, | ||
1052 | (txdesc->rate_mode == RATE_MODE_OFDM)); | ||
1053 | rt2x00_set_field32(&word, TXD_W0_NEW_SEQ, | ||
1054 | test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)); | ||
1055 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); | ||
1056 | rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); | ||
1057 | rt2x00_set_field32(&word, TXD_W0_CIPHER, !!txdesc->cipher); | ||
1058 | rt2x00_set_field32(&word, TXD_W0_KEY_ID, txdesc->key_idx); | ||
1059 | rt2x00_desc_write(txd, 0, word); | ||
1060 | |||
1043 | rt2x00_desc_read(txd, 1, &word); | 1061 | rt2x00_desc_read(txd, 1, &word); |
1044 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); | 1062 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); |
1045 | rt2x00_set_field32(&word, TXD_W1_AIFS, txdesc->aifs); | 1063 | rt2x00_set_field32(&word, TXD_W1_AIFS, txdesc->aifs); |
@@ -1059,23 +1077,11 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1059 | _rt2x00_desc_write(txd, 4, skbdesc->iv[1]); | 1077 | _rt2x00_desc_write(txd, 4, skbdesc->iv[1]); |
1060 | } | 1078 | } |
1061 | 1079 | ||
1062 | rt2x00_desc_read(txd, 0, &word); | 1080 | /* |
1063 | rt2x00_set_field32(&word, TXD_W0_RETRY_LIMIT, txdesc->retry_limit); | 1081 | * Register descriptor details in skb frame descriptor. |
1064 | rt2x00_set_field32(&word, TXD_W0_MORE_FRAG, | 1082 | */ |
1065 | test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags)); | 1083 | skbdesc->desc = txd; |
1066 | rt2x00_set_field32(&word, TXD_W0_ACK, | 1084 | skbdesc->desc_len = TXD_DESC_SIZE; |
1067 | test_bit(ENTRY_TXD_ACK, &txdesc->flags)); | ||
1068 | rt2x00_set_field32(&word, TXD_W0_TIMESTAMP, | ||
1069 | test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags)); | ||
1070 | rt2x00_set_field32(&word, TXD_W0_OFDM, | ||
1071 | (txdesc->rate_mode == RATE_MODE_OFDM)); | ||
1072 | rt2x00_set_field32(&word, TXD_W0_NEW_SEQ, | ||
1073 | test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)); | ||
1074 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); | ||
1075 | rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); | ||
1076 | rt2x00_set_field32(&word, TXD_W0_CIPHER, !!txdesc->cipher); | ||
1077 | rt2x00_set_field32(&word, TXD_W0_KEY_ID, txdesc->key_idx); | ||
1078 | rt2x00_desc_write(txd, 0, word); | ||
1079 | } | 1085 | } |
1080 | 1086 | ||
1081 | /* | 1087 | /* |
@@ -1089,19 +1095,11 @@ static void rt2500usb_write_beacon(struct queue_entry *entry, | |||
1089 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 1095 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
1090 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); | 1096 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); |
1091 | struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data; | 1097 | struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data; |
1092 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
1093 | int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint); | 1098 | int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint); |
1094 | int length; | 1099 | int length; |
1095 | u16 reg, reg0; | 1100 | u16 reg, reg0; |
1096 | 1101 | ||
1097 | /* | 1102 | /* |
1098 | * Add the descriptor in front of the skb. | ||
1099 | */ | ||
1100 | skb_push(entry->skb, entry->queue->desc_size); | ||
1101 | memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len); | ||
1102 | skbdesc->desc = entry->skb->data; | ||
1103 | |||
1104 | /* | ||
1105 | * Disable beaconing while we are reloading the beacon data, | 1103 | * Disable beaconing while we are reloading the beacon data, |
1106 | * otherwise we might be sending out invalid data. | 1104 | * otherwise we might be sending out invalid data. |
1107 | */ | 1105 | */ |
@@ -1110,6 +1108,11 @@ static void rt2500usb_write_beacon(struct queue_entry *entry, | |||
1110 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | 1108 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); |
1111 | 1109 | ||
1112 | /* | 1110 | /* |
1111 | * Take the descriptor in front of the skb into account. | ||
1112 | */ | ||
1113 | skb_push(entry->skb, TXD_DESC_SIZE); | ||
1114 | |||
1115 | /* | ||
1113 | * USB devices cannot blindly pass the skb->len as the | 1116 | * USB devices cannot blindly pass the skb->len as the |
1114 | * length of the data to usb_fill_bulk_urb. Pass the skb | 1117 | * length of the data to usb_fill_bulk_urb. Pass the skb |
1115 | * to the driver to determine what the length should be. | 1118 | * to the driver to determine what the length should be. |