aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorAntonio Ospite <ospite@studenti.unina.it>2008-12-03 14:21:08 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 06:38:53 -0500
commit442a43f50fac8ce13f1b43ca7c5f54af6f91c65e (patch)
treee80302db02fc7022c2ec486dc742017175fdeb60 /drivers/media/video/gspca
parent9e1e7b068debea80c3ffbde264d0389b8137b589 (diff)
V4L/DVB (9857): gspca: Use smaller chunks for urb buffer in ov534.
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r--drivers/media/video/gspca/ov534.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c
index 530f0b712166..a1c31bc53a3d 100644
--- a/drivers/media/video/gspca/ov534.c
+++ b/drivers/media/video/gspca/ov534.c
@@ -346,7 +346,14 @@ static int sd_config(struct gspca_dev *gspca_dev,
346 cam->cam_mode = vga_mode; 346 cam->cam_mode = vga_mode;
347 cam->nmodes = ARRAY_SIZE(vga_mode); 347 cam->nmodes = ARRAY_SIZE(vga_mode);
348 348
349 cam->bulk_size = vga_mode[0].sizeimage; 349 /*
350 * On some architectures we need contiguous memory for urb buffers, and
351 * in low memory situation 'sizeimage' can be too much.
352 * 16kiB chunks should be available even when we are low in memory.
353 * TODO: CHECK this description: is the problem arch-dependent or more
354 * general?
355 */
356 cam->bulk_size = 16 * 1024;
350 cam->bulk_nurbs = 2; 357 cam->bulk_nurbs = 2;
351 358
352 PDEBUG(D_PROBE, "bulk_size = %d", cam->bulk_size); 359 PDEBUG(D_PROBE, "bulk_size = %d", cam->bulk_size);
@@ -395,15 +402,19 @@ static int sd_init(struct gspca_dev *gspca_dev)
395 402
396static int sd_start(struct gspca_dev *gspca_dev) 403static int sd_start(struct gspca_dev *gspca_dev)
397{ 404{
398 PDEBUG(D_PROBE, "width = %d, height = %d", 405 struct gspca_frame *frame;
399 gspca_dev->width, gspca_dev->height);
400
401 gspca_dev->cam.bulk_size = gspca_dev->width * gspca_dev->height * 2;
402 406
403 /* start streaming data */ 407 /* start streaming data */
404 ov534_set_led(gspca_dev->dev, 1); 408 ov534_set_led(gspca_dev->dev, 1);
405 ov534_reg_write(gspca_dev->dev, 0xe0, 0x00); 409 ov534_reg_write(gspca_dev->dev, 0xe0, 0x00);
406 410
411 frame = gspca_get_i_frame(gspca_dev);
412 if (frame == NULL) {
413 PDEBUG(D_ERR, "NULL frame!");
414 return -1;
415 }
416 gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_dev->usb_buf, 0);
417
407 return 0; 418 return 0;
408} 419}
409 420
@@ -421,18 +432,21 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
421 * The current camera setup doesn't stream the last pixel, so we set it 432 * The current camera setup doesn't stream the last pixel, so we set it
422 * to a dummy value 433 * to a dummy value
423 */ 434 */
424 __u8 last_pixel[4] = { 0, 0, 0, 0 }; 435 __u8 last[4] = { 0, 0, 0, 0 };
425 int framesize = gspca_dev->cam.bulk_size; 436 int framesize = frame->v4l2_buf.length;
426 437
427 if (len == framesize - 4) { 438 PDEBUG(D_PACK, "");
428 frame = 439 PDEBUG(D_PACK, "** packet len = %d, framesize = %d", len, framesize);
429 gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); 440 PDEBUG(D_PACK, "** frame->data_end - frame->data + len = %d",
430 frame = 441 frame->data_end - frame->data + len);
431 gspca_frame_add(gspca_dev, LAST_PACKET, frame, last_pixel, 442
432 4); 443 if (frame->data_end - frame->data + len == framesize - 4) {
444 PDEBUG(D_PACK, " end of frame!");
445 gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
446 frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, last, 4);
447 gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0);
433 } else 448 } else
434 PDEBUG(D_PACK, "packet len = %d, framesize = %d", len, 449 gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
435 framesize);
436} 450}
437 451
438/* sub-driver description */ 452/* sub-driver description */