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*49169Sbostic * @(#)dev.c 7.13 (Berkeley) 05/05/91 833510Sbostic */ 933510Sbostic 10*49169Sbostic #include <sys/param.h> 1149084Sbostic #include <setjmp.h> 12*49169Sbostic #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; 3149084Sbostic if (scankbd()) 3249109Sbostic _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; 4349084Sbostic cc = (*devsw[io->i_dev].dv_strategy)(io, F_WRITE); 4433510Sbostic io->i_flgs &= ~F_TYPEMASK; 4549084Sbostic if (scankbd()) 4649109Sbostic _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 10449084Sbostic /* ARGSUSED */ 10533510Sbostic nullsys(io) 10633510Sbostic struct iob *io; 10733510Sbostic {} 10833510Sbostic 10949084Sbostic /* ARGSUSED */ 11033510Sbostic nodev(io) 11133510Sbostic struct iob *io; 11233510Sbostic { 11333510Sbostic errno = EBADF; 114*49169Sbostic return(-1); 11533510Sbostic } 11633510Sbostic 11749084Sbostic /* ARGSUSED */ 11833510Sbostic noioctl(io, cmd, arg) 11933510Sbostic struct iob *io; 12033510Sbostic int cmd; 12133510Sbostic caddr_t arg; 12233510Sbostic { 12333510Sbostic return (ECMD); 12433510Sbostic } 125