Deleted Added
full compact
rc.c (12658) rc.c (12675)
1/*
2 * Copyright (C) 1995 by Pavel Antonov, Moscow, Russia.
3 * Copyright (C) 1995 by Andrey A. Chernov, Moscow, Russia.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 33 unchanged lines hidden (view full) ---

42#include <sys/proc.h>
43#include <sys/conf.h>
44#include <sys/dkstat.h>
45#include <sys/file.h>
46#include <sys/uio.h>
47#include <sys/kernel.h>
48#include <sys/syslog.h>
49#include <sys/devconf.h>
1/*
2 * Copyright (C) 1995 by Pavel Antonov, Moscow, Russia.
3 * Copyright (C) 1995 by Andrey A. Chernov, Moscow, Russia.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 33 unchanged lines hidden (view full) ---

42#include <sys/proc.h>
43#include <sys/conf.h>
44#include <sys/dkstat.h>
45#include <sys/file.h>
46#include <sys/uio.h>
47#include <sys/kernel.h>
48#include <sys/syslog.h>
49#include <sys/devconf.h>
50#ifdef DEVFS
51#include <sys/devfsext.h>
52#endif /*DEVFS*/
50
51#include <machine/clock.h>
52
53#include <i386/isa/isa.h>
54#include <i386/isa/isa_device.h>
55#include <i386/isa/sioreg.h>
56
57#include <i386/isa/ic/cd180.h>
58#include <i386/isa/rcreg.h>
59
53
54#include <machine/clock.h>
55
56#include <i386/isa/isa.h>
57#include <i386/isa/isa_device.h>
58#include <i386/isa/sioreg.h>
59
60#include <i386/isa/ic/cd180.h>
61#include <i386/isa/rcreg.h>
62
60#ifdef JREMOD
61#include <sys/conf.h>
62#include <sys/kernel.h>
63#ifdef DEVFS
64#include <sys/devfsext.h>
65#endif /*DEVFS*/
66#define CDEV_MAJOR 63
67#endif /*JREMOD*/
68
69/* Prototypes */
70int rcprobe __P((struct isa_device *));
71int rcattach __P((struct isa_device *));
72
73/*-
74 * This space intentionally left blank to stop __LINE__ from screwing up
75 * regression tests :-(.

--- 24 unchanged lines hidden (view full) ---

100#define GET_UNIT(dev) (minor(dev) & 0x3F)
101#define CALLOUT(dev) (minor(dev) & 0x80)
102
103/* For isa routines */
104struct isa_driver rcdriver = {
105 rcprobe, rcattach, "rc"
106};
107
63
64/* Prototypes */
65int rcprobe __P((struct isa_device *));
66int rcattach __P((struct isa_device *));
67
68/*-
69 * This space intentionally left blank to stop __LINE__ from screwing up
70 * regression tests :-(.

--- 24 unchanged lines hidden (view full) ---

95#define GET_UNIT(dev) (minor(dev) & 0x3F)
96#define CALLOUT(dev) (minor(dev) & 0x80)
97
98/* For isa routines */
99struct isa_driver rcdriver = {
100 rcprobe, rcattach, "rc"
101};
102
103static d_open_t rcopen;
104static d_close_t rcclose;
105static d_read_t rcread;
106static d_write_t rcwrite;
107static d_ioctl_t rcioctl;
108static d_stop_t rcstop;
109static d_ttycv_t rcdevtotty;
110
111#define CDEV_MAJOR 63
112struct cdevsw rc_cdevsw =
113 { rcopen, rcclose, rcread, rcwrite, /*63*/
114 rcioctl, rcstop, nxreset, rcdevtotty,/* rc */
115 ttselect, nommap, NULL, "rc", NULL, -1 };
116
108/* Per-board structure */
109static struct rc_softc {
110 u_int rcb_probed; /* 1 - probed, 2 - attached */
111 u_int rcb_addr; /* Base I/O addr */
112 u_int rcb_unit; /* unit # */
113 u_char rcb_dtr; /* DTR status */
114 struct rc_chans *rcb_baserc; /* base rc ptr */
115} rc_softc[NRC];

