aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2009-10-23 05:56:06 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-12-05 15:40:47 -0500
commitbf926adfbbb36876396511f1bdc78f73dc596e21 (patch)
tree336ef7ba4f68af52f3cc45b87e33a26d4f3451c2 /drivers/media/video
parent21f1b932dbcc5ed18444e6995aeb856e583804ae (diff)
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>
Diffstat (limited to 'drivers/media/video')
-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 ebaa2425fb5..3298e33c782 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,
138 if (!gspca_dev->frozen) 138 if (!gspca_dev->frozen)
139#endif 139#endif
140 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status); 140 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
141 return; 141 goto resubmit;
142 } 142 }
143 pkt_scan = gspca_dev->sd_desc->pkt_scan; 143 pkt_scan = gspca_dev->sd_desc->pkt_scan;
144 for (i = 0; i < urb->number_of_packets; i++) { 144 for (i = 0; i < urb->number_of_packets; i++) {
@@ -174,6 +174,7 @@ static void fill_frame(struct gspca_dev *gspca_dev,
174 pkt_scan(gspca_dev, frame, data, len); 174 pkt_scan(gspca_dev, frame, data, len);
175 } 175 }
176 176
177resubmit:
177 /* resubmit the URB */ 178 /* resubmit the URB */
178 st = usb_submit_urb(urb, GFP_ATOMIC); 179 st = usb_submit_urb(urb, GFP_ATOMIC);
179 if (st < 0) 180 if (st < 0)
@@ -220,7 +221,7 @@ static void bulk_irq(struct urb *urb)
220 if (!gspca_dev->frozen) 221 if (!gspca_dev->frozen)
221#endif 222#endif
222 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status); 223 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
223 return; 224 goto resubmit;
224 } 225 }
225 226
226 /* check the availability of the frame buffer */ 227 /* check the availability of the frame buffer */
@@ -235,6 +236,7 @@ static void bulk_irq(struct urb *urb)
235 urb->actual_length); 236 urb->actual_length);
236 } 237 }
237 238
239resubmit:
238 /* resubmit the URB */ 240 /* resubmit the URB */
239 if (gspca_dev->cam.bulk_nurbs != 0) { 241 if (gspca_dev->cam.bulk_nurbs != 0) {
240 st = usb_submit_urb(urb, GFP_ATOMIC); 242 st = usb_submit_urb(urb, GFP_ATOMIC);