summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormux <mux@FreeBSD.org>2003-03-22 12:18:20 +0000
committermux <mux@FreeBSD.org>2003-03-22 12:18:20 +0000
commit41824db1c60239f31a899ab05c9bdc7cbf728bd0 (patch)
treebf4321914b31ede56d450445be309e2854f4c107
parent6aa08c7dda5a26d5cffef6924435fc620e970d5b (diff)
downloadFreeBSD-src-41824db1c60239f31a899ab05c9bdc7cbf728bd0.zip
FreeBSD-src-41824db1c60239f31a899ab05c9bdc7cbf728bd0.tar.gz
- Add a new ioctl to get the maximum number of ATA channels.
- Use it in atacontrol(8) when listing ATA devices instead of stopping at the first ENXIO received. This makes atacontrol list work on my sparc64 where the two ATA channels I have are numbered 2 and 3. Reviewed by: sos
-rw-r--r--sbin/atacontrol/atacontrol.c11
-rw-r--r--sys/dev/ata/ata-all.c5
-rw-r--r--sys/sys/ata.h2
3 files changed, 14 insertions, 4 deletions
diff --git a/sbin/atacontrol/atacontrol.c b/sbin/atacontrol/atacontrol.c
index d7b6995..c55e399 100644
--- a/sbin/atacontrol/atacontrol.c
+++ b/sbin/atacontrol/atacontrol.c
@@ -249,7 +249,7 @@ int
main(int argc, char **argv)
{
struct ata_cmd iocmd;
- int fd;
+ int fd, maxunit, unit;
if ((fd = open("/dev/ata", O_RDWR)) < 0)
err(1, "control device not found");
@@ -278,9 +278,12 @@ main(int argc, char **argv)
}
if (!strcmp(argv[1], "list") && argc == 2) {
- int unit = 0;
-
- while (info_print(fd, unit++, 1) != ENXIO);
+ iocmd.cmd = ATAGMAXCHANNEL;
+ if (ioctl(fd, IOCATA, &iocmd) < 0)
+ err(1, "ioctl(ATAGMAXCHANNEL)");
+ maxunit = iocmd.u.maxchan;
+ for (unit = 0; unit < maxunit; unit++)
+ info_print(fd, unit, 1);
}
else if (!strcmp(argv[1], "info") && argc == 3) {
info_print(fd, iocmd.channel, 0);
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 67da2a0..56a7d29 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -304,6 +304,11 @@ ataioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td)
if (cmd != IOCATA)
return ENOTTY;
+ if (iocmd->cmd == ATAGMAXCHANNEL) {
+ iocmd->u.maxchan = devclass_get_maxunit(ata_devclass);
+ return 0;
+ }
+
if (iocmd->channel < -1 || iocmd->device < -1 || iocmd->device > SLAVE)
return ENXIO;
diff --git a/sys/sys/ata.h b/sys/sys/ata.h
index 52442af..7464d15 100644
--- a/sys/sys/ata.h
+++ b/sys/sys/ata.h
@@ -369,6 +369,7 @@ struct ata_cmd {
#define ATARAIDDELETE 10
#define ATARAIDSTATUS 11
#define ATAENCSTAT 12
+#define ATAGMAXCHANNEL 13
union {
struct {
@@ -421,6 +422,7 @@ struct ata_cmd {
int error;
char sense_data[18];
} atapi;
+ int maxchan;
} u;
};
OpenPOWER on IntegriCloud