]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/rt2x00/rt2x00usb.c
rt2x00: Support for large vendor requests
[linux-2.6] / drivers / net / wireless / rt2x00 / rt2x00usb.c
index 5593b9a83108476adf0635a9b81e82113585aa6c..933e6cc9359db871aafc87a0eec318c5326cbd6f 100644 (file)
@@ -122,6 +122,38 @@ int rt2x00usb_vendor_request_buff(struct rt2x00_dev *rt2x00dev,
 }
 EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff);
 
+int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev,
+                                       const u8 request, const u8 requesttype,
+                                       const u16 offset, void *buffer,
+                                       const u16 buffer_length,
+                                       const int timeout)
+{
+       int status = 0;
+       unsigned char *tb;
+       u16 off, len, bsize;
+
+       mutex_lock(&rt2x00dev->usb_cache_mutex);
+
+       tb  = buffer;
+       off = offset;
+       len = buffer_length;
+       while (len && !status) {
+               bsize = min_t(u16, CSR_CACHE_SIZE, len);
+               status = rt2x00usb_vendor_req_buff_lock(rt2x00dev, request,
+                                                       requesttype, off, tb,
+                                                       bsize, timeout);
+
+               tb  += bsize;
+               len -= bsize;
+               off += bsize;
+       }
+
+       mutex_unlock(&rt2x00dev->usb_cache_mutex);
+
+       return status;
+}
+EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_large_buff);
+
 /*
  * TX data handlers.
  */
@@ -284,6 +316,7 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
 {
        struct queue_entry_priv_usb *entry_priv;
        struct queue_entry_priv_usb_bcn *bcn_priv;
+       struct data_queue *queue;
        unsigned int i;
 
        rt2x00usb_vendor_request_sw(rt2x00dev, USB_RX_CONTROL, 0, 0,
@@ -292,9 +325,11 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
        /*
         * Cancel all queues.
         */
-       for (i = 0; i < rt2x00dev->rx->limit; i++) {
-               entry_priv = rt2x00dev->rx->entries[i].priv_data;
-               usb_kill_urb(entry_priv->urb);
+       queue_for_each(rt2x00dev, queue) {
+               for (i = 0; i < queue->limit; i++) {
+                       entry_priv = queue->entries[i].priv_data;
+                       usb_kill_urb(entry_priv->urb);
+               }
        }
 
        /*