1/*-
2 * cyclades cyclom-y serial driver
3 * Andrew Herbert <andrew@werple.apana.org.au>, 17 August 1993
4 *
5 * Copyright (c) 1993 Andrew Herbert.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
--- 13 unchanged lines hidden (view full) ---
22 * NO EVENT SHALL I BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $FreeBSD: head/sys/dev/cy/cy_isa.c 50477 1999-08-28 01:08:13Z peter $
31 */
32
33#include "opt_compat.h"
34#include "cy.h"
35
36/*
37 * TODO:
38 * Atomic COR change.
--- 79 unchanged lines hidden (view full) ---
118#define comparam cyparam
119#define comspeed cyspeed
120#define comstart cystart
121#define comwakeup cywakeup
122#define nsio_tty ncy_tty
123#define p_com_addr p_cy_addr
124#define sioattach cyattach
125#define sioclose cyclose
126#define siodevtotty cydevtotty
127#define siodriver cydriver
128#define siodtrwakeup cydtrwakeup
129#define sioinput cyinput
130#define siointr cyintr
131#define siointr1 cyintr1
132#define sioioctl cyioctl
133#define sioopen cyopen
134#define siopoll cypoll
135#define sioprobe cyprobe
136#define sioread cyread
137#define siosettimeout cysettimeout
138#define siosetwater cysetwater
139#define siostop cystop
140#define siowrite cywrite
141#define sio_registered cy_registered
142#define sio_timeout cy_timeout
143#define sio_timeout_handle cy_timeout_handle
144#define sio_timeouts_until_log cy_timeouts_until_log
145#define sio_tty cy_tty
146
147#define CY_MAX_PORTS (CD1400_NO_OF_CHANNELS * CY_MAX_CD1400s)
--- 26 unchanged lines hidden (view full) ---
174/*
175 * com state bits.
176 * (CS_BUSY | CS_TTGO) and (CS_BUSY | CS_TTGO | CS_ODEVREADY) must be higher
177 * than the other bits so that they can be tested as a group without masking
178 * off the low bits.
179 *
180 * The following com and tty flags correspond closely:
181 * CS_BUSY = TS_BUSY (maintained by comstart(), siopoll() and
182 * siostop())
183 * CS_TTGO = ~TS_TTSTOP (maintained by comparam() and comstart())
184 * CS_CTS_OFLOW = CCTS_OFLOW (maintained by comparam())
185 * CS_RTS_IFLOW = CRTS_IFLOW (maintained by comparam())
186 * TS_FLUSH is not used.
187 * XXX I think TIOCSETA doesn't clear TS_TTSTOP when it clears IXON.
188 * XXX CS_*FLOW should be CF_*FLOW in com->flags (control flags not state).
189 */
190#define CS_BUSY 0x80 /* output in progress */
--- 151 unchanged lines hidden (view full) ---
342static int comparam __P((struct tty *tp, struct termios *t));
343static swihand_t siopoll;
344static int sioprobe __P((struct isa_device *dev));
345static void siosettimeout __P((void));
346static int siosetwater __P((struct com_s *com, speed_t speed));
347static int comspeed __P((speed_t speed, u_long cy_clock,
348 int *prescaler_io));
349static void comstart __P((struct tty *tp));
350static timeout_t comwakeup;
351static void disc_optim __P((struct tty *tp, struct termios *t,
352 struct com_s *com));
353
354#ifdef CyDebug
355void cystatus __P((int unit));
356#endif
357
--- 7 unchanged lines hidden (view full) ---
365 sioprobe, sioattach, driver_name
366};
367
368static d_open_t sioopen;
369static d_close_t sioclose;
370static d_read_t sioread;
371static d_write_t siowrite;
372static d_ioctl_t sioioctl;
373static d_stop_t siostop;
374static d_devtotty_t siodevtotty;
375
376#define CDEV_MAJOR 48
377static struct cdevsw sio_cdevsw = {
378 /* open */ sioopen,
379 /* close */ sioclose,
380 /* read */ sioread,
381 /* write */ siowrite,
382 /* ioctl */ sioioctl,
383 /* stop */ siostop,
384 /* reset */ noreset,
385 /* devtotty */ siodevtotty,
386 /* poll */ ttpoll,
387 /* mmap */ nommap,
388 /* strategy */ nostrategy,
389 /* name */ driver_name,
390 /* parms */ noparms,
391 /* maj */ CDEV_MAJOR,
392 /* dump */ nodump,
393 /* psize */ nopsize,
394 /* flags */ D_TTY,
--- 274 unchanged lines hidden (view full) ---
669 return (ENXIO);
670 if (mynor & CONTROL_MASK)
671 return (0);
672#if 0 /* XXX */
673 tp = com->tp = sio_tty[unit] = ttymalloc(sio_tty[unit]);
674#else
675 tp = com->tp = &sio_tty[unit];
676#endif
677 s = spltty();
678 /*
679 * We jump to this label after all non-interrupted sleeps to pick
680 * up any changes of the device state.
681 */
682open_top:
683 while (com->state & CS_DTR_OFF) {
684 error = tsleep(&com->dtr_wait, TTIPRI | PCATCH, "cydtr", 0);
--- 31 unchanged lines hidden (view full) ---
716 } else {
717 /*
718 * The device isn't open, so there are no conflicts.
719 * Initialize it. Initialization is done twice in many
720 * cases: to preempt sleeping callin opens if we are
721 * callout, and to complete a callin open after DCD rises.
722 */
723 tp->t_oproc = comstart;
724 tp->t_param = comparam;
725 tp->t_dev = dev;
726 tp->t_termios = mynor & CALLOUT_MASK
727 ? com->it_out : com->it_in;
728
729 /* Encode per-board unit in LIVR for access in intr routines. */
730 cd_setreg(com, CD1400_LIVR,
731 (unit & CD1400_xIVR_CHAN) << CD1400_xIVR_CHAN_SHIFT);
--- 116 unchanged lines hidden (view full) ---
848 if (mynor & CONTROL_MASK)
849 return (0);
850 com = com_addr(MINOR_TO_UNIT(mynor));
851 tp = com->tp;
852 s = spltty();
853 cd_etc(com, CD1400_ETC_STOPBREAK);
854 (*linesw[tp->t_line].l_close)(tp, flag);
855 disc_optim(tp, &tp->t_termios, com);
856 siostop(tp, FREAD | FWRITE);
857 comhardclose(com);
858 ttyclose(tp);
859 siosettimeout();
860 splx(s);
861#ifdef broken /* session holds a ref to the tty; can't deallocate */
862 ttyfree(tp);
863 com->tp = sio_tty[unit] = NULL;
864#endif
--- 1544 unchanged lines hidden (view full) ---
2409 siointr1(com); /* fake interrupt to start output */
2410 enable_intr();
2411#endif
2412 ttwwakeup(tp);
2413 splx(s);
2414}
2415
2416static void
2417siostop(tp, rw)
2418 struct tty *tp;
2419 int rw;
2420{
2421 struct com_s *com;
2422 bool_t wakeup_etc;
2423
2424 com = com_addr(DEV_TO_UNIT(tp->t_dev));
2425 wakeup_etc = FALSE;
--- 23 unchanged lines hidden (view full) ---
2449 enable_intr();
2450 if (wakeup_etc)
2451 wakeup(&com->etc);
2452 if (rw & FWRITE && com->etc == ETC_NONE)
2453 cd1400_channel_cmd(com, CD1400_CCR_CMDRESET | CD1400_CCR_FTF);
2454 comstart(tp);
2455}
2456
2457static struct tty *
2458siodevtotty(dev)
2459 dev_t dev;
2460{
2461 int mynor;
2462 int unit;
2463
2464 mynor = minor(dev);
2465 if (mynor & CONTROL_MASK)
2466 return (NULL);
2467 unit = MINOR_TO_UNIT(mynor);
2468 if ((u_int) unit >= NSIO)
2469 return (NULL);
2470 return (&sio_tty[unit]);
2471}
2472
2473static int
2474commctl(com, bits, how)
2475 struct com_s *com;
2476 int bits;
2477 int how;
2478{
2479 int mcr;
2480 int msr;
--- 444 unchanged lines hidden ---
2 * cyclades cyclom-y serial driver
3 * Andrew Herbert <andrew@werple.apana.org.au>, 17 August 1993
4 *
5 * Copyright (c) 1993 Andrew Herbert.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
--- 13 unchanged lines hidden (view full) ---
22 * NO EVENT SHALL I BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $FreeBSD: head/sys/dev/cy/cy_isa.c 50477 1999-08-28 01:08:13Z peter $
31 */
32
33#include "opt_compat.h"
34#include "cy.h"
35
36/*
37 * TODO:
38 * Atomic COR change.
--- 79 unchanged lines hidden (view full) ---
118#define comparam cyparam
119#define comspeed cyspeed
120#define comstart cystart
121#define comwakeup cywakeup
122#define nsio_tty ncy_tty
123#define p_com_addr p_cy_addr
124#define sioattach cyattach
125#define sioclose cyclose
126#define siodevtotty cydevtotty
127#define siodriver cydriver
128#define siodtrwakeup cydtrwakeup
129#define sioinput cyinput
130#define siointr cyintr
131#define siointr1 cyintr1
132#define sioioctl cyioctl
133#define sioopen cyopen
134#define siopoll cypoll
135#define sioprobe cyprobe
136#define sioread cyread
137#define siosettimeout cysettimeout
138#define siosetwater cysetwater
139#define siostop cystop
140#define siowrite cywrite
141#define sio_registered cy_registered
142#define sio_timeout cy_timeout
143#define sio_timeout_handle cy_timeout_handle
144#define sio_timeouts_until_log cy_timeouts_until_log
145#define sio_tty cy_tty
146
147#define CY_MAX_PORTS (CD1400_NO_OF_CHANNELS * CY_MAX_CD1400s)
--- 26 unchanged lines hidden (view full) ---
174/*
175 * com state bits.
176 * (CS_BUSY | CS_TTGO) and (CS_BUSY | CS_TTGO | CS_ODEVREADY) must be higher
177 * than the other bits so that they can be tested as a group without masking
178 * off the low bits.
179 *
180 * The following com and tty flags correspond closely:
181 * CS_BUSY = TS_BUSY (maintained by comstart(), siopoll() and
182 * siostop())
183 * CS_TTGO = ~TS_TTSTOP (maintained by comparam() and comstart())
184 * CS_CTS_OFLOW = CCTS_OFLOW (maintained by comparam())
185 * CS_RTS_IFLOW = CRTS_IFLOW (maintained by comparam())
186 * TS_FLUSH is not used.
187 * XXX I think TIOCSETA doesn't clear TS_TTSTOP when it clears IXON.
188 * XXX CS_*FLOW should be CF_*FLOW in com->flags (control flags not state).
189 */
190#define CS_BUSY 0x80 /* output in progress */
--- 151 unchanged lines hidden (view full) ---
342static int comparam __P((struct tty *tp, struct termios *t));
343static swihand_t siopoll;
344static int sioprobe __P((struct isa_device *dev));
345static void siosettimeout __P((void));
346static int siosetwater __P((struct com_s *com, speed_t speed));
347static int comspeed __P((speed_t speed, u_long cy_clock,
348 int *prescaler_io));
349static void comstart __P((struct tty *tp));
350static timeout_t comwakeup;
351static void disc_optim __P((struct tty *tp, struct termios *t,
352 struct com_s *com));
353
354#ifdef CyDebug
355void cystatus __P((int unit));
356#endif
357
--- 7 unchanged lines hidden (view full) ---
365 sioprobe, sioattach, driver_name
366};
367
368static d_open_t sioopen;
369static d_close_t sioclose;
370static d_read_t sioread;
371static d_write_t siowrite;
372static d_ioctl_t sioioctl;
373static d_stop_t siostop;
374static d_devtotty_t siodevtotty;
375
376#define CDEV_MAJOR 48
377static struct cdevsw sio_cdevsw = {
378 /* open */ sioopen,
379 /* close */ sioclose,
380 /* read */ sioread,
381 /* write */ siowrite,
382 /* ioctl */ sioioctl,
383 /* stop */ siostop,
384 /* reset */ noreset,
385 /* devtotty */ siodevtotty,
386 /* poll */ ttpoll,
387 /* mmap */ nommap,
388 /* strategy */ nostrategy,
389 /* name */ driver_name,
390 /* parms */ noparms,
391 /* maj */ CDEV_MAJOR,
392 /* dump */ nodump,
393 /* psize */ nopsize,
394 /* flags */ D_TTY,
--- 274 unchanged lines hidden (view full) ---
669 return (ENXIO);
670 if (mynor & CONTROL_MASK)
671 return (0);
672#if 0 /* XXX */
673 tp = com->tp = sio_tty[unit] = ttymalloc(sio_tty[unit]);
674#else
675 tp = com->tp = &sio_tty[unit];
676#endif
677 s = spltty();
678 /*
679 * We jump to this label after all non-interrupted sleeps to pick
680 * up any changes of the device state.
681 */
682open_top:
683 while (com->state & CS_DTR_OFF) {
684 error = tsleep(&com->dtr_wait, TTIPRI | PCATCH, "cydtr", 0);
--- 31 unchanged lines hidden (view full) ---
716 } else {
717 /*
718 * The device isn't open, so there are no conflicts.
719 * Initialize it. Initialization is done twice in many
720 * cases: to preempt sleeping callin opens if we are
721 * callout, and to complete a callin open after DCD rises.
722 */
723 tp->t_oproc = comstart;
724 tp->t_param = comparam;
725 tp->t_dev = dev;
726 tp->t_termios = mynor & CALLOUT_MASK
727 ? com->it_out : com->it_in;
728
729 /* Encode per-board unit in LIVR for access in intr routines. */
730 cd_setreg(com, CD1400_LIVR,
731 (unit & CD1400_xIVR_CHAN) << CD1400_xIVR_CHAN_SHIFT);
--- 116 unchanged lines hidden (view full) ---
848 if (mynor & CONTROL_MASK)
849 return (0);
850 com = com_addr(MINOR_TO_UNIT(mynor));
851 tp = com->tp;
852 s = spltty();
853 cd_etc(com, CD1400_ETC_STOPBREAK);
854 (*linesw[tp->t_line].l_close)(tp, flag);
855 disc_optim(tp, &tp->t_termios, com);
856 siostop(tp, FREAD | FWRITE);
857 comhardclose(com);
858 ttyclose(tp);
859 siosettimeout();
860 splx(s);
861#ifdef broken /* session holds a ref to the tty; can't deallocate */
862 ttyfree(tp);
863 com->tp = sio_tty[unit] = NULL;
864#endif
--- 1544 unchanged lines hidden (view full) ---
2409 siointr1(com); /* fake interrupt to start output */
2410 enable_intr();
2411#endif
2412 ttwwakeup(tp);
2413 splx(s);
2414}
2415
2416static void
2417siostop(tp, rw)
2418 struct tty *tp;
2419 int rw;
2420{
2421 struct com_s *com;
2422 bool_t wakeup_etc;
2423
2424 com = com_addr(DEV_TO_UNIT(tp->t_dev));
2425 wakeup_etc = FALSE;
--- 23 unchanged lines hidden (view full) ---
2449 enable_intr();
2450 if (wakeup_etc)
2451 wakeup(&com->etc);
2452 if (rw & FWRITE && com->etc == ETC_NONE)
2453 cd1400_channel_cmd(com, CD1400_CCR_CMDRESET | CD1400_CCR_FTF);
2454 comstart(tp);
2455}
2456
2457static struct tty *
2458siodevtotty(dev)
2459 dev_t dev;
2460{
2461 int mynor;
2462 int unit;
2463
2464 mynor = minor(dev);
2465 if (mynor & CONTROL_MASK)
2466 return (NULL);
2467 unit = MINOR_TO_UNIT(mynor);
2468 if ((u_int) unit >= NSIO)
2469 return (NULL);
2470 return (&sio_tty[unit]);
2471}
2472
2473static int
2474commctl(com, bits, how)
2475 struct com_s *com;
2476 int bits;
2477 int how;
2478{
2479 int mcr;
2480 int msr;
--- 444 unchanged lines hidden ---