lkml.org 
[lkml]   [2006]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 04/26] USB: EHCI full speed ISO bugfixes

    This patch replaces the split ISO raw_mask calculation code in the
    iso_stream_init() function that computed incorrect numbers of high
    speed transactions for both input and output transfers.

    In the output case, it added a superfluous start-split transaction for
    all maxmimum packet sizes that are a multiple of 188.

    In the input case, it forgot to add complete-split transactions for all
    microframes covered by the full speed transaction, and the additional
    complete-split transaction needed for the case when full speed data
    starts arriving near the end of a microframe.

    These changes don't affect the lack of full speed bandwidth, but at
    least it removes the MMF errors that the HC raised with some input
    streams.

    Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
    Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/usb/host/ehci-sched.c | 11 ++++++-----
    1 file changed, 6 insertions(+), 5 deletions(-)

    --- linux-2.6.16.1.orig/drivers/usb/host/ehci-sched.c
    +++ linux-2.6.16.1/drivers/usb/host/ehci-sched.c
    @@ -707,6 +707,7 @@ iso_stream_init (
    } else {
    u32 addr;
    int think_time;
    + int hs_transfers;

    addr = dev->ttport << 24;
    if (!ehci_is_TDI(ehci)
    @@ -719,6 +720,7 @@ iso_stream_init (
    think_time = dev->tt ? dev->tt->think_time : 0;
    stream->tt_usecs = NS_TO_US (think_time + usb_calc_bus_time (
    dev->speed, is_input, 1, maxp));
    + hs_transfers = max (1u, (maxp + 187) / 188);
    if (is_input) {
    u32 tmp;

    @@ -727,12 +729,11 @@ iso_stream_init (
    stream->usecs = HS_USECS_ISO (1);
    stream->raw_mask = 1;

    - /* pessimistic c-mask */
    - tmp = usb_calc_bus_time (USB_SPEED_FULL, 1, 0, maxp)
    - / (125 * 1000);
    - stream->raw_mask |= 3 << (tmp + 9);
    + /* c-mask as specified in USB 2.0 11.18.4 3.c */
    + tmp = (1 << (hs_transfers + 2)) - 1;
    + stream->raw_mask |= tmp << (8 + 2);
    } else
    - stream->raw_mask = smask_out [maxp / 188];
    + stream->raw_mask = smask_out [hs_transfers - 1];
    bandwidth = stream->usecs + stream->c_usecs;
    bandwidth /= 1 << (interval + 2);

    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-04-05 02:03    [W:3.720 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site