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;