aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb
diff options
context:
space:
mode:
authorEzequiel Garcia <elezegarcia@gmail.com>2012-08-19 20:23:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-09-25 09:52:58 -0400
commit065741840b1a58e94d2304b283286b355cbbc616 (patch)
treea736113945cfc85d93ac95013c7ae25ae9d8d181 /drivers/media/usb
parent18ad89659a345c017ab61f758f9dfedab3c8190f (diff)
[media] stk1160: Handle urb allocation failure condition properly
When an urb buffer can't be allocated, the currently allocated buffer count must be saved so they can properly released. Moreover, it's sufficient to call stk1160_free_isoc to have all urb buffers released. Signed-off-by: Ezequiel Garcia <elezegarcia@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/usb')
-rw-r--r--drivers/media/usb/stk1160/stk1160-video.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/media/usb/stk1160/stk1160-video.c b/drivers/media/usb/stk1160/stk1160-video.c
index 022092aab924..8bdfb0275313 100644
--- a/drivers/media/usb/stk1160/stk1160-video.c
+++ b/drivers/media/usb/stk1160/stk1160-video.c
@@ -462,8 +462,7 @@ int stk1160_alloc_isoc(struct stk1160 *dev)
462 urb = usb_alloc_urb(max_packets, GFP_KERNEL); 462 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
463 if (!urb) { 463 if (!urb) {
464 stk1160_err("cannot alloc urb[%d]\n", i); 464 stk1160_err("cannot alloc urb[%d]\n", i);
465 stk1160_uninit_isoc(dev); 465 goto free_i_bufs;
466 return -ENOMEM;
467 } 466 }
468 dev->isoc_ctl.urb[i] = urb; 467 dev->isoc_ctl.urb[i] = urb;
469 468
@@ -474,10 +473,9 @@ int stk1160_alloc_isoc(struct stk1160 *dev)
474 dev->isoc_ctl.transfer_buffer[i] = kmalloc(sb_size, GFP_KERNEL); 473 dev->isoc_ctl.transfer_buffer[i] = kmalloc(sb_size, GFP_KERNEL);
475#endif 474#endif
476 if (!dev->isoc_ctl.transfer_buffer[i]) { 475 if (!dev->isoc_ctl.transfer_buffer[i]) {
477 stk1160_err("cannot alloc %d bytes for tx buffer\n", 476 stk1160_err("cannot alloc %d bytes for tx[%d] buffer\n",
478 sb_size); 477 sb_size, i);
479 stk1160_uninit_isoc(dev); 478 goto free_i_bufs;
480 return -ENOMEM;
481 } 479 }
482 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size); 480 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
483 481
@@ -514,5 +512,11 @@ int stk1160_alloc_isoc(struct stk1160 *dev)
514 dev->isoc_ctl.num_bufs = num_bufs; 512 dev->isoc_ctl.num_bufs = num_bufs;
515 513
516 return 0; 514 return 0;
515
516free_i_bufs:
517 /* Save the allocated buffers so far, so we can properly free them */
518 dev->isoc_ctl.num_bufs = i+1;
519 stk1160_free_isoc(dev);
520 return -ENOMEM;
517} 521}
518 522