more wip

Change-Id: Ic9ac625f8cc9375dfbdb5bda8d19004036508499
diff --git a/system/dev/usb/dwc2-device/dwc2-device.c b/system/dev/usb/dwc2-device/dwc2-device.c
index eff4a5f..37fea8e 100644
--- a/system/dev/usb/dwc2-device/dwc2-device.c
+++ b/system/dev/usb/dwc2-device/dwc2-device.c
@@ -65,16 +65,11 @@
 			deptsiz.xfersize = ep->txn_length - ep->txn_offset;
 		}
 	}
-printf("deptsiz.xfersize = %u deptsiz.pktcnt = %u\n", deptsiz.xfersize, deptsiz.pktcnt);
 
     *deptsiz_reg = deptsiz;
 
 	/* IN endpoint */
 	if (is_in) {
-//    	dwc_interrupts_t gintsts = {0};
-//    	gintsts.nptxfempty = 1;
-//		regs->gintsts = gintsts;
-printf("enable nptxfempty\n");
 		regs->gintmsk.nptxfempty = 1;
 	}
 
@@ -86,6 +81,7 @@
 }
 
 static void do_setup_status_phase(dwc_usb_t* dwc, bool is_in) {
+printf("do_setup_status_phase is_in: %d\n", is_in);
      dwc_endpoint_t* ep = &dwc->eps[0];
 
 	dwc->ep0_state = EP0_STATE_STATUS;
@@ -103,10 +99,18 @@
     printf("dwc_ep0_complete_request\n");
      dwc_endpoint_t* ep = &dwc->eps[0];
 
-    if (dwc->ep0_state == EP0_STATE_DATA_IN) {
+    if (dwc->ep0_state == EP0_STATE_STATUS) {
+       ep->txn_offset = 0;
+       ep->txn_length = 0;
+    } else if ( ep->txn_length == 0) {
+printf("dwc_otg_ep_start_transfer ???\n");
+//		dwc_otg_ep_start_transfer(ep);
+    } else if (dwc->ep0_state == EP0_STATE_DATA_IN) {
  	   if (ep->txn_offset >= ep->txn_length) {
 	        do_setup_status_phase(dwc, false);
        }
+    } else {
+	    do_setup_status_phase(dwc, true);
     }
 
 #if 0
@@ -437,7 +441,7 @@
 void dwc_handle_reset_irq(dwc_usb_t* dwc) {
     dwc_regs_t* regs = dwc->regs;
 
-	zxlogf(INFO, "dwc_handle_reset_irq\n");
+	printf("\nUSB RESET\n");
 
     dwc->ep0_state = EP0_STATE_DISCONNECTED;
 
@@ -521,7 +525,7 @@
 	 
 	 
 	if (grxstsp.epnum != 0)
-		grxstsp.epnum = 2;
+		grxstsp.epnum = 2; // ??????
 	/* Get pointer to EP structure */
 //	ep = &pcd->dwc_eps[status.b.epnum].dwc_ep;
 
@@ -600,7 +604,7 @@
 			if (diepint.xfercompl) {
 printf("diepint.xfercompl\n");
 				/* Disable the NP Tx FIFO Empty Interrrupt  */
-		        regs->gintmsk.nptxfempty = 1;
+		        regs->gintmsk.nptxfempty = 0;
 				/* Clear the bit in DIEPINTn for this interrupt */
 				regs->depin[epnum].diepint.xfercompl = 1;
 				/* Complete the transfer */
diff --git a/system/dev/usb/dwc2-device/dwc2.c b/system/dev/usb/dwc2-device/dwc2.c
index 1e9f146..7297824 100644
--- a/system/dev/usb/dwc2-device/dwc2.c
+++ b/system/dev/usb/dwc2-device/dwc2.c
@@ -170,6 +170,7 @@
     dwc_interrupts_t interrupts = regs->gintsts;
     dwc_interrupts_t mask = regs->gintmsk;
 
+/*
 printf("dwc_handle_irq:");
 if (interrupts.modemismatch) printf(" modemismatch");
 if (interrupts.otgintr) printf(" otgintr");
@@ -203,13 +204,13 @@
 if (interrupts.sessreqintr) printf(" sessreqintr");
 if (interrupts.wkupintr) printf(" wkupintr");
 printf("\n");
-
+*/
     // clear interrupt
     uint32_t gotgint = regs->gotgint;
     regs->gotgint = gotgint;
 
 // acknowledge interrupts
-printf("interrupts: %08x mask: %08x ack: %08x\n", interrupts.val, mask.val, interrupts.val & mask.val);
+//printf("interrupts: %08x mask: %08x ack: %08x\n", interrupts.val, mask.val, interrupts.val & mask.val);
     interrupts.val &= mask.val;
     regs->gintsts = interrupts;
 
@@ -225,32 +226,26 @@
     if (interrupts.enumdone) {
         dwc_handle_enumdone_irq(dwc);
     }
-//#ifndef ENABLE_MPI
     if (interrupts.inepintr) {
         dwc_handle_inepintr_irq(dwc);
     }
     if (interrupts.outepintr) {
         dwc_handle_outepintr_irq(dwc);
     }
-//#endif
     if (interrupts.nptxfempty) {
         dwc_handle_nptxfempty_irq(dwc);
     }
-
-#if 0 // ENABLE_MPI
-    sleep(1);
-    dwc_handle_outepintr_irq(dwc);
-    dwc_handle_inepintr_irq(dwc);
-#endif
 }
 
+
+//#define POLL 1
+
 // Thread to handle interrupts.
 static int dwc_irq_thread(void* arg) {
     dwc_usb_t* dwc = (dwc_usb_t*)arg;
 
-//sleep(2);
-
     while (1) {
+#ifndef POLL
         zx_status_t wait_res = zx_interrupt_wait(dwc->irq_handle, NULL);
         if (wait_res != ZX_OK) {
             zxlogf(ERROR, "dwc_usb: irq wait failed, retcode = %d\n", wait_res);
@@ -258,6 +253,7 @@
 
         dwc_handle_irq(dwc);
         usleep(2000); // this is terrible
+#endif
         dwc_handle_irq(dwc);
     }