* grub-core/bus/usb/ehci.c: Fix handling of newborn transfers.
Avoid confusing them with already completed transfers.
This commit is contained in:
parent
72c9a50773
commit
e3ef0d30cf
2 changed files with 13 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2013-12-18 Aleš Nesrsta <starous@volny.cz>
|
||||||
|
|
||||||
|
* grub-core/bus/usb/ehci.c: Fix handling of newborn transfers.
|
||||||
|
|
||||||
|
Avoid confusing them with already completed transfers.
|
||||||
|
|
||||||
2013-12-18 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-12-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Remove xen VFB.
|
Remove xen VFB.
|
||||||
|
|
|
@ -1513,7 +1513,7 @@ grub_ehci_check_transfer (grub_usb_controller_t dev,
|
||||||
struct grub_ehci *e = dev->data;
|
struct grub_ehci *e = dev->data;
|
||||||
struct grub_ehci_transfer_controller_data *cdata =
|
struct grub_ehci_transfer_controller_data *cdata =
|
||||||
transfer->controller_data;
|
transfer->controller_data;
|
||||||
grub_uint32_t token;
|
grub_uint32_t token, token_ftd;
|
||||||
|
|
||||||
grub_dprintf ("ehci",
|
grub_dprintf ("ehci",
|
||||||
"check_transfer: EHCI STATUS=%08x, cdata=%p, qh=%p\n",
|
"check_transfer: EHCI STATUS=%08x, cdata=%p, qh=%p\n",
|
||||||
|
@ -1541,13 +1541,18 @@ grub_ehci_check_transfer (grub_usb_controller_t dev,
|
||||||
return grub_ehci_parse_notrun (dev, transfer, actual);
|
return grub_ehci_parse_notrun (dev, transfer, actual);
|
||||||
|
|
||||||
token = grub_le_to_cpu32 (cdata->qh_virt->td_overlay.token);
|
token = grub_le_to_cpu32 (cdata->qh_virt->td_overlay.token);
|
||||||
|
/* If the transfer consist from only one TD, we should check */
|
||||||
|
/* if the TD was really executed and deactivated - to prevent */
|
||||||
|
/* false detection of transfer finish. */
|
||||||
|
token_ftd = grub_le_to_cpu32 (cdata->td_first_virt->token);
|
||||||
|
|
||||||
/* Detect QH halted */
|
/* Detect QH halted */
|
||||||
if ((token & GRUB_EHCI_STATUS_HALTED) != 0)
|
if ((token & GRUB_EHCI_STATUS_HALTED) != 0)
|
||||||
return grub_ehci_parse_halt (dev, transfer, actual);
|
return grub_ehci_parse_halt (dev, transfer, actual);
|
||||||
|
|
||||||
/* Detect QH not active - QH is not active and no next TD */
|
/* Detect QH not active - QH is not active and no next TD */
|
||||||
if ((token & GRUB_EHCI_STATUS_ACTIVE) == 0)
|
if (token && ((token & GRUB_EHCI_STATUS_ACTIVE) == 0)
|
||||||
|
&& ((token_ftd & GRUB_EHCI_STATUS_ACTIVE) == 0))
|
||||||
{
|
{
|
||||||
/* It could be finish at all or short packet condition */
|
/* It could be finish at all or short packet condition */
|
||||||
if ((grub_le_to_cpu32 (cdata->qh_virt->td_overlay.next_td)
|
if ((grub_le_to_cpu32 (cdata->qh_virt->td_overlay.next_td)
|
||||||
|
|
Loading…
Reference in a new issue