rt2x00: Request usb_maxpacket() once
[deliverable/linux.git] / drivers / net / wireless / rt2x00 / rt2x00usb.c
index a0f05ca54bb4abe572917ecb0bb3a7b39cc6ee68..1f5675dd329f78963fbd94a77976ab57687570f2 100644 (file)
@@ -42,7 +42,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
                             const u8 request, const u8 requesttype,
                             const u16 offset, const u16 value,
                             void *buffer, const u16 buffer_length,
-                            u16 timeout)
+                            const int timeout)
 {
        struct usb_device *usb_dev =
            interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
@@ -60,12 +60,10 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
                        return 0;
 
                /*
-                * Check for errors,
-                * -ETIMEDOUT: We need a bit more time to complete.
+                * Check for errors
                 * -ENODEV: Device has disappeared, no point continuing.
+                * All other errors: Try again.
                 */
-               if (status == -ETIMEDOUT)
-                       timeout *= 2;
                else if (status == -ENODEV)
                        break;
        }
@@ -81,7 +79,7 @@ EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request);
 int rt2x00usb_vendor_request_buff(const struct rt2x00_dev *rt2x00dev,
                                  const u8 request, const u8 requesttype,
                                  const u16 offset, void *buffer,
-                                 const u16 buffer_length, u16 timeout)
+                                 const u16 buffer_length, const int timeout)
 {
        int status;
 
@@ -159,9 +157,9 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
 {
        struct usb_device *usb_dev =
            interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
-       struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data;
        struct data_entry *entry = rt2x00_get_data_entry(ring);
-       u32 length = skb->len;
+       int pipe = usb_sndbulkpipe(usb_dev, 1);
+       u32 length;
 
        if (rt2x00_ring_full(ring)) {
                ieee80211_stop_queue(rt2x00dev->hw, control->queue);
@@ -180,25 +178,28 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
        /*
         * Add the descriptor in front of the skb.
         */
-       skb_push(skb, rt2x00dev->hw->extra_tx_headroom);
-       memset(skb->data, 0x00, rt2x00dev->hw->extra_tx_headroom);
+       skb_push(skb, ring->desc_size);
+       memset(skb->data, 0, ring->desc_size);
 
        rt2x00lib_write_tx_desc(rt2x00dev, (struct data_desc *)skb->data,
-                               ieee80211hdr, length, control);
+                               (struct ieee80211_hdr *)(skb->data +
+                                                        ring->desc_size),
+                               skb->len - ring->desc_size, control);
        memcpy(&entry->tx_status.control, control, sizeof(*control));
        entry->skb = skb;
 
        /*
-        * Length passed to usb_fill_urb cannot be an odd number,
-        * so add 1 byte to make it even.
+        * USB devices cannot blindly pass the skb->len as the
+        * length of the data to usb_fill_bulk_urb. Pass the skb
+        * to the driver to determine what the length should be.
         */
-       length += rt2x00dev->hw->extra_tx_headroom;
-       if (length % 2)
-               length++;
+       length = rt2x00dev->ops->lib->get_tx_data_len(rt2x00dev, skb);
 
+       /*
+        * Initialize URB and send the frame to the device.
+        */
        __set_bit(ENTRY_OWNER_NIC, &entry->flags);
-       usb_fill_bulk_urb(entry->priv, usb_dev,
-                         usb_sndbulkpipe(usb_dev, 1),
+       usb_fill_bulk_urb(entry->priv, usb_dev, pipe,
                          skb->data, length, rt2x00usb_interrupt_txdone, entry);
        usb_submit_urb(entry->priv, GFP_ATOMIC);
 
@@ -220,11 +221,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
        struct data_ring *ring = entry->ring;
        struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
        struct sk_buff *skb;
-       int retval;
-       int signal;
-       int rssi;
-       int ofdm;
-       int size;
+       struct rxdata_entry_desc desc;
        int frame_size;
 
        if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
@@ -239,10 +236,8 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
        if (urb->actual_length < entry->ring->desc_size || urb->status)
                goto skip_entry;
 
-       retval = rt2x00dev->ops->lib->fill_rxdone(entry, &signal, &rssi,
-                                                 &ofdm, &size);
-       if (retval)
-               goto skip_entry;
+       memset(&desc, 0x00, sizeof(desc));
+       rt2x00dev->ops->lib->fill_rxdone(entry, &desc);
 
        /*
         * Allocate a new sk buffer to replace the current one.
@@ -261,12 +256,12 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
         * Trim the skb_buffer to only contain the valid
         * frame data (so ignore the device's descriptor).
         */
-       skb_trim(entry->skb, size);
+       skb_trim(entry->skb, desc.size);
 
        /*
         * Send the frame to rt2x00lib for further processing.
         */
-       rt2x00lib_rxdone(entry, entry->skb, signal, rssi, ofdm);
+       rt2x00lib_rxdone(entry, entry->skb, &desc);
 
        /*
         * Replace current entry's skb with the newly allocated one,
@@ -493,6 +488,11 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
        rt2x00dev->ops = ops;
        rt2x00dev->hw = hw;
 
+       rt2x00dev->usb_maxpacket =
+           usb_maxpacket(usb_dev, usb_sndbulkpipe(usb_dev, 1), 1);
+       if (!rt2x00dev->usb_maxpacket)
+               rt2x00dev->usb_maxpacket = 1;
+
        retval = rt2x00usb_alloc_reg(rt2x00dev);
        if (retval)
                goto exit_free_device;
This page took 0.034083 seconds and 5 git commands to generate.