Hi, linux-usb-devel is the better place for these types of questions, but I'll give it a go...
On Thu, Dec 20, 2001 at 10:18:08PM -0800, Angderson, Charyll wrote: > i expect that the bulk data read on the wire would be the same data in > "buf". i see different data on the wire than that returned by "buf" 50% of > the time. > > isoc reads seem to be consistent. and both isoc/bulk writes are correct. i > only have one "buf". i've tried making "buf" a static pointer: static WORD > * buf; What's a "WORD" size? Any reason you aren't using "unsigned char"? > and when ever user wants to do transfers i have to read the "size" > they pass in and do a "kmalloc" for "buf". after each transaction "buf" is > freed. but definitely not until transaction is done. > > i even have a print statement right after transaction completes (see below) > and it proves that "buf" is bad. > > anyone have any ideas? snippet of my code is below. > > thanks, > -charyll angderson > > int usbx_submit_trans(struct usbxDevice *usbxPtr, struct usb_device *dev, > struct _Transaction *trans, WORD *buf) > { > int i,j,k; > usbx_show_trans(trans); > > switch(trans->type) { > case USBX_R_BULK: > FILL_BULK_URB(usbxPtr->usbx_urb, dev, usb_rcvbulkpipe(dev, > trans->endpoint), > buf, trans->size, usbx_urb_complete, usbxPtr); > break; > default: > dbg("invaid trans type!"); > break; > } > > usbx_submit_urb(usbxPtr->usbx_urb); > interruptible_sleep_on_timeout(&(usbxPtr->wait), trans->timeout); Does your callback wake up your "wait"? > if (usbxPtr->usbx_urb->status!=0) { > err("TIMEOUT awoken %i (%s) > status=0x%x",current->pid,current->comm,usbxPtr->usbx_urb->status); //ca > debug > usbx_unlink_urb(usbxPtr->usbx_urb); // remove urb safely I recommend unlinking in your callback, much easier. > } > > switch (trans->type) { > case USBX_R_BULK: > dbg("usbx_submit_trans: print buffer read .. > address=0x%lx", (DWORD)&buf); > for (i=0; i<(trans->size/2); i++) { > dbg(" %x ",(WORD)buf[i]); You should use the urb->actual_length field here. That tells you how many bytes you received (which can be different from what you requested). Also, what's with the "size/2" stuff? We are transferring bytes here :) If you want to do a bulk read that blocks until completed (or timed out) there already is a usb core function that does it called usb_bulk_msg() keeping you from having to roll your own. Hope this helps, greg k-h _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-users