Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] af9013: reimplement firmware download

Split FW download packages smarter way and bug free. Implementation is
based of Andrea Merello's example he provided for tda18218 driver.
Count remaining FW bytes down in loop instead of division and modulo
combination used earlier.

Thanks to: Andrea Merello <andrea.merello@gmail.com>

Signed-off-by: Antti Palosaari <crope@iki.fi>
Cc: Andrea Merello <andrea.merello@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
6ed9d560 109a2990

+11 -16
+11 -16
drivers/media/dvb/frontends/af9013.c
··· 1323 1323 1324 1324 static int af9013_download_firmware(struct af9013_state *state) 1325 1325 { 1326 - int i, len, packets, remainder, ret; 1326 + int i, len, remaining, ret; 1327 1327 const struct firmware *fw; 1328 - u16 addr = 0x5100; /* firmware start address */ 1329 1328 u16 checksum = 0; 1330 1329 u8 val; 1331 1330 u8 fw_params[4]; 1332 - u8 *data; 1333 1331 u8 *fw_file = AF9013_DEFAULT_FIRMWARE; 1334 1332 1335 1333 msleep(100); ··· 1371 1373 if (ret) 1372 1374 goto error_release; 1373 1375 1374 - #define FW_PACKET_MAX_DATA 16 1376 + #define FW_ADDR 0x5100 /* firmware start address */ 1377 + #define LEN_MAX 16 /* max packet size */ 1378 + for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) { 1379 + len = remaining; 1380 + if (len > LEN_MAX) 1381 + len = LEN_MAX; 1375 1382 1376 - packets = fw->size / FW_PACKET_MAX_DATA; 1377 - remainder = fw->size % FW_PACKET_MAX_DATA; 1378 - len = FW_PACKET_MAX_DATA; 1379 - for (i = 0; i <= packets; i++) { 1380 - if (i == packets) /* set size of the last packet */ 1381 - len = remainder; 1382 - 1383 - data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA); 1384 - ret = af9013_write_ofsm_regs(state, addr, data, len); 1385 - addr += FW_PACKET_MAX_DATA; 1386 - 1383 + ret = af9013_write_ofsm_regs(state, 1384 + FW_ADDR + fw->size - remaining, 1385 + (u8 *) &fw->data[fw->size - remaining], len); 1387 1386 if (ret) { 1388 - err("firmware download failed at %d with %d", i, ret); 1387 + err("firmware download failed:%d", ret); 1389 1388 goto error_release; 1390 1389 } 1391 1390 }