This patch (as926) replaces urb->status with urb->core_status, in an
attempt to help prevent drivers from abusing the API by polling
urb->status.  The original field remains for use by drivers, but it
isn't set until an URB is about to be handed to its completion
routine.

Signed-off-by: Alan Stern <[EMAIL PROTECTED]>

---

On Fri, 8 Jun 2007, Greg KH wrote:

> > Tell you what -- I'll update the host controller drivers to remove
> > them as an obstacle.  However I don't currently feel up to modifying
> > the signatures for all the USB completion routines in the kernel;   
> > someone else will have to do that.
> 
> Ok, fair enough, I'll handle that mess, I like that kind of thing :)

Here it is, little more than a search-and-replace.  Of course, the 
trick lies in knowing where to search and what that "little more" needs 
to be!

Alan Stern


Index: usb-2.6/drivers/usb/core/hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/core/hcd.c
+++ usb-2.6/drivers/usb/core/hcd.c
@@ -520,8 +520,8 @@ error:
        /* any errors get returned through the urb completion */
        local_irq_save (flags);
        spin_lock (&urb->lock);
-       if (urb->status == -EINPROGRESS)
-               urb->status = status;
+       if (urb->core_status == -EINPROGRESS)
+               urb->core_status = status;
        spin_unlock (&urb->lock);
        usb_hcd_giveback_urb (hcd, urb);
        local_irq_restore (flags);
