--- zzzz-none-000/linux-2.6.32.60/drivers/usb/core/message.c 2012-10-07 21:41:24.000000000 +0000 +++ ur8-7270-606/linux-2.6.32.60/drivers/usb/core/message.c 2012-11-12 13:33:38.000000000 +0000 @@ -19,6 +19,8 @@ #include "hcd.h" /* for usbcore internals */ #include "usb.h" +/* 20121112 AVM/WK sg fix from kernel 3.3: don't set urb-dev=NULL */ + static void cancel_async_set_config(struct usb_device *udev); struct api_context { @@ -312,7 +314,8 @@ retval = usb_unlink_urb(io->urbs [i]); if (retval != -EINPROGRESS && retval != -ENODEV && - retval != -EBUSY) + retval != -EBUSY && + retval != -EIDRM) dev_err(&io->dev->dev, "%s, unlink --> %d\n", __func__, retval); @@ -321,7 +324,6 @@ } spin_lock(&io->lock); } - urb->dev = NULL; /* on the last completion, signal usb_sg_wait() */ io->bytes += urb->actual_length; @@ -569,7 +571,6 @@ case -ENXIO: /* hc didn't queue this one */ case -EAGAIN: case -ENOMEM: - io->urbs[i]->dev = NULL; retval = 0; yield(); break; @@ -587,7 +588,6 @@ /* fail any uncompleted urbs */ default: - io->urbs[i]->dev = NULL; io->urbs[i]->status = retval; dev_dbg(&io->dev->dev, "%s, submit --> %d\n", __func__, retval); @@ -638,7 +638,10 @@ if (!io->urbs [i]->dev) continue; retval = usb_unlink_urb(io->urbs [i]); - if (retval != -EINPROGRESS && retval != -EBUSY) + if (retval != -EINPROGRESS + && retval != -ENODEV + && retval != -EBUSY + && retval != -EIDRM) dev_warn(&io->dev->dev, "%s, unlink --> %d\n", __func__, retval); }