Lines Matching defs:async
101 /* The async interrupt entry points */
107 static void async_ioctl(struct asyncline *async, queue_t *q, mblk_t *mp,
112 static void async_start(struct asyncline *async);
113 static void async_nstart(struct asyncline *async, int mode);
114 static void async_resume(struct asyncline *async);
385 struct asyncline *async;
391 async = (struct asyncline *)ddi_get_soft_state(su_asyncline, instance);
459 cv_destroy(&async->async_flags_cv);
476 struct asyncline *async;
511 struct asyncline *async;
525 async = (struct asyncline *)asy->asy_priv;
526 if ((async) && (async->async_flags & ASYNC_ISOPEN))
686 async = (struct asyncline *)ddi_get_soft_state(su_asyncline, instance);
689 async->async_common = asy;
690 cv_init(&async->async_flags_cv, NULL, CV_DEFAULT, NULL);
854 cv_destroy(&async->async_flags_cv);
915 struct asyncline *async;
929 async = (struct asyncline *)ddi_get_soft_state(su_asyncline, unit);
930 if (async == NULL)
933 asy = async->async_common;
938 asy->asy_priv = (caddr_t)async;
945 if (!(async->async_flags & ASYNC_ISOPEN)) {
951 async->async_ttycommon.t_cflag = CIBAUDEXT | CBAUDEXT |
953 async->async_ttycommon.t_cflag |= ((B115200 << IBSHIFT)
955 async->async_ttycommon.t_cflag |= CS8 | CREAD | CLOCAL;
957 async->async_ttycommon.t_cflag = B9600 & CBAUD;
958 async->async_ttycommon.t_cflag |= ((B9600 << IBSHIFT)
960 async->async_ttycommon.t_cflag |= CS8 | CREAD | CLOCAL;
974 async->async_ttycommon.t_cflag =
983 async->async_ttycommon.t_iflag = 0;
984 async->async_ttycommon.t_iocpending = NULL;
985 async->async_ttycommon.t_size.ws_row = 0;
986 async->async_ttycommon.t_size.ws_col = 0;
987 async->async_ttycommon.t_size.ws_xpixel = 0;
988 async->async_ttycommon.t_size.ws_ypixel = 0;
989 async->async_dev = *dev;
990 async->async_wbufcid = 0;
992 async->async_startc = CSTART;
993 async->async_stopc = CSTOP;
995 } else if ((async->async_ttycommon.t_flags & TS_XCLUDE) &&
1000 } else if ((*dev & OUTLINE) && !(async->async_flags & ASYNC_OUT)) {
1007 async->async_flags |= ASYNC_OUT;
1017 async->async_ttycommon.t_flags |= TS_SOFTCAR;
1018 if ((async->async_ttycommon.t_flags & TS_SOFTCAR) ||
1020 async->async_flags |= ASYNC_CARR_ON;
1022 async->async_flags &= ~ASYNC_CARR_ON;
1030 !(async->async_ttycommon.t_cflag & CLOCAL)) {
1031 if (!(async->async_flags & (ASYNC_CARR_ON|ASYNC_OUT)) ||
1032 ((async->async_flags & ASYNC_OUT) &&
1034 async->async_flags |= ASYNC_WOPEN;
1035 if (cv_wait_sig(&async->async_flags_cv,
1037 async->async_flags &= ~ASYNC_WOPEN;
1041 async->async_flags &= ~ASYNC_WOPEN;
1044 } else if ((async->async_flags & ASYNC_OUT) && !(*dev & OUTLINE)) {
1055 async->async_ttycommon.t_readq = rq;
1056 async->async_ttycommon.t_writeq = WR(rq);
1057 rq->q_ptr = WR(rq)->q_ptr = (caddr_t)async;
1060 async->async_flags |= ASYNC_ISOPEN;
1061 async->async_polltid = 0;
1068 struct asyncline *async = arg;
1069 struct asycom *asy = async->async_common;
1079 if (!(async->async_flags & (ASYNC_BREAK|ASYNC_DELAY|ASYNC_PROGRESS))) {
1080 async->async_ocnt = 0;
1081 async->async_flags &= ~ASYNC_BUSY;
1082 async->async_timer = 0;
1083 bp = async->async_xmitblk;
1084 async->async_xmitblk = NULL;
1094 flushq(async->async_ttycommon.t_writeq, FLUSHALL);
1095 cv_broadcast(&async->async_flags_cv);
1097 async->async_flags &= ~ASYNC_PROGRESS;
1098 async->async_timer = timeout(async_progress_check, async,
1111 struct asyncline *async;
1121 async = q->q_ptr;
1122 ASSERT(async != NULL);
1123 asy = async->async_common;
1130 async->async_flags |= ASYNC_CLOSING;
1149 if (!(async->async_flags & ASYNC_BREAK)) {
1171 (async->async_flags & ASYNC_STOPPED)) {
1194 async->async_flags &= ~ASYNC_PROGRESS;
1195 async->async_timer = timeout(async_progress_check, async,
1199 while (async->async_ocnt > 0 ||
1200 async->async_ttycommon.t_writeq->q_first != NULL ||
1201 (async->async_flags & (ASYNC_BUSY|ASYNC_BREAK|ASYNC_DELAY))) {
1202 if (cv_wait_sig(&async->async_flags_cv, asy->asy_excl) == 0)
1205 if (async->async_timer != 0) {
1206 (void) untimeout(async->async_timer);
1207 async->async_timer = 0;
1214 if ((async->async_dev != rconsdev) &&
1215 (async->async_dev != kbddev) &&
1216 (async->async_dev != stdindev)) {
1220 async->async_ocnt = 0;
1221 if (async->async_xmitblk != NULL)
1222 freeb(async->async_xmitblk);
1223 async->async_xmitblk = NULL;
1231 if (!nohupcl && ((async->async_ttycommon.t_cflag & HUPCL) ||
1232 (async->async_flags & ASYNC_WOPEN))) {
1249 if ((async->async_flags & (ASYNC_WOPEN|ASYNC_ISOPEN)) == 0) {
1258 async->async_flags = 0;
1259 ttycommon_close(&async->async_ttycommon);
1260 cv_broadcast(&async->async_flags_cv);
1272 if (async->async_wbufcid) {
1273 unbufcall(async->async_wbufcid);
1274 async->async_wbufcid = 0;
1295 async->async_ttycommon.t_readq = NULL;
1296 async->async_ttycommon.t_writeq = NULL;
1312 struct asyncline *async;
1318 async = (struct asyncline *)asy->asy_priv;
1321 return ((async->async_ocnt > 0) ||
1326 * Program the ASY port. Most of the async operation is based on the values
1332 struct asyncline *async;
1345 async = (struct asyncline *)asy->asy_priv;
1347 baudrate = async->async_ttycommon.t_cflag & CBAUD;
1348 if (async->async_ttycommon.t_cflag & CBAUDEXT)
1362 async->async_ttycommon.t_cflag &= ~CBAUD & ~CBAUDEXT &
1365 async->async_ttycommon.t_cflag |= B9600;
1366 async->async_ttycommon.t_cflag |= B9600 << IBSHIFT;
1369 async->async_ttycommon.t_cflag |=
1383 if ((async->async_ttycommon.t_cflag & (CIBAUD|CIBAUDEXT)) == 0) {
1384 async->async_ttycommon.t_cflag |=
1385 (async->async_ttycommon.t_cflag & CBAUD) << IBSHIFT;
1386 if (async->async_ttycommon.t_cflag & CBAUDEXT)
1387 async->async_ttycommon.t_cflag |= CIBAUDEXT;
1389 if ((((async->async_ttycommon.t_cflag & CBAUD) << IBSHIFT) !=
1390 (async->async_ttycommon.t_cflag & CIBAUD)) ||
1391 !(((async->async_ttycommon.t_cflag & (CBAUDEXT |
1393 ((async->async_ttycommon.t_cflag & (CBAUDEXT |
1395 async->async_ttycommon.t_cflag &= ~CBAUD & ~CBAUDEXT &
1397 async->async_ttycommon.t_cflag |=
1405 c_flag = async->async_ttycommon.t_cflag &
1495 if ((c_flag & CLOCAL) && !(async->async_ttycommon.t_cflag & CRTSCTS))
1635 struct asyncline *async;
1640 async = (struct asyncline *)asy->asy_priv;
1641 if ((async == NULL) ||
1642 !(async->async_flags & (ASYNC_ISOPEN|ASYNC_WOPEN))) {
1649 (async->async_dev == rconsdev)))
1737 struct asyncline *async = (struct asyncline *)asy->asy_priv;
1747 if (async->async_flags & ASYNC_BREAK)
1759 if (async->async_ocnt > 0 &&
1760 !(async->async_flags & (ASYNC_HW_OUT_FLW|ASYNC_STOPPED))) {
1762 while (fifo_len > 0 && async->async_ocnt > 0) {
1764 OUTB(DAT, *async->async_optr++);
1766 async->async_ocnt--;
1778 async->async_flags |= ASYNC_PROGRESS;
1803 struct asyncline *async = (struct asyncline *)asy->asy_priv;
1808 tp = &async->async_ttycommon;
1832 (async->async_dev == rconsdev)) {
1846 async->async_hw_overrun = 1;
1855 if (RING_POK(async, 2)) {
1856 RING_PUT(async, 0377);
1857 RING_PUT(async, c);
1859 async->async_sw_overrun = 1;
1861 if (RING_POK(async, 1))
1862 RING_PUT(async, c);
1864 async->async_sw_overrun = 1;
1869 if ((async->async_dev == kbddev) ||
1870 ((async->async_dev == rconsdev) ||
1871 (async->async_dev == stdindev)) &&
1876 async->async_break++;
1878 if (RING_POK(async, 1))
1879 RING_MARK(async, c, s);
1881 async->async_sw_overrun = 1;
1884 if (RING_POK(async, 1))
1885 RING_MARK(async, c, s);
1887 async->async_sw_overrun = 1;
1893 if ((async->async_ttycommon.t_cflag & CRTSXOFF) ||
1894 (async->async_ttycommon.t_iflag & IXOFF))
1895 if ((int)(RING_CNT(async)) > (RINGSIZE * 3)/4) {
1899 UNIT(async->async_dev));
1901 async->async_flags |= ASYNC_HW_IN_FLOW;
1902 async->async_flowc = async->async_stopc;
1903 async->async_ringbuf_overflow = 1;
1906 if ((async->async_flags & ASYNC_SERVICEIMM) || needsoft ||
1907 (RING_FRAC(async)) || (async->async_polltid == 0))
1978 struct asyncline *async = (struct asyncline *)asy->asy_priv;
1997 if (async->async_ttycommon.t_cflag & CRTSCTS && !(msr & CTS)) {
2001 UNIT(async->async_dev));
2003 async->async_flags |= ASYNC_HW_OUT_FLW;
2012 async->async_ext++;
2023 struct asyncline *async;
2042 async = (struct asyncline *)asy->asy_priv;
2057 cc = RING_CNT(async);
2072 struct asyncline *async = (struct asyncline *)asy->asy_priv;
2089 tp = &async->async_ttycommon;
2104 if (async->async_ttycommon.t_cflag & CRTSCTS) {
2105 if ((val & CTS) && (async->async_flags & ASYNC_HW_OUT_FLW)) {
2109 UNIT(async->async_dev));
2111 async->async_flags &= ~ASYNC_HW_OUT_FLW;
2113 if (async->async_ocnt > 0) {
2115 async_resume(async);
2118 async_start(async);
2123 if (async->async_ext) {
2124 async->async_ext = 0;
2128 if ((async->async_flags & ASYNC_CARR_ON) == 0) {
2129 async->async_flags |= ASYNC_CARR_ON;
2132 if (async->async_flags & ASYNC_ISOPEN)
2134 cv_broadcast(&async->async_flags_cv);
2139 if ((async->async_flags & ASYNC_CARR_ON) &&
2156 flushflag = (async->async_flags &
2161 if (async->async_xmitblk != NULL) {
2162 freeb(async->async_xmitblk);
2163 async->async_xmitblk = NULL;
2165 if (async->async_flags & ASYNC_BUSY) {
2166 async->async_ocnt = 0;
2167 async->async_flags &= ~ASYNC_BUSY;
2169 async->async_flags &= ~ASYNC_STOPPED;
2170 if (async->async_flags & ASYNC_ISOPEN) {
2177 async->async_flags &= ~ASYNC_CARR_ON;
2179 cv_broadcast(&async->async_flags_cv);
2192 if (!(async->async_flags & ASYNC_ISOPEN)) {
2193 RING_INIT(async);
2196 if ((cc = RING_CNT(async)) == 0) {
2202 if ((async->async_flags & ASYNC_HW_IN_FLOW) == 0) {
2206 UNIT(async->async_dev));
2210 UNIT(async->async_dev));
2214 async->async_flags |= ASYNC_HW_IN_FLOW;
2215 async->async_flowc = async->async_stopc;
2220 if (async->async_ringbuf_overflow) {
2221 if ((async->async_flags & ASYNC_HW_IN_FLOW) &&
2222 ((int)(RING_CNT(async)) < (RINGSIZE/4))) {
2226 UNIT(async->async_dev));
2229 async->async_flags &= ~ASYNC_HW_IN_FLOW;
2230 async->async_flowc = async->async_startc;
2231 async->async_ringbuf_overflow = 0;
2238 UNIT(async->async_dev), cc);
2246 if ((async->async_flags & ASYNC_HW_IN_FLOW) == 0) {
2247 async->async_flags |= ASYNC_HW_IN_FLOW;
2248 async->async_flowc = async->async_stopc;
2249 async->async_queue_full = 1;
2254 if (async->async_queue_full) {
2259 if (async->async_flags & ASYNC_HW_IN_FLOW) {
2260 async->async_flags &= ~ASYNC_HW_IN_FLOW;
2261 async->async_queue_full = 0;
2262 async->async_flowc = async->async_startc;
2265 async->async_queue_full = 0;
2269 ttycommon_qfull(&async->async_ttycommon, q);
2275 if (RING_ERR(async, S_ERRORS)) {
2276 RING_UNMARK(async);
2277 c = RING_GET(async);
2280 *bp->b_wptr++ = RING_GET(async);
2296 UNIT(async->async_dev));
2299 if ((async->async_flags &
2301 async->async_flags |=
2303 async->async_flowc =
2304 async->async_stopc;
2305 async->async_queue_full = 1;
2332 if (async->async_break) {
2333 async->async_break = 0;
2334 if (async->async_flags & ASYNC_ISOPEN) {
2342 if ((async->async_ocnt <= 0 && (async->async_flags & ASYNC_BUSY)) ||
2343 (async->async_flowc != '\0')) {
2344 async->async_flags &= ~ASYNC_BUSY;
2346 if (async->async_xmitblk)
2347 freeb(async->async_xmitblk);
2348 async->async_xmitblk = NULL;
2349 if (async->async_flags & ASYNC_ISOPEN) {
2352 enterq(async->async_ttycommon.t_writeq);
2355 async_start(async);
2363 if ((asy->inperim) && (async->async_flags & ASYNC_ISOPEN)) {
2365 leaveq(async->async_ttycommon.t_writeq);
2369 if (!(async->async_flags & ASYNC_BUSY))
2370 cv_broadcast(&async->async_flags_cv);
2380 if (async->async_hw_overrun) {
2381 if (async->async_flags & ASYNC_ISOPEN) {
2386 UNIT(async->async_dev));
2392 async->async_hw_overrun = 0;
2394 if (async->async_sw_overrun) {
2395 if (async->async_flags & ASYNC_ISOPEN) {
2400 UNIT(async->async_dev));
2406 async->async_sw_overrun = 0;
2422 struct asyncline *async = arg;
2423 struct asycom *asy = async->async_common;
2435 if (async->async_flags & ASYNC_BREAK) {
2449 rate = async->async_ttycommon.t_cflag & CBAUD;
2450 if (async->async_ttycommon.t_cflag & CBAUDEXT)
2461 async->async_flags &= ~(ASYNC_DELAY|ASYNC_BREAK|ASYNC_DRAINING);
2462 if ((q = async->async_ttycommon.t_writeq) != NULL) {
2467 async_start(async);
2473 cv_broadcast(&async->async_flags_cv);
2477 async_start(struct asyncline *async)
2479 async_nstart(async, 0);
2486 async_nstart(struct asyncline *async, int mode)
2488 register struct asycom *asy = async->async_common;
2513 if (async->async_flags & (ASYNC_BREAK|ASYNC_BUSY|ASYNC_DRAINING)) {
2518 UNIT(async->async_dev),
2519 async->async_flags & ASYNC_BREAK
2537 if (async->async_flags & ASYNC_DELAY) {
2541 UNIT(async->async_dev));
2546 if ((q = async->async_ttycommon.t_writeq) == NULL) {
2550 UNIT(async->async_dev));
2578 async->async_flags |= ASYNC_BREAK;
2579 (void) timeout(async_restart, async, hz / 4);
2589 (void) timeout(async_restart, async,
2591 async->async_flags |= ASYNC_DELAY;
2611 rate = async->async_ttycommon.t_cflag & CBAUD;
2612 if (async->async_ttycommon.t_cflag & CBAUDEXT)
2622 async->async_flags |= ASYNC_DRAINING;
2643 (void) timeout(async_restart, async,
2650 async_ioctl(async, q, bp, B_FALSE);
2668 if (async->async_flags & (ASYNC_HW_OUT_FLW|ASYNC_STOPPED)) {
2671 async->async_flags & ASYNC_HW_OUT_FLW)
2673 UNIT(async->async_dev));
2685 async->async_xmitblk = bp;
2699 if ((async->async_ttycommon.t_cflag & CSIZE) == CS5) {
2711 async->async_optr = xmit_addr;
2712 async->async_ocnt = cc;
2718 while (fifo_len-- && async->async_ocnt) {
2720 OUTB(DAT, *async->async_optr++);
2721 async->async_ocnt--;
2727 async->async_flags |= ASYNC_PROGRESS;
2728 async->async_flags |= ASYNC_BUSY;
2736 async_resume(struct asyncline *async)
2738 register struct asycom *asy = async->async_common;
2751 } else if (async->async_ocnt > 0) {
2752 OUTB(DAT, *async->async_optr++);
2753 async->async_ocnt--;
2754 async->async_flags |= ASYNC_PROGRESS;
2766 async_ioctl(struct asyncline *async, queue_t *wq, mblk_t *mp, boolean_t iswput)
2768 register struct asycom *asy = async->async_common;
2769 register tty_common_t *tp = &async->async_ttycommon;
2788 freemsg(async->async_ttycommon.t_iocpending);
2789 async->async_ttycommon.t_iocpending = NULL;
2832 if (async->async_wbufcid)
2833 unbufcall(async->async_wbufcid);
2834 async->async_wbufcid = bufcall(datasize, BPRI_HI, async_reioctl,
2835 async);
3029 rate = async->async_ttycommon.t_cflag & CBAUD;
3030 if (async->async_ttycommon.t_cflag & CBAUDEXT)
3056 async->async_flags |= ASYNC_BREAK;
3074 (void) timeout(async_restart, async, hz / 4);
3079 UNIT(async->async_dev));
3092 UNIT(async->async_dev));
3151 if ((async->async_dev == kbddev) ||
3152 (async->async_dev == rconsdev) ||
3153 (async->async_dev == stdindev)) {
3264 struct asyncline *async;
3266 async = (struct asyncline *)q->q_ptr;
3270 ASYSETSOFT(async->async_common);
3271 async->async_polltid = 0;
3288 register struct asyncline *async;
3292 async = (struct asyncline *)q->q_ptr;
3293 asy = async->async_common;
3303 async->async_flags |= ASYNC_STOPPED;
3310 if (async->async_flags & ASYNC_STOPPED) {
3311 async->async_flags &= ~ASYNC_STOPPED;
3317 if (async->async_ocnt > 0) {
3319 async_resume(async);
3322 async_start(async);
3343 UNIT(async->async_dev));
3347 async_nstart(async, 1);
3366 async_start(async);
3374 async_ioctl(async, q, mp, B_TRUE);
3387 if (async->async_flags & ASYNC_BUSY) {
3388 async->async_ocnt = 0;
3389 async->async_flags &= ~ASYNC_BUSY;
3403 if (async->async_xmitblk != NULL) {
3404 freeb(async->async_xmitblk);
3405 async->async_xmitblk = NULL;
3430 async_start(async);
3442 async_start(async);
3448 async->async_flowc = async->async_stopc;
3449 async_start(async); /* poke the start routine */
3456 async->async_flowc = async->async_startc;
3457 async_start(async); /* poke the start routine */
3480 async->async_flags |= ASYNC_SERVICEIMM;
3484 async->async_flags &= ~ASYNC_SERVICEIMM;
3509 struct asyncline *async = arg;
3510 struct asycom *asy = async->async_common;
3518 async->async_wbufcid = 0;
3519 if ((q = async->async_ttycommon.t_writeq) == NULL) {
3523 if ((mp = async->async_ttycommon.t_iocpending) != NULL) {
3525 async->async_ttycommon.t_iocpending = NULL;
3528 async_ioctl(async, q, mp, B_TRUE);
3536 struct asyncline *async = (struct asyncline *)q->q_ptr;
3540 asy = async->async_common;
3686 struct asyncline *async;
3691 async = (struct asyncline *)asy->asy_priv;
3692 ASSERT(async != NULL);
3694 if (async->async_ttycommon.t_cflag & CRTSXOFF) {
3696 flag = (async->async_flags & ASYNC_HW_IN_FLOW) ? 0 : RTS;
3707 struct asyncline *async;
3712 async = (struct asyncline *)asy->asy_priv;
3713 ASSERT(async != NULL);
3715 if ((ss = async->async_flowc) != '\0' && (INB(LSR) & XHRE)) {
3723 async->async_flowc = '\0';
3724 if (async->async_ttycommon.t_iflag & IXOFF) {
3725 async->async_flags |= ASYNC_BUSY;