summaryrefslogtreecommitdiffstats
path: root/sys/dev/cy
diff options
context:
space:
mode:
authorfsmp <fsmp@FreeBSD.org>1997-08-30 08:08:10 +0000
committerfsmp <fsmp@FreeBSD.org>1997-08-30 08:08:10 +0000
commite2310cdbcf324f3bbeda76add82e773d37ee43cd (patch)
treeab2ac308116ca3f26a9055eae17d100d5901e501 /sys/dev/cy
parent62dbf14e9ad4dbe9bc03c2657d854b47ef4b3f65 (diff)
downloadFreeBSD-src-e2310cdbcf324f3bbeda76add82e773d37ee43cd.zip
FreeBSD-src-e2310cdbcf324f3bbeda76add82e773d37ee43cd.tar.gz
Another round of lock pushdown.
Add a simplelock to deal with disable_intr()/enable_intr() as used in UP kernel. UP kernel expects that this is enough to guarantee exclusive access to regions of code bracketed by these 2 functions. Add a simplelock to bracket clock accesses in clock.c: clock_lock. Help from: Bruce Evans <bde@zeta.org.au>
Diffstat (limited to 'sys/dev/cy')
-rw-r--r--sys/dev/cy/cy.c38
-rw-r--r--sys/dev/cy/cy_isa.c38
2 files changed, 10 insertions, 66 deletions
diff --git a/sys/dev/cy/cy.c b/sys/dev/cy/cy.c
index 65647d3..62a3598 100644
--- a/sys/dev/cy/cy.c
+++ b/sys/dev/cy/cy.c
@@ -27,7 +27,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: cy.c,v 1.49 1997/08/20 06:16:44 fsmp Exp $
+ * $Id: cy.c,v 1.4 1997/08/30 01:23:40 smp Exp smp $
*/
#include "cy.h"
@@ -756,26 +756,22 @@ open_top:
}
disable_intr();
- COM_LOCK();
(void) inb(com->line_status_port);
(void) inb(com->data_port);
com->prev_modem_status = com->last_modem_status
= inb(com->modem_status_port);
outb(iobase + com_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS
| IER_EMSC);
- COM_UNLOCK();
enable_intr();
#else /* !0 */
/* XXX raise RTS too */
(void)commctl(com, TIOCM_DTR | TIOCM_RTS, DMSET);
disable_intr();
- COM_LOCK();
com->prev_modem_status = com->last_modem_status
= cd_inb(iobase, CD1400_MSVR2, com->cy_align);
cd_outb(iobase, CD1400_SRER, com->cy_align,
com->intr_enable
= CD1400_SRER_MDMCH | CD1400_SRER_RXDATA);
- COM_UNLOCK();
enable_intr();
#endif /* 0 */
/*
@@ -877,9 +873,7 @@ comhardclose(com)
outb(iobase + com_ier, 0);
#else
disable_intr();
- COM_LOCK();
cd_outb(iobase, CD1400_SRER, com->cy_align, com->intr_enable = 0);
- COM_UNLOCK();
enable_intr();
#endif
tp = com->tp;
@@ -994,6 +988,8 @@ siointr(unit)
int baseu, cyu, cy_align;
u_char status;
+ MPINTR_LOCK(); /* XXX could this be placed down lower in the loop? */
+
baseu = unit * CY_MAX_PORTS;
cy_iobase = com_addr(baseu)->cy_iobase;
cy_align = com_addr(baseu)->cy_align;
@@ -1340,6 +1336,8 @@ cont:
cd_outb(cy_iobase, CY_CLEAR_INTR, cy_align, 0);
schedsofttty();
+
+ MPINTR_UNLOCK();
}
#if 0
@@ -1537,7 +1535,6 @@ repeat:
* loop.
*/
disable_intr();
- COM_LOCK();
incc = com->iptr - com->ibuf;
com->iptr = com->ibuf;
if (com->state & CS_CHECKMSR) {
@@ -1545,7 +1542,6 @@ repeat:
com->state &= ~CS_CHECKMSR;
}
com_events -= incc;
- COM_UNLOCK();
enable_intr();
if (incc != 0)
log(LOG_DEBUG,
@@ -1561,7 +1557,6 @@ repeat:
} else {
buf = ibuf;
disable_intr();
- COM_LOCK();
incc = com->iptr - buf;
com_events -= incc;
if (ibuf == com->ibuf1)
@@ -1590,7 +1585,6 @@ repeat:
cd_outb(iobase, CD1400_MSVR1, com->cy_align,
com->mcr_image |= MCR_RTS);
#endif
- COM_UNLOCK();
enable_intr();
com->ibuf = ibuf;
}
@@ -1599,13 +1593,11 @@ repeat:
u_char delta_modem_status;
disable_intr();
- COM_LOCK();
delta_modem_status = com->last_modem_status
^ com->prev_modem_status;
com->prev_modem_status = com->last_modem_status;
com_events -= LOTS_OF_EVENTS;
com->state &= ~CS_CHECKMSR;
- COM_UNLOCK();
enable_intr();
if (delta_modem_status & MSR_DCD)
(*linesw[tp->t_line].l_modem)
@@ -1613,12 +1605,10 @@ repeat:
}
if (com->state & CS_ODONE) {
disable_intr();
- COM_LOCK();
com_events -= LOTS_OF_EVENTS;
com->state &= ~CS_ODONE;
if (!(com->state & CS_BUSY))
com->tp->t_state &= ~TS_BUSY;
- COM_UNLOCK();
enable_intr();
(*linesw[tp->t_line].l_start)(tp);
}
@@ -1961,7 +1951,6 @@ comparam(tp, t)
* to change all atomically.
*/
disable_intr();
- COM_LOCK();
com->state &= ~CS_TTGO;
if (!(tp->t_state & TS_TTSTOP))
@@ -2023,7 +2012,6 @@ comparam(tp, t)
com->intr_enable &= ~CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
splx(s);
comstart(tp);
@@ -2053,7 +2041,6 @@ comstart(tp)
#endif
disable_intr();
- COM_LOCK();
cd_outb(iobase, CD1400_CAR, com->cy_align, unit & CD1400_CAR_CHAN);
if (tp->t_state & TS_TTSTOP) {
com->state &= ~CS_TTGO;
@@ -2085,7 +2072,6 @@ comstart(tp)
com->mcr_image |= MCR_RTS);
#endif
}
- COM_UNLOCK();
enable_intr();
if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) {
splx(s);
@@ -2105,7 +2091,6 @@ comstart(tp)
com->obufs[0].l_next = NULL;
com->obufs[0].l_queued = TRUE;
disable_intr();
- COM_LOCK();
if (com->state & CS_BUSY) {
qp = com->obufq.l_next;
while ((next = qp->l_next) != NULL)
@@ -2122,7 +2107,6 @@ comstart(tp)
com->intr_enable
|= CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
}
if (tp->t_outq.c_cc != 0 && !com->obufs[1].l_queued) {
@@ -2135,7 +2119,6 @@ comstart(tp)
com->obufs[1].l_next = NULL;
com->obufs[1].l_queued = TRUE;
disable_intr();
- COM_LOCK();
if (com->state & CS_BUSY) {
qp = com->obufq.l_next;
while ((next = qp->l_next) != NULL)
@@ -2152,7 +2135,6 @@ comstart(tp)
com->intr_enable
|= CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
}
tp->t_state |= TS_BUSY;
@@ -2163,10 +2145,8 @@ comstart(tp)
#endif
#if 0
disable_intr();
- COM_LOCK();
if (com->state >= (CS_BUSY | CS_TTGO))
siointr1(com); /* fake interrupt to start output */
- COM_UNLOCK();
enable_intr();
#endif
ttwwakeup(tp);
@@ -2182,7 +2162,6 @@ siostop(tp, rw)
com = com_addr(DEV_TO_UNIT(tp->t_dev));
disable_intr();
- COM_LOCK();
if (rw & FWRITE) {
com->obufs[0].l_queued = FALSE;
com->obufs[1].l_queued = FALSE;
@@ -2195,7 +2174,6 @@ siostop(tp, rw)
com_events -= (com->iptr - com->ibuf);
com->iptr = com->ibuf;
}
- COM_UNLOCK();
enable_intr();
comstart(tp);
@@ -2266,7 +2244,6 @@ commctl(com, bits, how)
if (bits & TIOCM_RTS)
mcr |= MCR_RTS;
disable_intr();
- COM_LOCK();
switch (how) {
case DMSET:
com->mcr_image = mcr;
@@ -2284,7 +2261,6 @@ commctl(com, bits, how)
cd_outb(iobase, CD1400_MSVR2, com->cy_align, mcr);
break;
}
- COM_UNLOCK();
enable_intr();
return (0);
}
@@ -2347,9 +2323,7 @@ comwakeup(chan)
if (com != NULL
&& (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) {
disable_intr();
- COM_LOCK();
siointr1(com);
- COM_UNLOCK();
enable_intr();
}
}
@@ -2372,10 +2346,8 @@ comwakeup(chan)
u_long total;
disable_intr();
- COM_LOCK();
delta = com->delta_error_counts[errnum];
com->delta_error_counts[errnum] = 0;
- COM_UNLOCK();
enable_intr();
if (delta == 0)
continue;
diff --git a/sys/dev/cy/cy_isa.c b/sys/dev/cy/cy_isa.c
index 65647d3..62a3598 100644
--- a/sys/dev/cy/cy_isa.c
+++ b/sys/dev/cy/cy_isa.c
@@ -27,7 +27,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: cy.c,v 1.49 1997/08/20 06:16:44 fsmp Exp $
+ * $Id: cy.c,v 1.4 1997/08/30 01:23:40 smp Exp smp $
*/
#include "cy.h"
@@ -756,26 +756,22 @@ open_top:
}
disable_intr();
- COM_LOCK();
(void) inb(com->line_status_port);
(void) inb(com->data_port);
com->prev_modem_status = com->last_modem_status
= inb(com->modem_status_port);
outb(iobase + com_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS
| IER_EMSC);
- COM_UNLOCK();
enable_intr();
#else /* !0 */
/* XXX raise RTS too */
(void)commctl(com, TIOCM_DTR | TIOCM_RTS, DMSET);
disable_intr();
- COM_LOCK();
com->prev_modem_status = com->last_modem_status
= cd_inb(iobase, CD1400_MSVR2, com->cy_align);
cd_outb(iobase, CD1400_SRER, com->cy_align,
com->intr_enable
= CD1400_SRER_MDMCH | CD1400_SRER_RXDATA);
- COM_UNLOCK();
enable_intr();
#endif /* 0 */
/*
@@ -877,9 +873,7 @@ comhardclose(com)
outb(iobase + com_ier, 0);
#else
disable_intr();
- COM_LOCK();
cd_outb(iobase, CD1400_SRER, com->cy_align, com->intr_enable = 0);
- COM_UNLOCK();
enable_intr();
#endif
tp = com->tp;
@@ -994,6 +988,8 @@ siointr(unit)
int baseu, cyu, cy_align;
u_char status;
+ MPINTR_LOCK(); /* XXX could this be placed down lower in the loop? */
+
baseu = unit * CY_MAX_PORTS;
cy_iobase = com_addr(baseu)->cy_iobase;
cy_align = com_addr(baseu)->cy_align;
@@ -1340,6 +1336,8 @@ cont:
cd_outb(cy_iobase, CY_CLEAR_INTR, cy_align, 0);
schedsofttty();
+
+ MPINTR_UNLOCK();
}
#if 0
@@ -1537,7 +1535,6 @@ repeat:
* loop.
*/
disable_intr();
- COM_LOCK();
incc = com->iptr - com->ibuf;
com->iptr = com->ibuf;
if (com->state & CS_CHECKMSR) {
@@ -1545,7 +1542,6 @@ repeat:
com->state &= ~CS_CHECKMSR;
}
com_events -= incc;
- COM_UNLOCK();
enable_intr();
if (incc != 0)
log(LOG_DEBUG,
@@ -1561,7 +1557,6 @@ repeat:
} else {
buf = ibuf;
disable_intr();
- COM_LOCK();
incc = com->iptr - buf;
com_events -= incc;
if (ibuf == com->ibuf1)
@@ -1590,7 +1585,6 @@ repeat:
cd_outb(iobase, CD1400_MSVR1, com->cy_align,
com->mcr_image |= MCR_RTS);
#endif
- COM_UNLOCK();
enable_intr();
com->ibuf = ibuf;
}
@@ -1599,13 +1593,11 @@ repeat:
u_char delta_modem_status;
disable_intr();
- COM_LOCK();
delta_modem_status = com->last_modem_status
^ com->prev_modem_status;
com->prev_modem_status = com->last_modem_status;
com_events -= LOTS_OF_EVENTS;
com->state &= ~CS_CHECKMSR;
- COM_UNLOCK();
enable_intr();
if (delta_modem_status & MSR_DCD)
(*linesw[tp->t_line].l_modem)
@@ -1613,12 +1605,10 @@ repeat:
}
if (com->state & CS_ODONE) {
disable_intr();
- COM_LOCK();
com_events -= LOTS_OF_EVENTS;
com->state &= ~CS_ODONE;
if (!(com->state & CS_BUSY))
com->tp->t_state &= ~TS_BUSY;
- COM_UNLOCK();
enable_intr();
(*linesw[tp->t_line].l_start)(tp);
}
@@ -1961,7 +1951,6 @@ comparam(tp, t)
* to change all atomically.
*/
disable_intr();
- COM_LOCK();
com->state &= ~CS_TTGO;
if (!(tp->t_state & TS_TTSTOP))
@@ -2023,7 +2012,6 @@ comparam(tp, t)
com->intr_enable &= ~CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
splx(s);
comstart(tp);
@@ -2053,7 +2041,6 @@ comstart(tp)
#endif
disable_intr();
- COM_LOCK();
cd_outb(iobase, CD1400_CAR, com->cy_align, unit & CD1400_CAR_CHAN);
if (tp->t_state & TS_TTSTOP) {
com->state &= ~CS_TTGO;
@@ -2085,7 +2072,6 @@ comstart(tp)
com->mcr_image |= MCR_RTS);
#endif
}
- COM_UNLOCK();
enable_intr();
if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) {
splx(s);
@@ -2105,7 +2091,6 @@ comstart(tp)
com->obufs[0].l_next = NULL;
com->obufs[0].l_queued = TRUE;
disable_intr();
- COM_LOCK();
if (com->state & CS_BUSY) {
qp = com->obufq.l_next;
while ((next = qp->l_next) != NULL)
@@ -2122,7 +2107,6 @@ comstart(tp)
com->intr_enable
|= CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
}
if (tp->t_outq.c_cc != 0 && !com->obufs[1].l_queued) {
@@ -2135,7 +2119,6 @@ comstart(tp)
com->obufs[1].l_next = NULL;
com->obufs[1].l_queued = TRUE;
disable_intr();
- COM_LOCK();
if (com->state & CS_BUSY) {
qp = com->obufq.l_next;
while ((next = qp->l_next) != NULL)
@@ -2152,7 +2135,6 @@ comstart(tp)
com->intr_enable
|= CD1400_SRER_TXRDY);
}
- COM_UNLOCK();
enable_intr();
}
tp->t_state |= TS_BUSY;
@@ -2163,10 +2145,8 @@ comstart(tp)
#endif
#if 0
disable_intr();
- COM_LOCK();
if (com->state >= (CS_BUSY | CS_TTGO))
siointr1(com); /* fake interrupt to start output */
- COM_UNLOCK();
enable_intr();
#endif
ttwwakeup(tp);
@@ -2182,7 +2162,6 @@ siostop(tp, rw)
com = com_addr(DEV_TO_UNIT(tp->t_dev));
disable_intr();
- COM_LOCK();
if (rw & FWRITE) {
com->obufs[0].l_queued = FALSE;
com->obufs[1].l_queued = FALSE;
@@ -2195,7 +2174,6 @@ siostop(tp, rw)
com_events -= (com->iptr - com->ibuf);
com->iptr = com->ibuf;
}
- COM_UNLOCK();
enable_intr();
comstart(tp);
@@ -2266,7 +2244,6 @@ commctl(com, bits, how)
if (bits & TIOCM_RTS)
mcr |= MCR_RTS;
disable_intr();
- COM_LOCK();
switch (how) {
case DMSET:
com->mcr_image = mcr;
@@ -2284,7 +2261,6 @@ commctl(com, bits, how)
cd_outb(iobase, CD1400_MSVR2, com->cy_align, mcr);
break;
}
- COM_UNLOCK();
enable_intr();
return (0);
}
@@ -2347,9 +2323,7 @@ comwakeup(chan)
if (com != NULL
&& (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) {
disable_intr();
- COM_LOCK();
siointr1(com);
- COM_UNLOCK();
enable_intr();
}
}
@@ -2372,10 +2346,8 @@ comwakeup(chan)
u_long total;
disable_intr();
- COM_LOCK();
delta = com->delta_error_counts[errnum];
com->delta_error_counts[errnum] = 0;
- COM_UNLOCK();
enable_intr();
if (delta == 0)
continue;
OpenPOWER on IntegriCloud