--- 13 unchanged lines hidden (view full) ---

129 struct tty *rc_tp; /* tty struct */
130 u_char *rc_iptr; /* Chars input buffer */
131 u_char *rc_hiwat; /* hi-water mark */
132 u_char *rc_bufend; /* end of buffer */
133 u_char *rc_optr; /* ptr in output buf */
134 u_char *rc_obufend; /* end of output buf */
135 u_char rc_ibuf[4 * RC_IBUFSIZE]; /* input buffer */
136 u_char rc_obuf[RC_OBUFSIZE]; /* output buffer */
117/* Per-board structure */
118static struct rc_softc {
119 u_int rcb_probed; /* 1 - probed, 2 - attached */
120 u_int rcb_addr; /* Base I/O addr */
121 u_int rcb_unit; /* unit # */
122 u_char rcb_dtr; /* DTR status */
123 struct rc_chans *rcb_baserc; /* base rc ptr */
124} rc_softc[NRC];

--- 13 unchanged lines hidden (view full) ---

138 struct tty *rc_tp; /* tty struct */
139 u_char *rc_iptr; /* Chars input buffer */
140 u_char *rc_hiwat; /* hi-water mark */
141 u_char *rc_bufend; /* end of buffer */
142 u_char *rc_optr; /* ptr in output buf */
143 u_char *rc_obufend; /* end of output buf */
144 u_char rc_ibuf[4 * RC_IBUFSIZE]; /* input buffer */
145 u_char rc_obuf[RC_OBUFSIZE]; /* output buffer */
146#ifdef DEVFS
147 void *devfs_token;
148#endif
137} rc_chans[NRC * CD180_NCHAN];
138
139static int rc_scheduled_event = 0;
140
141/* for pstat -t */
142struct tty rc_tty[NRC * CD180_NCHAN];
143int nrc_tty = NRC * CD180_NCHAN;
144

--- 99 unchanged lines hidden (view full) ---

244int rcattach(dvp)
245 struct isa_device *dvp;
246{
247 register int i, chan, nec = dvp->id_iobase;
248 struct rc_softc *rcb = &rc_softc[dvp->id_unit];
249 struct rc_chans *rc = &rc_chans[dvp->id_unit * CD180_NCHAN];
250 static int rc_wakeup_started = 0;
251 struct tty *tp;
149} rc_chans[NRC * CD180_NCHAN];
150
151static int rc_scheduled_event = 0;
152
153/* for pstat -t */
154struct tty rc_tty[NRC * CD180_NCHAN];
155int nrc_tty = NRC * CD180_NCHAN;
156

--- 99 unchanged lines hidden (view full) ---

