fix a bug for hub split transaction
authoryangkai <yangkai@ubuntu-fs>
Tue, 31 May 2011 08:17:15 +0000 (16:17 +0800)
committeryangkai <yangkai@ubuntu-fs>
Tue, 31 May 2011 08:17:15 +0000 (16:17 +0800)
drivers/usb/dwc_otg/dwc_otg_hcd_intr.c

index d0b892a197171ccef0698ff4187b00b381c96c01..5d68cf2d6c0b29e0aae9d5cc9de1e75bf7b2927d 100755 (executable)
@@ -196,22 +196,21 @@ int32_t dwc_otg_hcd_handle_sof_intr (dwc_otg_hcd_t *_hcd)
                         * fix bug for alcro hub
                         * do not send csplit after start_split_frame+4
                         */
+                       qtd = list_entry(qh->qtd_list.next, dwc_otg_qtd_t, qtd_list_entry);
                        if((qh->do_split)&&dwc_frame_num_gt(_hcd->frame_number, 
-                               dwc_frame_num_inc(qh->start_split_frame, 4)))
+                               dwc_frame_num_inc(qh->start_split_frame, 4))&&(qtd->complete_split))
                        {
-                               qtd = list_entry(qh->qtd_list.next, dwc_otg_qtd_t, qtd_list_entry);
-                               if ((qh->do_split) &&(qtd->complete_split))
-                               {
-                                       qtd->complete_split = 0;
-                                       
-                                       qh->sched_frame = dwc_frame_num_inc(qh->start_split_frame,
-                                                                            qh->interval);
-                                       if (dwc_frame_num_le(qh->sched_frame, _hcd->frame_number)) {
-                                               qh->sched_frame = _hcd->frame_number;
-                                       }
-                                       qh->sched_frame |= 0x7;
-                                       qh->start_split_frame = qh->sched_frame;
+                           DWC_PRINT("frame_number 0x%x, start 0x%x, complete: %x", 
+                               _hcd->frame_number, qh->start_split_frame, qtd->complete_split);
+                               qtd->complete_split = 0;
+                               
+                               qh->sched_frame = dwc_frame_num_inc(qh->start_split_frame,
+                                                                    qh->interval);
+                               if (dwc_frame_num_le(qh->sched_frame, _hcd->frame_number)) {
+                                       qh->sched_frame = _hcd->frame_number;
                                }
+                               qh->sched_frame |= 0x7;
+                               qh->start_split_frame = qh->sched_frame;
                        }
                        else
                        {