Date: Sat, 9 Feb 2013 00:01:57 +0100 From: Hans Petter Selasky <hselasky@c2i.net> To: freebsd-usb@freebsd.org Cc: "aman.sawrup" <aman.sawrup@bluecoat.com> Subject: Re: Reading 1024 bytes from mass storage device using 3 frames gives USB_ERR_STALLED Message-ID: <201302090001.57258.hselasky@c2i.net> In-Reply-To: <1360360082956-5785167.post@n5.nabble.com> References: <1360360082956-5785167.post@n5.nabble.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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?201302090001.57258.hselasky>