Back out ru's changes. Soren has requested this and I see no reason
to not just do it. It is his new code that is being actively developed so he has say over it. ru's direct changes were premature as they occurred less than 4 hours after it was committed to the tree.
This commit is contained in:
parent
7350bb3af1
commit
ab820341c1
@ -1,7 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
#$FreeBSD$
|
||||
PROG= atacontrol
|
||||
MAN8= atacontrol.8
|
||||
CFLAGS+=-Wall
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -33,90 +33,78 @@
|
||||
.Nd
|
||||
ATA device driver control program
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Nm
|
||||
.Aq Ar command
|
||||
.Ar channel Op Ar args
|
||||
.Pp
|
||||
.Op channel [args]
|
||||
|
||||
.Nm
|
||||
.Ic attach
|
||||
.Ar channel
|
||||
.Op channel
|
||||
.Nm
|
||||
.Ic detach
|
||||
.Ar channel
|
||||
.Op channel
|
||||
.Nm
|
||||
.Ic reinit
|
||||
.Ar channel
|
||||
.Op channel
|
||||
.Nm
|
||||
.Ic mode
|
||||
.Ar channel
|
||||
.Op Ar mastermode slavemode
|
||||
.Op channel
|
||||
.Op mastermode slavemode
|
||||
.Nm
|
||||
.Ic info
|
||||
.Ar channel
|
||||
.Op channel
|
||||
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
is a control program that provides the user access and control to the
|
||||
.Fx
|
||||
.Xr ata 4
|
||||
subsystem.
|
||||
.Fx
|
||||
ATA subsystem.
|
||||
.Pp
|
||||
.Nm
|
||||
can cause severe system crashes and loss of data if used improperly, please
|
||||
exercise caution when using this command!
|
||||
exercise caution when using this command!.
|
||||
.Pp
|
||||
.Nm
|
||||
supports the following commands:
|
||||
.Bl -tag -width "attach"
|
||||
.It Ic attach
|
||||
Attach an ATA
|
||||
.Ar channel ,
|
||||
devices on the channel are probed and attached as
|
||||
.Pp
|
||||
.Bl -tag -width 8n
|
||||
.It Ic attach
|
||||
Attach an ATA channel, devices on the channel are probed and attached as
|
||||
is done on boot.
|
||||
.Pp
|
||||
.It Ic detach
|
||||
Detach an ATA
|
||||
.Ar channel ,
|
||||
devices on the channel are removed from the kernel,
|
||||
Detach an ATA channel, devices on the channel are removed from the kernel,
|
||||
and all outstanding tranfers etc are returned back to the system marked
|
||||
as failed.
|
||||
.Pp
|
||||
.It Ic reinit
|
||||
Reinitialize an ATA
|
||||
.Ar channel .
|
||||
Both devices on the channel are reset and
|
||||
Reinitialize an ATA channel. Both devices on the channel are reset and
|
||||
initialized to the parameters the ATA driver has stored internally.
|
||||
Devices that has gone bad and no longer responds to the probe, or devices
|
||||
that has physically been removed are removed from the kernel.
|
||||
Likewise
|
||||
that has physically been removed are removed from the kernel. Likewise
|
||||
are devices that show up during a reset, probed and attached.
|
||||
.It Ic mode
|
||||
.Pp
|
||||
.It Ic mode
|
||||
Without the two mode arguments the current transfer modes of both
|
||||
devices are printed.
|
||||
If the mode arguments are given, the ATA driver
|
||||
is asked to change the transfer modes to those given.
|
||||
The ATA driver
|
||||
devices are printed. If the mode arguments are given, the ATA driver
|
||||
is asked to change the transfer modes to those given. The ATA driver
|
||||
will reject modes that is not supported by the hardware.
|
||||
Modes are given like
|
||||
.Dq Li PIO3 ,
|
||||
.Dq Li udma2 ,
|
||||
.Dq Li udma100 ,
|
||||
case does not matter.
|
||||
Modes are given like PIO3, udma2, udma100, case does not matter.
|
||||
.Pp
|
||||
.It Ic info
|
||||
Show info on the device on the
|
||||
.Ar channel ,
|
||||
currently only the device
|
||||
Show info on the device on the channel, currently only the device
|
||||
name and manufacture/version strings are shown.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr ata 4
|
||||
.Pp
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
utility first appeared in
|
||||
driver first appeared in
|
||||
.Fx 5.0 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
The
|
||||
.Nm
|
||||
utility was written by
|
||||
driver was written by
|
||||
.An S\(/oren Schmidt
|
||||
.Aq sos@FreeBSD.org .
|
||||
.Pp
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2000, 2001 Søren Schmidt
|
||||
* Copyright (c) 2000,2001 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -24,104 +24,78 @@
|
||||
* 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$
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ata.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "pathnames.h"
|
||||
|
||||
struct mode2str {
|
||||
int mode;
|
||||
const char *str;
|
||||
};
|
||||
|
||||
struct mode2str mode_str[] = {
|
||||
{ ATA_PIO, "BIOSPIO" },
|
||||
{ ATA_PIO0, "PIO0" },
|
||||
{ ATA_PIO1, "PIO1" },
|
||||
{ ATA_PIO2, "PIO2" },
|
||||
{ ATA_PIO3, "PIO3" },
|
||||
{ ATA_PIO4, "PIO4" },
|
||||
{ ATA_WDMA2, "WDMA2" },
|
||||
{ ATA_UDMA2, "UDMA33" },
|
||||
{ ATA_UDMA4, "UDMA66" },
|
||||
{ ATA_UDMA5, "UDMA100" },
|
||||
{ ATA_DMA, "BIOSDMA" },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
const char *mode2str(int);
|
||||
int str2mode(char *);
|
||||
int version(int);
|
||||
void param_print(struct ata_params *);
|
||||
void info_print(int, int);
|
||||
void usage(void);
|
||||
|
||||
const char *
|
||||
char *
|
||||
mode2str(int mode)
|
||||
{
|
||||
int m;
|
||||
|
||||
for (m = 0; mode_str[m].mode != -1; m++)
|
||||
if (mode_str[m].mode == mode)
|
||||
return (mode_str[m].str);
|
||||
|
||||
return "???";
|
||||
switch (mode) {
|
||||
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_WDMA2: return "WDMA2";
|
||||
case ATA_UDMA2: return "UDMA33";
|
||||
case ATA_UDMA4: return "UDMA66";
|
||||
case ATA_UDMA5: return "UDMA100";
|
||||
case ATA_DMA: return "BIOSDMA";
|
||||
default: return "???";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
str2mode(char *str)
|
||||
{
|
||||
int m;
|
||||
|
||||
for (m = 0; mode_str[m].mode != -1; m++)
|
||||
if (!strcasecmp(mode_str[m].str, str))
|
||||
return (mode_str[m].mode);
|
||||
|
||||
return -1;
|
||||
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, "WDMA2")) return ATA_WDMA2;
|
||||
if (!strcasecmp(str, "UDMA2")) return ATA_UDMA2;
|
||||
if (!strcasecmp(str, "UDMA33")) return ATA_UDMA2;
|
||||
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, "BIOSDMA")) return ATA_DMA;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
usage(void)
|
||||
usage()
|
||||
{
|
||||
|
||||
fprintf(stderr, "usage: atacontrol <command> channel [args]\n");
|
||||
exit(1);
|
||||
printf("usage: atacontrol <command> channel [args]\n");
|
||||
}
|
||||
|
||||
int
|
||||
version(int vers)
|
||||
version(int version)
|
||||
{
|
||||
int bit;
|
||||
|
||||
if (vers == 0xffff)
|
||||
return 0;
|
||||
|
||||
for (bit = 15; bit >= 0; bit--)
|
||||
if (vers & (1 << bit))
|
||||
return bit;
|
||||
|
||||
return 0;
|
||||
int bit;
|
||||
|
||||
if (version == 0xffff)
|
||||
return 0;
|
||||
for (bit = 15; bit >= 0; bit--)
|
||||
if (version & (1<<bit))
|
||||
return bit;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
param_print(struct ata_params *parm)
|
||||
{
|
||||
printf("<%.40s/%.8s> ATA/ATAPI rev %d\n",
|
||||
parm->model, parm->revision, version(parm->versmajor));
|
||||
parm->model, parm->revision, version(parm->versmajor));
|
||||
}
|
||||
|
||||
void
|
||||
@ -131,10 +105,7 @@ info_print(int fd, int channel)
|
||||
|
||||
bzero(¶m, sizeof(struct ata_param));
|
||||
param.channel = channel;
|
||||
|
||||
if (ioctl(fd, ATAGPARM, ¶m) == -1)
|
||||
err(1, "ioctl(ATAGPARM)");
|
||||
|
||||
ioctl(fd, ATAGPARM, ¶m);
|
||||
printf("Master slot: ");
|
||||
if (param.type[0]) {
|
||||
printf("%4.4s: ", param.name[0]);
|
||||
@ -142,7 +113,6 @@ info_print(int fd, int channel)
|
||||
}
|
||||
else
|
||||
printf(" no device present\n");
|
||||
|
||||
printf("Slave slot: ");
|
||||
if (param.type[1]) {
|
||||
printf("%4.4s: ", param.name[1]);
|
||||
@ -155,39 +125,31 @@ info_print(int fd, int channel)
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int fd, unit;
|
||||
int unit;
|
||||
int fd = open("/dev/ata", O_RDWR);
|
||||
|
||||
fd = open(_PATH_ATA, O_RDWR);
|
||||
if (fd == -1)
|
||||
err(1, _PATH_ATA);
|
||||
|
||||
if (argc < 3)
|
||||
usage();
|
||||
if (fd < 0)
|
||||
errx(1, "/dev/ata not found - exiting\n");
|
||||
|
||||
if (!strcmp(argv[1], "detach")) {
|
||||
if (argc != 3)
|
||||
usage();
|
||||
unit = atoi(argv[2]);
|
||||
if (ioctl(fd, ATADETACH, &unit) == -1)
|
||||
err(1, "ioctl(ATADETACH)");
|
||||
ioctl(fd, ATADETACH, &unit);
|
||||
}
|
||||
else if (!strcmp(argv[1], "attach")) {
|
||||
if (argc != 3)
|
||||
usage();
|
||||
unit = atoi(argv[2]);
|
||||
if (ioctl(fd, ATAATTACH, &unit) == -1)
|
||||
err(1, "ioctl(ATAATTACH)");
|
||||
else
|
||||
info_print(fd, unit);
|
||||
ioctl(fd, ATAATTACH, &unit);
|
||||
info_print(fd, unit);
|
||||
}
|
||||
else if (!strcmp(argv[1], "reinit")) {
|
||||
if (argc != 3)
|
||||
usage();
|
||||
unit = atoi(argv[2]);
|
||||
if (ioctl(fd, ATAREINIT, &unit) == -1)
|
||||
err(1, "ioctl(ATAREINIT)");
|
||||
else
|
||||
info_print(fd, unit);
|
||||
ioctl(fd, ATAREINIT, &unit);
|
||||
info_print(fd, unit);
|
||||
}
|
||||
else if (!strcmp(argv[1], "mode")) {
|
||||
struct ata_modes modes;
|
||||
@ -195,25 +157,19 @@ main(int argc, char **argv)
|
||||
bzero(&modes, sizeof(struct ata_modes));
|
||||
if (argc == 3) {
|
||||
modes.channel = atoi(argv[2]);
|
||||
if (ioctl(fd, ATAGMODE, &modes) == -1)
|
||||
err(1, "ioctl(ATAGMODE)");
|
||||
else
|
||||
printf("Master = %s \nSlave = %s\n",
|
||||
mode2str(modes.mode[0]),
|
||||
mode2str(modes.mode[1]));
|
||||
ioctl(fd, ATAGMODE, &modes);
|
||||
printf("Master = %s \nSlave = %s\n",
|
||||
mode2str(modes.mode[0]),
|
||||
mode2str(modes.mode[1]));
|
||||
}
|
||||
else if (argc == 5) {
|
||||
modes.channel = atoi(argv[2]);
|
||||
modes.mode[0] = str2mode(argv[3]);
|
||||
modes.mode[1] = str2mode(argv[4]);
|
||||
if (modes.mode[0] == -1 || modes.mode[1] == -1)
|
||||
usage();
|
||||
if (ioctl(fd, ATASMODE, &modes) == -1)
|
||||
err(1, "ioctl(ATASMODE)");
|
||||
else
|
||||
printf("Master = %s \nSlave = %s\n",
|
||||
mode2str(modes.mode[0]),
|
||||
mode2str(modes.mode[1]));
|
||||
ioctl(fd, ATASMODE, &modes);
|
||||
printf("Master = %s \nSlave = %s\n",
|
||||
mode2str(modes.mode[0]),
|
||||
mode2str(modes.mode[1]));
|
||||
}
|
||||
else
|
||||
usage();
|
||||
@ -225,6 +181,4 @@ main(int argc, char **argv)
|
||||
}
|
||||
else
|
||||
usage();
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
@ -1,29 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2001 Ruslan Ermilov
|
||||
* 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$
|
||||
*/
|
||||
|
||||
#define _PATH_ATA "/dev/ata"
|
Loading…
x
Reference in New Issue
Block a user