Add support for automatic hardware flow control for 16[679]50 UARTs.
We simply use the detected FIFO size to determine whether we have a post 16550 UART or not. The support lacks proper serialization of hardware access for now.
This commit is contained in:
parent
58abfe0051
commit
84c7b427f5
@ -461,7 +461,7 @@ static int
|
|||||||
ns8250_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
|
ns8250_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
|
||||||
{
|
{
|
||||||
struct uart_bas *bas;
|
struct uart_bas *bas;
|
||||||
uint8_t lcr;
|
uint8_t efr, lcr;
|
||||||
|
|
||||||
bas = &sc->sc_bas;
|
bas = &sc->sc_bas;
|
||||||
switch (request) {
|
switch (request) {
|
||||||
@ -474,6 +474,36 @@ ns8250_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
|
|||||||
uart_setreg(bas, REG_LCR, lcr);
|
uart_setreg(bas, REG_LCR, lcr);
|
||||||
uart_barrier(bas);
|
uart_barrier(bas);
|
||||||
break;
|
break;
|
||||||
|
case UART_IOCTL_IFLOW:
|
||||||
|
lcr = uart_getreg(bas, REG_LCR);
|
||||||
|
uart_barrier(bas);
|
||||||
|
uart_setreg(bas, REG_LCR, 0xbf);
|
||||||
|
uart_barrier(bas);
|
||||||
|
efr = uart_getreg(bas, REG_EFR);
|
||||||
|
if (data)
|
||||||
|
efr |= EFR_RTS;
|
||||||
|
else
|
||||||
|
efr &= ~EFR_RTS;
|
||||||
|
uart_setreg(bas, REG_EFR, efr);
|
||||||
|
uart_barrier(bas);
|
||||||
|
uart_setreg(bas, REG_LCR, lcr);
|
||||||
|
uart_barrier(bas);
|
||||||
|
break;
|
||||||
|
case UART_IOCTL_OFLOW:
|
||||||
|
lcr = uart_getreg(bas, REG_LCR);
|
||||||
|
uart_barrier(bas);
|
||||||
|
uart_setreg(bas, REG_LCR, 0xbf);
|
||||||
|
uart_barrier(bas);
|
||||||
|
efr = uart_getreg(bas, REG_EFR);
|
||||||
|
if (data)
|
||||||
|
efr |= EFR_CTS;
|
||||||
|
else
|
||||||
|
efr &= ~EFR_CTS;
|
||||||
|
uart_setreg(bas, REG_EFR, efr);
|
||||||
|
uart_barrier(bas);
|
||||||
|
uart_setreg(bas, REG_LCR, lcr);
|
||||||
|
uart_barrier(bas);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
@ -650,6 +680,12 @@ ns8250_bus_probe(struct uart_softc *sc)
|
|||||||
*/
|
*/
|
||||||
sc->sc_txfifosz = 16;
|
sc->sc_txfifosz = 16;
|
||||||
|
|
||||||
|
/* 16650s or higher have automatic flow control. */
|
||||||
|
if (sc->sc_rxfifosz > 16) {
|
||||||
|
sc->sc_hwiflow = 1;
|
||||||
|
sc->sc_hwoflow = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user