V10/lsys/mkconf/mscpdev.c

/*
 * 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");
}