diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 101b399e76a121ac3daa90fa195b0cbac3f58637..6cecd755f1d98a083b0653c9725f3cfd34625a81 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c @@ -324,7 +324,7 @@ static struct i2c_algorithm af9015_i2c_algo = { .functionality = af9015_i2c_func, }; -static int af9015_identify_state(struct dvb_usb_device *d) +static int af9015_identify_state(struct dvb_usb_device *d, const char **name) { int ret; u8 reply; diff --git a/drivers/media/dvb/dvb-usb/af9035.c b/drivers/media/dvb/dvb-usb/af9035.c index ba2a0c1a65a2415d58e2eb7c72825d7117eff6c7..b030055d14a31437fcbdf8d22c49e37751e6c674 100644 --- a/drivers/media/dvb/dvb-usb/af9035.c +++ b/drivers/media/dvb/dvb-usb/af9035.c @@ -278,7 +278,7 @@ static struct i2c_algorithm af9035_i2c_algo = { .functionality = af9035_i2c_functionality, }; -static int af9035_identify_state(struct dvb_usb_device *d) +static int af9035_identify_state(struct dvb_usb_device *d, const char **name) { int ret; u8 wbuf[1] = { 1 }; diff --git a/drivers/media/dvb/dvb-usb/dvb_usb.h b/drivers/media/dvb/dvb-usb/dvb_usb.h index 3a54fc3da702cf7522d2609e2c9497282efe7528..aecba307105e0f64bc137e4900b9e9c3c71d76dd 100644 --- a/drivers/media/dvb/dvb-usb/dvb_usb.h +++ b/drivers/media/dvb/dvb-usb/dvb_usb.h @@ -197,12 +197,13 @@ struct dvb_usb_device_properties { struct module *owner; short *adapter_nr; u8 bInterfaceNumber; - int size_of_priv; +#define WARM 0 +#define COLD 1 + int (*identify_state) (struct dvb_usb_device *, const char **); const char *firmware; - int (*get_firmware_name) (struct dvb_usb_device *, const char **); -#define RECONNECTS_USB 1 +#define RECONNECTS_USB 1 int (*download_firmware) (struct dvb_usb_device *, const struct firmware *); @@ -219,10 +220,6 @@ struct dvb_usb_device_properties { int (*streaming_ctrl) (struct dvb_usb_adapter *, int); int (*fe_ioctl_override) (struct dvb_frontend *, unsigned int, void *, unsigned int); - -#define WARM 0 -#define COLD 1 - int (*identify_state) (struct dvb_usb_device *); int (*init) (struct dvb_usb_device *); void (*disconnect) (struct dvb_usb_device *); int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *); diff --git a/drivers/media/dvb/dvb-usb/dvb_usb_init.c b/drivers/media/dvb/dvb-usb/dvb_usb_init.c index 2624daa94b4f6d415f95a12029c9ad8d56cbc4e1..24e1f2970d8eaa7ffac995d4ec2d266913d45713 100644 --- a/drivers/media/dvb/dvb-usb/dvb_usb_init.c +++ b/drivers/media/dvb/dvb-usb/dvb_usb_init.c @@ -24,19 +24,10 @@ module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a" \ " PID filter, if any (default: 0)."); -static int dvb_usbv2_download_firmware(struct dvb_usb_device *d) +static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *name) { int ret; - const struct firmware *fw = NULL; - const char *name; - - /* resolve firmware name */ - name = d->props->firmware; - if (d->props->get_firmware_name) { - ret = d->props->get_firmware_name(d, &name); - if (ret < 0) - goto err; - } + const struct firmware *fw; if (!d->props->download_firmware) { ret = -EINVAL; @@ -395,7 +386,6 @@ static void dvb_usbv2_init_work(struct work_struct *work) int ret; struct dvb_usb_device *d = container_of(work, struct dvb_usb_device, probe_work); - bool cold = false; d->work_pid = current->pid; @@ -411,40 +401,42 @@ static void dvb_usbv2_init_work(struct work_struct *work) } if (d->props->identify_state) { - ret = d->props->identify_state(d); + const char *name = NULL; + ret = d->props->identify_state(d, &name); if (ret == 0) { ; } else if (ret == COLD) { - cold = true; - ret = 0; - } else { - goto err_usb_driver_release_interface; - } - } - - if (cold) { - pr_info("%s: found a '%s' in cold state\n", - KBUILD_MODNAME, d->name); - ret = dvb_usbv2_download_firmware(d); - if (ret == 0) { - /* device is warm, continue initialization */ - ; - } else if (ret == RECONNECTS_USB) { - /* - * 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; + pr_info("%s: found a '%s' in cold state\n", + KBUILD_MODNAME, d->name); + + if (!name) + name = d->props->firmware; + + ret = dvb_usbv2_download_firmware(d, name); + if (ret == 0) { + /* device is warm, continue initialization */ + ; + } else if (ret == RECONNECTS_USB) { + /* + * 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 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; + } } 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; } } diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c index c05f09c529e3bdd7a2244a5d27612712f3b4d71f..1fb84728a27de96565e4f2589588a9f359722e4f 100644 --- a/drivers/media/dvb/dvb-usb/ec168.c +++ b/drivers/media/dvb/dvb-usb/ec168.c @@ -182,7 +182,7 @@ static struct i2c_algorithm ec168_i2c_algo = { }; /* Callbacks for DVB USB */ -static int ec168_identify_state(struct dvb_usb_device *d) +static int ec168_identify_state(struct dvb_usb_device *d, const char **name) { int ret; u8 reply;