Hi,
I don't know who I'm supposed to contact but I think I found a problem
somewhere in the kernel 2.4.31.
Let me explain why. I was writing a USB 2.0 driver for a asynchronous
scanner, i.e, paper can be fed through the scanner at any time (similar to
a lottery scanner or ATM). This scanner, developed by PDI, has three bulk
endpoints and no interrupt endpoint. One endpoint is for sending commands,
such as DPI, color, .... One other endpoint is used to retrieve the image
data as soon is the image is fed through the scanner while the other
endpoint while the other endpoint is used by the scanner to send any other
significant data. The scanner driver I developed was initially developed on
the kernel 2.6.11 and everything functioned properly. However, when one of
the company's customer indicated that they need this driver to work on
Slackware 10.2 with kernel 2.4.31, I had to port this driver for that
kernel. The driver is ported and works properly in normal circumstances.
However, when I remove the USB cable from the scanner, it is impossible to
reconnect to that scanner until the next reboot. Naturally, I thought that
I had a bug in the driver and I started investigating. I found that kernel
was looping forever in the following module:
static void ehci_free_config (struct usb_hcd *hcd, struct usb_device
*udev)
and more specifically in
f (qh->qh_state == QH_STATE_LINKED)
art_unlink_async (ehci, qh);
while (qh->qh_state != QH_STATE_IDLE
&& ehci->hcd.state != USB_STATE_HALT) {
spin_unlock_irqrestore (&ehci->lock, flags);
wait_ms (1);
spin_lock_irqsave (&ehci->lock, flags);
}
qh->qh_state value remains at the value 2 and
ehci->hcd.state remains at the value 1
and that is why I can never reconnect to my driver when I reconnect the USB
cable.
Now, I was at a loss. I changed my scanner_probe function and added the
following instructions at the end of the probe functions (Those code lines
are normally located in my scanner_open function). Since this is a
asynchronous scanner, I need to setup a callback for both scanner bulk
endpoints that can send data at any time. When I added those lines to the
code, I noticed the same hanging behavior after I disconnected the USB
cable from the scanner. However, when I only submit one endpoint urb, then
everything works except for the fact that I lose all the data from one of
my endpoints and is naturally not acceptable. Since this driver really does
not execute any extra code, I must consider this a defect for the 2.4.31
kernel. Naturally, the unlinking of the urb/s happen in the scanner
disconnect function and that is where the anomaly manifests itself.
// Fill img_urb and Submit it
FILL_BULK_URB(dev->img_urb, dev->udev,
usb_rcvbulkpipe(dev->udev,
dev->img_in_ep_addr),
dev->img_in_buffer, dev->img_in_bufsize,
image_callback_fun, dev);
usb_submit_urb (dev->img_urb);
// Fill cmd_urb and Submit it
FILL_BULK_URB(dev->cmd_urb, dev->udev,
usb_rcvbulkpipe(dev->udev,
dev->cmd_in_ep_addr),
dev->cmd_in_buffer, dev->cmd_in_bufsize,
command_callback_fun, dev);
usb_submit_urb (dev->cmd_urb);
I found some sample code for other USB scanner drivers, but most scanner
drivers have a synchronous behavior, i.e. you send a command to the scanner
and it responds.
I hope that you are the correct person to report this problem because I'm
at a total loss on how to proceed next. I know PDI wants this driver to
work for this kernel since their customer had some special drivers
developed for this kernel and they cannot (or will not) upgrade to the 2.6
kernel
If you are not the person I need to report this problem to, can you tell
where I have to report this anomaly.
Regards,
Arsene
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-users