|
|
researchv10 Norman
/*
* MSCP device address routines
*/
#include "mkconf.h"
/*
* addressing stuff
*/
#define a_adp addr[0] /* controller number */
#define a_unit addr[1] /* unit number */
#define a_type addr[2] /* controller type */
mscpsyntax(dp, ap, n)
register Dev *dp;
register char **ap;
register int n;
{
register int i;
register Mdev *mp;
dp->a_type = dp->a_unit = -1;
while (--n > 0) {
if (strcmp(*ap, "unit") == 0) {
if (--n < 0) {
fprint(STDERR, "%s %d: no unit number\n",
dp->mdev->name, dp->id);
errs++;
return (1);
}
dp->a_unit = nconv(*++ap);
ap++;
continue;
}
if ((mp = mdlook(*ap)) == NULL
|| mp->adptype != AMSCP) {
fprint(STDERR, "%s %d: bad word %s\n",
dp->mdev->name, dp->id, *ap);
errs++;
return (1);
}
if (--n < 0) {
fprint(STDERR, "%s %d: no ctl number\n",
dp->mdev->name, dp->id);
errs++;
return (1);
}
for (i = 0; i <= nmscp; i++)
if (mscpsw[i].dev == mp)
break;
if (i > nmscp) {
fprint(STDERR, "%s %d %s: mscp gok\n",
dp->mdev->name, dp->id, mp->name);
errs++;
return (1);
}
dp->a_type = i;
dp->a_adp = nconv(*++ap);
++ap;
}
if (dp->a_type < 0 || dp->a_unit < 0) {
fprint(STDERR, "%s %d: missing ctl or unit\n",
dp->mdev->name, dp->id);
errs++;
return (1);
}
return (0);
}
mscpfixup(dp)
register Dev *dp;
{
register Dev *ep;
for (ep = dlist; ep; ep = ep->next)
if (ep->mdev->adptype == dp->mdev->atype
&& ep->id == dp->a_adp)
break;
if (ep == NULL) {
fprint(STDERR, "%s %d: orphan mscp device\n", dp->mdev->name, dp->id);
errs++;
return;
}
dp->parent = ep;
}
mscpputaddr(fd, dp)
int fd;
register Dev *dp;
{
register int count;
register Mdev *mp;
static int didtab = 0;
if (didtab == 0) {
mscptab(fd);
didtab++;
}
mp = dp->mdev;
count = 0;
fprint(fd, "struct msaddr %saddr[] = {\n", mp->tag);
for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) {
while (count++ < dp->id)
fprint(fd, "\t{-1},\n");
fprint(fd, "\t{%ld, %ld, %ld},\n", dp->a_adp, dp->a_type, dp->a_unit);
}
count *= mp->rept;
fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count);
putstrs(fd, mp, count);
}
/*
* write the mscp port table
* do it here so it only exists if there are mscp devices
*
* assume <sys/mscp.h> was included in cfdata.h or something
*/
mscptab(fd)
int fd;
{
register int i;
register int max;
max = 0;
for (i = 0; i <= nmscp; i++)
if (mscpsw[i].used) {
fprint(fd, "extern struct msportsw %sport;\n", mscpsw[i].dev->tag);
max = i;
}
fprint(fd, "int nmsport = %d;\nstruct msportsw *msportsw[] = {\n", max+1);
for (i = 0; i <= max; i++)
if (mscpsw[i].used)
fprint(fd, "\t&%sport,\t/* %d */\n",
mscpsw[i].dev->tag, i);
else
fprint(fd, "\tNULL,\n");
fprint(fd, "};\n");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.