Replying to my own post ... I've found a way to make my code work without having to deallocate / reallocate the urb.
It seems that after a successful call, urb->dev is getting set to 0. In my write_callback routine I simply re-set urb->dev to its correct value (which is stored in the private device structure) and the subsequent calls using that urb are fine. I haven't found anything in my code that could be stepping on it, but I guess I'm not quite ready to rule that possibility out yet either. On Tue, 2003-11-11 at 15:59, Henry Culver wrote: > On Tue, 2003-11-11 at 15:23, Alan Stern wrote: > > On Tue, 11 Nov 2003, Henry Culver wrote: > > > > > I am in the process of writing a device driver for a device which is a > > > combination vacuum flourescent display and ir receiver. The driver is > > > functional, but has some problems. > > > > > > The device has a single configuration, and single interface with 2 endpoints. > > > The endpoints are transfer type "interrupt". > > > > > > My open routine allocates 2 urb's (one for each endpoint, in and out) and > > > fills them with usb_fill_int_urb. I have an "in" callback routine and an > > > "out" callback routine. > > > > > > I can read ir byte codes from the device and write characters to the display > > > including control codes which position subsequent character writes, clear > > > the display and set brightness. > > > > > > My problem is that I cannot seem to reuse the out urb. When my write_callback > > > routine is called, the urb->status is 0, but another write to the device > > > blocks and the urb->status is thereafter -EINPROGRESS. If in my callback > > > routine I usb_unlink_urb, usb_free_urb and then usb_alloc_urb(0) and > > > re-initialize the structure, everything behaves correctly. > > > > I don't understand. What do you mean "another write to the device > > blocks"? If the write blocked, how would you know what urb->status was > > afterwards? -- your machine would be locked up. After submission, > > usb->status is _supposed_ to be -EINPROGRESS; it stays that value more or > > less until it has completed. > > Sorry for the missing details. It's linux-2.4.21. When I say it blocks > I mean that I call interruptible_sleep_on in the write routine and > wake_up in the write_callback routine. If I remove the > interruptible_sleep_on, the write never seems to finish (the status > never changes from EINPROGRESS and the data never appears on the > display). That is to say, the write_callback doesn't get called > for the 2nd write. As near as I can tell the 2nd urb is never > finishing. > > My next step I guess is to printk the various fields in the urb and see > exactly how a new urb is different from a used one. > > > > > > After each successful write, I have to release and then re-allocate the > > > out urb. Shouldn't I be able to reuse it? If so, does anyone have any > > > helpful hints as to what might be going on here? > > > > You certainly should be able to reuse it. What version of Linux and which > > host controller driver are you using? If you aren't using 2.6, try it out > > and see if it works any better. > > > > Alan Stern > > > > Thanks, > -Henry Culver > -Culver Consulting > > > > > ------------------------------------------------------- > This SF.Net email sponsored by: ApacheCon 2003, > 16-19 November in Las Vegas. Learn firsthand the latest > developments in Apache, PHP, Perl, XML, Java, MySQL, > WebDAV, and more! http://www.apachecon.com/ > _______________________________________________ > [EMAIL PROTECTED] > To unsubscribe, use the last form field at: > https://lists.sourceforge.net/lists/listinfo/linux-usb-devel ------------------------------------------------------- This SF.Net email sponsored by: ApacheCon 2003, 16-19 November in Las Vegas. Learn firsthand the latest developments in Apache, PHP, Perl, XML, Java, MySQL, WebDAV, and more! http://www.apachecon.com/ _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel