summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorMarco Peereboom <marco@cvs.openbsd.org>2005-08-18 04:49:53 +0000
committerMarco Peereboom <marco@cvs.openbsd.org>2005-08-18 04:49:53 +0000
commit4eb64979878c88021ad286c154decd88cdb5fd8e (patch)
tree547762decd40704f43cb991b555de411199fb59f /sys/dev
parent554d489dce3a2e3c280f90fb15459a80f14ade1a (diff)
Add "create hot spare" ok dlg@
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/biovar.h22
-rw-r--r--sys/dev/ic/ami.c46
2 files changed, 59 insertions, 9 deletions
diff --git a/sys/dev/biovar.h b/sys/dev/biovar.h
index c5e7e739dac..4df28be56d6 100644
--- a/sys/dev/biovar.h
+++ b/sys/dev/biovar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: biovar.h,v 1.17 2005/08/17 22:28:54 marco Exp $ */
+/* $OpenBSD: biovar.h,v 1.18 2005/08/18 04:49:52 marco Exp $ */
/*
* Copyright (c) 2002 Niklas Hallqvist. All rights reserved.
@@ -151,21 +151,31 @@ struct bioc_blink {
#define BIOC_SBUNBLINK 0x00 /* disable blinking */
#define BIOC_SBBLINK 0x01 /* enable blink */
#define BIOC_SBALARM 0x02 /* enable alarm blink */
+
+ u_int16_t bs_channel;
+ u_int16_t bs_target;
+ u_int16_t bs_lun;
+ u_int16_t bs_other_id; /* unused for now */
};
#define BIOCSETSTATE _IOWR('B', 37, struct bioc_setstate)
struct bioc_setstate {
void *bs_cookie;
- int bs_volid; /* volume */
- int bs_diskid; /* virtual disk */
- int bs_status; /* current status */
+ int bs_resv1; /* for binary compatibility */
+ int bs_resv2; /* for binary compatibility */
+ int bs_status; /* change to this status */
#define BIOC_SSONLINE 0x00 /* online disk */
#define BIOC_SSOFFLINE 0x01 /* offline disk */
#define BIOC_SSHOTSPARE 0x02 /* mark as hotspare */
- int bs_resv1; /* for binary compatibility */
+ int bs_resv3; /* for binary compatibility */
+
+ u_int16_t bs_channel;
+ u_int16_t bs_target;
+ u_int16_t bs_lun;
+ u_int16_t bs_other_id; /* unused for now */
- int bs_resv2;
+ int bs_resv4;
};
#define BIOC_INQ 0x0001
diff --git a/sys/dev/ic/ami.c b/sys/dev/ic/ami.c
index 73a03811465..94a2fc0f924 100644
--- a/sys/dev/ic/ami.c
+++ b/sys/dev/ic/ami.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ami.c,v 1.67 2005/08/17 21:49:14 marco Exp $ */
+/* $OpenBSD: ami.c,v 1.68 2005/08/18 04:49:52 marco Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -148,6 +148,7 @@ int ami_disk(struct ami_softc *, struct bioc_disk *,
int ami_ioctl_vol(struct ami_softc *, struct bioc_vol *);
int ami_ioctl_disk(struct ami_softc *, struct bioc_disk *);
int ami_ioctl_alarm(struct ami_softc *, struct bioc_alarm *);
+int ami_ioctl_setstate(struct ami_softc *, struct bioc_setstate *);
#endif /* NBIO > 0 */
struct ami_ccb *
@@ -1819,6 +1820,7 @@ ami_ioctl(dev, cmd, addr)
case BIOCVOL:
case BIOCDISK:
case BIOCALARM:
+ case BIOCSETSTATE:
sc->sc_flags |= AMI_CMDWAIT;
while (!TAILQ_EMPTY(&sc->sc_ccbq))
if (tsleep(&sc->sc_free_ccb, PRIBIO, "ami_ioctl",
@@ -1846,7 +1848,12 @@ ami_ioctl(dev, cmd, addr)
AMI_DPRINTF(AMI_D_IOCTL, ("alarm "));
error = ami_ioctl_alarm(sc, (struct bioc_alarm *)addr);
break;
-
+
+ case BIOCSETSTATE:
+ AMI_DPRINTF(AMI_D_IOCTL, ("setstate "));
+ error = ami_ioctl_setstate(sc, (struct bioc_setstate *)addr);
+ break;
+
default:
AMI_DPRINTF(AMI_D_IOCTL, ("%s: invalid ioctl\n",
sc->sc_dev.dv_xname));
@@ -2487,7 +2494,7 @@ int ami_ioctl_alarm(sc, ba)
default:
AMI_DPRINTF(AMI_D_IOCTL, ("%s: biocalarm invalid opcode %x\n",
sc->sc_dev.dv_xname, ba->ba_opcode));
- error = EINVAL;
+ return (EINVAL);
}
if (ami_mgmt(sc, AMI_SPEAKER, func, 0, 0, sizeof ret, &ret))
@@ -2500,6 +2507,39 @@ int ami_ioctl_alarm(sc, ba)
return (error);
}
+
+int
+ami_ioctl_setstate(sc, bs)
+ struct ami_softc *sc;
+ struct bioc_setstate *bs;
+{
+ int func;
+
+ switch (bs->bs_status) {
+ case BIOC_SSONLINE:
+ func = AMI_STATE_ON;
+ break;
+
+ case BIOC_SSOFFLINE:
+ func = AMI_STATE_FAIL;
+ break;
+
+ case BIOC_SSHOTSPARE:
+ func = AMI_STATE_SPARE;
+ break;
+
+ default:
+ AMI_DPRINTF(AMI_D_IOCTL, ("%s: biocsetstate invalid opcode %x\n"
+ , sc->sc_dev.dv_xname, bs->bs_status));
+ return (EINVAL);
+ }
+
+ if (ami_mgmt(sc, AMI_CHSTATE, bs->bs_channel, bs->bs_target, func,
+ 0, NULL))
+ return (EINVAL);
+
+ return (0);
+}
#endif /* NBIO > 0 */
#ifdef AMI_DEBUG