diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2000-09-08 00:35:46 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2000-09-08 00:35:46 +0000 |
| commit | 60ee19d50032007267de8ed111000511cdbb1ed8 (patch) | |
| tree | e5d7b56b84bd098079bced8401c08c5368cf547b /sys/dev/sio/sio.c | |
| parent | 52a3bfa2e7b420e325ad810ec77328959d1ad17b (diff) | |
Notes
Diffstat (limited to 'sys/dev/sio/sio.c')
| -rw-r--r-- | sys/dev/sio/sio.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index a6f05e762ce8..83a58e73149e 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -303,7 +303,7 @@ static swihand_t siopoll; static int sioprobe __P((device_t dev, int xrid)); static int sio_isa_probe __P((device_t dev)); static void siosettimeout __P((void)); -static int siosetwater __P((struct com_s *com, speed_t speed)); +static int siosetwater __P((struct com_s *com, speed_t speed, int locked)); static void comstart __P((struct tty *tp)); static void comstop __P((struct tty *tp, int rw)); static timeout_t comwakeup; @@ -1181,7 +1181,7 @@ sioattach(dev, xrid) com->it_in.c_ispeed = com->it_in.c_ospeed = comdefaultrate; } else com->it_in.c_ispeed = com->it_in.c_ospeed = TTYDEF_SPEED; - if (siosetwater(com, com->it_in.c_ispeed) != 0) { + if (siosetwater(com, com->it_in.c_ispeed, 0) != 0) { /* * Leave i/o resources allocated if this is a `cn'-level * console, so that other devices can't snarf them. @@ -2417,7 +2417,7 @@ comparam(tp, t) disable_intr(); COM_LOCK(); - (void) siosetwater(com, t->c_ispeed); + (void) siosetwater(com, t->c_ispeed, 1); if (divisor != 0) { sio_setreg(com, com_cfcr, cfcr | CFCR_DLAB); @@ -2516,9 +2516,10 @@ comparam(tp, t) } static int -siosetwater(com, speed) +siosetwater(com, speed, locked) struct com_s *com; speed_t speed; + int locked; { int cp4ticks; u_char *ibuf; @@ -2562,7 +2563,8 @@ siosetwater(com, speed) */ intrsave = save_intr(); disable_intr(); - COM_LOCK(); + if (!locked) + COM_LOCK(); if (com->iptr != com->ibuf) sioinput(com); @@ -2581,7 +2583,8 @@ siosetwater(com, speed) com->ibufend = ibuf + ibufsize; com->ierroff = ibufsize; com->ihighwater = ibuf + 3 * ibufsize / 4; - COM_UNLOCK(); + if (!locked) + COM_UNLOCK(); restore_intr(intrsave); return (0); } |
