diff -NurbwB linux-2.6.17/drivers/usb/gadget/pxa2xx_udc.c linux-2.6.17-patched/drivers/usb/gadget/pxa2xx_udc.c
--- linux-2.6.17/drivers/usb/gadget/pxa2xx_udc.c	2006-06-17 18:49:35.000000000 -0700
+++ linux-2.6.17-patched/drivers/usb/gadget/pxa2xx_udc.c	2006-09-11 13:02:39.000000000 -0700
@@ -87,8 +87,8 @@
 static const char ep0name [] = "ep0";
 
 
-// #define	USE_DMA
-// #define	USE_OUT_DMA
+#define	USE_DMA
+#define	USE_OUT_DMA
 // #define	DISABLE_TEST_MODE
 
 #ifdef CONFIG_ARCH_IXP4XX
@@ -1513,7 +1513,7 @@
 #endif
 
 	/* try to clear these bits before we enable the udc */
-	udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR);
+	udc_ack_int_UDCCR(UDCCR_SUSIR|UDCCR_RSTIR|UDCCR_RESIR);
 
 	ep0_idle(dev);
 	dev->gadget.speed = USB_SPEED_UNKNOWN;
@@ -2043,6 +2043,9 @@
 	struct pxa2xx_udc	*dev = _dev;
 	int			handled;
 
+
+	udc_set_mask_UDCCR( UDCCR_REM | UDCCR_SRM);
+
 	dev->stats.irqs++;
 	HEX_DISPLAY(dev->stats.irqs);
 	do {
@@ -2137,6 +2139,8 @@
 		/* we could also ask for 1 msec SOF (SIR) interrupts */
 
 	} while (handled);
+
+	udc_clear_mask_UDCCR( UDCCR_SRM | UDCCR_REM);
 	return IRQ_HANDLED;
 }
 
@@ -2437,6 +2441,7 @@
 	int retval, out_dma = 1;
 	u32 chiprev;
 
+	local_irq_disable();
 	/* insist on Intel/ARM/XScale */
 	asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev));
 	if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) {
@@ -2553,6 +2558,7 @@
 #endif
 	}
 #endif
+	local_irq_enable();
 	create_proc_files();
 
 	return 0;
