Module Name: src
Committed By: tsutsui
Date: Fri Jul 9 17:05:33 UTC 2021
Modified Files:
src/sys/arch/hp300/dev: hpibvar.h rd.c rdreg.h rdvar.h
Log Message:
Add support of multiple rd(4) disks on all punits for HPDisk.
Special thanks to Anders Gustafsson, the author of "HPDisk"
(GPIB disk emulator) http://www.dalton.ax/hpdisk/
for providing bare boards and improving firmwares for NetBSD/hp300.
To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/hp300/dev/hpibvar.h
cvs rdiff -u -r1.107 -r1.108 src/sys/arch/hp300/dev/rd.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/hp300/dev/rdreg.h
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/hp300/dev/rdvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/hp300/dev/hpibvar.h
diff -u src/sys/arch/hp300/dev/hpibvar.h:1.23 src/sys/arch/hp300/dev/hpibvar.h:1.24
--- src/sys/arch/hp300/dev/hpibvar.h:1.23 Mon Jul 5 14:51:23 2021
+++ src/sys/arch/hp300/dev/hpibvar.h Fri Jul 9 17:05:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: hpibvar.h,v 1.23 2021/07/05 14:51:23 tsutsui Exp $ */
+/* $NetBSD: hpibvar.h,v 1.24 2021/07/09 17:05:33 tsutsui Exp $ */
/*-
* Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -167,7 +167,7 @@ struct hpibbus_attach_args {
#define hpibbuscf_punit cf_loc[HPIBBUSCF_PUNIT]
#define HPIB_NSLAVES 8 /* number of slaves on a bus */
-#define HPIB_NPUNITS 2 /* number of punits per slave */
+#define HPIB_NPUNITS 15 /* number of punits per slave */
/*
* An HP-IB job queue entry. Slave drivers have one of these used
Index: src/sys/arch/hp300/dev/rd.c
diff -u src/sys/arch/hp300/dev/rd.c:1.107 src/sys/arch/hp300/dev/rd.c:1.108
--- src/sys/arch/hp300/dev/rd.c:1.107 Mon Jul 5 14:51:23 2021
+++ src/sys/arch/hp300/dev/rd.c Fri Jul 9 17:05:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rd.c,v 1.107 2021/07/05 14:51:23 tsutsui Exp $ */
+/* $NetBSD: rd.c,v 1.108 2021/07/09 17:05:33 tsutsui Exp $ */
/*-
* Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rd.c,v 1.107 2021/07/05 14:51:23 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rd.c,v 1.108 2021/07/09 17:05:33 tsutsui Exp $");
#include "opt_useleds.h"
@@ -186,65 +186,204 @@ int rddebug = RDB_ERROR | RDB_IDENT;
* Nothing really critical here, could do without it.
*/
static const struct rdidentinfo rdidentinfo[] = {
- { RD7946AID, 0, "7945A", NRD7945ABPT,
- NRD7945ATRK, 968, 108416 },
-
- { RD9134DID, 1, "9134D", NRD9134DBPT,
- NRD9134DTRK, 303, 29088 },
-
- { RD9134LID, 1, "9122S", NRD9122SBPT,
- NRD9122STRK, 77, 1232 },
-
- { RD7912PID, 0, "7912P", NRD7912PBPT,
- NRD7912PTRK, 572, 128128 },
-
- { RD7914PID, 0, "7914P", NRD7914PBPT,
- NRD7914PTRK, 1152, 258048 },
-
- { RD7958AID, 0, "7958A", NRD7958ABPT,
- NRD7958ATRK, 1013, 255276 },
-
- { RD7957AID, 0, "7957A", NRD7957ABPT,
- NRD7957ATRK, 1036, 159544 },
-
- { RD7933HID, 0, "7933H", NRD7933HBPT,
- NRD7933HTRK, 1321, 789958 },
-
- { RD9134LID, 1, "9134L", NRD9134LBPT,
- NRD9134LTRK, 973, 77840 },
-
- { RD7936HID, 0, "7936H", NRD7936HBPT,
- NRD7936HTRK, 698, 600978 },
-
- { RD7937HID, 0, "7937H", NRD7937HBPT,
- NRD7937HTRK, 698, 1116102 },
-
- { RD7914CTID, 0, "7914CT", NRD7914PBPT,
- NRD7914PTRK, 1152, 258048 },
-
- { RD7946AID, 0, "7946A", NRD7945ABPT,
- NRD7945ATRK, 968, 108416 },
-
- { RD9134LID, 1, "9122D", NRD9122SBPT,
- NRD9122STRK, 77, 1232 },
-
- { RD7957BID, 0, "7957B", NRD7957BBPT,
- NRD7957BTRK, 1269, 159894 },
-
- { RD7958BID, 0, "7958B", NRD7958BBPT,
- NRD7958BTRK, 786, 297108 },
-
- { RD7959BID, 0, "7959B", NRD7959BBPT,
- NRD7959BTRK, 1572, 594216 },
-
- { RD2200AID, 0, "2200A", NRD2200ABPT,
- NRD2200ATRK, 1449, 654948 },
-
- { RD2203AID, 0, "2203A", NRD2203ABPT,
- NRD2203ATRK, 1449, 1309896 }
+ [RD7945A] = {
+ .ri_hwid = RD7946AID,
+ .ri_desc = "7945A",
+ .ri_nbpt = NRD7945ABPT,
+ .ri_ntpc = NRD7945ATRK,
+ .ri_ncyl = 968,
+ .ri_nblocks = 108416
+ },
+
+ [RD9134D] = {
+ .ri_hwid = RD9134DID,
+ .ri_desc = "9134D",
+ .ri_nbpt = NRD9134DBPT,
+ .ri_ntpc = NRD9134DTRK,
+ .ri_ncyl = 303,
+ .ri_nblocks = 29088
+ },
+
+ [RD9122S] = {
+ .ri_hwid = RD9134LID,
+ .ri_desc = "9122S",
+ .ri_nbpt = NRD9122SBPT,
+ .ri_ntpc = NRD9122STRK,
+ .ri_ncyl = 77,
+ .ri_nblocks = 1232
+ },
+
+ [RD7912P] = {
+ .ri_hwid = RD7912PID,
+ .ri_desc = "7912P",
+ .ri_nbpt = NRD7912PBPT,
+ .ri_ntpc = NRD7912PTRK,
+ .ri_ncyl = 572,
+ .ri_nblocks = 128128
+ },
+
+ [RD7914P] = {
+ .ri_hwid = RD7914PID,
+ .ri_desc = "7914P",
+ .ri_nbpt = NRD7914PBPT,
+ .ri_ntpc = NRD7914PTRK,
+ .ri_ncyl = 1152,
+ .ri_nblocks = 258048
+ },
+
+ [RD7958A] = {
+ .ri_hwid = RD7958AID,
+ .ri_desc = "7958A",
+ .ri_nbpt = NRD7958ABPT,
+ .ri_ntpc = NRD7958ATRK,
+ .ri_ncyl = 1013,
+ .ri_nblocks = 255276
+ },
+
+ [RD7957A] = {
+ .ri_hwid = RD7957AID,
+ .ri_desc = "7957A",
+ .ri_nbpt = NRD7957ABPT,
+ .ri_ntpc = NRD7957ATRK,
+ .ri_ncyl = 1036,
+ .ri_nblocks = 159544
+ },
+
+ [RD7933H] = {
+ .ri_hwid = RD7933HID,
+ .ri_desc = "7933H",
+ .ri_nbpt = NRD7933HBPT,
+ .ri_ntpc = NRD7933HTRK,
+ .ri_ncyl = 1321,
+ .ri_nblocks = 789958
+ },
+
+ [RD9134L] = {
+ .ri_hwid = RD9134LID,
+ .ri_desc = "9134L",
+ .ri_nbpt = NRD9134LBPT,
+ .ri_ntpc = NRD9134LTRK,
+ .ri_ncyl = 973,
+ .ri_nblocks = 77840
+ },
+
+ [RD7936H] = {
+ .ri_hwid = RD7936HID,
+ .ri_desc = "7936H",
+ .ri_nbpt = NRD7936HBPT,
+ .ri_ntpc = NRD7936HTRK,
+ .ri_ncyl = 698,
+ .ri_nblocks = 600978
+ },
+
+ [RD7937H] = {
+ .ri_hwid = RD7937HID,
+ .ri_desc = "7937H",
+ .ri_nbpt = NRD7937HBPT,
+ .ri_ntpc = NRD7937HTRK,
+ .ri_ncyl = 698,
+ .ri_nblocks = 1116102
+ },
+
+ [RD7914CT] = {
+ .ri_hwid = RD7914CTID,
+ .ri_desc = "7914CT",
+ .ri_nbpt = NRD7914PBPT,
+ .ri_ntpc = NRD7914PTRK,
+ .ri_ncyl = 1152,
+ .ri_nblocks = 258048
+ },
+
+ [RD7946A] = {
+ .ri_hwid = RD7946AID,
+ .ri_desc = "7946A",
+ .ri_nbpt = NRD7945ABPT,
+ .ri_ntpc = NRD7945ATRK,
+ .ri_ncyl = 968,
+ .ri_nblocks = 108416
+ },
+
+ [RD9122D] = {
+ .ri_hwid = RD9134LID,
+ .ri_desc = "9122D",
+ .ri_nbpt = NRD9122SBPT,
+ .ri_ntpc = NRD9122STRK,
+ .ri_ncyl = 77,
+ .ri_nblocks = 1232
+ },
+
+ [RD7957B] = {
+ .ri_hwid = RD7957BID,
+ .ri_desc = "7957B",
+ .ri_nbpt = NRD7957BBPT,
+ .ri_ntpc = NRD7957BTRK,
+ .ri_ncyl = 1269,
+ .ri_nblocks = 159894
+ },
+
+ [RD7958B] = {
+ .ri_hwid = RD7958BID,
+ .ri_desc = "7958B",
+ .ri_nbpt = NRD7958BBPT,
+ .ri_ntpc = NRD7958BTRK,
+ .ri_ncyl = 786,
+ .ri_nblocks = 297108
+ },
+
+ [RD7959B] = {
+ .ri_hwid = RD7959BID,
+ .ri_desc = "7959B",
+ .ri_nbpt = NRD7959BBPT,
+ .ri_ntpc = NRD7959BTRK,
+ .ri_ncyl = 1572,
+ .ri_nblocks = 594216
+ },
+
+ [RD2200A] = {
+ .ri_hwid = RD2200AID,
+ .ri_desc = "2200A",
+ .ri_nbpt = NRD2200ABPT,
+ .ri_ntpc = NRD2200ATRK,
+ .ri_ncyl = 1449,
+ .ri_nblocks = 654948
+ },
+
+ [RD2203A] = {
+ .ri_hwid = RD2203AID,
+ .ri_desc = "2203A",
+ .ri_nbpt = NRD2203ABPT,
+ .ri_ntpc = NRD2203ATRK,
+ .ri_ncyl = 1449,
+ .ri_nblocks = 1309896
+ }
};
static const int numrdidentinfo = __arraycount(rdidentinfo);
+struct rdname2id {
+ const char *rn_name;
+ int rn_id;
+};
+static const struct rdname2id rdname2id[] = {
+ { RD7945ANAME, RD7945A },
+ { RD9134DNAME, RD9134D },
+ { RD7912PNAME, RD7912P },
+ { RD7914PNAME, RD7914P },
+ { RD7958ANAME, RD7958A },
+ { RD7957ANAME, RD7957A },
+ { RD7933HNAME, RD7933H },
+ { RD9134LNAME, RD9134L },
+ { RD7936HNAME, RD7936H },
+ { RD7937HNAME, RD7937H },
+ { RD7914CTNAME, RD7914CT },
+ { RD9122DNAME, RD9122D },
+ { RD7957BNAME, RD7957B },
+ { RD7958BNAME, RD7958B },
+ { RD7959BNAME, RD7959B },
+ { RD2200ANAME, RD2200A },
+ { RD2203ANAME, RD2203A }
+};
+static const int numrdname2id = __arraycount(rdname2id);
+
static int rdident(device_t, struct rd_softc *,
struct hpibbus_attach_args *);
static void rdreset(struct rd_softc *);
@@ -311,8 +450,36 @@ static int
rdmatch(device_t parent, cfdata_t cf, void *aux)
{
struct hpibbus_attach_args *ha = aux;
+ struct rd_clearcmd ccmd;
+ int ctlr, slave, punit;
+ int rv;
+ uint8_t stat;
+
+ rv = rdident(parent, NULL, ha);
- return rdident(parent, NULL, ha);
+ if (rv == 0)
+ return 0;
+
+ /*
+ * The supported device ID is probed.
+ * Check if the specified physical unit is actually supported
+ * by brandnew HP-IB emulator devices like HPDisk and HPDrive etc.
+ */
+ ctlr = device_unit(parent);
+ slave = ha->ha_slave;
+ punit = ha->ha_punit;
+ if (punit == 0)
+ return 1;
+
+ ccmd.c_unit = C_SUNIT(punit);
+ ccmd.c_cmd = C_CLEAR;
+ hpibsend(ctlr, slave, C_TCMD, &ccmd, sizeof(ccmd));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+ if (stat != 0)
+ return 0;
+
+ return 1;
}
static void
@@ -395,8 +562,7 @@ rdident(device_t parent, struct rd_softc
/* Is it one of the disks we support? */
for (id = 0; id < numrdidentinfo; id++)
- if (ha->ha_id == rdidentinfo[id].ri_hwid &&
- ha->ha_punit <= rdidentinfo[id].ri_maxunum)
+ if (ha->ha_id == rdidentinfo[id].ri_hwid)
break;
if (id == numrdidentinfo)
return 0;
@@ -458,27 +624,43 @@ rdident(device_t parent, struct rd_softc
*/
switch (ha->ha_id) {
case RD7946AID:
- if (memcmp(name, "079450", 6) == 0)
+ if (memcmp(name, RD7945ANAME, RDNAMELEN) == 0)
id = RD7945A;
else
id = RD7946A;
break;
case RD9134LID:
- if (memcmp(name, "091340", 6) == 0)
+ if (memcmp(name, RD9134LNAME, RDNAMELEN) == 0)
id = RD9134L;
else
id = RD9122D;
break;
case RD9134DID:
- if (memcmp(name, "091220", 6) == 0)
+ if (memcmp(name, RD9122SNAME, RDNAMELEN) == 0)
id = RD9122S;
else
id = RD9134D;
break;
}
+ /*
+ * HPDisk can have independent physical units that are not
+ * corresponding to device IDs.
+ * To handle this, we have to check names in the drive description
+ * data for punit >= 1.
+ */
+ if (ha->ha_punit >= 1) {
+ for (i = 0; i < numrdname2id; i++) {
+ if (memcmp(name, rdname2id[i].rn_name,
+ RDNAMELEN) == 0) {
+ id = rdname2id[i].rn_id;
+ break;
+ }
+ }
+ }
+
sc->sc_type = id;
return 1;
Index: src/sys/arch/hp300/dev/rdreg.h
diff -u src/sys/arch/hp300/dev/rdreg.h:1.15 src/sys/arch/hp300/dev/rdreg.h:1.16
--- src/sys/arch/hp300/dev/rdreg.h:1.15 Mon Jul 5 14:51:23 2021
+++ src/sys/arch/hp300/dev/rdreg.h Fri Jul 9 17:05:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rdreg.h,v 1.15 2021/07/05 14:51:23 tsutsui Exp $ */
+/* $NetBSD: rdreg.h,v 1.16 2021/07/09 17:05:33 tsutsui Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -121,6 +121,28 @@ struct rd_clearcmd {
#define RD2200AID 0x22F
#define RD2203AID 0x230 /* yet another guess */
+/* Drive names -- per identify description structure */
+#define RD7945ANAME "079450"
+#define RD9134DNAME "091340"
+#define RD9122SNAME "091220"
+#define RD7912PNAME "079120"
+#define RD7914PNAME "079140"
+#define RD7958ANAME "079580"
+#define RD7957ANAME "079570"
+#define RD7933HNAME "079330"
+#define RD9134LNAME "091340"
+#define RD7936HNAME "079360"
+#define RD7937HNAME "079370"
+#define RD7914CTNAME "079140"
+#define RD9122DNAME RD9122SNAME
+#define RD7957BNAME "079571"
+#define RD7958BNAME "079581"
+#define RD7959BNAME "079591"
+#define RD2200ANAME "022000"
+#define RD2203ANAME "022030"
+
+#define RDNAMELEN 6
+
/* SW ids -- indicies into rdidentinfo, order is arbitrary */
#define RD7945A 0
#define RD9134D 1
@@ -139,6 +161,8 @@ struct rd_clearcmd {
#define RD7957B 14
#define RD7958B 15
#define RD7959B 16
+#define RD2200A 17
+#define RD2203A 18
#define NRD7945ABPT 16
#define NRD7945ATRK 7
Index: src/sys/arch/hp300/dev/rdvar.h
diff -u src/sys/arch/hp300/dev/rdvar.h:1.25 src/sys/arch/hp300/dev/rdvar.h:1.26
--- src/sys/arch/hp300/dev/rdvar.h:1.25 Mon Jul 5 14:51:23 2021
+++ src/sys/arch/hp300/dev/rdvar.h Fri Jul 9 17:05:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rdvar.h,v 1.25 2021/07/05 14:51:23 tsutsui Exp $ */
+/* $NetBSD: rdvar.h,v 1.26 2021/07/09 17:05:33 tsutsui Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -42,8 +42,7 @@
#include <sys/rndsource.h>
struct rdidentinfo {
- short ri_hwid; /* 2 byte HW id */
- short ri_maxunum; /* maximum allowed unit number */
+ uint16_t ri_hwid; /* 2 byte HW id */
const char *ri_desc; /* drive type description */
int ri_nbpt; /* DEV_BSIZE blocks per track */
int ri_ntpc; /* tracks per cylinder */