summaryrefslogtreecommitdiff
path: root/sys/arch/hp300/dev/sd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/hp300/dev/sd.c')
-rw-r--r--sys/arch/hp300/dev/sd.c136
1 files changed, 78 insertions, 58 deletions
diff --git a/sys/arch/hp300/dev/sd.c b/sys/arch/hp300/dev/sd.c
index 3f3bf119f19..c6c26a42bbb 100644
--- a/sys/arch/hp300/dev/sd.c
+++ b/sys/arch/hp300/dev/sd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sd.c,v 1.16.2.2 1995/10/16 09:01:36 thorpej Exp $ */
+/* $NetBSD: sd.c,v 1.20 1995/12/09 07:31:03 thorpej Exp $ */
/*
* Copyright (c) 1990, 1993
@@ -85,11 +85,12 @@ extern void biodone();
extern int physio();
extern void TBIS();
-int sdinit();
-void sdstrategy(), sdstart(), sdustart(), sdgo(), sdintr();
+int sdmatch();
+void sdattach(), sdstrategy(), sdstart(), sdustart(), sdgo(), sdintr();
struct driver sddriver = {
- sdinit, "sd", (int (*)())sdstart, (int (*)())sdgo, (int (*)())sdintr,
+ sdmatch, sdattach, "sd", (int (*)())sdstart,
+ (int (*)())sdgo, (int (*)())sdintr,
};
#ifdef DEBUG
@@ -170,9 +171,10 @@ sdgetgeom(sc, hd)
}
static int
-sdident(sc, hd)
+sdident(sc, hd, verbose)
struct sd_softc *sc;
struct hp_device *hd;
+ int verbose;
{
int unit;
register int ctlr, slave;
@@ -265,45 +267,50 @@ sdident(sc, hd)
switch (inqbuf.version) {
case 1:
case 2:
- printf("sd%d: %s %s", hd->hp_unit, vendor, product);
- if (revision[0] != '\0')
- printf(" rev %s", revision);
- if (inqbuf.version == 2)
- printf(" (SCSI-2)");
+ if (verbose) {
+ printf(": <%s, %s, %s>", vendor, product, revision);
+ if (inqbuf.version == 2)
+ printf(" (SCSI-2)");
+ }
break;
default:
- printf("sd%d: type 0x%x, qual 0x%x, ver %d", hd->hp_unit,
- inqbuf.type, inqbuf.qual, inqbuf.version);
+ if (verbose)
+ printf(": type 0x%x, qual 0x%x, ver %d",
+ inqbuf.type, inqbuf.qual, inqbuf.version);
break;
}
- printf("\n");
+ if (verbose)
+ printf("\n");
- /*
- * Print out some additional information.
- */
- printf("sd%d: ", hd->hp_unit);
- switch (inqbuf.type) {
- case 4:
- printf("WORM, ");
- break;
+ if (verbose) {
+ /*
+ * Print out some additional information.
+ */
+ printf("%s: ", hd->hp_xname);
+ switch (inqbuf.type) {
+ case 4:
+ printf("WORM, ");
+ break;
- case 5:
- printf("CD-ROM, ");
- break;
+ case 5:
+ printf("CD-ROM, ");
+ break;
- case 7:
- printf("Magneto-optical, ");
- break;
+ case 7:
+ printf("Magneto-optical, ");
+ break;
- default:
- printf("%d cylinders, %d heads, ", sc->sc_cyls, sc->sc_heads);
- }
+ default:
+ printf("%d cylinders, %d heads, ",
+ sc->sc_cyls, sc->sc_heads);
+ }
- if (sc->sc_blks)
- printf("%d blocks, %d bytes/block\n",
- sc->sc_blks >> sc->sc_bshift, sc->sc_blksize);
- else
- printf("drive empty\n");
+ if (sc->sc_blks)
+ printf("%d blocks, %d bytes/block\n",
+ sc->sc_blks >> sc->sc_bshift, sc->sc_blksize);
+ else
+ printf("drive empty\n");
+ }
sc->sc_wpms = 32 * (60 * DEV_BSIZE / 2); /* XXX */
scsi_delay(0);
@@ -314,7 +321,7 @@ failed:
}
int
-sdinit(hd)
+sdmatch(hd)
register struct hp_device *hd;
{
register struct sd_softc *sc = &sd_softc[hd->hp_unit];
@@ -327,16 +334,27 @@ sdinit(hd)
*/
sc->sc_format_pid = -1;
sc->sc_punit = sdpunit(hd->hp_flags);
- sc->sc_type = sdident(sc, hd);
+ sc->sc_type = sdident(sc, hd, 0);
if (sc->sc_type < 0)
- return(0);
+ return (0);
+
+ return (1);
+}
+
+void
+sdattach(hd)
+ register struct hp_device *hd;
+{
+ struct sd_softc *sc = &sd_softc[hd->hp_unit];
+
+ (void)sdident(sc, hd, 1); /* XXX Ick. */
+
sc->sc_dq.dq_ctlr = hd->hp_ctlr;
sc->sc_dq.dq_unit = hd->hp_unit;
sc->sc_dq.dq_slave = hd->hp_slave;
sc->sc_dq.dq_driver = &sddriver;
sc->sc_flags |= SDF_ALIVE;
- return(1);
}
void
@@ -400,8 +418,8 @@ sdgetcapacity(sc, hd, dev)
if (i != STS_CHECKCOND || (sc->sc_flags & SDF_RMEDIA) == 0) {
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
- printf("sd%d: read_capacity returns %d\n",
- hd->hp_unit, i);
+ printf("%s: read_capacity returns %d\n",
+ hd->hp_xname, i);
#endif
free(capbuf, M_DEVBUF);
return (-1);
@@ -414,8 +432,8 @@ sdgetcapacity(sc, hd, dev)
sc->sc_bshift = 0;
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
- printf("sd%d: removable media not present\n",
- hd->hp_unit);
+ printf("%s: removable media not present\n",
+ hd->hp_xname);
#endif
free(capbuf, M_DEVBUF);
return (1);
@@ -430,8 +448,8 @@ sdgetcapacity(sc, hd, dev)
if (sc->sc_blksize != DEV_BSIZE) {
if (sc->sc_blksize < DEV_BSIZE) {
- printf("sd%d: need at least %d byte blocks - %s\n",
- hd->hp_unit, DEV_BSIZE, "drive ignored");
+ printf("%s: need at least %d byte blocks - %s\n",
+ hd->hp_xname, DEV_BSIZE, "drive ignored");
return (-1);
}
for (i = sc->sc_blksize; i > DEV_BSIZE; i >>= 1)
@@ -440,7 +458,7 @@ sdgetcapacity(sc, hd, dev)
}
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
- printf("sd%d: blks=%d, blksize=%d, bshift=%d\n", hd->hp_unit,
+ printf("%s: blks=%d, blksize=%d, bshift=%d\n", hd->hp_xname,
sc->sc_blks, sc->sc_blksize, sc->sc_bshift);
#endif
sdgetgeom(sc, hd);
@@ -520,13 +538,13 @@ sdgetinfo(dev)
/* XXX ensure size is at least one device block */
lp->d_partitions[2].p_size =
roundup(LABELSECTOR+1, btodb(sc->sc_blksize));
- msg = readdisklabel(sdlabdev(dev), sdstrategy, lp);
+ msg = readdisklabel(sdlabdev(dev), sdstrategy, lp, NULL);
if (msg == NULL)
return (0);
}
pi = lp->d_partitions;
- printf("sd%d: WARNING: %s, ", unit, msg);
+ printf("%s: WARNING: %s, ", sc->sc_hd->hp_xname, msg);
#ifdef COMPAT_NOLABEL
if (usedefault) {
printf("using old default partitioning\n");
@@ -825,7 +843,7 @@ sderror(unit, sc, hp, stat)
sc->sc_punit, sdsense[unit].sense,
sizeof(sdsense[unit].sense));
sp = (struct scsi_xsense *)sdsense[unit].sense;
- printf("sd%d: scsi sense class %d, code %d", unit,
+ printf("%s: scsi sense class %d, code %d", hp->hp_xname,
sp->class, sp->code);
if (sp->class == 7) {
printf(", key %d", sp->key);
@@ -955,8 +973,8 @@ sdgo(unit)
pad = (bp->b_bcount & (sc->sc_blksize - 1)) != 0;
#ifdef DEBUG
if (pad)
- printf("sd%d: partial block xfer -- %x bytes\n",
- unit, bp->b_bcount);
+ printf("%s: partial block xfer -- %x bytes\n",
+ sc->sc_hd->hp_xname, bp->b_bcount);
#endif
sdstats[unit].sdtransfers++;
}
@@ -975,8 +993,9 @@ sdgo(unit)
}
#ifdef DEBUG
if (sddebug & SDB_ERROR)
- printf("sd%d: sdstart: %s adr %d blk %d len %d ecnt %d\n",
- unit, bp->b_flags & B_READ? "read" : "write",
+ printf("%s: sdstart: %s adr %d blk %d len %d ecnt %d\n",
+ sc->sc_hd->hp_xname,
+ bp->b_flags & B_READ? "read" : "write",
bp->b_un.b_addr, bp->b_cylin, bp->b_bcount,
sdtab[unit].b_errcnt);
#endif
@@ -996,7 +1015,7 @@ sdintr(unit, stat)
int cond;
if (bp == NULL) {
- printf("sd%d: bp == NULL\n", unit);
+ printf("%s: bp == NULL\n", sc->sc_hd->hp_xname);
return;
}
if (hp->hp_dk >= 0)
@@ -1004,16 +1023,17 @@ sdintr(unit, stat)
if (stat) {
#ifdef DEBUG
if (sddebug & SDB_ERROR)
- printf("sd%d: sdintr: bad scsi status 0x%x\n",
- unit, stat);
+ printf("%s: sdintr: bad scsi status 0x%x\n",
+ sc->sc_hd->hp_xname, stat);
#endif
cond = sderror(unit, sc, hp, stat);
if (cond) {
if (cond < 0 && sdtab[unit].b_errcnt++ < SDRETRY) {
#ifdef DEBUG
if (sddebug & SDB_ERROR)
- printf("sd%d: retry #%d\n",
- unit, sdtab[unit].b_errcnt);
+ printf("%s: retry #%d\n",
+ sc->sc_hd->hp_xname,
+ sdtab[unit].b_errcnt);
#endif
sdstart(unit);
return;