|
|
1.1 ! root 1: #ifndef XTBOOT ! 2: #ifndef lint ! 3: static char sccsid[] = "@(#)xt.c 1.1 86/02/03 Copyr 1985 Sun Micro"; ! 4: #endif ! 5: #endif ! 6: ! 7: /* ! 8: * Copyright (c) 1985 by Sun Microsystems, Inc. ! 9: */ ! 10: ! 11: /* ! 12: * Standalone driver for Xylogics 472 Tape Controller ! 13: */ ! 14: ! 15: #include "saio.h" ! 16: #include "../sundev/xycreg.h" ! 17: #include "../sundev/xtreg.h" ! 18: ! 19: ! 20: #define NXTADDR 2 ! 21: unsigned long xtaddrs[] = { 0xEE60, 0xEE68 }; ! 22: ! 23: #define MAXXTREC (20*1024) /* max size tape rec allowed */ ! 24: ! 25: struct xtdma { ! 26: struct xtiopb xtiopb; ! 27: char xtblock[MAXXTREC]; ! 28: }; ! 29: ! 30: /* Define resources needed by this driver */ ! 31: struct devinfo xtinfo = { ! 32: sizeof(struct xydevice), sizeof (struct xtdma), 0, ! 33: NXTADDR, xtaddrs, MAP_MBIO, ! 34: MAXXTREC, ! 35: }; ! 36: ! 37: int xtstrategy(), xtopen(), xtclose(); ! 38: extern int nullsys(), ttboot(); ! 39: ! 40: struct boottab xtdriver = { ! 41: "xt", nullsys, ttboot, xtopen, xtclose, xtstrategy, ! 42: "xt: Xylogics 472 tape", &xtinfo, ! 43: }; ! 44: ! 45: xtopen(sip) ! 46: register struct saioreq *sip; ! 47: { ! 48: register skip; ! 49: register struct xydevice *xyaddr; ! 50: ! 51: xyaddr = (struct xydevice *) sip->si_devaddr; ! 52: if (pokec((char *)xyaddr, 0)) ! 53: return (-1); ! 54: skip = xyaddr->xy_resupd; /* controller reset */ ! 55: xtcmd(sip, XT_SEEK, XT_REW); ! 56: skip = sip->si_boff; ! 57: while (skip--) { ! 58: sip->si_cc = 0; ! 59: xtcmd(sip, XT_SEEK, XT_FILE); ! 60: } ! 61: return (0); ! 62: } ! 63: ! 64: xtclose(sip) ! 65: register struct saioreq *sip; ! 66: { ! 67: ! 68: xtcmd(sip, XT_SEEK, XT_REW); ! 69: } ! 70: ! 71: xtstrategy(sip, rw) ! 72: struct saioreq *sip; ! 73: int rw; ! 74: { ! 75: int func = (rw == WRITE) ? XT_WRITE : XT_READ; ! 76: ! 77: return xtcmd(sip, func, 0); ! 78: } ! 79: ! 80: xtcmd(sip, func, subfunc) ! 81: register struct saioreq *sip; ! 82: { ! 83: register struct xtiopb *xt = &((struct xtdma *)sip->si_dmaaddr)->xtiopb; ! 84: register struct xydevice *xyaddr = (struct xydevice *)sip->si_devaddr; ! 85: char *xtbuf = ((struct xtdma *)sip->si_dmaaddr)->xtblock; ! 86: int err, t; ! 87: ! 88: bzero((char *)xt, sizeof (struct xtiopb)); ! 89: xt->xt_reloc = 1; ! 90: xt->xt_autoup = 1; ! 91: xt->xt_cmd = func; ! 92: xt->xt_subfunc = subfunc; ! 93: xt->xt_unit = sip->si_unit & 3; ! 94: xt->xt_throttle = 5; ! 95: switch (func) { ! 96: ! 97: case XT_READ: ! 98: xt->xt_cnt = sip->si_cc; ! 99: xt->xt_swab = 1; ! 100: xt->xt_retry = 1; ! 101: break; ! 102: ! 103: case XT_WRITE: ! 104: xt->xt_cnt = sip->si_cc; ! 105: bcopy((char *)sip->si_ma, xtbuf, xt->xt_cnt); ! 106: xt->xt_swab = 1; ! 107: xt->xt_retry = 1; ! 108: break; ! 109: ! 110: default: ! 111: xt->xt_cnt = 1; ! 112: break; ! 113: } ! 114: xt->xt_bufoff = XYOFF(xtbuf); ! 115: xt->xt_bufrel = XYREL(xyaddr, xtbuf); ! 116: ! 117: t = XYREL(xyaddr, (char *)xt); ! 118: xyaddr->xy_iopbrel[0] = t >> 8; ! 119: xyaddr->xy_iopbrel[1] = t; ! 120: xyaddr->xy_iopboff[0] = ((int)xt) >> 8; ! 121: xyaddr->xy_iopboff[1] = (int)xt; ! 122: xyaddr->xy_csr = XY_GO; ! 123: ! 124: do { ! 125: DELAY(30); ! 126: } while (xyaddr->xy_csr & XY_BUSY); ! 127: err = xt->xt_errno; ! 128: ! 129: if (err != XTE_NOERROR && err != XTE_SHORTREC && err != XTE_LONGREC) { ! 130: if (err == XTE_EOF || err == XTE_EOT) ! 131: return (0); ! 132: /* Note: controller does retries for us */ ! 133: printf("xt hard err %x\n", err); ! 134: return (-1); ! 135: } ! 136: if (func == XT_READ) ! 137: bcopy(xtbuf, (char *)sip->si_ma, xt->xt_acnt); ! 138: return (xt->xt_acnt); ! 139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.