Hex Artifact Content
Not logged in

Artifact 2c7d65073a7cb0a5c802e0b82a9625163802e387:


0000: 23 0a 2f 2a 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  #./*. */../*. * 
0010: 54 49 55 20 28 44 52 31 31 2d 42 29 20 69 6e 74  TIU (DR11-B) int
0020: 65 72 66 61 63 65 20 74 6f 20 53 70 69 64 65 72  erface to Spider
0030: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
0040: 2e 2e 2f 2e 2e 2f 68 2f 70 61 72 61 6d 2e 68 22  ../../h/param.h"
0050: 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 2e 2e  .#include "../..
0060: 2f 68 2f 63 6f 6e 66 2e 68 22 0a 23 69 6e 63 6c  /h/conf.h".#incl
0070: 75 64 65 20 22 2e 2e 2f 2e 2e 2f 68 2f 75 73 65  ude "../../h/use
0080: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 2e  r.h".#include ".
0090: 2e 2f 2e 2e 2f 68 2f 62 75 66 2e 68 22 0a 23 69  ./../h/buf.h".#i
00a0: 6e 63 6c 75 64 65 20 22 2e 2e 2f 2e 2e 2f 68 2f  nclude "../../h/
00b0: 72 65 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  reg.h".#include 
00c0: 22 2e 2e 2f 2e 2e 2f 68 2f 69 6e 6f 64 65 2e 68  "../../h/inode.h
00d0: 22 0a 0a 23 64 65 66 69 6e 65 09 4e 43 48 41 4e  "..#define.NCHAN
00e0: 09 38 0a 0a 2f 2a 20 62 69 74 73 20 69 6e 20 74  .8../* bits in t
00f0: 69 75 63 68 20 66 6c 61 67 73 20 2a 2f 0a 23 64  iuch flags */.#d
0100: 65 66 69 6e 65 09 54 5f 57 52 49 54 52 09 30 31  efine.T_WRITR.01
0110: 0a 23 64 65 66 69 6e 65 09 54 5f 52 41 56 4c 09  .#define.T_RAVL.
0120: 30 32 0a 23 64 65 66 69 6e 65 09 54 5f 45 52 52  02.#define.T_ERR
0130: 4f 52 09 30 34 0a 23 64 65 66 69 6e 65 09 54 5f  OR.04.#define.T_
0140: 44 4f 4e 45 09 30 31 30 0a 23 64 65 66 69 6e 65  DONE.010.#define
0150: 09 54 5f 4f 50 45 4e 09 30 32 30 0a 23 64 65 66  .T_OPEN.020.#def
0160: 69 6e 65 09 54 5f 45 4f 46 09 30 34 30 0a 23 64  ine.T_EOF.040.#d
0170: 65 66 69 6e 65 09 54 5f 53 54 4f 50 09 30 31 30  efine.T_STOP.010
0180: 30 0a 23 64 65 66 69 6e 65 09 54 5f 57 52 49 54  0.#define.T_WRIT
0190: 57 20 30 32 30 30 0a 0a 2f 2a 20 64 72 73 74 20  W 0200../* drst 
01a0: 62 69 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 09  bits */.#define.
01b0: 54 5f 54 45 52 52 4f 52 20 30 31 30 30 30 30 30  T_TERROR 0100000
01c0: 0a 23 64 65 66 69 6e 65 09 54 5f 52 45 4a 09 30  .#define.T_REJ.0
01d0: 34 30 30 30 0a 23 64 65 66 69 6e 65 09 54 5f 49  4000.#define.T_I
01e0: 44 4c 45 09 30 32 30 30 30 0a 23 64 65 66 69 6e  DLE.02000.#defin
01f0: 65 09 54 5f 53 4f 4e 09 30 31 30 30 30 0a 0a 2f  e.T_SON.01000../
0200: 2a 20 64 72 64 62 20 62 69 74 73 20 2a 2f 0a 23  * drdb bits */.#
0210: 64 65 66 69 6e 65 09 54 5f 42 4b 53 54 53 09 30  define.T_BKSTS.0
0220: 31 30 30 30 30 30 0a 23 64 65 66 69 6e 65 09 54  100000.#define.T
0230: 5f 53 4c 53 54 53 09 30 34 30 30 30 30 0a 23 64  _SLSTS.040000.#d
0240: 65 66 69 6e 65 09 54 5f 57 54 53 54 53 09 30 31  efine.T_WTSTS.01
0250: 30 30 30 30 0a 23 64 65 66 69 6e 65 09 54 5f 54  0000.#define.T_T
0260: 52 4f 55 42 09 30 32 30 30 30 0a 23 64 65 66 69  ROUB.02000.#defi
0270: 6e 65 09 54 5f 4f 44 44 09 30 31 30 30 30 0a 23  ne.T_ODD.01000.#
0280: 64 65 66 69 6e 65 09 54 5f 53 49 47 4e 4c 09 30  define.T_SIGNL.0
0290: 34 30 30 0a 23 64 65 66 69 6e 65 09 54 5f 53 45  400.#define.T_SE
02a0: 4c 57 09 30 32 30 30 0a 0a 23 64 65 66 69 6e 65  LW.0200..#define
02b0: 09 54 49 55 50 52 49 09 28 2d 31 29 0a 23 64 65  .TIUPRI.(-1).#de
02c0: 66 69 6e 65 09 54 49 55 4c 50 52 49 09 31 0a 23  fine.TIULPRI.1.#
02d0: 64 65 66 69 6e 65 09 54 49 55 41 44 44 52 09 30  define.TIUADDR.0
02e0: 31 37 32 34 33 30 0a 0a 2f 2a 20 74 69 75 20 63  172430../* tiu c
02f0: 6f 6d 6d 61 6e 64 20 62 69 74 73 20 2a 2f 0a 23  ommand bits */.#
0300: 64 65 66 69 6e 65 09 49 45 4e 41 42 4c 45 09 30  define.IENABLE.0
0310: 31 30 30 0a 23 64 65 66 69 6e 65 09 47 4f 09 30  100.#define.GO.0
0320: 31 0a 23 64 65 66 69 6e 65 09 53 54 4f 50 09 30  1.#define.STOP.0
0330: 0a 23 64 65 66 69 6e 65 09 52 43 48 09 30 32 0a  .#define.RCH.02.
0340: 23 64 65 66 69 6e 65 09 52 44 43 09 30 34 0a 23  #define.RDC.04.#
0350: 64 65 66 69 6e 65 09 52 4e 4d 09 30 36 0a 23 64  define.RNM.06.#d
0360: 65 66 69 6e 65 09 57 53 42 09 30 31 30 0a 23 64  efine.WSB.010.#d
0370: 65 66 69 6e 65 09 57 43 48 09 30 31 32 0a 23 64  efine.WCH.012.#d
0380: 65 66 69 6e 65 09 57 44 43 09 30 31 34 0a 23 64  efine.WDC.014.#d
0390: 65 66 69 6e 65 09 57 44 42 09 30 31 36 0a 0a 23  efine.WDB.016..#
03a0: 64 65 66 69 6e 65 09 53 52 45 41 44 09 31 0a 23  define.SREAD.1.#
03b0: 64 65 66 69 6e 65 09 53 57 52 49 54 45 09 32 0a  define.SWRITE.2.
03c0: 23 64 65 66 69 6e 65 09 53 57 53 49 47 09 33 0a  #define.SWSIG.3.
03d0: 23 64 65 66 69 6e 65 09 53 57 44 4f 4e 45 09 34  #define.SWDONE.4
03e0: 0a 23 64 65 66 69 6e 65 09 53 53 54 4f 50 09 35  .#define.SSTOP.5
03f0: 0a 23 64 65 66 69 6e 65 09 53 53 45 4c 09 36 0a  .#define.SSEL.6.
0400: 0a 23 64 65 66 69 6e 65 09 54 49 4d 4c 49 4d 09  .#define.TIMLIM.
0410: 35 0a 0a 73 74 72 75 63 74 20 7b 0a 09 69 6e 74  5..struct {..int
0420: 09 64 72 77 63 3b 0a 09 69 6e 74 09 64 72 62 61  .drwc;..int.drba
0430: 3b 0a 09 69 6e 74 09 64 72 73 74 3b 0a 09 69 6e  ;..int.drst;..in
0440: 74 09 64 72 64 62 3b 0a 7d 3b 0a 73 74 72 75 63  t.drdb;.};.struc
0450: 74 20 74 69 75 63 68 20 7b 0a 09 63 68 61 72 09  t tiuch {..char.
0460: 74 5f 66 6c 61 67 73 3b 0a 09 63 68 61 72 09 74  t_flags;..char.t
0470: 5f 69 73 69 67 3b 0a 09 63 68 61 72 09 74 5f 6f  _isig;..char.t_o
0480: 73 69 67 3b 0a 09 63 68 61 72 09 74 5f 74 72 6f  sig;..char.t_tro
0490: 75 62 3b 0a 09 63 68 61 72 09 2a 74 5f 62 75 66  ub;..char.*t_buf
04a0: 66 65 72 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  fer;.};..struct 
04b0: 74 69 75 63 68 20 74 69 75 5f 64 63 68 61 6e 5b  tiuch tiu_dchan[
04c0: 4e 43 48 41 4e 5d 3b 0a 73 74 72 75 63 74 20 74  NCHAN];.struct t
04d0: 69 75 63 68 20 74 69 75 5f 63 63 68 61 6e 5b 4e  iuch tiu_cchan[N
04e0: 43 48 41 4e 5d 3b 0a 0a 73 74 72 75 63 74 20 74  CHAN];..struct t
04f0: 69 75 20 7b 0a 09 63 68 61 72 09 74 5f 73 74 61  iu {..char.t_sta
0500: 74 65 3b 0a 09 63 68 61 72 09 74 5f 63 68 61 6e  te;..char.t_chan
0510: 3b 0a 09 63 68 61 72 09 74 5f 74 69 6d 65 3b 0a  ;..char.t_time;.
0520: 09 63 68 61 72 09 74 5f 74 69 6d 6f 3b 0a 09 63  .char.t_timo;..c
0530: 68 61 72 09 74 5f 6e 6f 70 65 6e 3b 0a 09 73 74  har.t_nopen;..st
0540: 72 75 63 74 09 62 75 66 20 2a 74 5f 61 63 74 66  ruct.buf *t_actf
0550: 3b 0a 09 73 74 72 75 63 74 09 62 75 66 20 2a 74  ;..struct.buf *t
0560: 5f 61 63 74 6c 3b 0a 7d 20 74 69 75 3b 0a 0a 74  _actl;.} tiu;..t
0570: 69 75 6f 70 65 6e 28 64 65 76 2c 20 66 6c 61 67  iuopen(dev, flag
0580: 29 0a 7b 0a 09 69 6e 74 20 74 69 75 74 69 6d 65  ).{..int tiutime
0590: 6f 75 74 28 29 3b 0a 09 72 65 67 69 73 74 65 72  out();..register
05a0: 20 73 74 72 75 63 74 20 74 69 75 63 68 20 2a 63   struct tiuch *c
05b0: 70 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72  p;..register str
05c0: 75 63 74 20 62 75 66 20 2a 62 70 3b 0a 0a 09 69  uct buf *bp;...i
05d0: 66 20 28 28 63 70 20 3d 20 74 69 75 70 74 72 28  f ((cp = tiuptr(
05e0: 64 65 76 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dev)) == NULL) {
05f0: 0a 09 09 75 2e 75 5f 65 72 72 6f 72 20 3d 20 45  ...u.u_error = E
0600: 4e 58 49 4f 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  NXIO;...return;.
0610: 09 7d 0a 09 69 66 20 28 63 70 2d 3e 74 5f 66 6c  .}..if (cp->t_fl
0620: 61 67 73 26 54 5f 4f 50 45 4e 29 20 7b 0a 09 09  ags&T_OPEN) {...
0630: 75 2e 75 5f 65 72 72 6f 72 20 3d 20 45 42 55 53  u.u_error = EBUS
0640: 59 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a  Y;...return;..}.
0650: 09 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d 20 54  .cp->t_flags = T
0660: 5f 4f 50 45 4e 3b 0a 09 63 70 2d 3e 74 5f 6f 73  _OPEN;..cp->t_os
0670: 69 67 20 3d 20 31 3b 0a 09 69 66 20 28 74 69 75  ig = 1;..if (tiu
0680: 2e 74 5f 6e 6f 70 65 6e 2b 2b 20 3d 3d 20 30 29  .t_nopen++ == 0)
0690: 20 7b 0a 09 09 74 69 75 2e 74 5f 63 68 61 6e 20   {...tiu.t_chan 
06a0: 3d 20 2d 31 3b 0a 09 09 74 69 6d 65 6f 75 74 28  = -1;...timeout(
06b0: 74 69 75 74 69 6d 65 6f 75 74 2c 20 30 2c 20 48  tiutimeout, 0, H
06c0: 5a 29 3b 0a 09 7d 0a 09 63 70 2d 3e 74 5f 66 6c  Z);..}..cp->t_fl
06d0: 61 67 73 20 3d 7c 20 54 5f 53 54 4f 50 3b 0a 09  ags =| T_STOP;..
06e0: 74 69 75 73 74 61 72 74 28 29 3b 0a 7d 0a 0a 74  tiustart();.}..t
06f0: 69 75 63 6c 6f 73 65 28 64 65 76 29 0a 7b 0a 09  iuclose(dev).{..
0700: 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20  register struct 
0710: 74 69 75 63 68 20 2a 63 70 3b 0a 0a 09 69 66 20  tiuch *cp;...if 
0720: 28 28 63 70 20 3d 20 74 69 75 70 74 72 28 64 65  ((cp = tiuptr(de
0730: 76 29 29 20 3d 3d 20 30 29 0a 09 09 72 65 74 75  v)) == 0)...retu
0740: 72 6e 3b 0a 09 63 70 2d 3e 74 5f 66 6c 61 67 73  rn;..cp->t_flags
0750: 20 3d 7c 20 54 5f 53 54 4f 50 3b 0a 09 74 69 75   =| T_STOP;..tiu
0760: 73 74 61 72 74 28 29 3b 0a 09 63 70 2d 3e 74 5f  start();..cp->t_
0770: 66 6c 61 67 73 20 3d 26 20 54 5f 53 54 4f 50 3b  flags =& T_STOP;
0780: 0a 09 74 69 75 2e 74 5f 6e 6f 70 65 6e 20 2d 2d  ..tiu.t_nopen --
0790: 3b 0a 7d 0a 0a 74 69 75 77 72 69 74 65 28 64 65  ;.}..tiuwrite(de
07a0: 76 29 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 69  v).{..register i
07b0: 6e 74 20 6e 3b 0a 09 72 65 67 69 73 74 65 72 20  nt n;..register 
07c0: 73 74 72 75 63 74 20 74 69 75 63 68 20 2a 63 70  struct tiuch *cp
07d0: 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72 75  ;..register stru
07e0: 63 74 20 62 75 66 20 2a 62 70 3b 0a 0a 09 69 66  ct buf *bp;...if
07f0: 20 28 28 63 70 20 3d 20 74 69 75 63 68 61 6e 28   ((cp = tiuchan(
0800: 64 65 76 29 29 20 3d 3d 20 4e 55 4c 4c 29 0a 09  dev)) == NULL)..
0810: 09 72 65 74 75 72 6e 3b 0a 09 64 6f 20 7b 0a 09  .return;..do {..
0820: 09 73 70 6c 35 28 29 3b 0a 09 09 69 66 20 28 28  .spl5();...if ((
0830: 63 70 2d 3e 74 5f 66 6c 61 67 73 26 54 5f 57 52  cp->t_flags&T_WR
0840: 49 54 52 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ITR) == 0) {....
0850: 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d 7c 20 54  cp->t_flags =| T
0860: 5f 57 52 49 54 57 3b 09 2f 2a 20 77 61 6e 74 20  _WRITW;./* want 
0870: 73 65 6c 65 63 74 20 57 20 2a 2f 0a 09 09 09 74  select W */....t
0880: 69 75 73 74 61 72 74 28 29 3b 0a 09 09 7d 0a 09  iustart();...}..
0890: 09 77 68 69 6c 65 20 28 28 63 70 2d 3e 74 5f 66  .while ((cp->t_f
08a0: 6c 61 67 73 26 28 54 5f 57 52 49 54 52 7c 54 5f  lags&(T_WRITR|T_
08b0: 45 52 52 4f 52 7c 54 5f 45 4f 46 29 29 20 3d 3d  ERROR|T_EOF)) ==
08c0: 20 30 29 0a 09 09 09 73 6c 65 65 70 28 63 70 2c   0)....sleep(cp,
08d0: 20 54 49 55 4c 50 52 49 29 3b 0a 09 09 73 70 6c   TIULPRI);...spl
08e0: 30 28 29 3b 0a 09 09 69 66 20 28 74 69 75 63 68  0();...if (tiuch
08f0: 65 63 6b 28 63 70 29 29 0a 09 09 09 72 65 74 75  eck(cp))....retu
0900: 72 6e 3b 0a 09 09 62 70 20 3d 20 67 65 74 62 6c  rn;...bp = getbl
0910: 6b 28 4e 4f 44 45 56 29 3b 0a 09 09 69 66 20 28  k(NODEV);...if (
0920: 6e 20 3d 20 6d 69 6e 28 35 31 32 2c 20 75 2e 75  n = min(512, u.u
0930: 5f 63 6f 75 6e 74 29 29 0a 09 09 09 69 6f 6d 6f  _count))....iomo
0940: 76 65 28 62 70 2c 20 30 2c 20 6e 2c 20 42 5f 57  ve(bp, 0, n, B_W
0950: 52 49 54 45 29 3b 0a 09 09 69 66 20 28 75 2e 75  RITE);...if (u.u
0960: 5f 63 6f 75 6e 74 20 3d 3d 20 30 20 7c 7c 20 75  _count == 0 || u
0970: 2e 75 5f 65 72 72 6f 72 29 0a 09 09 09 62 70 2d  .u_error)....bp-
0980: 3e 62 5f 62 6c 6b 6e 6f 20 3d 20 63 70 2d 3e 74  >b_blkno = cp->t
0990: 5f 6f 73 69 67 3b 0a 09 09 65 6c 73 65 0a 09 09  _osig;...else...
09a0: 09 62 70 2d 3e 62 5f 62 6c 6b 6e 6f 20 3d 20 30  .bp->b_blkno = 0
09b0: 3b 0a 09 09 62 70 2d 3e 62 5f 64 65 76 2e 64 5f  ;...bp->b_dev.d_
09c0: 6d 69 6e 6f 72 20 3d 20 64 65 76 2e 64 5f 6d 69  minor = dev.d_mi
09d0: 6e 6f 72 3b 0a 09 09 62 70 2d 3e 62 5f 77 63 6f  nor;...bp->b_wco
09e0: 75 6e 74 20 3d 20 6e 3b 0a 09 09 62 70 2d 3e 62  unt = n;...bp->b
09f0: 5f 66 6c 61 67 73 20 3d 20 42 5f 57 52 49 54 45  _flags = B_WRITE
0a00: 3b 0a 09 09 73 70 6c 35 28 29 3b 0a 09 09 63 70  ;...spl5();...cp
0a10: 2d 3e 74 5f 66 6c 61 67 73 20 3d 26 20 7e 54 5f  ->t_flags =& ~T_
0a20: 44 4f 4e 45 3b 0a 09 09 74 69 75 73 74 72 61 74  DONE;...tiustrat
0a30: 65 67 79 28 62 70 29 3b 0a 09 09 77 68 69 6c 65  egy(bp);...while
0a40: 20 28 28 63 70 2d 3e 74 5f 66 6c 61 67 73 26 28   ((cp->t_flags&(
0a50: 54 5f 44 4f 4e 45 7c 54 5f 45 52 52 4f 52 7c 54  T_DONE|T_ERROR|T
0a60: 5f 45 4f 46 29 29 20 3d 3d 20 30 29 0a 09 09 09  _EOF)) == 0)....
0a70: 73 6c 65 65 70 28 63 70 2c 20 54 49 55 50 52 49  sleep(cp, TIUPRI
0a80: 29 3b 0a 09 09 73 70 6c 30 28 29 3b 0a 09 09 62  );...spl0();...b
0a90: 72 65 6c 73 65 28 62 70 29 3b 0a 09 09 69 66 20  relse(bp);...if 
0aa0: 28 74 69 75 63 68 65 63 6b 28 63 70 29 29 0a 09  (tiucheck(cp))..
0ab0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 20 77 68 69  ..return;..} whi
0ac0: 6c 65 20 28 75 2e 75 5f 63 6f 75 6e 74 29 3b 0a  le (u.u_count);.
0ad0: 7d 0a 0a 74 69 75 72 65 61 64 28 64 65 76 29 0a  }..tiuread(dev).
0ae0: 7b 0a 09 72 65 67 69 73 74 65 72 20 69 6e 74 20  {..register int 
0af0: 6e 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72  n;..register str
0b00: 75 63 74 20 74 69 75 63 68 20 2a 63 70 3b 0a 09  uct tiuch *cp;..
0b10: 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20  register struct 
0b20: 62 75 66 20 2a 62 70 3b 0a 0a 09 69 66 20 28 28  buf *bp;...if ((
0b30: 63 70 20 3d 20 74 69 75 63 68 61 6e 28 64 65 76  cp = tiuchan(dev
0b40: 29 29 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 72 65  )) == NULL)...re
0b50: 74 75 72 6e 3b 0a 09 73 70 6c 35 28 29 3b 0a 09  turn;..spl5();..
0b60: 77 68 69 6c 65 20 28 28 63 70 2d 3e 74 5f 66 6c  while ((cp->t_fl
0b70: 61 67 73 26 28 54 5f 52 41 56 4c 7c 54 5f 45 52  ags&(T_RAVL|T_ER
0b80: 52 4f 52 7c 54 5f 45 4f 46 29 29 3d 3d 30 29 0a  ROR|T_EOF))==0).
0b90: 09 09 73 6c 65 65 70 28 63 70 2c 20 54 49 55 4c  ..sleep(cp, TIUL
0ba0: 50 52 49 29 3b 0a 09 73 70 6c 30 28 29 3b 0a 09  PRI);..spl0();..
0bb0: 69 66 20 28 74 69 75 63 68 65 63 6b 28 63 70 29  if (tiucheck(cp)
0bc0: 29 0a 09 09 72 65 74 75 72 6e 3b 0a 09 62 70 20  )...return;..bp 
0bd0: 3d 20 67 65 74 62 6c 6b 28 4e 4f 44 45 56 29 3b  = getblk(NODEV);
0be0: 0a 09 62 70 2d 3e 62 5f 66 6c 61 67 73 20 3d 20  ..bp->b_flags = 
0bf0: 42 5f 52 45 41 44 3b 0a 09 62 70 2d 3e 62 5f 64  B_READ;..bp->b_d
0c00: 65 76 2e 64 5f 6d 69 6e 6f 72 20 3d 20 64 65 76  ev.d_minor = dev
0c10: 2e 64 5f 6d 69 6e 6f 72 3b 0a 09 63 70 2d 3e 74  .d_minor;..cp->t
0c20: 5f 66 6c 61 67 73 20 3d 26 20 7e 54 5f 44 4f 4e  _flags =& ~T_DON
0c30: 45 3b 0a 09 74 69 75 73 74 72 61 74 65 67 79 28  E;..tiustrategy(
0c40: 62 70 29 3b 0a 09 77 68 69 6c 65 20 28 28 63 70  bp);..while ((cp
0c50: 2d 3e 74 5f 66 6c 61 67 73 26 28 54 5f 44 4f 4e  ->t_flags&(T_DON
0c60: 45 7c 54 5f 45 52 52 4f 52 7c 54 5f 45 4f 46 29  E|T_ERROR|T_EOF)
0c70: 29 20 3d 3d 20 30 29 0a 09 09 73 6c 65 65 70 28  ) == 0)...sleep(
0c80: 63 70 2c 20 54 49 55 50 52 49 29 3b 0a 09 73 70  cp, TIUPRI);..sp
0c90: 6c 30 28 29 3b 0a 09 69 66 20 28 63 70 2d 3e 74  l0();..if (cp->t
0ca0: 5f 69 73 69 67 20 3d 20 62 70 2d 3e 62 5f 62 6c  _isig = bp->b_bl
0cb0: 6b 6e 6f 29 0a 09 09 63 70 2d 3e 74 5f 66 6c 61  kno)...cp->t_fla
0cc0: 67 73 20 3d 26 20 7e 54 5f 52 41 56 4c 3b 0a 09  gs =& ~T_RAVL;..
0cd0: 69 66 20 28 74 69 75 63 68 65 63 6b 28 63 70 29  if (tiucheck(cp)
0ce0: 20 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 6e   == 0) {...if (n
0cf0: 20 3d 20 6d 69 6e 28 62 70 2d 3e 62 5f 77 63 6f   = min(bp->b_wco
0d00: 75 6e 74 2c 20 75 2e 75 5f 63 6f 75 6e 74 29 29  unt, u.u_count))
0d10: 0a 09 09 09 69 6f 6d 6f 76 65 28 62 70 2c 20 30  ....iomove(bp, 0
0d20: 2c 20 6e 2c 20 42 5f 52 45 41 44 29 3b 0a 09 7d  , n, B_READ);..}
0d30: 0a 09 62 72 65 6c 73 65 28 62 70 29 3b 0a 7d 0a  ..brelse(bp);.}.
0d40: 0a 74 69 75 63 68 65 63 6b 28 61 63 70 29 0a 73  .tiucheck(acp).s
0d50: 74 72 75 63 74 20 74 69 75 63 68 20 2a 61 63 70  truct tiuch *acp
0d60: 3b 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 73 74  ;.{..register st
0d70: 72 75 63 74 20 74 69 75 63 68 20 2a 63 70 3b 0a  ruct tiuch *cp;.
0d80: 0a 09 63 70 20 3d 20 61 63 70 3b 0a 09 69 66 20  ..cp = acp;..if 
0d90: 28 63 70 2d 3e 74 5f 66 6c 61 67 73 20 26 20 28  (cp->t_flags & (
0da0: 54 5f 45 4f 46 20 7c 20 54 5f 45 52 52 4f 52 29  T_EOF | T_ERROR)
0db0: 29 20 7b 0a 09 09 69 66 20 28 63 70 2d 3e 74 5f  ) {...if (cp->t_
0dc0: 66 6c 61 67 73 26 54 5f 45 52 52 4f 52 29 0a 09  flags&T_ERROR)..
0dd0: 09 09 75 2e 75 5f 65 72 72 6f 72 20 3d 20 45 49  ..u.u_error = EI
0de0: 4f 3b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  O;...return(1);.
0df0: 09 7d 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  .}..return(0);.}
0e00: 0a 0a 74 69 75 73 74 61 72 74 28 29 0a 7b 0a 09  ..tiustart().{..
0e10: 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20  register struct 
0e20: 62 75 66 20 2a 62 70 3b 0a 09 72 65 67 69 73 74  buf *bp;..regist
0e30: 65 72 20 69 3b 0a 0a 09 69 66 20 28 74 69 75 2e  er i;...if (tiu.
0e40: 74 5f 73 74 61 74 65 29 0a 09 09 72 65 74 75 72  t_state)...retur
0e50: 6e 3b 0a 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  n;..for (i=0; i<
0e60: 4e 43 48 41 4e 3b 20 69 2b 2b 29 20 7b 0a 09 09  NCHAN; i++) {...
0e70: 69 66 20 28 74 69 75 63 6e 74 72 6c 28 69 2c 20  if (tiucntrl(i, 
0e80: 26 74 69 75 5f 64 63 68 61 6e 5b 69 5d 29 0a 09  &tiu_dchan[i])..
0e90: 09 20 7c 7c 20 74 69 75 63 6e 74 72 6c 28 69 2b  . || tiucntrl(i+
0ea0: 36 34 2c 20 26 74 69 75 5f 63 63 68 61 6e 5b 69  64, &tiu_cchan[i
0eb0: 5d 29 29 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ]))...return;..}
0ec0: 0a 09 69 66 20 28 28 62 70 20 3d 20 74 69 75 2e  ..if ((bp = tiu.
0ed0: 74 5f 61 63 74 66 29 3d 3d 30 29 0a 09 09 72 65  t_actf)==0)...re
0ee0: 74 75 72 6e 3b 0a 09 69 66 20 28 73 74 69 75 63  turn;..if (stiuc
0ef0: 68 61 6e 28 62 70 2d 3e 62 5f 64 65 76 2e 64 5f  han(bp->b_dev.d_
0f00: 6d 69 6e 6f 72 29 20 3d 3d 20 30 29 0a 09 09 72  minor) == 0)...r
0f10: 65 74 75 72 6e 3b 0a 09 54 49 55 41 44 44 52 2d  eturn;..TIUADDR-
0f20: 3e 64 72 62 61 20 3d 20 62 70 2d 3e 62 5f 61 64  >drba = bp->b_ad
0f30: 64 72 3b 0a 09 69 66 20 28 62 70 2d 3e 62 5f 66  dr;..if (bp->b_f
0f40: 6c 61 67 73 26 42 5f 52 45 41 44 29 20 7b 0a 09  lags&B_READ) {..
0f50: 09 54 49 55 41 44 44 52 2d 3e 64 72 77 63 20 3d  .TIUADDR->drwc =
0f60: 20 2d 32 35 37 3b 0a 09 09 74 69 75 2e 74 5f 73   -257;...tiu.t_s
0f70: 74 61 74 65 20 3d 20 53 52 45 41 44 3b 0a 09 09  tate = SREAD;...
0f80: 54 49 55 41 44 44 52 2d 3e 64 72 73 74 20 3d 20  TIUADDR->drst = 
0f90: 49 45 4e 41 42 4c 45 7c 52 44 43 7c 47 4f 3b 0a  IENABLE|RDC|GO;.
0fa0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 69 75 2e  .} else {...tiu.
0fb0: 74 5f 73 74 61 74 65 20 3d 20 53 57 52 49 54 45  t_state = SWRITE
0fc0: 3b 0a 09 09 69 66 20 28 28 54 49 55 41 44 44 52  ;...if ((TIUADDR
0fd0: 2d 3e 64 72 77 63 20 3d 20 2d 28 62 70 2d 3e 62  ->drwc = -(bp->b
0fe0: 5f 77 63 6f 75 6e 74 3e 3e 31 29 29 3d 3d 30 29  _wcount>>1))==0)
0ff0: 20 7b 0a 09 09 09 74 69 75 69 6e 74 72 28 29 3b   {....tiuintr();
1000: 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d 0a  ....return;...}.
1010: 09 09 54 49 55 41 44 44 52 2d 3e 64 72 73 74 20  ..TIUADDR->drst 
1020: 3d 20 49 45 4e 41 42 4c 45 7c 57 44 43 7c 47 4f  = IENABLE|WDC|GO
1030: 3b 0a 09 7d 0a 09 74 69 75 2e 74 5f 74 69 6d 65  ;..}..tiu.t_time
1040: 20 3d 20 54 49 4d 4c 49 4d 3b 0a 7d 0a 0a 74 69   = TIMLIM;.}..ti
1050: 75 63 6e 74 72 6c 28 63 68 61 6e 2c 20 61 63 70  ucntrl(chan, acp
1060: 29 0a 73 74 72 75 63 74 20 74 69 75 63 68 20 2a  ).struct tiuch *
1070: 61 63 70 3b 0a 7b 0a 09 72 65 67 69 73 74 65 72  acp;.{..register
1080: 20 73 74 72 75 63 74 20 74 69 75 20 2a 63 70 3b   struct tiu *cp;
1090: 0a 0a 09 63 70 20 3d 20 61 63 70 3b 0a 09 69 66  ...cp = acp;..if
10a0: 20 28 63 70 2d 3e 74 5f 66 6c 61 67 73 26 54 5f   (cp->t_flags&T_
10b0: 53 54 4f 50 29 20 7b 0a 09 09 69 66 20 28 73 74  STOP) {...if (st
10c0: 69 75 63 68 61 6e 28 63 68 61 6e 2b 30 34 30 30  iuchan(chan+0400
10d0: 29 29 20 7b 0a 09 09 09 63 70 2d 3e 74 5f 66 6c  )) {....cp->t_fl
10e0: 61 67 73 20 3d 26 20 7e 54 5f 53 54 4f 50 3b 0a  ags =& ~T_STOP;.
10f0: 09 09 09 74 69 75 2e 74 5f 73 74 61 74 65 20 3d  ...tiu.t_state =
1100: 20 53 53 54 4f 50 3b 0a 09 09 09 74 69 75 2e 74   SSTOP;....tiu.t
1110: 5f 74 69 6d 65 20 3d 20 54 49 4d 4c 49 4d 3b 0a  _time = TIMLIM;.
1120: 09 09 7d 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ..}...return(1);
1130: 0a 09 7d 0a 09 69 66 20 28 63 70 2d 3e 74 5f 66  ..}..if (cp->t_f
1140: 6c 61 67 73 26 54 5f 57 52 49 54 57 29 20 7b 0a  lags&T_WRITW) {.
1150: 09 09 69 66 20 28 73 74 69 75 63 68 61 6e 28 63  ..if (stiuchan(c
1160: 68 61 6e 2b 30 32 30 30 29 29 20 7b 0a 09 09 09  han+0200)) {....
1170: 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d 26 20 7e  cp->t_flags =& ~
1180: 54 5f 57 52 49 54 57 3b 0a 09 09 09 74 69 75 2e  T_WRITW;....tiu.
1190: 74 5f 74 69 6d 65 20 3d 20 54 49 4d 4c 49 4d 3b  t_time = TIMLIM;
11a0: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 28 31 29  ...}...return(1)
11b0: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 30 29 3b  ;..}..return(0);
11c0: 0a 7d 0a 0a 73 74 69 75 63 68 61 6e 28 61 63 29  .}..stiuchan(ac)
11d0: 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 69 6e 74  .{..register int
11e0: 20 63 3b 0a 0a 09 63 20 3d 20 61 63 3b 0a 09 69   c;...c = ac;..i
11f0: 66 20 28 63 20 21 3d 20 74 69 75 2e 74 5f 63 68  f (c != tiu.t_ch
1200: 61 6e 29 20 7b 0a 09 09 69 66 20 28 28 54 49 55  an) {...if ((TIU
1210: 41 44 44 52 2d 3e 64 72 73 74 26 54 5f 49 44 4c  ADDR->drst&T_IDL
1220: 45 29 3d 3d 30 20 7c 7c 20 28 54 49 55 41 44 44  E)==0 || (TIUADD
1230: 52 2d 3e 64 72 64 62 26 54 5f 53 4c 53 54 53 29  R->drdb&T_SLSTS)
1240: 3d 3d 30 29 20 7b 0a 09 09 09 74 69 75 2e 74 5f  ==0) {....tiu.t_
1250: 73 74 61 74 65 20 3d 20 53 53 45 4c 3b 0a 09 09  state = SSEL;...
1260: 09 74 69 75 2e 74 5f 74 69 6d 65 20 3d 20 54 49  .tiu.t_time = TI
1270: 4d 4c 49 4d 3b 0a 09 09 09 72 65 74 75 72 6e 28  MLIM;....return(
1280: 30 29 3b 0a 09 09 7d 0a 09 09 74 69 75 2e 74 5f  0);...}...tiu.t_
1290: 63 68 61 6e 20 3d 20 63 26 30 31 37 37 3b 0a 09  chan = c&0177;..
12a0: 09 54 49 55 41 44 44 52 2d 3e 64 72 64 62 20 3d  .TIUADDR->drdb =
12b0: 20 63 3b 0a 09 09 54 49 55 41 44 44 52 2d 3e 64   c;...TIUADDR->d
12c0: 72 73 74 20 3d 20 49 45 4e 41 42 4c 45 7c 57 43  rst = IENABLE|WC
12d0: 48 7c 47 4f 3b 0a 09 7d 0a 09 72 65 74 75 72 6e  H|GO;..}..return
12e0: 28 31 29 3b 0a 7d 0a 0a 74 69 75 74 69 6d 65 6f  (1);.}..tiutimeo
12f0: 75 74 28 29 0a 7b 0a 09 74 69 75 2e 74 5f 74 69  ut().{..tiu.t_ti
1300: 6d 65 2d 2d 3b 0a 09 69 66 20 28 74 69 75 2e 74  me--;..if (tiu.t
1310: 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09  _time == 0) {...
1320: 74 69 75 2e 74 5f 74 69 6d 6f 2b 2b 3b 0a 09 09  tiu.t_timo++;...
1330: 74 69 75 69 6e 74 72 28 29 3b 0a 09 7d 20 65 6c  tiuintr();..} el
1340: 73 65 20 69 66 20 28 74 69 75 2e 74 5f 74 69 6d  se if (tiu.t_tim
1350: 65 20 3c 20 30 29 0a 09 09 74 69 75 2e 74 5f 74  e < 0)...tiu.t_t
1360: 69 6d 65 20 3d 20 30 3b 0a 09 69 66 20 28 74 69  ime = 0;..if (ti
1370: 75 2e 74 5f 6e 6f 70 65 6e 29 0a 09 09 74 69 6d  u.t_nopen)...tim
1380: 65 6f 75 74 28 74 69 75 74 69 6d 65 6f 75 74 2c  eout(tiutimeout,
1390: 20 30 2c 20 48 5a 29 3b 0a 7d 0a 0a 74 69 75 69   0, HZ);.}..tiui
13a0: 6e 74 72 28 29 0a 7b 0a 09 72 65 67 69 73 74 65  ntr().{..registe
13b0: 72 20 73 74 72 75 63 74 20 62 75 66 20 2a 62 70  r struct buf *bp
13c0: 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72 75  ;..register stru
13d0: 63 74 20 74 69 75 63 68 20 2a 63 70 3b 0a 09 73  ct tiuch *cp;..s
13e0: 74 72 75 63 74 20 74 69 75 63 68 20 2a 6c 61 73  truct tiuch *las
13f0: 74 63 70 3b 0a 09 72 65 67 69 73 74 65 72 20 69  tcp;..register i
1400: 6e 74 20 73 3b 0a 0a 09 73 20 3d 20 74 69 75 2e  nt s;...s = tiu.
1410: 74 5f 73 74 61 74 65 3b 0a 09 69 66 20 28 28 73  t_state;..if ((s
1420: 3d 3d 53 53 54 4f 50 20 7c 7c 20 73 3d 3d 53 53  ==SSTOP || s==SS
1430: 45 4c 29 20 26 26 20 74 69 75 2e 74 5f 74 69 6d  EL) && tiu.t_tim
1440: 6f 3d 3d 30 0a 09 20 26 26 20 28 28 54 49 55 41  o==0.. && ((TIUA
1450: 44 44 52 2d 3e 64 72 73 74 26 54 5f 49 44 4c 45  DDR->drst&T_IDLE
1460: 29 3d 3d 30 20 7c 7c 20 28 54 49 55 41 44 44 52  )==0 || (TIUADDR
1470: 2d 3e 64 72 64 62 26 54 5f 53 4c 53 54 53 29 3d  ->drdb&T_SLSTS)=
1480: 3d 30 29 29 0a 09 09 72 65 74 75 72 6e 3b 0a 09  =0))...return;..
1490: 74 69 75 2e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a  tiu.t_time = 0;.
14a0: 09 63 70 20 3d 20 74 69 75 70 74 72 28 74 69 75  .cp = tiuptr(tiu
14b0: 2e 74 5f 63 68 61 6e 29 3b 0a 09 74 69 75 2e 74  .t_chan);..tiu.t
14c0: 5f 73 74 61 74 65 20 3d 20 30 3b 0a 09 62 70 20  _state = 0;..bp 
14d0: 3d 20 4e 55 4c 4c 3b 0a 09 69 66 20 28 73 20 26  = NULL;..if (s &
14e0: 26 20 73 21 3d 53 53 54 4f 50 20 26 26 20 73 21  & s!=SSTOP && s!
14f0: 3d 53 53 45 4c 29 20 7b 0a 09 09 62 70 20 3d 20  =SSEL) {...bp = 
1500: 74 69 75 2e 74 5f 61 63 74 66 3b 0a 09 09 69 66  tiu.t_actf;...if
1510: 20 28 62 70 3d 3d 4e 55 4c 4c 20 7c 7c 20 63 70   (bp==NULL || cp
1520: 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 09 74 69 75  ==NULL) {....tiu
1530: 65 72 72 28 2d 31 2c 20 30 29 3b 0a 09 09 09 67  err(-1, 0);....g
1540: 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 7d 0a 09 7d  oto done;...}..}
1550: 0a 09 69 66 20 28 28 54 49 55 41 44 44 52 2d 3e  ..if ((TIUADDR->
1560: 64 72 73 74 26 28 54 5f 54 45 52 52 4f 52 7c 54  drst&(T_TERROR|T
1570: 5f 52 45 4a 29 29 20 7c 7c 20 74 69 75 2e 74 5f  _REJ)) || tiu.t_
1580: 74 69 6d 6f 29 20 7b 0a 09 09 74 69 75 65 72 72  timo) {...tiuerr
1590: 28 74 69 75 73 74 6f 70 28 29 2c 20 30 34 30 2b  (tiustop(), 040+
15a0: 73 2b 30 34 30 2a 28 74 69 75 2e 74 5f 74 69 6d  s+040*(tiu.t_tim
15b0: 6f 21 3d 30 29 29 3b 0a 09 09 67 6f 74 6f 20 64  o!=0));...goto d
15c0: 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20 28 54 49 55  one;..}..if (TIU
15d0: 41 44 44 52 2d 3e 64 72 64 62 26 54 5f 54 52 4f  ADDR->drdb&T_TRO
15e0: 55 42 29 20 7b 0a 09 09 74 69 75 65 72 72 28 74  UB) {...tiuerr(t
15f0: 69 75 73 74 6f 70 28 29 2c 20 54 49 55 41 44 44  iustop(), TIUADD
1600: 52 2d 3e 64 72 64 62 29 3b 0a 09 09 67 6f 74 6f  R->drdb);...goto
1610: 20 64 6f 6e 65 3b 0a 09 7d 0a 09 73 77 69 74 63   done;..}..switc
1620: 68 20 28 73 29 20 7b 0a 0a 09 63 61 73 65 20 53  h (s) {...case S
1630: 53 54 4f 50 3a 0a 09 09 74 69 75 73 74 6f 70 28  STOP:...tiustop(
1640: 29 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  );...goto done;.
1650: 0a 09 63 61 73 65 20 53 52 45 41 44 3a 0a 09 09  ..case SREAD:...
1660: 69 66 20 28 28 54 49 55 41 44 44 52 2d 3e 64 72  if ((TIUADDR->dr
1670: 64 62 26 54 5f 53 49 47 4e 4c 29 20 3d 3d 20 30  db&T_SIGNL) == 0
1680: 29 20 7b 0a 09 09 09 74 69 75 65 72 72 28 74 69  ) {....tiuerr(ti
1690: 75 73 74 6f 70 28 29 2c 20 31 30 29 3b 0a 09 09  ustop(), 10);...
16a0: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 7d 0a  .goto done;...}.
16b0: 09 09 73 20 3d 20 35 31 33 20 2b 20 28 54 49 55  ..s = 513 + (TIU
16c0: 41 44 44 52 2d 3e 64 72 77 63 3c 3c 31 29 3b 0a  ADDR->drwc<<1);.
16d0: 09 09 69 66 20 28 28 54 49 55 41 44 44 52 2d 3e  ..if ((TIUADDR->
16e0: 64 72 64 62 26 54 5f 4f 44 44 29 20 21 3d 20 30  drdb&T_ODD) != 0
16f0: 29 0a 09 09 09 73 2b 2b 3b 0a 09 09 62 70 2d 3e  )....s++;...bp->
1700: 62 5f 77 63 6f 75 6e 74 20 3d 20 73 3b 0a 09 09  b_wcount = s;...
1710: 62 70 2d 3e 62 5f 62 6c 6b 6e 6f 20 3d 20 28 54  bp->b_blkno = (T
1720: 49 55 41 44 44 52 2d 3e 64 72 64 62 29 2e 6c 6f  IUADDR->drdb).lo
1730: 62 79 74 65 3b 0a 09 09 73 20 3d 20 53 52 45 41  byte;...s = SREA
1740: 44 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  D;...goto done;.
1750: 0a 09 63 61 73 65 20 53 57 52 49 54 45 3a 0a 09  ..case SWRITE:..
1760: 09 69 66 20 28 62 70 2d 3e 62 5f 77 63 6f 75 6e  .if (bp->b_wcoun
1770: 74 26 30 31 29 20 7b 0a 09 09 09 54 49 55 41 44  t&01) {....TIUAD
1780: 44 52 2d 3e 64 72 64 62 20 3d 20 62 70 2d 3e 62  DR->drdb = bp->b
1790: 5f 61 64 64 72 5b 62 70 2d 3e 62 5f 77 63 6f 75  _addr[bp->b_wcou
17a0: 6e 74 2d 31 5d 3b 0a 09 09 09 54 49 55 41 44 44  nt-1];....TIUADD
17b0: 52 2d 3e 64 72 73 74 20 3d 20 49 45 4e 41 42 4c  R->drst = IENABL
17c0: 45 7c 57 44 42 7c 47 4f 3b 0a 09 09 09 69 66 20  E|WDB|GO;....if 
17d0: 28 28 54 49 55 41 44 44 52 2d 3e 64 72 73 74 20  ((TIUADDR->drst 
17e0: 26 20 54 5f 49 44 4c 45 29 3d 3d 30 29 20 7b 0a  & T_IDLE)==0) {.
17f0: 09 09 09 09 74 69 75 2e 74 5f 73 74 61 74 65 20  ....tiu.t_state 
1800: 3d 20 53 57 53 49 47 3b 0a 09 09 09 09 74 69 75  = SWSIG;.....tiu
1810: 2e 74 5f 74 69 6d 65 20 3d 20 54 49 4d 4c 49 4d  .t_time = TIMLIM
1820: 3b 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  ;.....return;...
1830: 09 7d 0a 09 09 7d 0a 0a 09 63 61 73 65 20 53 57  .}...}...case SW
1840: 53 49 47 3a 0a 09 09 63 70 2d 3e 74 5f 66 6c 61  SIG:...cp->t_fla
1850: 67 73 20 3d 26 20 7e 54 5f 57 52 49 54 52 3b 0a  gs =& ~T_WRITR;.
1860: 09 09 54 49 55 41 44 44 52 2d 3e 64 72 64 62 20  ..TIUADDR->drdb 
1870: 3d 20 62 70 2d 3e 62 5f 62 6c 6b 6e 6f 3b 0a 09  = bp->b_blkno;..
1880: 09 54 49 55 41 44 44 52 2d 3e 64 72 73 74 20 3d  .TIUADDR->drst =
1890: 20 49 45 4e 41 42 4c 45 7c 57 53 42 7c 47 4f 3b   IENABLE|WSB|GO;
18a0: 0a 09 09 69 66 20 28 28 54 49 55 41 44 44 52 2d  ...if ((TIUADDR-
18b0: 3e 64 72 73 74 20 26 20 54 5f 49 44 4c 45 29 3d  >drst & T_IDLE)=
18c0: 3d 30 29 20 7b 0a 09 09 09 74 69 75 2e 74 5f 73  =0) {....tiu.t_s
18d0: 74 61 74 65 20 3d 20 53 57 44 4f 4e 45 3b 0a 09  tate = SWDONE;..
18e0: 09 09 74 69 75 2e 74 5f 74 69 6d 65 20 3d 20 54  ..tiu.t_time = T
18f0: 49 4d 4c 49 4d 3b 0a 09 09 09 72 65 74 75 72 6e  IMLIM;....return
1900: 3b 0a 09 09 7d 0a 0a 09 64 6f 6e 65 3a 0a 09 63  ;...}...done:..c
1910: 61 73 65 20 53 57 44 4f 4e 45 3a 0a 09 63 61 73  ase SWDONE:..cas
1920: 65 20 53 53 45 4c 3a 0a 09 09 69 66 20 28 62 70  e SSEL:...if (bp
1930: 20 26 26 20 74 69 75 2e 74 5f 61 63 74 66 29 0a   && tiu.t_actf).
1940: 09 09 09 74 69 75 2e 74 5f 61 63 74 66 20 3d 20  ...tiu.t_actf = 
1950: 62 70 2d 3e 61 76 5f 66 6f 72 77 3b 0a 09 09 69  bp->av_forw;...i
1960: 66 20 28 63 70 29 20 7b 0a 09 09 09 77 61 6b 65  f (cp) {....wake
1970: 75 70 28 63 70 29 3b 0a 09 09 09 63 70 2d 3e 74  up(cp);....cp->t
1980: 5f 66 6c 61 67 73 20 3d 7c 20 54 5f 44 4f 4e 45  _flags =| T_DONE
1990: 3b 0a 09 09 7d 0a 0a 09 64 65 66 61 75 6c 74 3a  ;...}...default:
19a0: 0a 09 09 69 66 20 28 54 49 55 41 44 44 52 2d 3e  ...if (TIUADDR->
19b0: 64 72 64 62 26 54 5f 57 54 53 54 53 20 26 26 20  drdb&T_WTSTS && 
19c0: 63 70 29 20 7b 0a 09 09 09 63 70 2d 3e 74 5f 66  cp) {....cp->t_f
19d0: 6c 61 67 73 20 3d 7c 20 54 5f 57 52 49 54 52 3b  lags =| T_WRITR;
19e0: 0a 09 09 09 77 61 6b 65 75 70 28 63 70 29 3b 0a  ....wakeup(cp);.
19f0: 09 09 7d 0a 09 09 6c 61 73 74 63 70 20 3d 20 63  ..}...lastcp = c
1a00: 70 3b 0a 09 09 77 68 69 6c 65 20 28 54 49 55 41  p;...while (TIUA
1a10: 44 44 52 2d 3e 64 72 64 62 26 54 5f 42 4b 53 54  DDR->drdb&T_BKST
1a20: 53 29 20 7b 0a 09 09 09 54 49 55 41 44 44 52 2d  S) {....TIUADDR-
1a30: 3e 64 72 73 74 20 3d 20 49 45 4e 41 42 4c 45 7c  >drst = IENABLE|
1a40: 52 43 48 7c 47 4f 3b 0a 09 09 09 69 66 20 28 28  RCH|GO;....if ((
1a50: 63 70 20 3d 20 74 69 75 70 74 72 28 54 49 55 41  cp = tiuptr(TIUA
1a60: 44 44 52 2d 3e 64 72 64 62 29 29 20 3d 3d 20 4e  DDR->drdb)) == N
1a70: 55 4c 4c 29 0a 09 09 09 09 74 69 75 65 72 72 28  ULL).....tiuerr(
1a80: 2d 31 2c 20 30 29 3b 0a 09 09 09 65 6c 73 65 20  -1, 0);....else 
1a90: 69 66 20 28 73 3d 3d 30 20 7c 7c 20 6c 61 73 74  if (s==0 || last
1aa0: 63 70 20 21 3d 20 63 70 29 20 7b 0a 09 09 09 09  cp != cp) {.....
1ab0: 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d 7c 20 28  cp->t_flags =| (
1ac0: 54 49 55 41 44 44 52 2d 3e 64 72 64 62 26 54 5f  TIUADDR->drdb&T_
1ad0: 53 45 4c 57 29 21 3d 30 3f 0a 09 09 09 09 09 54  SELW)!=0?......T
1ae0: 5f 52 41 56 4c 3a 54 5f 57 52 49 54 52 3b 0a 09  _RAVL:T_WRITR;..
1af0: 09 09 09 77 61 6b 65 75 70 28 63 70 29 3b 0a 09  ...wakeup(cp);..
1b00: 09 09 7d 0a 09 09 7d 0a 09 09 74 69 75 73 74 61  ..}...}...tiusta
1b10: 72 74 28 29 3b 0a 09 7d 0a 7d 0a 0a 74 69 75 73  rt();..}.}..tius
1b20: 74 6f 70 28 29 0a 7b 0a 09 72 65 67 69 73 74 65  top().{..registe
1b30: 72 20 69 6e 74 20 6c 61 73 74 63 68 61 6e 3b 0a  r int lastchan;.
1b40: 0a 09 6c 61 73 74 63 68 61 6e 20 3d 20 74 69 75  ..lastchan = tiu
1b50: 2e 74 5f 63 68 61 6e 3b 0a 09 74 69 75 2e 74 5f  .t_chan;..tiu.t_
1b60: 63 68 61 6e 20 3d 20 2d 31 3b 0a 09 74 69 75 2e  chan = -1;..tiu.
1b70: 74 5f 73 74 61 74 65 20 3d 20 30 3b 0a 09 54 49  t_state = 0;..TI
1b80: 55 41 44 44 52 2d 3e 64 72 73 74 20 3d 20 49 45  UADDR->drst = IE
1b90: 4e 41 42 4c 45 7c 53 54 4f 50 7c 47 4f 3b 0a 09  NABLE|STOP|GO;..
1ba0: 72 65 74 75 72 6e 28 6c 61 73 74 63 68 61 6e 29  return(lastchan)
1bb0: 3b 0a 7d 0a 0a 74 69 75 65 72 72 28 63 68 61 6e  ;.}..tiuerr(chan
1bc0: 2c 20 61 63 6f 64 65 29 0a 7b 0a 09 72 65 67 69  , acode).{..regi
1bd0: 73 74 65 72 20 73 74 72 75 63 74 20 74 69 75 63  ster struct tiuc
1be0: 68 20 2a 63 70 3b 0a 09 72 65 67 69 73 74 65 72  h *cp;..register
1bf0: 20 63 6f 64 65 3b 0a 0a 09 74 69 75 2e 74 5f 74   code;...tiu.t_t
1c00: 69 6d 6f 20 3d 20 30 3b 0a 09 63 6f 64 65 20 3d  imo = 0;..code =
1c10: 20 61 63 6f 64 65 3b 0a 09 69 66 20 28 28 63 70   acode;..if ((cp
1c20: 20 3d 20 74 69 75 70 74 72 28 63 68 61 6e 29 29   = tiuptr(chan))
1c30: 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 74 69 75 63   != NULL)...tiuc
1c40: 68 65 72 72 28 63 70 2c 20 63 6f 64 65 29 3b 0a  herr(cp, code);.
1c50: 09 65 6c 73 65 20 7b 0a 09 09 74 69 75 2e 74 5f  .else {...tiu.t_
1c60: 73 74 61 74 65 20 3d 20 30 3b 0a 09 09 74 69 75  state = 0;...tiu
1c70: 2e 74 5f 61 63 74 66 20 3d 20 30 3b 0a 09 09 66  .t_actf = 0;...f
1c80: 6f 72 20 28 63 70 20 3d 20 74 69 75 5f 64 63 68  or (cp = tiu_dch
1c90: 61 6e 3b 20 63 70 20 3c 20 26 74 69 75 5f 64 63  an; cp < &tiu_dc
1ca0: 68 61 6e 5b 32 2a 4e 43 48 41 4e 5d 3b 20 63 70  han[2*NCHAN]; cp
1cb0: 2b 2b 29 0a 09 09 09 74 69 75 63 68 65 72 72 28  ++)....tiucherr(
1cc0: 63 70 2c 20 63 6f 64 65 29 3b 0a 09 7d 0a 7d 0a  cp, code);..}.}.
1cd0: 0a 74 69 75 63 68 65 72 72 28 61 63 70 2c 20 63  .tiucherr(acp, c
1ce0: 6f 64 65 29 0a 73 74 72 75 63 74 20 74 69 75 63  ode).struct tiuc
1cf0: 68 20 2a 61 63 70 3b 0a 7b 0a 09 72 65 67 69 73  h *acp;.{..regis
1d00: 74 65 72 20 73 74 72 75 63 74 20 74 69 75 63 68  ter struct tiuch
1d10: 20 2a 63 70 3b 0a 0a 09 63 70 20 3d 20 61 63 70   *cp;...cp = acp
1d20: 3b 0a 09 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d  ;..cp->t_flags =
1d30: 26 20 7e 28 54 5f 57 52 49 54 52 7c 54 5f 52 41  & ~(T_WRITR|T_RA
1d40: 56 4c 29 3b 0a 09 63 70 2d 3e 74 5f 66 6c 61 67  VL);..cp->t_flag
1d50: 73 20 3d 7c 20 54 5f 45 52 52 4f 52 7c 54 5f 44  s =| T_ERROR|T_D
1d60: 4f 4e 45 3b 0a 09 63 70 2d 3e 74 5f 74 72 6f 75  ONE;..cp->t_trou
1d70: 62 20 3d 20 63 6f 64 65 3b 0a 09 77 61 6b 65 75  b = code;..wakeu
1d80: 70 28 63 70 29 3b 0a 7d 0a 0a 74 69 75 63 68 61  p(cp);.}..tiucha
1d90: 6e 28 64 65 76 29 0a 7b 0a 09 72 65 67 69 73 74  n(dev).{..regist
1da0: 65 72 20 73 74 72 75 63 74 20 74 69 75 63 68 20  er struct tiuch 
1db0: 2a 63 70 3b 0a 0a 09 69 66 20 28 28 63 70 20 3d  *cp;...if ((cp =
1dc0: 20 74 69 75 70 74 72 28 64 65 76 29 29 20 3d 3d   tiuptr(dev)) ==
1dd0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 75 2e 75 5f 65   NULL) {...u.u_e
1de0: 72 72 6f 72 20 3d 20 45 4e 58 49 4f 3b 0a 09 09  rror = ENXIO;...
1df0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
1e00: 0a 09 69 66 20 28 63 70 2d 3e 74 5f 66 6c 61 67  ..if (cp->t_flag
1e10: 73 26 28 54 5f 45 52 52 4f 52 7c 54 5f 45 4f 46  s&(T_ERROR|T_EOF
1e20: 29 29 20 7b 0a 09 09 69 66 20 28 63 70 2d 3e 74  )) {...if (cp->t
1e30: 5f 66 6c 61 67 73 26 54 5f 45 52 52 4f 52 29 0a  _flags&T_ERROR).
1e40: 09 09 09 75 2e 75 5f 65 72 72 6f 72 20 3d 20 45  ...u.u_error = E
1e50: 49 4f 3b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  IO;...return(NUL
1e60: 4c 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 63  L);..}..return(c
1e70: 70 29 3b 0a 7d 0a 0a 74 69 75 73 74 72 61 74 65  p);.}..tiustrate
1e80: 67 79 28 61 62 70 29 0a 73 74 72 75 63 74 20 62  gy(abp).struct b
1e90: 75 66 20 2a 61 62 70 3b 0a 7b 0a 09 72 65 67 69  uf *abp;.{..regi
1ea0: 73 74 65 72 20 73 74 72 75 63 74 20 62 75 66 20  ster struct buf 
1eb0: 2a 62 70 3b 0a 0a 09 62 70 20 3d 20 61 62 70 3b  *bp;...bp = abp;
1ec0: 0a 09 62 70 2d 3e 61 76 5f 66 6f 72 77 20 3d 20  ..bp->av_forw = 
1ed0: 4e 55 4c 4c 3b 0a 09 69 66 20 28 74 69 75 2e 74  NULL;..if (tiu.t
1ee0: 5f 61 63 74 66 3d 3d 4e 55 4c 4c 29 20 7b 0a 09  _actf==NULL) {..
1ef0: 09 74 69 75 2e 74 5f 61 63 74 66 20 3d 20 62 70  .tiu.t_actf = bp
1f00: 3b 0a 09 09 74 69 75 73 74 61 72 74 28 29 3b 0a  ;...tiustart();.
1f10: 09 7d 20 65 6c 73 65 0a 09 09 74 69 75 2e 74 5f  .} else...tiu.t_
1f20: 61 63 74 6c 2d 3e 61 76 5f 66 6f 72 77 20 3d 20  actl->av_forw = 
1f30: 62 70 3b 0a 09 74 69 75 2e 74 5f 61 63 74 6c 20  bp;..tiu.t_actl 
1f40: 3d 20 62 70 3b 0a 7d 0a 0a 73 6e 73 74 61 74 28  = bp;.}..snstat(
1f50: 64 65 76 2c 20 76 29 0a 7b 0a 09 72 65 67 69 73  dev, v).{..regis
1f60: 74 65 72 20 73 74 72 75 63 74 20 74 69 75 20 2a  ter struct tiu *
1f70: 63 70 3b 0a 09 72 65 67 69 73 74 65 72 20 69 6e  cp;..register in
1f80: 74 20 63 68 61 6e 6e 6f 3b 0a 0a 09 63 68 61 6e  t channo;...chan
1f90: 6e 6f 20 3d 20 64 65 76 2e 64 5f 6d 69 6e 6f 72  no = dev.d_minor
1fa0: 3b 0a 09 69 66 20 28 28 63 70 20 3d 20 74 69 75  ;..if ((cp = tiu
1fb0: 70 74 72 28 63 68 61 6e 6e 6f 29 29 3d 3d 4e 55  ptr(channo))==NU
1fc0: 4c 4c 29 0a 09 09 72 65 74 75 72 6e 3b 0a 09 73  LL)...return;..s
1fd0: 77 69 74 63 68 20 28 75 2e 75 5f 61 72 67 5b 31  witch (u.u_arg[1
1fe0: 5d 29 20 7b 0a 0a 09 2f 2a 20 73 65 74 20 73 69  ]) {.../* set si
1ff0: 67 6e 61 6c 20 62 79 74 65 20 2a 2f 0a 09 63 61  gnal byte */..ca
2000: 73 65 20 30 3a 0a 09 09 63 70 2d 3e 74 5f 6f 73  se 0:...cp->t_os
2010: 69 67 20 3d 20 66 75 62 79 74 65 28 75 2e 75 5f  ig = fubyte(u.u_
2020: 61 72 67 5b 30 5d 29 3b 0a 09 09 72 65 74 75 72  arg[0]);...retur
2030: 6e 3b 0a 0a 09 2f 2a 20 67 65 74 20 73 69 67 6e  n;.../* get sign
2040: 61 6c 20 62 79 74 65 20 2a 2f 0a 09 63 61 73 65  al byte */..case
2050: 20 31 3a 0a 09 09 73 75 77 6f 72 64 28 75 2e 75   1:...suword(u.u
2060: 5f 61 72 67 5b 30 5d 2c 20 63 70 2d 3e 74 5f 69  _arg[0], cp->t_i
2070: 73 69 67 29 3b 0a 09 09 63 70 2d 3e 74 5f 69 73  sig);...cp->t_is
2080: 69 67 20 3d 20 30 3b 0a 09 09 72 65 74 75 72 6e  ig = 0;...return
2090: 3b 0a 0a 09 2f 2a 20 67 65 74 20 63 68 61 6e 6e  ;.../* get chann
20a0: 65 6c 20 23 20 2a 2f 0a 09 63 61 73 65 20 32 3a  el # */..case 2:
20b0: 0a 09 09 73 75 77 6f 72 64 28 75 2e 75 5f 61 72  ...suword(u.u_ar
20c0: 67 5b 30 5d 2c 20 63 68 61 6e 6e 6f 29 3b 0a 09  g[0], channo);..
20d0: 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a 20 67 65  .return;.../* ge
20e0: 74 20 74 72 6f 75 62 6c 65 20 63 6f 64 65 20 2a  t trouble code *
20f0: 2f 0a 09 63 61 73 65 20 33 3a 0a 09 09 73 75 77  /..case 3:...suw
2100: 6f 72 64 28 75 2e 75 5f 61 72 67 5b 30 5d 2c 20  ord(u.u_arg[0], 
2110: 63 70 2d 3e 74 5f 74 72 6f 75 62 29 3b 0a 09 09  cp->t_troub);...
2120: 63 70 2d 3e 74 5f 74 72 6f 75 62 20 3d 20 30 3b  cp->t_troub = 0;
2130: 0a 09 09 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d  ...cp->t_flags =
2140: 26 20 7e 54 5f 45 52 52 4f 52 3b 0a 09 09 72 65  & ~T_ERROR;...re
2150: 74 75 72 6e 3b 0a 0a 09 2f 2a 20 63 6c 65 61 72  turn;.../* clear
2160: 20 45 4f 46 20 72 65 71 75 65 73 74 20 2a 2f 0a   EOF request */.
2170: 09 63 61 73 65 20 34 3a 0a 09 09 69 66 20 28 63  .case 4:...if (c
2180: 68 61 6e 6e 6f 20 3e 3d 20 36 34 29 0a 09 09 09  hanno >= 64)....
2190: 63 70 20 3d 20 74 69 75 70 74 72 28 63 68 61 6e  cp = tiuptr(chan
21a0: 6e 6f 20 2d 20 36 34 29 3b 0a 09 09 63 70 2d 3e  no - 64);...cp->
21b0: 74 5f 66 6c 61 67 73 20 3d 26 20 7e 54 5f 45 4f  t_flags =& ~T_EO
21c0: 46 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 0a 09 2f  F;...return;.../
21d0: 2a 20 73 65 74 20 45 4f 46 20 72 65 71 75 65 73  * set EOF reques
21e0: 74 20 2a 2f 0a 09 63 61 73 65 20 35 3a 0a 09 09  t */..case 5:...
21f0: 69 66 20 28 63 68 61 6e 6e 6f 20 3e 3d 20 36 34  if (channo >= 64
2200: 29 0a 09 09 09 63 70 20 3d 20 74 69 75 70 74 72  )....cp = tiuptr
2210: 28 63 68 61 6e 6e 6f 20 2d 20 36 34 29 3b 0a 09  (channo - 64);..
2220: 09 63 70 2d 3e 74 5f 66 6c 61 67 73 20 3d 7c 20  .cp->t_flags =| 
2230: 54 5f 45 4f 46 3b 0a 09 09 77 61 6b 65 75 70 28  T_EOF;...wakeup(
2240: 63 70 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 0a  cp);...return;..
2250: 09 7d 0a 09 75 2e 75 5f 65 72 72 6f 72 20 3d 20  .}..u.u_error = 
2260: 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 74 69 75 70 74  EINVAL;.}..tiupt
2270: 72 28 64 65 76 29 0a 7b 0a 09 72 65 67 69 73 74  r(dev).{..regist
2280: 65 72 20 73 74 72 75 63 74 20 74 69 75 63 68 20  er struct tiuch 
2290: 2a 63 70 3b 0a 09 72 65 67 69 73 74 65 72 20 69  *cp;..register i
22a0: 6e 74 20 64 3b 0a 0a 09 64 20 3d 20 64 65 76 2e  nt d;...d = dev.
22b0: 64 5f 6d 69 6e 6f 72 20 26 20 30 31 37 37 3b 0a  d_minor & 0177;.
22c0: 09 69 66 20 28 64 3c 4e 43 48 41 4e 29 0a 09 09  .if (d<NCHAN)...
22d0: 72 65 74 75 72 6e 28 26 74 69 75 5f 64 63 68 61  return(&tiu_dcha
22e0: 6e 5b 64 5d 29 3b 0a 09 69 66 20 28 64 3e 3d 36  n[d]);..if (d>=6
22f0: 34 20 26 26 20 64 3c 4e 43 48 41 4e 2b 36 34 29  4 && d<NCHAN+64)
2300: 0a 09 09 72 65 74 75 72 6e 28 26 74 69 75 5f 63  ...return(&tiu_c
2310: 63 68 61 6e 5b 64 2d 36 34 5d 29 3b 0a 09 72 65  chan[d-64]);..re
2320: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a     turn(NULL);.}..