Re: [PATCH 3/4] media: af9035: add support for Logilink VG0022A

From: Gon Solo
Date: Wed Oct 09 2019 - 17:44:12 EST


> 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-gonsolo@xxxxxxxxx/
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@xxxxxxxxxx>
> ---
> 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
>