[PATCH] USB: introduce urb->core_status field

Alan Stern <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
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/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.