lkml.org 
[lkml]   [2009]   [Aug]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 2/6] gigaset: handle isoc frame errors more gracefully
    Date
    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>
    ---
    drivers/isdn/gigaset/bas-gigaset.c | 18 +++++++-----------
    1 files changed, 7 insertions(+), 11 deletions(-)

    diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
    index 781c404..9e7108a 100644
    --- a/drivers/isdn/gigaset/bas-gigaset.c
    +++ b/drivers/isdn/gigaset/bas-gigaset.c
    @@ -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++) {
    - 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,
    - "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));
    - 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);
    - break;
    - }
    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)) {
    @@ -1361,7 +1357,7 @@ static void read_iso_tasklet(unsigned long data)
    "offset (%d) + numbytes (%d) "
    "> BAS_INBUFSIZE\n",
    frame, offset, numbytes);
    - break;
    + numbytes = BAS_INBUFSIZE - offset;
    }
    gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
    totleft -= numbytes;
    --
    1.6.2.1.214.ge986c


    \
     
     \ /
      Last update: 2009-08-21 19:27    [W:2.541 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site