Fix bogons in previous change:
* The fact that IIR_NOPEND was not set on entry does *not* mean that no transmission was in progress. Besides, we don't want to throw away receive interrupts either. * In the !clearirq case, we didn't splx().
This commit is contained in:
parent
7bd441a637
commit
85ad0d175c
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: com.c,v 1.156 1999/03/29 10:01:39 ross Exp $ */
|
/* $NetBSD: com.c,v 1.157 1999/03/29 13:21:15 mycroft Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
|
||||||
|
@ -2174,32 +2174,25 @@ com_common_putc(iot, ioh, c)
|
||||||
int c;
|
int c;
|
||||||
{
|
{
|
||||||
int s = splserial();
|
int s = splserial();
|
||||||
int clearirq;
|
|
||||||
u_char stat;
|
u_char stat;
|
||||||
int timo;
|
int timo;
|
||||||
|
|
||||||
/* wait for any pending transmission to finish */
|
/* wait for any pending transmission to finish */
|
||||||
timo = 500;
|
timo = 1500;
|
||||||
while (!ISSET(stat = bus_space_read_1(iot, ioh, com_lsr), LSR_TXRDY)
|
while (!ISSET(stat = bus_space_read_1(iot, ioh, com_lsr), LSR_TXRDY)
|
||||||
&& --timo)
|
&& --timo)
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
clearirq = ISSET(bus_space_read_1(iot, ioh, com_iir), IIR_NOPEND);
|
|
||||||
COM_BARRIER(iot, ioh, BR | BW);
|
|
||||||
bus_space_write_1(iot, ioh, com_data, c);
|
bus_space_write_1(iot, ioh, com_data, c);
|
||||||
COM_BARRIER(iot, ioh, BR | BW);
|
COM_BARRIER(iot, ioh, BR | BW);
|
||||||
|
|
||||||
/* wait for this transmission to complete */
|
/* wait for this transmission to complete */
|
||||||
timo = 15000;
|
timo = 15000;
|
||||||
while (!ISSET(stat = bus_space_read_1(iot, ioh, com_lsr), LSR_TXRDY)
|
while (!ISSET(stat = bus_space_read_1(iot, ioh, com_lsr), LSR_TXRDY)
|
||||||
&& --timo)
|
&& --timo)
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
if(clearirq != 0) {
|
|
||||||
/* clear any interrupts generated by this transmission */
|
|
||||||
(void)bus_space_read_1(iot, ioh, com_iir);
|
|
||||||
COM_BARRIER(iot, ioh, BR | BW);
|
|
||||||
splx(s);
|
splx(s);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue