mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 14:14:01 +08:00
[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: Rémi Cardona <remi.cardona@smartjog.com> Reviewed-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
7e5d74ee11
commit
d58f4f2728
@ -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,
|
||||
const u8 *data, u16 len)
|
||||
{
|
||||
int i, ret = -EREMOTEIO;
|
||||
int i, ret = 0;
|
||||
struct i2c_msg msg;
|
||||
u8 *buf;
|
||||
|
||||
buf = kmalloc(33, GFP_KERNEL);
|
||||
if (buf == NULL) {
|
||||
printk(KERN_ERR "Unable to kmalloc\n");
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
*(buf) = reg;
|
||||
@ -300,8 +299,10 @@ static int ds3000_writeFW(struct ds3000_state *state, int reg,
|
||||
printk(KERN_ERR "%s: write error(err == %i, "
|
||||
"reg == 0x%02x\n", __func__, ret, reg);
|
||||
ret = -EREMOTEIO;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
error:
|
||||
kfree(buf);
|
||||
@ -384,6 +385,7 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
|
||||
const struct firmware *fw)
|
||||
{
|
||||
struct ds3000_state *state = fe->demodulator_priv;
|
||||
int ret = 0;
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
|
||||
@ -396,10 +398,10 @@ static int ds3000_load_firmware(struct dvb_frontend *fe,
|
||||
/* Begin the firmware load process */
|
||||
ds3000_writereg(state, 0xb2, 0x01);
|
||||
/* 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);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
|
Loading…
Reference in New Issue
Block a user