diff options
-rw-r--r-- | drivers/media/dvb/dvb-usb/af9015.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 0bbc91f5038..100ebc37e99 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
@@ -665,9 +665,8 @@ error: | |||
665 | static int af9015_download_firmware(struct usb_device *udev, | 665 | static int af9015_download_firmware(struct usb_device *udev, |
666 | const struct firmware *fw) | 666 | const struct firmware *fw) |
667 | { | 667 | { |
668 | int i, len, packets, remainder, ret; | 668 | int i, len, remaining, ret; |
669 | struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL}; | 669 | struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL}; |
670 | u16 addr = 0x5100; /* firmware start address */ | ||
671 | u16 checksum = 0; | 670 | u16 checksum = 0; |
672 | 671 | ||
673 | deb_info("%s:\n", __func__); | 672 | deb_info("%s:\n", __func__); |
@@ -679,24 +678,20 @@ static int af9015_download_firmware(struct usb_device *udev, | |||
679 | af9015_config.firmware_size = fw->size; | 678 | af9015_config.firmware_size = fw->size; |
680 | af9015_config.firmware_checksum = checksum; | 679 | af9015_config.firmware_checksum = checksum; |
681 | 680 | ||
682 | #define FW_PACKET_MAX_DATA 55 | 681 | #define FW_ADDR 0x5100 /* firmware start address */ |
683 | 682 | #define LEN_MAX 55 /* max packet size */ | |
684 | packets = fw->size / FW_PACKET_MAX_DATA; | 683 | for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) { |
685 | remainder = fw->size % FW_PACKET_MAX_DATA; | 684 | len = remaining; |
686 | len = FW_PACKET_MAX_DATA; | 685 | if (len > LEN_MAX) |
687 | for (i = 0; i <= packets; i++) { | 686 | len = LEN_MAX; |
688 | if (i == packets) /* set size of the last packet */ | ||
689 | len = remainder; | ||
690 | 687 | ||
691 | req.data_len = len; | 688 | req.data_len = len; |
692 | req.data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA); | 689 | req.data = (u8 *) &fw->data[fw->size - remaining]; |
693 | req.addr = addr; | 690 | req.addr = FW_ADDR + fw->size - remaining; |
694 | addr += FW_PACKET_MAX_DATA; | ||
695 | 691 | ||
696 | ret = af9015_rw_udev(udev, &req); | 692 | ret = af9015_rw_udev(udev, &req); |
697 | if (ret) { | 693 | if (ret) { |
698 | err("firmware download failed at packet %d with " \ | 694 | err("firmware download failed:%d", ret); |
699 | "code %d", i, ret); | ||
700 | goto error; | 695 | goto error; |
701 | } | 696 | } |
702 | } | 697 | } |