mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 12:09:58 +00:00
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:
parent
a67ba3b6f8
commit
5bd2c0d7a6
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user