aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2007-02-08 00:02:53 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-02-21 10:35:20 -0500
commit90060d32ca0a941b158994f78e60d0381871c84b (patch)
treea9a53401ee59fd2e14e57e50bc92e48ed98ca8e8 /drivers
parent201779f5c4a4bd8503a38749dd371ecddb7928a5 (diff)
V4L/DVB (5212): Pvrusb2: Be more forgiving about encoder firmware size
The pvrusb2 driver previously rejected encoder firmware whose size was not a multiple of 8192. But this is a false check because it's possible to find cx23416 firmware whose size doesn't conform to this limit. So change the firmware loader implementation to be more forgiving of the image size. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 40b2f2a6d3cc..a1ca0f5007e0 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -1209,7 +1209,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1209{ 1209{
1210 const struct firmware *fw_entry = NULL; 1210 const struct firmware *fw_entry = NULL;
1211 void *fw_ptr; 1211 void *fw_ptr;
1212 unsigned int pipe, fw_len, fw_done; 1212 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
1213 int actual_length; 1213 int actual_length;
1214 int ret = 0; 1214 int ret = 0;
1215 int fwidx; 1215 int fwidx;
@@ -1265,11 +1265,11 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1265 1265
1266 fw_len = fw_entry->size; 1266 fw_len = fw_entry->size;
1267 1267
1268 if (fw_len % FIRMWARE_CHUNK_SIZE) { 1268 if (fw_len % sizeof(u32)) {
1269 pvr2_trace(PVR2_TRACE_ERROR_LEGS, 1269 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1270 "size of %s firmware" 1270 "size of %s firmware"
1271 " must be a multiple of 8192B", 1271 " must be a multiple of %u bytes",
1272 fw_files[fwidx]); 1272 fw_files[fwidx],sizeof(u32));
1273 release_firmware(fw_entry); 1273 release_firmware(fw_entry);
1274 return -1; 1274 return -1;
1275 } 1275 }
@@ -1284,18 +1284,21 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1284 1284
1285 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT); 1285 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1286 1286
1287 for (fw_done = 0 ; (fw_done < fw_len) && !ret ; 1287 fw_done = 0;
1288 fw_done += FIRMWARE_CHUNK_SIZE ) { 1288 for (fw_done = 0; fw_done < fw_len;) {
1289 int i; 1289 bcnt = fw_len - fw_done;
1290 memcpy(fw_ptr, fw_entry->data + fw_done, FIRMWARE_CHUNK_SIZE); 1290 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1291 /* Usbsnoop log shows that we must swap bytes... */ 1291 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1292 for (i = 0; i < FIRMWARE_CHUNK_SIZE/4 ; i++) 1292 /* Usbsnoop log shows that we must swap bytes... */
1293 ((u32 *)fw_ptr)[i] = ___swab32(((u32 *)fw_ptr)[i]); 1293 for (icnt = 0; icnt < bcnt/4 ; icnt++)
1294 1294 ((u32 *)fw_ptr)[icnt] =
1295 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr, 1295 ___swab32(((u32 *)fw_ptr)[icnt]);
1296 FIRMWARE_CHUNK_SIZE, 1296
1297 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
1297 &actual_length, HZ); 1298 &actual_length, HZ);
1298 ret |= (actual_length != FIRMWARE_CHUNK_SIZE); 1299 ret |= (actual_length != bcnt);
1300 if (ret) break;
1301 fw_done += bcnt;
1299 } 1302 }
1300 1303
1301 trace_firmware("upload of %s : %i / %i ", 1304 trace_firmware("upload of %s : %i / %i ",