diff options
-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"? */ |