256int rcattach(dvp)
257 struct isa_device *dvp;
258{
259 register int i, chan, nec = dvp->id_iobase;
260 struct rc_softc *rcb = &rc_softc[dvp->id_unit];
261 struct rc_chans *rc = &rc_chans[dvp->id_unit * CD180_NCHAN];
262 static int rc_wakeup_started = 0;
263 struct tty *tp;
264 char name[32];
252
253 /* Thorooughly test the device */
254 if (rcb->rcb_probed != RC_PROBED)
255 return 0;
256 rcb->rcb_addr = nec;
257 rcb->rcb_dtr = 0;
258 rcb->rcb_baserc = rc;
259 /*rcb->rcb_chipid = 0x10 + dvp->id_unit;*/

--- 14 unchanged lines hidden (view full) ---

274 rc->rc_dtrwait = 3 * hz;
275 rc->rc_dcdwaits= 0;
276 rc->rc_hotchar = 0;
277 tp = rc->rc_tp = &rc_tty[chan];
278 ttychars(tp);
279 tp->t_lflag = tp->t_iflag = tp->t_oflag = 0;
280 tp->t_cflag = TTYDEF_CFLAG;
281 tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
265
266 /* Thorooughly test the device */
267 if (rcb->rcb_probed != RC_PROBED)
268 return 0;
269 rcb->rcb_addr = nec;
270 rcb->rcb_dtr = 0;
271 rcb->rcb_baserc = rc;
272 /*rcb->rcb_chipid = 0x10 + dvp->id_unit;*/

--- 14 unchanged lines hidden (view full) ---

287 rc->rc_dtrwait = 3 * hz;
288 rc->rc_dcdwaits= 0;
289 rc->rc_hotchar = 0;
290 tp = rc->rc_tp = &rc_tty[chan];
291 ttychars(tp);
292 tp->t_lflag = tp->t_iflag = tp->t_oflag = 0;
293 tp->t_cflag = TTYDEF_CFLAG;
294 tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
295#ifdef DEVFS
296/* FIX THIS to reflect real devices */
297 sprintf(name,"rc%d.%d",dvp->id_unit,chan);
298 rc->devfs_token = devfs_add_devsw( "/", name,
299 &rc_cdevsw,(dvp->id_unit * CD180_NCHAN) + chan ,
300 DV_CHR, 0, 0, 0600);
301#endif
282 }
283 rcb->rcb_probed = RC_ATTACHED;
284 if (!rc_wakeup_started) {
285 rc_wakeup((void *)NULL);
286 rc_wakeup_started = 0;
287 }
288 return 1;
289}

--- 398 unchanged lines hidden (view full) ---

688 }
689 if (rc_scheduled_event == 0)
690 break;
691 }
692 if (rc_scheduled_event >= LOTS_OF_EVENTS)
693 goto repeat;
694}
695
302 }
303 rcb->rcb_probed = RC_ATTACHED;
304 if (!rc_wakeup_started) {
305 rc_wakeup((void *)NULL);
306 rc_wakeup_started = 0;
307 }
308 return 1;
309}

--- 398 unchanged lines hidden (view full) ---

