home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume27 / fas-2.11.0 / part06 < prev    next >
Text File  |  1993-10-16  |  61KB  |  2,205 lines

  1. Newsgroups: comp.sources.unix
  2. From: fas@geminix.in-berlin.de (FAS Support Account)
  3. Subject: REPOST v27i073: FAS-2.11.0 - asynch serial driver for System V, Part06/08
  4. References: <1.750471074.20539@gw.home.vix.com>
  5. Sender: unix-sources-moderator@gw.home.vix.com
  6. Approved: vixie@gw.home.vix.com
  7.  
  8. Submitted-By: fas@geminix.in-berlin.de (FAS Support Account)
  9. Posting-Number: Volume 27, Issue 73
  10. Archive-Name: fas-2.11.0/part06
  11.  
  12. #!/bin/sh
  13. # this is fas211pl0.06 (part 6 of a multipart archive)
  14. # do not concatenate these parts, unpack them in order with /bin/sh
  15. # file fas.c continued
  16. #
  17. if test ! -r _shar_seq_.tmp; then
  18.     echo 'Please unpack part 1 first!'
  19.     exit 1
  20. fi
  21. (read Scheck
  22.  if test "$Scheck" != 6; then
  23.     echo Please unpack part "$Scheck" next!
  24.     exit 1
  25.  else
  26.     exit 0
  27.  fi
  28. ) < _shar_seq_.tmp || exit 1
  29. if test ! -f _shar_wnt_.tmp; then
  30.     echo 'x - still skipping fas.c'
  31. else
  32. echo 'x - continuing file fas.c'
  33. sed 's/^X//' << 'SHAR_EOF' >> 'fas.c' &&
  34. X            else
  35. X#endif
  36. X            {
  37. X                if (cflag & CTSFLOW)
  38. X                    fip->flow_flags |= FF_HWO_HANDSHAKE;
  39. X                if (cflag & RTSFLOW)
  40. X                    fip->flow_flags |= (fip->flow_flags
  41. X                                & FF_NEW_CTSRTS)
  42. X                                ? FF_HWI_HANDSHAKE
  43. X                                : FF_HDX_HANDSHAKE;
  44. X            }
  45. X#endif
  46. X        }
  47. X#endif
  48. X#endif
  49. X        }
  50. X
  51. X        /* Determine whether to enable MSI or not.
  52. X           Set the interrupt enable port accordingly.
  53. X        */
  54. X#if defined (HAVE_VPIX)
  55. X        if ((cflag & CLOCAL) && !(fip->flow_flags & FF_HWO_HANDSHAKE)
  56. X            && !(fip->iflag & DOSMODE))
  57. X#else
  58. X        if ((cflag & CLOCAL) && !(fip->flow_flags & FF_HWO_HANDSHAKE))
  59. X#endif
  60. X        {
  61. X        if (fip->device_flags & DF_MSI_ENABLED)
  62. X        {
  63. X            FAS_FIRST_OUTB (fip, INT_ENABLE_PORT,
  64. X                    IER &= ~IE_MODEM_STATUS);
  65. X            fip->device_flags &= ~DF_MSI_ENABLED;
  66. X        }
  67. X        fip->device_flags &= ~DF_MSI_NOISE;
  68. X        }
  69. X        else
  70. X        {
  71. X        if (!(fip->device_flags & (DF_MSI_ENABLED | DF_MSI_NOISE)))
  72. X        {
  73. X            /* read current modem status lines */
  74. X            MSR = NEW_MSR = FAS_FIRST_INB (fip, MDM_STATUS_PORT)
  75. X                        & (MS_CTS_PRESENT
  76. X                            | MS_DSR_PRESENT
  77. X                            | MS_DCD_PRESENT);
  78. X            FAS_OUTB (fip, INT_ENABLE_PORT, IER |= IE_MODEM_STATUS);
  79. X            fip->device_flags |= DF_MSI_ENABLED;
  80. X        }
  81. X        }
  82. X
  83. X        /* Fake the carrier detect state flag if CLOCAL mode or if
  84. X           requested by open mode.
  85. X        */
  86. X        if ((cflag & CLOCAL)
  87. X            || (fip->flow_flags & FF_CD_ENABLED
  88. X                && !(~MSR & fip->modem.m.ca))
  89. X            || ((fip->o_state & OS_FAKE_CARRIER_ON)
  90. X                && ((fip->flow_flags & FF_CARRIER_ON)
  91. X                    || !(fip->o_state & OS_OPEN_STATES))))
  92. X        {
  93. X        fip->flow_flags |= FF_CD_ENABLED | FF_CARRIER_ON;
  94. X        ttyp->t_state |= CARR_ON;
  95. X        }
  96. X        else
  97. X        {
  98. X        if (fip->flow_flags & FF_CARRIER_ON)
  99. X        {
  100. X            fip->flow_flags &= ((fip->device_flags
  101. X                            & DF_HUP_PROTECT)
  102. X                            && (fip->o_state
  103. X                            & OS_OPEN_STATES))
  104. X                        ? ~(FF_CD_ENABLED
  105. X                            | FF_CARRIER_ON)
  106. X                        : ~FF_CARRIER_ON;
  107. X            /* flush buffers on carrier drop */
  108. X            do_flush = TRUE;
  109. X        }
  110. X        ttyp->t_state &= ~CARR_ON;
  111. X        }
  112. X
  113. X        if ((fip->flow_flags & FF_CARRIER_ON) && (cflag & CREAD))
  114. X        {
  115. X        /* enable receiver data interrupts */
  116. X        if (!(fip->device_flags & DF_RDI_ENABLED))
  117. X            fas_rdi_enable (fip);
  118. X        }
  119. X        else
  120. X        {
  121. X        /* disable receiver data interrupts */
  122. X        if (fip->device_flags & DF_RDI_ENABLED)
  123. X        {
  124. X            FAS_FIRST_OUTB (fip, INT_ENABLE_PORT,
  125. X                    IER &= ~IE_RECV_DATA_AVAILABLE);
  126. X            fip->device_flags &= ~DF_RDI_ENABLED;
  127. X        }
  128. X        }
  129. X
  130. X        fip->cflag = cflag;
  131. X    }
  132. X
  133. X#if defined (XCLUDE)    /* SYSV 3.2 Xenix compatibility */
  134. X    /* Permit exclusive use of this device. */
  135. X    if (ttyp->t_lflag & XCLUDE)
  136. X        fip->o_state |= OS_EXCLUSIVE_OPEN_2;
  137. X    else
  138. X        fip->o_state &= ~OS_EXCLUSIVE_OPEN_2;
  139. X#endif
  140. X
  141. X    /* re-link fas_internals structure */
  142. X    fas_pos_by_speed (fip);
  143. X
  144. X    /* flush buffers if necessary */
  145. X    if (do_flush)
  146. X    {
  147. X        /* lock transmitter */
  148. X        fip->device_flags |= DF_XMIT_LOCKED;
  149. X        old_level = SPLWRK ();
  150. X        (void) ttyflush (ttyp, FREAD | FWRITE);
  151. X        (void) splx (old_level);
  152. X        /* enable transmitter */
  153. X        fip->device_flags &= ~DF_XMIT_LOCKED;
  154. X    }
  155. X
  156. X    /* setup handshake flags */
  157. X#if defined (HAVE_VPIX)
  158. X    if ((fip->flow_flags & (FF_HWI_HANDSHAKE | FF_HDX_HANDSHAKE))
  159. X        || !(fip->iflag & DOSMODE))
  160. X#endif
  161. X    {
  162. X        register n_unchar    mcr REG_BX;
  163. X
  164. X        /* clear flow control output bits */
  165. X        mcr = MCR & ~(fip->flow.m.ic | fip->flow.m.hc);
  166. X        fip->flow_flags &= ~(FF_HWI_STARTED | FF_HDX_STARTED);
  167. X
  168. X        /* raise flow control bits if necessary */
  169. X        if (fip->flow_flags & FF_HWI_HANDSHAKE)
  170. X        {
  171. X            if (fip->recv_ring_cnt < HW_LOW_WATER)
  172. X            {
  173. X                mcr |= fip->flow.m.ic;
  174. X                fip->flow_flags |= FF_HWI_STARTED;
  175. X            }
  176. X        }
  177. X        else if (fip->flow_flags & FF_HDX_HANDSHAKE)
  178. X        {
  179. X            if (fip->flow_flags & FF_OUTPUT_BUSY)
  180. X            {
  181. X                mcr |= fip->flow.m.hc;
  182. X                fip->flow_flags |= FF_HDX_STARTED;
  183. X            }
  184. X        }
  185. X        else if (!(fip->flow_flags & FF_DEF_HHO_LOW))
  186. X            mcr |= fip->flow.m.hc;
  187. X
  188. X        /* set modem enable bits */
  189. X#if defined (HAVE_VPIX)
  190. X        if (!(fip->iflag & DOSMODE))
  191. X#endif
  192. X        {
  193. X            if ((ttyp->t_cflag & CBAUD) != B0
  194. X                && (fip->flow_flags & FF_CD_ENABLED))
  195. X            {
  196. X                mcr |= (fip->o_state & OS_WAIT_OPEN)
  197. X                        ? fip->modem.m.ei
  198. X                        : fip->modem.m.eo;
  199. X            }
  200. X            else
  201. X            {
  202. X                mcr &= (fip->o_state & OS_WAIT_OPEN)
  203. X                        ? ~fip->modem.m.ei
  204. X                        : ~fip->modem.m.eo;
  205. X            }
  206. X        }
  207. X
  208. X        if ((init_type != SOFT_INIT) || (mcr != MCR))
  209. X            FAS_FIRST_OUTB (fip, MDM_CTL_PORT, MCR = mcr);
  210. X    }
  211. X
  212. X    /* set hardware output flow control flags */
  213. X    if (!(~NEW_MSR & fip->flow.m.oc)
  214. X            || (~NEW_MSR & fip->flow.m.oe)
  215. X            || !(fip->flow_flags & FF_HWO_HANDSHAKE))
  216. X        fip->flow_flags &= ~FF_HWO_STOPPED;
  217. X    else
  218. X        fip->flow_flags |= FF_HWO_STOPPED;
  219. X
  220. X    /* check software input flow control */
  221. X    if (fip->flow_flags & FF_SWI_STOPPED)
  222. X    {
  223. X        if (!(fip->iflag & IXOFF)
  224. X                || (fip->recv_ring_cnt < SW_LOW_WATER))
  225. X            fas_send_xon (fip);
  226. X    }
  227. X    else
  228. X    {
  229. X        if ((fip->iflag & IXOFF)
  230. X                && (fip->recv_ring_cnt > SW_HIGH_WATER))
  231. X            fas_send_xoff (fip);
  232. X    }
  233. X
  234. X    /* restart output */
  235. X    fas_xproc (fip);
  236. X}
  237. X
  238. X/* Re-link fas_internals structure to interrupt users chain according
  239. X   to the baud rate (fastes port comes first).
  240. X   (called at SPLINT)
  241. X*/
  242. XSTATIC void
  243. Xfas_pos_by_speed (fipp)
  244. Xstruct fas_internals    *fipp;
  245. X{
  246. X    register struct fas_internals    *fip REG_SI;
  247. X
  248. X    {
  249. X        register n_unchar    my_prio REG_BX;
  250. X        register n_unchar    prio REG_CX;
  251. X        ulong    my_speed;
  252. X
  253. X        fip = fipp;
  254. X
  255. X        /* compute our own speed */
  256. X        if (fip->flow_flags & FF_CARRIER_ON)
  257. X        {
  258. X        INT_PRIO = my_prio = (fip->device_flags & DF_NO_OVERRUN)
  259. X                    ? NUMBER_OF_TYPES
  260. X                    : DEVICE_TYPE;
  261. X        my_speed = fas_baud_ptr [BT_SELECT] [fip->cflag & CBAUD];
  262. X        }
  263. X        else
  264. X        {
  265. X        my_prio = NUMBER_OF_TYPES + 1;
  266. X        INT_PRIO = NUMBER_OF_TYPES + 1;
  267. X        my_speed = 0L;
  268. X        }
  269. X
  270. X        /* unhook us from the interrupt users chain */
  271. X        if (fip->prev_int_user)
  272. X        fip->prev_int_user->next_int_user = fip->next_int_user;
  273. X        else
  274. X        fas_first_int_user = fip->next_int_user;
  275. X        if (fip->next_int_user)
  276. X        fip->next_int_user->prev_int_user = fip->prev_int_user;
  277. X        else
  278. X        fas_last_int_user = fip->prev_int_user;
  279. X
  280. X        /* find a new position for us */
  281. X        for (fip = fas_first_int_user; fip; fip = fip->next_int_user)
  282. X        {
  283. Xfastloop4:
  284. X        if (my_prio > (prio = INT_PRIO))
  285. X        {
  286. X            /* speed beats beauty */
  287. X            fip = fip->next_int_user;
  288. X            if (fip)
  289. X                goto fastloop4;
  290. X            break;
  291. X        }
  292. X
  293. X        if (my_prio < prio)
  294. X            break;    /* found a new position */
  295. X        if (my_speed >= ((prio == NUMBER_OF_TYPES + 1)
  296. X                    ? 0L
  297. X                    : fas_baud_ptr [BT_SELECT]
  298. X                        [fip->cflag & CBAUD]))
  299. X            break;    /* found a new position */
  300. X        }
  301. X    }
  302. X
  303. X    {
  304. X        register struct fas_internals    *my_fip REG_DI;
  305. X
  306. X        my_fip = fipp;
  307. X
  308. X        /* now hook us into the new position */
  309. X        if (fip)
  310. X        {
  311. X        /* we are in front of another entry */
  312. X        if ((my_fip->prev_int_user = fip->prev_int_user))
  313. X            my_fip->prev_int_user->next_int_user = my_fip;
  314. X        else
  315. X            fas_first_int_user = my_fip;
  316. X        fip->prev_int_user = my_fip;
  317. X        my_fip->next_int_user = fip;
  318. X        }
  319. X        else
  320. X        {
  321. X        /* we are the last entry */
  322. X        if ((my_fip->prev_int_user = fas_last_int_user))
  323. X            my_fip->prev_int_user->next_int_user = my_fip;
  324. X        else
  325. X            fas_first_int_user = my_fip;
  326. X        fas_last_int_user = my_fip;
  327. X        my_fip->next_int_user = (struct fas_internals *) NULL;
  328. X        }
  329. X    }
  330. X}
  331. X
  332. X/* Asynchronous event handler. Scheduled by functions that can't do the
  333. X   processing themselves because of execution time restrictions.
  334. X   (called via timeout () at an OS dependent SPL)
  335. X*/
  336. XSTATIC void
  337. Xfas_event (dummy)
  338. Xvoid    *dummy;
  339. X{
  340. X    register struct fas_internals    *fip REG_SI;
  341. X    register struct tty    *ttyp REG_DI;
  342. X    register uint    count REG_BX;
  343. X    bool    idle;
  344. X    int    old_level;
  345. X
  346. X    /* allow pending tty interrupts */
  347. X    old_level = SPLWRK ();
  348. X    (void) SPLINT ();
  349. X
  350. X    idle = TRUE;
  351. X
  352. X    /* loop through all fas_internals structures */
  353. X    for (fip = &fas_internals [0], count = fas_physical_units; count;
  354. X            ++fip, --count)
  355. X    {
  356. Xfastloop3:
  357. X        /* process only structures that actually need service */
  358. X        if (!fip->event_flags)
  359. X        {
  360. X            /* speed beats beauty */
  361. X            ++fip;
  362. X            if (--count)
  363. X                goto fastloop3;
  364. X            break;
  365. X        }
  366. X
  367. X        /* we have something to do */
  368. X        idle = FALSE;
  369. X        ttyp = fip->tty;
  370. X
  371. X        /* check the modem signals */
  372. X        if (fip->event_flags & (EF_DO_MPROC | EF_RESET_DELTA_BITS))
  373. X        {
  374. X            NEW_MSR &= ~MS_ANY_DELTA;
  375. X            if (fip->event_flags & EF_DO_MPROC)
  376. X            {
  377. X                fip->event_flags &= ~(EF_DO_MPROC
  378. X                            | EF_RESET_DELTA_BITS);
  379. X                fas_mproc (fip);
  380. X            }
  381. X            else
  382. X                fip->event_flags &= ~EF_RESET_DELTA_BITS;
  383. X
  384. X            /* re-enable modem status interrupts if appropriate */
  385. X            if (fip->device_flags & DF_MSI_NOISE)
  386. X            {
  387. X                FAS_FIRST_OUTB (fip, INT_ENABLE_PORT,
  388. X                            IER |= IE_MODEM_STATUS);
  389. X                fip->device_flags |= DF_MSI_ENABLED;
  390. X                fip->device_flags &= ~DF_MSI_NOISE;
  391. X            }
  392. X        }
  393. X
  394. X        /* do the break interrupt */
  395. X        if (fip->event_flags & EF_DO_BRKINT)
  396. X        {
  397. X            fip->event_flags &= ~EF_DO_BRKINT;
  398. X            if (fip->flow_flags & FF_CARRIER_ON)
  399. X            {
  400. X                (void) SPLWRK ();
  401. X                (void) (*linesw [(unchar) ttyp->t_line].l_input)
  402. X                                (ttyp, L_BREAK);
  403. X                (void) SPLINT ();
  404. X            }
  405. X        }
  406. X
  407. X        /* transfer characters to the CLIST input buffer */
  408. X        if (fip->event_flags & EF_DO_RXFER)
  409. X        {
  410. X#if defined (HAVE_VPIX)
  411. X            fip->event_flags &= ~(EF_DO_RXFER | EF_WAKEUP_VPIX);
  412. X#else
  413. X            fip->event_flags &= ~EF_DO_RXFER;
  414. X#endif
  415. X            if ((fip->flow_flags & (FF_CARRIER_ON
  416. X                            | FF_RXFER_STOPPED))
  417. X                == FF_CARRIER_ON)
  418. X            {
  419. X                /* if not done, re-schedule this event */
  420. X                if (!fas_rxfer (fip))
  421. X                fip->event_flags |= EF_DO_RXFER;
  422. X                /* check input buffer low water marks */
  423. X                if ((fip->recv_ring_cnt < HW_LOW_WATER)
  424. X                    && (fip->flow_flags & (FF_HWI_HANDSHAKE
  425. X                                | FF_HWI_STARTED))
  426. X                    == FF_HWI_HANDSHAKE)
  427. X                {
  428. X                FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  429. X                        MCR |= fip->flow.m.ic);
  430. X                fip->flow_flags |= FF_HWI_STARTED;
  431. X                }
  432. X                if ((fip->recv_ring_cnt < SW_LOW_WATER)
  433. X                    && (fip->iflag & IXOFF)
  434. X                    && (fip->flow_flags & FF_SWI_STOPPED))
  435. X                fas_send_xon (fip);
  436. X            }
  437. X#if defined (HAVE_VPIX)
  438. X            /* send pseudorupt to VP/ix */
  439. X            if ((fip->iflag & DOSMODE) && fip->v86_proc
  440. X                && (ttyp->t_rawq.c_cc || ttyp->t_canq.c_cc))
  441. X            {
  442. X                (void) SPLWRK ();
  443. X                (void) v86setint (fip->v86_proc,
  444. X                            fip->v86_intmask);
  445. X                (void) SPLINT ();
  446. X                fip->event_flags |= EF_WAKEUP_VPIX;
  447. X            }
  448. X#endif
  449. X        }
  450. X#if defined (HAVE_VPIX)
  451. X        else if (fip->event_flags & EF_WAKEUP_VPIX)
  452. X        {
  453. X            /* send pseudorupt to VP/ix */
  454. X            if ((fip->iflag & DOSMODE) && fip->v86_proc
  455. X                && (ttyp->t_rawq.c_cc || ttyp->t_canq.c_cc))
  456. X            {
  457. X                (void) SPLWRK ();
  458. X                (void) v86setint (fip->v86_proc,
  459. X                            fip->v86_intmask);
  460. X                (void) SPLINT ();
  461. X            }
  462. X            else
  463. X                fip->event_flags &= ~EF_WAKEUP_VPIX;
  464. X        }
  465. X#endif
  466. X
  467. X        /* transfer characters to the output ring buffer */
  468. X        if (fip->event_flags & EF_DO_XXFER)
  469. X        {
  470. X            fip->event_flags &= ~EF_DO_XXFER;
  471. X            if (fip->flow_flags & FF_CARRIER_ON)
  472. X            {
  473. X                fas_xxfer (fip);
  474. X                if (fip->flow_flags & FF_OUTPUT_BUSY)
  475. X                    ttyp->t_state |= BUSY;
  476. X                /* check half duplex output flow control */
  477. X                if ((fip->flow_flags & (FF_HDX_HANDSHAKE
  478. X                            | FF_HDX_STARTED
  479. X                            | FF_OUTPUT_BUSY))
  480. X                        == (FF_HDX_HANDSHAKE
  481. X                            | FF_OUTPUT_BUSY))
  482. X                {
  483. X                    FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  484. X                            MCR |= fip->flow.m.hc);
  485. X                    fip->flow_flags |= FF_HDX_STARTED;
  486. X                }
  487. X                /* output characters */
  488. X                fas_xproc (fip);
  489. X            }
  490. X            else
  491. X            {
  492. X                /* throw away characters in output queue */
  493. X                (void) SPLWRK ();
  494. X                (void) ttyflush (ttyp, FWRITE);
  495. X                (void) SPLINT ();
  496. X            }
  497. X        }
  498. X
  499. X        /* allow pending tty interrupts */
  500. X        (void) SPLWRK ();
  501. X        (void) SPLINT ();
  502. X    }
  503. X
  504. X    event_scheduled = FALSE;
  505. X
  506. X    /* check whether there was something to do */
  507. X    if (!idle)
  508. X    {
  509. X        /* there was work to do, so it's likely that there
  510. X           also will be something to do in a short time from
  511. X           now, so we schedule the next event processing
  512. X        */
  513. X        event_scheduled = TRUE;
  514. X        (void) timeout (fas_event, (caddr_t) NULL,
  515. X                (EVENT_TIME) * (HZ) / 1000);
  516. X    }
  517. X
  518. X    (void) splx (old_level);
  519. X}
  520. X
  521. X/* Modem status handler.
  522. X   (called at SPLINT)
  523. X*/
  524. XSTATIC void
  525. Xfas_mproc (fip)
  526. Xregister struct fas_internals    *fip REG_SI;
  527. X{
  528. X    register n_unchar    mdm_status REG_BX;
  529. X    int    old_level;
  530. X
  531. X    mdm_status = NEW_MSR;
  532. X    NEW_MSR &= ~MS_RING_PRESENT;
  533. X
  534. X    /* Check the carrier detect signal and set the state flags
  535. X       accordingly. Also, if not in clocal mode, send SIGHUP on
  536. X       carrier loss and flush the buffers.
  537. X    */
  538. X    if (!(fip->cflag & CLOCAL) && (fip->flow_flags & FF_CD_ENABLED))
  539. X    {
  540. X        register struct tty    *ttyp REG_DI;
  541. X
  542. X        ttyp = fip->tty;
  543. X        if (!(~mdm_status & fip->modem.m.ca))
  544. X        {
  545. X            /* Wake up dialin process on carrier low->high. */
  546. X            if (!(fip->flow_flags & FF_CARRIER_ON))
  547. X            {
  548. X                fip->flow_flags |= FF_CARRIER_ON;
  549. X                if ((ttyp->t_state |= CARR_ON) & WOPEN)
  550. X                    (void) wakeup ((caddr_t) &ttyp->t_canq);
  551. X                /* enable receiver data interrupts */
  552. X                if ((fip->cflag & CREAD)
  553. X                        && !(fip->device_flags
  554. X                            & DF_RDI_ENABLED))
  555. X                    fas_rdi_enable (fip);
  556. X                /* re-link fas_internals structure */
  557. X                fas_pos_by_speed (fip);
  558. X            }
  559. X        }
  560. X        else
  561. X        {
  562. X            if (!(~MSR & fip->modem.m.ca))
  563. X            {
  564. X                if ((fip->device_flags & DF_HUP_PROTECT)
  565. X                    && (fip->o_state & OS_OPEN_STATES))
  566. X                {
  567. X                    FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  568. X                            MCR &= (fip->o_state
  569. X                                & OS_WAIT_OPEN)
  570. X                                ? ~fip->modem.m.ei
  571. X                                : ~fip->modem.m.eo);
  572. X                    fip->flow_flags &= ~(FF_CD_ENABLED
  573. X                                | FF_CARRIER_ON);
  574. X                }
  575. X                else
  576. X                    fip->flow_flags &= ~FF_CARRIER_ON;
  577. X                ttyp->t_state &= ~CARR_ON;
  578. X                /* disable receiver data interrupts */
  579. X                if (fip->device_flags & DF_RDI_ENABLED)
  580. X                {
  581. X                    FAS_FIRST_OUTB (fip, INT_ENABLE_PORT,
  582. X                        IER &= ~IE_RECV_DATA_AVAILABLE);
  583. X                    fip->device_flags &= ~DF_RDI_ENABLED;
  584. X                }
  585. X                /* re-link fas_internals structure */
  586. X                fas_pos_by_speed (fip);
  587. X                old_level = SPLWRK ();
  588. X                if (ttyp->t_pgrp)
  589. X                {
  590. X                    (void) signal (ttyp->t_pgrp, SIGHUP);
  591. X#if defined (SIGCONT)
  592. X                    /* make sure processes are awake */
  593. X                    (void) signal (ttyp->t_pgrp, SIGCONT);
  594. X#endif
  595. X                }
  596. X                (void) ttyflush (ttyp, FREAD | FWRITE);
  597. X                (void) splx (old_level);
  598. X            }
  599. X        }
  600. X    }
  601. X
  602. X#if defined (HAVE_VPIX)
  603. X    if ((fip->iflag & (DOSMODE | PARMRK)) == (DOSMODE | PARMRK)
  604. X        && (fip->flow_flags & FF_CARRIER_ON)
  605. X        && fip->recv_ring_cnt < RECV_BUFF_SIZE - 2)
  606. X    {
  607. X        register n_unchar    vpix_status REG_CX;
  608. X
  609. X        /* prepare status bits for VP/ix */
  610. X        vpix_status = (((mdm_status ^ MSR) >> 4) & MS_ANY_DELTA)
  611. X                | (mdm_status & (MS_CTS_PRESENT
  612. X                            | MS_DSR_PRESENT
  613. X                            | MS_DCD_PRESENT));
  614. X        if (fip->flow_flags & FF_HWO_HANDSHAKE)
  615. X        {
  616. X            vpix_status &= ~((n_unchar) (fip->flow.m.oc
  617. X                            | fip->flow.m.oe) >> 4);
  618. X            vpix_status |= fip->flow.m.oc | fip->flow.m.oe;
  619. X        }
  620. X        if (!(fip->cflag & CLOCAL))
  621. X        {
  622. X            vpix_status &= ~((n_unchar) fip->modem.m.ca >> 4);
  623. X            vpix_status |= fip->modem.m.ca;
  624. X        }
  625. X        /* send status bits to VP/ix */
  626. X        if (vpix_status & MS_ANY_DELTA)
  627. X        {
  628. X            fip->recv_ring_cnt += 3;
  629. X            PUT_RECV_BUFFER (fip, fip->recv_ring_put_ptr, 0xff);
  630. X            PUT_RECV_BUFFER (fip, fip->recv_ring_put_ptr, 2);
  631. X            PUT_RECV_BUFFER (fip, fip->recv_ring_put_ptr,
  632. X                        vpix_status);
  633. X            EVENT_SCHED (fip, EF_DO_RXFER);
  634. X            /* check input buffer high water marks */
  635. X            if ((fip->recv_ring_cnt > HW_HIGH_WATER)
  636. X                    && (fip->flow_flags & (FF_HWI_HANDSHAKE
  637. X                                | FF_HWI_STARTED))
  638. X                    == (FF_HWI_HANDSHAKE | FF_HWI_STARTED))
  639. X            {
  640. X                FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  641. X                        MCR &= ~fip->flow.m.ic);
  642. X                fip->flow_flags &= ~FF_HWI_STARTED;
  643. X            }
  644. X            if ((fip->recv_ring_cnt > SW_HIGH_WATER)
  645. X                    && (fip->iflag & IXOFF)
  646. X                    && !(fip->flow_flags & FF_SWI_STOPPED))
  647. X                fas_send_xoff (fip);
  648. X        }
  649. X    }
  650. X#endif
  651. X    MSR = mdm_status & ~MS_RING_PRESENT;
  652. X
  653. X    /* re-enable transmitter if it was stopped by carrier detect */
  654. X    if (fip->flow_flags & FF_CARR_STOPPED)
  655. X    {
  656. X        fip->flow_flags &= ~FF_CARR_STOPPED;
  657. X        fas_xproc (fip);
  658. X    }
  659. X}
  660. X
  661. X/* Receiver ring buffer -> CLIST buffer transfer function.
  662. X   (called at SPLINT)
  663. X*/
  664. XSTATIC bool
  665. Xfas_rxfer (fipp)
  666. Xstruct fas_internals    *fipp;
  667. X{
  668. X    /* Defining register variables with function-wide scope would
  669. X       break the FAS_MEM_COPY () macro below. So don't do that!
  670. X    */
  671. X    unchar    *tmp_srcptr, *tmp_destptr;
  672. X    uint    num_save;
  673. X    uint    recv_ring_cnt;
  674. X    int    old_level;
  675. X
  676. X    num_save = 0;
  677. X
  678. X    for (;;)
  679. X    {
  680. X        /* determine how many characters we have to copy */
  681. X        {
  682. X        register struct fas_internals    *fip REG_SI;
  683. X        register struct tty    *ttyp REG_DI;
  684. X        register uint    num_to_xfer REG_BX;
  685. X
  686. X        old_level = SPLWRK ();
  687. X        fip = fipp;
  688. X        ttyp = fip->tty;
  689. X
  690. X        /* if the target buffer is full, or if there is no
  691. X           target buffer available, try to get a new one,
  692. X           otherwise return
  693. X        */
  694. X        if (num_save || !ttyp->t_rbuf.c_ptr)
  695. X        {
  696. X            (void) (*linesw [(unchar) ttyp->t_line].l_input)
  697. X                                (ttyp, L_BUF);
  698. X            if (!ttyp->t_rbuf.c_ptr)
  699. X            {
  700. X                (void) splx (old_level);
  701. X                return (FALSE);
  702. X            }
  703. X        }
  704. X
  705. X        /* return if there aren't any characters to transfer */
  706. X        if (!(recv_ring_cnt = fip->recv_ring_cnt))
  707. X        {
  708. X            (void) splx (old_level);
  709. X            return (TRUE);
  710. X        }
  711. X
  712. X        /* determine how many characters to transfer */
  713. X#if defined (XENIX)
  714. X        if (ttyp->t_lflag & ICANON)
  715. X#else
  716. X        if ((ttyp->t_lflag & ICANON) || ttyp->t_term)
  717. X#endif
  718. X        {
  719. X            num_to_xfer = recv_ring_cnt;
  720. X        }
  721. X        else
  722. X        {
  723. X            num_to_xfer = max_rawq_count - (uint) ttyp->t_rawq.c_cc;
  724. X            if (!num_to_xfer)
  725. X            {
  726. X                (void) splx (old_level);
  727. X                return (FALSE);    /* input buffer full */
  728. X            }
  729. X            if (recv_ring_cnt < num_to_xfer)
  730. X                num_to_xfer = recv_ring_cnt;
  731. X            /* if there are too few remaining characters to
  732. X               completely fill a CLIST buffer, postpone the
  733. X               transfer of these characters for a number of
  734. X               event cycles on the assumption that by then
  735. X               more characters have arrived
  736. X            */
  737. X            if (ttyp->t_rbuf.c_count > num_to_xfer
  738. X                && (num_save || --fip->rxfer_timeout))
  739. X            {
  740. X                (void) splx (old_level);
  741. X                return (FALSE);    /* input buffer full */
  742. X            }
  743. X        }
  744. X
  745. X        /* reset timeout counter */
  746. X        fip->rxfer_timeout = MAX_RXFER_DELAY / EVENT_TIME;
  747. X
  748. X        /* determine how many characters are in one contiguous block */
  749. X        if (ttyp->t_rbuf.c_count < num_to_xfer)
  750. X            num_to_xfer = ttyp->t_rbuf.c_count;
  751. X        if ((uint) (&fip->recv_buffer [RECV_BUFF_SIZE]
  752. X                        - fip->recv_ring_take_ptr)
  753. X                < num_to_xfer)
  754. X            num_to_xfer = &fip->recv_buffer [RECV_BUFF_SIZE]
  755. X                    - fip->recv_ring_take_ptr;
  756. X
  757. X        if (!num_to_xfer)
  758. X        {
  759. X            /* invalid count, shouldn't happen */
  760. X            (void) splx (old_level);
  761. X            return (FALSE);
  762. X        }
  763. X
  764. X        tmp_srcptr = fip->recv_ring_take_ptr;
  765. X        if ((fip->recv_ring_take_ptr += num_to_xfer)
  766. X                    == &fip->recv_buffer [RECV_BUFF_SIZE])
  767. X            fip->recv_ring_take_ptr = &fip->recv_buffer [0];
  768. X        tmp_destptr = (unchar *) ttyp->t_rbuf.c_ptr;
  769. X        ttyp->t_rbuf.c_count -= num_to_xfer;
  770. X        num_save = num_to_xfer;
  771. X        }
  772. X
  773. X        /* now copy from the ring buffer to the clist buffer */
  774. X        FAS_MEM_COPY (tmp_destptr, tmp_srcptr, num_save);
  775. X
  776. X        (void) splx (old_level);
  777. X        fipp->recv_ring_cnt -= num_save;
  778. X    }
  779. X}
  780. X
  781. X/* CLIST buffer -> transmitter ring buffer transfer function.
  782. X   (called at SPLINT)
  783. X*/
  784. XSTATIC void
  785. Xfas_xxfer (fipp)
  786. Xstruct fas_internals    *fipp;
  787. X{
  788. X    /* Defining register variables with function-wide scope would
  789. X       break the FAS_MEM_COPY () macro below. So don't do that!
  790. X    */
  791. X    unchar    *tmp_srcptr, *tmp_destptr;
  792. X    uint    num_save;
  793. X    uint    xmit_ring_cnt;
  794. X    int    old_level;
  795. X
  796. X    for (;;)
  797. X    {
  798. X        /* determine how many characters we have to copy */
  799. X        {
  800. X        register struct fas_internals    *fip REG_SI;
  801. X        register struct tty    *ttyp REG_DI;
  802. X        register uint    num_to_xfer REG_BX;
  803. X
  804. X        old_level = SPLWRK ();
  805. X        fip = fipp;
  806. X        ttyp = fip->tty;
  807. X
  808. X        /* Check if tbuf is empty. If it is empty, reset buffer
  809. X           pointer and counter and get the next chunk of output
  810. X           characters.
  811. X        */
  812. X        if (!ttyp->t_tbuf.c_ptr || !ttyp->t_tbuf.c_count)
  813. X        {
  814. X            if (ttyp->t_tbuf.c_ptr)
  815. X                ttyp->t_tbuf.c_ptr -= ttyp->t_tbuf.c_size;
  816. X            if (!((*linesw [(unchar) ttyp->t_line].l_output) (ttyp)
  817. X                    & CPRES))
  818. X            {
  819. X                (void) splx (old_level);
  820. X                return;
  821. X            }
  822. X        }
  823. X
  824. X        /* Return if transmitter ring buffer is full. */
  825. X        if (fip->xmit_ring_size <= (xmit_ring_cnt = fip->xmit_ring_cnt))
  826. X        {
  827. X            (void) splx (old_level);
  828. X            return;
  829. X        }
  830. X
  831. X        /* set the maximum character limit */
  832. X        num_to_xfer = fip->xmit_ring_size - xmit_ring_cnt;
  833. X
  834. X        /* Determine how many chars to transfer this time. */
  835. X        if (ttyp->t_tbuf.c_count < num_to_xfer)
  836. X            num_to_xfer = ttyp->t_tbuf.c_count;
  837. X        if ((uint) (&fip->xmit_buffer [XMIT_BUFF_SIZE]
  838. X                        - fip->xmit_ring_put_ptr)
  839. X                < num_to_xfer)
  840. X            num_to_xfer = &fip->xmit_buffer [XMIT_BUFF_SIZE]
  841. X                    - fip->xmit_ring_put_ptr;
  842. X        if (!num_to_xfer)
  843. X        {
  844. X            /* invalid count, shouldn't happen */
  845. X            (void) splx (old_level);
  846. X            return;
  847. X        }
  848. X
  849. X        fip->flow_flags |= FF_OUTPUT_BUSY;
  850. X        tmp_srcptr = (unchar *) ttyp->t_tbuf.c_ptr;
  851. X        ttyp->t_tbuf.c_ptr += num_to_xfer;
  852. X        ttyp->t_tbuf.c_count -= num_to_xfer;
  853. X        tmp_destptr = fip->xmit_ring_put_ptr;
  854. X        if ((fip->xmit_ring_put_ptr += num_to_xfer)
  855. X                    == &fip->xmit_buffer [XMIT_BUFF_SIZE])
  856. X            fip->xmit_ring_put_ptr = &fip->xmit_buffer [0];
  857. X        num_save = num_to_xfer;
  858. X        }
  859. X
  860. X        /* now copy from the clist buffer to the ring buffer */
  861. X        FAS_MEM_COPY (tmp_destptr, tmp_srcptr, num_save);
  862. X
  863. X        (void) splx (old_level);
  864. X        fipp->xmit_ring_cnt += num_save;
  865. X    }
  866. X}
  867. X
  868. X/* Handle hangup after last close.
  869. X   (called via timeout () at an OS dependent SPL)
  870. X*/
  871. XSTATIC void
  872. Xfas_hangup (fip)
  873. Xregister struct fas_internals    *fip REG_SI;
  874. X{
  875. X    int    old_level;
  876. X
  877. X    old_level = SPLINT ();
  878. X
  879. X    if (fip->device_flags & DF_DO_HANGUP)
  880. X    {
  881. X        /* do the hangup */
  882. X        MCR &= ~(fip->modem.m.ei | fip->modem.m.eo);
  883. X        FAS_FIRST_OUTB (fip, MDM_CTL_PORT, MCR |= fip->modem.m.di);
  884. X        fip->device_flags &= ~DF_DO_HANGUP;
  885. X        (void) timeout (fas_hangup, (caddr_t) fip,
  886. X                        (HANGUP_TIME) * (HZ) / 1000);
  887. X    }
  888. X    else
  889. X    {
  890. X        /* If there was a waiting dialin process on this
  891. X           port, reopen the physical device.
  892. X        */
  893. X        if (fip->o_state & OS_WAIT_OPEN)
  894. X        {
  895. X            /* allow pending tty interrupts */
  896. X            (void) SPLWRK ();
  897. X            (void) SPLINT ();
  898. X
  899. X            fas_open_device (fip);
  900. X
  901. X            /* allow pending tty interrupts */
  902. X            (void) SPLWRK ();
  903. X            (void) SPLINT ();
  904. X        }
  905. X        RELEASE_DEVICE_LOCK (fip);
  906. X    }
  907. X
  908. X    (void) splx (old_level);
  909. X}
  910. X
  911. X/* Main timeout function.
  912. X   (called via timeout () at an OS dependent SPL)
  913. X*/
  914. XSTATIC void
  915. Xfas_timeout (fip)
  916. Xregister struct fas_internals    *fip REG_SI;
  917. X{
  918. X    int    old_level;
  919. X
  920. X    old_level = SPLINT ();
  921. X
  922. X    /* handle break request */
  923. X    if (fip->device_flags & DF_DO_BREAK)
  924. X    {
  925. X        /* set up break request flags */
  926. X        FAS_FIRST_OUTB (fip, LINE_CTL_PORT,
  927. X                    LCR |= LC_SET_BREAK_LEVEL);
  928. X        fip->device_flags &= ~(DF_DO_BREAK | DF_GUARD_TIMEOUT);
  929. X        (void) timeout (fas_timeout, (caddr_t) fip,
  930. X                        (BREAK_TIME) * (HZ) / 1000);
  931. X        (void) splx (old_level);
  932. X        return;
  933. X    }
  934. X
  935. X    /* reset break state */
  936. X    if ((fip->device_flags & DF_XMIT_BREAK)
  937. X        && (LCR & LC_SET_BREAK_LEVEL))
  938. X    {
  939. X        FAS_FIRST_OUTB (fip, LINE_CTL_PORT, LCR &= ~LC_SET_BREAK_LEVEL);
  940. X        fip->device_flags |= DF_GUARD_TIMEOUT;
  941. X        fip->timeout_idx = timeout (fas_timeout, (caddr_t) fip,
  942. X                        fas_speed_ptr [BT_SELECT]
  943. X                            [fip->cflag & CBAUD]
  944. X                            .i.ctime);
  945. X        (void) splx (old_level);
  946. X        return;
  947. X    }
  948. X
  949. X    fip->device_flags &= ~(DF_GUARD_TIMEOUT | DF_XMIT_BREAK);
  950. X
  951. X    /* restart output */
  952. X    fas_xproc (fip);
  953. X
  954. X    if ((fip->flow_flags & FF_OUTPUT_BUSY)
  955. X            && !fip->xmit_ring_cnt
  956. X            && !(fip->device_flags & DF_XMIT_BUSY))
  957. X    {
  958. X        fip->flow_flags &= ~FF_OUTPUT_BUSY;
  959. X        fip->tty->t_state &= ~BUSY;
  960. X        /* check half duplex output flow control */
  961. X        if ((fip->flow_flags & (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  962. X                == (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  963. X        {
  964. X            FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  965. X                        MCR &= ~fip->flow.m.hc);
  966. X            fip->flow_flags &= ~FF_HDX_STARTED;
  967. X        }
  968. X        EVENT_SCHED (fip, EF_DO_XXFER);
  969. X    }
  970. X
  971. X    (void) wakeup ((caddr_t) &(fip)->device_flags);
  972. X    (void) splx (old_level);
  973. X}
  974. X
  975. X/* Re-enable receiver data interrupts.
  976. X   (called at SPLINT)
  977. X*/
  978. XSTATIC void
  979. Xfas_rdi_enable (fip)
  980. Xregister struct fas_internals    *fip REG_SI;
  981. X{
  982. X    /* flush receiver register */
  983. X    if (DEVICE_TYPE == TYPE_NS16550A)
  984. X        FAS_FIRST_OUTB (fip, NS_FIFO_CTL_PORT, FCR | NS_FIFO_CLR_RECV);
  985. X    else if (DEVICE_TYPE == TYPE_I82510)
  986. X    {
  987. X        FAS_FIRST_OUTB (fip, I_BANK_PORT, I_BANK_1);
  988. X        FAS_OUTB (fip, I_RCM_PORT, I_FIFO_CLR_RECV);
  989. X        FAS_OUTB (fip, I_BANK_PORT, I_BANK_0);
  990. X    }
  991. X    (void) FAS_FIRST_INB (fip, RCV_DATA_PORT);
  992. X    if (FAS_INB (fip, LINE_STATUS_PORT) & LS_RCV_AVAIL)
  993. X        (void) FAS_INB (fip, RCV_DATA_PORT);
  994. X
  995. X    FAS_OUTB (fip, INT_ENABLE_PORT, IER |= IE_RECV_DATA_AVAILABLE);
  996. X    fip->device_flags |= DF_RDI_ENABLED;
  997. X}
  998. X
  999. X/* Start software input flow control.
  1000. X   (called at SPLINT)
  1001. X*/
  1002. XSTATIC void
  1003. Xfas_send_xon (fip)
  1004. Xregister struct fas_internals    *fip REG_SI;
  1005. X{
  1006. X    fip->flow_flags &= ~FF_SWI_STOPPED;
  1007. X    fip->flow_flags ^= FF_SW_FC_REQ;
  1008. X    if (fip->flow_flags & FF_SW_FC_REQ)
  1009. X    {
  1010. X        if (fip->flow_flags & FF_CARRIER_ON)
  1011. X        {
  1012. X        /* start input */
  1013. X        fip->flow_flags |= FF_OUTPUT_BUSY;
  1014. X        fip->tty->t_state |= TTXON | BUSY;
  1015. X        /* check half duplex output flow control */
  1016. X        if ((fip->flow_flags & (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  1017. X            == FF_HDX_HANDSHAKE)
  1018. X        {
  1019. X            FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  1020. X                        MCR |= fip->flow.m.hc);
  1021. X            fip->flow_flags |= FF_HDX_STARTED;
  1022. X        }
  1023. X        fas_xproc (fip);
  1024. X        }
  1025. X        else
  1026. X        fip->flow_flags &= ~FF_SW_FC_REQ;
  1027. X    }
  1028. X    else
  1029. X    {
  1030. X        /* there is a yet unprocessed request for XOFF, so
  1031. X           we just cancel it and don't need to send an XON
  1032. X        */
  1033. X        fip->tty->t_state &= ~TTXOFF;
  1034. X        if ((fip->flow_flags & FF_OUTPUT_BUSY)
  1035. X                && !fip->xmit_ring_cnt
  1036. X                && !(fip->device_flags
  1037. X                        & (DF_XMIT_BUSY
  1038. X                            | DF_GUARD_TIMEOUT
  1039. X                            | DF_XMIT_BREAK)))
  1040. X        {
  1041. X            fip->flow_flags &= ~FF_OUTPUT_BUSY;
  1042. X            fip->tty->t_state &= ~BUSY;
  1043. X            /* check half duplex output flow control */
  1044. X            if ((fip->flow_flags & (FF_HDX_HANDSHAKE
  1045. X                            | FF_HDX_STARTED))
  1046. X                == (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  1047. X            {
  1048. X                FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  1049. X                        MCR &= ~fip->flow.m.hc);
  1050. X                fip->flow_flags &= ~FF_HDX_STARTED;
  1051. X            }
  1052. X            EVENT_SCHED (fip, EF_DO_XXFER);
  1053. X        }
  1054. X    }
  1055. X}
  1056. X
  1057. X/* Stop software input flow control.
  1058. X   (called at SPLINT)
  1059. X*/
  1060. XSTATIC void
  1061. Xfas_send_xoff (fip)
  1062. Xregister struct fas_internals    *fip REG_SI;
  1063. X{
  1064. X    fip->flow_flags |= FF_SWI_STOPPED;
  1065. X    fip->flow_flags ^= FF_SW_FC_REQ;
  1066. X    if (fip->flow_flags & FF_SW_FC_REQ)
  1067. X    {
  1068. X        if (fip->flow_flags & FF_CARRIER_ON)
  1069. X        {
  1070. X        /* stop input */
  1071. X        fip->flow_flags |= FF_OUTPUT_BUSY;
  1072. X        fip->tty->t_state |= TTXOFF | BUSY;
  1073. X        /* check half duplex output flow control */
  1074. X        if ((fip->flow_flags & (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  1075. X            == FF_HDX_HANDSHAKE)
  1076. X        {
  1077. X            FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  1078. X                        MCR |= fip->flow.m.hc);
  1079. X            fip->flow_flags |= FF_HDX_STARTED;
  1080. X        }
  1081. X        fas_xproc (fip);
  1082. X        }
  1083. X        else
  1084. X        fip->flow_flags &= ~FF_SW_FC_REQ;
  1085. X    }
  1086. X    else
  1087. X    {
  1088. X        /* there is a yet unprocessed request for XON, so
  1089. X           we just cancel it and don't need to send an XOFF
  1090. X        */
  1091. X        fip->tty->t_state &= ~TTXON;
  1092. X        if ((fip->flow_flags & FF_OUTPUT_BUSY)
  1093. X                && !fip->xmit_ring_cnt
  1094. X                && !(fip->device_flags
  1095. X                        & (DF_XMIT_BUSY
  1096. X                            | DF_GUARD_TIMEOUT
  1097. X                            | DF_XMIT_BREAK)))
  1098. X        {
  1099. X            fip->flow_flags &= ~FF_OUTPUT_BUSY;
  1100. X            fip->tty->t_state &= ~BUSY;
  1101. X            /* check half duplex output flow control */
  1102. X            if ((fip->flow_flags & (FF_HDX_HANDSHAKE
  1103. X                            | FF_HDX_STARTED))
  1104. X                == (FF_HDX_HANDSHAKE | FF_HDX_STARTED))
  1105. X            {
  1106. X                FAS_FIRST_OUTB (fip, MDM_CTL_PORT,
  1107. X                        MCR &= ~fip->flow.m.hc);
  1108. X                fip->flow_flags &= ~FF_HDX_STARTED;
  1109. X            }
  1110. X            EVENT_SCHED (fip, EF_DO_XXFER);
  1111. X        }
  1112. X    }
  1113. X}
  1114. X
  1115. X/* Compute the port access control value. */
  1116. XSTATIC uint
  1117. Xfas_make_ctl_val (fip, unit, num)
  1118. Xregister struct fas_internals    *fip REG_SI;
  1119. Xuint    unit;
  1120. Xuint    num;
  1121. X{
  1122. X    register uint    val REG_DI;
  1123. X    register uint    mask REG_BX;
  1124. X    uint    i;
  1125. X
  1126. X    if (fip->device_flags & DF_CTL_FIRST)
  1127. X        return (fas_ctl_val [unit]);
  1128. X
  1129. X    if (fip->device_flags & DF_CTL_EVERY)
  1130. X    {
  1131. X        for (i = 8, mask = fas_ctl_val [unit],
  1132. X                val = fas_ctl_val [unit] << 8; i; --i)
  1133. X        {
  1134. X            if (mask & 0x100)
  1135. X            {
  1136. X                if (num & 0x01)
  1137. X                    val ^= 0x100;
  1138. X                num >>= 1;
  1139. X            }
  1140. X            mask >>= 1;
  1141. X            val >>= 1;
  1142. X        }
  1143. X        return (val);
  1144. X    }
  1145. X    return (0);
  1146. X}
  1147. X
  1148. X/* Initialize memory with zeros. */
  1149. XSTATIC void
  1150. Xfas_mem_zero (ptr, size)
  1151. Xregister unchar    *ptr REG_SI;
  1152. Xuint    size;
  1153. X{
  1154. X    register unchar    *limptr REG_DI;
  1155. X
  1156. X    for (limptr = ptr + size; ptr < limptr; ++ptr)
  1157. X        *ptr = 0;
  1158. X}
  1159. X
  1160. X/* Test device thoroughly. */
  1161. XSTATIC uint
  1162. Xfas_test_device (fip)
  1163. Xregister struct fas_internals    *fip REG_SI;
  1164. X{
  1165. X    register unchar    *cptr REG_DI;
  1166. X    uint    baud_rate, test_rate;
  1167. X    ulong    max_rate;
  1168. X    uint    errcode;
  1169. X    register uint    delay_count REG_BX;
  1170. X    uint    rep_count, i;
  1171. X    n_unchar    lsr, msr;
  1172. X    static uint    lcrval [3] =
  1173. X    {
  1174. X        LC_WORDLEN_8,
  1175. X        LC_WORDLEN_8 | LC_ENABLE_PARITY,
  1176. X        LC_WORDLEN_8 | LC_ENABLE_PARITY | LC_EVEN_PARITY
  1177. X    };
  1178. X
  1179. X    /* find fastest baud rate for this port */
  1180. X    max_rate = 0L;
  1181. X    for (test_rate = baud_rate = B0 + 1; baud_rate <= CBAUD; ++baud_rate)
  1182. X        if (fas_baud_ptr [BT_SELECT] [baud_rate] > max_rate)
  1183. X        {
  1184. X            max_rate = fas_baud_ptr [BT_SELECT] [baud_rate];
  1185. X            test_rate = baud_rate;
  1186. X        }
  1187. X
  1188. X    /* make sure FIFO is off */
  1189. X    FAS_FIRST_OUTB (fip, NS_FIFO_CTL_PORT, NS_FIFO_CLEAR_CMD);
  1190. X    FAS_OUTB (fip, I_BANK_PORT, I_BANK_2);
  1191. X    FAS_OUTB (fip, I_IDM_PORT, I_FIFO_CLEAR_CMD);
  1192. X    FAS_OUTB (fip, I_BANK_PORT, I_BANK_0);
  1193. X
  1194. X    /* set counter divisor */
  1195. X    FAS_OUTB (fip, LINE_CTL_PORT, LC_ENABLE_DIVISOR);
  1196. X    FAS_OUTB (fip, DIVISOR_LSB_PORT, fas_speed_ptr [BT_SELECT]
  1197. X                            [test_rate].div.b.low);
  1198. X    FAS_OUTB (fip, DIVISOR_MSB_PORT, fas_speed_ptr [BT_SELECT]
  1199. X                            [test_rate].div.b.high);
  1200. X    FAS_OUTB (fip, LINE_CTL_PORT, 0);
  1201. X
  1202. X    /* switch to local loopback */
  1203. X    FAS_OUTB (fip, MDM_CTL_PORT, MC_SET_LOOPBACK);
  1204. X
  1205. X    errcode = 0;
  1206. X
  1207. X    /* wait until the transmitter register is empty */
  1208. X    FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1209. X    for (delay_count = TEST_DELAY_LOOPS;
  1210. X        delay_count && (~FAS_SAME_INB (fip, LINE_STATUS_PORT)
  1211. X                & (LS_XMIT_AVAIL | LS_XMIT_COMPLETE));
  1212. X        --delay_count)
  1213. X        ;
  1214. X
  1215. X    if (!delay_count)
  1216. X        errcode = 1;
  1217. X
  1218. X    if (!errcode)
  1219. X    {
  1220. X        /* clear flags */
  1221. X        (void) FAS_INB (fip, RCV_DATA_PORT);
  1222. X        (void) FAS_SAME_INB (fip, RCV_DATA_PORT);
  1223. X        (void) FAS_INB (fip, LINE_STATUS_PORT);
  1224. X
  1225. X        /* make sure there are no more characters in the
  1226. X           receiver register
  1227. X        */
  1228. X        FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1229. X        for (delay_count = TEST_DELAY_LOOPS;
  1230. X        delay_count && !(FAS_SAME_INB (fip, LINE_STATUS_PORT)
  1231. X                        & LS_RCV_AVAIL);
  1232. X        --delay_count)
  1233. X        ;
  1234. X
  1235. X        if (delay_count)
  1236. X        (void) FAS_INB (fip, RCV_DATA_PORT);
  1237. X
  1238. X        for (rep_count = TEST_CHAR_LOOPS; rep_count; --rep_count)
  1239. X        {
  1240. X        for (i = 0; i < 3; ++i)
  1241. X        {
  1242. X            /* test pattern */
  1243. X            cptr = (unchar *) "\377\125\252\045\244\0\0";
  1244. X
  1245. X            /* check LSR flags */
  1246. X            if (FAS_INB (fip, LINE_STATUS_PORT)
  1247. X                    != (LS_XMIT_AVAIL | LS_XMIT_COMPLETE))
  1248. X            {
  1249. X                errcode = 2;
  1250. X                break;
  1251. X            }
  1252. X
  1253. X            /* test transmitter and receiver
  1254. X               with different line settings
  1255. X            */
  1256. X            FAS_OUTB (fip, LINE_CTL_PORT, lcrval [i]);
  1257. X
  1258. X            /* send first test pattern */
  1259. X            FAS_OUTB (fip, XMT_DATA_PORT, *cptr);
  1260. X
  1261. X            /* wait until the transmitter holding register
  1262. X               is empty
  1263. X            */
  1264. X            FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1265. X            for (delay_count = TEST_DELAY_LOOPS;
  1266. X                    delay_count
  1267. X                      && !((lsr = FAS_SAME_INB (fip,
  1268. X                            LINE_STATUS_PORT))
  1269. X                            & LS_XMIT_AVAIL);
  1270. X                --delay_count)
  1271. X                ;
  1272. X
  1273. X            if (!delay_count)
  1274. X            {
  1275. X                errcode = 3;
  1276. X                break;
  1277. X            }
  1278. X
  1279. X            /* check LSR flags */
  1280. X            if (lsr != LS_XMIT_AVAIL)
  1281. X            {
  1282. X                errcode = 2;
  1283. X                break;
  1284. X            }
  1285. X
  1286. X            do
  1287. X            {
  1288. X                if (*cptr)
  1289. X                {
  1290. X                    /* send next test pattern */
  1291. X                    FAS_OUTB (fip, XMT_DATA_PORT, *(cptr + 1));
  1292. X
  1293. X                    /* check LSR flags */
  1294. X                    if (FAS_INB (fip, LINE_STATUS_PORT))
  1295. X                    {
  1296. X                        errcode = 2;
  1297. X                        break;
  1298. X                    }
  1299. X                }
  1300. X
  1301. X                /* wait until the test pattern is received */
  1302. X                FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1303. X                for (delay_count = TEST_DELAY_LOOPS;
  1304. X                    delay_count
  1305. X                      && !((lsr = FAS_SAME_INB (fip,
  1306. X                            LINE_STATUS_PORT))
  1307. X                                & LS_RCV_AVAIL);
  1308. X                    --delay_count)
  1309. X                    ;
  1310. X
  1311. X                if (!delay_count)
  1312. X                {
  1313. X                    errcode = 4;
  1314. X                    break;
  1315. X                }
  1316. X
  1317. X                /* check LSR flags */
  1318. X                if ((lsr & LS_RCV_INT) != LS_RCV_AVAIL)
  1319. X                {
  1320. X                    errcode = 5;
  1321. X                    break;
  1322. X                }
  1323. X
  1324. X                /* check test pattern */
  1325. X                if (FAS_INB (fip, RCV_DATA_PORT) != *cptr)
  1326. X                {
  1327. X                    errcode = 6;
  1328. X                    break;
  1329. X                }
  1330. X
  1331. X                /* check LSR flags */
  1332. X                if (FAS_INB (fip, LINE_STATUS_PORT)
  1333. X                            & LS_RCV_INT)
  1334. X                {
  1335. X                    errcode = 5;
  1336. X                    break;
  1337. X                }
  1338. X
  1339. X                /* wait until the transmitter register
  1340. X                   is empty
  1341. X                */
  1342. X                if (*cptr)
  1343. X                {
  1344. X                    FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1345. X                    for (delay_count = TEST_DELAY_LOOPS;
  1346. X                    delay_count
  1347. X                      && !((lsr = FAS_SAME_INB (fip,
  1348. X                            LINE_STATUS_PORT))
  1349. X                            & LS_XMIT_AVAIL);
  1350. X                    --delay_count)
  1351. X                    ;
  1352. X
  1353. X                    if (!delay_count)
  1354. X                    {
  1355. X                    errcode = 7;
  1356. X                    break;
  1357. X                    }
  1358. X
  1359. X                    /* check LSR flags */
  1360. X                    if (lsr != LS_XMIT_AVAIL)
  1361. X                    {
  1362. X                    errcode = 8;
  1363. X                    break;
  1364. X                    }
  1365. X                }
  1366. X                else
  1367. X                {
  1368. X                    FAS_EVERY_CTL (fip, LINE_STATUS_PORT);
  1369. X                    for (delay_count = TEST_DELAY_LOOPS;
  1370. X                    delay_count
  1371. X                      && !((lsr = FAS_SAME_INB (fip,
  1372. X                            LINE_STATUS_PORT))
  1373. X                            & LS_XMIT_COMPLETE);
  1374. X                    --delay_count)
  1375. X                    ;
  1376. X
  1377. X                    if (!delay_count)
  1378. X                    {
  1379. X                    errcode = 7;
  1380. X                    break;
  1381. X                    }
  1382. X
  1383. X                    /* check LSR flags */
  1384. X                    if (lsr != (LS_XMIT_AVAIL
  1385. X                            | LS_XMIT_COMPLETE))
  1386. X                    {
  1387. X                    errcode = 8;
  1388. X                    break;
  1389. X                    }
  1390. X                }
  1391. X            } while (*((ushort *) (cptr++)));
  1392. X
  1393. X            if (errcode)
  1394. X                break;
  1395. X        }
  1396. X
  1397. X        if (errcode)
  1398. X            break;
  1399. X        }
  1400. X    }
  1401. X
  1402. X    if (!errcode)
  1403. X    {
  1404. X        /* clear delta bits */
  1405. X        (void) FAS_INB (fip, MDM_STATUS_PORT);
  1406. X
  1407. X        for (rep_count = TEST_CTL_LOOPS; rep_count; --rep_count)
  1408. X        {
  1409. X        /* test pattern */
  1410. X        cptr = (unchar *) "\005\142\012\237\006\130\011\257\017\361\0\017\0\0";
  1411. X
  1412. X        for (; *((ushort *) cptr); cptr += 2)
  1413. X        {
  1414. X            /* test modem control and status lines */
  1415. X            FAS_OUTB (fip, MDM_CTL_PORT, *cptr | MC_SET_LOOPBACK);
  1416. X
  1417. X            /* wait for delta flags */
  1418. X            FAS_EVERY_CTL (fip, MDM_STATUS_PORT);
  1419. X            for (delay_count = TEST_DELAY_LOOPS;
  1420. X                delay_count
  1421. X                    && !((msr = FAS_SAME_INB (fip,
  1422. X                                MDM_STATUS_PORT))
  1423. X                            & MS_ANY_DELTA);
  1424. X                --delay_count)
  1425. X                ;
  1426. X
  1427. X            if (!delay_count)
  1428. X            {
  1429. X                errcode = 9;
  1430. X                break;
  1431. X            }
  1432. X
  1433. X            /* check MSR flags */
  1434. X            if (msr != *(cptr + 1))
  1435. X            {
  1436. X                errcode = 9;
  1437. X                break;
  1438. X            }
  1439. X
  1440. X            /* check whether delta flags are cleared */
  1441. X            if (FAS_SAME_INB (fip, MDM_STATUS_PORT)
  1442. X                    != (msr & ~MS_ANY_DELTA))
  1443. X            {
  1444. X                errcode = 9;
  1445. X                break;
  1446. X            }
  1447. X        }
  1448. X
  1449. X        if (errcode)
  1450. X            break;
  1451. X        }
  1452. X    }
  1453. X
  1454. X    /* switch back to normal operation */
  1455. X    FAS_OUTB (fip, MDM_CTL_PORT, 0);
  1456. X
  1457. X    return (errcode);
  1458. X}
  1459. X
  1460. X#if defined (NEED_PUT_GETCHAR)
  1461. Xint
  1462. XFASPUTCHAR (arg)
  1463. Xunchar    arg;
  1464. X{
  1465. X    register struct    fas_internals    *fip REG_SI;
  1466. X
  1467. X    if (!fas_is_initted)
  1468. X        fasinit ();
  1469. X
  1470. X    fip = &fas_internals [0];
  1471. X    if (fip->device_flags & DF_DEVICE_CONFIGURED)
  1472. X    {
  1473. X        if (arg == '\n')
  1474. X            (void) FASPUTCHAR ('\r');
  1475. X        FAS_CTL (fip, LINE_STATUS_PORT);
  1476. X        while (!(FAS_SAME_INB (fip, LINE_STATUS_PORT) & LS_XMIT_AVAIL))
  1477. X            ;
  1478. X        FAS_OUTB (fip, XMT_DATA_PORT, arg);
  1479. X    }
  1480. X    return (0);
  1481. X}
  1482. X
  1483. Xint
  1484. XFASGETCHAR ()
  1485. X{
  1486. X    register struct    fas_internals    *fip REG_SI;
  1487. X
  1488. X    if (!fas_is_initted)
  1489. X        fasinit ();
  1490. X
  1491. X    fip = &fas_internals [0];
  1492. X    if ((fip->device_flags & DF_DEVICE_CONFIGURED)
  1493. X        && (FAS_FIRST_INB (fip, LINE_STATUS_PORT) & LS_RCV_AVAIL))
  1494. X        return (FAS_INB (fip, RCV_DATA_PORT));
  1495. X    else
  1496. X        return (-1);
  1497. X}
  1498. X#endif
  1499. X
  1500. X#if defined (NEED_INIT8250)
  1501. X/* Reset the requested port to be used directly by a DOS process.
  1502. X   (DosMerge only)
  1503. X*/
  1504. Xint
  1505. Xinit8250 (port, ier)
  1506. Xregister ushort    port REG_BX;
  1507. Xushort    ier;    /* ier not used in this stub */
  1508. X{
  1509. X    register struct fas_internals    *fip REG_SI;
  1510. X    register uint    unit REG_DI;
  1511. X    int    old_level;
  1512. X
  1513. X    /* See if the port address matches a port that is used by
  1514. X       the FAS driver.
  1515. X    */
  1516. X    for (unit = 0; unit < fas_physical_units; ++unit)
  1517. X        if (port == fas_port [unit])
  1518. X            break;
  1519. X
  1520. X    if (unit >= fas_physical_units)
  1521. X        return (-1);    /* port didn't match */
  1522. X
  1523. X    fip = fas_internals_ptr [unit];
  1524. X
  1525. X    old_level = SPLINT ();
  1526. X
  1527. X    FAS_FIRST_OUTB (fip, INT_ENABLE_PORT, IER = IE_NONE);
  1528. X    fip->device_flags &= ~(DF_RDI_ENABLED | DF_MSI_ENABLED | DF_MSI_NOISE);
  1529. X
  1530. X    FAS_OUTB (fip, MDM_CTL_PORT, MCR &= ~(fip->flow.m.ic | fip->flow.m.hc));
  1531. X
  1532. X    if (DEVICE_TYPE == TYPE_NS16550A)
  1533. X        FAS_OUTB (fip, NS_FIFO_CTL_PORT, NS_FIFO_CLEAR_CMD);
  1534. X    else if (DEVICE_TYPE == TYPE_I82510)
  1535. X    {
  1536. X        FAS_OUTB (fip, I_BANK_PORT, I_BANK_1);
  1537. X        FAS_OUTB (fip, I_TCM_PORT, I_FIFO_CLR_XMIT);
  1538. X        FAS_OUTB (fip, I_RCM_PORT, I_FIFO_CLR_RECV);
  1539. X        FAS_OUTB (fip, I_BANK_PORT, I_BANK_2);
  1540. X        FAS_OUTB (fip, I_IDM_PORT, I_FIFO_CLEAR_CMD);
  1541. X        FAS_OUTB (fip, I_BANK_PORT, I_BANK_0);
  1542. X    }
  1543. X
  1544. X    (void) FAS_INB (fip, MDM_STATUS_PORT);
  1545. X    (void) FAS_INB (fip, RCV_DATA_PORT);
  1546. X    if (FAS_INB (fip, LINE_STATUS_PORT) & LS_RCV_AVAIL)
  1547. X        (void) FAS_INB (fip, RCV_DATA_PORT);
  1548. X    (void) FAS_INB (fip, INT_ID_PORT);
  1549. X    (void) splx (old_level);
  1550. X    return (0);
  1551. X}
  1552. X#endif
  1553. SHAR_EOF
  1554. echo 'File fas.c is complete' &&
  1555. true || echo 'restore of fas.c failed'
  1556. rm -f _shar_wnt_.tmp
  1557. fi
  1558. # ============= fas.h ==============
  1559. if test -f 'fas.h' -a X"$1" != X"-c"; then
  1560.     echo 'x - skipping fas.h (File already exists)'
  1561.     rm -f _shar_wnt_.tmp
  1562. else
  1563. > _shar_wnt_.tmp
  1564. echo 'x - extracting fas.h (Text)'
  1565. sed 's/^X//' << 'SHAR_EOF' > 'fas.h' &&
  1566. X/* This file contains various defines for the FAS async driver.
  1567. X   If you change anything here you have to recompile the driver module.
  1568. X*/
  1569. X
  1570. X#if !defined (M_I286)
  1571. X#ident    "@(#)fas.h    2.11"
  1572. X#endif
  1573. X
  1574. X/* Uncomment the following line if you need (asy|sio)putchar and
  1575. X   (asy|sio)getchar. This is only required if you link the kernel
  1576. X   without the original asy or sio driver and these functions aren't
  1577. X   provided by any other kernel module.
  1578. X*/
  1579. X/* #define NEED_PUT_GETCHAR    /* */
  1580. X
  1581. X/* Uncomment the following line if you have VP/ix support in the
  1582. X   kernel.
  1583. X*/
  1584. X#define HAVE_VPIX    /* */
  1585. X
  1586. X/* Uncomment the following line if there is a tunable `ttyhog' variable
  1587. X   in the kernel.
  1588. X*/
  1589. X#define TUNABLE_TTYHOG    /* */
  1590. X
  1591. X/* Uncomment the following line if you want FAS to make sure that the
  1592. X   thresholds in tthiwat [] and ttlowat [] are high enough to prevent
  1593. X   the CLIST buffer functions to become a bottleneck at high baud rates.
  1594. X   tthiwat [] and ttlowat [] are global resources and are used by other
  1595. X   tty drivers as well, so in case that fixing these values causes
  1596. X   problems with these drivers this feature is configurable.
  1597. X*/
  1598. X#define FIX_TTHILOWAT    /* */
  1599. X
  1600. X/* Uncomment the following line if you need init8250. DosMerge needs
  1601. X   this function, but only if you link the kernel without the original
  1602. X   asy or sio driver.
  1603. X*/
  1604. X/* #define NEED_INIT8250    /* */
  1605. X
  1606. X/* Initial line control register. This value will only be meaningful if
  1607. X   NEED_PUT_GETCHAR is defined.
  1608. X*/
  1609. X#define    INITIAL_LINE_CONTROL    LC_WORDLEN_8
  1610. X
  1611. X/* Initial baud rate. This value will only be meaningful if
  1612. X   NEED_PUT_GETCHAR is defined.
  1613. X*/
  1614. X#define INITIAL_BAUD_RATE    B9600
  1615. X
  1616. X/* Initial modem control register. This should probably not have to
  1617. X   be touched. It is here because some terminals used as the console
  1618. X   require one or more of the modem signals set. It is only meaningful
  1619. X   if NEED_PUT_GETCHAR is defined.
  1620. X*/
  1621. X#define INITIAL_MDM_CONTROL    0
  1622. X
  1623. X/****************************************************/
  1624. X/* Nothing past this line should have to be changed */
  1625. X/****************************************************/
  1626. X
  1627. X/* The following section is, if necessary, automatically updated with
  1628. X   OS dependent informations. Don't change it by hand!
  1629. X*/
  1630. X/* @@OS_DEP_BEGIN@@ */
  1631. X/* @@OS_DEP_END@@ */
  1632. X
  1633. X#if defined (VPIX)
  1634. X#undef VPIX
  1635. X#endif
  1636. X
  1637. X#if defined (HAVE_VPIX)
  1638. X#define VPIX
  1639. X#endif
  1640. X
  1641. X#if defined (SCO) && !defined (_NO_PROTOTYPE)
  1642. X#define _NO_PROTOTYPE 1
  1643. X#endif
  1644. X
  1645. X#include <sys/param.h>
  1646. X#include <sys/types.h>
  1647. X#include <sys/signal.h>
  1648. X#include <sys/buf.h>
  1649. X#include <sys/dir.h>
  1650. X#if defined (XENIX)
  1651. X#include <sys/page.h>
  1652. X#include <sys/seg.h>
  1653. X#endif
  1654. X#include <sys/user.h>
  1655. X#include <sys/errno.h>
  1656. X#include <sys/tty.h>
  1657. X#include <sys/conf.h>
  1658. X#include <sys/sysinfo.h>
  1659. X#include <sys/file.h>
  1660. X#if !defined (XENIX)
  1661. X#include <sys/termio.h>
  1662. X#endif
  1663. X#if defined (SCO) || defined (XENIX)
  1664. X#include <sys/select.h>
  1665. X#endif
  1666. X#include <sys/ioctl.h>
  1667. X#if defined (HAVE_VPIX)
  1668. X#if !defined (XENIX)
  1669. X#include <sys/tss.h>
  1670. X#include <sys/immu.h>
  1671. X#include <sys/region.h>
  1672. X#endif
  1673. X#include <sys/proc.h>
  1674. X#include <sys/v86.h>
  1675. X#endif
  1676. X
  1677. X#if defined (XENIX)
  1678. Xtypedef unsigned char    unchar;
  1679. Xtypedef unsigned long    ulong;
  1680. X/*
  1681. X**    Union for use by all device handler ioctl routines.
  1682. X*/
  1683. Xunion ioctl_arg {
  1684. X    struct termio    *stparg;    /* ptr to termio struct */
  1685. X    char        *cparg;        /* ptr to character */
  1686. X    char        carg;        /* character */
  1687. X    int        *iparg;        /* ptr to integer */
  1688. X    int        iarg;        /* integer */
  1689. X    long            *lparg;         /* ptr to long */
  1690. X    long            larg;           /* long */
  1691. X};
  1692. X#endif
  1693. X
  1694. X#if defined (__GNUC__)
  1695. X/* in expressions GNU C is able to use operand sizes < native integer size */
  1696. Xtypedef unchar    n_unchar;
  1697. X#else
  1698. X/* in expressions AT&T C extends smaller types to the native integer size */
  1699. Xtypedef uint    n_unchar;
  1700. X#endif
  1701. X
  1702. X/* allow function prototypes in ANSI C */
  1703. X#if defined (__STDC__)
  1704. X#define P(x) x
  1705. X#else
  1706. X#define P(x) ()
  1707. X#endif
  1708. X
  1709. X#if defined (TRUE)
  1710. X#undef TRUE
  1711. X#endif
  1712. X#define    TRUE    (1)
  1713. X
  1714. X#if defined (FALSE)
  1715. X#undef FALSE
  1716. X#endif
  1717. X#define FALSE    (0)
  1718. X
  1719. Xtypedef int    bool;
  1720. X
  1721. X#define MAX_UNITS        16    /* max. number of physical units */
  1722. X#define MAX_BAUD_TABLES        256    /* max. number of baud rate tables */
  1723. X#define NUM_UART_REGS        7    /* number of UART registers */
  1724. X
  1725. X/* Miscellaneous Constants */
  1726. X
  1727. X#define HANGUP_DELAY        500    /* in milli-seconds */
  1728. X#define HANGUP_TIME        1000    /* in milli-seconds */
  1729. X#define BREAK_TIME        250    /* in milli-seconds */
  1730. X#define MAX_EVENT_TIME        10    /* in milli-seconds */
  1731. X#define MAX_RXFER_DELAY        20    /* in milli-seconds */
  1732. X#if defined (M_I286)
  1733. X#define    RECV_BUFF_SIZE        1000    /* receiver ring buffer size (MAX) */
  1734. X#define SW_LOW_WATER        500    /* 50% MAX    sw flow control */
  1735. X#define SW_HIGH_WATER        800    /* 80% MAX     trigger levels */
  1736. X#define HW_LOW_WATER        700    /* MAX - 300    hw flow control */
  1737. X#define HW_HIGH_WATER        900    /* MAX - 100     trigger levels */
  1738. X#define XMIT_BUFF_SIZE        500    /* transmitter ring buffer size */
  1739. X#else
  1740. X#define    RECV_BUFF_SIZE        10000    /* receiver ring buffer size (MAX) */
  1741. X#define SW_LOW_WATER        5000    /* 50% MAX    sw flow control */
  1742. X#define SW_HIGH_WATER        8000    /* 80% MAX     trigger levels */
  1743. X#define HW_LOW_WATER        8500    /* MAX - 1500    hw flow control */
  1744. X#define HW_HIGH_WATER        9500    /* MAX - 500     trigger levels */
  1745. X#define XMIT_BUFF_SIZE        10000    /* transmitter ring buffer size */
  1746. X#endif
  1747. X#define SOFT_INIT        0    /* init registers if cflag changed */
  1748. X#define HARD_INIT        1    /* init registers w/o checking cflag */
  1749. X#define TEST_CHAR_LOOPS        100    /* no. of character test loops */
  1750. X#define TEST_CTL_LOOPS        1000    /* no. of control line test loops */
  1751. X#define TEST_DELAY_LOOPS    60000    /* no. of delay loops */
  1752. X#if defined (SCO) || defined (XENIX)
  1753. X#define SPLWRK            spl5    /* SPL for character processing */
  1754. X#define SPLINT            spl7    /* SPL to disable FAS interrupts */
  1755. X#else
  1756. X#define SPLWRK            spl6    /* SPL for character processing */
  1757. X#define SPLINT            spltty    /* SPL to disable FAS interrupts */
  1758. X#endif
  1759. X
  1760. X/* calculate EVENT_TIME from MAX_EVENT_TIME with regard to the
  1761. X   clock tick granularity
  1762. X*/
  1763. X#define EVENT_TIME    ((((MAX_EVENT_TIME) * (HZ) / 1000)\
  1764. X                * 1000 + (HZ) - 1) / (HZ))
  1765. X#if EVENT_TIME == 0
  1766. X#undef EVENT_TIME
  1767. X#define EVENT_TIME    ((1000 + (HZ) - 1) / (HZ))
  1768. X#endif
  1769. X
  1770. X#if MAX_RXFER_DELAY < EVENT_TIME
  1771. X#undef MAX_RXFER_DELAY
  1772. X#define MAX_RXFER_DELAY    EVENT_TIME
  1773. X#endif
  1774. X
  1775. X#define MAX_INPUT_FIFO_SIZE    INPUT_NS_FIFO_SIZE
  1776. X#define MAX_OUTPUT_FIFO_SIZE    OUTPUT_NS_FIFO_SIZE
  1777. X
  1778. X
  1779. X/* Here are the modem control flags for the fas_modem array in space.c.
  1780. X   They are arranged in three 8-bit masks which are combined to a 32-bit
  1781. X   word. Each of these 32-bit words represents one entry in the fas_modem
  1782. X   array.
  1783. X
  1784. X   The lowest byte is used as a mask to manipulate the modem control
  1785. X   register for modem disable. Use the MC_* macros to build the mask.
  1786. X
  1787. X   The second lowest byte is used as a mask to manipulate the modem control
  1788. X   register for modem enable during dialout. Use the MC_* macros to build
  1789. X   the mask and shift them 8 bits to the left.
  1790. X
  1791. X   The second highest byte is used as a mask to manipulate the modem control
  1792. X   register for modem enable during dialin. Use the MC_* macros to build
  1793. X   the mask and shift them 16 bits to the left.
  1794. X
  1795. X   The highest byte is used to mask signals from the modem status
  1796. X   register that will be used as the carrier detect signal. Use the MS_*
  1797. X   macros to build the mask and shift them 24 bits to the left. If you use
  1798. X   more than one signal, carrier is considered on only when all signals
  1799. X   are on.
  1800. X
  1801. X   Here are some useful macros for the space.c file. You may create your
  1802. X   own macros if you have some special requirements not met by the
  1803. X   predefined ones.
  1804. X*/
  1805. X
  1806. X/* modem disable (choose one) */
  1807. X#define DI_RTS            ((ulong) MC_SET_RTS)
  1808. X#define DI_DTR            ((ulong) MC_SET_DTR)
  1809. X#define DI_RTS_AND_DTR        ((ulong) (MC_SET_RTS | MC_SET_DTR))
  1810. X
  1811. X/* modem enable for dialout (choose one) */
  1812. X#define EO_RTS            ((ulong) MC_SET_RTS << 8)
  1813. X#define EO_DTR            ((ulong) MC_SET_DTR << 8)
  1814. X#define EO_RTS_AND_DTR        ((ulong) (MC_SET_RTS | MC_SET_DTR) << 8)
  1815. X
  1816. X/* modem enable for dialin (choose one) */
  1817. X#define EI_RTS            ((ulong) MC_SET_RTS << 16)
  1818. X#define EI_DTR            ((ulong) MC_SET_DTR << 16)
  1819. X#define EI_RTS_AND_DTR        ((ulong) (MC_SET_RTS | MC_SET_DTR) << 16)
  1820. X
  1821. X/* carrier detect signal (choose one) */
  1822. X#define CA_DCD            ((ulong) MS_DCD_PRESENT << 24)
  1823. X#define CA_CTS            ((ulong) MS_CTS_PRESENT << 24)
  1824. X#define CA_DSR            ((ulong) MS_DSR_PRESENT << 24)
  1825. X
  1826. X
  1827. X/* Here are the hardware handshake flags for the fas_flow array in space.c.
  1828. X   They are arranged in three 8-bit masks which are combined to a 32-bit
  1829. X   word. Each of these 32-bit words represents one entry in the fas_flow
  1830. X   array.
  1831. X
  1832. X   The lowest byte is used as a mask to manipulate the modem control
  1833. X   register for input flow control. Use the MC_* macros to build the mask.
  1834. X
  1835. X   The second lowest byte is used to mask signals from the modem status
  1836. X   register that will be used for output flow control. Use the MS_* macros
  1837. X   to build the mask and shift them 8 bits to the left. If you use more
  1838. X   than one signal, output is allowed only when all signals are on.
  1839. X
  1840. X   The second highest byte is used to mask signals from the modem status
  1841. X   register that will be used to enable the output flow control selected
  1842. X   by the second lowest byte. Use the MS_* macros to build the mask and
  1843. X   shift them 16 bits to the left. If you use more than one signal, output
  1844. X   flow control is enabled only when all signals are on.
  1845. X
  1846. X   The highest byte is used as a mask to manipulate the modem control
  1847. X   register for output half duplex flow control. Use the MC_* macros to
  1848. X   build the mask and shift them 24 bits to the left.
  1849. X
  1850. X   Here are some useful macros for the space.c file. You may create your
  1851. X   own macros if you have some special requirements not met by the
  1852. X   predefined ones.
  1853. X*/
  1854. X
  1855. X/* input flow control (choose one) */
  1856. X#define HI_RTS            ((ulong) MC_SET_RTS)
  1857. X#define HI_DTR            ((ulong) MC_SET_DTR)
  1858. X#define HI_RTS_AND_DTR        ((ulong) (MC_SET_RTS | MC_SET_DTR))
  1859. X
  1860. X/* output flow control (choose one) */
  1861. X#define HO_CTS            ((ulong) MS_CTS_PRESENT << 8)
  1862. X#define HO_DSR            ((ulong) MS_DSR_PRESENT << 8)
  1863. X#define HO_CTS_AND_DSR        ((ulong) (MS_CTS_PRESENT | MS_DSR_PRESENT) \
  1864. X                    << 8)
  1865. X#define HO_CTS_ON_DSR        (((ulong) MS_CTS_PRESENT << 8) \
  1866. X                | ((ulong) MS_DSR_PRESENT << 16))
  1867. X#define HO_CTS_ON_DSR_AND_DCD    (((ulong) MS_CTS_PRESENT << 8) \
  1868. X                | ((ulong) (MS_DSR_PRESENT | MS_DCD_PRESENT) \
  1869. X                    << 16)) 
  1870. X
  1871. X/* output hdx flow control (choose one) */
  1872. X#define HX_RTS            ((ulong) MC_SET_RTS << 24)
  1873. X#define HX_DTR            ((ulong) MC_SET_DTR << 24)
  1874. X#define HX_RTS_AND_DTR        ((ulong) (MC_SET_RTS | MC_SET_DTR) << 24)
  1875. X
  1876. X
  1877. X/* define the local open flags */
  1878. X
  1879. X#define OS_DEVICE_CLOSED    0x0000
  1880. X#define OS_OPEN_FOR_DIALOUT    0x0001
  1881. X#define OS_OPEN_FOR_DIALIN    0x0002
  1882. X#define OS_WAIT_OPEN        0x0004
  1883. X#define OS_NO_DIALOUT        0x0008
  1884. X#define OS_FAKE_CARRIER_ON    0x0010
  1885. X#define OS_CLOCAL        0x0020
  1886. X#define OS_HWO_HANDSHAKE    0x0040
  1887. X#define OS_HWI_HANDSHAKE    0x0080
  1888. X#define OS_HDX_HANDSHAKE    0x0100
  1889. X#define OS_EXCLUSIVE_OPEN_1    0x0200
  1890. X#define OS_EXCLUSIVE_OPEN_2    0x0400    /* SYSV 3.2 Xenix compatibility */
  1891. X
  1892. X#define OS_OPEN_STATES        (OS_OPEN_FOR_DIALOUT | OS_OPEN_FOR_DIALIN)
  1893. X#define OS_TEST_MASK        (OS_OPEN_FOR_DIALOUT | OS_NO_DIALOUT \
  1894. X                | OS_FAKE_CARRIER_ON | OS_CLOCAL \
  1895. X                | OS_HWO_HANDSHAKE | OS_HWI_HANDSHAKE \
  1896. X                | OS_HDX_HANDSHAKE | OS_EXCLUSIVE_OPEN_1 \
  1897. X                | OS_EXCLUSIVE_OPEN_2)
  1898. X#define OS_SU_TEST_MASK        (OS_OPEN_FOR_DIALOUT | OS_NO_DIALOUT \
  1899. X                | OS_FAKE_CARRIER_ON | OS_CLOCAL \
  1900. X                | OS_HWO_HANDSHAKE | OS_HWI_HANDSHAKE \
  1901. X                | OS_HDX_HANDSHAKE | OS_EXCLUSIVE_OPEN_1)
  1902. X
  1903. X/* define the device status flags */
  1904. X
  1905. X#define DF_CTL_FIRST        0x0001    /* write ctl port at first access */
  1906. X#define DF_CTL_EVERY        0x0002    /* write ctl port at every access */
  1907. X#define DF_XMIT_BUSY        0x0004    /* transmitter busy */
  1908. X#define DF_XMIT_BREAK        0x0008    /* transmitter sends break */
  1909. X#define DF_XMIT_LOCKED        0x0010    /* transmitter locked against output */
  1910. X#define DF_GUARD_TIMEOUT    0x0020    /* protect last char from corruption */
  1911. X#define DF_MSI_NOISE        0x0040    /* modem status interrupts noise */
  1912. X#define DF_MSI_ENABLED        0x0080    /* modem status interrupts enabled */
  1913. X#define DF_RDI_ENABLED        0x0100    /* receiver data interrupts enabled */
  1914. X#define DF_HUP_PROTECT        0x0200    /* protect device after hangup */
  1915. X#define DF_NO_OVERRUN        0x0400    /* device is overrun protected */
  1916. X#define DF_DEVICE_CONFIGURED    0x0800    /* device is configured */
  1917. X#define DF_DEVICE_OPEN        0x1000    /* physical device is open */
  1918. X#define DF_DEVICE_LOCKED    0x2000    /* physical device locked */
  1919. X#define DF_DO_HANGUP        0x4000    /* delayed hangup request */
  1920. X#define DF_DO_BREAK        0x8000    /* delayed break request */
  1921. X
  1922. X/* define the flow control status flags */
  1923. X
  1924. X#define FF_HWO_HANDSHAKE    0x0001    /* output hw handshake enabled */
  1925. X#define FF_HWI_HANDSHAKE    0x0002    /* input hw handshake enabled */
  1926. X#define FF_HDX_HANDSHAKE    0x0004    /* output hdx hw handshake enabled */
  1927. X#define    FF_HWO_STOPPED        0x0008    /* output stopped by hw handshake */
  1928. X#define FF_HWI_STARTED        0x0010    /* input started by hw handshake */
  1929. X#define FF_HDX_STARTED        0x0020    /* output buffer contains characters */
  1930. X#define FF_CARR_STOPPED        0x0040    /* output stopped by carrier detect */
  1931. X#define FF_SWO_STOPPED        0x0080    /* output stopped by sw flow control */
  1932. X#define FF_SWI_STOPPED        0x0100    /* input stopped by sw flow control */
  1933. X#define FF_SW_FC_REQ        0x0200    /* sw input flow control request */
  1934. X#define FF_RXFER_STOPPED    0x0400    /* rxfer function stopped */
  1935. X#define FF_NEW_CTSRTS        0x0800    /* CTS/RTSFLOW do fdx hw handshake */
  1936. X#define FF_DEF_HHO_LOW        0x1000    /* hw handshake outp. is low by deflt */
  1937. X#define FF_OUTPUT_BUSY        0x2000    /* output buffers/circuits are busy */
  1938. X#define FF_CD_ENABLED        0x4000    /* carrier detect enabled */
  1939. X#define FF_CARRIER_ON        0x8000    /* carrier detect */
  1940. X
  1941. X/* define the scheduled events flags */
  1942. X
  1943. X#define EF_DO_RXFER        0x0001    /* rxfer function request */
  1944. X#define EF_DO_XXFER        0x0002    /* xxfer function request */
  1945. X#define EF_DO_BRKINT        0x0004    /* break int request */
  1946. X#define EF_DO_MPROC        0x0008    /* mproc function request */
  1947. X#define EF_RESET_DELTA_BITS    0x0010    /* reset accumulated msr delta bits */
  1948. X#define EF_WAKEUP_VPIX        0x0020    /* wakeup VP/ix until rawq is empty */
  1949. X
  1950. X/* define the device types
  1951. X   The symbolic constant for the device type that allows the lowest interrupt
  1952. X   latency (usually a 16450) has the lowest numerical value. Devices that
  1953. X   allow a higher interrupt latency have a higher numerical value. With this
  1954. X   ordering the device type can be used as a priority indicator during the
  1955. X   interrupt processing, that is, devices that can't hold the received
  1956. X   characters for very long are serviced first while devices with FIFOs
  1957. X   are serviced only after all devices with higher priority are done.
  1958. X   Usually, the following rule applies: The longer the FIFOs, the higher
  1959. X   the assigned device type value should be, and the lower the interrupt
  1960. X   priority will be.
  1961. X*/
  1962. X
  1963. X#define NUMBER_OF_TYPES        3    /* adjust this to the highest */
  1964. X                    /* device type + 1 */
  1965. X#define TYPE_NS16450        0
  1966. X#define TYPE_I82510        1
  1967. X#define TYPE_NS16550A        2
  1968. X
  1969. X/* modifier flags that can be set in fas_modify [] (`space.c') */
  1970. X
  1971. X#define NO_TEST        0x0001        /* don't test the UART */
  1972. X#define NO_HUP_PROTECT    0x0002        /* don't protect device after hangup */
  1973. X#define NO_OVERRUN    0x0004        /* device is overrun protected */
  1974. X#define NEW_CTSRTS    0x0008        /* CTS/RTSFLOW do fdx hw handshake */
  1975. X
  1976. X/* read from port rather than write to it (for fas_init_seq [] and
  1977. X   fas_int_ack_seq [] in `space.c')
  1978. X*/
  1979. X
  1980. X#define READ_PORT    0x0100
  1981. X
  1982. X/* define the FIFO operating modes for the fas_fifo_ctl array in space.c
  1983. X   (FIFO_POINTER_DEV and FIFO_TRIGGER_* apply to NS16550A UART, only)
  1984. X*/
  1985. X
  1986. X#define FIFO_DEFAULT        0    /* default mode (OS dependent) */
  1987. X#define FIFO_OFF        1    /* 16450 compatible mode */
  1988. X#define FIFO_EMUL_NS16450    2    /* emulate 16450 in FIFO mode */
  1989. X#define FIFO_POINTER_DEV    3    /* pointer device (mouse etc.) */
  1990. X#define FIFO_TRIGGER_1        4    /* set trigger level to 1 char */
  1991. X#define FIFO_TRIGGER_4        5    /* set trigger level to 4 chars */
  1992. X#define FIFO_TRIGGER_8        6    /* set trigger level to 8 chars */
  1993. X#define FIFO_TRIGGER_14        7    /* set trigger level to 14 chars */
  1994. X
  1995. X/* define an easy way to reference the port structures */
  1996. X
  1997. X#define RCV_DATA_PORT        (fip->port [0])
  1998. X#define XMT_DATA_PORT        (fip->port [0])
  1999. X#define INT_ENABLE_PORT        (fip->port [1])
  2000. X#define INT_ID_PORT        (fip->port [2])
  2001. X#define NS_FIFO_CTL_PORT    (fip->port [2])
  2002. X#define I_BANK_PORT        (fip->port [2])
  2003. X#define LINE_CTL_PORT        (fip->port [3])
  2004. X#define MDM_CTL_PORT        (fip->port [4])
  2005. X#define I_IDM_PORT        (fip->port [4])
  2006. X#define LINE_STATUS_PORT    (fip->port [5])
  2007. X#define I_RCM_PORT        (fip->port [5])
  2008. X#define MDM_STATUS_PORT        (fip->port [6])
  2009. X#define I_TCM_PORT        (fip->port [6])
  2010. X#define DIVISOR_LSB_PORT    (fip->port [0])
  2011. X#define DIVISOR_MSB_PORT    (fip->port [1])
  2012. X#define CTL_PORT        (fip->ctl_port)
  2013. X
  2014. X/* UART related variables */
  2015. X
  2016. X#define BT_SELECT        (fip->port [0].p.val)
  2017. X#define IER            (fip->port [1].p.val)
  2018. X#define FCR            (fip->port [2].p.val)
  2019. X#define LCR            (fip->port [3].p.val)
  2020. X#define MCR            (fip->port [4].p.val)
  2021. X#define NEW_MSR            (fip->port [5].p.val)
  2022. X#define MSR            (fip->port [6].p.val)
  2023. X#define DEVICE_TYPE        (fip->ctl_port.p.val1)
  2024. X#define INT_PRIO        (fip->ctl_port.p.val2)
  2025. X
  2026. X/* modem control port */
  2027. X
  2028. X#define MC_SET_DTR        0x01
  2029. X#define MC_SET_RTS        0x02
  2030. X#define MC_SET_OUT1        0x04
  2031. X#define MC_SET_OUT2        0x08
  2032. X#define MC_SET_LOOPBACK        0x10
  2033. X
  2034. X#define MC_ANY_CONTROL    (MC_SET_DTR | MC_SET_RTS | MC_SET_OUT1 | MC_SET_OUT2)
  2035. X
  2036. X/* modem status port */
  2037. X
  2038. X#define MS_CTS_DELTA        0x01
  2039. X#define MS_DSR_DELTA        0x02
  2040. X#define MS_RING_TEDGE        0x04
  2041. X#define MS_DCD_DELTA        0x08
  2042. X#define MS_CTS_PRESENT        0x10
  2043. X#define MS_DSR_PRESENT        0x20
  2044. X#define MS_RING_PRESENT        0x40
  2045. X#define MS_DCD_PRESENT        0x80
  2046. X
  2047. X#define MS_ANY_DELTA    (MS_CTS_DELTA | MS_DSR_DELTA | MS_RING_TEDGE \
  2048. X                | MS_DCD_DELTA)
  2049. X#define MS_ANY_PRESENT    (MS_CTS_PRESENT | MS_DSR_PRESENT | MS_RING_PRESENT \
  2050. X                | MS_DCD_PRESENT)
  2051. X
  2052. X/* interrupt enable port */
  2053. X
  2054. X#define IE_NONE                0x00
  2055. X#define    IE_RECV_DATA_AVAILABLE        0x01
  2056. X#define    IE_XMIT_HOLDING_BUFFER_EMPTY    0x02
  2057. X#define IE_LINE_STATUS            0x04
  2058. X#define IE_MODEM_STATUS            0x08
  2059. X
  2060. X/* interrupt id port */
  2061. X
  2062. X#define II_NO_INTS_PENDING    0x01
  2063. X#define II_CODE_MASK        0x07
  2064. X#define II_MODEM_STATE        0x00
  2065. X#define II_XMTD_CHAR        0x02
  2066. X#define II_RCVD_CHAR        0x04
  2067. X#define II_RCV_ERROR        0x06
  2068. X#define II_NS_FIFO_TIMEOUT    0x08
  2069. X#define II_NS_FIFO_ENABLED    0xC0
  2070. X
  2071. X/* line control port */
  2072. X
  2073. X#define    LC_WORDLEN_MASK        0x03
  2074. X#define    LC_WORDLEN_5        0x00
  2075. X#define    LC_WORDLEN_6        0x01
  2076. X#define    LC_WORDLEN_7        0x02
  2077. X#define    LC_WORDLEN_8        0x03
  2078. X#define LC_STOPBITS_LONG    0x04
  2079. X#define LC_ENABLE_PARITY    0x08
  2080. X#define LC_EVEN_PARITY        0x10
  2081. X#define LC_STICK_PARITY        0x20
  2082. X#define LC_SET_BREAK_LEVEL    0x40
  2083. X#define LC_ENABLE_DIVISOR    0x80
  2084. X
  2085. X/* line status port */
  2086. X
  2087. X#define LS_RCV_AVAIL        0x01
  2088. X#define LS_OVERRUN        0x02
  2089. X#define LS_PARITY_ERROR        0x04
  2090. X#define LS_FRAMING_ERROR    0x08
  2091. X#define LS_BREAK_DETECTED    0x10
  2092. X#define LS_XMIT_AVAIL        0x20
  2093. X#define LS_XMIT_COMPLETE    0x40
  2094. X#define LS_ERROR_IN_NS_FIFO    0x80    /* NS16550A only */
  2095. X#define LS_RCV_INT    (LS_RCV_AVAIL | LS_OVERRUN | LS_PARITY_ERROR \
  2096. X            | LS_FRAMING_ERROR | LS_BREAK_DETECTED)
  2097. X
  2098. X/* fifo control port (NS16550A only) */
  2099. X
  2100. X#define    NS_FIFO_ENABLE        0x01
  2101. X#define    NS_FIFO_CLR_RECV    0x02
  2102. X#define    NS_FIFO_CLR_XMIT    0x04
  2103. X#define    NS_FIFO_START_DMA    0x08
  2104. X#define NS_FIFO_SIZE_1        0x00
  2105. X#define NS_FIFO_SIZE_4        0x40
  2106. X#define NS_FIFO_SIZE_8        0x80
  2107. X#define NS_FIFO_SIZE_14        0xC0
  2108. X#define NS_FIFO_SIZE_MASK    0xC0
  2109. X
  2110. X#define NS_FIFO_CLEAR_CMD    0
  2111. X#define NS_FIFO_INIT_CMD    (NS_FIFO_SIZE_1 | NS_FIFO_ENABLE \
  2112. X                | NS_FIFO_CLR_RECV | NS_FIFO_CLR_XMIT)
  2113. X
  2114. X#define INPUT_NS_FIFO_SIZE    16
  2115. X#define OUTPUT_NS_FIFO_SIZE    16
  2116. X
  2117. X/* fifo control ports (i82510 only) */
  2118. X
  2119. X#define I_BANK_0        0x00
  2120. X#define I_BANK_1        0x20
  2121. X#define I_BANK_2        0x40
  2122. X#define I_BANK_3        0x60
  2123. X#define I_FIFO_ENABLE        0x08
  2124. X#define I_FIFO_CLR_RECV        0x30
  2125. X#define I_FIFO_CLR_XMIT        0x0c
  2126. X
  2127. X#define I_FIFO_CLEAR_CMD    0
  2128. X#define I_FIFO_SETUP_CMD    I_FIFO_ENABLE
  2129. X
  2130. X#define INPUT_I_FIFO_SIZE    4
  2131. X#define OUTPUT_I_FIFO_SIZE    4
  2132. X
  2133. X/* defines for ioctl calls (VP/ix) */
  2134. X
  2135. X#define AIOC            ('A'<<8)
  2136. X#define AIOCINTTYPE        (AIOC|60)    /* set interrupt type */
  2137. X#define AIOCDOSMODE        (AIOC|61)    /* set DOS mode */
  2138. X#define AIOCNONDOSMODE        (AIOC|62)    /* reset DOS mode */
  2139. X#define AIOCSERIALOUT        (AIOC|63)    /* serial device data write */
  2140. X#define AIOCSERIALIN        (AIOC|64)    /* serial device data read */
  2141. X#define AIOCSETSS        (AIOC|65)    /* set start/stop chars */
  2142. X#define AIOCINFO        (AIOC|66)    /* tell us what device we are */
  2143. X
  2144. X/* ioctl alternate names used by VP/ix */
  2145. X
  2146. X#define VPC_SERIAL_DOS        AIOCDOSMODE
  2147. X#define VPC_SERIAL_NONDOS    AIOCNONDOSMODE
  2148. X#define VPC_SERIAL_INFO        AIOCINFO
  2149. X#define VPC_SERIAL_OUT        AIOCSERIALOUT
  2150. X#define VPC_SERIAL_IN        AIOCSERIALIN
  2151. X
  2152. X/* serial in/out requests */
  2153. X
  2154. X#define SO_DIVLLSB        1
  2155. X#define SO_DIVLMSB        2
  2156. X#define SO_LCR            3
  2157. X#define SO_MCR            4
  2158. X#define SI_MSR            1
  2159. X#define SIO_MASK(x)        (1<<((x)-1))
  2160. X
  2161. X
  2162. X/* This structure contains baud rate dependent informations. */
  2163. X
  2164. Xstruct fas_speed
  2165. X{
  2166. X    union {
  2167. X        uint    ctime;    /* kernel clock ticks until xmitter is empty */
  2168. X        bool    valid;    /* the baud rate table contains valid data */
  2169. X    } i;
  2170. X    union {            /* UART counter divisor value */
  2171. X        struct {
  2172. X            unchar    low;    /* low byte */
  2173. X            unchar    high;    /* high byte */
  2174. X        } b;
  2175. X        ushort    val;
  2176. X    } div;
  2177. X    ushort    xbuf_size;    /* xmit buffer size that fits the baud rate */
  2178. X};
  2179. X
  2180. X
  2181. X/* This structure contains everything one would like to know about
  2182. X   an open device.  There is one of it for each physical unit.
  2183. X
  2184. X   Take care that the size of the area that contains the various
  2185. X   structure fields (up to, but excluding the ring buffers)
  2186. X   is <= 128 bytes. Otherwise a 4-byte offset is used to access
  2187. X   some of the structure fields. For the first 128 bytes a 1-byte
  2188. X   offset is used, which is faster.
  2189. X*/
  2190. X
  2191. Xstruct fas_internals
  2192. X{
  2193. X    struct tty    *tty;    /* the tty structure */
  2194. X    struct fas_internals    *next_int_user;    /* link to next struct */
  2195. X    struct fas_internals    *prev_int_user;    /* link to previous struct */
  2196. X    uint    device_flags;    /* flags about the device state */
  2197. SHAR_EOF
  2198. true || echo 'restore of fas.h failed'
  2199. fi
  2200. echo 'End of  part 6'
  2201. echo 'File fas.h is continued in part 7'
  2202. echo 7 > _shar_seq_.tmp
  2203. exit 0
  2204.