UHCI spurious interrut fix

Only raise an interrupt if the TD has actually completed.

Signed-off-by: Paul Brook <paul@codesourcery.com>
This commit is contained in:
Paul Brook 2010-04-04 21:48:31 +01:00
parent a67ba3b6f8
commit 5bd2c0d7a6

View File

@ -680,9 +680,6 @@ static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_
ret = async->packet.len; ret = async->packet.len;
if (td->ctrl & TD_CTRL_IOC)
*int_mask |= 0x01;
if (td->ctrl & TD_CTRL_IOS) if (td->ctrl & TD_CTRL_IOS)
td->ctrl &= ~TD_CTRL_ACTIVE; td->ctrl &= ~TD_CTRL_ACTIVE;
@ -696,6 +693,8 @@ static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_
here. The docs are somewhat unclear, but win2k relies on this here. The docs are somewhat unclear, but win2k relies on this
behavior. */ behavior. */
td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK); td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
if (td->ctrl & TD_CTRL_IOC)
*int_mask |= 0x01;
if (pid == USB_TOKEN_IN) { if (pid == USB_TOKEN_IN) {
if (len > max_len) { if (len > max_len) {
@ -753,6 +752,8 @@ out:
if (err == 0) { if (err == 0) {
td->ctrl &= ~TD_CTRL_ACTIVE; td->ctrl &= ~TD_CTRL_ACTIVE;
s->status |= UHCI_STS_USBERR; s->status |= UHCI_STS_USBERR;
if (td->ctrl & TD_CTRL_IOC)
*int_mask |= 0x01;
uhci_update_irq(s); uhci_update_irq(s);
} }
} }