Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751931AbbKPP0K (ORCPT ); Mon, 16 Nov 2015 10:26:10 -0500 Received: from lucky1.263xmail.com ([211.157.147.132]:34124 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751577AbbKPP0I (ORCPT ); Mon, 16 Nov 2015 10:26:08 -0500 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: lyz@rock-chips.com X-FST-TO: john.youn@synopsys.com X-SENDER-IP: 110.90.209.176 X-LOGIN-NAME: lyz@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 7 From: Yunzhi Li To: John.Youn@synopsys.com, dianders@chromium.org, jwerner@google.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, wulf@rock-chips.com, kever.yang@rock-chips.com, frank.wang@rock-chips.com, huangtao@rock-chips.com, caesar.wang@rock-chips.com Cc: Yunzhi Li Subject: [PATCH] usb: dwc2: hcd: fix periodic transfer schedule sequence Date: Mon, 16 Nov 2015 23:25:32 +0800 Message-Id: <1447687532-4820-1-git-send-email-lyz@rock-chips.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1910 Lines: 58 When checking dwc2 host channel interrupts, handle qh in periodic_sched_queued list at first, then we could make sure CSPLIT packets scheduled in the same order as SSPLIT packets. Signed-off-by: Yunzhi Li --- drivers/usb/dwc2/hcd_intr.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c index bda0b21..e8e8970 100644 --- a/drivers/usb/dwc2/hcd_intr.c +++ b/drivers/usb/dwc2/hcd_intr.c @@ -2115,6 +2115,8 @@ static void dwc2_hc_intr(struct dwc2_hsotg *hsotg) { u32 haint; int i; + int hc_num; + struct dwc2_qh *qh, *qh_tmp; haint = dwc2_readl(hsotg->regs + HAINT); if (dbg_perio()) { @@ -2123,6 +2125,26 @@ static void dwc2_hc_intr(struct dwc2_hsotg *hsotg) dev_vdbg(hsotg->dev, "HAINT=%08x\n", haint); } + /* + * According to USB 2.0 spec section 11.18.8, a host must + * issue complete-split transactions in a microframe for a + * set of full-/low-speed endpoints in the same relative + * order as the start-splits were issued in a microframe for. + * So here we should at first picking up host channels + * from periodic_sched_queued list and checking if there is + * any start-split have already finished then schedule + * complete-split in the same order. + */ + list_for_each_entry_safe(qh, qh_tmp, + &hsotg->periodic_sched_queued, + qh_list_entry) { + hc_num = qh->channel->hc_num; + if (haint & (1 << hc_num)) { + dwc2_hc_n_intr(hsotg, hc_num); + haint &= ~(1 << hc_num); + } + } + for (i = 0; i < hsotg->core_params->host_channels; i++) { if (haint & (1 << i)) dwc2_hc_n_intr(hsotg, i); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/