1*57081Sakito /* 2*57081Sakito * Copyright (c) 1992 OMRON Corporation. 3*57081Sakito * Copyright (c) 1992 The Regents of the University of California. 4*57081Sakito * All rights reserved. 5*57081Sakito * 6*57081Sakito * This code is derived from software contributed to Berkeley by 7*57081Sakito * OMRON Corporation. 8*57081Sakito * 9*57081Sakito * %sccs.include.redist.c% 10*57081Sakito * 11*57081Sakito * @(#)conf.c 7.1 (Berkeley) 12/13/92 12*57081Sakito */ 13*57081Sakito 14*57081Sakito #include <luna68k/stand/saio.h> 15*57081Sakito 16*57081Sakito devread(io) 17*57081Sakito register struct iob *io; 18*57081Sakito { 19*57081Sakito int cc; 20*57081Sakito 21*57081Sakito io->i_flgs |= F_RDDATA; 22*57081Sakito io->i_error = 0; 23*57081Sakito cc = (*devsw[io->i_dev].dv_strategy)(io, READ); 24*57081Sakito io->i_flgs &= ~F_TYPEMASK; 25*57081Sakito return (cc); 26*57081Sakito } 27*57081Sakito 28*57081Sakito devwrite(io) 29*57081Sakito register struct iob *io; 30*57081Sakito { 31*57081Sakito int cc; 32*57081Sakito 33*57081Sakito io->i_flgs |= F_WRDATA; 34*57081Sakito io->i_error = 0; 35*57081Sakito cc = (*devsw[io->i_dev].dv_strategy)(io, WRITE); 36*57081Sakito io->i_flgs &= ~F_TYPEMASK; 37*57081Sakito return (cc); 38*57081Sakito } 39*57081Sakito 40*57081Sakito devopen(io) 41*57081Sakito register struct iob *io; 42*57081Sakito { 43*57081Sakito 44*57081Sakito (*devsw[io->i_dev].dv_open)(io); 45*57081Sakito } 46*57081Sakito 47*57081Sakito devclose(io) 48*57081Sakito register struct iob *io; 49*57081Sakito { 50*57081Sakito 51*57081Sakito (*devsw[io->i_dev].dv_close)(io); 52*57081Sakito } 53*57081Sakito 54*57081Sakito devioctl(io, cmd, arg) 55*57081Sakito register struct iob *io; 56*57081Sakito int cmd; 57*57081Sakito caddr_t arg; 58*57081Sakito { 59*57081Sakito 60*57081Sakito return ((*devsw[io->i_dev].dv_ioctl)(io, cmd, arg)); 61*57081Sakito } 62*57081Sakito 63*57081Sakito /*ARGSUSED*/ 64*57081Sakito nullsys(io) 65*57081Sakito struct iob *io; 66*57081Sakito { 67*57081Sakito 68*57081Sakito ; 69*57081Sakito } 70*57081Sakito 71*57081Sakito /*ARGSUSED*/ 72*57081Sakito nullioctl(io, cmd, arg) 73*57081Sakito struct iob *io; 74*57081Sakito int cmd; 75*57081Sakito caddr_t arg; 76*57081Sakito { 77*57081Sakito 78*57081Sakito return (ECMD); 79*57081Sakito } 80*57081Sakito 81*57081Sakito int nullsys(), nullioctl(); 82*57081Sakito int sdstrategy(), sdopen(), sdioctl(); 83*57081Sakito 84*57081Sakito struct devsw devsw[] = { 85*57081Sakito { "sd", sdstrategy, sdopen, nullsys, nullioctl }, 86*57081Sakito { 0, 0, 0, 0, 0 }, 87*57081Sakito }; 88*57081Sakito 89*57081Sakito dev_t 90*57081Sakito make_device(str) 91*57081Sakito char *str; 92*57081Sakito { 93*57081Sakito char *cp; 94*57081Sakito struct devsw *dp; 95*57081Sakito int major, unit, part; 96*57081Sakito 97*57081Sakito /* 98*57081Sakito * parse path strings 99*57081Sakito */ 100*57081Sakito /* find end of dev type name */ 101*57081Sakito for (cp = str; *cp && *cp != '('; cp++) 102*57081Sakito ; 103*57081Sakito if (*cp != '(') { 104*57081Sakito return (-1); 105*57081Sakito } 106*57081Sakito /* compare dev type name */ 107*57081Sakito *cp = '\0'; 108*57081Sakito for (dp = devsw; dp->dv_name; dp++) 109*57081Sakito if (!strcmp(str, dp->dv_name)) 110*57081Sakito break; 111*57081Sakito *cp++ = '('; 112*57081Sakito if (dp->dv_name == NULL) { 113*57081Sakito return (-1); 114*57081Sakito } 115*57081Sakito major = dp - devsw; 116*57081Sakito /* get unit number */ 117*57081Sakito unit = *cp++ - '0'; 118*57081Sakito if (*cp >= '0' && *cp <= '9') 119*57081Sakito unit = unit * 10 + *cp++ - '0'; 120*57081Sakito if (unit < 0 || unit > 63) { 121*57081Sakito return (-1); 122*57081Sakito } 123*57081Sakito /* get partition offset */ 124*57081Sakito if (*cp++ != ',') { 125*57081Sakito return (-1); 126*57081Sakito } 127*57081Sakito part = *cp - '0'; 128*57081Sakito /* check out end of dev spec */ 129*57081Sakito for (;;) { 130*57081Sakito if (*cp == ')') 131*57081Sakito break; 132*57081Sakito if (*cp++) 133*57081Sakito continue; 134*57081Sakito return (-1); 135*57081Sakito } 136*57081Sakito 137*57081Sakito return(major << 8 | unit << 3 | part); 138*57081Sakito } 139