aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb/dvb-usb/ec168.c25
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:
209static int ec168_download_firmware(struct dvb_usb_device *d, 209static 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"? */