> This it930x-based device has an issue with si2068.
> 
> When the si2168 firmware that came with the device is replaced
> by a new one, any I2C data received from the tuner will be
> replaced by 0xff.
> 
> Probably, the vendor firmware has some patch specifically
> designed for this device. So, we can't replace by the generic
> firmware.
> 
> The right solution would be to extract the si2168 firmware from
> the original driver and ask the driver to load the specifically
> designed firmware, but, while we don't have that, the next best
> solution is to just keep the original firmware at the device.

Unfortunately, after applying these four patches it doesn't work for me.
The messages when inserting the stick:

[  244.133448] i2c i2c-1: Added multiplexed i2c bus 2
[  244.133455] si2168 1-0067: Silicon Labs Si2168-B40 successfully identified
[  244.133458] si2168 1-0067: firmware version: B 4.0.2
[  244.133500] usb 2-1: DVB: registering adapter 0 frontend 0 (Silicon Labs 
Si2168)...
[  244.133514] dvbdev: dvb_create_media_entity: media entity 'Silicon Labs 
Si2168' registered.
[  244.138367] si2157 2-0063: Silicon Labs Si2147/2148/2157/2158 successfully 
attached
[  244.156956] usb 2-1: dvb_usb_v2: 'Logilink VG0022A' successfully initialized 
and connected

The messages when starting VLC:

[  260.490253] si2157 2-0063: found a 'Silicon Labs Si2147-A30'
[  260.541347] si2157 2-0063: firmware version: 3.0.5

But it doesn't work. :(

g

> 
> For more details, see the discussions at:
>       
> https://lore.kernel.org/linux-media/20191002141359.30166-2-gons...@gmail.com/
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab+sams...@kernel.org>
> ---
>  drivers/media/usb/dvb-usb-v2/af9035.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c 
> b/drivers/media/usb/dvb-usb-v2/af9035.c
> index 3afd18733614..e555483c3077 100644
> --- a/drivers/media/usb/dvb-usb-v2/af9035.c
> +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
> @@ -1255,6 +1255,23 @@ static int it930x_frontend_attach(struct 
> dvb_usb_adapter *adap)
>       si2168_config.fe = &adap->fe[0];
>       si2168_config.ts_mode = SI2168_TS_SERIAL;
>  
> +     /*
> +      * HACK: The Logilink VG0022A has a bug: when the si2168
> +      * firmware that came with the device is replaced by a new
> +      * one, the I2C transfers to the tuner will return just 0xff.
> +      *
> +      * Probably, the vendor firmware has some patch specifically
> +      * designed for this device. So, we can't replace by the
> +      * generic firmware. The right solution would be to extract
> +      * the si2168 firmware from the original driver and ask the
> +      * driver to load the specifically designed firmware, but,
> +      * while we don't have that, the next best solution is to just
> +      * keep the original firmware at the device.
> +      */
> +     if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_DEXATEK &&
> +         le16_to_cpu(d->udev->descriptor.idProduct) == 0x0100)
> +             si2168_config.dont_load_firmware = true;
> +
>       state->af9033_config[adap->id].fe = &adap->fe[0];
>       state->af9033_config[adap->id].ops = &state->ops;
>       ret = af9035_add_i2c_dev(d, "si2168",
> @@ -2121,6 +2138,8 @@ static const struct usb_device_id af9035_id_table[] = {
>               &it930x_props, "ITE 9303 Generic", NULL) },
>       { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD310,
>               &it930x_props, "AVerMedia TD310 DVB-T2", NULL) },
> +     { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x0100,
> +             &it930x_props, "Logilink VG0022A", NULL) },
>       { }
>  };
>  MODULE_DEVICE_TABLE(usb, af9035_id_table);
> -- 
> 2.21.0
> 

Reply via email to