Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[linux-2.6.git] / drivers / net / wireless / rt2x00 / rt2x00usb.c
index cb208d5..39e1052 100644 (file)
@@ -170,19 +170,22 @@ struct rt2x00_async_read_data {
        __le32 reg;
        struct usb_ctrlrequest cr;
        struct rt2x00_dev *rt2x00dev;
-       void (*callback)(struct rt2x00_dev *,int,u32);
+       bool (*callback)(struct rt2x00_dev *, int, u32);
 };
 
 static void rt2x00usb_register_read_async_cb(struct urb *urb)
 {
        struct rt2x00_async_read_data *rd = urb->context;
-       rd->callback(rd->rt2x00dev, urb->status, le32_to_cpu(rd->reg));
-       kfree(urb->context);
+       if (rd->callback(rd->rt2x00dev, urb->status, le32_to_cpu(rd->reg))) {
+               if (usb_submit_urb(urb, GFP_ATOMIC) < 0)
+                       kfree(rd);
+       } else
+               kfree(rd);
 }
 
 void rt2x00usb_register_read_async(struct rt2x00_dev *rt2x00dev,
                                   const unsigned int offset,
-                                  void (*callback)(struct rt2x00_dev*,int,u32))
+                                  bool (*callback)(struct rt2x00_dev*, int, u32))
 {
        struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
        struct urb *urb;