usb: fix bug: ep0 64Byte IN Packet Error
authorlyz <lyz@rock-chips.com>
Fri, 6 Sep 2013 08:55:22 +0000 (16:55 +0800)
committerlyz <lyz@rock-chips.com>
Fri, 6 Sep 2013 09:04:43 +0000 (17:04 +0800)
drivers/usb/dwc_otg/dwc_otg_pcd.c
drivers/usb/dwc_otg/dwc_otg_pcd_intr.c

index a9b05d6ebea67649956b79a598f28cb42804cffc..16222daa83b919c6ceed7d866e41915c8909d9ba 100755 (executable)
@@ -652,6 +652,8 @@ static int dwc_otg_pcd_ep_queue(struct usb_ep *_ep,
                                DWC_DEBUGPL(DBG_PCD, 
                                                                "%s ep0: EP0_IN_DATA_PHASE\n", 
                                                                __func__);
+                           if((_req->length % MAX_EP0_SIZE) == 0)
+                               ep->dwc_ep.sent_zlp = 1;
                                break;
 
                        case EP0_OUT_DATA_PHASE:
@@ -684,7 +686,6 @@ static int dwc_otg_pcd_ep_queue(struct usb_ep *_ep,
                        ep->dwc_ep.xfer_buff = _req->buf;
                        ep->dwc_ep.xfer_len = _req->length;
                        ep->dwc_ep.xfer_count = 0;
-                       ep->dwc_ep.sent_zlp = 0;
                        ep->dwc_ep.total_len = ep->dwc_ep.xfer_len;
                        dwc_otg_ep0_start_transfer( GET_CORE_IF(pcd), 
                                                                                &ep->dwc_ep );
index 7f207908d14570de82ca900c2ae1610ca72d3ea2..cdc9a20662516cb289a7448bdd072d8ba4baa3be 100755 (executable)
@@ -1847,6 +1847,10 @@ static void handle_ep0( dwc_otg_pcd_t *_pcd )
                {
                        dwc_otg_ep0_continue_transfer ( GET_CORE_IF(_pcd), &ep0->dwc_ep );
                        DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER\n"); 
+               }else if (ep0->dwc_ep.sent_zlp) {
+                       dwc_otg_ep0_continue_transfer(GET_CORE_IF(_pcd), &ep0->dwc_ep);
+                       ep0->dwc_ep.sent_zlp = 0;
+                       DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER sent zlp\n");
                }
                else 
                {