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));
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;
}
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;
{
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);
/*
* 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);
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) ||
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.
* 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,
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;