99 lines
2.2 KiB
C
99 lines
2.2 KiB
C
#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 <sys/types.h>
|
|
#include <stand/saio.h>
|
|
#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
|
|
}
|