V4L/DVB (11778): Siano: smsusb - lost buffers bug fix
authorUri Shkolnik <uris@siano-ms.com>
Tue, 12 May 2009 14:28:41 +0000 (11:28 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 22:14:27 +0000 (19:14 -0300)
This patch fixes a problem were protocol buffers
have been lost during USB disconnect events.

Signed-off-by: Uri Shkolnik <uris@siano-ms.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/siano/smsusb.c

index 1bcd0eff4b1655df7c35b876bafa89e7768cf3a6..4fa38bd83887be7049a3f90b0619d49f24ddddb8 100644 (file)
@@ -65,14 +65,14 @@ static void smsusb_onresponse(struct urb *urb)
        struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
        struct smsusb_device_t *dev = surb->dev;
 
-       if (urb->status < 0) {
-               sms_err("error, urb status %d, %d bytes",
+       if (urb->status == -ESHUTDOWN) {
+               sms_err("error, urb status %d (-ESHUTDOWN), %d bytes",
                        urb->status, urb->actual_length);
                return;
        }
 
-       if (urb->actual_length > 0) {
-               struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) surb->cb->p;
+       if ((urb->actual_length > 0) && (urb->status == 0)) {
+               struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)surb->cb->p;
 
                smsendian_handle_message_header(phdr);
                if (urb->actual_length >= phdr->msgLength) {
@@ -111,7 +111,10 @@ static void smsusb_onresponse(struct urb *urb)
                                "msglen %d actual %d",
                                phdr->msgLength, urb->actual_length);
                }
-       }
+       } else
+               sms_err("error, urb status %d, %d bytes",
+                       urb->status, urb->actual_length);
+
 
 exit_and_resubmit:
        smsusb_submit_urb(dev, surb);