Johannes:

Here is a revised version of a patch I sent you earlier.

        It stores the status for a completed URB in urb rather than urbp.

        It avoids setting the status of unlinked URBs to -ECONNRESET,
        since the hcd glue layer already does that.

        It gives back unlinked URBs in the order they were unlinked.

        It renames uhci_remove_pending_qhs() to 
        uhci_remove_pending_urbps(), which is much more logical.

If this all looks okay, please let Greg know he should merge it.

Alan Stern


# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.1656  -> 1.1657 
#       drivers/usb/host/uhci-debug.c   1.9     -> 1.10   
#       drivers/usb/host/uhci-hcd.h     1.13    -> 1.14   
#       drivers/usb/host/uhci-hcd.c     1.57    -> 1.58   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/08/04      [EMAIL PROTECTED]       1.1657
# Remove urbp->status, use urb->status instead.
# Don't set urb->status for unlinked urbs.
# Giveback unlinked urbs in FIFO order.
# Rename uhci_remove_pending_qhs() to uhci_remove_pending_urbps().
# --------------------------------------------
#
diff -Nru a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c
--- a/drivers/usb/host/uhci-debug.c     Mon Aug  4 12:17:13 2003
+++ b/drivers/usb/host/uhci-debug.c     Mon Aug  4 12:17:13 2003
@@ -320,8 +320,8 @@
        out += sprintf(out, "%s", (urbp->fsbr ? "FSBR " : ""));
        out += sprintf(out, "%s", (urbp->fsbr_timeout ? "FSBR_TO " : ""));
 
-       if (urbp->status != -EINPROGRESS)
-               out += sprintf(out, "Status=%d ", urbp->status);
+       if (urbp->urb->status != -EINPROGRESS)
+               out += sprintf(out, "Status=%d ", urbp->urb->status);
        //out += sprintf(out, "Inserttime=%lx ",urbp->inserttime);
        //out += sprintf(out, "FSBRtime=%lx ",urbp->fsbrtime);
 
diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
--- a/drivers/usb/host/uhci-hcd.c       Mon Aug  4 12:17:13 2003
+++ b/drivers/usb/host/uhci-hcd.c       Mon Aug  4 12:17:13 2003
@@ -1534,11 +1534,11 @@
                break;
        }
 
-       urbp->status = ret;
-
        if (ret == -EINPROGRESS)
                goto out;
 
+       urb->status = ret;
+
        switch (usb_pipetype(urb->pipe)) {
        case PIPE_CONTROL:
        case PIPE_BULK:
@@ -1641,10 +1641,8 @@
 
        /* If this is an interrupt URB that is being killed in urb->complete, */
        /* then just set its status and return */
-       if (!urbp) {
-         urb->status = -ECONNRESET;
-         return 0;
-       }
+       if (!urbp)
+               return 0;
 
        spin_lock_irqsave(&uhci->urb_list_lock, flags);
 
@@ -1657,7 +1655,7 @@
        /* If we're the first, set the next interrupt bit */
        if (list_empty(&uhci->urb_remove_list))
                uhci_set_next_interrupt(uhci);
-       list_add(&urbp->urb_list, &uhci->urb_remove_list);
+       list_add_tail(&urbp->urb_list, &uhci->urb_remove_list);
 
        spin_unlock(&uhci->urb_remove_list_lock);
        spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
@@ -1803,17 +1801,11 @@
 
 static void uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs 
*regs)
 {
-       struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
        struct uhci_hcd *uhci = hcd_to_uhci(hcd);
-       int status;
        unsigned long flags;
 
        spin_lock_irqsave(&urb->lock, flags);
-       status = urbp->status;
        uhci_destroy_urb_priv(uhci, urb);
-
-       if (urb->status != -ENOENT && urb->status != -ECONNRESET)
-               urb->status = status;
        spin_unlock_irqrestore(&urb->lock, flags);
 
        usb_hcd_giveback_urb(hcd, urb, regs);
@@ -1844,7 +1836,7 @@
        spin_unlock_irqrestore(&uhci->complete_list_lock, flags);
 }
 
-static void uhci_remove_pending_qhs(struct uhci_hcd *uhci)
+static void uhci_remove_pending_urbps(struct uhci_hcd *uhci)
 {
        struct list_head *tmp, *head;
        unsigned long flags;
@@ -1859,9 +1851,6 @@
                tmp = tmp->next;
 
                list_del_init(&urbp->urb_list);
-
-               urbp->status = urb->status = -ECONNRESET;
-
                uhci_add_complete(uhci, urb);
        }
        spin_unlock_irqrestore(&uhci->urb_remove_list_lock, flags);
@@ -1899,7 +1888,7 @@
 
        uhci_free_pending_qhs(uhci);
 
-       uhci_remove_pending_qhs(uhci);
+       uhci_remove_pending_urbps(uhci);
 
        uhci_clear_next_interrupt(uhci);
 
@@ -2412,7 +2401,7 @@
         * to this bus since there are no more parents
         */
        uhci_free_pending_qhs(uhci);
-       uhci_remove_pending_qhs(uhci);
+       uhci_remove_pending_urbps(uhci);
 
        reset_hc(uhci);
 
diff -Nru a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h
--- a/drivers/usb/host/uhci-hcd.h       Mon Aug  4 12:17:13 2003
+++ b/drivers/usb/host/uhci-hcd.h       Mon Aug  4 12:17:13 2003
@@ -379,8 +379,6 @@
                                        /*  a control transfer, retrigger */
                                        /*  the status phase */
 
-       int status;                     /* Final status */
-
        unsigned long inserttime;       /* In jiffies */
        unsigned long fsbrtime;         /* In jiffies */
 



-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to