Module Name: src Committed By: abs Date: Fri Jun 22 20:42:24 UTC 2012
Modified Files: src/etc/etc.vax: MAKEDEV.conf src/sys/arch/vax/conf: GENERIC INSTALL VAX780 majors.vax src/sys/arch/vax/vax: disksubr.c src/sys/dev: DEVNAMES src/sys/dev/mscp: files.mscp mscp_disk.c mscp_subr.c Log Message: - Add racd* devices for MSCP based CD-ROM drives (RRD40s), as opposed to mixing them in with the ra* disks, modelled loosely on how MSCP rx* floppies are handled - racd* defaults to the same single iso9660 partition as cd* - Cleanup config option handling slightly so any combination of ra*, rx* (and now raccd*) can be defined without build errors. - Avoid ugly printf when disks have all zero disklabel magic number To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/etc/etc.vax/MAKEDEV.conf cvs rdiff -u -r1.181 -r1.182 src/sys/arch/vax/conf/GENERIC cvs rdiff -u -r1.59 -r1.60 src/sys/arch/vax/conf/INSTALL cvs rdiff -u -r1.8 -r1.9 src/sys/arch/vax/conf/VAX780 cvs rdiff -u -r1.23 -r1.24 src/sys/arch/vax/conf/majors.vax cvs rdiff -u -r1.52 -r1.53 src/sys/arch/vax/vax/disksubr.c cvs rdiff -u -r1.274 -r1.275 src/sys/dev/DEVNAMES cvs rdiff -u -r1.7 -r1.8 src/sys/dev/mscp/files.mscp cvs rdiff -u -r1.71 -r1.72 src/sys/dev/mscp/mscp_disk.c cvs rdiff -u -r1.41 -r1.42 src/sys/dev/mscp/mscp_subr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/etc/etc.vax/MAKEDEV.conf diff -u src/etc/etc.vax/MAKEDEV.conf:1.13 src/etc/etc.vax/MAKEDEV.conf:1.14 --- src/etc/etc.vax/MAKEDEV.conf:1.13 Wed Oct 12 17:03:49 2011 +++ src/etc/etc.vax/MAKEDEV.conf Fri Jun 22 20:42:22 2012 @@ -1,9 +1,9 @@ -# $NetBSD: MAKEDEV.conf,v 1.13 2011/10/12 17:03:49 njoly Exp $ +# $NetBSD: MAKEDEV.conf,v 1.14 2012/06/22 20:42:22 abs Exp $ all_md) makedev mt0 mt1 ts0 ts1 st0 st1 uk0 ss0 cd0 vt0 makedev ra0 ra1 ra2 ra3 hp0 hp1 hp2 hp3 sd0 sd1 sd2 sd3 rd0 rd1 rd2 - makedev dz0 dl0 dhu0 rx0 rx1 + makedev dz0 dl0 dhu0 racd0 racd1 rx0 rx1 makedev scsibus0 scsibus1 scsibus2 scsibus3 makedev ses0 ses1 ses2 ses3 makedev std_vax @@ -60,11 +60,12 @@ ht[0-9]*|tm[0-9]*|mt[0-9]*|ts[0-9]*|ut[0 esac ;; -hp[0-9]*|hk[0-9]*|up[0-9]*|ra[0-9]*|rl[0-9]*|rb[0-9]*|rd[0-9]*|rx[0-9]*) +hp[0-9]*|hk[0-9]*|up[0-9]*|ra[0-9]*|racd[0-9]*|rl[0-9]*|rb[0-9]*|rd[0-9]*|rx[0-9]*) case $i in hp*) name=hp; unit=${i#hp}; blk=0; chr=4;; hk*) name=hk; unit=${i#hk}; blk=3; chr=11;; up*) name=up; unit=${i#up}; blk=2; chr=13;; + racd*) name=racd; unit=${i#racd}; blk=28; chr=28;; # before ra* ra*) name=ra; unit=${i#ra}; blk=9; chr=9;; rb*) name=rb; unit=${i#rb}; blk=11; chr=23;; rx*) name=rx; unit=${i#rx}; blk=12; chr=30;; Index: src/sys/arch/vax/conf/GENERIC diff -u src/sys/arch/vax/conf/GENERIC:1.181 src/sys/arch/vax/conf/GENERIC:1.182 --- src/sys/arch/vax/conf/GENERIC:1.181 Tue Jun 5 08:41:36 2012 +++ src/sys/arch/vax/conf/GENERIC Fri Jun 22 20:42:22 2012 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.181 2012/06/05 08:41:36 abs Exp $ +# $NetBSD: GENERIC,v 1.182 2012/06/22 20:42:22 abs Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/vax/conf/std.vax" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.181 $" +#ident "GENERIC-$Revision: 1.182 $" # Here are all different supported CPU types listed. #options VAX8800 # VAX 8500, 8530, 8550, 8700, 8800 @@ -270,7 +270,8 @@ mscpbus* at uda? mscpbus* at mtc? mscpbus* at kdb? -ra* at mscpbus? drive? # MSCP disk +ra* at mscpbus? drive? # MSCP disk +racd* at mscpbus? drive? # MSCP CD-ROM (RRD40) rx* at mscpbus? drive? # MSCP floppy mt* at mscpbus? drive? # MSCP tape Index: src/sys/arch/vax/conf/INSTALL diff -u src/sys/arch/vax/conf/INSTALL:1.59 src/sys/arch/vax/conf/INSTALL:1.60 --- src/sys/arch/vax/conf/INSTALL:1.59 Sun Mar 18 14:12:55 2012 +++ src/sys/arch/vax/conf/INSTALL Fri Jun 22 20:42:23 2012 @@ -1,4 +1,4 @@ -# $NetBSD: INSTALL,v 1.59 2012/03/18 14:12:55 he Exp $ +# $NetBSD: INSTALL,v 1.60 2012/06/22 20:42:23 abs Exp $ # # INSTALL kernel; all supported devices but nothing fancy. # @@ -160,6 +160,7 @@ mscpbus* at mtc? # MSCP devices ra* at mscpbus? drive? # MSCP disk +racd* at mscpbus? drive? # MSCP CD-ROM (RRD40) rx* at mscpbus? drive? # MSCP floppy mt* at mscpbus? drive? # MSCP tape Index: src/sys/arch/vax/conf/VAX780 diff -u src/sys/arch/vax/conf/VAX780:1.8 src/sys/arch/vax/conf/VAX780:1.9 --- src/sys/arch/vax/conf/VAX780:1.8 Sat Mar 10 21:51:57 2012 +++ src/sys/arch/vax/conf/VAX780 Fri Jun 22 20:42:23 2012 @@ -1,4 +1,4 @@ -# $NetBSD: VAX780,v 1.8 2012/03/10 21:51:57 joerg Exp $ +# $NetBSD: VAX780,v 1.9 2012/06/22 20:42:23 abs Exp $ # # 11/780,750,730 machine description file # @@ -255,6 +255,7 @@ mscpbus* at mtc? #mscpbus* at kdb? ra* at mscpbus? drive? # MSCP disk +racd* at mscpbus? drive? # MSCP CD-ROM (RRD40) rx* at mscpbus? drive? # MSCP floppy mt* at mscpbus? drive? # MSCP tape Index: src/sys/arch/vax/conf/majors.vax diff -u src/sys/arch/vax/conf/majors.vax:1.23 src/sys/arch/vax/conf/majors.vax:1.24 --- src/sys/arch/vax/conf/majors.vax:1.23 Thu Jun 30 20:09:38 2011 +++ src/sys/arch/vax/conf/majors.vax Fri Jun 22 20:42:23 2012 @@ -1,4 +1,4 @@ -# $NetBSD: majors.vax,v 1.23 2011/06/30 20:09:38 wiz Exp $ +# $NetBSD: majors.vax,v 1.24 2012/06/22 20:42:23 abs Exp $ # # Device majors for vax # @@ -36,6 +36,7 @@ device-major gen char 25 vax8600 | va vaxany device-major lpa char 26 lpa device-major ps char 27 ps +device-major racd char 28 block 28 racd device-major ad char 29 ad device-major rx char 30 block 12 rx device-major ik char 31 ik Index: src/sys/arch/vax/vax/disksubr.c diff -u src/sys/arch/vax/vax/disksubr.c:1.52 src/sys/arch/vax/vax/disksubr.c:1.53 --- src/sys/arch/vax/vax/disksubr.c:1.52 Tue Dec 14 23:44:49 2010 +++ src/sys/arch/vax/vax/disksubr.c Fri Jun 22 20:42:23 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: disksubr.c,v 1.52 2010/12/14 23:44:49 matt Exp $ */ +/* $NetBSD: disksubr.c,v 1.53 2012/06/22 20:42:23 abs Exp $ */ /* * Copyright (c) 1982, 1986, 1988 Regents of the University of California. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: disksubr.c,v 1.52 2010/12/14 23:44:49 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: disksubr.c,v 1.53 2012/06/22 20:42:23 abs Exp $"); #include "opt_compat_ultrix.h" @@ -157,7 +157,8 @@ compat_label(dev_t dev, void (*strat)(st int part; if (dlp->magic != DEC_LABEL_MAGIC) { - printf("label: %x\n",dlp->magic); + if (dlp->magic != 0) + printf("label: %x\n",dlp->magic); msg = ((msg != NULL) ? msg: "no disk label"); goto done; } Index: src/sys/dev/DEVNAMES diff -u src/sys/dev/DEVNAMES:1.274 src/sys/dev/DEVNAMES:1.275 --- src/sys/dev/DEVNAMES:1.274 Sun Jun 3 01:47:26 2012 +++ src/sys/dev/DEVNAMES Fri Jun 22 20:42:23 2012 @@ -1,4 +1,4 @@ -# $NetBSD: DEVNAMES,v 1.274 2012/06/03 01:47:26 nonaka Exp $ +# $NetBSD: DEVNAMES,v 1.275 2012/06/22 20:42:23 abs Exp $ # # This file contains all used device names and defined attributes in # alphabetical order. New devices added to the system somewhere should first @@ -1114,6 +1114,7 @@ qsphy MI qt MI qv vax ra MI +racd MI radio MI radio MI Attribute rambo mipsco Index: src/sys/dev/mscp/files.mscp diff -u src/sys/dev/mscp/files.mscp:1.7 src/sys/dev/mscp/files.mscp:1.8 --- src/sys/dev/mscp/files.mscp:1.7 Sun Jun 6 19:16:18 1999 +++ src/sys/dev/mscp/files.mscp Fri Jun 22 20:42:24 2012 @@ -1,4 +1,4 @@ -# $NetBSD: files.mscp,v 1.7 1999/06/06 19:16:18 ragge Exp $ +# $NetBSD: files.mscp,v 1.8 2012/06/22 20:42:24 abs Exp $ # # File and device description for MSCP devices. # @@ -10,12 +10,16 @@ file dev/mscp/mscp_subr.c mscp device mscpbus {drive = -1} attach mscpbus at mscp +device ra: disk +attach ra at mscpbus + +device racd: disk +attach racd at mscpbus + device rx: disk attach rx at mscpbus -device ra: disk -attach ra at mscpbus -file dev/mscp/mscp_disk.c ra | rx needs-flag +file dev/mscp/mscp_disk.c ra | racd | rx needs-flag device mt: tape attach mt at mscpbus Index: src/sys/dev/mscp/mscp_disk.c diff -u src/sys/dev/mscp/mscp_disk.c:1.71 src/sys/dev/mscp/mscp_disk.c:1.72 --- src/sys/dev/mscp/mscp_disk.c:1.71 Sat Sep 12 18:01:50 2009 +++ src/sys/dev/mscp/mscp_disk.c Fri Jun 22 20:42:24 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: mscp_disk.c,v 1.71 2009/09/12 18:01:50 tsutsui Exp $ */ +/* $NetBSD: mscp_disk.c,v 1.72 2012/06/22 20:42:24 abs Exp $ */ /* * Copyright (c) 1988 Regents of the University of California. * All rights reserved. @@ -73,6 +73,7 @@ /* * RA disk device driver * RX MSCP floppy disk device driver + * RRD MSCP CD device driver */ /* @@ -81,7 +82,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mscp_disk.c,v 1.71 2009/09/12 18:01:50 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mscp_disk.c,v 1.72 2012/06/22 20:42:24 abs Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -125,19 +126,24 @@ struct ra_softc { }; #define rx_softc ra_softc +#define racd_softc ra_softc -void rxattach(device_t, device_t, void *); +void raattach(device_t, device_t, void *); int rx_putonline(struct rx_softc *); void rrmakelabel(struct disklabel *, long); +int ra_putonline(dev_t, struct ra_softc *); +static inline struct ra_softc *mscp_device_lookup(dev_t); #if NRA int ramatch(device_t, cfdata_t, void *); -void raattach(device_t, device_t, void *); -int ra_putonline(struct ra_softc *); CFATTACH_DECL(ra, sizeof(struct ra_softc), - ramatch, rxattach, NULL, NULL); + ramatch, raattach, NULL, NULL); + +#endif /* NRA */ + +#if NRA || NRACD || NRX dev_type_open(raopen); dev_type_close(raclose); @@ -148,6 +154,8 @@ dev_type_strategy(rastrategy); dev_type_dump(radump); dev_type_size(rasize); +#if NRA + const struct bdevsw ra_bdevsw = { raopen, raclose, rastrategy, raioctl, radump, rasize, D_DISK }; @@ -177,45 +185,17 @@ ramatch(device_t parent, cfdata_t cf, vo cf->cf_loc[MSCPBUSCF_DRIVE] != mp->mscp_unit) return 0; /* - * Check if this disk is a floppy; then don't configure it. + * Check if this disk is a floppy (RX) or cd (RRD) * Seems to be a safe way to test it per Chris Torek. */ if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) == 'X' - '@') return 0; + if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) == 'R' - '@') + return 0; return 1; } -/* - * (Try to) put the drive online. This is done the first time the - * drive is opened, or if it har fallen offline. - */ -int -ra_putonline(struct ra_softc *ra) -{ - struct disklabel *dl; - const char *msg; - int maj; - - if (rx_putonline(ra) != MSCP_DONE) - return MSCP_FAILED; - - dl = ra->ra_disk.dk_label; - - ra->ra_state = DK_RDLABEL; - printf("%s", device_xname(&ra->ra_dev)); - maj = cdevsw_lookup_major(&ra_cdevsw); - if ((msg = readdisklabel(MAKEDISKDEV(maj, device_unit(&ra->ra_dev), - RAW_PART), rastrategy, dl, NULL)) != NULL) - printf(": %s", msg); - else { - ra->ra_havelabel = 1; - ra->ra_state = DK_OPEN; - } - - printf(": size %d sectors\n", dl->d_secperunit); - - return MSCP_DONE; -} +#endif /* NRA */ /* * Open a drive. @@ -224,13 +204,11 @@ ra_putonline(struct ra_softc *ra) int raopen(dev_t dev, int flag, int fmt, struct lwp *l) { - struct ra_softc *ra; - int error, part, unit, mask; + struct ra_softc *ra = mscp_device_lookup(dev); + int error, part, mask; /* * Make sure this is a reasonable open request. */ - unit = DISKUNIT(dev); - ra = device_lookup_private(&ra_cd, unit); if (!ra) return ENXIO; @@ -252,7 +230,7 @@ raopen(dev_t dev, int flag, int fmt, str * the disk online (and read the label). */ if (ra->ra_state == DK_CLOSED) { - if (ra_putonline(ra) == MSCP_FAILED) { + if (ra_putonline(dev, ra) == MSCP_FAILED) { error = ENXIO; goto bad1; } @@ -300,8 +278,7 @@ raopen(dev_t dev, int flag, int fmt, str int raclose(dev_t dev, int flags, int fmt, struct lwp *l) { - int unit = DISKUNIT(dev); - struct ra_softc *ra = device_lookup_private(&ra_cd, unit); + struct ra_softc *ra = mscp_device_lookup(dev); int mask = (1 << DISKPART(dev)); mutex_enter(&ra->ra_disk.dk_openlock); @@ -342,15 +319,15 @@ raclose(dev_t dev, int flags, int fmt, s void rastrategy(struct buf *bp) { + struct ra_softc *ra = mscp_device_lookup(bp->b_dev); int unit; - struct ra_softc *ra; int b; /* * Make sure this is a reasonable drive to use. */ unit = DISKUNIT(bp->b_dev); - if ((ra = device_lookup_private(&ra_cd, unit)) == NULL) { + if (ra == NULL) { bp->b_error = ENXIO; goto done; } @@ -368,7 +345,7 @@ rastrategy(struct buf *bp) /* If disk is not online, try to put it online */ if (ra->ra_state == DK_CLOSED) - if (ra_putonline(ra) == MSCP_FAILED) { + if (ra_putonline(bp->b_dev, ra) == MSCP_FAILED) { bp->b_error = EIO; goto done; } @@ -411,9 +388,8 @@ rawrite(dev_t dev, struct uio *uio, int int raioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { - int unit = DISKUNIT(dev); struct disklabel *lp, *tp; - struct ra_softc *ra = device_lookup_private(&ra_cd, unit); + struct ra_softc *ra = mscp_device_lookup(dev); int error = 0; #ifdef __HAVE_OLD_DISKLABEL struct disklabel newlabel; @@ -560,40 +536,38 @@ radump(dev_t dev, daddr_t blkno, void *v int rasize(dev_t dev) { - int unit = DISKUNIT(dev); - struct ra_softc *ra; + struct ra_softc *ra = mscp_device_lookup(dev); - ra = device_lookup_private(&ra_cd, unit); if (!ra) return -1; if (ra->ra_state == DK_CLOSED) - if (ra_putonline(ra) == MSCP_FAILED) + if (ra_putonline(dev, ra) == MSCP_FAILED) return -1; return ra->ra_disk.dk_label->d_partitions[DISKPART(dev)].p_size * (ra->ra_disk.dk_label->d_secsize / DEV_BSIZE); } -#endif /* NRA */ +#endif /* NRA || NRACD || NRX */ #if NRX int rxmatch(device_t, cfdata_t, void *); CFATTACH_DECL(rx, sizeof(struct rx_softc), - rxmatch, rxattach, NULL, NULL); + rxmatch, raattach, NULL, NULL); dev_type_open(rxopen); dev_type_read(rxread); dev_type_write(rxwrite); dev_type_ioctl(rxioctl); dev_type_strategy(rxstrategy); -dev_type_dump(rxdump); +dev_type_dump(radump); dev_type_size(rxsize); const struct bdevsw rx_bdevsw = { - rxopen, nullclose, rxstrategy, rxioctl, rxdump, rxsize, D_DISK + rxopen, nullclose, rxstrategy, rxioctl, radump, rxsize, D_DISK }; const struct cdevsw rx_cdevsw = { @@ -621,7 +595,7 @@ rxmatch(device_t parent, cfdata_t cf, vo cf->cf_loc[MSCPBUSCF_DRIVE] != mp->mscp_unit) return 0; /* - * Check if this disk is a floppy; then configure it. + * Check if this disk is a floppy (RX) * Seems to be a safe way to test it per Chris Torek. */ if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) == 'X' - '@') @@ -631,13 +605,68 @@ rxmatch(device_t parent, cfdata_t cf, vo #endif /* NRX */ +#if NRACD + +/* Use almost all ra* routines for racd */ + +int racdmatch(device_t, cfdata_t, void *); + +CFATTACH_DECL(racd, sizeof(struct racd_softc), + racdmatch, raattach, NULL, NULL); + +dev_type_open(raopen); +dev_type_read(raread); +dev_type_write(rawrite); +dev_type_ioctl(raioctl); +dev_type_strategy(rastrategy); +dev_type_dump(radump); +dev_type_size(rasize); + +const struct bdevsw racd_bdevsw = { + raopen, nullclose, rastrategy, raioctl, radump, rasize, D_DISK +}; + +const struct cdevsw racd_cdevsw = { + raopen, nullclose, raread, rawrite, raioctl, + nostop, notty, nopoll, nommap, nokqfilter, D_DISK +}; + +static struct dkdriver racddkdriver = { + rastrategy, minphys +}; + +/* + * More driver definitions, for generic MSCP code. + */ + +int +racdmatch(device_t parent, cfdata_t cf, void *aux) +{ + struct drive_attach_args *da = aux; + struct mscp *mp = da->da_mp; + + if ((da->da_typ & MSCPBUS_DISK) == 0) + return 0; + if (cf->cf_loc[MSCPBUSCF_DRIVE] != MSCPBUSCF_DRIVE_DEFAULT && + cf->cf_loc[MSCPBUSCF_DRIVE] != mp->mscp_unit) + return 0; + /* + * Check if this disk is a CD (RRD) + */ + if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) == 'R' - '@') + return 1; + return 0; +} + +#endif /* NRACD */ + /* * The attach routine only checks and prints drive type. * Bringing the disk online is done when the disk is accessed * the first time. */ void -rxattach(device_t parent, device_t self, void *aux) +raattach(device_t parent, device_t self, void *aux) { struct rx_softc *rx = device_private(self); struct drive_attach_args *da = aux; @@ -655,8 +684,14 @@ rxattach(device_t parent, device_t self, disk_init((struct disk *)&rx->ra_disk, device_xname(&rx->ra_dev), &rxdkdriver); #endif +#if NRACD + if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) == 'R' - '@') + disk_init((struct disk *)&rx->ra_disk, device_xname(&rx->ra_dev), + &racddkdriver); +#endif #if NRA - if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) != 'X' - '@') + if (MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) != 'X' - '@' && + MSCP_MID_ECH(1, mp->mscp_guse.guse_mediaid) != 'R' - '@') disk_init((struct disk *)&rx->ra_disk, device_xname(&rx->ra_dev), &radkdriver); #endif @@ -849,14 +884,6 @@ rxioctl(dev_t dev, u_long cmd, void *dat } int -rxdump(dev_t dev, daddr_t blkno, void *va, size_t size) -{ - - /* Not likely. */ - return ENXIO; -} - -int rxsize(dev_t dev) { @@ -906,27 +933,12 @@ rrdgram(device_t usc, struct mscp *mp, s mp->mscp_erd.erd_sdistat[11]); } + void rriodone(device_t usc, struct buf *bp) { - struct ra_softc *ra; - int unit; + struct ra_softc *ra = device_private(usc); - /* We assume that this is a reasonable drive. ra_strategy should - already have verified it. Thus, no checks here... /bqt */ - unit = DISKUNIT(bp->b_dev); -#if NRA - if (cdevsw_lookup(bp->b_dev) == &ra_cdevsw) - ra = device_lookup_private(&ra_cd, unit); - else -#endif -#if NRX - if (cdevsw_lookup(bp->b_dev) == &rx_cdevsw) - ra = device_lookup_private(&rx_cd, unit); - else -#endif - panic("rriodone: unexpected major %"PRIu32" unit %u", - major(bp->b_dev), unit); disk_unbusy(&ra->ra_disk, bp->b_bcount, (bp->b_flags & B_READ)); biodone(bp); @@ -940,19 +952,19 @@ rriodone(device_t usc, struct buf *bp) int rronline(device_t usc, struct mscp *mp) { - struct rx_softc *rx = (struct rx_softc *)usc; + struct ra_softc *ra = device_private(usc); struct disklabel *dl; - wakeup((void *)&rx->ra_state); + wakeup((void *)&ra->ra_state); if ((mp->mscp_status & M_ST_MASK) != M_ST_SUCCESS) { aprint_error_dev(usc, "attempt to bring on line failed: "); mscp_printevent(mp); return (MSCP_FAILED); } - rx->ra_state = DK_OPEN; + ra->ra_state = DK_OPEN; - dl = rx->ra_disk.dk_label; + dl = ra->ra_disk.dk_label; dl->d_secperunit = (daddr_t)mp->mscp_onle.onle_unitsize; if (dl->d_secpercyl) { @@ -963,7 +975,7 @@ rronline(device_t usc, struct mscp *mp) dl->d_type = DTYPE_FLOPPY; dl->d_rpm = 300; } - rrmakelabel(dl, rx->ra_mediaid); + rrmakelabel(dl, ra->ra_mediaid); return (MSCP_DONE); } @@ -1038,7 +1050,7 @@ rrreplace(device_t usc, struct mscp *mp) int rrioerror(device_t usc, struct mscp *mp, struct buf *bp) { - struct ra_softc *ra = (void *)usc; + struct ra_softc *ra = device_private(usc); int code = mp->mscp_event; switch (code & M_ST_MASK) { @@ -1069,23 +1081,15 @@ rrioerror(device_t usc, struct mscp *mp, void rrfillin(struct buf *bp, struct mscp *mp) { - struct rx_softc *rx = 0; /* Wall */ + struct ra_softc *ra; struct disklabel *lp; - int unit = DISKUNIT(bp->b_dev); int part = DISKPART(bp->b_dev); -#if NRA - if (cdevsw_lookup(bp->b_dev) == &ra_cdevsw) - rx = device_lookup_private(&ra_cd, unit); -#endif -#if NRX - if (cdevsw_lookup(bp->b_dev) == &rx_cdevsw) - rx = device_lookup_private(&rx_cd, unit); -#endif - lp = rx->ra_disk.dk_label; + ra = mscp_device_lookup(bp->b_dev); + lp = ra->ra_disk.dk_label; mp->mscp_seq.seq_lbn = lp->d_partitions[part].p_offset + bp->b_blkno; - mp->mscp_unit = rx->ra_hwunit; + mp->mscp_unit = ra->ra_hwunit; mp->mscp_seq.seq_bytecount = bp->b_bcount; } @@ -1099,3 +1103,70 @@ rrbb(device_t usc, struct mscp *mp, stru panic("udabb"); } + +/* + * (Try to) put the drive online. This is done the first time the + * drive is opened, or if it has fallen offline. + */ +int +ra_putonline(dev_t dev, struct ra_softc *ra) +{ + struct disklabel *dl; + const char *msg; + + if (rx_putonline(ra) != MSCP_DONE) + return MSCP_FAILED; + + dl = ra->ra_disk.dk_label; + + ra->ra_state = DK_RDLABEL; + printf("%s", device_xname(&ra->ra_dev)); + if ((msg = readdisklabel( + MAKEDISKDEV(major(dev), device_unit(&ra->ra_dev), RAW_PART), + rastrategy, dl, NULL)) == NULL) { + ra->ra_havelabel = 1; + ra->ra_state = DK_OPEN; + } +#if NRACD + else if (cdevsw_lookup(dev) == &racd_cdevsw) { + dl->d_partitions[0].p_offset = 0; + dl->d_partitions[0].p_size = dl->d_secperunit; + dl->d_partitions[0].p_fstype = FS_ISO9660; + } +#endif /* NRACD */ + else { + printf(": %s", msg); + } + + printf(": size %d sectors\n", dl->d_secperunit); + + return MSCP_DONE; +} + + +static inline struct ra_softc * +mscp_device_lookup(dev_t dev) +{ + struct ra_softc *ra; + int unit; + + unit = DISKUNIT(dev); +#if NRA + if (cdevsw_lookup(dev) == &ra_cdevsw) + ra = device_lookup_private(&ra_cd, unit); + else +#endif +#if NRACD + if (cdevsw_lookup(dev) == &racd_cdevsw) + ra = device_lookup_private(&racd_cd, unit); + else +#endif +#if NRX + if (cdevsw_lookup(dev) == &rx_cdevsw) + ra = device_lookup_private(&rx_cd, unit); + else +#endif + panic("mscp_device_lookup: unexpected major %"PRIu32" unit %u", + major(dev), unit); + return ra; +} Index: src/sys/dev/mscp/mscp_subr.c diff -u src/sys/dev/mscp/mscp_subr.c:1.41 src/sys/dev/mscp/mscp_subr.c:1.42 --- src/sys/dev/mscp/mscp_subr.c:1.41 Tue May 12 14:37:59 2009 +++ src/sys/dev/mscp/mscp_subr.c Fri Jun 22 20:42:24 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: mscp_subr.c,v 1.41 2009/05/12 14:37:59 cegger Exp $ */ +/* $NetBSD: mscp_subr.c,v 1.42 2012/06/22 20:42:24 abs Exp $ */ /* * Copyright (c) 1988 Regents of the University of California. * All rights reserved. @@ -75,7 +75,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mscp_subr.c,v 1.41 2009/05/12 14:37:59 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mscp_subr.c,v 1.42 2012/06/22 20:42:24 abs Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -159,7 +159,7 @@ mscp_match(device_t parent, cfdata_t mat { struct mscp_attach_args *ma = aux; -#if NRA || NRX +#if NRA || NRACD || NRX if (ma->ma_type & MSCPBUS_DISK) return 1; #endif @@ -245,7 +245,7 @@ mscp_attach(device_t parent, device_t se } -#if NRA +#if NRA || NRACD || NRX if (ma->ma_type & MSCPBUS_DISK) { extern struct mscp_device ra_device;