Don't retire active transaction on a NAK
This commit is contained in:
parent
d10d149667
commit
12cbb3ccd0
1 changed files with 26 additions and 25 deletions
|
@ -519,32 +519,35 @@ grub_uhci_transfer (grub_usb_controller_t dev,
|
||||||
|
|
||||||
grub_dprintf ("uhci", "t status=0x%02x\n", errtd->ctrl_status);
|
grub_dprintf ("uhci", "t status=0x%02x\n", errtd->ctrl_status);
|
||||||
|
|
||||||
/* Check if the endpoint is stalled. */
|
if (!(errtd->ctrl_status & (1 << 23)))
|
||||||
if (errtd->ctrl_status & (1 << 22))
|
{
|
||||||
err = GRUB_USB_ERR_STALL;
|
/* Check if the endpoint is stalled. */
|
||||||
|
if (errtd->ctrl_status & (1 << 22))
|
||||||
|
err = GRUB_USB_ERR_STALL;
|
||||||
|
|
||||||
/* Check if an error related to the data buffer occurred. */
|
/* Check if an error related to the data buffer occurred. */
|
||||||
if (errtd->ctrl_status & (1 << 21))
|
if (errtd->ctrl_status & (1 << 21))
|
||||||
err = GRUB_USB_ERR_DATA;
|
err = GRUB_USB_ERR_DATA;
|
||||||
|
|
||||||
/* Check if a babble error occurred. */
|
/* Check if a babble error occurred. */
|
||||||
if (errtd->ctrl_status & (1 << 20))
|
if (errtd->ctrl_status & (1 << 20))
|
||||||
err = GRUB_USB_ERR_BABBLE;
|
err = GRUB_USB_ERR_BABBLE;
|
||||||
|
|
||||||
/* Check if a NAK occurred. */
|
/* Check if a NAK occurred. */
|
||||||
if (errtd->ctrl_status & (1 << 19))
|
if (errtd->ctrl_status & (1 << 19))
|
||||||
err = GRUB_USB_ERR_NAK;
|
err = GRUB_USB_ERR_NAK;
|
||||||
|
|
||||||
/* Check if a timeout occurred. */
|
/* Check if a timeout occurred. */
|
||||||
if (errtd->ctrl_status & (1 << 18))
|
if (errtd->ctrl_status & (1 << 18))
|
||||||
err = GRUB_USB_ERR_TIMEOUT;
|
err = GRUB_USB_ERR_TIMEOUT;
|
||||||
|
|
||||||
/* Check if a bitstuff error occurred. */
|
/* Check if a bitstuff error occurred. */
|
||||||
if (errtd->ctrl_status & (1 << 17))
|
if (errtd->ctrl_status & (1 << 17))
|
||||||
err = GRUB_USB_ERR_BITSTUFF;
|
err = GRUB_USB_ERR_BITSTUFF;
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fall through, no errors occurred, so the QH might be
|
/* Fall through, no errors occurred, so the QH might be
|
||||||
updated. */
|
updated. */
|
||||||
|
@ -554,17 +557,15 @@ grub_uhci_transfer (grub_usb_controller_t dev,
|
||||||
{
|
{
|
||||||
err = GRUB_USB_ERR_STALL;
|
err = GRUB_USB_ERR_STALL;
|
||||||
grub_dprintf ("uhci", "transaction timed out\n");
|
grub_dprintf ("uhci", "transaction timed out\n");
|
||||||
goto fail;
|
break;
|
||||||
}
|
}
|
||||||
grub_cpu_idle ();
|
grub_cpu_idle ();
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_dprintf ("uhci", "transaction complete\n");
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
if (err != GRUB_USB_ERR_NONE)
|
if (err != GRUB_USB_ERR_NONE)
|
||||||
grub_dprintf ("uhci", "transaction failed\n");
|
grub_dprintf ("uhci", "transaction failed\n");
|
||||||
|
else
|
||||||
|
grub_dprintf ("uhci", "transaction complete\n");
|
||||||
|
|
||||||
/* Place the QH back in the free list and deallocate the associated
|
/* Place the QH back in the free list and deallocate the associated
|
||||||
TDs. */
|
TDs. */
|
||||||
|
|
Loading…
Reference in a new issue