Skip to content

Commit

Permalink
[media] dvb_usb_v2: do not release USB interface when device reconnects
Browse files Browse the repository at this point in the history
USB core will call disconnect and remove driver for us as device
will disconnect itself. After that it is loaded again as a new
device but it is warm and no firmware loading needed.

Reported-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Antti Palosaari authored and Mauro Carvalho Chehab committed Aug 4, 2012
1 parent c65bcb9 commit ffe4ac9
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions drivers/media/dvb/dvb-usb/dvb_usb_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,11 +431,24 @@ static void dvb_usbv2_init_work(struct work_struct *work)
KBUILD_MODNAME, d->name);
ret = dvb_usbv2_download_firmware(d);
if (ret == 0) {
/* device is warm, continue initialization */
;
} else if (ret == RECONNECTS_USB) {
ret = 0;
goto exit_usb_driver_release_interface;
/*
* USB core will call disconnect() and then probe()
* as device reconnects itself from the USB bus.
* disconnect() will release all driver resources
* and probe() is called for 'new' device. As 'new'
* device is warm we should never go here again.
*/
return;
} else {
/* Unexpected fatal error. We must unregister driver
* manually from the device, because device is already
* register by returning from probe() with success.
* usb_driver_release_interface() finally calls
* disconnect() in order to free resources.
*/
goto err_usb_driver_release_interface;
}
}
Expand All @@ -453,8 +466,7 @@ static void dvb_usbv2_init_work(struct work_struct *work)
err_usb_driver_release_interface:
pr_info("%s: '%s' error while loading driver (%d)\n", KBUILD_MODNAME,
d->name, ret);
exit_usb_driver_release_interface:
/* it finally calls .disconnect() which frees mem */
/* it finally calls disconnect() which frees mem */
usb_driver_release_interface(to_usb_driver(d->intf->dev.driver),
d->intf);
pr_debug("%s: failed=%d\n", __func__, ret);
Expand Down

0 comments on commit ffe4ac9

Please sign in to comment.