Commit d58f4f27 authored by Rémi Cardona's avatar Rémi Cardona Committed by Mauro Carvalho Chehab

[media] ds3000: bail out early on i2c failures during firmware load

- if kmalloc() returns NULL, we can return immediately without trying
   to kfree() a NULL pointer.
 - if i2c_transfer() fails, error out immediately instead of trying to
   upload the remaining bytes of the firmware.
 - the error code is then properly propagated down to ds3000_initfe().
Signed-off-by: default avatarRémi Cardona <remi.cardona@smartjog.com>
Reviewed-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7e5d74ee
...@@ -272,15 +272,14 @@ static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) ...@@ -272,15 +272,14 @@ static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
static int ds3000_writeFW(struct ds3000_state *state, int reg, static int ds3000_writeFW(struct ds3000_state *state, int reg,
const u8 *data, u16 len) const u8 *data, u16 len)
{ {
int i, ret = -EREMOTEIO; int i, ret = 0;
struct i2c_msg msg; struct i2c_msg msg;
u8 *buf; u8 *buf;
buf = kmalloc(33, GFP_KERNEL); buf = kmalloc(33, GFP_KERNEL);
if (buf == NULL) { if (buf == NULL) {
printk(KERN_ERR "Unable to kmalloc\n"); printk(KERN_ERR "Unable to kmalloc\n");
ret = -ENOMEM; return -ENOMEM;
goto error;
} }
*(buf) = reg; *(buf) = reg;
...@@ -300,8 +299,10 @@ static int ds3000_writeFW(struct ds3000_state *state, int reg, ...@@ -300,8 +299,10 @@ static int ds3000_writeFW(struct ds3000_state *state, int reg,
printk(KERN_ERR "%s: write error(err == %i, " printk(KERN_ERR "%s: write error(err == %i, "
"reg == 0x%02x\n", __func__, ret, reg); "reg == 0x%02x\n", __func__, ret, reg);
ret = -EREMOTEIO; ret = -EREMOTEIO;
goto error;
} }
} }
ret = 0;
error: error:
kfree(buf); kfree(buf);
...@@ -384,6 +385,7 @@ static int ds3000_load_firmware(struct dvb_frontend *fe, ...@@ -384,6 +385,7 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
const struct firmware *fw) const struct firmware *fw)
{ {
struct ds3000_state *state = fe->demodulator_priv; struct ds3000_state *state = fe->demodulator_priv;
int ret = 0;
dprintk("%s\n", __func__); dprintk("%s\n", __func__);
dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n", dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
...@@ -396,10 +398,10 @@ static int ds3000_load_firmware(struct dvb_frontend *fe, ...@@ -396,10 +398,10 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
/* Begin the firmware load process */ /* Begin the firmware load process */
ds3000_writereg(state, 0xb2, 0x01); ds3000_writereg(state, 0xb2, 0x01);
/* write the entire firmware */ /* write the entire firmware */
ds3000_writeFW(state, 0xb0, fw->data, fw->size); ret = ds3000_writeFW(state, 0xb0, fw->data, fw->size);
ds3000_writereg(state, 0xb2, 0x00); ds3000_writereg(state, 0xb2, 0x00);
return 0; return ret;
} }
static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment