diff options
| author | Antti Palosaari <crope@iki.fi> | 2012-06-12 21:16:12 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-08-04 06:56:31 -0400 |
| commit | 77e28ec27927dbb130d84a9fe7cbe85bf6bf47ea (patch) | |
| tree | 4cf4d9ce91c999d136eed7a34bb3d50d62c3b405 | |
| parent | d32be21800feb38d51a584437f1a5eb3f4126a17 (diff) | |
[media] ec168: re-implement firmware loading
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
| -rw-r--r-- | drivers/media/dvb/dvb-usb/ec168.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c index 717c66a4bddd..3ed80b01d5fa 100644 --- a/drivers/media/dvb/dvb-usb/ec168.c +++ b/drivers/media/dvb/dvb-usb/ec168.c | |||
| @@ -209,31 +209,28 @@ error: | |||
| 209 | static int ec168_download_firmware(struct dvb_usb_device *d, | 209 | static int ec168_download_firmware(struct dvb_usb_device *d, |
| 210 | const struct firmware *fw) | 210 | const struct firmware *fw) |
| 211 | { | 211 | { |
| 212 | int i, len, packets, remainder, ret; | 212 | int ret, len, remaining; |
| 213 | u16 addr = 0x0000; /* firmware start address */ | ||
| 214 | struct ec168_req req = {DOWNLOAD_FIRMWARE, 0, 0, 0, NULL}; | 213 | struct ec168_req req = {DOWNLOAD_FIRMWARE, 0, 0, 0, NULL}; |
| 215 | pr_debug("%s:\n", __func__); | 214 | pr_debug("%s:\n", __func__); |
| 216 | 215 | ||
| 217 | #define FW_PACKET_MAX_DATA 2048 | 216 | #define LEN_MAX 2048 /* max packet size */ |
| 218 | packets = fw->size / FW_PACKET_MAX_DATA; | 217 | for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) { |
| 219 | remainder = fw->size % FW_PACKET_MAX_DATA; | 218 | len = remaining; |
| 220 | len = FW_PACKET_MAX_DATA; | 219 | if (len > LEN_MAX) |
| 221 | for (i = 0; i <= packets; i++) { | 220 | len = LEN_MAX; |
| 222 | if (i == packets) /* set size of the last packet */ | ||
| 223 | len = remainder; | ||
| 224 | 221 | ||
| 225 | req.size = len; | 222 | req.size = len; |
| 226 | req.data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA); | 223 | req.data = (u8 *) &fw->data[fw->size - remaining]; |
| 227 | req.index = addr; | 224 | req.index = fw->size - remaining; |
| 228 | addr += FW_PACKET_MAX_DATA; | ||
| 229 | 225 | ||
| 230 | ret = ec168_ctrl_msg(d, &req); | 226 | ret = ec168_ctrl_msg(d, &req); |
| 231 | if (ret) { | 227 | if (ret) { |
| 232 | pr_err("%s: firmware download failed=%d packet=%d\n", | 228 | pr_err("%s: firmware download failed=%d\n", |
| 233 | KBUILD_MODNAME, ret, i); | 229 | KBUILD_MODNAME, ret); |
| 234 | goto error; | 230 | goto error; |
| 235 | } | 231 | } |
| 236 | } | 232 | } |
| 233 | |||
| 237 | req.size = 0; | 234 | req.size = 0; |
| 238 | 235 | ||
| 239 | /* set "warm"? */ | 236 | /* set "warm"? */ |