708 }
709 if (rc_scheduled_event == 0)
710 break;
711 }
712 if (rc_scheduled_event >= LOTS_OF_EVENTS)
713 goto repeat;
714}
715
696void rcstop(tp, rw)
716static void
717rcstop(tp, rw)
697 register struct tty *tp;
698 int rw;
699{
700 register struct rc_chans *rc = &rc_chans[GET_UNIT(tp->t_dev)];
701 u_char *tptr, *eptr;
702
703#ifdef RCDEBUG
704 printf("rc%d/%d: rcstop %s%s\n", rc->rc_rcb->rcb_unit, rc->rc_chan,

--- 16 unchanged lines hidden (view full) ---

721 }
722 if (tp->t_state & TS_TTSTOP)
723 rc->rc_flags |= RC_OSUSP;
724 else
725 rc->rc_flags &= ~RC_OSUSP;
726 enable_intr();
727}
728
718 register struct tty *tp;
719 int rw;
720{
721 register struct rc_chans *rc = &rc_chans[GET_UNIT(tp->t_dev)];
722 u_char *tptr, *eptr;
723
724#ifdef RCDEBUG
725 printf("rc%d/%d: rcstop %s%s\n", rc->rc_rcb->rcb_unit, rc->rc_chan,

--- 16 unchanged lines hidden (view full) ---

742 }
743 if (tp->t_state & TS_TTSTOP)
744 rc->rc_flags |= RC_OSUSP;
745 else
746 rc->rc_flags &= ~RC_OSUSP;
747 enable_intr();
748}
749
729int rcopen(dev, flag, mode, p)
750static int
751rcopen(dev, flag, mode, p)
730 dev_t dev;
731 int flag, mode;
732 struct proc *p;
733{
734 register struct rc_chans *rc;
735 register struct tty *tp;
736 int unit, nec, s, error = 0;
737

--- 74 unchanged lines hidden (view full) ---

812 (void) splx(s);
813
814 if(rc->rc_dcdwaits == 0 && !(tp->t_state & TS_ISOPEN))
815 rc_hardclose(rc);
816
817 return error;
818}
819
752 dev_t dev;
753 int flag, mode;
754 struct proc *p;
755{
756 register struct rc_chans *rc;
757 register struct tty *tp;
758 int unit, nec, s, error = 0;
759

--- 74 unchanged lines hidden (view full) ---

834 (void) splx(s);
835
836 if(rc->rc_dcdwaits == 0 && !(tp->t_state & TS_ISOPEN))
837 rc_hardclose(rc);
838
839 return error;
840}
841
820int rcclose(dev, flag, mode, p)
842static int
843rcclose(dev, flag, mode, p)
821 dev_t dev;
822 int flag, mode;
823 struct proc *p;
824{
825 register struct rc_chans *rc;
826 register struct tty *tp;
827 int s, unit = GET_UNIT(dev);
828

--- 40 unchanged lines hidden (view full) ---

869 }
870 rc->rc_flags &= ~RC_ACTOUT;
871 wakeup((caddr_t) &rc->rc_rcb); /* wake bi */
872 wakeup(TSA_CARR_ON(tp));
873 (void) splx(s);
874}
875
876/* Read from line */
844 dev_t dev;
845 int flag, mode;
846 struct proc *p;
847{
848 register struct rc_chans *rc;
849 register struct tty *tp;
850 int s, unit = GET_UNIT(dev);
851

--- 40 unchanged lines hidden (view full) ---

892 }
893 rc->rc_flags &= ~RC_ACTOUT;
894 wakeup((caddr_t) &rc->rc_rcb); /* wake bi */
895 wakeup(TSA_CARR_ON(tp));
896 (void) splx(s);
897}
898
899/* Read from line */
877int rcread(dev, uio, flag)
900static int
901rcread(dev, uio, flag)
878 dev_t dev;
879 struct uio *uio;
880 int flag;
881{
882 struct tty *tp = rc_chans[GET_UNIT(dev)].rc_tp;
883
884 return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
885}
886
887/* Write to line */
902 dev_t dev;
903 struct uio *uio;
904 int flag;
905{
906 struct tty *tp = rc_chans[GET_UNIT(dev)].rc_tp;
907
908 return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
909}
910
911/* Write to line */
888int rcwrite(dev, uio, flag)
912static int
913rcwrite(dev, uio, flag)
889 dev_t dev;
890 struct uio *uio;
891 int flag;
892{
893 struct tty *tp = rc_chans[GET_UNIT(dev)].rc_tp;
894
895 return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
896}

--- 189 unchanged lines hidden (view full) ---

1086 nec = rcb->rcb_addr;
1087 rc_hwreset(rcb->rcb_unit, nec, RC_FAKEID);
1088 rc = &rc_chans[rcb->rcb_unit * CD180_NCHAN];
1089 rce = rc + CD180_NCHAN;
1090 for (; rc < rce; rc++)
1091 (void) rc_param(rc->rc_tp, &rc->rc_tp->t_termios);
1092}
1093
914 dev_t dev;
915 struct uio *uio;
916 int flag;
917{
918 struct tty *tp = rc_chans[GET_UNIT(dev)].rc_tp;
919
920 return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
921}

--- 189 unchanged lines hidden (view full) ---

