Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Feb 2013 13:48:02 -0800 (PST)
From:      "aman.sawrup" <aman.sawrup@bluecoat.com>
To:        freebsd-usb@freebsd.org
Subject:   Reading 1024 bytes from mass storage device using 3 frames gives USB_ERR_STALLED
Message-ID:  <1360360082956-5785167.post@n5.nabble.com>

next in thread | raw e-mail | index | archive | help
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

Here's what my code looks like to do this:

usb_frcount_t frindex = 0;                                                                                                                         
                                                                                                                                                               
for ( Storage::Byte_device::Scatter_gather *sg_entry =
scb->SC_SG_List->In_progress_SGs(); sg_entry; sg_entry=sg_entry->SG_Link )                  
{                                                                                                                                                  
    usbd_xfer_set_frame_data( xfer, frindex++, reinterpret_cast<void
*>(sg_entry->SG_Virtual_address), sg_entry->SG_Length );                      
}                                                                                                                                                  
                                                                                                                                                               
usbd_xfer_set_frames(xfer, frindex);                                                                                                               
usbd_transfer_submit(xfer);                                                                                                                        

Note, in usbd_transfer_setup, I have set the maximum number of frames to 128
for this transfer (UMASS_T_BBB_DATA_READ). 

Question: Is it possible to transfer 1024 bytes using the method described
above?

Thanks
Aman




--
View this message in context: http://freebsd.1045724.n5.nabble.com/Reading-1024-bytes-from-mass-storage-device-using-3-frames-gives-USB-ERR-STALLED-tp5785167.html
Sent from the freebsd-usb mailing list archive at Nabble.com.



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