xref: /csrg-svn/sys/stand.att/dev.c (revision 49084)
133510Sbostic /*
233510Sbostic  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
333510Sbostic  * All rights reserved.
433510Sbostic  *
544516Sbostic  * %sccs.include.redist.c%
633510Sbostic  *
7*49084Sbostic  *	@(#)dev.c	7.11 (Berkeley) 05/04/91
833510Sbostic  */
933510Sbostic 
1040501Sroot #include "sys/param.h"
1145792Sbostic #include "stand/saio.h"			/* used from machine/stand dir */
12*49084Sbostic #include <setjmp.h>
1333510Sbostic 
1433670Sbostic /*
15*49084Sbostic  * NB: the value "io->i_dev", used to offset the devsw[] array in the
16*49084Sbostic  * routines below, is munged by the machine specific stand Makefiles
17*49084Sbostic  * to work for certain boots.
1833670Sbostic  */
1933670Sbostic 
20*49084Sbostic jmp_buf exception;
21*49084Sbostic 
2233510Sbostic devread(io)
2333510Sbostic 	register struct iob *io;
2433510Sbostic {
2533510Sbostic 	int cc;
2633510Sbostic 
2733510Sbostic 	io->i_flgs |= F_RDDATA;
2833510Sbostic 	io->i_error = 0;
2948977Sbostic 	cc = (*devsw[io->i_dev].dv_strategy)(io, F_READ);
3033510Sbostic 	io->i_flgs &= ~F_TYPEMASK;
31*49084Sbostic 	if (scankbd())
32*49084Sbostic 		_longjmp(&exception, 1);
3333510Sbostic 	return (cc);
3433510Sbostic }
3533510Sbostic 
3633510Sbostic devwrite(io)
3733510Sbostic 	register struct iob *io;
3833510Sbostic {
3933510Sbostic 	int cc;
4033510Sbostic 
4133510Sbostic 	io->i_flgs |= F_WRDATA;
4233510Sbostic 	io->i_error = 0;
43*49084Sbostic 	cc = (*devsw[io->i_dev].dv_strategy)(io, F_WRITE);
4433510Sbostic 	io->i_flgs &= ~F_TYPEMASK;
45*49084Sbostic 	if (scankbd())
46*49084Sbostic 		_longjmp(&exception, 1);
4733510Sbostic 	return (cc);
4833510Sbostic }
4933510Sbostic 
5033510Sbostic devopen(io)
5133510Sbostic 	register struct iob *io;
5233510Sbostic {
5333670Sbostic 	int ret;
5433670Sbostic 
5540502Smckusick 	if (!(ret = (*devsw[io->i_dev].dv_open)(io)))
5633670Sbostic 		return (0);
5740502Smckusick 	printf("%s(%d,%d,%d,%d): ", devsw[io->i_dev].dv_name,
5833670Sbostic 		io->i_adapt, io->i_ctlr, io->i_unit, io->i_part);
5933670Sbostic 	switch(ret) {
6034517Skarels 	case EIO:
6134517Skarels 		break;		/* already reported */
6233670Sbostic 	case EADAPT:
6334517Skarels 		printf("bad adaptor number\n");
6433670Sbostic 		break;
6533670Sbostic 	case ECTLR:
6634517Skarels 		printf("bad controller number\n");
6733670Sbostic 		break;
6833670Sbostic 	case EUNIT:
6934517Skarels 		printf("bad drive number\n");
7033670Sbostic 		break;
7133670Sbostic 	case EPART:
7233670Sbostic 		printf("bad partition\n");
7333670Sbostic 		break;
7433670Sbostic 	case ERDLAB:
7533670Sbostic 		printf("can't read disk label\n");
7633670Sbostic 		break;
7733670Sbostic 	case EUNLAB:
7833670Sbostic 		printf("unlabeled\n");
7933670Sbostic 		break;
8033670Sbostic 	case ENXIO:
8134517Skarels 		printf("bad device specification\n");
8234517Skarels 		break;
8333670Sbostic 	default:
8434517Skarels 		printf("unknown open error\n");
8534517Skarels 		break;
8633670Sbostic 	}
8733670Sbostic 	return (ret);
8833510Sbostic }
8933510Sbostic 
9033510Sbostic devclose(io)
9133510Sbostic 	register struct iob *io;
9233510Sbostic {
9340502Smckusick 	(*devsw[io->i_dev].dv_close)(io);
9433510Sbostic }
9533510Sbostic 
9633510Sbostic devioctl(io, cmd, arg)
9733510Sbostic 	register struct iob *io;
9833510Sbostic 	int cmd;
9933510Sbostic 	caddr_t arg;
10033510Sbostic {
10140502Smckusick 	return ((*devsw[io->i_dev].dv_ioctl)(io, cmd, arg));
10233510Sbostic }
10333510Sbostic 
104*49084Sbostic /* ARGSUSED */
10533510Sbostic nullsys(io)
10633510Sbostic 	struct iob *io;
10733510Sbostic {}
10833510Sbostic 
109*49084Sbostic /* ARGSUSED */
11033510Sbostic nodev(io)
11133510Sbostic 	struct iob *io;
11233510Sbostic {
11333510Sbostic 	errno = EBADF;
11433510Sbostic }
11533510Sbostic 
116*49084Sbostic /* ARGSUSED */
11733510Sbostic noioctl(io, cmd, arg)
11833510Sbostic 	struct iob *io;
11933510Sbostic 	int cmd;
12033510Sbostic 	caddr_t arg;
12133510Sbostic {
12233510Sbostic 	return (ECMD);
12333510Sbostic }
124