1111 nec = rcb->rcb_addr;
1112 rc_hwreset(rcb->rcb_unit, nec, RC_FAKEID);
1113 rc = &rc_chans[rcb->rcb_unit * CD180_NCHAN];
1114 rce = rc + CD180_NCHAN;
1115 for (; rc < rce; rc++)
1116 (void) rc_param(rc->rc_tp, &rc->rc_tp->t_termios);
1117}
1118
1094int rcioctl(dev, cmd, data, flag, p)
1119static int
1120rcioctl(dev, cmd, data, flag, p)
1095dev_t dev;
1096int cmd, flag;
1097caddr_t data;
1098struct proc *p;
1099{
1100 register struct rc_chans *rc = &rc_chans[GET_UNIT(dev)];
1101 register int s, error;
1102 struct tty *tp = rc->rc_tp;

--- 301 unchanged lines hidden (view full) ---

1404 printf("rc%d/%d: msvr %02x ier %02x ccsr %02x\n",
1405 rc->rc_rcb->rcb_unit, rc->rc_chan,
1406 rcin(CD180_MSVR),
1407 rcin(CD180_IER),
1408 rcin(CD180_CCSR));
1409}
1410#endif /* RCDEBUG */
1411
1121dev_t dev;
1122int cmd, flag;
1123caddr_t data;
1124struct proc *p;
1125{
1126 register struct rc_chans *rc = &rc_chans[GET_UNIT(dev)];
1127 register int s, error;
1128 struct tty *tp = rc->rc_tp;

--- 301 unchanged lines hidden (view full) ---

1430 printf("rc%d/%d: msvr %02x ier %02x ccsr %02x\n",
1431 rc->rc_rcb->rcb_unit, rc->rc_chan,
1432 rcin(CD180_MSVR),
1433 rcin(CD180_IER),
1434 rcin(CD180_CCSR));
1435}
1436#endif /* RCDEBUG */
1437
1412struct tty *
1438static struct tty *
1413rcdevtotty(dev)
1414 dev_t dev;
1415{
1416 int unit;
1417
1418 unit = GET_UNIT(dev);
1419 if (unit >= NRC * CD180_NCHAN)
1420 return NULL;

--- 75 unchanged lines hidden (view full) ---

1496
1497 for (rcnt = 100; rcnt && rcin(CD180_CCR); rcnt--)
1498 DELAY(15);
1499 if (rcnt == 0)
1500 printf("rc%d/%d: channel command timeout, rc.c line: %d\n",
1501 unit, chan, line);
1502}
1503
1439rcdevtotty(dev)
1440 dev_t dev;
1441{
1442 int unit;
1443
1444 unit = GET_UNIT(dev);
1445 if (unit >= NRC * CD180_NCHAN)
1446 return NULL;

--- 75 unchanged lines hidden (view full) ---

1522
1523 for (rcnt = 100; rcnt && rcin(CD180_CCR); rcnt--)
1524 DELAY(15);
1525 if (rcnt == 0)
1526 printf("rc%d/%d: channel command timeout, rc.c line: %d\n",
1527 unit, chan, line);
1528}
1529
1504#ifdef JREMOD
1505struct cdevsw rc_cdevsw =
1506 { rcopen, rcclose, rcread, rcwrite, /*63*/
1507 rcioctl, rcstop, nxreset, rcdevtotty,/* rc */
1508 ttselect, nommap, NULL };
1509
1510static rc_devsw_installed = 0;
1511
1512static void rc_drvinit(void *unused)
1513{
1514 dev_t dev;
1515
1516 if( ! rc_devsw_installed ) {
1530static rc_devsw_installed = 0;
1531
1532static void rc_drvinit(void *unused)
1533{
1534 dev_t dev;
1535
1536 if( ! rc_devsw_installed ) {
1517 dev = makedev(CDEV_MAJOR,0);
1518 cdevsw_add(&dev,&rc_cdevsw,NULL);
1537 dev = makedev(CDEV_MAJOR, 0);
1538 cdevsw_add(&dev,&rc_cdevsw, NULL);
1519 rc_devsw_installed = 1;
1539 rc_devsw_installed = 1;
1520#ifdef DEVFS
1521 {
1522 int x;
1523/* default for a simple device with no probe routine (usually delete this) */
1524 x=devfs_add_devsw(
1525/* path name devsw minor type uid gid perm*/
1526 "/", "rc", major(dev), 0, DV_CHR, 0, 0, 0600);
1527 }
1528#endif
1529 }
1530}
1531
1532SYSINIT(rcdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,rc_drvinit,NULL)
1533
1540 }
1541}
1542
1543SYSINIT(rcdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,rc_drvinit,NULL)
1544
1534#endif /* JREMOD */
1535
1536#endif /* NRC */
1545
1546#endif /* NRC */