diff options
author | mav <mav@FreeBSD.org> | 2013-04-04 07:12:24 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2013-04-04 07:12:24 +0000 |
commit | 7c2b81b0e97e507aa2b3b3fac77056edcdf18669 (patch) | |
tree | 942cf38be24f7762b9c2eb69d37326ad19bf5fec /sbin | |
parent | 8f86323b516396dac627133e46a94b9db684dc7f (diff) | |
download | FreeBSD-src-7c2b81b0e97e507aa2b3b3fac77056edcdf18669.zip FreeBSD-src-7c2b81b0e97e507aa2b3b3fac77056edcdf18669.tar.gz |
Remove all legacy ATA code parts, not used since options ATA_CAM enabled in
most kernels before FreeBSD 9.0. Remove such modules and respective kernel
options: atadisk, ataraid, atapicd, atapifd, atapist, atapicam. Remove the
atacontrol utility and some man pages. Remove useless now options ATA_CAM.
No objections: current@, stable@
MFC after: never
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/Makefile | 1 | ||||
-rw-r--r-- | sbin/atacontrol/Makefile | 6 | ||||
-rw-r--r-- | sbin/atacontrol/atacontrol.8 | 405 | ||||
-rw-r--r-- | sbin/atacontrol/atacontrol.c | 644 |
4 files changed, 0 insertions, 1056 deletions
diff --git a/sbin/Makefile b/sbin/Makefile index 16d006d..4772844 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -6,7 +6,6 @@ # XXX MISSING: icheck ncheck SUBDIR=adjkerntz \ - atacontrol \ badsect \ camcontrol \ ccdconfig \ diff --git a/sbin/atacontrol/Makefile b/sbin/atacontrol/Makefile deleted file mode 100644 index 9881273..0000000 --- a/sbin/atacontrol/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -#$FreeBSD$ - -PROG= atacontrol -MAN= atacontrol.8 - -.include <bsd.prog.mk> diff --git a/sbin/atacontrol/atacontrol.8 b/sbin/atacontrol/atacontrol.8 deleted file mode 100644 index 1468a01..0000000 --- a/sbin/atacontrol/atacontrol.8 +++ /dev/null @@ -1,405 +0,0 @@ -.\" -.\" Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org> -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd October 9, 2011 -.Dt ATACONTROL 8 -.Os -.Sh NAME -.Nm atacontrol -.Nd ATA device driver control program -.Pp -This utility was -.Em deprecated -in -.Fx 9.0 . -See -.Sx NOTES . -.Sh SYNOPSIS -.Nm -.Aq Ar command -.Ar args -.Pp -.Nm -.Ic attach -.Ar channel -.Nm -.Ic detach -.Ar channel -.Nm -.Ic reinit -.Ar channel -.Nm -.Ic create -.Ar type Oo Ar interleave Oc Ar disk0 ... diskN -.Nm -.Ic delete -.Ar raid -.Nm -.Ic addspare -.Ar raid disk -.Nm -.Ic rebuild -.Ar raid -.Nm -.Ic status -.Ar raid -.Nm -.Ic mode -.Ar device -.Op Ar mode -.Nm -.Ic info -.Ar channel -.Nm -.Ic cap -.Ar device -.Nm -.Ic spindown -.Ar device -.Op Ar seconds -.Nm -.Ic list -.Sh DESCRIPTION -The -.Nm -utility is a control program that provides the user access and control to the -.Fx -.Xr ata 4 -subsystem. -.Pp -The -.Nm -utility -can cause severe system crashes and loss of data if used improperly. -Please -exercise caution when using this command! -.Pp -The -.Ar channel -argument is the ATA channel device (e.g., ata0) on which to operate. -The following commands are supported: -.Bl -tag -width ".Ic addspare" -.It Ic attach -Attach an ATA -.Ar channel . -Devices on the channel are probed and attached as -is done on boot. -.It Ic detach -Detach an ATA -.Ar channel . -Devices on the channel are removed from the kernel, -and all outstanding transfers etc.\& are returned back to the system marked -as failed. -.It Ic reinit -Reinitialize an ATA -.Ar channel . -Both devices on the channel are reset and -initialized to the parameters the ATA driver has stored internally. -Devices that have gone bad and no longer respond to the probe, or devices -that have physically been removed, are removed from the kernel. -Likewise are devices that show up during a reset, probed and attached. -.It Ic create -Create a -.Ar type -ATA RAID. -The type can be -.Cm RAID0 -(stripe), -.Cm RAID1 -(mirror), -.Cm RAID0+1 , -.Cm SPAN -or -.Cm JBOD . -In case the RAID has a -.Cm RAID0 -component, -the -.Ar interleave -must be specified in number of sectors. -The RAID will be created -of the individual disks named -.Bk -words -.Ar disk0 ... diskN . -.Ek -.Pp -Although the ATA driver allows for creating an ATA RAID on disks with any -controller, there are restrictions. -It is only possible to boot on -an array if it is either located on a -.Dq real -ATA RAID controller like -the Promise or Highpoint controllers, or if the RAID declared is of -.Cm RAID1 -or -.Cm SPAN -type; in case of a -.Cm SPAN , -the partition to boot must -reside on the first disk in the SPAN. -.It Ic delete -Delete a RAID array on a RAID capable ATA controller. -.It Ic addspare -Add a spare disk to an existing RAID. -.It Ic rebuild -Rebuild a RAID1 array on a RAID capable ATA controller. -.It Ic status -Get the status of an ATA RAID. -.It Ic mode -Without the -.Ar mode -argument, the current transfer mode of the -device are printed. -If the -.Ar mode -argument is given, the ATA driver -is asked to change the transfer mode to the one given. -The ATA driver -will reject modes that are not supported by the hardware. -Modes are given like -.Dq Li PIO3 , -.Dq Li udma2 , -.Dq Li udma100 , -case does not matter. -.Pp -Currently supported modes are: -.Cm BIOSPIO , PIO0 , PIO1 , PIO2 , PIO3 , PIO4 , WDMA2 , UDMA2 -(alias -.Cm UDMA33 ) , -.Cm UDMA4 -(alias -.Cm UDMA66 ) , -.Cm UDMA5 -(alias -.Cm UDMA100 ) , -.Cm UDMA6 -(alias -.Cm UDMA133 ) , -.Cm SATA150 , SATA300 , USB , USB1 , USB2 -and -.Cm BIOSDMA . -.It Ic cap -Show detailed info about the device on -.Ar device . -.It Ic spindown -Set or report timeout after which the -.Ar device -will be spun down. -To arm the timeout the device needs at least one more request after -setting the timeout. -To disable spindown, set the timeout to zero. -No further actions are needed in this case. -.It Ic info -Show info about the attached devices on the -.Ar channel . -The device name and manufacture/version strings are shown. -.It Ic list -Show info about all attached devices on all active controllers. -.El -.Sh EXAMPLES -To get information on devices attached to a channel, -use the command line: -.Pp -.Dl "atacontrol info ata0" -.Pp -To see the devices' current access modes, use the command line: -.Pp -.Dl "atacontrol mode ad0" -.Pp -which results in the modes of the devices being displayed as a string -like this: -.Pp -.Dl "current mode = UDMA100" -.Pp -You can set the mode with -.Nm -and a string like the above, -for example: -.Pp -.Dl "atacontrol mode ad0 PIO4" -.Pp -The new modes are set as soon as the -.Nm -command returns. -.Pp -The atacontrol command can also be used to create purely software -RAID arrays in systems that do NOT have a "real" hardware RAID card -such as a Highpoint or Promise card. -A common scenario is a 1U server such as the HP DL320 G4 or G5. -These servers contain a SATA controller that has 2 channels that can -contain 2 disks per channel, but the servers are wired to only place -a single SATA drive on each channel. -These servers do have a "pseudo" RAID BIOS but it uses a proprietary -format that is not compatible with the ata driver, and thus their -RAID bios must be switched off. -Another common scenario would be a Promise UDMA100 controller card -that did not contain the Fasttrack RAID BIOS, but did contain 2 -UDMA channels. -1 disk would be attached to one channel and the other disk would be -attached to the other channel. -It is NOT recommended to create such arrays on a primary/secondary -pair on a SINGLE channel since the throughput of the mirror would be -severely compromised, the ability to rebuild the array in the event -of a disk failure would be greatly complicated, and if a disk -controller electronics failed it could wedge the channel and take -both disks in the mirror offline. -(which would defeat the purpose of having a mirror in the first place) -.Pp -A quick and dirty way to create such a mirrored array on a new -system is to boot off the FreeBSD install CD, do a minimal scratch -install, abort out of the post install questions, and at the command -line issue the command: -.Pp -.Dl "atacontrol create RAID1 ad4 ad6" -.Pp -then immediately issue a reboot and boot from the installation CD -again, and during the installation, you will now see "ar0" listed -as a disk to install on, and install on that instead of ad4, ad6, etc. -.Pp -To get information about the status of a RAID array in the system -use the command line: -.Pp -.Dl "atacontrol status ar0" -.Pp -A typical output showing good health on a RAID array might be as -follows: -.Pp -.Dl "ar0: ATA RAID1 subdisks: ad4 ad6 status: READY" -.Pp -If a disk drive in a RAID1 array dies the system will mark the disk -in a DOWN state and change the array status to DEGRADED. -This can ALSO happen in rare instances due to a power fluctuation or -other event causing the system to not shutdown properly. -In that case the output will look like the following: -.Pp -.Dl "ar0: ATA RAID1 subdisks: ad4 DOWN status: DEGRADED" -.Pp -For a mirrored RAID1 system the server WILL ALLOW you to remove a -dead SATA disk drive (if the drive is in a hot-swap tray) without -freezing up the system, so you can remove the disk and while you are -obtaining a replacement the server can run from the active disk. -The only caveat is that if the active disk is ad6, the system most -likely will NOT be able to be rebooted since most systems only -support booting from the first disk drive. -.Pp -To deactivate the DOWN disk ad6 to allow for it to be ejected, use -the following: -.Pp -.Dl "atacontrol detach ata3" -.Pp -then eject or remove the disk. -Note that this only works if the 2 disks in the mirror are on separate -channels (which is the standard setup for 1-U servers like the HP DL320). -When the new disk drive is obtained, make sure it is blank, then shut -the system down. -At this point, if the system has a RAID array card like a Highpoint or -Promise controller, you may then boot it into the BIOS of the card and use -the manufacturers RAID array rebuild utilities to rebuild the array. -.Pp -If the system has a pure software array and is not using a "real" ATA -RAID controller, then shut the system down, make sure that the disk -that was still working is moved to the bootable position (channel 0 -or whatever the BIOS allows the system to boot from) and the blank disk -is placed in the secondary position, then boot the system into -single-user mode and issue the command: -.Pp -.Dl "atacontrol addspare ar0 ad6" -.Dl "atacontrol rebuild ar0" -.Pp -If the disk drive did NOT fail and the RAID array became unmirrored due -to a software glitch or improper shutdown, then a slightly different -process must be followed. -Begin by issuing the detach command (this shows the detach for disk ad6, -the primary master on channel 3): -.Pp -.Dl "atacontrol detach ata3" -.Pp -then reboot the system into single-user mode. -(don't just init the system, reboot it so that both disks get probed) -You will probably see TWO mirrored RAID arrays appear during the boot -messages, ar0 and ar1. -Issue the command: -.Pp -.Dl "atacontrol delete ar1" -.Dl "atacontrol addspare ar0 ad6" -.Pp -Now a status command will show the array rebuilding. -.Pp -To spin down a disk after 30 minutes run -.Pp -.Dl "atacontrol spindown ad6 1800" -.Dl "dd if=/dev/ad6 of=/dev/null count=1" -.Pp -While any IO on the disk will arm the timer, using -.Xr dd 1 -on the raw device will work in all cases, as when the disk is not -opened at all. -You can check the current setting with -.Pp -.Dl "atacontrol spindown ad6" -.Pp -You should not set a spindown timeout on a disk with -.Pa / -or syslog logging on it as the disk will be worn out spinning down and -up all the time. -.Sh SEE ALSO -.Xr ata 4 , -.Xr cam 4 , -.Xr camcontrol 8 -.Sh HISTORY -The -.Nm -utility first appeared in -.Fx 4.6 . -.Pp -.Nm -was deprecated in -.Fx 9.0 . -.Sh AUTHORS -.An -nosplit -The -.Nm -utility was written by -.An S\(/oren Schmidt -.Aq sos@FreeBSD.org . -.Pp -This manual page was written by -.An S\(/oren Schmidt -.Aq sos@FreeBSD.org . -.Sh NOTES -The -.Nm -utility was deprecated in -.Fx 9.0 . -When -.Bd -ragged -offset indent -.Cd "options ATA_CAM" -.Ed -.Pp -is compiled into the kernel, then -.Xr camcontrol 8 -must be used instead. diff --git a/sbin/atacontrol/atacontrol.c b/sbin/atacontrol/atacontrol.c deleted file mode 100644 index 4b9b74f..0000000 --- a/sbin/atacontrol/atacontrol.c +++ /dev/null @@ -1,644 +0,0 @@ -/*- - * Copyright (c) 2000 - 2006 Søren Schmidt <sos@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/types.h> -#include <sys/ata.h> - -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sysexits.h> -#include <unistd.h> - -static const char * -mode2str(int mode) -{ - switch (mode & 0xff) { - case ATA_PIO: return "BIOSPIO"; - case ATA_PIO0: return "PIO0"; - case ATA_PIO1: return "PIO1"; - case ATA_PIO2: return "PIO2"; - case ATA_PIO3: return "PIO3"; - case ATA_PIO4: return "PIO4"; - case ATA_WDMA0: return "WDMA0"; - case ATA_WDMA1: return "WDMA1"; - case ATA_WDMA2: return "WDMA2"; - case ATA_UDMA0: return "UDMA0"; - case ATA_UDMA1: return "UDMA1"; - case ATA_UDMA2: return "UDMA33"; - case ATA_UDMA3: return "UDMA44"; - case ATA_UDMA4: return "UDMA66"; - case ATA_UDMA5: return "UDMA100"; - case ATA_UDMA6: return "UDMA133"; - case ATA_DMA: return "BIOSDMA"; - default: return "???"; - } -} - -static const char * -satarev2str(int mode) -{ - switch ((mode & 0xff00) >> 8) { - case 0: return ""; - case 1: return "SATA 1.5Gb/s"; - case 2: return "SATA 3Gb/s"; - case 3: return "SATA 6Gb/s"; - case 0xff: return "SATA"; - default: return "???"; - } -} - -static int -str2mode(char *str) -{ - if (!strcasecmp(str, "BIOSPIO")) return ATA_PIO; - if (!strcasecmp(str, "PIO0")) return ATA_PIO0; - if (!strcasecmp(str, "PIO1")) return ATA_PIO1; - if (!strcasecmp(str, "PIO2")) return ATA_PIO2; - if (!strcasecmp(str, "PIO3")) return ATA_PIO3; - if (!strcasecmp(str, "PIO4")) return ATA_PIO4; - if (!strcasecmp(str, "WDMA0")) return ATA_WDMA0; - if (!strcasecmp(str, "WDMA1")) return ATA_WDMA1; - if (!strcasecmp(str, "WDMA2")) return ATA_WDMA2; - if (!strcasecmp(str, "UDMA0")) return ATA_UDMA0; - if (!strcasecmp(str, "UDMA16")) return ATA_UDMA0; - if (!strcasecmp(str, "UDMA1")) return ATA_UDMA1; - if (!strcasecmp(str, "UDMA25")) return ATA_UDMA1; - if (!strcasecmp(str, "UDMA2")) return ATA_UDMA2; - if (!strcasecmp(str, "UDMA33")) return ATA_UDMA2; - if (!strcasecmp(str, "UDMA3")) return ATA_UDMA3; - if (!strcasecmp(str, "UDMA44")) return ATA_UDMA3; - if (!strcasecmp(str, "UDMA4")) return ATA_UDMA4; - if (!strcasecmp(str, "UDMA66")) return ATA_UDMA4; - if (!strcasecmp(str, "UDMA5")) return ATA_UDMA5; - if (!strcasecmp(str, "UDMA100")) return ATA_UDMA5; - if (!strcasecmp(str, "UDMA6")) return ATA_UDMA6; - if (!strcasecmp(str, "UDMA133")) return ATA_UDMA6; - if (!strcasecmp(str, "BIOSDMA")) return ATA_DMA; - return -1; -} - -static void -usage(void) -{ - fprintf(stderr, - "usage: atacontrol <command> args:\n" - " atacontrol list\n" - " atacontrol info channel\n" - " atacontrol attach channel\n" - " atacontrol detach channel\n" - " atacontrol reinit channel\n" - " atacontrol create type [interleave] disk0 ... diskN\n" - " atacontrol delete array\n" - " atacontrol addspare array disk\n" - " atacontrol rebuild array\n" - " atacontrol status array\n" - " atacontrol mode device [mode]\n" - " atacontrol cap device\n" - " atacontrol spindown device [seconds]\n" - ); - exit(EX_USAGE); -} - -static int -version(int ver) -{ - int bit; - - if (ver == 0xffff) - return 0; - for (bit = 15; bit >= 0; bit--) - if (ver & (1<<bit)) - return bit; - return 0; -} - -static void -param_print(struct ata_params *parm) -{ - printf("<%.40s/%.8s> ", parm->model, parm->revision); - if (parm->satacapabilities && parm->satacapabilities != 0xffff) { - if (parm->satacapabilities & ATA_SATA_GEN2) - printf("SATA revision 2.x\n"); - else if (parm->satacapabilities & ATA_SATA_GEN1) - printf("SATA revision 1.x\n"); - else - printf("Unknown SATA revision\n"); - } - else - printf("ATA/ATAPI revision %d\n", version(parm->version_major)); -} - -static void -cap_print(struct ata_params *parm) -{ - u_int32_t lbasize = (u_int32_t)parm->lba_size_1 | - ((u_int32_t)parm->lba_size_2 << 16); - - u_int64_t lbasize48 = ((u_int64_t)parm->lba_size48_1) | - ((u_int64_t)parm->lba_size48_2 << 16) | - ((u_int64_t)parm->lba_size48_3 << 32) | - ((u_int64_t)parm->lba_size48_4 << 48); - - printf("\n"); - printf("Protocol "); - if (parm->satacapabilities && parm->satacapabilities != 0xffff) { - if (parm->satacapabilities & ATA_SATA_GEN2) - printf("SATA revision 2.x\n"); - else if (parm->satacapabilities & ATA_SATA_GEN1) - printf("SATA revision 1.x\n"); - else - printf("Unknown SATA revision\n"); - } - else - printf("ATA/ATAPI revision %d\n", version(parm->version_major)); - printf("device model %.40s\n", parm->model); - printf("serial number %.20s\n", parm->serial); - printf("firmware revision %.8s\n", parm->revision); - - printf("cylinders %d\n", parm->cylinders); - printf("heads %d\n", parm->heads); - printf("sectors/track %d\n", parm->sectors); - - if (parm->config == ATA_PROTO_CFA || - (parm->support.command2 & ATA_SUPPORT_CFA)) - printf("CFA supported\n"); - - printf("lba%ssupported ", - parm->capabilities1 & ATA_SUPPORT_LBA ? " " : " not "); - if (lbasize) - printf("%d sectors\n", lbasize); - else - printf("\n"); - - printf("lba48%ssupported ", - parm->support.command2 & ATA_SUPPORT_ADDRESS48 ? " " : " not "); - if (lbasize48) - printf("%ju sectors\n", (uintmax_t)lbasize48); - else - printf("\n"); - - printf("dma%ssupported\n", - parm->capabilities1 & ATA_SUPPORT_DMA ? " " : " not "); - - printf("overlap%ssupported\n", - parm->capabilities1 & ATA_SUPPORT_OVERLAP ? " " : " not "); - - printf("\nFeature " - "Support Enable Value Vendor\n"); - - printf("write cache %s %s\n", - parm->support.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no"); - - printf("read ahead %s %s\n", - parm->support.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no"); - - if (parm->satacapabilities && parm->satacapabilities != 0xffff) { - printf("Native Command Queuing (NCQ) %s %s" - " %d/0x%02X\n", - parm->satacapabilities & ATA_SUPPORT_NCQ ? - "yes" : "no", " -", - (parm->satacapabilities & ATA_SUPPORT_NCQ) ? - ATA_QUEUE_LEN(parm->queue) : 0, - (parm->satacapabilities & ATA_SUPPORT_NCQ) ? - ATA_QUEUE_LEN(parm->queue) : 0); - } - printf("Tagged Command Queuing (TCQ) %s %s %d/0x%02X\n", - parm->support.command2 & ATA_SUPPORT_QUEUED ? "yes" : "no", - parm->enabled.command2 & ATA_SUPPORT_QUEUED ? "yes" : "no", - ATA_QUEUE_LEN(parm->queue), ATA_QUEUE_LEN(parm->queue)); - - printf("SMART %s %s\n", - parm->support.command1 & ATA_SUPPORT_SMART ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_SMART ? "yes" : "no"); - - printf("microcode download %s %s\n", - parm->support.command2 & ATA_SUPPORT_MICROCODE ? "yes" : "no", - parm->enabled.command2 & ATA_SUPPORT_MICROCODE ? "yes" : "no"); - - printf("security %s %s\n", - parm->support.command1 & ATA_SUPPORT_SECURITY ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_SECURITY ? "yes" : "no"); - - printf("power management %s %s\n", - parm->support.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no"); - - printf("advanced power management %s %s %d/0x%02X\n", - parm->support.command2 & ATA_SUPPORT_APM ? "yes" : "no", - parm->enabled.command2 & ATA_SUPPORT_APM ? "yes" : "no", - parm->apm_value, parm->apm_value); - - printf("automatic acoustic management %s %s " - "%d/0x%02X %d/0x%02X\n", - parm->support.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no", - parm->enabled.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no", - ATA_ACOUSTIC_CURRENT(parm->acoustic), - ATA_ACOUSTIC_CURRENT(parm->acoustic), - ATA_ACOUSTIC_VENDOR(parm->acoustic), - ATA_ACOUSTIC_VENDOR(parm->acoustic)); -} - -static void -ata_cap_print(int fd) -{ - struct ata_params params; - - if (ioctl(fd, IOCATAGPARM, ¶ms) < 0) - err(1, "ioctl(IOCATAGPARM)"); - cap_print(¶ms); -} - -static void -info_print(int fd, int channel, int prchan) -{ - struct ata_ioc_devices devices; - - devices.channel = channel; - - if (ioctl(fd, IOCATADEVICES, &devices) < 0) { - if (!prchan) - err(1, "ioctl(IOCATADEVICES)"); - return; - } - if (prchan) - printf("ATA channel %d:\n", channel); - printf("%sMaster: ", prchan ? " " : ""); - if (*devices.name[0]) { - printf("%4.4s ", devices.name[0]); - param_print(&devices.params[0]); - } - else - printf(" no device present\n"); - printf("%sSlave: ", prchan ? " " : ""); - if (*devices.name[1]) { - printf("%4.4s ", devices.name[1]); - param_print(&devices.params[1]); - } - else - printf(" no device present\n"); -} - -static void -ata_spindown(int fd, const char *dev, const char *arg) -{ - int tmo; - - if (arg != NULL) { - tmo = strtoul(arg, NULL, 0); - if (ioctl(fd, IOCATASSPINDOWN, &tmo) < 0) - err(1, "ioctl(IOCATASSPINDOWN)"); - } else { - if (ioctl(fd, IOCATAGSPINDOWN, &tmo) < 0) - err(1, "ioctl(IOCATAGSPINDOWN)"); - if (tmo == 0) - printf("%s: idle spin down disabled\n", dev); - else - printf("%s: spin down after %d seconds idle\n", - dev, tmo); - } -} - -static int -open_dev(const char *arg, int mode) -{ - int disk, fd; - char device[64]; - - if (!(sscanf(arg, "ad%d", &disk) == 1 || - sscanf(arg, "acd%d", &disk) == 1 || - sscanf(arg, "afd%d", &disk) == 1 || - sscanf(arg, "ast%d", &disk) == 1)) { - fprintf(stderr, "atacontrol: Invalid device %s\n", arg); - exit(EX_USAGE); - } - sprintf(device, "/dev/%s", arg); - if ((fd = open(device, mode)) < 0) - err(1, "device not found"); - return (fd); -} - -static int -ar_arg(const char *arg) -{ - int array; - - if (!(sscanf(arg, "ar%d", &array) == 1)) { - fprintf(stderr, "atacontrol: Invalid array %s\n", arg); - exit(EX_USAGE); - } - return (array); -} - -static int -ata_arg(const char *arg) -{ - int channel; - - if (!(sscanf(arg, "ata%d", &channel) == 1)) { - fprintf(stderr, "atacontrol: Invalid channel %s\n", arg); - exit(EX_USAGE); - } - return (channel); -} - -int -main(int argc, char **argv) -{ - int fd, mode, channel, array; - - if (feature_present("ata_cam")) { - errx(1, "\nATA_CAM option is enabled in kernel.\n" - "Please use camcontrol instead."); - } - - if (argc < 2) - usage(); - - if (!strcmp(argv[1], "mode") && (argc == 3 || argc == 4)) { - fd = open_dev(argv[2], O_RDONLY); - if (argc == 4) { - mode = str2mode(argv[3]); - if (mode == -1) - errx(1, "unknown mode"); - if (ioctl(fd, IOCATASMODE, &mode) < 0) - warn("ioctl(IOCATASMODE)"); - } - if (argc == 3 || argc == 4) { - if (ioctl(fd, IOCATAGMODE, &mode) < 0) - err(1, "ioctl(IOCATAGMODE)"); - printf("current mode = %s %s\n", - mode2str(mode), satarev2str(mode)); - } - exit(EX_OK); - } - if (!strcmp(argv[1], "cap") && argc == 3) { - fd = open_dev(argv[2], O_RDONLY); - ata_cap_print(fd); - exit(EX_OK); - } - - if (!strcmp(argv[1], "spindown") && (argc == 3 || argc == 4)) { - fd = open_dev(argv[2], O_RDONLY); - ata_spindown(fd, argv[2], argv[3]); - exit(EX_OK); - } - - if ((fd = open("/dev/ata", O_RDWR)) < 0) - err(1, "control device not found"); - - if (!strcmp(argv[1], "list") && argc == 2) { - int maxchannel; - - if (ioctl(fd, IOCATAGMAXCHANNEL, &maxchannel) < 0) - err(1, "ioctl(IOCATAGMAXCHANNEL)"); - for (channel = 0; channel < maxchannel; channel++) - info_print(fd, channel, 1); - exit(EX_OK); - } - if (!strcmp(argv[1], "info") && argc == 3) { - channel = ata_arg(argv[2]); - info_print(fd, channel, 0); - exit(EX_OK); - } - if (!strcmp(argv[1], "detach") && argc == 3) { - channel = ata_arg(argv[2]); - if (ioctl(fd, IOCATADETACH, &channel) < 0) - err(1, "ioctl(IOCATADETACH)"); - exit(EX_OK); - } - if (!strcmp(argv[1], "attach") && argc == 3) { - channel = ata_arg(argv[2]); - if (ioctl(fd, IOCATAATTACH, &channel) < 0) - err(1, "ioctl(IOCATAATTACH)"); - info_print(fd, channel, 0); - exit(EX_OK); - } - if (!strcmp(argv[1], "reinit") && argc == 3) { - channel = ata_arg(argv[2]); - if (ioctl(fd, IOCATAREINIT, &channel) < 0) - warn("ioctl(IOCATAREINIT)"); - info_print(fd, channel, 0); - exit(EX_OK); - } - if (!strcmp(argv[1], "create")) { - int disk, dev, offset; - struct ata_ioc_raid_config config; - - bzero(&config, sizeof(config)); - if (argc > 2) { - if (!strcasecmp(argv[2], "RAID0") || - !strcasecmp(argv[2], "stripe")) - config.type = AR_RAID0; - if (!strcasecmp(argv[2], "RAID1") || - !strcasecmp(argv[2],"mirror")) - config.type = AR_RAID1; - if (!strcasecmp(argv[2], "RAID0+1") || - !strcasecmp(argv[2],"RAID10")) - config.type = AR_RAID01; - if (!strcasecmp(argv[2], "RAID5")) - config.type = AR_RAID5; - if (!strcasecmp(argv[2], "SPAN")) - config.type = AR_SPAN; - if (!strcasecmp(argv[2], "JBOD")) - config.type = AR_JBOD; - } - if (!config.type) { - fprintf(stderr, "atacontrol: Invalid RAID type %s\n", - argv[2]); - fprintf(stderr, "atacontrol: Valid RAID types: \n"); - fprintf(stderr, " stripe | mirror | " - "RAID0 | RAID1 | RAID0+1 | RAID5 | " - "SPAN | JBOD\n"); - exit(EX_USAGE); - } - - if (config.type == AR_RAID0 || - config.type == AR_RAID01 || - config.type == AR_RAID5) { - if (argc < 4 || - !sscanf(argv[3], "%d", &config.interleave) == 1) { - fprintf(stderr, - "atacontrol: Invalid interleave %s\n", - argv[3]); - exit(EX_USAGE); - } - offset = 4; - } - else - offset = 3; - - for (disk = 0; disk < 16 && (offset + disk) < argc; disk++) { - if (!(sscanf(argv[offset + disk], "ad%d", &dev) == 1)) { - fprintf(stderr, - "atacontrol: Invalid disk %s\n", - argv[offset + disk]); - exit(EX_USAGE); - } - config.disks[disk] = dev; - } - - if ((config.type == AR_RAID1 || config.type == AR_RAID01) && - disk < 2) { - fprintf(stderr, "atacontrol: At least 2 disks must be " - "specified\n"); - exit(EX_USAGE); - } - - config.total_disks = disk; - if (ioctl(fd, IOCATARAIDCREATE, &config) < 0) - err(1, "ioctl(IOCATARAIDCREATE)"); - else - printf("ar%d created\n", config.lun); - exit(EX_OK); - } - if (!strcmp(argv[1], "delete") && argc == 3) { - array = ar_arg(argv[2]); - if (ioctl(fd, IOCATARAIDDELETE, &array) < 0) - warn("ioctl(IOCATARAIDDELETE)"); - exit(EX_OK); - } - if (!strcmp(argv[1], "addspare") && argc == 4) { - struct ata_ioc_raid_config config; - - config.lun = ar_arg(argv[2]); - if (!(sscanf(argv[3], "ad%d", &config.disks[0]) == 1)) { - fprintf(stderr, - "atacontrol: Invalid disk %s\n", argv[3]); - usage(); - } - if (ioctl(fd, IOCATARAIDADDSPARE, &config) < 0) - warn("ioctl(IOCATARAIDADDSPARE)"); - exit(EX_OK); - } - if (!strcmp(argv[1], "rebuild") && argc == 3) { - array = ar_arg(argv[2]); - if (ioctl(fd, IOCATARAIDREBUILD, &array) < 0) - warn("ioctl(IOCATARAIDREBUILD)"); - else { - char device[64]; - char *buffer; - ssize_t len; - int arfd; - - if (daemon(0, 1) == -1) - err(1, "daemon"); - nice(20); - snprintf(device, sizeof(device), "/dev/ar%d", - array); - if ((arfd = open(device, O_RDONLY)) == -1) - err(1, "open %s", device); - if ((buffer = malloc(1024 * 1024)) == NULL) - err(1, "malloc"); - while ((len = read(arfd, buffer, 1024 * 1024)) > 0) - ; - if (len == -1) - err(1, "read"); - else - fprintf(stderr, - "atacontrol: ar%d rebuild completed\n", - array); - free(buffer); - close(arfd); - } - exit(EX_OK); - } - if (!strcmp(argv[1], "status") && argc == 3) { - struct ata_ioc_raid_status status; - int i, lun, state; - - status.lun = ar_arg(argv[2]); - if (ioctl(fd, IOCATARAIDSTATUS, &status) < 0) - err(1, "ioctl(IOCATARAIDSTATUS)"); - - printf("ar%d: ATA ", status.lun); - switch (status.type) { - case AR_RAID0: - printf("RAID0 stripesize=%d", status.interleave); - break; - case AR_RAID1: - printf("RAID1"); - break; - case AR_RAID01: - printf("RAID0+1 stripesize=%d", status.interleave); - break; - case AR_RAID5: - printf("RAID5 stripesize=%d", status.interleave); - break; - case AR_JBOD: - printf("JBOD"); - break; - case AR_SPAN: - printf("SPAN"); - break; - } - printf(" status: "); - switch (status.status) { - case AR_READY: - printf("READY\n"); - break; - case AR_READY | AR_DEGRADED: - printf("DEGRADED\n"); - break; - case AR_READY | AR_DEGRADED | AR_REBUILDING: - printf("REBUILDING %d%% completed\n", - status.progress); - break; - default: - printf("BROKEN\n"); - } - printf(" subdisks:\n"); - for (i = 0; i < status.total_disks; i++) { - printf(" %2d ", i); - lun = status.disks[i].lun; - state = status.disks[i].state; - if (lun < 0) - printf("---- "); - else - printf("ad%-2d ", lun); - if (state & AR_DISK_ONLINE) - printf("ONLINE"); - else if (state & AR_DISK_SPARE) - printf("SPARE"); - else if (state & AR_DISK_PRESENT) - printf("OFFLINE"); - else - printf("MISSING"); - printf("\n"); - } - exit(EX_OK); - } - usage(); - exit(EX_OK); -} |