| plan 9 kernel history: overview | file list | diff list |
1991/1107/port/devdk.c (diff list | history)
| 1991/1105/sys/src/9/port/devdk.c:12,22 – 1991/1107/sys/src/9/port/devdk.c:12,17 (short | long | prev | next) | ||
| 1990/0911 | ||
| 1990/0312 | enum { /* | |
| 1991/1105/sys/src/9/port/devdk.c:97,102 – 1991/1107/sys/src/9/port/devdk.c:92,98 | ||
| 1990/0312 | */ struct Line { QLock; | |
| 1991/1107 | int lineno; | |
| 1990/0312 | Rendez r; /* wait here for dial */ int state; /* dial state */ int err; /* dialing error (if non zero) */ | |
| 1991/1105/sys/src/9/port/devdk.c:107,113 – 1991/1107/sys/src/9/port/devdk.c:103,108 | ||
| 1990/0312 | char addr[64]; char raddr[64]; char ruser[32]; | |
| 1991/1105/sys/src/9/port/devdk.c:124,137 – 1991/1107/sys/src/9/port/devdk.c:119,134 | ||
| 1990/0312 | int lines; /* number of lines */ int ncsc; /* csc line number */ | |
| 1990/1101 | Chan *csc; | |
| 1990/0312 |
| |
| 1991/1107 | Line **linep; | |
| 1990/0707 | int restart; | |
| 1990/0911 | int urpwindow; | |
| 1990/1101 | Rendez timer; | |
| 1990/1210 | int closeall; /* set when we receive a closeall message */ Rendez closeallr; /* wait here for a closeall */ | |
| 1991/1107 | Block *alloc; | |
| 1990/0312 | }; | |
| 1991/1107 | static Dk *dk; | |
| 1990/1101 | static Lock dklock; | |
| 1990/0312 | /* | |
| 1991/1105/sys/src/9/port/devdk.c:217,230 – 1991/1107/sys/src/9/port/devdk.c:214,229 | ||
| 1990/1101 | * Look for a dk struct with a name. If none exists, create one. */ static Dk * | |
| 1991/1107 | dkalloc(char *name, int ncsc, int lines) | |
| 1990/0312 | { Dk *dp; | |
| 1990/1101 | Dk *freep; | |
| 1991/1107 | Block *bp; int i, n; | |
| 1990/0312 | ||
| 1990/1101 | lock(&dklock); freep = 0; | |
| 1990/0312 |
| |
| 1991/1107 | for(dp = dk; dp < &dk[conf.dkif]; dp++){ | |
| 1990/1101 | if(strcmp(name, dp->name) == 0){ unlock(&dklock); return dp; | |
| 1991/1105/sys/src/9/port/devdk.c:236,246 – 1991/1107/sys/src/9/port/devdk.c:235,276 | ||
| 1990/1101 | unlock(&dklock); | |
| 1990/11211 | error(Enoifc); | |
| 1990/1101 | } | |
| 1991/1107 | if(lines == 0) errors("unknown dk interface"); /* * init the structures */ | |
| 1990/1101 | dp = freep; dp->opened = 0; dp->s = 0; | |
| 1991/1107 | dp->ncsc = ncsc; dp->lines = lines; | |
| 1990/1101 | strncpy(dp->name, name, sizeof(freep->name)); | |
| 1991/1107 | /* * allocate memory for line structures */ n = sizeof(Line*)*dp->lines; bp = allocb(n); if(bp->lim - bp->base < n){ unlock(&dklock); errors("too many lines"); } dp->linep = (Line **)bp->base; bp->wptr += n; dp->alloc = bp; for(i = 0; i < n; i++){ if(bp->lim - bp->wptr < sizeof(Line)){ bp = allocb(sizeof(Line)*n); bp->next = dp->alloc; dp->alloc = bp; } dp->linep[i] = (Line*)bp->wptr; dp->linep[i]->lineno = i; bp->wptr += sizeof(Line); } | |
| 1990/1101 | unlock(&dklock); return dp; | |
| 1990/0312 | } | |
| 1991/1105/sys/src/9/port/devdk.c:281,287 – 1991/1107/sys/src/9/port/devdk.c:311,317 | ||
| 1990/1101 | * hang up all datakit connections */ for(i=dp->ncsc; i < dp->lines; i++) | |
| 1991/1107 | dkhangup(dp->linep[i]); | |
| 1990/1101 | /* * wakeup the timer so it can die | |
| 1991/1105/sys/src/9/port/devdk.c:344,350 – 1991/1107/sys/src/9/port/devdk.c:374,380 | ||
| 1990/0312 | return; } | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | if(canqlock(lp)){ if(lp->rq) PUTNEXT(lp->rq, bp); | |
| 1991/1105/sys/src/9/port/devdk.c:385,391 – 1991/1107/sys/src/9/port/devdk.c:415,421 | ||
| 1990/0312 | Line *lp; dp = &dk[s->dev]; | |
| 1991/1107 | q->other->ptr = q->ptr = lp = dp->linep[s->id]; | |
| 1990/0312 | lp->dp = dp; | |
| 1990/1101 | lock(dp); if(dp->opened==0 || streamenter(dp->s)<0){ | |
| 1991/1105/sys/src/9/port/devdk.c:449,470 – 1991/1107/sys/src/9/port/devdk.c:479,500 | ||
| 1990/1101 | */ switch(lp->state){ | |
| 1990/0312 | case Lrclose: | |
| 1990/1101 |
| |
| 1991/1107 | dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); | |
| 1990/0312 | lp->state = Lclosed; break; case Lackwait: | |
| 1990/1101 |
| |
| 1991/1107 | dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); | |
| 1990/0312 | lp->state = Llclose; break; case Llistening: | |
| 1990/1101 |
| |
| 1991/1107 | dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); | |
| 1990/0312 | lp->state = Llclose; break; case Lconnected: | |
| 1990/1101 |
| |
| 1991/1107 | dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); | |
| 1990/0312 | lp->state = Llclose; break; } | |
| 1991/1105/sys/src/9/port/devdk.c:506,512 – 1991/1107/sys/src/9/port/devdk.c:536,542 | ||
| 1990/0312 | lp = (Line *)q->ptr; dp = lp->dp; | |
| 1991/1107 | line = lp->lineno; | |
| 1990/0312 | ||
| 1990/0911 | bp = padb(bp, 2); | |
| 1990/0312 | bp->rptr[0] = line; | |
| 1991/1105/sys/src/9/port/devdk.c:590,603 – 1991/1107/sys/src/9/port/devdk.c:620,631 | ||
| 1990/0312 | /* | |
| 1990/1101 | * set up | |
| 1990/0312 | */ | |
| 1990/1101 |
| |
| 1991/1107 | dp = dkalloc(name, ncsc, lines); | |
| 1990/1101 | lock(dp); if(dp->opened){ unlock(dp); | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } | |
| 1990/1101 |
| |
| 1991/1105/sys/src/9/port/devdk.c:649,655 – 1991/1107/sys/src/9/port/devdk.c:677,682 | ||
| 1990/0312 | Dlistenqid, Draddrqid, Duserqid, | |
| 1991/1105/sys/src/9/port/devdk.c:669,675 – 1991/1107/sys/src/9/port/devdk.c:696,701 | ||
| 1990/0312 | Dirtab dksubdir[]={ | |
| 1990/11211 | "addr", {Daddrqid}, 0, 0600, "listen", {Dlistenqid}, 0, 0600, | |
| 1990/0312 | }; | |
| 1991/1105/sys/src/9/port/devdk.c:681,686 – 1991/1107/sys/src/9/port/devdk.c:707,713 | ||
| 1990/0312 | void dkreset(void) { | |
| 1991/1107 | dk = (Dk*)ialloc(conf.dkif*sizeof(Dk), 0); | |
| 1990/0321 | newqinfo(&dkmuxinfo); | |
| 1990/0312 | } | |
| 1991/1105/sys/src/9/port/devdk.c:728,734 – 1991/1107/sys/src/9/port/devdk.c:755,761 | ||
| 1990/0312 | */ | |
| 1990/0722 | if(*spec == 0) spec = "dk"; | |
| 1990/1101 |
| |
| 1991/1107 | dp = dkalloc(spec, 0, 0); | |
| 1990/1101 | /* * return the new channel | |
| 1991/1105/sys/src/9/port/devdk.c:778,784 – 1991/1107/sys/src/9/port/devdk.c:805,811 | ||
| 1990/0312 | { extern Qinfo dkinfo; Stream *s; | |
| 1991/1107 | Line *lp; | |
| 1990/0312 | Dk *dp; int line; | |
| 1991/1105/sys/src/9/port/devdk.c:794,814 – 1991/1107/sys/src/9/port/devdk.c:821,841 | ||
| 1990/0319 | /* | |
| 1990/1126 | * get an unused device and open its control file | |
| 1990/0312 | */ | |
| 1991/1107 | for(line = dp->ncsc+1; line < dp->lines; line++){ lp = dp->linep[line]; | |
| 1990/0312 | if(lp->state == Lclosed && canqlock(lp)){ if(lp->state != Lclosed){ qunlock(lp); continue; } | |
| 1990/11211 |
| |
| 1991/1107 | c->qid.path = STREAMQID(line, Sctlqid); lp->state = Lopened; qunlock(lp); | |
| 1990/0312 | break; } } | |
| 1991/1107 | if(line == dp->lines) | |
| 1990/11211 | error(Enodev); | |
| 1990/1101 |
| |
| 1990/0312 | streamopen(c, &dkinfo); pushq(c->stream, &urpinfo); | |
| 1990/0319 | break; | |
| 1991/1105/sys/src/9/port/devdk.c:826,832 – 1991/1107/sys/src/9/port/devdk.c:853,858 | ||
| 1990/0319 | case Daddrqid: case Draddrqid: case Duserqid: | |
| 1990/0312 | /* | |
| 1990/0319 | * read only files */ | |
| 1991/1105/sys/src/9/port/devdk.c:877,883 – 1991/1107/sys/src/9/port/devdk.c:903,909 | ||
| 1990/0319 | return devdirread(c, a, n, dksubdir, Nsubdir, streamgen); } | |
| 1990/11211 |
| |
| 1991/1107 | lp = dk[c->dev].linep[STREAMID(c->qid.path)]; | |
| 1990/11211 | switch(STREAMTYPE(c->qid.path)){ | |
| 1990/0312 | case Daddrqid: | |
| 1991/0411 | return stringread(c, a, n, lp->addr, offset); | |
| 1991/1105/sys/src/9/port/devdk.c:1028,1034 – 1991/1107/sys/src/9/port/devdk.c:1054,1060 | ||
| 1990/1101 | ||
| 1990/11211 | line = STREAMID(c->qid.path); | |
| 1990/0312 | dp = &dk[c->dev]; | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | /* * only dial on virgin lines | |
| 1991/1105/sys/src/9/port/devdk.c:1272,1278 – 1991/1107/sys/src/9/port/devdk.c:1298,1304 | ||
| 1990/0312 | print("dklisten: illegal line %d\n", lineno); continue; } | |
| 1991/1107 | lp = dp->linep[lineno]; | |
| 1990/0312 | ts = strtoul(field[1], 0, 0); /* | |
| 1991/1105/sys/src/9/port/devdk.c:1338,1346 – 1991/1107/sys/src/9/port/devdk.c:1364,1371 | ||
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } | |
| 1991/1107 | DPRINT("src(%s)user(%s)dest(%s)w(%d)\n", lp->raddr, lp->ruser, lp->addr, W_TRAF(lp->window)); | |
| 1990/0312 | lp->timestamp = ts; lp->state = Lconnected; | |
| 1991/1105/sys/src/9/port/devdk.c:1365,1371 – 1991/1107/sys/src/9/port/devdk.c:1390,1396 | ||
| 1990/0312 | Line *lp; dp = &dk[c->dev]; | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | /* * open the data file (c is a control file) | |
| 1991/1105/sys/src/9/port/devdk.c:1398,1404 – 1991/1107/sys/src/9/port/devdk.c:1423,1429 | ||
| 1990/0312 | long wins; Line *lp; | |
| 1990/11211 |
| |
| 1991/1107 | lp = dk[c->dev].linep[STREAMID(c->qid.path)]; | |
| 1990/0312 | if(lp->window == 0) lp->window = 64; sprint(buf, "init %d %d", lp->window, Streamhi); | |
| 1991/1105/sys/src/9/port/devdk.c:1496,1502 – 1991/1107/sys/src/9/port/devdk.c:1521,1527 | ||
| 1990/1101 | dkmesg(c, T_CHG, D_CLOSE, line, 0); | |
| 1990/1022 | return; } | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | switch (lp->state) { case Ldialing: | |
| 1991/1105/sys/src/9/port/devdk.c:1532,1538 – 1991/1107/sys/src/9/port/devdk.c:1557,1563 | ||
| 1990/1101 | dkmesg(c, T_CHG, D_CLOSE, line, 0); | |
| 1990/1022 | return; } | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | switch (lp->state) { case Llclose: case Lclosed: | |
| 1991/1105/sys/src/9/port/devdk.c:1552,1558 – 1991/1107/sys/src/9/port/devdk.c:1577,1583 | ||
| 1990/1101 | * datakit wants us to close all lines */ | |
| 1990/1022 | for(line = dp->ncsc+1; line < dp->lines; line++){ | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/1022 | switch (lp->state) { case Ldialing: | |
| 1991/1105/sys/src/9/port/devdk.c:1601,1607 – 1991/1107/sys/src/9/port/devdk.c:1626,1632 | ||
| 1990/0312 | if(line < 0 || line >= dp->lines) return; | |
| 1991/1107 | lp = dp->linep[line]; | |
| 1990/0312 | if(lp->state != Ldialing) return; | |
| 1991/1105/sys/src/9/port/devdk.c:1646,1652 – 1991/1107/sys/src/9/port/devdk.c:1671,1677 | ||
| 1990/1101 | * hang up any calls waiting for the dk */ for (i=dp->ncsc+1; i<dp->lines; i++){ | |
| 1991/1107 | lp = dp->linep[i]; | |
| 1990/1101 | switch(lp->state){ case Llclose: lp->state = Lclosed; | |
| 1991/1105/sys/src/9/port/devdk.c:1659,1664 – 1991/1107/sys/src/9/port/devdk.c:1684,1690 | ||
| 1990/1101 | } if(c) close(c); | |
| 1991/1107 | freeb(dp->alloc); | |
| 1990/1101 | return; } | |
| 1991/1105/sys/src/9/port/devdk.c:1682,1688 – 1991/1107/sys/src/9/port/devdk.c:1708,1714 | ||
| 1990/1101 | * timeout calls that take to long */ for (i=dp->ncsc+1; i<dp->lines; i++){ | |
| 1991/1107 | lp = dp->linep[i]; | |
| 1990/1101 | switch(lp->state){ case Llclose: dkmesg(c, T_CHG, D_CLOSE, i, 0); | |