Module Name:    src
Committed By:   martin
Date:           Tue Dec  6 19:26:06 UTC 2022

Modified Files:
        src/sys/arch/hp300/dev [netbsd-9]: rd.c rdreg.h rdvar.h
        src/sys/arch/hp300/stand/common [netbsd-9]: rd.c

Log Message:
Pull up following revision(s) (requested by tsutsui in ticket #1552):

        sys/arch/hp300/dev/rd.c: revision 1.120
        sys/arch/hp300/dev/rd.c: revision 1.121
        sys/arch/hp300/dev/rd.c: revision 1.122
        sys/arch/hp300/dev/rd.c: revision 1.123
        sys/arch/hp300/dev/rd.c: revision 1.124
        sys/arch/hp300/dev/rdreg.h: revision 1.19
        sys/arch/hp300/dev/rd.c: revision 1.111
        sys/arch/hp300/dev/rd.c: revision 1.112
        sys/arch/hp300/dev/rd.c: revision 1.113
        sys/arch/hp300/stand/common/rd.c: revision 1.12
        sys/arch/hp300/dev/rd.c: revision 1.114
        sys/arch/hp300/stand/common/rd.c: revision 1.13
        sys/arch/hp300/dev/rd.c: revision 1.115
        sys/arch/hp300/stand/common/rd.c: revision 1.14
        sys/arch/hp300/dev/rd.c: revision 1.116
        sys/arch/hp300/stand/common/rd.c: revision 1.15
        sys/arch/hp300/dev/rd.c: revision 1.117
        sys/arch/hp300/dev/rd.c: revision 1.118
        sys/arch/hp300/dev/rd.c: revision 1.119
        sys/arch/hp300/dev/rdvar.h: revision 1.27
        sys/arch/hp300/dev/rdreg.h: revision 1.20

Sync a list of HP-IB disk IDs with kernel's one.
Now bootloader can boot from 2202A, 7908A, 7911A, and 7941A.
Tested on 425t and HPDisk.

Make local variables static and read only ones const.

Use common macro for numbers of cylinders and blocks for HP-IB disks.
No binary changes.

Fix "rd(4) at punits not configured on HPDisk are misprobed" problem.
- check not only stat value returned by C_QSTAT command against
  each punit but also desc.d_name returned by C_DESC command
  because it looks HPDisk responds to commands against punits supported
  but not-configured punits at 1-3
- prepare rdreset_unit() function to manage reset punit ops during
  probe without valid softc

The stragety is taken from OpenBSD with several modification.
Tested on 425t with real 9122D and HPDisk emulating two 7937H drives.
Should be pulled up to netbsd-9.

Remove now unused buffer members from softc prepared only for rdreset().

Use proper integer types for HP-IB xfer parameters.
No visible regression on 425t and HPDisk.

Sync with rdreg.h integer type changes.

Remove unnecessary declarations.

Check bounds of RAW_PART by bounds_check_with_mediasize() as other drivers.
With this check, dd(1) without a count value against a raw partition
is terminated properly at the end of media.  Tested on 425t and HPDisk.
Should be pulled up to netbsd-9.

Check bounds of each partition by MI bounds_check_with_label(9).
The previous implementation was committed in rev 1.26 about 26 years ago
and it looks there is no quirk to use the old MD one.

Pass a correct dev_t arg to disk_ioctl().
Probably harmless.

Remove a duplicated static function declaration.

Set disk_geom parameters required by DIOCGPARTINFO in disk_ioctl().
With this change raid(4) no longer complains before mountroot:
RAIDframe: can't get disk size for dev rd0 (22)
Should be pulled up to netbsd-9.

Use proper RAW_PART macro rather than a magic number.

Remove more duplicated static function declarations.

Misc KNF and cosmetics.

Add empty DIOCCACHESYNC ioctl(2) for rd(4).
Without this raid(4) always complains on various raidctl(8) ops:
raid0: cache flush[0] to component 0 failed (22)
RAID1 configured by raid(4) just works HP-IB disks on hp300.

Explicitly include <sys/kernel.h> for hz(9) as man pages says.
XXX: it looks sys/param.h r1.615 and later also has extern int hz


To generate a diff of this commit:
cvs rdiff -u -r1.101.22.1 -r1.101.22.2 src/sys/arch/hp300/dev/rd.c
cvs rdiff -u -r1.13.60.1 -r1.13.60.2 src/sys/arch/hp300/dev/rdreg.h
cvs rdiff -u -r1.23.22.1 -r1.23.22.2 src/sys/arch/hp300/dev/rdvar.h
cvs rdiff -u -r1.10.58.1 -r1.10.58.2 src/sys/arch/hp300/stand/common/rd.c

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/rd.c
diff -u src/sys/arch/hp300/dev/rd.c:1.101.22.1 src/sys/arch/hp300/dev/rd.c:1.101.22.2
--- src/sys/arch/hp300/dev/rd.c:1.101.22.1	Wed Jul 14 18:04:04 2021
+++ src/sys/arch/hp300/dev/rd.c	Tue Dec  6 19:26:06 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rd.c,v 1.101.22.1 2021/07/14 18:04:04 martin Exp $	*/
+/*	$NetBSD: rd.c,v 1.101.22.2 2022/12/06 19:26:06 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -72,12 +72,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rd.c,v 1.101.22.1 2021/07/14 18:04:04 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rd.c,v 1.101.22.2 2022/12/06 19:26:06 martin Exp $");
 
 #include "opt_useleds.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/kernel.h>
 #include <sys/buf.h>
 #include <sys/bufq.h>
 #include <sys/conf.h>
@@ -102,7 +103,7 @@ __KERNEL_RCSID(0, "$NetBSD: rd.c,v 1.101
 
 #include "ioconf.h"
 
-int	rderrthresh = RDRETRY-1;	/* when to start reporting errors */
+int	rderrthresh = RDRETRY - 1;	/* when to start reporting errors */
 
 #ifdef DEBUG
 /* error message tables */
@@ -191,8 +192,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7945A",
 		.ri_nbpt = NRD7945ABPT,
 		.ri_ntpc = NRD7945ATRK,
-		.ri_ncyl = 968,
-		.ri_nblocks = 108416
+		.ri_ncyl = NRD7945ACYL,
+		.ri_nblocks = NRD7945ABLK
 	},
 
 	[RD9134D] = {
@@ -200,8 +201,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "9134D",
 		.ri_nbpt = NRD9134DBPT,
 		.ri_ntpc = NRD9134DTRK,
-		.ri_ncyl = 303,
-		.ri_nblocks = 29088
+		.ri_ncyl = NRD9134DCYL,
+		.ri_nblocks = NRD9134DBLK
 	},
 
 	[RD9122S] = {
@@ -209,8 +210,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "9122S",
 		.ri_nbpt = NRD9122SBPT,
 		.ri_ntpc = NRD9122STRK,
-		.ri_ncyl = 77,
-		.ri_nblocks = 1232
+		.ri_ncyl = NRD9122SCYL,
+		.ri_nblocks = NRD9122SBLK
 	},
 
 	[RD7912P] = {
@@ -218,8 +219,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7912P",
 		.ri_nbpt = NRD7912PBPT,
 		.ri_ntpc = NRD7912PTRK,
-		.ri_ncyl = 572,
-		.ri_nblocks = 128128
+		.ri_ncyl = NRD7912PCYL,
+		.ri_nblocks = NRD7912PBLK
 	},
 
 	[RD7914P] = {
@@ -227,8 +228,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7914P",
 		.ri_nbpt = NRD7914PBPT,
 		.ri_ntpc = NRD7914PTRK,
-		.ri_ncyl = 1152,
-		.ri_nblocks = 258048
+		.ri_ncyl = NRD7914PCYL,
+		.ri_nblocks = NRD7914PBLK
 	},
 
 	[RD7958A] = {
@@ -236,8 +237,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7958A",
 		.ri_nbpt = NRD7958ABPT,
 		.ri_ntpc = NRD7958ATRK,
-		.ri_ncyl = 1013,
-		.ri_nblocks = 255276
+		.ri_ncyl = NRD7958ACYL,
+		.ri_nblocks = NRD7958ABLK
 	},
 
 	[RD7957A] = {
@@ -245,8 +246,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7957A",
 		.ri_nbpt = NRD7957ABPT,
 		.ri_ntpc = NRD7957ATRK,
-		.ri_ncyl = 1036,
-		.ri_nblocks = 159544
+		.ri_ncyl = NRD7957ACYL,
+		.ri_nblocks = NRD7957ABLK
 	},
 
 	[RD7933H] = {
@@ -254,8 +255,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7933H",
 		.ri_nbpt = NRD7933HBPT,
 		.ri_ntpc = NRD7933HTRK,
-		.ri_ncyl = 1321,
-		.ri_nblocks = 789958
+		.ri_ncyl = NRD7933HCYL,
+		.ri_nblocks = NRD7933HBLK
 	},
 
 	[RD9134L] = {
@@ -263,8 +264,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "9134L",
 		.ri_nbpt = NRD9134LBPT,
 		.ri_ntpc = NRD9134LTRK,
-		.ri_ncyl = 973,
-		.ri_nblocks = 77840
+		.ri_ncyl = NRD9134LCYL,
+		.ri_nblocks = NRD9134LBLK
 	},
 
 	[RD7936H] = {
@@ -272,8 +273,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7936H",
 		.ri_nbpt = NRD7936HBPT,
 		.ri_ntpc = NRD7936HTRK,
-		.ri_ncyl = 698,
-		.ri_nblocks = 600978
+		.ri_ncyl = NRD7936HCYL,
+		.ri_nblocks = NRD7936HBLK
 	},
 
 	[RD7937H] = {
@@ -281,8 +282,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7937H",
 		.ri_nbpt = NRD7937HBPT,
 		.ri_ntpc = NRD7937HTRK,
-		.ri_ncyl = 698,
-		.ri_nblocks = 1116102
+		.ri_ncyl = NRD7937HCYL,
+		.ri_nblocks = NRD7937HBLK
 	},
 
 	[RD7914CT] = {
@@ -290,8 +291,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7914CT",
 		.ri_nbpt = NRD7914PBPT,
 		.ri_ntpc = NRD7914PTRK,
-		.ri_ncyl = 1152,
-		.ri_nblocks = 258048
+		.ri_ncyl = NRD7914PCYL,
+		.ri_nblocks = NRD7914PBLK
 	},
 
 	[RD7946A] = {
@@ -299,8 +300,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7946A",
 		.ri_nbpt = NRD7945ABPT,
 		.ri_ntpc = NRD7945ATRK,
-		.ri_ncyl = 968,
-		.ri_nblocks = 108416
+		.ri_ncyl = NRD7945ACYL,
+		.ri_nblocks = NRD7945ABLK
 	},
 
 	[RD9122D] = {
@@ -308,8 +309,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "9122D",
 		.ri_nbpt = NRD9122SBPT,
 		.ri_ntpc = NRD9122STRK,
-		.ri_ncyl = 77,
-		.ri_nblocks = 1232
+		.ri_ncyl = NRD9122SCYL,
+		.ri_nblocks = NRD9122SBLK
 	},
 
 	[RD7957B] = {
@@ -317,8 +318,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7957B",
 		.ri_nbpt = NRD7957BBPT,
 		.ri_ntpc = NRD7957BTRK,
-		.ri_ncyl = 1269,
-		.ri_nblocks = 159894
+		.ri_ncyl = NRD7957BCYL,
+		.ri_nblocks = NRD7957BBLK
 	},
 
 	[RD7958B] = {
@@ -326,8 +327,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7958B",
 		.ri_nbpt = NRD7958BBPT,
 		.ri_ntpc = NRD7958BTRK,
-		.ri_ncyl = 786,
-		.ri_nblocks = 297108
+		.ri_ncyl = NRD7958BCYL,
+		.ri_nblocks = NRD7958BBLK
 	},
 
 	[RD7959B] = {
@@ -335,8 +336,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7959B",
 		.ri_nbpt = NRD7959BBPT,
 		.ri_ntpc = NRD7959BTRK,
-		.ri_ncyl = 1572,
-		.ri_nblocks = 594216
+		.ri_ncyl = NRD7959BCYL,
+		.ri_nblocks = NRD7959BBLK
 	},
 
 	[RD2200A] = {
@@ -344,8 +345,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "2200A",
 		.ri_nbpt = NRD2200ABPT,
 		.ri_ntpc = NRD2200ATRK,
-		.ri_ncyl = 1449,
-		.ri_nblocks = 654948
+		.ri_ncyl = NRD2200ACYL,
+		.ri_nblocks = NRD2200ABLK
 	},
 
 	[RD2203A] = {
@@ -353,8 +354,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "2203A",
 		.ri_nbpt = NRD2203ABPT,
 		.ri_ntpc = NRD2203ATRK,
-		.ri_ncyl = 1449,
-		.ri_nblocks = 1309896
+		.ri_ncyl = NRD2203ACYL,
+		.ri_nblocks = NRD2203ABLK
 	},
 
 	[RD2202A] = {
@@ -362,8 +363,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "2202A",
 		.ri_nbpt = NRD2202ABPT,
 		.ri_ntpc = NRD2202ATRK,
-		.ri_ncyl = 1449,
-		.ri_nblocks = 1309896
+		.ri_ncyl = NRD2202ACYL,
+		.ri_nblocks = NRD2202ABLK
 	},
 
 	[RD7908A] = {
@@ -371,8 +372,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7908A",
 		.ri_nbpt = NRD7908ABPT,
 		.ri_ntpc = NRD7908ATRK,
-		.ri_ncyl = 185,
-		.ri_nblocks = 32375
+		.ri_ncyl = NRD7908ACYL,
+		.ri_nblocks = NRD7908ABLK
 	},
 
 	[RD7911A] = {
@@ -380,8 +381,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7911A",
 		.ri_nbpt = NRD7911ABPT,
 		.ri_ntpc = NRD7911ATRK,
-		.ri_ncyl = 572,
-		.ri_nblocks = 54912
+		.ri_ncyl = NRD7911ACYL,
+		.ri_nblocks = NRD7911ABLK
 	},
 
 	[RD7941A] = {
@@ -389,8 +390,8 @@ static const struct rdidentinfo rdidenti
 		.ri_desc = "7941A",
 		.ri_nbpt = NRD7941ABPT,
 		.ri_ntpc = NRD7941ATRK,
-		.ri_ncyl = 968,
-		.ri_nblocks = 46464
+		.ri_ncyl = NRD7941ACYL,
+		.ri_nblocks = NRD7941ABLK
 	}
 };
 static const int numrdidentinfo = __arraycount(rdidentinfo);
