USB: fix the bug that urb enqueue again after kill urb.
authorwlf <wulf@rock-chips.com>
Thu, 8 May 2014 06:58:11 +0000 (14:58 +0800)
committerwlf <wulf@rock-chips.com>
Thu, 8 May 2014 06:58:11 +0000 (14:58 +0800)
drivers/usb/dwc_otg_310/dwc_otg_hcd_linux.c

index aca9f86d7cd200710e8081a74a9b556caaf02dc1..c870426f7dca0a102e2325d3271b5174ff335cc2 100755 (executable)
@@ -983,11 +983,19 @@ static int urb_enqueue(struct usb_hcd *hcd,
        }
 #endif
 
-       if(atomic_read(&urb->use_count)>1){
+       if (unlikely(atomic_read(&urb->use_count) > 1)) {
                retval = -EPERM;
-               printk("%s urb %p already in queue, qtd %p, count%d\n", 
+               printk("%s urb %p already in queue, qtd %p, use_count %d\n",
                        __func__, urb, urb->hcpriv, atomic_read(&urb->use_count));
-                return retval;
+               return retval;
+       }
+
+       if (unlikely(atomic_read(&urb->reject))) {
+               retval = -EPERM;
+               printk("%s urb %p submissions will fail, urb->reject %d, use_count %d\n",
+                       __func__, urb, atomic_read(&urb->reject), atomic_read(&urb->use_count));
+               return retval;
+
        }
 
        if ((usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS)