Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Feb 2013 14:44:25 -0500
From:      Aman Sawrup <aman.sawrup@bluecoat.com>
To:        freebsd-usb@freebsd.org
Subject:   Re: Reading 1024 bytes from mass storage device using 3 frames gives USB_ERR_STALLED
Message-ID:  <51194A19.40203@bluecoat.com>
In-Reply-To: <201302090001.57258.hselasky@c2i.net>
References:  <1360360082956-5785167.post@n5.nabble.com> <201302090001.57258.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
   Hi Hans,
   I have a couple of questions about usbd_xfer_max_framelen() and
   usbd_xfer_max_len():
    1. You mentioned the frame length should be a multiple of
       usbd_xfer_max_framelen().  If there is only 1 frame in the
       transfer, is it okay if the frame length is less than
       usbd_xfer_max_framelen()? When I set the frame length to 8 bytes
       for SCSI OP Read Capacity, it works without error.  Similarly, when
       I set the frame length to 254 bytes for SCSI OP Inquiry, it also
       works without error.
    2. usbd_xfer_max_len() returns 131,072 bytes, which is the value of
       UMASS_BULK_SIZE.  I'm able to transfer 131,072 bytes, using only a
       single frame, without error.  You mentioned each frame in encoded
       in one or more USB packets with each packet size presumably being
       wMaxPacketSize (512 byte).  Does that mean the controller code
       (i.e. ehci.c) will split up the single 131,072 byte frame into 256
       USB packets, 512 bytes each packet?  I ask because I'm debugging an
       issue where the USB EHCI host controller does a DMA write into
       physical address 0.

   Thanks
   Aman

   On 02/08/2013 06:01 PM, Hans Petter Selasky wrote:

On Friday 08 February 2013 22:48:02 aman.sawrup wrote:

Hello,

We have ported the FreeBSD USB stack to my employers proprietary RTOS.  The
code was taken from the MAIN branch a little while after RELENG_8_BP tag
was created.

I'm trying to read data from the following mass storage device umass0:

ehci0: [FILTER+ITHREAD]
usbus0: EHCI version 1.0
usbus0: 480Mbps High Speed USB v2.0
ugen0.1: <Intel EHCI root HUB> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
uhub0: 2 ports with 2 removable, self powered
ugen0.2: <vendor 0x8087 product 0x0024> at usbus0
uhub1: <vendor 0x8087 product 0x0024, class 9/0, rev 2.00/0.00, addr 2> on
usbus0
uhub1: 8 ports with 8 removable, self powered
ugen0.3: <ATP Electronics ATP IG eUSB> at usbus0
umass0: <ATP Electronics ATP IG eUSB, class 0/0, rev 2.00/11.00, addr 3> on
usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x4800

Reading data one frame per transfer works.  For example, if I want to read
512 bytes that is physically contiguous and is placed in a single frame,
that works fine.

However, when attempting to read 1024 bytes, that is not physically
contiguous, using 3 frames for the same transfer, I get USB_ERR_STALLED.  I
have the frames setup as follows:
frame[0] = 200 bytes
frame[1] = 512 bytes
frame[2] = 312 bytes

Hi,

The frame lengths must be a multiple of the wMaxPacketSize (typically 64 or
512). Each frame is encoded like one or more USB packets independent of the
next one. I.E. USB packet data may not cross a frame. This is not supported by
the EHCI/OHCI and UHCI hardware, and the USB stack will not make a fixup
buffer for this. The USB stack returns the device independent multiplier
length for this purpose when calling usbd_xfer_max_framelen(). Only when
(frame[n] % usbd_xfer_max_framelen() == 0) it will work like you want.

--HPS



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