diff options
| author | sakumisu <[email protected]> | 2023-12-05 20:44:30 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2023-12-05 20:44:30 +0800 |
| commit | 82cd79989c8245aca5a6f27cc9457e63ec5f398d (patch) | |
| tree | a9eb915ce9c0f18e993df4fa6240b352988998fe | |
| parent | fe18d36fe05d4f5bc39525c4efe5a2cf5d598f0b (diff) | |
check token only with qtd, not use token in qh
| -rw-r--r-- | port/ehci/usb_hc_ehci.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c index bf7395b1..4f58e735 100644 --- a/port/ehci/usb_hc_ehci.c +++ b/port/ehci/usb_hc_ehci.c @@ -672,26 +672,28 @@ static void ehci_check_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) struct ehci_qtd_hw *qtd; uint32_t token; - token = qh->hw.overlay.token; + qtd = EHCI_ADDR2QTD(qh->first_qtd); - /* Check if token is only in active status without errors */ - if ((token & (QTD_TOKEN_STATUS_ERRORS | QTD_TOKEN_STATUS_ACTIVE)) == QTD_TOKEN_STATUS_ACTIVE) { + if (qtd == NULL) { return; } - urb = qh->urb; - - if ((token & QTD_TOKEN_STATUS_ERRORS) == 0) { - qtd = EHCI_ADDR2QTD(qh->first_qtd); + while (qtd) { + token = qtd->hw.token; - while (qtd) { - if ((qtd->hw.token & QTD_TOKEN_STATUS_ACTIVE) == QTD_TOKEN_STATUS_ACTIVE) { - return; - } - qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + if (token & QTD_TOKEN_STATUS_ERRORS) { + break; + } else if (token & QTD_TOKEN_STATUS_ACTIVE) { + return; } - if (token & QTD_TOKEN_TOGGLE) { + qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + } + + urb = qh->urb; + + if ((token & QTD_TOKEN_STATUS_ERRORS) == 0) { + if (qh->hw.overlay.token & QTD_TOKEN_TOGGLE) { urb->data_toggle = true; } else { urb->data_toggle = false; @@ -699,7 +701,7 @@ static void ehci_check_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) urb->errorcode = 0; } else { if (token & QTD_TOKEN_STATUS_BABBLE) { - urb->errorcode = -EPERM; + urb->errorcode = -EOVERFLOW; urb->data_toggle = 0; } else if (token & QTD_TOKEN_STATUS_HALTED) { urb->errorcode = -EPERM; @@ -1096,7 +1098,7 @@ int usbh_submit_urb(struct usbh_urb *urb) hub = hub->parent->parent; } - if (!urb->hport->connected || !(EHCI_HCOR->portsc[hport->port -1] & EHCI_PORTSC_CCS)) { + if (!urb->hport->connected || !(EHCI_HCOR->portsc[hport->port - 1] & EHCI_PORTSC_CCS)) { return -ENODEV; } |
