2 * /src/NTP/ntp-4/libparse/parsesolaris.c,v 4.6 1998/11/15 21:56:08 kardel RELEASE_19991128_A
4 * parsesolaris.c,v 4.6 1998/11/15 21:56:08 kardel RELEASE_19991128_A
6 * STREAMS module for reference clocks
8 * Copyright (C) 1993-1998 by Frank Kardel
9 * derived work from parsestreams.c ((c) 1991-1993, Frank Kardel) and
10 * dcf77sync.c((c) Frank Kardel)
11 * Friedrich-Alexander Universität Erlangen-Nürnberg, Germany
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19 #define _KERNEL /* it is a _KERNEL module */
22 static char rcsid[] = "parsesolaris.c,v 4.6 1998/11/15 21:56:08 kardel RELEASE_19991128_A";
25 #include <sys/types.h>
27 #include <sys/errno.h>
29 #include <sys/termios.h>
30 #include <sys/stream.h>
31 #include <sys/strtty.h>
32 #include <sys/stropts.h>
33 #include <sys/modctl.h>
35 #include <sys/sunddi.h>
36 #ifdef __GNUC__ /* makes it compile on Solaris 2.6 - acc doesn't like it -- GREAT! */
42 #include <sys/parsestreams.h>
44 /*--------------- loadable driver section -----------------------------*/
46 static struct streamtab parseinfo;
48 static struct fmodsw fmod_templ =
50 "parse", /* module name */
51 &parseinfo, /* module information */
52 D_NEW|D_MP|D_MTQPAIR, /* exclusive for q pair */
56 extern struct mod_ops mod_strmodops;
58 static struct modlstrmod modlstrmod =
60 &mod_strmodops, /* a STREAMS module */
61 "PARSE - NTP reference", /* name this baby - keep room for revision number */
65 static struct modlinkage modlinkage =
75 * module management routines
83 static char revision[] = "4.6";
92 * copy RCS revision into Drv_name
94 * are we forcing RCS here to do things it was not built for ?
101 * if present. - not necessary on a -kv co (cvs export)
103 while (*s && (*s != ' '))
110 t = modlstrmod.strmod_linkinfo;
111 while (*t && (*t != ' '))
118 while (*S && (((*S >= '0') && (*S <= '9')) || (*S == '.')))
123 if (*s && *t && (S > s))
125 if (strlen(t) >= (S - s))
127 (void) strncpy(t, s, (unsigned)(S - s));
130 return (mod_install(&modlinkage));
136 struct modinfo *modinfop
139 return (mod_info(&modlinkage, modinfop));
148 if (mod_remove(&modlinkage) != DDI_SUCCESS)
156 /*--------------- stream module definition ----------------------------*/
158 static int parseopen P((queue_t *, dev_t *, int, int, cred_t *));
159 static int parseclose P((queue_t *, int));
160 static int parsewput P((queue_t *, mblk_t *));
161 static int parserput P((queue_t *, mblk_t *));
162 static int parsersvc P((queue_t *));
164 static struct module_info driverinfo =
166 0, /* module ID number */
167 fmod_templ.f_name, /* module name - why repeated here ? compat ?*/
168 0, /* minimum accepted packet size */
169 INFPSZ, /* maximum accepted packet size */
170 1, /* high water mark - flow control */
171 0 /* low water mark - flow control */
174 static struct qinit rinit = /* read queue definition */
176 parserput, /* put procedure */
177 parsersvc, /* service procedure */
178 parseopen, /* open procedure */
179 parseclose, /* close procedure */
180 NULL, /* admin procedure - NOT USED FOR NOW */
181 &driverinfo, /* information structure */
182 NULL /* statistics */
185 static struct qinit winit = /* write queue definition */
187 parsewput, /* put procedure */
188 NULL, /* service procedure */
189 NULL, /* open procedure */
190 NULL, /* close procedure */
191 NULL, /* admin procedure - NOT USED FOR NOW */
192 &driverinfo, /* information structure */
193 NULL /* statistics */
196 static struct streamtab parseinfo = /* stream info element for parse driver */
198 &rinit, /* read queue */
199 &winit, /* write queue */
204 /*--------------- driver data structures ----------------------------*/
207 * we usually have an inverted signal - but you
208 * can change this to suit your needs
210 int cd_invert = 1; /* invert status of CD line - PPS support via CD input */
218 /*--------------- module implementation -----------------------------*/
220 #define TIMEVAL_USADD(_X_, _US_) do {\
221 (_X_)->tv_usec += (_US_);\
222 if ((_X_)->tv_usec >= 1000000)\
225 (_X_)->tv_usec -= 1000000;\
229 static int init_linemon P((queue_t *));
230 static void close_linemon P((queue_t *, queue_t *));
232 #define M_PARSE 0x0001
233 #define M_NOPARSE 0x0002
257 if (lev & parsedebug)
258 vcmn_err(CE_CONT, (char *)form, ap);
271 pprintf(DD_OPEN,"parse: SETUP_STREAM - setting up stream for q=%x\n", q);
273 mp = allocb(sizeof(struct stroptions), BPRI_MED);
276 struct stroptions *str = (struct stroptions *)mp->b_wptr;
278 str->so_flags = SO_READOPT|SO_HIWAT|SO_LOWAT|SO_ISNTTY;
279 str->so_readopt = (mode == M_PARSE) ? RMSGD : RNORM;
280 str->so_hiwat = (mode == M_PARSE) ? sizeof(parsetime_t) : 256;
282 mp->b_datap->db_type = M_SETOPTS;
283 mp->b_wptr += sizeof(struct stroptions);
285 panic("NULL q - strange");
287 return putctl1(WR(q)->q_next, M_CTL, (mode == M_PARSE) ? MC_SERVICEIMM :
292 pprintf(DD_OPEN, "parse: setup_stream - FAILED - no MEMORY for allocb\n");
307 register parsestream_t *parse;
308 static int notice = 0;
310 pprintf(DD_OPEN, "parse: OPEN - q=%x\n", q);
312 if (sflag != MODOPEN)
313 { /* open only for modules */
314 pprintf(DD_OPEN, "parse: OPEN - FAILED - not MODOPEN\n");
318 if (q->q_ptr != (caddr_t)NULL)
320 pprintf(DD_OPEN, "parse: OPEN - FAILED - EXCLUSIVE ONLY\n");
324 q->q_ptr = (caddr_t)kmem_alloc(sizeof(parsestream_t), KM_SLEEP);
325 if (q->q_ptr == (caddr_t)0)
330 pprintf(DD_OPEN, "parse: OPEN - parse area q=%x, q->q_ptr=%x\n", q, q->q_ptr);
331 WR(q)->q_ptr = q->q_ptr;
332 pprintf(DD_OPEN, "parse: OPEN - WQ parse area q=%x, q->q_ptr=%x\n", WR(q), WR(q)->q_ptr);
334 parse = (parsestream_t *) q->q_ptr;
335 bzero((caddr_t)parse, sizeof(*parse));
336 parse->parse_queue = q;
337 parse->parse_status = PARSE_ENABLE;
338 parse->parse_ppsclockev.tv.tv_sec = 0;
339 parse->parse_ppsclockev.tv.tv_usec = 0;
340 parse->parse_ppsclockev.serial = 0;
344 pprintf(DD_OPEN, "parse: OPEN - initializing io subsystem q=%x\n", q);
346 if (!parse_ioinit(&parse->parse_io))
353 kmem_free((caddr_t)parse, sizeof(parsestream_t));
358 pprintf(DD_OPEN, "parse: OPEN - initializing stream q=%x\n", q);
360 if (setup_stream(q, M_PARSE))
362 (void) init_linemon(q); /* hook up PPS ISR routines if possible */
363 pprintf(DD_OPEN, "parse: OPEN - SUCCEEDED\n");
366 * I know that you know the delete key, but you didn't write this
367 * code, did you ? - So, keep the message in here.
371 cmn_err(CE_CONT, "?%s: Copyright (c) 1993-1998, Frank Kardel\n", modlstrmod.strmod_linkinfo);
381 kmem_free((caddr_t)parse, sizeof(parsestream_t));
394 register parsestream_t *parse = (parsestream_t *)q->q_ptr;
395 register unsigned long s;
397 pprintf(DD_CLOSE, "parse: CLOSE\n");
403 if (parse->parse_dqueue)
404 close_linemon(parse->parse_dqueue, q);
405 parse->parse_dqueue = (queue_t *)0;
409 parse_ioend(&parse->parse_io);
411 kmem_free((caddr_t)parse, sizeof(parsestream_t));
413 q->q_ptr = (caddr_t)NULL;
414 WR(q)->q_ptr = (caddr_t)NULL;
420 * move unrecognized stuff upward
429 while ((mp = getq(q)))
431 if (canputnext(q) || (mp->b_datap->db_type > QPCTL))
434 pprintf(DD_RSVC, "parse: RSVC - putnext\n");
439 pprintf(DD_RSVC, "parse: RSVC - flow control wait\n");
448 * send stuff down - dont care about
458 register mblk_t *datap;
459 register struct iocblk *iocp;
460 parsestream_t *parse = (parsestream_t *)q->q_ptr;
462 pprintf(DD_WPUT, "parse: parsewput\n");
464 switch (mp->b_datap->db_type)
471 iocp = (struct iocblk *)mp->b_rptr;
472 switch (iocp->ioc_cmd)
475 pprintf(DD_WPUT, "parse: parsewput - forward M_IOCTL\n");
481 * taken from Craig Leres ppsclock module (and modified)
483 datap = allocb(sizeof(struct ppsclockev), BPRI_MED);
484 if (datap == NULL || mp->b_cont)
486 mp->b_datap->db_type = M_IOCNAK;
487 iocp->ioc_error = (datap == NULL) ? ENOMEM : EINVAL;
495 *(struct ppsclockev *)datap->b_wptr = parse->parse_ppsclockev;
497 sizeof(struct ppsclockev) / sizeof(*datap->b_wptr);
498 mp->b_datap->db_type = M_IOCACK;
499 iocp->ioc_count = sizeof(struct ppsclockev);
503 case PARSEIOC_ENABLE:
504 case PARSEIOC_DISABLE:
506 parse->parse_status = (parse->parse_status & (unsigned)~PARSE_ENABLE) |
507 (iocp->ioc_cmd == PARSEIOC_ENABLE) ?
509 if (!setup_stream(RD(q), (parse->parse_status & PARSE_ENABLE) ?
510 M_PARSE : M_NOPARSE))
512 mp->b_datap->db_type = M_IOCNAK;
516 mp->b_datap->db_type = M_IOCACK;
522 case PARSEIOC_TIMECODE:
523 case PARSEIOC_SETFMT:
524 case PARSEIOC_GETFMT:
526 if (iocp->ioc_count == sizeof(parsectl_t))
528 parsectl_t *dct = (parsectl_t *)mp->b_cont->b_rptr;
530 switch (iocp->ioc_cmd)
532 case PARSEIOC_TIMECODE:
533 pprintf(DD_WPUT, "parse: parsewput - PARSEIOC_TIMECODE\n");
534 ok = parse_timecode(dct, &parse->parse_io);
537 case PARSEIOC_SETFMT:
538 pprintf(DD_WPUT, "parse: parsewput - PARSEIOC_SETFMT\n");
539 ok = parse_setfmt(dct, &parse->parse_io);
542 case PARSEIOC_GETFMT:
543 pprintf(DD_WPUT, "parse: parsewput - PARSEIOC_GETFMT\n");
544 ok = parse_getfmt(dct, &parse->parse_io);
548 pprintf(DD_WPUT, "parse: parsewput - PARSEIOC_SETCS\n");
549 ok = parse_setcs(dct, &parse->parse_io);
552 mp->b_datap->db_type = ok ? M_IOCACK : M_IOCNAK;
556 mp->b_datap->db_type = M_IOCNAK;
558 pprintf(DD_WPUT, "parse: parsewput qreply - %s\n", (mp->b_datap->db_type == M_IOCNAK) ? "M_IOCNAK" : "M_IOCACK");
567 * read characters from streams buffers
574 while (*mp != (mblk_t *)NULL)
576 if ((*mp)->b_wptr - (*mp)->b_rptr)
578 return (unsigned long)(*(unsigned char *)((*mp)->b_rptr++));
582 register mblk_t *mmp = *mp;
588 return (unsigned long)~0;
592 * convert incoming data
600 register unsigned char type;
603 switch (type = mp->b_datap->db_type)
607 * anything we don't know will be put on queue
608 * the service routine will move it to the next one
610 pprintf(DD_RPUT, "parse: parserput - forward type 0x%x\n", type);
612 if (canputnext(q) || (mp->b_datap->db_type > QPCTL))
623 register parsestream_t * parse = (parsestream_t *)q->q_ptr;
624 register mblk_t *nmp;
625 register unsigned long ch;
627 timespec_t hres_time;
630 * get time on packet delivery
632 gethrestime(&hres_time);
633 ctime.tv.tv_sec = hres_time.tv_sec;
634 ctime.tv.tv_usec = hres_time.tv_nsec / 1000;
636 if (!(parse->parse_status & PARSE_ENABLE))
638 pprintf(DD_RPUT, "parse: parserput - parser disabled - forward type 0x%x\n", type);
639 if (canputnext(q) || (mp->b_datap->db_type > QPCTL))
648 pprintf(DD_RPUT, "parse: parserput - M_%s\n", (type == M_DATA) ? "DATA" : "BREAK");
652 * parse packet looking for start an end characters
654 while (mp != (mblk_t *)NULL)
657 if (ch != ~0 && parse_ioread(&parse->parse_io, (unsigned int)ch, &ctime))
660 * up up and away (hopefully ...)
661 * don't press it if resources are tight or nobody wants it
663 nmp = (mblk_t *)NULL;
664 if (canputnext(parse->parse_queue) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED)))
666 bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t));
667 nmp->b_wptr += sizeof(parsetime_t);
668 putnext(parse->parse_queue, nmp);
671 if (nmp) freemsg(nmp);
672 parse_iodone(&parse->parse_io);
678 if (parse_ioread(&parse->parse_io, (unsigned int)0, &ctime))
681 * up up and away (hopefully ...)
682 * don't press it if resources are tight or nobody wants it
684 nmp = (mblk_t *)NULL;
685 if (canputnext(parse->parse_queue) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED)))
687 bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t));
688 nmp->b_wptr += sizeof(parsetime_t);
689 putnext(parse->parse_queue, nmp);
692 if (nmp) freemsg(nmp);
693 parse_iodone(&parse->parse_io);
702 * CD PPS support for non direct ISR hack
707 register parsestream_t * parse = (parsestream_t *)q->q_ptr;
709 timespec_t hres_time;
710 register mblk_t *nmp;
711 register int status = cd_invert ^ (type == M_UNHANGUP);
713 gethrestime(&hres_time);
714 ctime.tv.tv_sec = hres_time.tv_sec;
715 ctime.tv.tv_usec = hres_time.tv_nsec / 1000;
717 pprintf(DD_RPUT, "parse: parserput - M_%sHANGUP\n", (type == M_HANGUP) ? "" : "UN");
719 if ((parse->parse_status & PARSE_ENABLE) &&
720 parse_iopps(&parse->parse_io, status ? SYNC_ONE : SYNC_ZERO, &ctime))
722 nmp = (mblk_t *)NULL;
723 if (canputnext(parse->parse_queue) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED)))
725 bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t));
726 nmp->b_wptr += sizeof(parsetime_t);
727 putnext(parse->parse_queue, nmp);
730 if (nmp) freemsg(nmp);
731 parse_iodone(&parse->parse_io);
735 if (canputnext(q) || (mp->b_datap->db_type > QPCTL))
744 parse->parse_ppsclockev.tv = ctime.tv;
745 ++(parse->parse_ppsclockev.serial);
752 static int init_zs_linemon P((queue_t *, queue_t *)); /* handle line monitor for "zs" driver */
753 static void close_zs_linemon P((queue_t *, queue_t *));
755 /*-------------------- CD isr status monitor ---------------*/
762 register queue_t *dq;
766 * we ARE doing very bad things down here (basically stealing ISR
769 * so we chase down the STREAMS stack searching for the driver
770 * and if this is a known driver we insert our ISR routine for
771 * status changes in to the ExternalStatus handling hook
775 dq = dq->q_next; /* skip down to driver */
779 * find appropriate driver dependent routine
781 if (dq->q_qinfo && dq->q_qinfo->qi_minfo)
783 register char *dname = dq->q_qinfo->qi_minfo->mi_idname;
785 pprintf(DD_INSTALL, "init_linemon: driver is \"%s\"\n", dname);
788 if (dname && !strcmp(dname, "zs"))
790 return init_zs_linemon(dq, q);
795 pprintf(DD_INSTALL, "init_linemon: driver \"%s\" not suitable for CD monitoring\n", dname);
799 pprintf(DD_INSTALL, "init_linemon: cannot find driver\n");
810 * find appropriate driver dependent routine
812 if (q->q_qinfo && q->q_qinfo->qi_minfo)
814 register char *dname = q->q_qinfo->qi_minfo->mi_idname;
817 if (dname && !strcmp(dname, "zs"))
819 close_zs_linemon(q, my_q);
822 pprintf(DD_INSTALL, "close_linemon: cannot find driver close routine for \"%s\"\n", dname);
825 pprintf(DD_INSTALL, "close_linemon: cannot find driver name\n");
830 #include <sys/zsdev.h>
831 #include <sys/ser_async.h>
832 #include <sys/ser_zscc.h>
834 static void zs_xsisr P((struct zscom *)); /* zs external status interupt handler */
837 * there should be some docs telling how to get to
838 * sz:zs_usec_delay and zs:initzsops()
840 #define zs_usec_delay 5
845 struct zsops *oldzsops;
848 static struct zsops *emergencyzs;
856 register struct zscom *zs;
857 register struct savedzsops *szs;
858 register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr;
860 * we expect the zsaline pointer in the q_data pointer
861 * from there on we insert our on EXTERNAL/STATUS ISR routine
862 * into the interrupt path, before the standard handler
864 zs = ((struct asyncline *)q->q_ptr)->za_common;
868 * well - not found on startup - just say no (shouldn't happen though)
875 * we do a direct replacement, in case others fiddle also
876 * if somebody else grabs our hook and we disconnect
877 * we are in DEEP trouble - panic is likely to be next, sorry
879 szs = (struct savedzsops *) kmem_alloc(sizeof(struct savedzsops), KM_SLEEP);
881 if (szs == (struct savedzsops *)0)
883 pprintf(DD_INSTALL, "init_zs_linemon: CD monitor NOT installed - no memory\n");
889 parsestream->parse_data = (void *)szs;
891 mutex_enter(zs->zs_excl);
893 parsestream->parse_dqueue = q; /* remember driver */
895 szs->zsops = *zs->zs_ops;
896 szs->zsops.zsop_xsint = (void (*) P((struct zscom *)))zs_xsisr; /* place our bastard */
897 szs->oldzsops = zs->zs_ops;
898 emergencyzs = zs->zs_ops;
900 zs->zs_ops = &szs->zsops; /* hook it up */
902 * XXX: this is usually done via zsopinit()
903 * - have yet to find a way to call that routine
905 zs->zs_xsint = (void (*) P((struct zscom *)))zs_xsisr;
907 mutex_exit(zs->zs_excl);
909 pprintf(DD_INSTALL, "init_zs_linemon: CD monitor installed\n");
917 * unregister our ISR routine - must call under splhigh() (or
918 * whatever block ZS status interrupts)
926 register struct zscom *zs;
927 register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr;
929 zs = ((struct asyncline *)q->q_ptr)->za_common;
933 * well - not found on startup - just say no (shouldn't happen though)
939 register struct savedzsops *szs = (struct savedzsops *)parsestream->parse_data;
941 mutex_enter(zs->zs_excl);
943 zs->zs_ops = szs->oldzsops; /* reset to previous handler functions */
945 * XXX: revert xsint (usually done via zsopinit() - have still to find
946 * a way to call that bugger
948 zs->zs_xsint = zs->zs_ops->zsop_xsint;
950 mutex_exit(zs->zs_excl);
952 kmem_free((caddr_t)szs, sizeof (struct savedzsops));
954 pprintf(DD_INSTALL, "close_zs_linemon: CD monitor deleted\n");
959 #define ZSRR0_IGNORE (ZSRR0_CD|ZSRR0_SYNC|ZSRR0_CTS)
961 #define MAXDEPTH 50 /* maximum allowed stream crawl */
964 * take external status interrupt (only CD interests us)
971 register struct asyncline *za = (struct asyncline *)zs->zs_priv;
973 register unsigned char zsstatus;
974 register int loopcheck;
975 register unsigned char cdstate;
976 register const char *dname = "-UNKNOWN-";
977 timespec_t hres_time;
980 * pick up current state
982 zsstatus = SCC_READ0();
984 if (za->za_rr0 ^ (cdstate = zsstatus & ZSRR0_CD))
992 gethrestime(&hres_time);
993 cdevent.tv.tv_sec = hres_time.tv_sec;
994 cdevent.tv.tv_usec = hres_time.tv_nsec / 1000;
996 q = za->za_ttycommon.t_readq;
1001 status = cd_invert ? cdstate == 0 : cdstate != 0;
1004 * ok - now the hard part - find ourself
1006 loopcheck = MAXDEPTH;
1010 if (q->q_qinfo && q->q_qinfo->qi_minfo)
1012 dname = q->q_qinfo->qi_minfo->mi_idname;
1014 if (!strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname))
1017 * back home - phew (hopping along stream queues might
1018 * prove dangerous to your health)
1021 if ((((parsestream_t *)q->q_ptr)->parse_status & PARSE_ENABLE) &&
1022 parse_iopps(&((parsestream_t *)q->q_ptr)->parse_io, status ? SYNC_ONE : SYNC_ZERO, &cdevent))
1025 * XXX - currently we do not pass up the message, as
1027 * for a correct behaviour wee need to block out
1028 * processing until parse_iodone has been posted via
1029 * a softcall-ed routine which does the message pass-up
1030 * right now PPS information relies on input being
1033 parse_iodone(&((parsestream_t *)q->q_ptr)->parse_io);
1038 ((parsestream_t *)q->q_ptr)->parse_ppsclockev.tv = cdevent.tv;
1039 ++(((parsestream_t *)q->q_ptr)->parse_ppsclockev.serial);
1042 pprintf(DD_ISR, "zs_xsisr: CD event %s has been posted for \"%s\"\n", status ? "ONE" : "ZERO", dname);
1051 panic("zs_xsisr: STREAMS Queue corrupted - CD event");
1055 if (cdstate) /* fake CARRIER status - XXX currently not coordinated */
1056 za->za_flags |= ZAS_CARR_ON;
1058 za->za_flags &= ~ZAS_CARR_ON;
1061 * only pretend that CD and ignored transistion (SYNC,CTS)
1064 za->za_rr0 = (za->za_rr0 & ~ZSRR0_IGNORE) | (zsstatus & ZSRR0_IGNORE);
1066 if (((za->za_rr0 ^ zsstatus) & ~ZSRR0_IGNORE) == 0)
1069 * all done - kill status indication and return
1071 SCC_WRITE0(ZSWR0_RESET_STATUS); /* might kill other conditions here */
1076 pprintf(DD_ISR, "zs_xsisr: non CD event 0x%x for \"%s\"\n",
1077 (za->za_rr0 ^ zsstatus) & ~ZSRR0_CD,dname);
1079 * we are now gathered here to process some unusual external status
1081 * any CD events have also been handled and shouldn't be processed
1082 * by the original routine (unless we have a VERY busy port pin)
1083 * some initializations are done here, which could have been done before for
1084 * both code paths but have been avioded for minimum path length to
1085 * the uniq_time routine
1088 q = za->za_ttycommon.t_readq;
1090 loopcheck = MAXDEPTH;
1093 * the real thing for everything else ...
1097 if (q->q_qinfo && q->q_qinfo->qi_minfo)
1099 dname = q->q_qinfo->qi_minfo->mi_idname;
1100 if (!strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname))
1102 register void (*zsisr) P((struct zscom *));
1105 * back home - phew (hopping along stream queues might
1106 * prove dangerous to your health)
1108 if ((zsisr = ((struct savedzsops *)((parsestream_t *)q->q_ptr)->parse_data)->oldzsops->zsop_xsint))
1111 panic("zs_xsisr: unable to locate original ISR");
1113 pprintf(DD_ISR, "zs_xsisr: non CD event was processed for \"%s\"\n", dname);
1115 * now back to our program ...
1125 panic("zs_xsisr: STREAMS Queue corrupted - non CD event");
1130 * last resort - shouldn't even come here as it indicates
1131 * corrupted TTY structures
1133 printf("zs_zsisr: looking for \"%s\" - found \"%s\" - taking EMERGENCY path\n", parseinfo.st_rdinit->qi_minfo->mi_idname, dname ? dname : "-NIL-");
1135 if (emergencyzs && emergencyzs->zsop_xsint)
1136 emergencyzs->zsop_xsint(zs);
1138 panic("zs_xsisr: no emergency ISR handler");
1146 * Revision 4.6 1998/11/15 21:56:08 kardel
1147 * ntp_memset not necessary
1149 * Revision 4.5 1998/11/15 21:23:37 kardel
1150 * ntp_memset() replicated in Sun kernel files
1152 * Revision 4.4 1998/06/14 21:09:40 kardel
1155 * Revision 4.3 1998/06/13 12:14:59 kardel
1158 * allow for ansi2knr
1160 * Revision 4.2 1998/06/12 15:23:08 kardel
1162 * adjust for ansi2knr
1164 * Revision 4.1 1998/05/24 09:38:46 kardel
1165 * streams initiated iopps calls (M_xHANGUP) are now consistent with the
1166 * respective calls from zs_xsisr()
1167 * simulation of CARRIER status to avoid unecessary M_xHANGUP messages
1169 * Revision 4.0 1998/04/10 19:45:38 kardel
1170 * Start 4.0 release version numbering
1172 * from V3 3.28 log info deleted 1998/04/11 kardel