summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2009-10-23 06:56:06 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-12-05 18:40:47 -0200
commitbf926adfbbb36876396511f1bdc78f73dc596e21 (patch)
tree336ef7ba4f68af52f3cc45b87e33a26d4f3451c2
parent21f1b932dbcc5ed18444e6995aeb856e583804ae (diff)
downloadop-kernel-dev-bf926adfbbb36876396511f1bdc78f73dc596e21.zip
op-kernel-dev-bf926adfbbb36876396511f1bdc78f73dc596e21.tar.gz
V4L/DVB (13184): gspca: Don't forget to resubmit URB's in case of an error
The gscpa core was not resubmitting URB's when the URB status was an error, this means we will loose URB's (potentially all stopping the stream) in case of sporadic USB issues. I've seen this with an Aiptek stv0680 based PenCam connected through an USB 2.0 hub. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/gspca/gspca.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c
index ebaa242..3298e33 100644
--- a/drivers/media/video/gspca/gspca.c
+++ b/drivers/media/video/gspca/gspca.c
@@ -138,7 +138,7 @@ static void fill_frame(struct gspca_dev *gspca_dev,
if (!gspca_dev->frozen)
#endif
PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
- return;
+ goto resubmit;
}
pkt_scan = gspca_dev->sd_desc->pkt_scan;
for (i = 0; i < urb->number_of_packets; i++) {
@@ -174,6 +174,7 @@ static void fill_frame(struct gspca_dev *gspca_dev,
pkt_scan(gspca_dev, frame, data, len);
}
+resubmit:
/* resubmit the URB */
st = usb_submit_urb(urb, GFP_ATOMIC);
if (st < 0)
@@ -220,7 +221,7 @@ static void bulk_irq(struct urb *urb)
if (!gspca_dev->frozen)
#endif
PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
- return;
+ goto resubmit;
}
/* check the availability of the frame buffer */
@@ -235,6 +236,7 @@ static void bulk_irq(struct urb *urb)
urb->actual_length);
}
+resubmit:
/* resubmit the URB */
if (gspca_dev->cam.bulk_nurbs != 0) {
st = usb_submit_urb(urb, GFP_ATOMIC);
OpenPOWER on IntegriCloud