staging: comedi: usbduxfast: request firmware synchronously
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 14 May 2013 20:24:17 +0000 (13:24 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 16 May 2013 23:24:16 +0000 (16:24 -0700)
Change the request_firmware_nowait() to a request_firmware() so
that the usb_driver (*probe) and continue with the comedi_driver
(*auto_attach).

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/usbduxfast.c

index 8a6427330de049138c9bfb144311e03795bf47e0..31de05d1fb752fccea3858a6e605f1d62d7a852e 100644 (file)
@@ -1470,31 +1470,21 @@ static struct comedi_driver usbduxfast_driver = {
        .detach         = usbduxfast_detach,
 };
 
-static void usbduxfast_firmware_request_complete_handler(const struct firmware
-                                                        *fw, void *context)
+static int usbduxfast_request_firmware(struct usb_interface *intf)
 {
-       struct usbduxfastsub_s *usbduxfastsub_tmp = context;
-       struct usb_interface *uinterf = usbduxfastsub_tmp->interface;
+       struct usb_device *usb = interface_to_usbdev(intf);
+       struct usbduxfastsub_s *devpriv = usb_get_intfdata(intf);
+       const struct firmware *fw;
        int ret;
 
-       if (fw == NULL)
-               return;
-
-       /*
-        * we need to upload the firmware here because fw will be
-        * freed once we've left this function
-        */
-       ret = firmwareUpload(usbduxfastsub_tmp, fw->data, fw->size);
-
-       if (ret) {
-               dev_err(&uinterf->dev,
-                       "Could not upload firmware (err=%d)\n", ret);
-               goto out;
-       }
+       ret = request_firmware(&fw, FIRMWARE, &usb->dev);
+       if (ret)
+               return ret;
 
-       comedi_usb_auto_config(uinterf, &usbduxfast_driver, 0);
- out:
+       ret = firmwareUpload(devpriv, fw->data, fw->size);
        release_firmware(fw);
+
+       return ret;
 }
 
 static int usbduxfast_usb_probe(struct usb_interface *uinterf,
@@ -1598,14 +1588,11 @@ static int usbduxfast_usb_probe(struct usb_interface *uinterf,
        usbduxfastsub[index].probed = 1;
        up(&start_stop_sem);
 
-       ret = request_firmware_nowait(THIS_MODULE,
-                                     FW_ACTION_HOTPLUG,
-                                     FIRMWARE,
-                                     &udev->dev,
-                                     GFP_KERNEL,
-                                     usbduxfastsub + index,
-                                     usbduxfast_firmware_request_complete_handler);
-
+       /*
+        * Request, and upload, the firmware so we can
+        * complete the comedi_driver (*auto_attach).
+        */
+       ret = usbduxfast_request_firmware(uinterf);
        if (ret) {
                dev_err(&uinterf->dev, "could not load firmware (err=%d)\n", ret);
                return ret;
@@ -1613,8 +1600,8 @@ static int usbduxfast_usb_probe(struct usb_interface *uinterf,
 
        dev_info(&uinterf->dev,
                 "usbduxfast%d has been successfully initialized.\n", index);
-       /* success */
-       return 0;
+
+       return comedi_usb_auto_config(uinterf, &usbduxfast_driver, 0);
 }
 
 static void usbduxfast_usb_disconnect(struct usb_interface *intf)