Dear Russell:

I have a favour to ask of you. I need the following patch to be applied
to the USB core:

diff -urpN -X dontdiff linux-2.6.11-rc1-bk4/drivers/usb/core/hcd.c 
linux-2.6.11-rc1-bk4-lem/drivers/usb/core/hcd.c
--- linux-2.6.11-rc1-bk4/drivers/usb/core/hcd.c 2005-01-12 16:35:53.000000000 
-0800
+++ linux-2.6.11-rc1-bk4-lem/drivers/usb/core/hcd.c     2005-01-17 
21:38:51.000000000 -0800
@@ -1099,14 +1104,12 @@ static int hcd_submit_urb (struct urb *u
        urb = usb_get_urb (urb);
        atomic_inc (&urb->use_count);
 
-       if (urb->dev == hcd->self.root_hub) {
+       if (usb_pipedevice(urb->pipe) == 1) {
                /* NOTE:  requirement on hub callers (usbfs and the hub
                 * driver, for now) that URBs' urb->transfer_buffer be
                 * valid and usb_buffer_{sync,unmap}() not be needed, since
                 * they could clobber root hub response data.
                 */
-               urb->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
-                                       | URB_NO_SETUP_DMA_MAP);
                status = rh_urb_enqueue (hcd, urb);
                goto done;
        }
@@ -1168,7 +1171,7 @@ unlink1 (struct usb_hcd *hcd, struct urb
 {
        int             value;
 
-       if (urb->dev == hcd->self.root_hub)
+       if (usb_pipedevice(urb->pipe) == 1)
                value = usb_rh_urb_dequeue (hcd, urb);
        else {
 
@@ -1258,7 +1261,7 @@ static int hcd_unlink_urb (struct urb *u
         * finish unlinking the initial failed usb_set_address()
         * or device descriptor fetch.
         */
-       if (!hcd->saw_irq && hcd->self.root_hub != urb->dev) {
+       if (!hcd->saw_irq && usb_pipedevice(urb->pipe) != 1) {
                dev_warn (hcd->self.controller, "Unlink after no-IRQ?  "
                        "Controller is probably using the wrong IRQ."
                        "\n");
@@ -1465,12 +1468,8 @@ void usb_hcd_giveback_urb (struct usb_hc
 {
        urb_unlink (urb);
 
-       // NOTE:  a generic device/urb monitoring hook would go here.
-       // hcd_monitor_hook(MONITOR_URB_FINISH, urb, dev)
-       // It would catch exit/unlink paths for all urbs.
-
        /* lower level hcd code should use *_dma exclusively */
-       if (hcd->self.controller->dma_mask) {
+       if (hcd->self.controller->dma_mask && usb_pipedevice(urb->pipe) != 1) {
                if (usb_pipecontrol (urb->pipe)
                        && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
                        dma_unmap_single (hcd->self.controller, urb->setup_dma,

However, David objects to the patch on the grounds that it can damage ARM.
I am sure that what I do matches perfectly what ARM needs, based on this:
 
http://www.kernel.org/pub/linux/kernel/people/gregkh/usb/2.5/usb-core-2-2.5.33.patch

#    This was first noticed on ARM (no surprises here); the root hub
#    code, rh_call_control(), placed data into the buffer and then
#    called usb_hcd_giveback_urb().  This function called
#    pci_unmap_single() on this region which promptly destroyed the
#    data that rh_call_control() had placed there.  This lead to a
#    corrupted device descriptor and the "too many configurations"
#    message.

So, it would help me a lot if you tested the patch on a system with SA-1111
against a regression and thus buried this silly ARM canard decisively.

Please let me know if you have time to help me out.

Thank you,
-- Pete
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to