]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/rt2x00/rt2500usb.c
rt2x00: Add skb descriptor
[linux-2.6] / drivers / net / wireless / rt2x00 / rt2500usb.c
index 15ab4b20d067e7bc3f67358f508c0faeb5a7a913..2a38388a79e146433535af533b3c65b844d4d6d9 100644 (file)
@@ -1686,8 +1686,8 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,
        struct rt2x00_dev *rt2x00dev = hw->priv;
        struct usb_device *usb_dev =
            interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
-       struct data_ring *ring =
-           rt2x00lib_get_ring(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
+       struct skb_desc *desc;
+       struct data_ring *ring;
        struct data_entry *beacon;
        struct data_entry *guardian;
        int pipe = usb_sndbulkpipe(usb_dev, 1);
@@ -1699,6 +1699,7 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,
         * initialization.
         */
        control->queue = IEEE80211_TX_QUEUE_BEACON;
+       ring = rt2x00lib_get_ring(rt2x00dev, control->queue);
 
        /*
         * Obtain 2 entries, one for the guardian byte,
@@ -1709,23 +1710,34 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,
        beacon = rt2x00_get_data_entry(ring);
 
        /*
-        * First we create the beacon.
+        * Add the descriptor in front of the skb.
         */
        skb_push(skb, ring->desc_size);
        memset(skb->data, 0, ring->desc_size);
 
-       rt2x00lib_write_tx_desc(rt2x00dev, (__le32 *)skb->data,
-                               (struct ieee80211_hdr *)(skb->data +
-                                                        ring->desc_size),
-                               skb->len - ring->desc_size, control);
+       /*
+        * Fill in skb descriptor
+        */
+       desc = get_skb_desc(skb);
+       desc->desc_len = ring->desc_size;
+       desc->data_len = skb->len - ring->desc_size;
+       desc->desc = skb->data;
+       desc->data = skb->data + ring->desc_size;
+       desc->ring = ring;
+       desc->entry = beacon;
+
+       rt2x00lib_write_tx_desc(rt2x00dev, skb, control);
 
+       /*
+        * 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 = rt2500usb_get_tx_data_len(rt2x00dev, skb);
 
        usb_fill_bulk_urb(beacon->priv, usb_dev, pipe,
                          skb->data, length, rt2500usb_beacondone, beacon);
 
-       beacon->skb = skb;
-
        /*
         * Second we need to create the guardian byte.
         * We only need a single byte, so lets recycle