Commit c7abfb47 authored by Andy Walls's avatar Andy Walls Committed by Mauro Carvalho Chehab

V4L/DVB (9599): cx18: Fix unitialized variable problem upon APU firmware file read failure

If APU firmware file read failed, the jump vector to the APU was undefined and
the APU would be started executing garbage.  Fix uninitialized variable to be
an infinite loop for the APU, but also bail out before even starting the APU.
Signed-off-by: default avatarAndy Walls <awalls@radix.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent d20ceecd
...@@ -153,7 +153,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx, ...@@ -153,7 +153,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx,
return -ENOMEM; return -ENOMEM;
} }
*entry_addr = 0xffffffff; *entry_addr = 0;
src = (const u32 *)fw->data; src = (const u32 *)fw->data;
vers = fw->data + sizeof(seghdr); vers = fw->data + sizeof(seghdr);
sz = fw->size; sz = fw->size;
...@@ -170,7 +170,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx, ...@@ -170,7 +170,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx,
} }
CX18_DEBUG_INFO("load segment %x-%x\n", seghdr.addr, CX18_DEBUG_INFO("load segment %x-%x\n", seghdr.addr,
seghdr.addr + seghdr.size - 1); seghdr.addr + seghdr.size - 1);
if (*entry_addr == 0xffffffff) if (*entry_addr == 0)
*entry_addr = seghdr.addr; *entry_addr = seghdr.addr;
if (offset + seghdr.size > sz) if (offset + seghdr.size > sz)
break; break;
...@@ -340,10 +340,13 @@ int cx18_firmware_init(struct cx18 *cx) ...@@ -340,10 +340,13 @@ int cx18_firmware_init(struct cx18 *cx)
/* Only if the processor is not running */ /* Only if the processor is not running */
if (cx18_read_reg(cx, CX18_PROC_SOFT_RESET) & 8) { if (cx18_read_reg(cx, CX18_PROC_SOFT_RESET) & 8) {
u32 fw_entry_addr; u32 fw_entry_addr = 0;
int sz = load_apu_fw_direct("v4l-cx23418-apu.fw", int sz = load_apu_fw_direct("v4l-cx23418-apu.fw",
cx->enc_mem, cx, &fw_entry_addr); cx->enc_mem, cx, &fw_entry_addr);
if (sz <= 0)
return sz;
/* Clear bit0 for APU to start from 0 */ /* Clear bit0 for APU to start from 0 */
cx18_write_reg(cx, cx18_read_reg(cx, 0xc72030) & ~1, 0xc72030); cx18_write_reg(cx, cx18_read_reg(cx, 0xc72030) & ~1, 0xc72030);
......
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