HomeFreeBSD

Fix hangs caused by z8530_bus_ipend() returning UART_IPEND_TXIDLE

Description

Fix hangs caused by z8530_bus_ipend() returning UART_IPEND_TXIDLE
not as a pending interrupt status, but as a matter of status quo.
Consequently, when there's no data to be transmitted the condition
is not cleared and uart_intr() is stuck in an infinite loop trying
to clear the UART_IPEND_TXIDLE status.
The z8530_bus_ipend() function is changed to return idle only once
after having sent any data.

The root cause for this problem is that we cannot use the interrupt
status bits of the SCC itself. The register that holds the interrupt
status can only be accessed by channel A and holds the status for
both channels. Using the interrupt status register would complicate
the driver because we need to synchronize access to the SCC between
the channels.

Elementary testing: marius

Details

Provenance
marcelAuthored on May 4 2004, 6:58 AM
Parents
rG7dca3f1761be: Increase BUS_SPACE_IAT_MAXSIZE to 33 for the ed driver.
Branches
Unknown
Tags
Unknown

Event Timeline