@@ -427,10 +428,9 @@ static const int numrdname2id = __arrayc
 static int	rdident(device_t, struct rd_softc *,
 		    struct hpibbus_attach_args *);
 static void	rdreset(struct rd_softc *);
-static void	rdustart(struct rd_softc *);
+static void	rdreset_unit(int, int, int);
+static void	rd_set_geom(struct rd_softc *);
 static int	rdgetinfo(dev_t);
-static void	rdrestart(void *);
-static struct buf *rdfinish(struct rd_softc *, struct buf *);
 
 static void	rdgetdefaultlabel(struct rd_softc *, struct disklabel *);
 static void	rdrestart(void *);
@@ -490,36 +490,8 @@ 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);
-
-	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;
+	return rdident(parent, NULL, ha);
 }
 
 static void
@@ -559,6 +531,7 @@ rdattach(device_t parent, device_t self,
 	memset(&sc->sc_dkdev, 0, sizeof(sc->sc_dkdev));
 	disk_init(&sc->sc_dkdev, device_xname(sc->sc_dev), NULL);
 	disk_attach(&sc->sc_dkdev);
+	rd_set_geom(sc);
 
 	sc->sc_slave = ha->ha_slave;
 	sc->sc_punit = ha->ha_punit;
@@ -575,7 +548,7 @@ rdattach(device_t parent, device_t self,
 	sc->sc_flags = RDF_ALIVE;
 #ifdef DEBUG
 	/* always report errors */
-	if (rddebug & RDB_ERROR)
+	if ((rddebug & RDB_ERROR) != 0)
 		rderrthresh = 0;
 #endif
 	/*
@@ -589,7 +562,7 @@ static int
 rdident(device_t parent, struct rd_softc *sc, struct hpibbus_attach_args *ha)
 {
 	struct cs80_describe desc;
-	u_char stat, cmd[3];
+	uint8_t stat, cmd[3];
 	char name[7];
 	int i, id, n, ctlr, slave;
 
@@ -608,29 +581,45 @@ rdident(device_t parent, struct rd_softc
 		return 0;
 
 	/*
-	 * If we're just probing for the device, that's all the
-	 * work we need to do.
+	 * The supported dvice ID is probed.
+	 * Check if the specified physical unit is actually supported
+	 * by brandnew HP-IB emulator devices like HPDisk and HPDrive etc.
 	 */
-	if (sc == NULL)
-		return 1;
-
 	/*
 	 * Reset device and collect description
 	 */
-	rdreset(sc);
+	memset(&desc, 0, sizeof(desc));
+	stat = 0;
+	rdreset_unit(ctlr, slave, ha->ha_punit);
 	cmd[0] = C_SUNIT(ha->ha_punit);
 	cmd[1] = C_SVOL(0);
 	cmd[2] = C_DESC;
 	hpibsend(ctlr, slave, C_CMD, cmd, sizeof(cmd));
 	hpibrecv(ctlr, slave, C_EXEC, &desc, sizeof(desc));
 	hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
+	if (stat != 0 || desc.d_name == 0) {
+		/*
+		 * No valid response from the specified punit.
+		 *
+		 * Note it looks HPDisk responds to commands against
+		 * supported but not-configured punits at 1 to 3.
+		 */
+		return 0;
+	}
+
+	/*
+	 * If we're just probing for the device, that's all the
+	 * work we need to do.
+	 */
+	if (sc == NULL)
+		return 1;
+
 	memset(name, 0, sizeof(name));
-	if (stat == 0) {
-		n = desc.d_name;
-		for (i = 5; i >= 0; i--) {
-			name[i] = (n & 0xf) + '0';
-			n >>= 4;
-		}
+	n = desc.d_name;
+	for (i = 5; i >= 0; i--) {
+		name[i] = (n & 0xf) + '0';
+		n >>= 4;
 	}
 
 #ifdef DEBUG
@@ -711,36 +700,65 @@ rdident(device_t parent, struct rd_softc
 static void
 rdreset(struct rd_softc *sc)
 {
-	int ctlr = device_unit(device_parent(sc->sc_dev));
-	int slave = sc->sc_slave;
-	u_char stat;
-
-	sc->sc_clear.c_unit = C_SUNIT(sc->sc_punit);
-	sc->sc_clear.c_cmd = C_CLEAR;
-	hpibsend(ctlr, slave, C_TCMD, &sc->sc_clear, sizeof(sc->sc_clear));
+	int ctlr, slave, punit;
+
+	ctlr = device_unit(device_parent(sc->sc_dev));
+	slave = sc->sc_slave;
+	punit = sc->sc_punit;
+	rdreset_unit(ctlr, slave, punit);
+#ifdef DEBUG
+	sc->sc_stats.rdresets++;
+#endif
+}
+
+static void
+rdreset_unit(int ctlr, int slave, int punit)
+{
+	struct rd_ssmcmd ssmc;
+	struct rd_srcmd src;
+	struct rd_clearcmd clear;
+	uint8_t stat;
+
+	clear.c_unit = C_SUNIT(punit);
+	clear.c_cmd = C_CLEAR;
+	hpibsend(ctlr, slave, C_TCMD, &clear, sizeof(clear));
 	hpibswait(ctlr, slave);
 	hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
 
-	sc->sc_src.c_unit = C_SUNIT(RDCTLR);
-	sc->sc_src.c_nop = C_NOP;
-	sc->sc_src.c_cmd = C_SREL;
-	sc->sc_src.c_param = C_REL;
-	hpibsend(ctlr, slave, C_CMD, &sc->sc_src, sizeof(sc->sc_src));
+	src.c_unit = C_SUNIT(RDCTLR);
+	src.c_nop = C_NOP;
+	src.c_cmd = C_SREL;
+	src.c_param = C_REL;
+	hpibsend(ctlr, slave, C_CMD, &src, sizeof(src));
 	hpibswait(ctlr, slave);
 	hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
 
-	sc->sc_ssmc.c_unit = C_SUNIT(sc->sc_punit);
-	sc->sc_ssmc.c_cmd = C_SSM;
-	sc->sc_ssmc.c_refm = REF_MASK;
-	sc->sc_ssmc.c_fefm = FEF_MASK;
-	sc->sc_ssmc.c_aefm = AEF_MASK;
-	sc->sc_ssmc.c_iefm = IEF_MASK;
-	hpibsend(ctlr, slave, C_CMD, &sc->sc_ssmc, sizeof(sc->sc_ssmc));
+	ssmc.c_unit = C_SUNIT(punit);
+	ssmc.c_cmd = C_SSM;
+	ssmc.c_refm = REF_MASK;
+	ssmc.c_fefm = FEF_MASK;
+	ssmc.c_aefm = AEF_MASK;
+	ssmc.c_iefm = IEF_MASK;
+	hpibsend(ctlr, slave, C_CMD, &ssmc, sizeof(ssmc));
 	hpibswait(ctlr, slave);
 	hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
-#ifdef DEBUG
-	sc->sc_stats.rdresets++;
-#endif
+}
+
+static void
+rd_set_geom(struct rd_softc *sc)
+{
+	struct disk_geom *dg = &sc->sc_dkdev.dk_geom;
+	const struct rdidentinfo *ri = &rdidentinfo[sc->sc_type];
+
+	memset(dg, 0, sizeof(*dg));
+
+	dg->dg_secsize = DEV_BSIZE;
+	dg->dg_nsectors = ri->ri_nbpt;
+	dg->dg_ntracks = ri->ri_ntpc;
+	dg->dg_ncylinders = ri->ri_ncyl;
+	dg->dg_secperunit = ri->ri_nblocks;
+
+	disk_set_info(sc->sc_dev, &sc->sc_dkdev, ri->ri_desc);
 }
 
 /*
@@ -771,7 +789,7 @@ rdgetinfo(dev_t dev)
 	pi = lp->d_partitions;
 	printf("%s: WARNING: %s\n", device_xname(sc->sc_dev), msg);
 
-	pi[2].p_size = rdidentinfo[sc->sc_type].ri_nblocks;
+	pi[RAW_PART].p_size = rdidentinfo[sc->sc_type].ri_nblocks;
 	/* XXX reset other info since readdisklabel screws with it */
 	lp->d_npartitions = 3;
 	pi[0].p_size = 0;
@@ -795,8 +813,8 @@ rdopen(dev_t dev, int flags, int mode, s
 	/*
 	 * Wait for any pending opens/closes to complete
 	 */
-	while (sc->sc_flags & (RDF_OPENING|RDF_CLOSING))
-		(void) tsleep(sc, PRIBIO, "rdopen", 0);
+	while ((sc->sc_flags & (RDF_OPENING | RDF_CLOSING)) != 0)
+		(void)tsleep(sc, PRIBIO, "rdopen", 0);
 
 	/*
 	 * On first open, get label and partition info.
@@ -861,10 +879,10 @@ rdclose(dev_t dev, int flag, int mode, s
 		s = splbio();
 		while (sc->sc_active) {
 			sc->sc_flags |= RDF_WANTED;
-			(void) tsleep(&sc->sc_tab, PRIBIO, "rdclose", 0);
+			(void)tsleep(&sc->sc_tab, PRIBIO, "rdclose", 0);
 		}
 		splx(s);
-		sc->sc_flags &= ~(RDF_CLOSING|RDF_WLABEL);
+		sc->sc_flags &= ~(RDF_CLOSING | RDF_WLABEL);
 		wakeup((void *)sc);
 	}
 	return 0;
@@ -876,51 +894,30 @@ rdstrategy(struct buf *bp)
 	struct rd_softc *sc = device_lookup_private(&rd_cd, rdunit(bp->b_dev));
 	struct partition *pinfo;
 	daddr_t bn;
-	int sz, s;
+	int s;
 	int offset;
 
 #ifdef DEBUG
-	if (rddebug & RDB_FOLLOW)
-		printf("rdstrategy(%p): dev %"PRIx64", bn %llx, bcount %x, %c\n",
-		       bp, bp->b_dev, bp->b_blkno, bp->b_bcount,
-		       (bp->b_flags & B_READ) ? 'R' : 'W');
+	if ((rddebug & RDB_FOLLOW) != 0)
+		printf("rdstrategy(%p): dev %" PRIx64
+		    ", bn %llx, bcount %x, %c\n",
+		    bp, bp->b_dev, bp->b_blkno, bp->b_bcount,
+		    (bp->b_flags & B_READ) != 0 ? 'R' : 'W');
 #endif
 	bn = bp->b_blkno;
-	sz = howmany(bp->b_bcount, DEV_BSIZE);
 	pinfo = &sc->sc_dkdev.dk_label->d_partitions[rdpart(bp->b_dev)];
 
 	/* Don't perform partition translation on RAW_PART. */
 	offset = (rdpart(bp->b_dev) == RAW_PART) ? 0 : pinfo->p_offset;
 
-	if (rdpart(bp->b_dev) != RAW_PART) {
-		/*
-		 * XXX This block of code belongs in
-		 * XXX bounds_check_with_label()
-		 */
-
-		if (bn < 0 || bn + sz > pinfo->p_size) {
-			sz = pinfo->p_size - bn;
-			if (sz == 0) {
-				bp->b_resid = bp->b_bcount;
-				goto done;
-			}
-			if (sz < 0) {
-				bp->b_error = EINVAL;
-				goto done;
-			}
-			bp->b_bcount = dbtob(sz);
-		}
-		/*
-		 * Check for write to write protected label
-		 */
-		if (bn + offset <= LABELSECTOR &&
-#if LABELSECTOR != 0
-		    bn + offset + sz > LABELSECTOR &&
-#endif
-		    !(bp->b_flags & B_READ) && !(sc->sc_flags & RDF_WLABEL)) {
-			bp->b_error = EROFS;
+	if (rdpart(bp->b_dev) == RAW_PART) {
+		if (bounds_check_with_mediasize(bp, DEV_BSIZE,
+		    rdidentinfo[sc->sc_type].ri_nblocks) <= 0)
+			goto done;
+	} else {
+		if (bounds_check_with_label(&sc->sc_dkdev, bp,
+		    (sc->sc_flags & RDF_WLABEL) != 0) <= 0)
 			goto done;
-		}
 	}
 	bp->b_rawblkno = bn + offset;
 	s = splbio();
@@ -931,7 +928,7 @@ rdstrategy(struct buf *bp)
 	}
 	splx(s);
 	return;
-done:
+ done:
 	biodone(bp);
 }
 
@@ -941,8 +938,11 @@ done:
 static void
 rdrestart(void *arg)
 {
-	int s = splbio();
-	rdustart((struct rd_softc *)arg);
+	struct rd_softc *sc = arg;
+	int s;
+
+	s = splbio();
+	rdustart(sc);
 	splx(s);
 }
 
@@ -970,7 +970,7 @@ rdfinish(struct rd_softc *sc, struct buf
 	if ((bp = bufq_peek(sc->sc_tab)) != NULL)
 		return bp;
 	sc->sc_active = 0;
-	if (sc->sc_flags & RDF_WANTED) {
+	if ((sc->sc_flags & RDF_WANTED) != 0) {
 		sc->sc_flags &= ~RDF_WANTED;
 		wakeup((void *)&sc->sc_tab);
 	}
@@ -987,7 +987,7 @@ rdstart(void *arg)
 	ctlr = device_unit(device_parent(sc->sc_dev));
 	slave = sc->sc_slave;
 
-again:
+ again:
 #ifdef DEBUG
 	if (rddebug & RDB_FOLLOW)
 		printf("rdstart(%s): bp %p, %c\n", device_xname(sc->sc_dev), bp,
@@ -1002,22 +1002,22 @@ again:
 	sc->sc_ioc.c_nop2 = C_NOP;
 	sc->sc_ioc.c_slen = C_SLEN;
 	sc->sc_ioc.c_len = sc->sc_resid;
-	sc->sc_ioc.c_cmd = bp->b_flags & B_READ ? C_READ : C_WRITE;
+	sc->sc_ioc.c_cmd = (bp->b_flags & B_READ) != 0 ? C_READ : C_WRITE;
 #ifdef DEBUG
-	if (rddebug & RDB_IO)
+	if ((rddebug & RDB_IO) != 0)
 		printf("rdstart: hpibsend(%x, %x, %x, %p, %x)\n",
-		       ctlr, slave, C_CMD,
-		       &sc->sc_ioc.c_unit, sizeof(sc->sc_ioc) - 2);
+		    ctlr, slave, C_CMD,
+		    &sc->sc_ioc.c_unit, sizeof(sc->sc_ioc) - 2);
 #endif
 	if (hpibsend(ctlr, slave, C_CMD, &sc->sc_ioc.c_unit,
-		     sizeof(sc->sc_ioc) - 2) == sizeof(sc->sc_ioc) - 2) {
+	    sizeof(sc->sc_ioc) - 2) == sizeof(sc->sc_ioc) - 2) {
 
 		/* Instrumentation. */
 		disk_busy(&sc->sc_dkdev);
 		iostat_seek(sc->sc_dkdev.dk_stats);
 
 #ifdef DEBUG
-		if (rddebug & RDB_IO)
+		if ((rddebug & RDB_IO) != 0)
 			printf("rdstart: hpibawait(%x)\n", ctlr);
 #endif
 		hpibawait(ctlr);
@@ -1030,8 +1030,8 @@ again:
 	 * integrate this with the backoff code in rderror.
 	 */
 #ifdef DEBUG
-	if (rddebug & RDB_ERROR)
-		printf("%s: rdstart: cmd %x adr %lx blk %lld len %d ecnt %d\n",
+	if ((rddebug & RDB_ERROR) != 0)
+		printf("%s: rdstart: cmd %x adr %x blk %lld len %d ecnt %d\n",
 		    device_xname(sc->sc_dev),
 		    sc->sc_ioc.c_cmd, sc->sc_ioc.c_addr,
 		    bp->b_blkno, sc->sc_resid, sc->sc_errcnt);
@@ -1041,12 +1041,12 @@ again:
 	rdreset(sc);
 	if (sc->sc_errcnt++ < RDRETRY)
 		goto again;
-	printf("%s: rdstart err: cmd 0x%x sect %ld blk %" PRId64 " len %d\n",
+	printf("%s: rdstart err: cmd 0x%x sect %u blk %" PRId64 " len %d\n",
 	    device_xname(sc->sc_dev), sc->sc_ioc.c_cmd, sc->sc_ioc.c_addr,
 	    bp->b_blkno, sc->sc_resid);
 	bp->b_error = EIO;
 	bp = rdfinish(sc, bp);
-	if (bp) {
+	if (bp != NULL) {
 		sc->sc_addr = bp->b_data;
 		sc->sc_resid = bp->b_bcount;
 		if (hpibreq(device_parent(sc->sc_dev), &sc->sc_hq))
@@ -1082,14 +1082,14 @@ rdintr(void *arg)
 	struct rd_softc *sc = arg;
 	int unit = device_unit(sc->sc_dev);
 	struct buf *bp = bufq_peek(sc->sc_tab);
-	u_char stat = 13;	/* in case hpibrecv fails */
+	uint8_t stat = 13;	/* in case hpibrecv fails */
 	int rv, restart, ctlr, slave;
 
 	ctlr = device_unit(device_parent(sc->sc_dev));
 	slave = sc->sc_slave;
 
 #ifdef DEBUG
-	if (rddebug & RDB_FOLLOW)
+	if ((rddebug & RDB_FOLLOW) != 0)
 		printf("rdintr(%d): bp %p, %c, flags %x\n", unit, bp,
 		    (bp->b_flags & B_READ) ? 'R' : 'W', sc->sc_flags);
 	if (bp == NULL) {
@@ -1100,7 +1100,7 @@ rdintr(void *arg)
 	disk_unbusy(&sc->sc_dkdev, (bp->b_bcount - bp->b_resid),
 	    (bp->b_flags & B_READ));
 
-	if (sc->sc_flags & RDF_SEEK) {
+	if ((sc->sc_flags & RDF_SEEK) != 0) {
 		sc->sc_flags &= ~RDF_SEEK;
 		if (hpibustart(ctlr))
 			rdgo(sc);
@@ -1124,7 +1124,7 @@ rdintr(void *arg)
 	} else
 		sc->sc_flags &= ~RDF_SWAIT;
 	rv = hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
-	if (rv != 1 || stat) {
+	if (rv != 1 || stat != 0) {
 #ifdef DEBUG
 		if (rddebug & RDB_ERROR)
 			printf("rdintr: recv failed or bad stat %d\n", stat);
@@ -1149,7 +1149,7 @@ static int
 rdstatus(struct rd_softc *sc)
 {
 	int c, s;
-	u_char stat;
+	uint8_t stat;
 	int rv;
 
 	c = device_unit(device_parent(sc->sc_dev));
@@ -1162,7 +1162,7 @@ rdstatus(struct rd_softc *sc)
 	rv = hpibsend(c, s, C_CMD, &sc->sc_rsc, sizeof(sc->sc_rsc));
 	if (rv != sizeof(sc->sc_rsc)) {
 #ifdef DEBUG
-		if (rddebug & RDB_STATUS)
+		if ((rddebug & RDB_STATUS) != 0)
 			printf("rdstatus: send C_CMD failed %d != %d\n",
 			    rv, sizeof(sc->sc_rsc));
 #endif
@@ -1171,16 +1171,16 @@ rdstatus(struct rd_softc *sc)
 	rv = hpibrecv(c, s, C_EXEC, &sc->sc_stat, sizeof(sc->sc_stat));
 	if (rv != sizeof(sc->sc_stat)) {
 #ifdef DEBUG
-		if (rddebug & RDB_STATUS)
+		if ((rddebug & RDB_STATUS) != 0)
 			printf("rdstatus: send C_EXEC failed %d != %d\n",
 			    rv, sizeof(sc->sc_stat));
 #endif
 		return 1;
 	}
 	rv = hpibrecv(c, s, C_QSTAT, &stat, 1);
-	if (rv != 1 || stat) {
+	if (rv != 1 || stat != 0) {
 #ifdef DEBUG
-		if (rddebug & RDB_STATUS)
+		if ((rddebug & RDB_STATUS) != 0)
 			printf("rdstatus: recv failed %d or bad stat %d\n",
 			    rv, stat);
 #endif
@@ -1197,13 +1197,12 @@ rdstatus(struct rd_softc *sc)
 static int
 rderror(int unit)
 {
-	struct rd_softc *sc = device_lookup_private(&rd_cd,unit);
+	struct rd_softc *sc = device_lookup_private(&rd_cd, unit);
 	struct rd_stat *sp;
 	struct buf *bp;
 	daddr_t hwbn, pbn;
-	char *hexstr(int, int); /* XXX */
 
-	if (rdstatus(sc)) {
+	if (rdstatus(sc) != 0) {
 #ifdef DEBUG
 		printf("%s: couldn't get status\n", device_xname(sc->sc_dev));
 #endif
@@ -1211,9 +1210,9 @@ rderror(int unit)
 		return 1;
 	}
 	sp = &sc->sc_stat;
-	if (sp->c_fef & FEF_REXMT)
+	if ((sp->c_fef & FEF_REXMT) != 0)
 		return 1;
-	if (sp->c_fef & FEF_PF) {
+	if ((sp->c_fef & FEF_PF) != 0) {
 		rdreset(sc);
 		return 1;
 	}
@@ -1224,8 +1223,7 @@ rderror(int unit)
 	 * know how long the maintenance will take.  With RDWAITC and
 	 * RDRETRY as defined, the range is 1 to 32 seconds.
 	 */
-	if (sp->c_fef & FEF_IMR) {
-		extern int hz;
+	if ((sp->c_fef & FEF_IMR) != 0) {
 		int rdtimo = RDWAITC << sc->sc_errcnt;
 #ifdef DEBUG
 		printf("%s: internal maintenance, %d second timeout\n",
@@ -1251,8 +1249,8 @@ rderror(int unit)
 	 */
 	bp = bufq_peek(sc->sc_tab);
 	pbn = sc->sc_dkdev.dk_label->d_partitions[rdpart(bp->b_dev)].p_offset;
-	if ((sp->c_fef & FEF_CU) || (sp->c_fef & FEF_DR) ||
-	    (sp->c_ief & IEF_RRMASK)) {
+	if ((sp->c_fef & FEF_CU) != 0 || (sp->c_fef & FEF_DR) != 0 ||
+	    (sp->c_ief & IEF_RRMASK) != 0) {
 		hwbn = RDBTOS(pbn + bp->b_blkno);
 		pbn = bp->b_blkno;
 	} else {
@@ -1266,44 +1264,44 @@ rderror(int unit)
 	 * of the transfer, not necessary where the error occurred.
 	 */
 	printf("%s%c: hard error sn%" PRId64 "\n", device_xname(sc->sc_dev),
-	    'a'+rdpart(bp->b_dev), pbn);
+	    'a' + rdpart(bp->b_dev), pbn);
 	/*
 	 * Now report the status as returned by the hardware with
 	 * attempt at interpretation (unless debugging).
 	 */
 	printf("%s %s error:", device_xname(sc->sc_dev),
-	    (bp->b_flags & B_READ) ? "read" : "write");
+	    (bp->b_flags & B_READ) != 0 ? "read" : "write");
 #ifdef DEBUG
 	if (rddebug & RDB_ERROR) {
 		/* status info */
 		printf("\n    volume: %d, unit: %d\n",
-		    (sp->c_vu>>4)&0xF, sp->c_vu&0xF);
+		    (sp->c_vu >> 4) & 0xF, sp->c_vu & 0xF);
 		rdprinterr("reject", sp->c_ref, err_reject);
 		rdprinterr("fault", sp->c_fef, err_fault);
 		rdprinterr("access", sp->c_aef, err_access);
 		rdprinterr("info", sp->c_ief, err_info);
 		printf("    block: %lld, P1-P10: ", hwbn);
-		printf("0x%x", *(u_int *)&sp->c_raw[0]);
-		printf("0x%x", *(u_int *)&sp->c_raw[4]);
-		printf("0x%x\n", *(u_short *)&sp->c_raw[8]);
+		printf("0x%x", *(uint32_t *)&sp->c_raw[0]);
+		printf("0x%x", *(uint32_t *)&sp->c_raw[4]);
+		printf("0x%x\n", *(uint16_t *)&sp->c_raw[8]);
 		/* command */
 		printf("    ioc: ");
-		printf("0x%x", *(u_int *)&sc->sc_ioc.c_pad);
-		printf("0x%x", *(u_short *)&sc->sc_ioc.c_hiaddr);
-		printf("0x%x", *(u_int *)&sc->sc_ioc.c_addr);
-		printf("0x%x", *(u_short *)&sc->sc_ioc.c_nop2);
-		printf("0x%x", *(u_int *)&sc->sc_ioc.c_len);
-		printf("0x%x\n", *(u_short *)&sc->sc_ioc.c_cmd);
+		printf("0x%x", *(uint32_t *)&sc->sc_ioc.c_pad);
+		printf("0x%x", *(uint16_t *)&sc->sc_ioc.c_hiaddr);
+		printf("0x%x", *(uint32_t *)&sc->sc_ioc.c_addr);
+		printf("0x%x", *(uint16_t *)&sc->sc_ioc.c_nop2);
+		printf("0x%x", *(uint32_t *)&sc->sc_ioc.c_len);
+		printf("0x%x\n", *(uint16_t *)&sc->sc_ioc.c_cmd);
 		return 1;
 	}
 #endif
 	printf(" v%d u%d, R0x%x F0x%x A0x%x I0x%x\n",
-	    (sp->c_vu>>4)&0xF, sp->c_vu&0xF,
+	    (sp->c_vu >> 4) & 0xF, sp->c_vu & 0xF,
 	    sp->c_ref, sp->c_fef, sp->c_aef, sp->c_ief);
 	printf("P1-P10: ");
-	printf("0x%x", *(u_int *)&sp->c_raw[0]);
-	printf("0x%x", *(u_int *)&sp->c_raw[4]);
-	printf("0x%x\n", *(u_short *)&sp->c_raw[8]);
+	printf("0x%x", *(uint32_t *)&sp->c_raw[0]);
+	printf("0x%x", *(uint32_t *)&sp->c_raw[4]);
+	printf("0x%x\n", *(uint16_t *)&sp->c_raw[8]);
 	return 1;
 }
 
@@ -1328,7 +1326,7 @@ rdioctl(dev_t dev, u_long cmd, void *dat
 	struct disklabel *lp = sc->sc_dkdev.dk_label;
 	int error, flags;
 
-	error = disk_ioctl(&sc->sc_dkdev, rdpart(dev), cmd, data, flag, l);
+	error = disk_ioctl(&sc->sc_dkdev, dev, cmd, data, flag, l);
 	if (error != EPASSTHROUGH)
 		return error;
 
@@ -1355,7 +1353,7 @@ rdioctl(dev_t dev, u_long cmd, void *dat
 		error = setdisklabel(lp, (struct disklabel *)data,
 		    (sc->sc_flags & RDF_WLABEL) ? 0 : sc->sc_dkdev.dk_openmask,
 		    NULL);
-		if (error)
+		if (error != 0)
 			return error;
 		flags = sc->sc_flags;
 		sc->sc_flags = RDF_ALIVE | RDF_WLABEL;
@@ -1366,6 +1364,10 @@ rdioctl(dev_t dev, u_long cmd, void *dat
 	case DIOCGDEFLABEL:
 		rdgetdefaultlabel(sc, (struct disklabel *)data);
 		return 0;
+
+	case DIOCCACHESYNC:
+		/* no cache to be flushed but required to appease raid(4) */
+		return 0;
 	}
 	return EINVAL;
 }
@@ -1403,7 +1405,7 @@ rdgetdefaultlabel(struct rd_softc *sc, s
 	lp->d_checksum = dkcksum(lp);
 }
 
-int
+static int
 rdsize(dev_t dev)
 {
 	struct rd_softc *sc;
@@ -1422,14 +1424,14 @@ rdsize(dev_t dev)
 	 * to handle it here.
 	 */
 	if (sc->sc_dkdev.dk_openmask == 0) {
-		if (rdopen(dev, FREAD|FWRITE, S_IFBLK, NULL))
+		if (rdopen(dev, FREAD | FWRITE, S_IFBLK, NULL))
 			return -1;
 		didopen = 1;
 	}
 	psize = sc->sc_dkdev.dk_label->d_partitions[rdpart(dev)].p_size *
 	    (sc->sc_dkdev.dk_label->d_secsize / DEV_BSIZE);
 	if (didopen)
-		(void)rdclose(dev, FREAD|FWRITE, S_IFBLK, NULL);
+		(void)rdclose(dev, FREAD | FWRITE, S_IFBLK, NULL);
 	return psize;
 }
 
@@ -1445,7 +1447,7 @@ rdprinterr(const char *str, short err, c
 	printf("    %s error %d field:", str, err);
 	printed = 0;
 	for (i = 0; i < 16; i++)
-		if (err & (0x8000 >> i))
+		if ((err & (0x8000 >> i)) != 0)
 			printf("%s%s", printed++ ? " + " : " ", tab[i]);
 	printf("\n");
 }
@@ -1533,7 +1535,7 @@ rddump(dev_t dev, daddr_t blkno, void *v
 		 * Send the data.
 		 */
 		hpibsend(ctlr, slave, C_EXEC, va, nwrt * sectorsize);
-		(void) hpibswait(ctlr, slave);
+		(void)hpibswait(ctlr, slave);
 		hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
 		if (stat)
 			return EIO;
@@ -1547,7 +1549,7 @@ rddump(dev_t dev, daddr_t blkno, void *v
 		/* update block count */
 		totwrt -= nwrt;
 		blkno += nwrt;
-		va = (char *)va + sectorsize * nwrt;
+		va = (uint8_t *)va + sectorsize * nwrt;
 	}
 	rddoingadump = 0;
 	return 0;

Index: src/sys/arch/hp300/dev/rdreg.h
diff -u src/sys/arch/hp300/dev/rdreg.h:1.13.60.1 src/sys/arch/hp300/dev/rdreg.h:1.13.60.2
--- src/sys/arch/hp300/dev/rdreg.h:1.13.60.1	Wed Jul 14 18:04:04 2021
+++ src/sys/arch/hp300/dev/rdreg.h	Tue Dec  6 19:26:06 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rdreg.h,v 1.13.60.1 2021/07/14 18:04:04 martin Exp $	*/
+/*	$NetBSD: rdreg.h,v 1.13.60.2 2022/12/06 19:26:06 martin Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,42 +39,42 @@
  */
 
 struct	rd_iocmd {
-	char	c_pad;
-	char	c_unit;
-	char	c_volume;
-	char	c_saddr;
-	short	c_hiaddr;
-	long	c_addr;
-	char	c_nop2;
-	char	c_slen;
-	long	c_len;
-	char	c_cmd;
-	char	c_pad2;
+	uint8_t 	c_pad;
+	uint8_t 	c_unit;
+	uint8_t 	c_volume;
+	uint8_t 	c_saddr;
+	uint16_t	c_hiaddr;
+	uint32_t	c_addr;
+	uint8_t 	c_nop2;
+	uint8_t 	c_slen;
+	uint32_t	c_len;
+	uint8_t 	c_cmd;
+	uint8_t 	c_pad2;
 } __attribute__((__packed__));
 
 struct	rd_rscmd {
-	char	c_unit;
-	char	c_sram;
-	char	c_ram;
-	char	c_cmd;
+	uint8_t 	c_unit;
+	uint8_t 	c_sram;
+	uint8_t 	c_ram;
+	uint8_t 	c_cmd;
 } __attribute__((__packed__));
 
 struct	rd_stat {
-	char	c_vu;
-	char	c_pend;
-	short	c_ref;
-	short	c_fef;
-	short	c_aef;
-	short	c_ief;
+	uint8_t 	c_vu;
+	uint8_t 	c_pend;
+	uint16_t	c_ref;
+	uint16_t	c_fef;
+	uint16_t	c_aef;
+	uint16_t	c_ief;
 	union {
-		char cu_raw[10];
+		uint8_t cu_raw[10];
 		struct {
-			short	cu_msw;
-			long	cu_lsl;
+			uint16_t	cu_msw;
+			uint32_t	cu_lsl;
 		} cu_sva;
 		struct {
-			long	cu_cyhd;
-			short	cu_sect;
+			uint32_t	cu_cyhd;
+			uint16_t	cu_sect;
 		} cu_tva;
 	} c_pf;
 } __attribute__((__packed__));
@@ -83,24 +83,24 @@ struct	rd_stat {
 #define	c_tva	c_pf.cu_tva
 
 struct	rd_ssmcmd {
-	char	c_unit;
-	char	c_cmd;
-	short	c_refm;
-	short	c_fefm;
-	short	c_aefm;
-	short	c_iefm;
+	uint8_t 	c_unit;
+	uint8_t 	c_cmd;
+	uint16_t	c_refm;
+	uint16_t	c_fefm;
+	uint16_t	c_aefm;
+	uint16_t	c_iefm;
 } __attribute__((__packed__));
 
 struct	rd_srcmd {
-	char	c_unit;
-	char	c_nop;
-	char	c_cmd;
-	char	c_param;
+	uint8_t 	c_unit;
+	uint8_t 	c_nop;
+	uint8_t 	c_cmd;
+	uint8_t 	c_param;
 } __attribute__((__packed__));
 
 struct	rd_clearcmd {
-	char	c_unit;
-	char	c_cmd;
+	uint8_t 	c_unit;
+	uint8_t 	c_cmd;
 } __attribute__((__packed__));
 
 /* HW ids */
@@ -177,22 +177,48 @@ struct	rd_clearcmd {
 
 #define	NRD7945ABPT	16
 #define	NRD7945ATRK	7
+#define	NRD7945ACYL	968
+#define	NRD7945ABLK	108416
+
 #define	NRD9134DBPT	16
 #define	NRD9134DTRK	6
+#define	NRD9134DCYL	303
+#define	NRD9134DBLK	29088
+
 #define	NRD9122SBPT	8
 #define	NRD9122STRK	2
+#define	NRD9122SCYL	77
+#define	NRD9122SBLK	1232
+
 #define	NRD7912PBPT	32
 #define	NRD7912PTRK	7
+#define	NRD7912PCYL	572
+#define	NRD7912PBLK	128128
+
 #define	NRD7914PBPT	32
 #define	NRD7914PTRK	7
+#define	NRD7914PCYL	1152
+#define	NRD7914PBLK	258048
+
 #define	NRD7933HBPT	46
 #define	NRD7933HTRK	13
+#define	NRD7933HCYL	1321
+#define	NRD7933HBLK	789958
+
 #define	NRD9134LBPT	16
 #define	NRD9134LTRK	5
+#define	NRD9134LCYL	973
+#define	NRD9134LBLK	77840
+
 #define	NRD7911ABPT	32
 #define	NRD7911ATRK	3
+#define	NRD7911ACYL	572
+#define	NRD7911ABLK	54912
+
 #define	NRD7941ABPT	16
 #define	NRD7941ATRK	3
+#define	NRD7941ACYL	968
+#define	NRD7941ABLK	46464
 
 /*
  * Several HP drives have an odd number of 256 byte sectors per track.
@@ -223,26 +249,58 @@ struct	rd_clearcmd {
  */
 #define	NRD7936HBPT	123
 #define	NRD7936HTRK	7
+#define	NRD7936HCYL	698
+#define	NRD7936HBLK	600978
+
 #define	NRD7937HBPT	123
 #define	NRD7937HTRK	13
+#define	NRD7937HCYL	698
+#define	NRD7937HBLK	1116102
+
 #define	NRD7957ABPT	22
 #define	NRD7957ATRK	7
+#define	NRD7957ACYL	1036
+#define	NRD7957ABLK	159544
+
 #define	NRD7958ABPT	36
 #define	NRD7958ATRK	7
+#define	NRD7958ACYL	1013
+#define	NRD7958ABLK	255276
+
 #define	NRD7957BBPT	18
 #define	NRD7957BTRK	7
+#define	NRD7957BCYL	1269
+#define	NRD7957BBLK	159894
+
 #define	NRD7958BBPT	42
 #define	NRD7958BTRK	9
+#define	NRD7958BCYL	786
+#define	NRD7958BBLK	297108
+
 #define	NRD7959BBPT	42
 #define	NRD7959BTRK	9
+#define	NRD7959BCYL	1572
+#define	NRD7959BBLK	594216
+
 #define	NRD2200ABPT	113
 #define	NRD2200ATRK	4
+#define	NRD2200ACYL	1449
+#define	NRD2200ABLK	654948
+
 #define	NRD2203ABPT	113
 #define	NRD2203ATRK	8
+#define	NRD2203ACYL	1449
+#define	NRD2203ABLK	1309896
+
 #define	NRD2202ABPT	113
 #define	NRD2202ATRK	8
+#define	NRD2202ACYL	1449
+#define	NRD2202ABLK	1309896
+
 #define	NRD7908ABPT	35
 #define	NRD7908ATRK	5
+#define	NRD7908ACYL	185
+#define	NRD7908ABLK	32375
 
 /* controller "unit" number */
 #define	RDCTLR		15
@@ -255,7 +313,7 @@ struct	rd_clearcmd {
 #define	RDSTOB(x)	((x) >> (DEV_BSHIFT-8))
 
 /* extract cyl/head/sect info from three-vector address */
-#define	RDCYL(tva)	((u_long)(tva).cu_cyhd >> 8)
+#define	RDCYL(tva)	((uint32_t)(tva).cu_cyhd >> 8)
 #define	RDHEAD(tva)	((tva).cu_cyhd & 0xFF)
 #define	RDSECT(tva)	((tva).cu_sect)
 

Index: src/sys/arch/hp300/dev/rdvar.h
diff -u src/sys/arch/hp300/dev/rdvar.h:1.23.22.1 src/sys/arch/hp300/dev/rdvar.h:1.23.22.2
--- src/sys/arch/hp300/dev/rdvar.h:1.23.22.1	Wed Jul 14 18:04:04 2021
+++ src/sys/arch/hp300/dev/rdvar.h	Tue Dec  6 19:26:06 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rdvar.h,v 1.23.22.1 2021/07/14 18:04:04 martin Exp $	*/
+/*	$NetBSD: rdvar.h,v 1.23.22.2 2022/12/06 19:26:06 martin Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -72,9 +72,6 @@ struct	rd_softc {
 	struct	rd_iocmd sc_ioc;
 	struct	rd_rscmd sc_rsc;
 	struct	rd_stat sc_stat;
-	struct	rd_ssmcmd sc_ssmc;
-	struct	rd_srcmd sc_src;
-	struct	rd_clearcmd sc_clear;
 	struct	bufq_state *sc_tab;
 	int	sc_active;
 	int	sc_errcnt;

Index: src/sys/arch/hp300/stand/common/rd.c
diff -u src/sys/arch/hp300/stand/common/rd.c:1.10.58.1 src/sys/arch/hp300/stand/common/rd.c:1.10.58.2
--- src/sys/arch/hp300/stand/common/rd.c:1.10.58.1	Wed Jul 14 18:04:04 2021
+++ src/sys/arch/hp300/stand/common/rd.c	Tue Dec  6 19:26:06 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rd.c,v 1.10.58.1 2021/07/14 18:04:04 martin Exp $	*/
+/*	$NetBSD: rd.c,v 1.10.58.2 2022/12/06 19:26:06 martin Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -52,12 +52,12 @@
 #include <hp300/stand/common/hpibvar.h>
 #include <hp300/stand/common/samachdep.h>
 
-struct	rd_iocmd rd_ioc;
-struct	rd_rscmd rd_rsc;
-struct	rd_stat rd_stat;
-struct	rd_ssmcmd rd_ssmc;
+static struct	rd_iocmd rd_ioc;
+static struct	rd_rscmd rd_rsc;
+static struct	rd_stat rd_stat;
+static struct	rd_ssmcmd rd_ssmc;
 
-struct	disklabel rdlabel;
+static struct	disklabel rdlabel;
 
 struct	rdminilabel {
 	u_short	npart;
@@ -88,32 +88,36 @@ static void rdreset(int, int);
 static int rdgetinfo(struct rd_softc *);
 static int rderror(int, int, int);
 
-struct rd_softc rd_softc[NHPIB][NRD];
+static struct rd_softc rd_softc[NHPIB][NRD];
 
-struct rdidentinfo rdidentinfo[] = {
-	{ RD7946AID,	0,	 108416 },
-	{ RD9134DID,	1,	  29088 },
-	{ RD9134LID,	1,	   1232 },
-	{ RD7912PID,	0,	 128128 },
-	{ RD7914PID,	0,	 258048 },
-	{ RD7958AID,	0,	 255276 },
-	{ RD7957AID,	0,	 159544 },
-	{ RD7933HID,	0,	 789958 },
-	{ RD9134LID,	1,	  77840 },
-	{ RD7936HID,	0,	 600978 },
-	{ RD7937HID,	0,	1116102 },
-	{ RD7914CTID,	0,	 258048 },
-	{ RD7946AID,	0,	 108416 },
-	{ RD9134LID,	1,	   1232 },
-	{ RD7957BID,	0,	 159894 },
-	{ RD7958BID,	0,	 297108 },
-	{ RD7959BID,	0,	 594216 },
-	{ RD2200AID,	0,	 654948 },
-	{ RD2203AID,	0,	1309896 }
+static const struct rdidentinfo rdidentinfo[] = {
+	[RD7945A]  = { RD7946AID,	0,	NRD7945ABLK },
+	[RD9134D]  = { RD9134DID,	1,	NRD9134DBLK },
+	[RD9122S]  = { RD9134LID,	1,	NRD9122SBLK },
+	[RD7912P]  = { RD7912PID,	0,	NRD7912PBLK },
+	[RD7914P]  = { RD7914PID,	0,	NRD7914PBLK },
+	[RD7958A]  = { RD7958AID,	0,	NRD7958ABLK },
+	[RD7957A]  = { RD7957AID,	0,	NRD7957ABLK },
+	[RD7933H]  = { RD7933HID,	0,	NRD7933HBLK },
+	[RD9134L]  = { RD9134LID,	1,	NRD9134LBLK },
+	[RD7936H]  = { RD7936HID,	0,	NRD7936HBLK },
+	[RD7937H]  = { RD7937HID,	0,	NRD7937HBLK },
+	[RD7914CT] = { RD7914CTID,	0,	NRD7914PBLK },
+	[RD7946A]  = { RD7946AID,	0,	NRD7945ABLK },
+	[RD9122D]  = { RD9134LID,	1,	NRD9122SBLK },
+	[RD7957B]  = { RD7957BID,	0,	NRD7957BBLK },
+	[RD7958B]  = { RD7958BID,	0,	NRD7958BBLK },
+	[RD7959B]  = { RD7959BID,	0,	NRD7959BBLK },
+	[RD2200A]  = { RD2200AID,	0,	NRD2200ABLK },
+	[RD2203A]  = { RD2203AID,	0,	NRD2203ABLK },
+	[RD2202A]  = { RD2202AID,	0,	NRD2202ABLK },
+	[RD7908A]  = { RD7908AID,	0,	NRD7908ABLK },
+	[RD7911A]  = { RD7911AID,	0,	NRD7911ABLK },
+	[RD7941A]  = { RD7946AID,	0,	NRD7941ABLK }
 };
-int numrdidentinfo = sizeof(rdidentinfo) / sizeof(rdidentinfo[0]);
+static const int numrdidentinfo = sizeof(rdidentinfo) / sizeof(rdidentinfo[0]);
 
-int
+static int
 rdinit(int ctlr, int unit)
 {
 	struct rd_softc *rs = &rd_softc[ctlr][unit];
@@ -183,6 +187,8 @@ rdident(int ctlr, int unit)
 	case RD7946AID:
 		if (memcmp(name, "079450", 6) == 0)
 			id = RD7945A;
+		else if (memcmp(name, "079410", 6) == 0)
+			id = RD7941A;
 		else
 			id = RD7946A;
 		break;
@@ -204,7 +210,7 @@ rdident(int ctlr, int unit)
 	return id;
 }
 
-char io_buf[MAXBSIZE];
+static char io_buf[MAXBSIZE];
 
 static int
 rdgetinfo(struct rd_softc *rs)
@@ -364,7 +370,7 @@ rderror(int ctlr, int unit, int part)
 	printf("rd(%d,%d,0,%d) err: vu 0x%x",
 	       ctlr, unit, part, rd_stat.c_vu);
 	if ((rd_stat.c_aef & AEF_UD) || (rd_stat.c_ief & (IEF_MD|IEF_RD)))
-		printf(", block %ld", rd_stat.c_blk);
+		printf(", block %d", rd_stat.c_blk);
 	printf(", R0x%x F0x%x A0x%x I0x%x\n",
 	       rd_stat.c_ref, rd_stat.c_fef, rd_stat.c_aef, rd_stat.c_ief);
 	return 1;

Reply via email to