xref: /csrg-svn/sys/luna68k/stand/conf.c (revision 63199)
157081Sakito /*
257081Sakito  * Copyright (c) 1992 OMRON Corporation.
3*63199Sbostic  * Copyright (c) 1992, 1993
4*63199Sbostic  *	The Regents of the University of California.  All rights reserved.
557081Sakito  *
657081Sakito  * This code is derived from software contributed to Berkeley by
757081Sakito  * OMRON Corporation.
857081Sakito  *
957081Sakito  * %sccs.include.redist.c%
1057081Sakito  *
11*63199Sbostic  *	@(#)conf.c	8.1 (Berkeley) 06/10/93
1257081Sakito  */
1357081Sakito 
1457081Sakito #include <luna68k/stand/saio.h>
1557081Sakito 
devread(io)1657081Sakito devread(io)
1757081Sakito 	register struct iob *io;
1857081Sakito {
1957081Sakito 	int cc;
2057081Sakito 
2157081Sakito 	io->i_flgs |= F_RDDATA;
2257081Sakito 	io->i_error = 0;
2357081Sakito 	cc = (*devsw[io->i_dev].dv_strategy)(io, READ);
2457081Sakito 	io->i_flgs &= ~F_TYPEMASK;
2557081Sakito 	return (cc);
2657081Sakito }
2757081Sakito 
devwrite(io)2857081Sakito devwrite(io)
2957081Sakito 	register struct iob *io;
3057081Sakito {
3157081Sakito 	int cc;
3257081Sakito 
3357081Sakito 	io->i_flgs |= F_WRDATA;
3457081Sakito 	io->i_error = 0;
3557081Sakito 	cc = (*devsw[io->i_dev].dv_strategy)(io, WRITE);
3657081Sakito 	io->i_flgs &= ~F_TYPEMASK;
3757081Sakito 	return (cc);
3857081Sakito }
3957081Sakito 
devopen(io)4057081Sakito devopen(io)
4157081Sakito 	register struct iob *io;
4257081Sakito {
4357081Sakito 
4457081Sakito 	(*devsw[io->i_dev].dv_open)(io);
4557081Sakito }
4657081Sakito 
devclose(io)4757081Sakito devclose(io)
4857081Sakito 	register struct iob *io;
4957081Sakito {
5057081Sakito 
5157081Sakito 	(*devsw[io->i_dev].dv_close)(io);
5257081Sakito }
5357081Sakito 
devioctl(io,cmd,arg)5457081Sakito devioctl(io, cmd, arg)
5557081Sakito 	register struct iob *io;
5657081Sakito 	int cmd;
5757081Sakito 	caddr_t arg;
5857081Sakito {
5957081Sakito 
6057081Sakito 	return ((*devsw[io->i_dev].dv_ioctl)(io, cmd, arg));
6157081Sakito }
6257081Sakito 
6357081Sakito /*ARGSUSED*/
6457081Sakito nullsys(io)
6557081Sakito 	struct iob *io;
6657081Sakito {
6757081Sakito 
6857081Sakito 	;
6957081Sakito }
7057081Sakito 
7157081Sakito /*ARGSUSED*/
7257081Sakito nullioctl(io, cmd, arg)
7357081Sakito 	struct iob *io;
7457081Sakito 	int cmd;
7557081Sakito 	caddr_t arg;
7657081Sakito {
7757081Sakito 
7857081Sakito 	return (ECMD);
7957081Sakito }
8057081Sakito 
8157081Sakito int	nullsys(), nullioctl();
8257081Sakito int	sdstrategy(), sdopen(), sdioctl();
8357081Sakito 
8457081Sakito struct devsw devsw[] = {
8557081Sakito 	{ "sd",	sdstrategy,	sdopen,		nullsys,	nullioctl },
8657081Sakito 	{ 0, 0, 0, 0, 0 },
8757081Sakito };
8857081Sakito 
8957081Sakito dev_t
make_device(str)9057081Sakito make_device(str)
9157081Sakito 	char *str;
9257081Sakito {
9357081Sakito 	char *cp;
9457081Sakito 	struct devsw *dp;
9557081Sakito 	int major, unit, part;
9657081Sakito 
9757081Sakito 	/*
9857081Sakito 	 * parse path strings
9957081Sakito 	 */
10057081Sakito 							/* find end of dev type name */
10157081Sakito 	for (cp = str; *cp && *cp != '('; cp++)
10257081Sakito 			;
10357081Sakito 	if (*cp != '(') {
10457081Sakito 		return (-1);
10557081Sakito 	}
10657081Sakito 							/* compare dev type name */
10757081Sakito 	*cp = '\0';
10857081Sakito 	for (dp = devsw; dp->dv_name; dp++)
10957081Sakito 		if (!strcmp(str, dp->dv_name))
11057081Sakito 			break;
11157081Sakito 	*cp++ = '(';
11257081Sakito 	if (dp->dv_name == NULL) {
11357081Sakito 		return (-1);
11457081Sakito 	}
11557081Sakito 	major = dp - devsw;
11657081Sakito 							/* get unit number */
11757081Sakito 	unit = *cp++ - '0';
11857081Sakito 	if (*cp >= '0' && *cp <= '9')
11957081Sakito 		unit = unit * 10 + *cp++ - '0';
12057081Sakito 	if (unit < 0 || unit > 63) {
12157081Sakito 		return (-1);
12257081Sakito 	}
12357081Sakito 							/* get partition offset */
12457081Sakito 	if (*cp++ != ',') {
12557081Sakito 		return (-1);
12657081Sakito 	}
12757081Sakito 	part = *cp - '0';
12857081Sakito 							/* check out end of dev spec */
12957081Sakito 	for (;;) {
13057081Sakito 		if (*cp == ')')
13157081Sakito 			break;
13257081Sakito 		if (*cp++)
13357081Sakito 			continue;
13457081Sakito 		return (-1);
13557081Sakito 	}
13657081Sakito 
13757081Sakito 	return(major << 8 | unit << 3 | part);
13857081Sakito }
139