Patches from Alex Sanks; please merge.
- Dave
Net2280 patches to:
- Make reset logic ensure endpoint toggle and halt bits only get cleared
on endpoints other than ep0 to fix an extremely unlikely (but possible)
state when a setup packet come in after we've checked the reset status
but before calling ep_reset().
- Avoid a disconnect hang by exchanging SUSPEND_IMMEDIATELY (intended for
use when the 8051 is the PCI host) with SUSPEND_REQUEST_INTERRUPT to
suspend the NET2280.
- Make rmmod of gadget drivers trigger disconnect; earlier changes to
reset logic broke this.
Signed-off-by: Alex Sanks <[EMAIL PROTECTED]>
Signed-off-by: David Brownell <[EMAIL PROTECTED]>
--- xu26/drivers/usb/gadget/net2280.c 2004-08-24 13:11:21.000000000 -0700
+++ gadget-2.6/drivers/usb/gadget/net2280.c 2004-09-20 10:09:00.915368704 -0700
@@ -303,13 +303,16 @@
/* init to our chosen defaults, notably so that we NAK OUT
* packets until the driver queues a read (+note erratum 0112)
*/
- writel ( (1 << SET_NAK_OUT_PACKETS_MODE)
+ tmp = (1 << SET_NAK_OUT_PACKETS_MODE)
| (1 << SET_NAK_OUT_PACKETS)
| (1 << CLEAR_EP_HIDE_STATUS_PHASE)
- | (1 << CLEAR_INTERRUPT_MODE)
- | (1 << CLEAR_ENDPOINT_TOGGLE)
- | (1 << CLEAR_ENDPOINT_HALT)
- , &ep->regs->ep_rsp);
+ | (1 << CLEAR_INTERRUPT_MODE);
+
+ if (ep->num != 0) {
+ tmp |= (1 << CLEAR_ENDPOINT_TOGGLE)
+ | (1 << CLEAR_ENDPOINT_HALT);
+ }
+ writel (tmp, &ep->regs->ep_rsp);
/* scrub most status bits, and flush any fifo state */
writel ( (1 << TIMEOUT)
@@ -1919,8 +1922,6 @@
, &dev->usb->stdrsp);
writel ( (1 << USB_ROOT_PORT_WAKEUP_ENABLE)
| (1 << SELF_POWERED_USB_DEVICE)
- /* erratum 0102 workaround */
- | ((dev->chiprev == 0100) ? 0 : 1) << SUSPEND_IMMEDIATELY
| (1 << REMOTE_WAKEUP_SUPPORT)
| (dev->softconnect << USB_DETECT_ENABLE)
| (1 << SELF_POWERED_STATUS)
@@ -2046,6 +2047,8 @@
stop_activity (dev, driver);
spin_unlock_irqrestore (&dev->lock, flags);
+ net2280_pullup (&dev->gadget, 0);
+
driver->unbind (&dev->gadget);
dev->gadget.dev.driver = NULL;
dev->driver = NULL;
@@ -2551,8 +2554,6 @@
if (stat & (1 << SUSPEND_REQUEST_INTERRUPT)) {
if (dev->driver->suspend)
dev->driver->suspend (&dev->gadget);
- /* we use SUSPEND_IMMEDIATELY */
- stat &= ~(1 << SUSPEND_REQUEST_INTERRUPT);
} else {
if (dev->driver->resume)
dev->driver->resume (&dev->gadget);