Net2/usr/src/sys/hp300/stand/sd.c

Compare this file to the similar file:
Show the results in this format:

/*
 * Copyright (c) 1988 University of Utah.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Van Jacobson of Lawrence Berkeley Laboratory and the Systems
 * Programming Group of the University of Utah Computer Science Department.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * from: Utah $Hdr: sd.c 1.2 90/01/23$
 *
 *	@(#)sd.c	7.4 (Berkeley) 5/5/91
 */

/*
 * SCSI CCS disk driver
 */

#include <sys/param.h>
#include "saio.h"
#include "samachdep.h"

#include "../dev/scsireg.h"

struct	sd_softc {
	char	sc_retry;
	char	sc_alive;
	short	sc_blkshift;
} sd_softc[NSD];

int sdpartoff[] = {
	1024,	17408,	0,	17408,
	115712,	218112,	82944,	0
};

#define	SDRETRY		2

sdinit(unit)
	register int unit;
{
	register struct sd_softc *ss;
	u_char stat;
	int capbuf[2];

	if (unit > NSD)
		return (0);
	ss = &sd_softc[unit];
	/* NB: HP6300 won't boot if next printf is removed (???) - vj */
	printf("sd%d: ", unit);
	if ((stat = scsi_test_unit_rdy(unit)) == 0) {
		/* drive may be doing RTZ - wait a bit */
		printf("not ready - retrying ... ");
		if (stat == STS_CHECKCOND) {
			DELAY(1000000);
			if (scsi_test_unit_rdy(unit) == 0) {
				printf("giving up.\n");
				return (0);
			}
		}
	}
	printf("unit ready.\n");
	/*
	 * try to get the drive block size.
	 */
	capbuf[0] = 0;
	capbuf[1] = 0;
	if (scsi_read_capacity(unit, (u_char *)capbuf, sizeof(capbuf)) != 0) {
		if (capbuf[1] > DEV_BSIZE)
			for (; capbuf[1] > DEV_BSIZE; capbuf[1] >>= 1)
				++ss->sc_blkshift;
	}
	ss->sc_alive = 1;
	return (1);
}

sdreset(unit)
{
}

sdopen(io)
	struct iob *io;
{
	register int unit = io->i_unit;
	register struct sd_softc *ss = &sd_softc[unit];
	struct sdinfo *ri;

	if (scsialive(unit) == 0)
		_stop("scsi controller not configured");
	if (ss->sc_alive == 0)
		if (sdinit(unit) == 0)
			_stop("sd init failed");
	if (io->i_boff < 0 || io->i_boff > 7)
		_stop("sd bad minor");
	io->i_boff = sdpartoff[io->i_boff];
}

sdstrategy(io, func)
	register struct iob *io;
	register int func;
{
	register int unit = io->i_unit;
	register struct sd_softc *ss = &sd_softc[unit];
	char stat;
	daddr_t blk = io->i_bn >> ss->sc_blkshift;
	u_int nblk = io->i_cc >> ss->sc_blkshift;

	ss->sc_retry = 0;
retry:
	if (func == F_READ)
		stat = scsi_tt_read(unit, io->i_ma, io->i_cc, blk, nblk);
	else
		stat = scsi_tt_write(unit, io->i_ma, io->i_cc, blk, nblk);
	if (stat) {
		printf("sd(%d,?) err: 0x%x\n", unit, stat);
		if (++ss->sc_retry > SDRETRY)
			return(-1);
		else
			goto retry;
	}
	return(io->i_cc);
}