#if !defined(lint) && !defined(BOOTBLOCK) static char sccsid[] = "@(#)boot_tp.c 1.1 94/10/31 SMI"; #endif /* * Copyright (c) 1989 Sun Microsystems, Inc. * * SAIO tape device driver using OPENPROMs ROMvec calls */ #include #include #include "boot/conf.h" extern int romdev, rompclose(), nullprobe(), nullboot(); int tapeopen(), tapestrategy(); struct boottab tapedriver = { "tp", nullprobe, nullboot, tapeopen, rompclose, tapestrategy, 0, /* b_desc descriptive string */ 0, /* b_devinfo memory allocation stuff */ }; int tapeopen(sip) register struct saioreq *sip; { char namebuf[50]; register struct binfo *bd; #ifndef sun4m extern void formatdevname(); #endif sun4m if (prom_getversion() > 0) { bd = (struct binfo *)sip->si_devdata; /* get path name from si_devdata */ romdev = prom_open(bd->name); /* save file descriptor into si_devdata */ bd->ihandle = romdev; return (prom_seek(romdev, 0, 0)); } #ifndef sun4m formatdevname(namebuf, sip); #ifdef DEBUG printf("tapeopen(%s)\n", namebuf); #endif DEBUG if ((romdev = prom_open(namebuf)) < 0) return (-1); #ifdef DEBUG printf("skipping %d files\n", sip->si_boff); #endif DEBUG return (prom_seek(romdev, sip->si_boff, 0)); #endif !sun4m } /*ARGSUSED*/ int tapestrategy(sip, rw) register struct saioreq *sip; register int rw; { int i; register struct binfo *bd; #ifdef DEBUG printf("tapestrategy(): %x %x %x ", sip->si_cc, sip->si_ma); #endif DEBUG if (prom_getversion() > 0) { /* get file descriptor */ bd = (struct binfo *)sip->si_devdata; romdev = bd->ihandle; if (rw == READ) i = (*romp->op2_read)(romdev, sip->si_ma, sip->si_cc); else i = (*romp->op2_write)(romdev, sip->si_ma, sip->si_cc); #ifdef DEBUG printf("xfered %x bytes\n", i); #endif DEBUG return (sip->si_cc); } #ifndef sun4m /* * XXX: so what does offset mean?? * offset from starting position? offset from current position? * I'll give it 0 for now */ if (rw == READ) i = (*romp->v_read_bytes)(romdev, sip->si_cc, 0, sip->si_ma); else i = (*romp->v_write_bytes)(romdev, sip->si_cc, 0, sip->si_ma); #ifdef DEBUG printf("xfered %x bytes\n", i); #endif DEBUG return (sip->si_cc); #endif !sun4m }