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*49178Sbostic * @(#)dev.c 7.14 (Berkeley) 05/05/91 833510Sbostic */ 933510Sbostic 1049169Sbostic #include <sys/param.h> 1149084Sbostic #include <setjmp.h> 1249169Sbostic #include "saio.h" 1333510Sbostic 1433670Sbostic /* 1549084Sbostic * NB: the value "io->i_dev", used to offset the devsw[] array in the 1649084Sbostic * routines below, is munged by the machine specific stand Makefiles 1749084Sbostic * to work for certain boots. 1833670Sbostic */ 1933670Sbostic 2049084Sbostic jmp_buf exception; 2149084Sbostic 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*49178Sbostic #ifndef SMALL 3249084Sbostic if (scankbd()) 3349109Sbostic _longjmp(exception, 1); 34*49178Sbostic #endif 3533510Sbostic return (cc); 3633510Sbostic } 3733510Sbostic 3833510Sbostic devwrite(io) 3933510Sbostic register struct iob *io; 4033510Sbostic { 4133510Sbostic int cc; 4233510Sbostic 4333510Sbostic io->i_flgs |= F_WRDATA; 4433510Sbostic io->i_error = 0; 4549084Sbostic cc = (*devsw[io->i_dev].dv_strategy)(io, F_WRITE); 4633510Sbostic io->i_flgs &= ~F_TYPEMASK; 47*49178Sbostic #ifndef SMALL 4849084Sbostic if (scankbd()) 4949109Sbostic _longjmp(exception, 1); 50*49178Sbostic #endif 5133510Sbostic return (cc); 5233510Sbostic } 5333510Sbostic 5433510Sbostic devopen(io) 5533510Sbostic register struct iob *io; 5633510Sbostic { 5733670Sbostic int ret; 5833670Sbostic 5940502Smckusick if (!(ret = (*devsw[io->i_dev].dv_open)(io))) 6033670Sbostic return (0); 61*49178Sbostic #ifdef SMALL 62*49178Sbostic printf("open error\n"); 63*49178Sbostic #else 6440502Smckusick printf("%s(%d,%d,%d,%d): ", devsw[io->i_dev].dv_name, 6533670Sbostic io->i_adapt, io->i_ctlr, io->i_unit, io->i_part); 6633670Sbostic switch(ret) { 6734517Skarels case EIO: 6834517Skarels break; /* already reported */ 6933670Sbostic case EADAPT: 7034517Skarels printf("bad adaptor number\n"); 7133670Sbostic break; 7233670Sbostic case ECTLR: 7334517Skarels printf("bad controller number\n"); 7433670Sbostic break; 7533670Sbostic case EUNIT: 7634517Skarels printf("bad drive number\n"); 7733670Sbostic break; 7833670Sbostic case EPART: 7933670Sbostic printf("bad partition\n"); 8033670Sbostic break; 8133670Sbostic case ERDLAB: 8233670Sbostic printf("can't read disk label\n"); 8333670Sbostic break; 8433670Sbostic case EUNLAB: 8533670Sbostic printf("unlabeled\n"); 8633670Sbostic break; 8733670Sbostic case ENXIO: 8834517Skarels printf("bad device specification\n"); 8934517Skarels break; 9033670Sbostic default: 9134517Skarels printf("unknown open error\n"); 9234517Skarels break; 9333670Sbostic } 94*49178Sbostic #endif 9533670Sbostic return (ret); 9633510Sbostic } 9733510Sbostic 9833510Sbostic devclose(io) 9933510Sbostic register struct iob *io; 10033510Sbostic { 10140502Smckusick (*devsw[io->i_dev].dv_close)(io); 10233510Sbostic } 10333510Sbostic 10433510Sbostic devioctl(io, cmd, arg) 10533510Sbostic register struct iob *io; 10633510Sbostic int cmd; 10733510Sbostic caddr_t arg; 10833510Sbostic { 10940502Smckusick return ((*devsw[io->i_dev].dv_ioctl)(io, cmd, arg)); 11033510Sbostic } 11133510Sbostic 11249084Sbostic /* ARGSUSED */ 11333510Sbostic nullsys(io) 11433510Sbostic struct iob *io; 11533510Sbostic {} 11633510Sbostic 11749084Sbostic /* ARGSUSED */ 11833510Sbostic nodev(io) 11933510Sbostic struct iob *io; 12033510Sbostic { 12133510Sbostic errno = EBADF; 12249169Sbostic return(-1); 12333510Sbostic } 12433510Sbostic 12549084Sbostic /* ARGSUSED */ 12633510Sbostic noioctl(io, cmd, arg) 12733510Sbostic struct iob *io; 12833510Sbostic int cmd; 12933510Sbostic caddr_t arg; 13033510Sbostic { 13133510Sbostic return (ECMD); 13233510Sbostic } 133