|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * Van Jacobson of Lawrence Berkeley Laboratory and the Systems ! 8: * Programming Group of the University of Utah Computer Science Department. ! 9: * ! 10: * Redistribution is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * from: Utah $Hdr: sd.c 1.2 90/01/23$ ! 26: * ! 27: * @(#)sd.c 7.2 (Berkeley) 5/25/90 ! 28: */ ! 29: ! 30: /* ! 31: * SCSI CCS disk driver ! 32: */ ! 33: ! 34: #include "saio.h" ! 35: #include "samachdep.h" ! 36: ! 37: #include "../hpdev/scsireg.h" ! 38: ! 39: struct sd_softc { ! 40: char sc_retry; ! 41: char sc_alive; ! 42: short sc_blkshift; ! 43: } sd_softc[NSD]; ! 44: ! 45: int sdpartoff[] = { ! 46: 1024, 17408, 0, 17408, ! 47: 115712, 218112, 82944, 0 ! 48: }; ! 49: ! 50: #define SDRETRY 2 ! 51: ! 52: sdinit(unit) ! 53: register int unit; ! 54: { ! 55: register struct sd_softc *ss; ! 56: u_char stat; ! 57: int capbuf[2]; ! 58: ! 59: if (unit > NSD) ! 60: return (0); ! 61: ss = &sd_softc[unit]; ! 62: /* NB: HP6300 won't boot if next printf is removed (???) - vj */ ! 63: printf("sd%d: ", unit); ! 64: if ((stat = scsi_test_unit_rdy(unit)) == 0) { ! 65: /* drive may be doing RTZ - wait a bit */ ! 66: printf("not ready - retrying ... "); ! 67: if (stat == STS_CHECKCOND) { ! 68: DELAY(1000000); ! 69: if (scsi_test_unit_rdy(unit) == 0) { ! 70: printf("giving up.\n"); ! 71: return (0); ! 72: } ! 73: } ! 74: } ! 75: printf("unit ready.\n"); ! 76: /* ! 77: * try to get the drive block size. ! 78: */ ! 79: capbuf[0] = 0; ! 80: capbuf[1] = 0; ! 81: if (scsi_read_capacity(unit, (u_char *)capbuf, sizeof(capbuf)) != 0) { ! 82: if (capbuf[1] > DEV_BSIZE) ! 83: for (; capbuf[1] > DEV_BSIZE; capbuf[1] >>= 1) ! 84: ++ss->sc_blkshift; ! 85: } ! 86: ss->sc_alive = 1; ! 87: return (1); ! 88: } ! 89: ! 90: sdreset(unit) ! 91: { ! 92: } ! 93: ! 94: sdopen(io) ! 95: struct iob *io; ! 96: { ! 97: register int unit = io->i_unit; ! 98: register struct sd_softc *ss = &sd_softc[unit]; ! 99: struct sdinfo *ri; ! 100: ! 101: if (scsialive(unit) == 0) ! 102: _stop("scsi controller not configured"); ! 103: if (ss->sc_alive == 0) ! 104: if (sdinit(unit) == 0) ! 105: _stop("sd init failed"); ! 106: if (io->i_boff < 0 || io->i_boff > 7) ! 107: _stop("sd bad minor"); ! 108: io->i_boff = sdpartoff[io->i_boff]; ! 109: } ! 110: ! 111: sdstrategy(io, func) ! 112: register struct iob *io; ! 113: register int func; ! 114: { ! 115: register int unit = io->i_unit; ! 116: register struct sd_softc *ss = &sd_softc[unit]; ! 117: char stat; ! 118: daddr_t blk = io->i_bn >> ss->sc_blkshift; ! 119: u_int nblk = io->i_cc >> ss->sc_blkshift; ! 120: ! 121: ss->sc_retry = 0; ! 122: retry: ! 123: if (func == READ) ! 124: stat = scsi_tt_read(unit, io->i_ma, io->i_cc, blk, nblk); ! 125: else ! 126: stat = scsi_tt_write(unit, io->i_ma, io->i_cc, blk, nblk); ! 127: if (stat) { ! 128: printf("sd(%d,?) err: 0x%x\n", unit, stat); ! 129: if (++ss->sc_retry > SDRETRY) ! 130: return(-1); ! 131: else ! 132: goto retry; ! 133: } ! 134: return(io->i_cc); ! 135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.