Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Sep 2005 13:27:42 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        jpandrusky@gmail.com, freebsd-usb@freebsd.org
Subject:   Re: Problems with uhid device.
Message-ID:  <200509041327.45054.hselasky@c2i.net>
In-Reply-To: <1125777448.9511.7.camel@localhost>
References:  <d849f17e05082307553f67f0ce@mail.gmail.com> <200508261423.46583.hselasky@c2i.net> <1125777448.9511.7.camel@localhost>

next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday 03 September 2005 21:57, John-Paul Andrusky wrote:
> Hi,
>
> Sorry for the long silence. I tried both of the alternatives below with
> no success with either (does exactly the same thing). I've tried to
> isolate the dmesg with hw.usb.uhci.debug=15 (please see bellow). As for
> the version of FreeBSD (I guess I should have mentioned it before), I'm
> running STABLE.
>

> Sep  3 07:58:52 sol kernel: uhci_non_isoc_done: xfer=0xc1cf7800
> pipe=0xc1a8717c transfer done
> Sep  3 07:58:52 sol kernel: uhci_dump_td: TD(0xc1cf79e0) at 1802b9e4 =
> link=0x1802ba04 status=0x1c000004 token=0x00817c69 buffer=0x1802b9d0
> Sep  3 07:58:52 sol kernel: uhci_dump_td: 1802ba04<VF>
> 1c000004<LS>,errcnt=3,actlen=5 pid=69,addr=124,endpt=2,D=0,maxlen=5
> Sep  3 07:58:52 sol kernel: uhci_dump_td: TD(0xc1cf7a00) at 1802ba04 =
> link=0x00000001 status=0x1d500000 token=0x00097c69 buffer=0x1802b9d5
> Sep  3 07:58:52 sol kernel: uhci_dump_td: 1<T>
> 1d500000<BABBLE,STALLED,IOC,LS>,errcnt=3,actlen=1
> pid=69,addr=124,endpt=2,D=1,maxlen=1

I think the problem here is that the uhid driver sets up a too large packet 
for the interrupt endpoint. The above shows that the first packet is 5 bytes 
and the last packet is 1 byte, which makes up the 6 bytes of the interrupt 
structure.

The size of the interrupt packet comes from the function: "hid_report_size()".
"cat /sys/dev/usb/*hid* | more"

        if (id != 0) {
                size += 8;
                       ^^^ maybe this is wrong, hence we are already 
                           adding 7 to the size below ?

                *idp = id;      /* XXX wrong */
        } else
                *idp = 0;
        return ((size + 7) / 8);

A temporary patch might be to add something to the file "/sys/dev/usb/uhid.c"

Where you find:

        sc->sc_isize = hid_report_size(desc, size, hid_input,   &sc->sc_iid);
        sc->sc_osize = hid_report_size(desc, size, hid_output,  &sc->sc_oid);
        sc->sc_fsize = hid_report_size(desc, size, hid_feature, &sc->sc_fid);

Add here:
        if(sc->sc_isize > ed->wMaxPacketSize)
          sc->sc_isize = ed->wMaxPacketSize;

Then try again. You should now only see a single interrupt packet with 
"maxlen=5".

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509041327.45054.hselasky>