Hi,all I'm writing a linux usb driver for our data sampling board which transmit data with usb bus. I didn't write a host usb driver under linux before. I need to send some vendor request to the board to tell it how to work. Such as , when some one open the device , the driver need to tell board to start sample.I write the open method like this:
struct usb_ctrlrequest start_ad_convert_quest = { .bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, .bRequest = AD_BREQUEST_START_CONVERT, .wValue = 0, .wIndex = 0, .wLength = 0, }; static int ad_open(struct inode *inode, struct file *file) { [snip] if(0 == dev->started){ ctrl_urb = usb_alloc_urb(0, GFP_KERNEL); if(NULL == ctrl_urb){ retval = -ENOMEM; goto exit; } usb_fill_control_urb(ctrl_urb, dev->udev, usb_sndctrlpipe(dev->udev, 0), (unsigned char*)&start_ad_convert_quest, NULL, 0, ctrl_urb_finish, dev); retval = usb_submit_urb (ctrl_urb, GFP_KERNEL); if (0 > retval){ ERROR("Can't submit start_convert request\n"); } } [snip] } static void ctrl_urb_finish(struct urb* ctrl_urb, struct pt_regs *reg) { [snip] if(0 != ctrl_urb->status){ ERROR("Start convert request hasn't been sent successfully:%d\n", ctrl_urb->status); goto exit; } [snip] exit: usb_free_urb(ctrl_urb); } If I do like the above , I will always get ctrl_urb->status = -32(-EPIPE),and I can only open the device node once .When I open the node the second time , the HDD led indicate that harddisk is busy, no output of printk,after about one minute later ,the host desktop is dead ,no response, I have to reboot it.I try to change the memory allocating flags from GFP_KERNEL to GFP_NOIO or GFP_ATOMIC, the result is same. But if I don't use urb directly, ie, using : usb_control_msg(dev->udev,usb_sndctrlpipe(dev->udev, 0),AD_BREQUEST_START_CONVERT,USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,0,0,NULL,0,1000); It works fine , every thing is right. What's the possible reason?Any advices are welcome. Thanks Regards twomol 3.22 ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel