Em Thu, 3 Oct 2019 12:57:50 +0200
Gonsolo <gons...@gmail.com> escreveu:

> Hi!
> 
> Boot time:
> 
> > [    5.380991] si2168 1-0067: firmware version: B 4.0.2  
> 
> When starting VLC:
> 
> > [  457.677363] si2168 1-0067: downloading firmware from file
> > 'dvb-demod-si2168-b40-01.fw'
> > [  458.631034] si2168 1-0067: firmware version: B 4.0.11
> > [  458.650309] si2157 2-0063: unknown chip version Si21255-\xff\xff\xff  
> 
> There are two different firmware versions, 4.0.2 and 4.0.11. Is that expected?

It means that there's a firmware stored at the device's eeprom
(version 4.0.2). When the driver starts, it downloads a newer firmware
from the file dvb-demod-si2168-b40-01.fw.

Btw, could you please try the enclosed hack and post the results?

Thanks,
Mauro

diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c
index e87040d6eca7..3ccfd602934b 100644
--- a/drivers/media/tuners/si2157.c
+++ b/drivers/media/tuners/si2157.c
@@ -76,6 +76,7 @@ static int si2157_init(struct dvb_frontend *fe)
        const struct firmware *fw;
        const char *fw_name;
        unsigned int uitmp, chip_id;
+       int i;
 
        dev_dbg(&client->dev, "\n");
 
@@ -118,16 +119,32 @@ static int si2157_init(struct dvb_frontend *fe)
                        goto err;
        }
 
-       /* query chip revision */
-       memcpy(cmd.args, "\x02", 1);
-       cmd.wlen = 1;
-       cmd.rlen = 13;
-       ret = si2157_cmd_execute(client, &cmd);
-       if (ret)
-               goto err;
+       for (i = 0; i < 10; i++) {
+               /* query chip revision */
+               memcpy(cmd.args, "\x02", 1);
+               cmd.wlen = 1;
+               cmd.rlen = 13;
+               ret = si2157_cmd_execute(client, &cmd);
+               if (ret)
+                       goto err;
+
+               chip_id = cmd.args[1] << 24 | cmd.args[2] << 16 | cmd.args[3] 
<< 8 |
+                         cmd.args[4] << 0;
 
-       chip_id = cmd.args[1] << 24 | cmd.args[2] << 16 | cmd.args[3] << 8 |
-                       cmd.args[4] << 0;
+               if (chip_id != 0xffffffff)
+                       break;
+
+               msleep(10);
+       }
+
+       if (i)
+               dev_info(&client->dev, "Needed to wait %i ms to get chip 
version", i * 10);
+
+       if (chip_id == 0xffffffff) {
+               dev_err(&client->dev, "Unable to retrieve chip version\n");
+               ret = -EINVAL;
+               goto err;
+       }
 
        #define SI2177_A30 ('A' << 24 | 77 << 16 | '3' << 8 | '0' << 0)
        #define SI2158_A20 ('A' << 24 | 58 << 16 | '2' << 8 | '0' << 0)

Reply via email to