@@ -559,10 +559,10 @@ void usb_hcd_poll_rh_status(struct usb_h
                urb = hcd->status_urb;
                if (urb) {
                        spin_lock(&urb->lock);
-                       if (urb->status == -EINPROGRESS) {
+                       if (urb->core_status == -EINPROGRESS) {
                                hcd->poll_pending = 0;
                                hcd->status_urb = NULL;
-                               urb->status = 0;
+                               urb->core_status = 0;
                                urb->hcpriv = NULL;
                                urb->actual_length = length;
                                memcpy(urb->transfer_buffer, buffer, length);
@@ -606,8 +606,8 @@ static int rh_queue_status (struct usb_h
        int             len = 1 + (urb->dev->maxchild / 8);
 
        spin_lock_irqsave (&hcd_root_hub_lock, flags);
-       if (urb->status != -EINPROGRESS)        /* already unlinked */
-               retval = urb->status;
+       if (urb->core_status != -EINPROGRESS)   /* already unlinked */
+               retval = urb->core_status;
        else if (hcd->status_urb || urb->transfer_buffer_length < len) {
                dev_dbg (hcd->self.controller, "not queuing rh status urb\n");
                retval = -EINVAL;
@@ -934,8 +934,8 @@ int usb_hcd_submit_urb (struct urb *urb,
 
        /*
         * Atomically queue the urb,  first to our records, then to the HCD.
-        * Access to urb->status is controlled by urb->lock ... changes on
-        * i/o completion (normal or fault) or unlinking.
+        * Access to urb->core_status is controlled by urb->lock ... changes
+        * on I/O completion (normal or fault) or unlinking.
         */
 
        // FIXME:  verify that quiescing hc works right (RH cleans up)
@@ -950,6 +950,7 @@ int usb_hcd_submit_urb (struct urb *urb,
        else switch (hcd->state) {
        case HC_STATE_RUNNING:
        case HC_STATE_RESUMING:
+               urb->core_status = -EINPROGRESS;
                list_add_tail (&urb->urb_list, &ep->urb_list);
                status = 0;
                break;
@@ -1081,7 +1082,7 @@ int usb_hcd_unlink_urb (struct urb *urb,
                return -ENODEV;
 
        /*
-        * we contend for urb->status with the hcd core,
+        * we contend for urb->core_status with the hcd core,
         * which changes it while returning the urb.
         *
         * Caller guaranteed that the urb pointer hasn't been freed, and
@@ -1114,7 +1115,7 @@ int usb_hcd_unlink_urb (struct urb *urb,
        /* Any status except -EINPROGRESS means something already started to
         * unlink this URB from the hardware.  So there's no more work to do.
         */
-       if (urb->status != -EINPROGRESS) {
+       if (urb->core_status != -EINPROGRESS) {
                retval = -EBUSY;
                goto done;
        }
@@ -1132,7 +1133,7 @@ int usb_hcd_unlink_urb (struct urb *urb,
                set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
        }
 
-       urb->status = status;
+       urb->core_status = status;
 
        spin_unlock (&hcd_data_lock);
        spin_unlock_irqrestore (&urb->lock, flags);
@@ -1176,15 +1177,15 @@ rescan:
                int     tmp;
 
                /* the urb may already have been unlinked */
-               if (urb->status != -EINPROGRESS)
+               if (urb->core_status != -EINPROGRESS)
                        continue;
                usb_get_urb (urb);
                spin_unlock (&hcd_data_lock);
 
                spin_lock (&urb->lock);
-               tmp = urb->status;
+               tmp = urb->core_status;
                if (tmp == -EINPROGRESS)
-                       urb->status = -ESHUTDOWN;
+                       urb->core_status = -ESHUTDOWN;
                spin_unlock (&urb->lock);
 
                /* kick hcd unless it's already returning this */
@@ -1419,6 +1420,11 @@ void usb_hcd_giveback_urb (struct usb_hc
        usbmon_urb_complete (&hcd->self, urb);
        usb_unanchor_urb(urb);
 
+       /* FIXME: The next line should be removed and the status passed
+        * as an argument to urb->complete().
+        */
+       urb->status = urb->core_status;
+
        /* pass ownership to the completion handler */
        urb->complete (urb);
        atomic_dec (&urb->use_count);
Index: usb-2.6/drivers/usb/mon/mon_bin.c
===================================================================
--- usb-2.6.orig/drivers/usb/mon/mon_bin.c
+++ usb-2.6/drivers/usb/mon/mon_bin.c
@@ -448,7 +448,7 @@ static void mon_bin_event(struct mon_rea
        ep->id = (unsigned long) urb;
        ep->ts_sec = ts.tv_sec;
        ep->ts_usec = ts.tv_usec;
-       ep->status = urb->status;
+       ep->status = urb->core_status;
        ep->len_urb = urb_length;
        ep->len_cap = length;
 
Index: usb-2.6/drivers/usb/mon/mon_text.c
===================================================================
--- usb-2.6.orig/drivers/usb/mon/mon_text.c
+++ usb-2.6/drivers/usb/mon/mon_text.c
@@ -210,7 +210,7 @@ static void mon_text_event(struct mon_re
        ep->length = (ev_type == 'S') ?
            urb->transfer_buffer_length : urb->actual_length;
        /* Collecting status makes debugging sense for submits, too */
-       ep->status = urb->status;
+       ep->status = urb->core_status;
 
        if (usb_pipeint(urb->pipe)) {
                ep->interval = urb->interval;
Index: usb-2.6/include/linux/usb.h
===================================================================
--- usb-2.6.orig/include/linux/usb.h
+++ usb-2.6/include/linux/usb.h
@@ -1175,6 +1175,7 @@ struct urb
        spinlock_t lock;                /* lock for the URB */
        void *hcpriv;                   /* private data for host controller */
        atomic_t use_count;             /* concurrent submissions counter */
+       int core_status;                /* private status for usbcore */
        u8 reject;                      /* submissions will fail */
 
        /* public: documented fields in the urb that can be used by drivers */
Index: usb-2.6/drivers/usb/host/ehci-q.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ehci-q.c
+++ usb-2.6/drivers/usb/host/ehci-q.c
@@ -151,51 +151,51 @@ static void qtd_copy_status (
                urb->actual_length += length - QTD_LENGTH (token);
 
        /* don't modify error codes */
-       if (unlikely (urb->status != -EINPROGRESS))
+       if (unlikely(urb->core_status != -EINPROGRESS))
                return;
 
        /* force cleanup after short read; not always an error */
        if (unlikely (IS_SHORT_READ (token)))
-               urb->status = -EREMOTEIO;
+               urb->core_status = -EREMOTEIO;
 
        /* serious "can't proceed" faults reported by the hardware */
        if (token & QTD_STS_HALT) {
                if (token & QTD_STS_BABBLE) {
                        /* FIXME "must" disable babbling device's port too */
-                       urb->status = -EOVERFLOW;
+                       urb->core_status = -EOVERFLOW;
                } else if (token & QTD_STS_MMF) {
                        /* fs/ls interrupt xfer missed the complete-split */
-                       urb->status = -EPROTO;
+                       urb->core_status = -EPROTO;
                } else if (token & QTD_STS_DBE) {
-                       urb->status = (QTD_PID (token) == 1) /* IN ? */
+                       urb->core_status = (QTD_PID(token) == 1) /* IN ? */
                                ? -ENOSR  /* hc couldn't read data */
                                : -ECOMM; /* hc couldn't write data */
                } else if (token & QTD_STS_XACT) {
                        /* timeout, bad crc, wrong PID, etc; retried */
                        if (QTD_CERR (token))
-                               urb->status = -EPIPE;
+                               urb->core_status = -EPIPE;
                        else {
                                ehci_dbg (ehci, "devpath %s ep%d%s 3strikes\n",
                                        urb->dev->devpath,
                                        usb_pipeendpoint (urb->pipe),
                                        usb_pipein (urb->pipe) ? "in" : "out");
-                               urb->status = -EPROTO;
+                               urb->core_status = -EPROTO;
                        }
                /* CERR nonzero + no errors + halt --> stall */
                } else if (QTD_CERR (token))
-                       urb->status = -EPIPE;
+                       urb->core_status = -EPIPE;
                else    /* unknown */
-                       urb->status = -EPROTO;
+                       urb->core_status = -EPROTO;
 
                ehci_vdbg (ehci,
                        "dev%d ep%d%s qtd token %08x --> status %d\n",
                        usb_pipedevice (urb->pipe),
                        usb_pipeendpoint (urb->pipe),
                        usb_pipein (urb->pipe) ? "in" : "out",
-                       token, urb->status);
+                       token, urb->core_status);
 
                /* if async CSPLIT failed, try cleaning out the TT buffer */
-               if (urb->status != -EPIPE
+               if (urb->core_status != -EPIPE
                                && urb->dev->tt && !usb_pipeint (urb->pipe)
                                && ((token & QTD_STS_MMF) != 0
                                        || QTD_CERR(token) == 0)
@@ -233,15 +233,15 @@ __acquires(ehci->lock)
 
        spin_lock (&urb->lock);
        urb->hcpriv = NULL;
-       switch (urb->status) {
+       switch (urb->core_status) {
        case -EINPROGRESS:              /* success */
-               urb->status = 0;
+               urb->core_status = 0;
        default:                        /* fault */
                COUNT (ehci->stats.complete);
                break;
        case -EREMOTEIO:                /* fault or normal */
                if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
-                       urb->status = 0;
+                       urb->core_status = 0;
                COUNT (ehci->stats.complete);
                break;
        case -ECONNRESET:               /* canceled */
@@ -257,7 +257,7 @@ __acquires(ehci->lock)
                __FUNCTION__, urb->dev->devpath, urb,
                usb_pipeendpoint (urb->pipe),
                usb_pipein (urb->pipe) ? "in" : "out",
-               urb->status,
+               urb->core_status,
                urb->actual_length, urb->transfer_buffer_length);
 #endif
 
@@ -362,13 +362,13 @@ qh_completions (struct ehci_hcd *ehci, s
                        stopped = 1;
 
                        if (unlikely (!HC_IS_RUNNING 
(ehci_to_hcd(ehci)->state)))
-                               urb->status = -ESHUTDOWN;
+                               urb->core_status = -ESHUTDOWN;
 
                        /* ignore active urbs unless some previous qtd
                         * for the urb faulted (including short read) or
                         * its urb was canceled.  we may patch qh or qtds.
                         */
-                       if (likely (urb->status == -EINPROGRESS))
+                       if (likely(urb->core_status == -EINPROGRESS))
                                continue;
 
                        /* issue status after short control reads */
@@ -398,7 +398,7 @@ halt:
                /* remove it from the queue */
                spin_lock (&urb->lock);
                qtd_copy_status (ehci, urb, qtd->length, token);
-               do_status = (urb->status == -EREMOTEIO)
+               do_status = (urb->core_status == -EREMOTEIO)
                                && usb_pipecontrol (urb->pipe);
                spin_unlock (&urb->lock);
 
Index: usb-2.6/drivers/usb/host/isp116x-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/isp116x-hcd.c
+++ usb-2.6/drivers/usb/host/isp116x-hcd.c
@@ -316,20 +316,21 @@ static void postproc_atl_queue(struct is
                                                      USB_PID_OUT,
                                                      PTD_GET_TOGGLE(ptd));
                                urb->actual_length += PTD_GET_COUNT(ptd);
-                               urb->status = cc_to_error[TD_DATAUNDERRUN];
+                               urb->core_status =
+                                               cc_to_error[TD_DATAUNDERRUN];
                                spin_unlock(&urb->lock);
                                continue;
                        }
                }
                /* Keep underrun error through the STATUS stage */
-               if (urb->status == cc_to_error[TD_DATAUNDERRUN])
+               if (urb->core_status == cc_to_error[TD_DATAUNDERRUN])
                        cc = TD_DATAUNDERRUN;
 
                if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
                    && (++ep->error_count >= 3 || cc == TD_CC_STALL
                        || cc == TD_DATAOVERRUN)) {
-                       if (urb->status == -EINPROGRESS)
-                               urb->status = cc_to_error[cc];
+                       if (urb->core_status == -EINPROGRESS)
+                               urb->core_status = cc_to_error[cc];
                        if (ep->nextpid == USB_PID_ACK)
                                ep->nextpid = 0;
                        spin_unlock(&urb->lock);
@@ -339,8 +340,8 @@ static void postproc_atl_queue(struct is
                   finishing of the urb. Hey, does this apply only
                   for IN endpoints? */
                if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
-                       if (urb->status == -EINPROGRESS)
-                               urb->status = 0;
+                       if (urb->core_status == -EINPROGRESS)
+                               urb->core_status = 0;
                        spin_unlock(&urb->lock);
                        continue;
                }
@@ -381,8 +382,8 @@ static void postproc_atl_queue(struct is
                        /* All data for this URB is transferred, let's finish */
                        if (usb_pipecontrol(urb->pipe))
                                ep->nextpid = USB_PID_ACK;
-                       else if (urb->status == -EINPROGRESS)
-                               urb->status = 0;
+                       else if (urb->core_status == -EINPROGRESS)
+                               urb->core_status = 0;
                        break;
                case USB_PID_SETUP:
                        if (PTD_GET_ACTIVE(ptd)
@@ -402,8 +403,8 @@ static void postproc_atl_queue(struct is
                        if (PTD_GET_ACTIVE(ptd)
                            || (cc != TD_CC_NOERROR && cc < 0x0E))
                                break;
-                       if (urb->status == -EINPROGRESS)
-                               urb->status = 0;
+                       if (urb->core_status == -EINPROGRESS)
+                               urb->core_status = 0;
                        ep->nextpid = 0;
                        break;
                default:
@@ -588,7 +589,7 @@ static void finish_atl_transfers(struct 
                /* USB_PID_ACK check here avoids finishing of
                   control transfers, for which TD_DATAUNDERRUN
                   occured, while URB_SHORT_NOT_OK was set */
-               if (urb && urb->status != -EINPROGRESS
+               if (urb && urb->core_status != -EINPROGRESS
                    && ep->nextpid != USB_PID_ACK)
                        finish_request(isp116x, ep, urb);
        }
@@ -822,7 +823,7 @@ static int isp116x_urb_enqueue(struct us
 
        /* in case of unlink-during-submit */
        spin_lock(&urb->lock);
-       if (urb->status != -EINPROGRESS) {
+       if (urb->core_status != -EINPROGRESS) {
                spin_unlock(&urb->lock);
                finish_request(isp116x, ep, urb);
                ret = 0;
Index: usb-2.6/drivers/usb/host/ohci-dbg.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ohci-dbg.c
+++ usb-2.6/drivers/usb/host/ohci-dbg.c
@@ -34,7 +34,7 @@ urb_print (struct urb * urb, char * str,
        }
 
 #ifndef        OHCI_VERBOSE_DEBUG
-       if (urb->status != 0)
+       if (urb->core_status != 0)
 #endif
        dbg("%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d stat=%d",
                    str,
@@ -46,7 +46,7 @@ urb_print (struct urb * urb, char * str,
                    urb->transfer_flags,
                    urb->actual_length,
                    urb->transfer_buffer_length,
-                   urb->status);
+                   urb->core_status);
 
 #ifdef OHCI_VERBOSE_DEBUG
        if (!small) {
@@ -66,7 +66,7 @@ urb_print (struct urb * urb, char * str,
                                                urb->transfer_buffer_length: 
urb->actual_length;
                        for (i = 0; i < 16 && i < len; i++)
                                printk (" %02x", ((__u8 *) 
urb->transfer_buffer) [i]);
-                       printk ("%s stat:%d\n", i < len? "...": "", 
urb->status);
+                       printk("%s stat:%d\n", i < len? "...": "", 
urb->core_status);
                }
        }
 #endif
Index: usb-2.6/drivers/usb/host/ohci-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ohci-hcd.c
+++ usb-2.6/drivers/usb/host/ohci-hcd.c
@@ -204,7 +204,7 @@ static int ohci_urb_enqueue (
 
        /* in case of unlink-during-submit */
        spin_lock (&urb->lock);
-       if (urb->status != -EINPROGRESS) {
+       if (urb->core_status != -EINPROGRESS) {
                spin_unlock (&urb->lock);
                urb->hcpriv = urb_priv;
                finish_urb (ohci, urb);
@@ -251,7 +251,7 @@ fail:
 
 /*
  * decouple the URB from the HC queues (TDs, urb_priv); it's
- * already marked using urb->status.  reporting is always done
+ * already marked using urb->core_status.  reporting is always done
  * asynchronously, and we might be dealing with an urb that's
  * partially transferred, or an ED with other urbs being unlinked.
  */
@@ -796,7 +796,7 @@ static int ohci_restart (struct ohci_hcd
                }
 
                spin_lock (&urb->lock);
-               urb->status = -ESHUTDOWN;
+               urb->core_status = -ESHUTDOWN;
                spin_unlock (&urb->lock);
        }
        finish_unlinks (ohci, 0);
Index: usb-2.6/drivers/usb/host/ohci-q.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ohci-q.c
+++ usb-2.6/drivers/usb/host/ohci-q.c
@@ -46,8 +46,8 @@ __acquires(ohci->lock)
        urb->hcpriv = NULL;
 
        spin_lock (&urb->lock);
-       if (likely (urb->status == -EINPROGRESS))
-               urb->status = 0;
+       if (likely(urb->core_status == -EINPROGRESS))
+               urb->core_status = 0;
        /* report short control reads right even though the data TD always
         * has TD_R set.  (much simpler, but creates the 1-td limit.)
         */
@@ -55,8 +55,8 @@ __acquires(ohci->lock)
                        && unlikely (usb_pipecontrol (urb->pipe))
                        && urb->actual_length < urb->transfer_buffer_length
                        && usb_pipein (urb->pipe)
-                       && urb->status == 0) {
-               urb->status = -EREMOTEIO;
+                       && urb->core_status == 0) {
+               urb->core_status = -EREMOTEIO;
        }
        spin_unlock (&urb->lock);
 
@@ -709,7 +709,7 @@ static void td_submit_urb (
  *-------------------------------------------------------------------------*/
 
 /* calculate transfer length/status and update the urb
- * PRECONDITION:  irqsafe (only for urb->status locking)
+ * PRECONDITION:  irqsafe (only for urb->core_status locking)
  */
 static void td_done (struct ohci_hcd *ohci, struct urb *urb, struct td *td)
 {
@@ -764,8 +764,8 @@ static void td_done (struct ohci_hcd *oh
                        cc = TD_CC_NOERROR;
                if (cc != TD_CC_NOERROR && cc < 0x0E) {
                        spin_lock (&urb->lock);
-                       if (urb->status == -EINPROGRESS)
-                               urb->status = cc_to_error [cc];
+                       if (urb->core_status == -EINPROGRESS)
+                               urb->core_status = cc_to_error[cc];
                        spin_unlock (&urb->lock);
                }
 
@@ -974,7 +974,7 @@ rescan_this:
                        urb = td->urb;
                        urb_priv = td->urb->hcpriv;
 
-                       if (urb->status == -EINPROGRESS) {
+                       if (urb->core_status == -EINPROGRESS) {
                                prev = &td->hwNextTD;
                                continue;
                        }
Index: usb-2.6/drivers/usb/host/r8a66597-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/r8a66597-hcd.c
+++ usb-2.6/drivers/usb/host/r8a66597-hcd.c
@@ -776,7 +776,7 @@ static void force_dequeue(struct r8a6659
                kfree(td);
 
                if (urb) {
-                       urb->status = -ENODEV;
+                       urb->core_status = -ENODEV;
                        urb->hcpriv = NULL;
                        spin_unlock(&r8a66597->lock);
                        usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb);
@@ -1110,7 +1110,7 @@ static void done(struct r8a66597 *r8a665
        r8a66597->timeout_map &= ~(1 << pipenum);
 
        if (likely(td)) {
-               if (td->set_address && urb->status != 0)
+               if (td->set_address && urb->core_status != 0)
                        r8a66597->address_map &= ~(1 << urb->setup_packet[2]);
 
                pipe_toggle_save(r8a66597, td->pipe, urb);
@@ -1165,7 +1165,7 @@ static void packet_read(struct r8a66597 
        fifo_change_from_pipe(r8a66597, td->pipe);
        tmp = r8a66597_read(r8a66597, td->pipe->fifoctr);
        if (unlikely((tmp & FRDY) == 0)) {
-               urb->status = -EPIPE;
+               urb->core_status = -EPIPE;
                pipe_stop(r8a66597, td->pipe);
                pipe_irq_disable(r8a66597, pipenum);
                err("in fifo not ready (%d)", pipenum);
@@ -1197,7 +1197,7 @@ static void packet_read(struct r8a66597 
                td->short_packet = 1;
                if (urb->transfer_buffer_length != urb->actual_length &&
                    urb->transfer_flags & URB_SHORT_NOT_OK)
-                       td->urb->status = -EREMOTEIO;
+                       td->urb->core_status = -EREMOTEIO;
        }
        if (usb_pipeisoc(urb->pipe)) {
                urb->iso_frame_desc[td->iso_cnt].actual_length = size;
@@ -1222,8 +1222,8 @@ static void packet_read(struct r8a66597 
        }
 
        if (finish && pipenum != 0) {
-               if (td->urb->status == -EINPROGRESS)
-                       td->urb->status = 0;
+               if (td->urb->core_status == -EINPROGRESS)
+                       td->urb->core_status = 0;
                finish_request(r8a66597, td, pipenum, urb);
        }
 }
@@ -1243,7 +1243,7 @@ static void packet_write(struct r8a66597
        fifo_change_from_pipe(r8a66597, td->pipe);
        tmp = r8a66597_read(r8a66597, td->pipe->fifoctr);
        if (unlikely((tmp & FRDY) == 0)) {
-               urb->status = -EPIPE;
+               urb->core_status = -EPIPE;
                pipe_stop(r8a66597, td->pipe);
                pipe_irq_disable(r8a66597, pipenum);
                err("out write fifo not ready. (%d)", pipenum);
@@ -1305,7 +1305,7 @@ static void check_next_phase(struct r8a6
        switch (td->type) {
        case USB_PID_IN:
        case USB_PID_OUT:
-               if (urb->status != -EINPROGRESS) {
+               if (urb->core_status != -EINPROGRESS) {
                        finish = 1;
                        break;
                }
@@ -1313,11 +1313,11 @@ static void check_next_phase(struct r8a6
                        td->type = USB_PID_ACK;
                break;
        case USB_PID_SETUP:
-               if (urb->status != -EINPROGRESS)
+               if (urb->core_status != -EINPROGRESS)
                        finish = 1;
                else if (urb->transfer_buffer_length == urb->actual_length) {
                        td->type = USB_PID_ACK;
-                       urb->status = 0;
+                       urb->core_status = 0;
                } else if (usb_pipeout(urb->pipe))
                        td->type = USB_PID_OUT;
                else
@@ -1325,8 +1325,8 @@ static void check_next_phase(struct r8a6
                break;
        case USB_PID_ACK:
                finish = 1;
-               if (urb->status == -EINPROGRESS)
-                       urb->status = 0;
+               if (urb->core_status == -EINPROGRESS)
+                       urb->core_status = 0;
                break;
        }
 
@@ -1344,9 +1344,9 @@ static void set_urb_error(struct r8a6659
                u16 pid = r8a66597_read(r8a66597, td->pipe->pipectr) & PID;
 
                if (pid == PID_NAK)
-                       td->urb->status = -ECONNRESET;
+                       td->urb->core_status = -ECONNRESET;
                else
-                       td->urb->status = -EPIPE;
+                       td->urb->core_status = -EPIPE;
        }
 }
 
@@ -1415,8 +1415,8 @@ static void irq_pipe_empty(struct r8a665
                        if ((tmp & INBUFM) == 0) {
                                disable_irq_empty(r8a66597, pipenum);
                                pipe_irq_disable(r8a66597, pipenum);
-                               if (td->urb->status == -EINPROGRESS)
-                                       td->urb->status = 0;
+                               if (td->urb->core_status == -EINPROGRESS)
+                                       td->urb->core_status = 0;
                                finish_request(r8a66597, td, pipenum, td->urb);
                        }
                }
@@ -1762,7 +1762,7 @@ static int r8a66597_urb_enqueue(struct u
        list_add_tail(&td->queue, &r8a66597->pipe_queue[td->pipenum]);
 
        spin_lock(&urb->lock);
-       if (urb->status != -EINPROGRESS) {
+       if (urb->core_status != -EINPROGRESS) {
                spin_unlock(&urb->lock);
                ret = -EPIPE;
                goto error;
Index: usb-2.6/drivers/usb/host/sl811-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/sl811-hcd.c
+++ usb-2.6/drivers/usb/host/sl811-hcd.c
@@ -436,8 +436,8 @@ static void finish_request(
                ep->nextpid = USB_PID_SETUP;
 
        spin_lock(&urb->lock);
-       if (urb->status == -EINPROGRESS)
-               urb->status = status;
+       if (urb->core_status == -EINPROGRESS)
+               urb->core_status = status;
        urb->hcpriv = NULL;
        spin_unlock(&urb->lock);
 
@@ -538,7 +538,7 @@ done(struct sl811 *sl811, struct sl811h_
                                                bank + SL11H_XFERCNTREG);
                        if (len > ep->length) {
                                len = ep->length;
-                               urb->status = -EOVERFLOW;
+                               urb->core_status = -EOVERFLOW;
                        }
                        urb->actual_length += len;
                        sl811_read_buf(sl811, SL811HS_PACKET_BUF(bank == 0),
@@ -560,8 +560,8 @@ done(struct sl811 *sl811, struct sl811h_
                                 * this reports the wrong urb status.
                                 */
                                spin_lock(&urb->lock);
-                               if (urb->status == -EINPROGRESS)
-                                       urb->status = urbstat;
+                               if (urb->core_status == -EINPROGRESS)
+                                       urb->core_status = urbstat;
                                spin_unlock(&urb->lock);
 
                                urb = NULL;
@@ -605,7 +605,8 @@ done(struct sl811 *sl811, struct sl811h_
                                bank, status, ep, urbstat);
        }
 
-       if (urb && (urbstat != -EINPROGRESS || urb->status != -EINPROGRESS))
+       if (urb && (urbstat != -EINPROGRESS ||
+                       urb->core_status != -EINPROGRESS))
                finish_request(sl811, ep, urb, urbstat);
 }
 
@@ -953,7 +954,7 @@ static int sl811h_urb_enqueue(
 
        /* in case of unlink-during-submit */
        spin_lock(&urb->lock);
-       if (urb->status != -EINPROGRESS) {
+       if (urb->core_status != -EINPROGRESS) {
                spin_unlock(&urb->lock);
                finish_request(sl811, ep, urb, 0);
                retval = 0;
Index: usb-2.6/drivers/usb/host/u132-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/u132-hcd.c
+++ usb-2.6/drivers/usb/host/u132-hcd.c
@@ -518,7 +518,7 @@ static void u132_hcd_giveback_urb(struct
         unsigned long irqs;
         struct usb_hcd *hcd = u132_to_hcd(u132);
         urb->error_count = 0;
-        urb->status = status;
+        urb->core_status = status;
         urb->hcpriv = NULL;
         spin_lock_irqsave(&endp->queue_lock.slock, irqs);
         endp->queue_next += 1;
@@ -558,7 +558,7 @@ static void u132_hcd_abandon_urb(struct 
         unsigned long irqs;
         struct usb_hcd *hcd = u132_to_hcd(u132);
         urb->error_count = 0;
-        urb->status = status;
+        urb->core_status = status;
         urb->hcpriv = NULL;
         spin_lock_irqsave(&endp->queue_lock.slock, irqs);
         endp->queue_next += 1;
@@ -646,11 +646,11 @@ static void u132_hcd_interrupt_recv(void
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 struct u132_ring *ring = endp->ring;
                 u8 *u = urb->transfer_buffer + urb->actual_length;
                 u8 *b = buf;
@@ -717,9 +717,9 @@ static void u132_hcd_interrupt_recv(void
                 }
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -745,11 +745,11 @@ static void u132_hcd_bulk_output_sent(vo
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 struct u132_ring *ring = endp->ring;
                 urb->actual_length += len;
                 endp->toggle_bits = toggle_bits;
@@ -769,9 +769,9 @@ static void u132_hcd_bulk_output_sent(vo
                 }
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -798,11 +798,11 @@ static void u132_hcd_bulk_input_recv(voi
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 struct u132_ring *ring = endp->ring;
                 u8 *u = urb->transfer_buffer + urb->actual_length;
                 u8 *b = buf;
@@ -872,9 +872,9 @@ static void u132_hcd_bulk_input_recv(voi
                 }
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -899,19 +899,19 @@ static void u132_hcd_configure_empty_sen
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, 0);
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -937,11 +937,11 @@ static void u132_hcd_configure_input_rec
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 struct u132_ring *ring = endp->ring;
                 u8 *u = urb->transfer_buffer;
                 u8 *b = buf;
@@ -981,9 +981,9 @@ static void u132_hcd_configure_input_rec
                 }
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1008,19 +1008,19 @@ static void u132_hcd_configure_empty_rec
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, 0);
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1046,11 +1046,11 @@ static void u132_hcd_configure_setup_sen
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 if (usb_pipein(urb->pipe)) {
                         int retval;
                         struct u132_ring *ring = endp->ring;
@@ -1078,9 +1078,9 @@ static void u132_hcd_configure_setup_sen
                 }
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1107,11 +1107,11 @@ static void u132_hcd_enumeration_empty_r
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 u132->addr[0].address = 0;
                 endp->usb_addr = udev->usb_addr;
                 up(&u132->scheduler_lock);
@@ -1119,9 +1119,9 @@ static void u132_hcd_enumeration_empty_r
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1146,11 +1146,11 @@ static void u132_hcd_enumeration_address
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 int retval;
                 struct u132_ring *ring = endp->ring;
                 up(&u132->scheduler_lock);
@@ -1163,9 +1163,9 @@ static void u132_hcd_enumeration_address
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1190,19 +1190,19 @@ static void u132_hcd_initial_empty_sent(
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, 0);
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1228,11 +1228,11 @@ static void u132_hcd_initial_input_recv(
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 int retval;
                 struct u132_ring *ring = endp->ring;
                 u8 *u = urb->transfer_buffer;
@@ -1252,9 +1252,9 @@ static void u132_hcd_initial_input_recv(
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -1280,11 +1280,11 @@ static void u132_hcd_initial_setup_sent(
                 return;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
                 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
                 return;
-        } else if (urb->status == -EINPROGRESS) {
+        } else if (urb->core_status == -EINPROGRESS) {
                 int retval;
                 struct u132_ring *ring = endp->ring;
                 up(&u132->scheduler_lock);
@@ -1297,9 +1297,9 @@ static void u132_hcd_initial_setup_sent(
                 return;
         } else {
                 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p 
statu"
-                        "s=%d\n", urb, urb->status);
+                        "s=%d\n", urb, urb->core_status);
                 up(&u132->scheduler_lock);
-                u132_hcd_giveback_urb(u132, endp, urb, urb->status);
+                u132_hcd_giveback_urb(u132, endp, urb, urb->core_status);
                 return;
         }
 }
@@ -2246,7 +2246,7 @@ static int u132_urb_enqueue(struct usb_h
                 return -ENODEV;
         } else if (u132->going > 0) {
                 dev_err(&u132->platform_dev->dev, "device is being removed 
urb="
-                        "%p status=%d\n", urb, urb->status);
+                        "%p status=%d\n", urb, urb->core_status);
                 return -ESHUTDOWN;
         } else {
                 u8 usb_addr = usb_pipedevice(urb->pipe);
@@ -2410,7 +2410,7 @@ static int u132_endp_urb_dequeue(struct 
                         return 0;
                 } else {
                         spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
-                        u132_hcd_abandon_urb(u132, endp, urb, urb->status);
+                        u132_hcd_abandon_urb(u132, endp, urb, 
urb->core_status);
                         return 0;
                 }
         } else {
Index: usb-2.6/drivers/usb/host/uhci-debug.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/uhci-debug.c
+++ usb-2.6/drivers/usb/host/uhci-debug.c
@@ -120,8 +120,8 @@ static int uhci_show_urbp(struct urb_pri
        out += sprintf(out, "%s%s", ptype, (urbp->fsbr ? " FSBR" : ""));
        out += sprintf(out, " Actlen=%d", urbp->urb->actual_length);
 
-       if (urbp->urb->status != -EINPROGRESS)
-               out += sprintf(out, " Status=%d", urbp->urb->status);
+       if (urbp->urb->core_status != -EINPROGRESS)
+               out += sprintf(out, " Status=%d", urbp->urb->core_status);
        out += sprintf(out, "\n");
 
        i = nactive = ninactive = 0;
Index: usb-2.6/drivers/usb/host/uhci-hcd.h
===================================================================
--- usb-2.6.orig/drivers/usb/host/uhci-hcd.h
+++ usb-2.6/drivers/usb/host/uhci-hcd.h
@@ -461,7 +461,7 @@ struct urb_priv {
  * Locking in uhci.c
  *
  * Almost everything relating to the hardware schedule and processing
- * of URBs is protected by uhci->lock.  urb->status is protected by
+ * of URBs is protected by uhci->lock.  urb->core_status is protected by
  * urb->lock; that's the one exception.
  *
  * To prevent deadlocks, never lock uhci->lock while holding urb->lock.
Index: usb-2.6/drivers/usb/host/uhci-q.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/uhci-q.c
+++ usb-2.6/drivers/usb/host/uhci-q.c
@@ -1386,7 +1386,7 @@ static int uhci_urb_enqueue(struct usb_h
 
        spin_lock_irqsave(&uhci->lock, flags);
 
-       ret = urb->status;
+       ret = urb->core_status;
        if (ret != -EINPROGRESS)                /* URB already unlinked! */
                goto done;
 
@@ -1551,8 +1551,8 @@ static void uhci_scan_qh(struct uhci_hcd
                        break;
 
                spin_lock(&urb->lock);
-               if (urb->status == -EINPROGRESS)        /* Not dequeued */
-                       urb->status = status;
+               if (urb->core_status == -EINPROGRESS)   /* Not dequeued */
+                       urb->core_status = status;
                else
                        status = ECONNRESET;            /* Not -ECONNRESET */
                spin_unlock(&urb->lock);
@@ -1582,7 +1582,7 @@ static void uhci_scan_qh(struct uhci_hcd
 restart:
        list_for_each_entry(urbp, &qh->queue, node) {
                urb = urbp->urb;
-               if (urb->status != -EINPROGRESS) {
+               if (urb->core_status != -EINPROGRESS) {
 
                        /* Fix up the TD links and save the toggles for
                         * non-Isochronous queues.  For Isochronous queues,
Index: usb-2.6/drivers/usb/gadget/dummy_hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/gadget/dummy_hcd.c
+++ usb-2.6/drivers/usb/gadget/dummy_hcd.c
@@ -1056,8 +1056,8 @@ static int dummy_urb_dequeue (struct usb
 static void maybe_set_status (struct urb *urb, int status)
 {
        spin_lock (&urb->lock);
-       if (urb->status == -EINPROGRESS)
-               urb->status = status;
+       if (urb->core_status == -EINPROGRESS)
+               urb->core_status = status;
        spin_unlock (&urb->lock);
 }
 
@@ -1175,7 +1175,7 @@ top:
                }
 
                /* host side completion --> terminate */
-               if (urb->status != -EINPROGRESS)
+               if (urb->core_status != -EINPROGRESS)
                        break;
 
                /* rescan to continue with any other queued i/o */
@@ -1288,7 +1288,7 @@ restart:
                int                     type;
 
                urb = urbp->urb;
-               if (urb->status != -EINPROGRESS) {
+               if (urb->core_status != -EINPROGRESS) {
                        /* likely it was just unlinked */
                        goto return_urb;
                } else if (dum->rh_state != DUMMY_RH_RUNNING)
@@ -1539,7 +1539,7 @@ restart:
                }
 
                /* incomplete transfer? */
-               if (urb->status == -EINPROGRESS)
+               if (urb->core_status == -EINPROGRESS)
                        continue;
 
 return_urb:


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to