diff options
author | Antonio Ospite <ospite@studenti.unina.it> | 2008-12-03 14:21:08 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-12-30 06:38:53 -0500 |
commit | 442a43f50fac8ce13f1b43ca7c5f54af6f91c65e (patch) | |
tree | e80302db02fc7022c2ec486dc742017175fdeb60 | |
parent | 9e1e7b068debea80c3ffbde264d0389b8137b589 (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>
-rw-r--r-- | drivers/media/video/gspca/ov534.c | 46 |
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 | ||
396 | static int sd_start(struct gspca_dev *gspca_dev) | 403 | static 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 */ |