[RFC PATCH 01/39] staging: comedi: usbduxfast: request firmware synchronously

H Hartley Sweeten hsweeten at visionengravers.com
Wed May 1 22:16:38 UTC 2013


Change the request_firmware_nowait() to a request_firmware() so
that the usb_driver (*probe) can continue with the comedi_driver
(*auto_attach).

Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregkh at linuxfonudation.org>
---
 drivers/staging/comedi/drivers/usbduxfast.c | 47 +++++++++++------------------
 1 file changed, 17 insertions(+), 30 deletions(-)

diff --git a/drivers/staging/comedi/drivers/usbduxfast.c b/drivers/staging/comedi/drivers/usbduxfast.c
index 18335f1..c209926 100644
--- a/drivers/staging/comedi/drivers/usbduxfast.c
+++ b/drivers/staging/comedi/drivers/usbduxfast.c
@@ -1473,31 +1473,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,
@@ -1601,14 +1591,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;
@@ -1616,8 +1603,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)
-- 
1.8.1.4




More information about the devel mailing list