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:
mycroft 1999-03-29 13:21:15 +00:00
parent 7bd441a637
commit 85ad0d175c
1 changed files with 4 additions and 11 deletions

View File

@ -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) { splx(s);
/* clear any interrupts generated by this transmission */
(void)bus_space_read_1(iot, ioh, com_iir);
COM_BARRIER(iot, ioh, BR | BW);
splx(s);
}
} }
/* /*