Don't retire active transaction on a NAK

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-08-21 13:55:06 +02:00
parent d10d149667
commit 12cbb3ccd0

View file

@ -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. */