]> nv-tegra.nvidia Code Review - linux-2.6.git/commitdiff
gigaset: handle isoc frame errors more gracefully
authorTilman Schmidt <tilman@imap.cc>
Tue, 6 Oct 2009 12:18:36 +0000 (12:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Oct 2009 05:20:59 +0000 (22:20 -0700)
Don't drop the remainder of an URB if an isochronous frame has an error.

Impact: error handling improvement
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/isdn/gigaset/bas-gigaset.c

index 781c4041f7b0d1a856b2be280126d89e0adf55e2..9e7108a3109b77c295d5b4565b237b3c2489f1ed 100644 (file)
@@ -1331,28 +1331,24 @@ static void read_iso_tasklet(unsigned long data)
                rcvbuf = urb->transfer_buffer;
                totleft = urb->actual_length;
                for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) {
                rcvbuf = urb->transfer_buffer;
                totleft = urb->actual_length;
                for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) {
-                       if (unlikely(urb->iso_frame_desc[frame].status)) {
+                       numbytes = urb->iso_frame_desc[frame].actual_length;
+                       if (unlikely(urb->iso_frame_desc[frame].status))
                                dev_warn(cs->dev,
                                dev_warn(cs->dev,
-                                        "isochronous read: frame %d: %s\n",
-                                        frame,
+                                        "isochronous read: frame %d[%d]: %s\n",
+                                        frame, numbytes,
                                         get_usb_statmsg(
                                            urb->iso_frame_desc[frame].status));
                                         get_usb_statmsg(
                                            urb->iso_frame_desc[frame].status));
-                               break;
-                       }
-                       numbytes = urb->iso_frame_desc[frame].actual_length;
-                       if (unlikely(numbytes > BAS_MAXFRAME)) {
+                       if (unlikely(numbytes > BAS_MAXFRAME))
                                dev_warn(cs->dev,
                                         "isochronous read: frame %d: "
                                         "numbytes (%d) > BAS_MAXFRAME\n",
                                         frame, numbytes);
                                dev_warn(cs->dev,
                                         "isochronous read: frame %d: "
                                         "numbytes (%d) > BAS_MAXFRAME\n",
                                         frame, numbytes);
-                               break;
-                       }
                        if (unlikely(numbytes > totleft)) {
                                dev_warn(cs->dev,
                                         "isochronous read: frame %d: "
                                         "numbytes (%d) > totleft (%d)\n",
                                         frame, numbytes, totleft);
                        if (unlikely(numbytes > totleft)) {
                                dev_warn(cs->dev,
                                         "isochronous read: frame %d: "
                                         "numbytes (%d) > totleft (%d)\n",
                                         frame, numbytes, totleft);
-                               break;
+                               numbytes = totleft;
                        }
                        offset = urb->iso_frame_desc[frame].offset;
                        if (unlikely(offset + numbytes > BAS_INBUFSIZE)) {
                        }
                        offset = urb->iso_frame_desc[frame].offset;
                        if (unlikely(offset + numbytes > BAS_INBUFSIZE)) {
@@ -1361,7 +1357,7 @@ static void read_iso_tasklet(unsigned long data)
                                         "offset (%d) + numbytes (%d) "
                                         "> BAS_INBUFSIZE\n",
                                         frame, offset, numbytes);
                                         "offset (%d) + numbytes (%d) "
                                         "> BAS_INBUFSIZE\n",
                                         frame, offset, numbytes);
-                               break;
+                               numbytes = BAS_INBUFSIZE - offset;
                        }
                        gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
                        totleft -= numbytes;
                        }
                        gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
                        totleft -= numbytes;