1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
--- 16 unchanged lines hidden (view full) ---
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $FreeBSD: head/sys/dev/sio/sio.c 51088 1999-09-08 13:46:54Z peter $
34 * from: @(#)com.c 7.5 (Berkeley) 5/16/91
35 * from: i386/isa sio.c,v 1.234
36 */
37
38#include "opt_comconsole.h"
39#include "opt_compat.h"
40#include "opt_ddb.h"
41#include "opt_sio.h"
--- 260 unchanged lines hidden (view full) ---
302static void siointr __P((void *arg));
303static int commctl __P((struct com_s *com, int bits, int how));
304static int comparam __P((struct tty *tp, struct termios *t));
305static swihand_t siopoll;
306static int sioprobe __P((device_t dev));
307static void siosettimeout __P((void));
308static int siosetwater __P((struct com_s *com, speed_t speed));
309static void comstart __P((struct tty *tp));
310static timeout_t comwakeup;
311static void disc_optim __P((struct tty *tp, struct termios *t,
312 struct com_s *com));
313
314
315static char driver_name[] = "sio";
316
317/* table and macro for fast conversion from a unit number to its com struct */
--- 15 unchanged lines hidden (view full) ---
333 sizeof(struct com_s),
334};
335
336static d_open_t sioopen;
337static d_close_t sioclose;
338static d_read_t sioread;
339static d_write_t siowrite;
340static d_ioctl_t sioioctl;
341static d_stop_t siostop;
342static d_devtotty_t siodevtotty;
343
344#define CDEV_MAJOR 28
345static struct cdevsw sio_cdevsw = {
346 /* open */ sioopen,
347 /* close */ sioclose,
348 /* read */ sioread,
349 /* write */ siowrite,
350 /* ioctl */ sioioctl,
351 /* stop */ siostop,
352 /* reset */ noreset,
353 /* devtotty */ siodevtotty,
354 /* poll */ ttpoll,
355 /* mmap */ nommap,
356 /* strategy */ nostrategy,
357 /* name */ driver_name,
358 /* parms */ noparms,
359 /* maj */ CDEV_MAJOR,
360 /* dump */ nodump,
361 /* psize */ nopsize,
362 /* flags */ D_TTY,
--- 842 unchanged lines hidden (view full) ---
1205 /*
1206 * The device isn't open, so there are no conflicts.
1207 * Initialize it. Initialization is done twice in many
1208 * cases: to preempt sleeping callin opens if we are
1209 * callout, and to complete a callin open after DCD rises.
1210 */
1211 tp->t_oproc = comstart;
1212 tp->t_param = comparam;
1213 tp->t_dev = dev;
1214 tp->t_termios = mynor & CALLOUT_MASK
1215 ? com->it_out : com->it_in;
1216 (void)commctl(com, TIOCM_DTR | TIOCM_RTS, DMSET);
1217 com->poll = com->no_irq;
1218 com->poll_output = com->loses_outints;
1219 ++com->wopeners;
1220 error = comparam(tp, &tp->t_termios);
--- 110 unchanged lines hidden (view full) ---
1331 mynor = minor(dev);
1332 if (mynor & CONTROL_MASK)
1333 return (0);
1334 com = com_addr(MINOR_TO_UNIT(mynor));
1335 tp = com->tp;
1336 s = spltty();
1337 (*linesw[tp->t_line].l_close)(tp, flag);
1338 disc_optim(tp, &tp->t_termios, com);
1339 siostop(tp, FREAD | FWRITE);
1340 comhardclose(com);
1341 ttyclose(tp);
1342 siosettimeout();
1343 splx(s);
1344 if (com->gone) {
1345 printf("sio%d: gone\n", com->unit);
1346 s = spltty();
1347 if (com->ibuf != NULL)
--- 1022 unchanged lines hidden (view full) ---
2370 if (com->state >= (CS_BUSY | CS_TTGO))
2371 siointr1(com); /* fake interrupt to start output */
2372 enable_intr();
2373 ttwwakeup(tp);
2374 splx(s);
2375}
2376
2377static void
2378siostop(tp, rw)
2379 struct tty *tp;
2380 int rw;
2381{
2382 struct com_s *com;
2383
2384 com = com_addr(DEV_TO_UNIT(tp->t_dev));
2385 if (com->gone)
2386 return;
--- 23 unchanged lines hidden (view full) ---
2410 FIFO_RCV_RST | com->fifo_image);
2411 com_events -= (com->iptr - com->ibuf);
2412 com->iptr = com->ibuf;
2413 }
2414 enable_intr();
2415 comstart(tp);
2416}
2417
2418static struct tty *
2419siodevtotty(dev)
2420 dev_t dev;
2421{
2422 int mynor;
2423 int unit;
2424
2425 mynor = minor(dev);
2426 if (mynor & CONTROL_MASK)
2427 return (NULL);
2428 unit = MINOR_TO_UNIT(mynor);
2429 if ((u_int) unit >= NSIOTOT)
2430 return (NULL);
2431 return (dev->si_tty);
2432}
2433
2434static int
2435commctl(com, bits, how)
2436 struct com_s *com;
2437 int bits;
2438 int how;
2439{
2440 int mcr;
2441 int msr;
--- 619 unchanged lines hidden ---
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
--- 16 unchanged lines hidden (view full) ---
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $FreeBSD: head/sys/dev/sio/sio.c 51088 1999-09-08 13:46:54Z peter $
34 * from: @(#)com.c 7.5 (Berkeley) 5/16/91
35 * from: i386/isa sio.c,v 1.234
36 */
37
38#include "opt_comconsole.h"
39#include "opt_compat.h"
40#include "opt_ddb.h"
41#include "opt_sio.h"
--- 260 unchanged lines hidden (view full) ---
302static void siointr __P((void *arg));
303static int commctl __P((struct com_s *com, int bits, int how));
304static int comparam __P((struct tty *tp, struct termios *t));
305static swihand_t siopoll;
306static int sioprobe __P((device_t dev));
307static void siosettimeout __P((void));
308static int siosetwater __P((struct com_s *com, speed_t speed));
309static void comstart __P((struct tty *tp));
310static timeout_t comwakeup;
311static void disc_optim __P((struct tty *tp, struct termios *t,
312 struct com_s *com));
313
314
315static char driver_name[] = "sio";
316
317/* table and macro for fast conversion from a unit number to its com struct */
--- 15 unchanged lines hidden (view full) ---
333 sizeof(struct com_s),
334};
335
336static d_open_t sioopen;
337static d_close_t sioclose;
338static d_read_t sioread;
339static d_write_t siowrite;
340static d_ioctl_t sioioctl;
341static d_stop_t siostop;
342static d_devtotty_t siodevtotty;
343
344#define CDEV_MAJOR 28
345static struct cdevsw sio_cdevsw = {
346 /* open */ sioopen,
347 /* close */ sioclose,
348 /* read */ sioread,
349 /* write */ siowrite,
350 /* ioctl */ sioioctl,
351 /* stop */ siostop,
352 /* reset */ noreset,
353 /* devtotty */ siodevtotty,
354 /* poll */ ttpoll,
355 /* mmap */ nommap,
356 /* strategy */ nostrategy,
357 /* name */ driver_name,
358 /* parms */ noparms,
359 /* maj */ CDEV_MAJOR,
360 /* dump */ nodump,
361 /* psize */ nopsize,
362 /* flags */ D_TTY,
--- 842 unchanged lines hidden (view full) ---
1205 /*
1206 * The device isn't open, so there are no conflicts.
1207 * Initialize it. Initialization is done twice in many
1208 * cases: to preempt sleeping callin opens if we are
1209 * callout, and to complete a callin open after DCD rises.
1210 */
1211 tp->t_oproc = comstart;
1212 tp->t_param = comparam;
1213 tp->t_dev = dev;
1214 tp->t_termios = mynor & CALLOUT_MASK
1215 ? com->it_out : com->it_in;
1216 (void)commctl(com, TIOCM_DTR | TIOCM_RTS, DMSET);
1217 com->poll = com->no_irq;
1218 com->poll_output = com->loses_outints;
1219 ++com->wopeners;
1220 error = comparam(tp, &tp->t_termios);
--- 110 unchanged lines hidden (view full) ---
1331 mynor = minor(dev);
1332 if (mynor & CONTROL_MASK)
1333 return (0);
1334 com = com_addr(MINOR_TO_UNIT(mynor));
1335 tp = com->tp;
1336 s = spltty();
1337 (*linesw[tp->t_line].l_close)(tp, flag);
1338 disc_optim(tp, &tp->t_termios, com);
1339 siostop(tp, FREAD | FWRITE);
1340 comhardclose(com);
1341 ttyclose(tp);
1342 siosettimeout();
1343 splx(s);
1344 if (com->gone) {
1345 printf("sio%d: gone\n", com->unit);
1346 s = spltty();
1347 if (com->ibuf != NULL)
--- 1022 unchanged lines hidden (view full) ---
2370 if (com->state >= (CS_BUSY | CS_TTGO))
2371 siointr1(com); /* fake interrupt to start output */
2372 enable_intr();
2373 ttwwakeup(tp);
2374 splx(s);
2375}
2376
2377static void
2378siostop(tp, rw)
2379 struct tty *tp;
2380 int rw;
2381{
2382 struct com_s *com;
2383
2384 com = com_addr(DEV_TO_UNIT(tp->t_dev));
2385 if (com->gone)
2386 return;
--- 23 unchanged lines hidden (view full) ---
2410 FIFO_RCV_RST | com->fifo_image);
2411 com_events -= (com->iptr - com->ibuf);
2412 com->iptr = com->ibuf;
2413 }
2414 enable_intr();
2415 comstart(tp);
2416}
2417
2418static struct tty *
2419siodevtotty(dev)
2420 dev_t dev;
2421{
2422 int mynor;
2423 int unit;
2424
2425 mynor = minor(dev);
2426 if (mynor & CONTROL_MASK)
2427 return (NULL);
2428 unit = MINOR_TO_UNIT(mynor);
2429 if ((u_int) unit >= NSIOTOT)
2430 return (NULL);
2431 return (dev->si_tty);
2432}
2433
2434static int
2435commctl(com, bits, how)
2436 struct com_s *com;
2437 int bits;
2438 int how;
2439{
2440 int mcr;
2441 int msr;
--- 619 unchanged lines hidden ---