kernel: Nuke the old (and deprecated) ata(4) driver and atacontrol(8). v3.1.0
authorSascha Wildner <saw@online.de>
Sun, 22 Jan 2012 21:16:14 +0000 (22:16 +0100)
committerSascha Wildner <saw@online.de>
Sun, 22 Jan 2012 22:04:57 +0000 (23:04 +0100)
It's been replaced by nata(4)/natacontrol(8) since more than 4 years.

35 files changed:
Makefile_upgrade.inc
sbin/Makefile
sbin/atacontrol/Makefile [deleted file]
sbin/atacontrol/atacontrol.8 [deleted file]
sbin/atacontrol/atacontrol.c [deleted file]
share/man/man4/Makefile
share/man/man4/ata.4 [deleted file]
share/man/man4/isa.4
share/man/man4/nata.4
share/man/man4/natapicam.4 [moved from share/man/man4/atapicam.4 with 84% similarity]
sys/conf/files
sys/conf/options
sys/config/GENERIC
sys/config/LINT
sys/config/LINT64
sys/config/X86_64_GENERIC
sys/dev/disk/ata/ata-all.c [deleted file]
sys/dev/disk/ata/ata-all.h [deleted file]
sys/dev/disk/ata/ata-card.c [deleted file]
sys/dev/disk/ata/ata-disk.c [deleted file]
sys/dev/disk/ata/ata-disk.h [deleted file]
sys/dev/disk/ata/ata-dma.c [deleted file]
sys/dev/disk/ata/ata-isa.c [deleted file]
sys/dev/disk/ata/ata-pci.c [deleted file]
sys/dev/disk/ata/ata-raid.c [deleted file]
sys/dev/disk/ata/ata-raid.h [deleted file]
sys/dev/disk/ata/atapi-all.c [deleted file]
sys/dev/disk/ata/atapi-all.h [deleted file]
sys/dev/disk/ata/atapi-cam.c [deleted file]
sys/dev/disk/ata/atapi-cd.c [deleted file]
sys/dev/disk/ata/atapi-cd.h [deleted file]
sys/dev/disk/ata/atapi-fd.c [deleted file]
sys/dev/disk/ata/atapi-fd.h [deleted file]
sys/dev/disk/ata/atapi-tape.c [deleted file]
sys/dev/disk/ata/atapi-tape.h [deleted file]

index 30d5a95..3e0818c 100644 (file)
@@ -1883,6 +1883,13 @@ TO_REMOVE+=/usr/share/man/man3/archive_write_set_format_shar_binary.3.gz
 TO_REMOVE+=/usr/share/man/cat3/archive_write_set_format_shar_binary.3.gz
 TO_REMOVE+=/usr/share/man/man3/archive_write_set_format_ustar.3.gz
 TO_REMOVE+=/usr/share/man/cat3/archive_write_set_format_ustar.3.gz
+TO_REMOVE+=/sbin/atacontrol
+TO_REMOVE+=/usr/share/man/cat8/atacontrol.8.gz
+TO_REMOVE+=/usr/share/man/man8/atacontrol.8.gz
+TO_REMOVE+=/usr/share/man/cat4/ata.4.gz
+TO_REMOVE+=/usr/share/man/man4/ata.4.gz
+TO_REMOVE+=/usr/share/man/cat4/atapicam.4.gz
+TO_REMOVE+=/usr/share/man/man4/atapicam.4.gz
 
 .if ${MACHINE_ARCH} == "x86_64"
 TO_REMOVE+=/usr/libdata/stallion/2681.sys
index 31f0f00..c1896fd 100644 (file)
@@ -4,7 +4,6 @@
 # XXX MISSING:         icheck ncheck
 
 SUBDIR=        adjkerntz \
-       atacontrol \
        atm \
        badsect \
        camcontrol \
diff --git a/sbin/atacontrol/Makefile b/sbin/atacontrol/Makefile
deleted file mode 100644 (file)
index 8d1f910..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#$FreeBSD: src/sbin/atacontrol/Makefile,v 1.6.2.1 2002/03/18 08:40:00 sos Exp $
-#$DragonFly: src/sbin/atacontrol/Makefile,v 1.5 2006/10/17 00:55:39 pavalos Exp $
-
-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 (file)
index 4c828f3..0000000
+++ /dev/null
@@ -1,255 +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: src/sbin/atacontrol/atacontrol.8,v 1.13.2.7 2003/01/26 03:01:09 keramida Exp $
-.\" $DragonFly: src/sbin/atacontrol/atacontrol.8,v 1.3 2004/03/11 12:28:53 hmp Exp $
-.\"
-.Dd May 17, 2001
-.Dt ATACONTROL 8
-.Os
-.Sh NAME
-.Nm atacontrol
-.Nd ATA device driver control program
-.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 rebuild
-.Ar raid
-.Nm
-.Ic status
-.Ar raid
-.Nm
-.Ic mode
-.Ar channel
-.Op Ar mastermode slavemode
-.Nm
-.Ic info
-.Ar channel
-.Nm
-.Ic cap
-.Ar channel device
-.Nm
-.Ic enclosure
-.Ar channel device
-.Nm
-.Ic list
-.Sh DESCRIPTION
-The
-.Nm
-utility is a control program that provides the user access and control to the
-.Dx
-.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 number of the ATA channel on which to operate.
-The following commands are supported:
-.Bl -tag -width "rebuild"
-.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
-or
-.Cm SPAN
-(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 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 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
-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.
-If one of the devices mode should not be changed, use a nonexisting mode
-as argument (i.e.\&
-.Dq Li XXX ) ,
-and the mode will remain unchanged.
-.Pp
-Currently supported modes are:
-.Cm BIOSDMA ,
-.Cm PIO0
-(alias
-.Cm BIOSPIO ) ,
-.Cm PIO1 , PIO2 , PIO3 , PIO4 ,
-.Cm WDMA2 ,
-.Cm UDMA2
-(alias
-.Cm UDMA33 ) ,
-.Cm UDMA4
-(alias
-.Cm UDMA66 ) ,
-.Cm UDMA5
-(alias
-.Cm UDMA100 )
-and
-.Cm UDMA6
-(alias
-.Cm UDMA133 ) .
-.It Ic info
-Show info about the attached devices on the
-.Ar channel .
-The device name and manufacture/version strings are shown.
-.It Ic cap
-Show detailed info about the device on
-.Ar channel device
-where device is 0 for master and 1 for slave.
-.It Ic enclosure
-Show detailed info about the enclosure on
-.Ar channel device
-where device is 0 for master and 1 for slave.
-Fan RPM speed, enclosure temperature, 5V and 12V levels are shown.
-.It Ic list
-Show info about all attached devices on all active controllers.
-.El
-.Sh EXAMPLES
-To see the devices' current access modes, use the command line:
-.Pp
-.Dl "atacontrol mode 0"
-.Pp
-which results in the modes of the devices being displayed as a string
-like this:
-.Bd -literal -offset indent
-Master = WDMA2
-Slave  = PIO4
-.Ed
-.Pp
-This means that ata0-master is in DMA mode,
-ata0-slave is in PIO mode,
-and so forth.
-You can set the mode with
-.Nm
-and a string like the above,
-for example:
-.Pp
-.Dl "atacontrol mode 0 PIO4 PIO4"
-.Pp
-The new modes are set as soon as the
-.Nm
-command returns.
-.Sh SEE ALSO
-.Xr ata 4
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 4.6 .
-.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 .
diff --git a/sbin/atacontrol/atacontrol.c b/sbin/atacontrol/atacontrol.c
deleted file mode 100644 (file)
index a5a925a..0000000
+++ /dev/null
@@ -1,428 +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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sbin/atacontrol/atacontrol.c,v 1.11.2.5 2002/08/21 13:18:17 sos Exp $
- * $DragonFly: src/sbin/atacontrol/atacontrol.c,v 1.4 2005/01/09 04:43:33 cpressey Exp $
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <err.h>
-#include <sys/ata.h>
-
-static const char *mode2str(int);
-static int     str2mode(char *);
-static void    usage(void);
-static int     version(int);
-static void    param_print(struct ata_params *);
-static void    cap_print(struct ata_params *);
-static int     ata_cap_print(int, int, int);
-static int     info_print(int, int, int);
-
-const char *
-mode2str(int mode)
-{
-       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_UDMA6: return "UDMA133";
-       case ATA_DMA: return "BIOSDMA";
-       default: return "???";
-       }
-}
-
-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, "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, "UDMA6")) return ATA_UDMA6;
-       if (!strcasecmp(str, "UDMA133")) return ATA_UDMA6;
-       if (!strcasecmp(str, "BIOSDMA")) return ATA_DMA;
-       return -1;
-}
-
-
-void
-usage(void)
-{
-       fprintf(stderr, "usage: atacontrol <command> channel [args]\n");
-       exit(1);
-}
-
-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;
-}
-
-void
-param_print(struct ata_params *parm)
-{
-       printf("<%.40s/%.8s> ATA/ATAPI rev %d\n",
-               parm->model, parm->revision, version(parm->version_major)); 
-}
-
-void
-cap_print(struct ata_params *parm)
-{
-       printf("\n");
-       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);    
-       
-       printf("lba%ssupported         ", parm->support_lba ? " " : " not ");
-       if (parm->lba_size)
-               printf("%d sectors\n", parm->lba_size); 
-       else
-               printf("\n");
-
-       printf("lba48%ssupported         ", parm->support.address48 ? " " : " not ");
-       if (parm->lba_size48)
-               printf("%ju sectors\n", (uintmax_t)parm->lba_size48);
-       else
-               printf("\n");
-       printf("dma%ssupported\n", parm->support_dma ? " " : " not");
-
-       printf("overlap%ssupported\n", parm->support_queueing ? " " : " not ");
-  
-       printf("\nFeature                      Support  Enable    Value   Vendor\n");
-
-       printf("write cache                    %s       %s\n",
-               parm->support.write_cache ? "yes" : "no",
-               parm->enabled.write_cache ? "yes" : "no");      
-
-       printf("read ahead                     %s       %s\n",
-               parm->support.look_ahead ? "yes" : "no",
-               parm->enabled.look_ahead ? "yes" : "no");       
-
-       printf("dma queued                     %s       %s      %d/%02X\n",
-               parm->support.queued ? "yes" : "no",
-               parm->enabled.queued ? "yes" : "no",
-               parm->queuelen, parm->queuelen);        
-
-       printf("SMART                          %s       %s\n",
-               parm->support.smart ? "yes" : "no",
-               parm->enabled.smart ? "yes" : "no");
-
-       printf("microcode download             %s       %s\n",
-               parm->support.microcode ? "yes" : "no",
-               parm->enabled.microcode ? "yes" : "no");        
-
-       printf("security                       %s       %s\n",
-               parm->support.smart ? "yes" : "no",
-               parm->enabled.smart ? "yes" : "no");    
-
-       printf("power management               %s       %s\n",
-               parm->support.power_mngt ? "yes" : "no",
-               parm->enabled.power_mngt ? "yes" : "no");       
-
-       printf("advanced power management      %s       %s      %d/%02X\n",
-               parm->support.apm ? "yes" : "no",
-               parm->enabled.apm ? "yes" : "no",
-               parm->apm_value, parm->apm_value);
-
-       printf("automatic acoustic management  %s       %s      %d/%02X %d/%02X\n",
-               parm->support.auto_acoustic ? "yes" : "no",
-               parm->enabled.auto_acoustic ? "yes" : "no",
-               parm->current_acoustic, parm->current_acoustic,
-               parm->vendor_acoustic, parm->vendor_acoustic);  
-}
-
-int
-ata_cap_print(int fd, int channel, int device)
-{
-       struct ata_cmd iocmd;
-
-       bzero(&iocmd, sizeof(struct ata_cmd));
-
-       iocmd.channel = channel;
-       iocmd.device = -1;
-       iocmd.cmd = ATAGPARM;
-
-       if (ioctl(fd, IOCATA, &iocmd) < 0)
-               return errno;
-
-       printf("ATA channel %d, %s", channel, device==0 ? "Master" : "Slave");
-
-       if (iocmd.u.param.type[device]) {
-               printf(", device %s:\n", iocmd.u.param.name[device]);
-               cap_print(&iocmd.u.param.params[device]);
-       }
-       else
-               printf(": no device present\n");
-       return 0;
-}
-
-int
-info_print(int fd, int channel, int prchan)
-{
-       struct ata_cmd iocmd;
-
-       bzero(&iocmd, sizeof(struct ata_cmd));
-       iocmd.channel = channel;
-       iocmd.device = -1;
-       iocmd.cmd = ATAGPARM;
-       if (ioctl(fd, IOCATA, &iocmd) < 0)
-               return errno;
-       if (prchan)
-               printf("ATA channel %d:\n", channel);
-       printf("%sMaster: ", prchan ? "    " : "");
-       if (iocmd.u.param.type[0]) {
-               printf("%4.4s ", iocmd.u.param.name[0]);
-               param_print(&iocmd.u.param.params[0]);
-       }
-       else
-               printf("     no device present\n");
-       printf("%sSlave:  ", prchan ? "    " : "");
-       if (iocmd.u.param.type[1]) {
-               printf("%4.4s ", iocmd.u.param.name[1]);
-               param_print(&iocmd.u.param.params[1]);
-       }
-       else
-               printf("     no device present\n");
-       return 0;
-}
-
-int
-main(int argc, char **argv)
-{
-       struct ata_cmd iocmd;
-       int fd;
-
-       if ((fd = open("/dev/ata", O_RDWR)) < 0)
-               err(1, "control device not found");
-
-       if (argc < 2)
-               usage();
-
-       bzero(&iocmd, sizeof(struct ata_cmd));
-
-       if (argc > 2 && strcmp(argv[1], "create")) {
-               int chan;
-
-               if (!strcmp(argv[1], "delete") ||
-                   !strcmp(argv[1], "status") ||
-                   !strcmp(argv[1], "rebuild")) {
-                       if (!(sscanf(argv[2], "%d", &chan) == 1 ||
-                             sscanf(argv[2], "ar%d", &chan) == 1))
-                               usage();
-               }
-               else {
-                       if (!(sscanf(argv[2], "%d", &chan) == 1 ||
-                             sscanf(argv[2], "ata%d", &chan) == 1))
-                               usage();
-               }
-               iocmd.channel = chan;
-       }
-
-       if (!strcmp(argv[1], "list") && argc == 2) {
-               int unit = 0;
-
-               while (info_print(fd, unit++, 1) != ENXIO);
-       }
-       else if (!strcmp(argv[1], "info") && argc == 3) {
-               info_print(fd, iocmd.channel, 0);
-       }
-       else if (!strcmp(argv[1], "cap") && argc == 4) {
-               ata_cap_print(fd, iocmd.channel, atoi(argv[3]));
-       }
-       else if (!strcmp(argv[1], "enclosure") && argc == 4) {
-               iocmd.device = atoi(argv[3]);
-               iocmd.cmd = ATAENCSTAT;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       err(1, "ioctl(ATAENCSTAT)");
-               printf("fan RPM: %d temp: %.1f 5V: %.2f 12V: %.2f\n",
-                       iocmd.u.enclosure.fan,
-                       (double)iocmd.u.enclosure.temp / 10,
-                       (double)iocmd.u.enclosure.v05 / 1000,
-                       (double)iocmd.u.enclosure.v12 / 1000);
-       }
-       else if (!strcmp(argv[1], "detach") && argc == 3) {
-               iocmd.cmd = ATADETACH;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       err(1, "ioctl(ATADETACH)");
-       }
-       else if (!strcmp(argv[1], "attach") && argc == 3) {
-               iocmd.cmd = ATAATTACH;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       err(1, "ioctl(ATAATTACH)");
-               info_print(fd, iocmd.channel, 0);
-       }
-       else if (!strcmp(argv[1], "reinit") && argc == 3) {
-               iocmd.cmd = ATAREINIT;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       warn("ioctl(ATAREINIT)");
-               info_print(fd, iocmd.channel, 0);
-       }
-       else if (!strcmp(argv[1], "create")) {
-               int disk, dev, offset;
-
-               iocmd.cmd = ATARAIDCREATE;
-               if (!strcmp(argv[2], "RAID0") || !strcmp(argv[2], "stripe"))
-                       iocmd.u.raid_setup.type = 1;
-               if (!strcmp(argv[2], "RAID1") || !strcmp(argv[2],"mirror"))
-                       iocmd.u.raid_setup.type = 2;
-               if (!strcmp(argv[2], "RAID0+1"))
-                       iocmd.u.raid_setup.type = 3;
-               if (!strcmp(argv[2], "SPAN") || !strcmp(argv[2], "JBOD"))
-                       iocmd.u.raid_setup.type = 4;
-               if (!iocmd.u.raid_setup.type)
-                    usage();
-               
-               if (iocmd.u.raid_setup.type & 1) {
-                       if (!sscanf(argv[3], "%d",
-                                   &iocmd.u.raid_setup.interleave) == 1)
-                               usage();
-                       offset = 4;
-               }
-               else
-                       offset = 3;
-               
-               for (disk = 0; disk < 16 && (offset + disk) < argc; disk++) {
-                       if (!(sscanf(argv[offset + disk], "%d", &dev) == 1 ||
-                             sscanf(argv[offset + disk], "ad%d", &dev) == 1))
-                               usage();
-                       iocmd.u.raid_setup.disks[disk] = dev;
-               }
-               iocmd.u.raid_setup.total_disks = disk;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       err(1, "ioctl(ATARAIDCREATE)");
-               else
-                       printf("ar%d created\n", iocmd.u.raid_setup.unit);
-       }
-       else if (!strcmp(argv[1], "delete") && argc == 3) {
-               iocmd.cmd = ATARAIDDELETE;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       warn("ioctl(ATARAIDDELETE)");
-       }
-       else if (!strcmp(argv[1], "rebuild") && argc == 3) {
-               iocmd.cmd = ATARAIDREBUILD;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       warn("ioctl(ATARAIDREBUILD)");
-       }
-       else if (!strcmp(argv[1], "status") && argc == 3) {
-               int i;
-
-               iocmd.cmd = ATARAIDSTATUS;
-               if (ioctl(fd, IOCATA, &iocmd) < 0)
-                       err(1, "ioctl(ATARAIDSTATUS)");
-               printf("ar%d: ATA ", iocmd.channel);
-               switch (iocmd.u.raid_status.type) {
-               case AR_RAID0:
-                       printf("RAID0");
-                       break;
-               case AR_RAID1:
-                       printf("RAID1");
-                       break;
-               case AR_RAID0 | AR_RAID1:
-                       printf("RAID0+1");
-                       break;
-               case AR_SPAN:
-                       printf("SPAN");
-                       break;
-               }
-               printf(" subdisks: ");
-               for (i = 0; i < iocmd.u.raid_status.total_disks; i++) {
-                       if (iocmd.u.raid_status.disks[i] >= 0)
-                               printf("ad%d ", iocmd.u.raid_status.disks[i]);
-                       else
-                               printf("DOWN ");
-               }
-               printf("status: ");
-               switch (iocmd.u.raid_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",
-                               iocmd.u.raid_status.progress);
-                       break;
-               default:
-                       printf("BROKEN\n");
-               }
-       }
-       else if (!strcmp(argv[1], "mode") && (argc == 3 || argc == 5)) {
-               if (argc == 5) {
-                       iocmd.cmd = ATASMODE;
-                       iocmd.device = -1;
-                       iocmd.u.mode.mode[0] = str2mode(argv[3]);
-                       iocmd.u.mode.mode[1] = str2mode(argv[4]);
-                       if (ioctl(fd, IOCATA, &iocmd) < 0)
-                               warn("ioctl(ATASMODE)");
-               }
-               if (argc == 3 || argc == 5) {
-                       iocmd.cmd = ATAGMODE;
-                       iocmd.device = -1;
-                       if (ioctl(fd, IOCATA, &iocmd) < 0)
-                               err(1, "ioctl(ATAGMODE)");
-                       printf("Master = %s \nSlave  = %s\n",
-                               mode2str(iocmd.u.mode.mode[0]), 
-                               mode2str(iocmd.u.mode.mode[1]));
-               }
-       }
-       else
-               usage();
-       exit(0);
-}
index 50dd4e6..b984874 100644 (file)
@@ -33,8 +33,6 @@ MAN=  aac.4 \
        aps.4 \
        arcmsr.4 \
        arp.4 \
-       ata.4 \
-       atapicam.4 \
        ath.4 \
        ath_hal.4 \
        atkbd.4 \
@@ -166,6 +164,7 @@ MAN=        aac.4 \
        mxge.4 \
        my.4 \
        nata.4 \
+       natapicam.4 \
        nataraid.4 \
        natm.4 \
        ncr.4 \
diff --git a/share/man/man4/ata.4 b/share/man/man4/ata.4
deleted file mode 100644 (file)
index 414f9ce..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-.\"
-.\" Copyright (c) 2000,2004 Jeroen Ruigrok van der Werven
-.\" Copyright (c) 2000,2001,2002 Søren Schmidt
-.\" 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: src/share/man/man4/ata.4,v 1.3.2.18 2002/10/16 13:40:51 fjoe Exp $
-.\" $DragonFly: src/share/man/man4/ata.4,v 1.9 2008/07/08 14:12:45 thomas Exp $
-.\"
-.Dd June 15, 2007
-.Dt ATA 4
-.Os
-.Sh NAME
-.Nm ata
-.Nd deprecated (S)ATA/ATAPI disk controller driver
-.Sh SYNOPSIS
-For ISA based ATA/ATAPI support:
-.Cd device isa
-.Cd device ata0 at isa? port IO_WD1 irq 14
-.Cd device ata1 at isa? port IO_WD2 irq 15
-.Pp
-For PCI based (S)ATA/ATAPI support:
-.Cd device pci
-.Cd device ata
-.Pp
-To support (S)ATA compliant disk drives:
-.Cd device atadisk
-.Pp
-To support ATAPI CD-ROM, CDR, CDRW, DVD-ROM and DVD-RAM drives:
-.Cd device atapicd
-.Pp
-To support ATAPI floppy drives,
-such as the ZIP and LS120:
-.Cd device atapifd
-.Pp
-To support ATAPI tape drives:
-.Cd device atapist
-.Pp
-The following tunables are settable from the loader:
-.Bl -ohang
-.It Va hw.ata.ata_dma
-set to 1 for DMA access, 0 for PIO (default is DMA).
-.It Va hw.ata.atapi_dma
-set to 1 for DMA access, 0 for PIO (default is PIO).
-.It Va hw.ata.wc
-set to 1 to enable Write Caching, 0 to disable (default is enabled).
-(WARNING: might cause data loss on power failures.)
-.It Va hw.ata.tags
-set to 1 to enable Tagged Queuing support, 0 to disable (default is disabled).
-(Only IBM DPTA, DTLA, ICxxxxxxAT, ICxxxxxxAV drives support that.)
-.El
-.Sh DESCRIPTION
-The
-.Nm
-driver is the deprecated
-.Fx 4.8
-ATA driver.
-.Dx Ap s
-default ATA driver is
-.Xr nata 4
-which was ported from newer
-.Fx
-code.
-.Pp
-This driver provides access to disk drives, ATAPI CD-ROM and DVD drives,
-ZIP drives and tape streamers connected to controllers
-according to the ATA and ATAPI standards.
-These devices are also commonly known as IDE or EIDE devices.
-.Pp
-The currently supported ATA controllers with their maximum speed include:
-.Pp
-.Bl -tag -width "Promise Ultra/Fasttrak-100 TX2/TX2000" -compact
-.It Acerlabs Aladdin
-Ultra DMA 100 (UDMA5), 100 MB/sec (depending on model, max stated at boot)
-.It AMD 756
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It AMD 766
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It AMD 768
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It AMD 8111
-Ultra DMA 133 (UDMA6), 133 MB/sec
-.It Cenatek Rocket Drive
-Ultra DMA 133 (UDMA6), 133 MB/sec
-.It CMD 646
-DMA 2 (WDMA2), 16 MB/sec
-.It CMD 648
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It CMD 649
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It Cypress 82C693
-DMA 2 (WDMA2), 16 MB/sec
-.It Cyrix 5530
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It HighPoint HPT366
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It HighPoint HPT370
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It HighPoint HPT372/HPT374
-Ultra DMA 133 (UDMA6), 133 MB/sec
-.It Intel PIIX/PIIX3
-DMA 2 (WDMA2), 16 MB/sec
-.It Intel PIIX4
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It Intel ICH0
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It Intel ICH
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It Intel ICH2/ICH3/ICH4/ICH5
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It Intel ICH6R/RW
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It NVIDIA nForce ATA100
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It NVIDIA nForce2/nForce3 ATA133
-Ultra DMA 133 (UDMA6), 133 MB/sec
-.It Promise Ultra/Fasttrak-33
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It Promise Ultra/Fasttrak-66
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It Promise Ultra/Fasttrak-100 (TX2/TX4)
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It Promise Ultra/Fasttrak-133 TX2/TX2000
-Ultra DMA 133 (UDMA6), 133 MB/sec
-.It ServerWorks ROSB4
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It ServerWorks CSB5
-Ultra DMA 100 (UDMA5), 100 MB/sec (depending on model, max stated at boot)
-.It SiI 0680
-Ultra DMA 133 (UDMA6), 133 MB/sec (depending on model, max stated at boot)
-.It SiS 5591
-Ultra DMA 133 (UDMA5), 133 MB/sec (depending on model, max stated at boot)
-.It VIA 82C586
-Ultra DMA 33 (UDMA2), 33 MB/sec
-.It VIA 82C596
-Ultra DMA 66 (UDMA4), 66 MB/sec (depending on model, max stated at boot)
-.It VIA 82C686a
-Ultra DMA 66 (UDMA4), 66 MB/sec
-.It VIA 82C686b
-Ultra DMA 100 (UDMA5), 100 MB/sec
-.It VIA 8233/8235/8237
-Ultra DMA 133 (UDMA6), 133 MB/sec (depending on model, max stated at boot)
-.El
-.Pp
-The currently supported SATA controllers with their maximum speed include:
-.Pp
-.Bl -tag -width "SiI 3112/3114/3124/3512" -compact
-.It Intel ICH5
-Serial ATA 150, 150 MB/sec
-.It Intel ICH6(R)/(R)W
-Serial ATA 150, 150 MB/sec
-.It SiI 3112/3114/3124/3512
-Serial ATA 150, 150 MB/sec
-.It VIA 8237
-Serial ATA 150, 150 MB/sec
-.El
-.Pp
-All unknown chipsets are supported at the maximum speed of 16 MB/sec.
-.Pp
-The
-.Nm
-driver also allows for changes to the transfer mode of the devices
-at a later time when the system is up and running, see
-.Xr atacontrol 8 .
-.Pp
-The driver attempts to set the maximum performance transfer mode on your disk
-drives by selecting the highest possible DMA mode. However the
-.Nm
-driver sometimes issue the message
-"DMA limited to UDMA33, non-ATA66 cable or device",
-if the cable is ATA66 (or above) compliant, it is because the other device
-on this channel states it can only accept up to UDMA2/ATA33 signals.
-ATAPI devices are left in PIO mode because DMA problems are common despite the
-device specifications.
-You can always try to set DMA mode on an ATAPI device using
-.Xr atacontrol 8 ,
-but be aware that your hardware might
-.Em not
-support it and can
-.Em hang
-the system.
-.Sh FILES
-.Bl -tag -width "/dev/acd* " -compact
-.It Pa /dev/ad*
-ATA disk device nodes
-.It Pa /dev/acd*
-ATAPI CD-ROM device nodes
-.It Pa /dev/afd*
-ATAPI floppy drive device nodes
-.It Pa /dev/ast*
-ATAPI tape drive device nodes
-.El
-.Sh NOTES
-Static numbering
-(enabled with the
-.Dv ATA_STATIC_ID
-kernel option)
-reserves a number for each possibly connected disk,
-even when not present.
-This may result in odd situations where,
-for example,
-ad0 and ad2 exist in the absence of ad1.
-The advantage is that the addition of the formerly absent drive
-does not cause the numbers of the other drives to change.
-.Pp
-The
-.Nm
-driver does not support MFM/RLL/ESDI (ST-506) style disks.
-.Pp
-Remember that in order to use UDMA4 (and above) mode you
-.Em have
-to use a special 80 conductor cable,
-and the driver tries to determine if you have such a cable
-attached before setting UDMA4 mode.
-.Pp
-The use of UDMA4(66MHz) and higher together with non-UDMA4 devices on
-the same ATA channel is not recommended,
-unless they are run at the non-UDMA4 device's lower speed.
-The driver has been designed to handle that kind of setup but lots of
-older devices do not like this.
-.Sh SEE ALSO
-.Xr nata 4 ,
-.Xr atacontrol 8 ,
-.Xr burncd 8
-.Sh HISTORY
-The
-.Nm
-driver first appeared in
-.Fx 4.0 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-driver was written by
-.An S\(/oren Schmidt
-.Aq sos@FreeBSD.org .
-.Pp
-This manual page was written by
-.An Jeroen Ruigrok van der Werven
-.Aq asmodai@FreeBSD.org
-and
-.An S\(/oren Schmidt
-.Aq sos@FreeBSD.org .
index 895f150..9a72df0 100644 (file)
@@ -73,8 +73,6 @@ Future Domain based SCSI controller driver
 PC architecture floppy disk controller driver
 .It Xr nata 4
 Generic ATA/ATAPI disk controller driver
-.It Xr ata 4
-Generic ATA/ATAPI disk controller driver (deprecated)
 .El
 .Ss Serial and parallel interfaces
 .Bl -tag -width 12n -offset indent -compact
index 9ea605e..09ba814 100644 (file)
@@ -26,7 +26,6 @@
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man4/ata.4,v 1.72 2007/03/10 12:44:22 brueffer Exp $
-.\" $DragonFly: src/share/man/man4/nata.4,v 1.4 2008/01/01 12:16:40 swildner Exp $
 .\"
 .Dd January 1, 2008
 .Dt NATA 4
@@ -81,15 +80,6 @@ driver provides access to ATA (IDE) and SerialATA disk drives,
 ATAPI CDROM/DVD drives, ZIP/LS120 ATAPI drives and ATAPI tape drives
 connected to controllers according to the ATA/ATAPI standards.
 .Pp
-.Nm Nata
-is the default ATA driver of
-.Dx .
-The old
-.Fx 4.8
-driver is still available, but deprecated.
-For more information, see
-.Xr ata 4 .
-.Pp
 The currently supported ATA/SATA controller chips are:
 .Pp
 .Bl -tag -width "Silicon Image:" -compact
@@ -207,7 +197,7 @@ as the same numbered device, and not depend on attach order.
 Native Command Queuing (NCQ) on SATA drives is not yet supported.
 .Sh SEE ALSO
 .Xr ahci 4 ,
-.Xr ata 4 ,
+.Xr natapicam 4 ,
 .Xr nataraid 4 ,
 .Xr sili 4 ,
 .Xr burncd 8 ,
similarity index 84%
rename from share/man/man4/atapicam.4
rename to share/man/man4/natapicam.4
index 22f1f01..099a0a9 100644 (file)
@@ -1,4 +1,4 @@
-.\" Copyright (c) 2002
+.\" Copyright (c) 2002, 2004
 .\"    Thomas Quinot <thomas@FreeBSD.org>. All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
@@ -16,7 +16,7 @@
 .\" 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 THE VOICES IN HIS HEAD
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL 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
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 .\" THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\"    $FreeBSD: src/share/man/man4/atapicam.4,v 1.2.2.2 2003/03/03 18:51:16 trhodes Exp $
-.\"    $DragonFly: src/share/man/man4/atapicam.4,v 1.3 2008/09/06 10:36:27 thomas Exp $
+.\" $FreeBSD: src/share/man/man4/atapicam.4,v 1.8 2009/10/29 15:59:27 brueffer Exp $
 .\"
-.Dd October 23, 2002
-.Dt ATAPICAM 4
+.Dd January 22, 2012
+.Dt NATAPICAM 4
 .Os
 .Sh NAME
-.Nm atapicam
+.Nm natapicam
 .Nd CAM XPT (transport) module for ATAPI devices
 .Sh SYNOPSIS
-.Cd "device atapicam"
+To compile this driver into the kernel,
+place the following lines in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device scbus"
+.Cd "device nata"
+.Cd "device natapicam"
+.Ed
+.Pp
+Alternatively, to load the driver as a
+module at boot time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+natapicam_load="YES"
+.Ed
 .Sh DESCRIPTION
 The ATAPI/CAM module allows ATAPI devices (CD-ROM, CD-RW, DVD drives,
 floppy drives such as Iomega Zip, tape drives) to be accessed through
@@ -43,8 +56,6 @@ the SCSI subsystem,
 .Xr cam 4 .
 .Pp
 .Xr nata 4
-or
-.Xr ata 4
 and
 .Xr scbus 4
 must be configured in the kernel as well.
@@ -78,7 +89,8 @@ extended
 information.
 .Sh EXAMPLES
 .Bd -literal -offset indent
-device atapicam
+device nata
+device natapicam
 device scbus
 device cd
 device pass
@@ -92,17 +104,15 @@ driver to the kernel.
 .Pp
 Print the list of all devices available through CAM.
 .Pp
-.Dl "mount -t cd9660 /dev/cd0c /mnt"
+.Dl "mount -t cd9660 /dev/cd0 /mnt"
 .Pp
 Mount a CD-ROM from an ATAPI CD-ROM drive
 (the command above assumes that the ATAPI drive is the only CD-ROM unit).
 .Sh SEE ALSO
-.Xr ata 4 ,
 .Xr cam 4 ,
 .Xr nata 4 ,
 .Xr scsi 4 ,
-.Xr atacontrol 8 ,
-.Xr camcontrol 8
+.Xr camcontrol 8 ,
 .Xr natacontrol 8
 .Sh HISTORY
 The ATAPI/CAM driver first appeared in
index a26134c..80b9572 100644 (file)
@@ -142,21 +142,6 @@ dev/netif/an/if_an_pccard.c                optional an pccard
 dev/netif/ar/if_ar.c                   optional ar
 dev/netif/ar/if_ar_pci.c               optional ar pci
 dev/raid/asr/asr.c                     optional asr pci
-dev/disk/ata/ata-all.c                 optional ata
-dev/disk/ata/ata-isa.c                 optional ata isa
-dev/disk/ata/ata-card.c                        optional ata pccard
-dev/disk/ata/ata-pci.c                 optional ata pci
-dev/disk/ata/ata-dma.c                 optional ata pci
-dev/disk/ata/ata-disk.c                        optional atadisk
-dev/disk/ata/ata-raid.c                        optional atadisk
-dev/disk/ata/atapi-all.c               optional atapicd
-dev/disk/ata/atapi-all.c               optional atapifd
-dev/disk/ata/atapi-all.c               optional atapist
-dev/disk/ata/atapi-all.c               optional atapicam
-dev/disk/ata/atapi-cd.c                        optional atapicd
-dev/disk/ata/atapi-fd.c                        optional atapifd
-dev/disk/ata/atapi-tape.c              optional atapist
-dev/disk/ata/atapi-cam.c               optional atapicam
 dev/disk/ahci/ahci.c                   optional ahci
 dev/disk/ahci/ahci_dragonfly.c         optional ahci
 dev/disk/ahci/ahci_attach.c            optional ahci
index 00af819..0450fc2 100644 (file)
@@ -253,7 +253,7 @@ SCSI_NCR_MYADDR             opt_ncr.h
 # Options used only in pci/isp_pci.c
 ISP_TARGET_MODE                opt_isp.h
 
-# Options used in the 'ata' ATA/ATAPI driver
+# Options used in the 'nata' ATA/ATAPI driver
 ATA_STATIC_ID          opt_ata.h
 
 # Net stuff.
index 694d530..8784975 100644 (file)
@@ -109,17 +109,6 @@ device             nataraid                # support for ATA software RAID
 device         natausb                 # ATA-over-USB support
 options        ATA_STATIC_ID           # Static device numbering
 
-# LEGACY ATA and ATAPI devices
-#device                ata0    at isa? port IO_WD1 irq 14
-#device                ata1    at isa? port IO_WD2 irq 15
-#device                ata
-#device                atadisk                 # ATA disk drives
-#device                atapicd                 # ATAPI CDROM drives
-#device                atapifd                 # ATAPI floppy drives
-#device                atapist                 # ATAPI tape drives
-#device                atapicam                # Emulate ATAPI devices as SCSI via CAM
-#options       ATA_STATIC_ID           #Static device numbering
-
 # SCSI Controllers
 device         ahc             # AHA2940 and onboard AIC7xxx devices
 device         ahd             # AHA39320/29320 and onboard AIC79xx devices
index 3e3e57e..d219437 100644 (file)
@@ -1253,17 +1253,6 @@ device           pst
 #
 device ips
 
-#
-# The 'ATA' driver supports all ATA and ATAPI devices.
-# You only need one "device ata" for it to find all
-# PCI ATA/ATAPI devices on modern machines.
-#device                ata
-#device                atadisk         # ATA disk drives
-#device                atapicd         # ATAPI CDROM drives
-#device                atapifd         # ATAPI floppy drives
-#device                atapist         # ATAPI tape drives
-#device                atapicam        # emulate ATAPI devices as SCSI ditto via CAM
-                               # needs CAM to be present (scbus & pass)
 # AHCI driver, this will override NATA for AHCI devices,
 # both drivers may be included.
 #
@@ -1273,9 +1262,10 @@ device           ahci
 #
 device         sili
 
-# The 'NATA' set of drivers are set to replace the previous ATA drivers,
-# and this set of drivers is mutually exclusive with the old ones. This means,
-# you can't have both at the same time!
+# The 'NATA' driver supports all ATA and ATAPI devices.
+# You only need one "device nata" for it to find all
+# PCI ATA/ATAPI devices on modern machines.
+#
 device         nata
 device         natadisk        # ATA disk drives
 device         natapicd        # ATAPI CD/DVD drives
@@ -1285,16 +1275,16 @@ device          natapicam       # ATAPI CAM layer emulation
 device         nataraid        # support for ATA software RAID controllers
 device         natausb         # ATA-over-USB support
 
-#The following options are valid on the ATA & NATA drivers:
+# The following options are valid for the NATA driver:
 #
 # ATA_STATIC_ID:       controller numbering is static (like the old driver)
 #                      else the device numbers are dynamically allocated.
 options        ATA_STATIC_ID
 
-#
 # For older non-PCI systems, these are the lines to use:
-#device                ata0    at isa? port IO_WD1 irq 14
-#device                ata1    at isa? port IO_WD2 irq 15
+#
+#device                nata0   at isa? port IO_WD1 irq 14
+#device                nata1   at isa? port IO_WD2 irq 15
 
 #
 # Standard floppy disk controllers: `fdc' and `fd'
index bebb73d..41808e5 100644 (file)
@@ -1076,17 +1076,6 @@ device           tws             # 3ware 9750 series SATA/SAS RAID
 #
 device ips
 
-#
-# The 'ATA' driver supports all ATA and ATAPI devices.
-# You only need one "device ata" for it to find all
-# PCI ATA/ATAPI devices on modern machines.
-#device                ata
-#device                atadisk         # ATA disk drives
-#device                atapicd         # ATAPI CDROM drives
-#device                atapifd         # ATAPI floppy drives
-#device                atapist         # ATAPI tape drives
-#device                atapicam        # emulate ATAPI devices as SCSI ditto via CAM
-                               # needs CAM to be present (scbus & pass)
 # AHCI driver, this will override NATA for AHCI devices,
 # both drivers may be included.
 #
@@ -1096,9 +1085,10 @@ device           ahci
 #
 device         sili
 
-# The 'NATA' set of drivers are set to replace the previous ATA drivers,
-# and this set of drivers is mutually exclusive with the old ones. This means,
-# you can't have both at the same time!
+# The 'NATA' driver supports all ATA and ATAPI devices.
+# You only need one "device nata" for it to find all
+# PCI ATA/ATAPI devices on modern machines.
+#
 device         nata
 device         natadisk        # ATA disk drives
 device         natapicd        # ATAPI CD/DVD drives
@@ -1108,16 +1098,16 @@ device          natapicam       # ATAPI CAM layer emulation
 device         nataraid        # support for ATA software RAID controllers
 device         natausb         # ATA-over-USB support
 
-#The following options are valid on the ATA & NATA drivers:
+# The following options are valid for the NATA driver:
 #
 # ATA_STATIC_ID:       controller numbering is static (like the old driver)
 #                      else the device numbers are dynamically allocated.
 options        ATA_STATIC_ID
 
-#
 # For older non-PCI systems, these are the lines to use:
-#device                ata0    at isa? port IO_WD1 irq 14
-#device                ata1    at isa? port IO_WD2 irq 15
+#
+#device                nata0   at isa? port IO_WD1 irq 14
+#device                nata1   at isa? port IO_WD2 irq 15
 
 #
 # Standard floppy disk controllers: `fdc' and `fd'
index a67b1ed..d4a9c9a 100644 (file)
@@ -95,17 +95,6 @@ device               nataraid                # support for ATA software RAID
 device         natausb                 # ATA-over-USB support
 options        ATA_STATIC_ID           # Static device numbering
 
-# LEGACY ATA and ATAPI devices
-#device                ata0    at isa? port IO_WD1 irq 14
-#device                ata1    at isa? port IO_WD2 irq 15
-#device                ata
-#device                atadisk                 # ATA disk drives
-#device                atapicd                 # ATAPI CDROM drives
-#device                atapifd                 # ATAPI floppy drives
-#device                atapist                 # ATAPI tape drives
-#device                atapicam                # Emulate ATAPI devices as SCSI via CAM
-#options       ATA_STATIC_ID           #Static device numbering
-
 # SCSI Controllers
 device         ahc             # AHA2940 and onboard AIC7xxx devices
 device         ahd             # AHA39320/29320 and onboard AIC79xx devices
diff --git a/sys/dev/disk/ata/ata-all.c b/sys/dev/disk/ata/ata-all.c
deleted file mode 100644 (file)
index b48c223..0000000
+++ /dev/null
@@ -1,1599 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-all.c,v 1.50.2.45 2003/03/12 14:47:12 sos Exp $
- */
-
-#include "opt_ata.h"
-#include "use_atadisk.h"
-#include "use_atapicd.h"
-#include "use_atapifd.h"
-#include "use_atapist.h"
-#include "use_atapicam.h"
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/ata.h>
-#include <sys/kernel.h>
-#include <sys/conf.h>
-#include <sys/disk.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/buf.h>
-#include <sys/malloc.h>
-#include <sys/devicestat.h>
-#include <sys/sysctl.h>
-#include <sys/thread2.h>
-#include <sys/rman.h>
-
-#include <machine/stdarg.h>
-#include <machine/clock.h>
-
-#include "ata-all.h"
-#include "ata-disk.h"
-#include "ata-raid.h"
-#include "atapi-all.h"
-
-union ata_request {
-       struct ad_request       ad;
-       struct atapi_request    atapi;
-};
-
-/* device structures */
-static d_ioctl_t       ataioctl;
-static struct dev_ops ata_ops = {  
-       { "ata", 159, 0 },
-       .d_open =       nullopen,
-       .d_close =      nullclose,
-       .d_ioctl =      ataioctl,
-};
-
-/* prototypes */
-#if 0
-static void ata_boot_attach(void);
-#endif
-static void ata_intr(void *);
-static int ata_getparam(struct ata_device *, u_int8_t);
-static int ata_service(struct ata_channel *);
-static void bswap(int8_t *, int);
-static void btrim(int8_t *, int);
-static void bpack(int8_t *, int8_t *, int);
-static void ata_change_mode(struct ata_device *, int);
-static u_int8_t ata_enclosure_sensor(struct ata_device *, int, u_int8_t, u_int8_t);
-static int ata_enclosure_status(struct ata_device *, int *, int *, int *, int *);
-
-/* sysctl vars */
-SYSCTL_NODE(_hw, OID_AUTO, ata, CTLFLAG_RD, 0, "ATA driver parameters");
-
-int ata_mpipe_size = 4;
-TUNABLE_INT("hw.ata.mpipe_size", &ata_mpipe_size);
-SYSCTL_INT(_hw_ata, OID_AUTO, mpipe_size, CTLFLAG_RW, &ata_mpipe_size, 0,
-           "ATA global I/O pipeline max size");
-
-
-/* global vars */
-devclass_t ata_devclass;
-
-/* local vars */
-static MALLOC_DEFINE(M_ATA, "ATA generic", "ATA driver generic layer");
-
-/* misc defines */
-#define DEV_ATAPIALL   NATAPICD > 0 || NATAPIFD > 0 || \
-                       NATAPIST > 0 || NATAPICAM > 0
-
-int
-ata_probe(device_t dev)
-{
-    struct ata_channel *ch;
-    int rid;
-
-    if (!dev || !(ch = device_get_softc(dev)))
-       return ENXIO;
-
-    if (ch->r_io || ch->r_altio || ch->r_irq)
-       return EEXIST;
-
-    /* initialize the softc basics */
-    ch->active = ATA_IDLE;
-    ch->dev = dev;
-
-    rid = ATA_IOADDR_RID;
-    ch->r_io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 
-                                 ATA_IOSIZE, RF_ACTIVE);
-    if (!ch->r_io)
-       goto failure;
-
-    rid = ATA_ALTADDR_RID;
-    ch->r_altio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
-                                    ATA_ALTIOSIZE, RF_ACTIVE);
-    if (!ch->r_altio)
-       goto failure;
-
-    rid = ATA_BMADDR_RID;
-    ch->r_bmio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
-                                   ATA_BMIOSIZE, RF_ACTIVE);
-    if (bootverbose)
-       ata_printf(ch, -1, "iobase=0x%04x altiobase=0x%04x bmaddr=0x%04x\n", 
-                  (int)rman_get_start(ch->r_io),
-                  (int)rman_get_start(ch->r_altio),
-                  (ch->r_bmio) ? (int)rman_get_start(ch->r_bmio) : 0);
-
-    ata_reset(ch);
-
-    ch->device[MASTER].channel = ch;
-    ch->device[MASTER].unit = ATA_MASTER;
-    ch->device[MASTER].mode = ATA_PIO;
-    ch->device[SLAVE].channel = ch;
-    ch->device[SLAVE].unit = ATA_SLAVE;
-    ch->device[SLAVE].mode = ATA_PIO;
-    TAILQ_INIT(&ch->ata_queue);
-    TAILQ_INIT(&ch->atapi_queue);
-
-    mpipe_init(&ch->req_mpipe, M_ATA, sizeof(union ata_request), 
-               4, ata_mpipe_size, 0, NULL, NULL, NULL);
-    mpipe_init(&ch->dma_mpipe, M_DEVBUF, PAGE_SIZE, 
-               4, ata_mpipe_size, MPF_NOZERO, NULL, NULL, NULL);
-
-    return 0;
-    
-failure:
-    if (ch->r_io)
-       bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ch->r_io);
-    if (ch->r_altio)
-       bus_release_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID, ch->r_altio);
-    if (ch->r_bmio)
-       bus_release_resource(dev, SYS_RES_IOPORT, ATA_BMADDR_RID, ch->r_bmio);
-    if (bootverbose)
-       ata_printf(ch, -1, "probe allocation failed\n");
-    return ENXIO;
-}
-
-int
-ata_attach(device_t dev)
-{
-    struct ata_channel *ch;
-    int error, rid;
-
-    if (!dev || !(ch = device_get_softc(dev)))
-       return ENXIO;
-
-    rid = ATA_IRQ_RID;
-    ch->r_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
-                                  RF_SHAREABLE | RF_ACTIVE);
-    if (!ch->r_irq) {
-       ata_printf(ch, -1, "unable to allocate interrupt\n");
-       return ENXIO;
-    }
-
-    /*
-     * Traditional ata registers are sensitive to when they can be accessed
-     * in the face of e.g. ongoing DMA.  Do not allow the interrupt to be
-     * polled.
-     */
-    if ((error = bus_setup_intr(dev, ch->r_irq, INTR_NOPOLL,
-                               ata_intr, ch, &ch->ih, NULL))) {
-       ata_printf(ch, -1, "unable to setup interrupt\n");
-       return error;
-    }
-
-    /*
-     * do not attach devices if we are in early boot, this is done later 
-     * when interrupts are enabled by a hook into the boot process.
-     * otherwise attach what the probe has found in ch->devices.
-     */
-    crit_enter();
-
-    if (ch->devices & ATA_ATA_SLAVE)
-       if (ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY))
-           ch->devices &= ~ATA_ATA_SLAVE;
-    if (ch->devices & ATA_ATAPI_SLAVE)
-       if (ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY))
-           ch->devices &= ~ATA_ATAPI_SLAVE;
-    if (ch->devices & ATA_ATA_MASTER)
-       if (ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY))
-           ch->devices &= ~ATA_ATA_MASTER;
-    if (ch->devices & ATA_ATAPI_MASTER)
-       if (ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY))
-           ch->devices &= ~ATA_ATAPI_MASTER;
-#if NATADISK > 0
-    if (ch->devices & ATA_ATA_MASTER)
-       ad_attach(&ch->device[MASTER], 0);
-    if (ch->devices & ATA_ATA_SLAVE)
-       ad_attach(&ch->device[SLAVE], 0);
-#endif
-#if DEV_ATAPIALL
-    if (ch->devices & ATA_ATAPI_MASTER)
-       atapi_attach(&ch->device[MASTER], 0);
-    if (ch->devices & ATA_ATAPI_SLAVE)
-       atapi_attach(&ch->device[SLAVE], 0);
-#endif
-#if NATAPICAM > 0
-    atapi_cam_attach_bus(ch);
-#endif
-    crit_exit();
-    return 0;
-}
-
-int
-ata_detach(device_t dev)
-{
-    struct ata_channel *ch;
-    if (!dev || !(ch = device_get_softc(dev)) ||
-       !ch->r_io || !ch->r_altio || !ch->r_irq)
-       return ENXIO;
-
-    /* make sure channel is not busy */
-    crit_enter();
-    ATA_SLEEPLOCK_CH(ch, ATA_CONTROL);
-#if NATADISK > 0
-    if (ch->devices & ATA_ATA_MASTER && ch->device[MASTER].driver)
-       ad_detach(&ch->device[MASTER], 1);
-    if (ch->devices & ATA_ATA_SLAVE && ch->device[SLAVE].driver)
-       ad_detach(&ch->device[SLAVE], 1);
-#endif
-#if DEV_ATAPIALL
-    if (ch->devices & ATA_ATAPI_MASTER && ch->device[MASTER].driver)
-       atapi_detach(&ch->device[MASTER]);
-    if (ch->devices & ATA_ATAPI_SLAVE && ch->device[SLAVE].driver)
-       atapi_detach(&ch->device[SLAVE]);
-#endif
-#if NATAPICAM > 0
-    atapi_cam_detach_bus(ch);
-#endif
-    crit_exit();
-
-    if (ch->device[MASTER].param) {
-       kfree(ch->device[MASTER].param, M_ATA);
-       ch->device[MASTER].param = NULL;
-    }
-    if (ch->device[SLAVE].param) {
-       kfree(ch->device[SLAVE].param, M_ATA);
-       ch->device[SLAVE].param = NULL;
-    }
-    ch->device[MASTER].driver = NULL;
-    ch->device[SLAVE].driver = NULL;
-    ch->device[MASTER].mode = ATA_PIO;
-    ch->device[SLAVE].mode = ATA_PIO;
-    ch->devices = 0;
-    ata_dmafreetags(ch);
-
-    bus_teardown_intr(dev, ch->r_irq, ch->ih);
-    bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq);
-    if (ch->r_bmio)
-       bus_release_resource(dev, SYS_RES_IOPORT, ATA_BMADDR_RID, ch->r_bmio);
-    bus_release_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID, ch->r_altio);
-    bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ch->r_io);
-    ch->r_io = NULL;
-    ch->r_altio = NULL;
-    ch->r_bmio = NULL;
-    ch->r_irq = NULL;
-    mpipe_done(&ch->req_mpipe);
-    mpipe_done(&ch->dma_mpipe);
-
-    ATA_UNLOCK_CH(ch);
-    return 0;
-}
-
-int
-ata_suspend(device_t dev)
-{
-    struct ata_channel *ch;
-
-    if (dev == NULL || (ch = device_get_softc(dev)) == NULL)
-       return ENXIO;
-
-    /* wait for the channel to be IDLE or detached before suspending */
-    while (ch->r_irq) {
-       crit_enter();
-       if (ch->active == ATA_IDLE) {
-           ch->active = ATA_CONTROL;
-           crit_exit();
-           break;
-       }
-       crit_exit();
-       tsleep(ch, 0, "atasusp", hz / 10);
-    }
-    return 0;
-}
-
-int
-ata_resume(device_t dev)
-{
-    return ata_reinit(device_get_softc(dev));
-}
-
-static int
-ataioctl(struct dev_ioctl_args *ap)
-{
-    struct ata_cmd *iocmd = (struct ata_cmd *)ap->a_data;
-    struct ata_channel *ch;
-    device_t device = devclass_get_device(ata_devclass, iocmd->channel);
-    int error;
-
-    if (ap->a_cmd != IOCATA)
-       return ENOTTY;
-    
-    if (iocmd->channel < -1 || iocmd->device < -1 || iocmd->device > SLAVE)
-       return ENXIO;
-
-    switch (iocmd->cmd) {
-       case ATAATTACH:
-           /* should enable channel HW on controller that can SOS XXX */   
-           error = ata_probe(device);
-           if (!error)
-               error = ata_attach(device);
-           return error;
-
-       case ATADETACH:
-           error = ata_detach(device);
-           /* should disable channel HW on controller that can SOS XXX */   
-           return error;
-
-       case ATAREINIT:
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-           crit_enter();       /* interlock non-atomic channel lock */
-           ATA_SLEEPLOCK_CH(ch, ATA_ACTIVE);
-           if ((error = ata_reinit(ch)))
-               ATA_UNLOCK_CH(ch);
-           crit_exit();
-           return error;
-
-       case ATAGMODE:
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-
-           if ((iocmd->device == MASTER || iocmd->device == -1) &&
-               ch->device[MASTER].driver)
-               iocmd->u.mode.mode[MASTER] = ch->device[MASTER].mode;
-           else
-               iocmd->u.mode.mode[MASTER] = -1;
-
-           if ((iocmd->device == SLAVE || iocmd->device == -1) &&
-               ch->device[SLAVE].param)
-               iocmd->u.mode.mode[SLAVE] = ch->device[SLAVE].mode;
-           else
-               iocmd->u.mode.mode[SLAVE] = -1;
-           return 0;
-
-       case ATASMODE:
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-
-           if ((iocmd->device == MASTER || iocmd->device == -1) &&
-               iocmd->u.mode.mode[MASTER] >= 0 && ch->device[MASTER].param) {
-               ata_change_mode(&ch->device[MASTER],iocmd->u.mode.mode[MASTER]);
-               iocmd->u.mode.mode[MASTER] = ch->device[MASTER].mode;
-           }
-           else
-               iocmd->u.mode.mode[MASTER] = -1;
-
-           if ((iocmd->device == SLAVE || iocmd->device == -1) &&
-               iocmd->u.mode.mode[SLAVE] >= 0 && ch->device[SLAVE].param) {
-               ata_change_mode(&ch->device[SLAVE], iocmd->u.mode.mode[SLAVE]);
-               iocmd->u.mode.mode[SLAVE] = ch->device[SLAVE].mode;
-           }
-           else
-               iocmd->u.mode.mode[SLAVE] = -1;
-           return 0;
-
-       case ATAGPARM:
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-
-           iocmd->u.param.type[MASTER] = 
-               ch->devices & (ATA_ATA_MASTER | ATA_ATAPI_MASTER);
-           iocmd->u.param.type[SLAVE] =
-               ch->devices & (ATA_ATA_SLAVE | ATA_ATAPI_SLAVE);
-
-           if (ch->device[MASTER].name)
-               strcpy(iocmd->u.param.name[MASTER], ch->device[MASTER].name);
-           if (ch->device[SLAVE].name)
-               strcpy(iocmd->u.param.name[SLAVE], ch->device[SLAVE].name);
-
-           if (ch->device[MASTER].param)
-               bcopy(ch->device[MASTER].param, &iocmd->u.param.params[MASTER],
-                     sizeof(struct ata_params));
-           if (ch->device[SLAVE].param)
-               bcopy(ch->device[SLAVE].param, &iocmd->u.param.params[SLAVE],
-                     sizeof(struct ata_params));
-           return 0;
-
-       case ATAENCSTAT: {
-           struct ata_device *atadev;
-
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-
-           if (iocmd->device == SLAVE)
-               atadev = &ch->device[SLAVE];
-           else
-               atadev = &ch->device[MASTER];
-
-           return ata_enclosure_status(atadev,
-                                       &iocmd->u.enclosure.fan,
-                                       &iocmd->u.enclosure.temp,
-                                       &iocmd->u.enclosure.v05,
-                                       &iocmd->u.enclosure.v12);
-       }
-
-#if NATADISK > 0
-       case ATARAIDREBUILD:
-           return ata_raid_rebuild(iocmd->channel);
-
-       case ATARAIDCREATE:
-           return ata_raid_create(&iocmd->u.raid_setup);
-
-       case ATARAIDDELETE:
-           return ata_raid_delete(iocmd->channel);
-
-       case ATARAIDSTATUS:
-           return ata_raid_status(iocmd->channel, &iocmd->u.raid_status);
-#endif
-#if DEV_ATAPIALL
-       case ATAPICMD: {
-           struct ata_device *atadev;
-           caddr_t buf;
-
-           if (!device || !(ch = device_get_softc(device)))
-               return ENXIO;
-
-           if (!(atadev = &ch->device[iocmd->device]) ||
-               !(ch->devices & (iocmd->device == MASTER ?
-                                ATA_ATAPI_MASTER : ATA_ATAPI_SLAVE)))
-               return ENODEV;
-
-           buf = kmalloc(iocmd->u.atapi.count, M_ATA, M_INTWAIT);
-
-           if (iocmd->u.atapi.flags & ATAPI_CMD_WRITE) {
-               error = copyin(iocmd->u.atapi.data, buf, iocmd->u.atapi.count);
-               if (error)
-                   return error;
-           }
-           error = atapi_queue_cmd(atadev, iocmd->u.atapi.ccb,
-                                   buf, iocmd->u.atapi.count,
-                                   (iocmd->u.atapi.flags == ATAPI_CMD_READ ?
-                                    ATPR_F_READ : 0) | ATPR_F_QUIET, 
-                                   iocmd->u.atapi.timeout, NULL, NULL);
-           if (error) {
-               iocmd->u.atapi.error = error;
-               bcopy(&atadev->result, iocmd->u.atapi.sense_data,
-                     sizeof(struct atapi_reqsense));
-               error = 0;
-           }
-           else if (iocmd->u.atapi.flags & ATAPI_CMD_READ)
-               error = copyout(buf, iocmd->u.atapi.data, iocmd->u.atapi.count);
-
-           kfree(buf, M_ATA);
-           return error;
-       }
-#endif
-       default:
-           break;
-    }
-    return ENOTTY;
-}
-
-static int
-ata_getparam(struct ata_device *atadev, u_int8_t command)
-{
-    struct ata_params *ata_parm;
-    int retry = 0;
-
-    ata_parm = kmalloc(sizeof(struct ata_params), M_ATA, M_INTWAIT);
-
-    /* apparently some devices needs this repeated */
-    do {
-       if (ata_command(atadev, command, 0, 0, 0, ATA_IMMEDIATE)) {
-           ata_prtdev(atadev, "%s identify failed\n",
-                      command == ATA_C_ATAPI_IDENTIFY ? "ATAPI" : "ATA");
-           kfree(ata_parm, M_ATA);
-           return -1;
-       }
-       if (retry++ > 4) {
-           ata_prtdev(atadev, "%s identify retries exceeded\n",
-                      command == ATA_C_ATAPI_IDENTIFY ? "ATAPI" : "ATA");
-           kfree(ata_parm, M_ATA);
-           return -1;
-       }
-    } while (ata_wait(atadev, ((command == ATA_C_ATAPI_IDENTIFY) ?
-                              ATA_S_DRQ : (ATA_S_READY|ATA_S_DSC|ATA_S_DRQ))));
-    ATA_INSW(atadev->channel->r_io, ATA_DATA, (int16_t *)ata_parm,
-            sizeof(struct ata_params)/sizeof(int16_t));
-
-    if (command == ATA_C_ATA_IDENTIFY ||
-       !((ata_parm->model[0] == 'N' && ata_parm->model[1] == 'E') ||
-         (ata_parm->model[0] == 'F' && ata_parm->model[1] == 'X') ||
-         (ata_parm->model[0] == 'P' && ata_parm->model[1] == 'i')))
-       bswap(ata_parm->model, sizeof(ata_parm->model));
-    btrim(ata_parm->model, sizeof(ata_parm->model));
-    bpack(ata_parm->model, ata_parm->model, sizeof(ata_parm->model));
-    bswap(ata_parm->revision, sizeof(ata_parm->revision));
-    btrim(ata_parm->revision, sizeof(ata_parm->revision));
-    bpack(ata_parm->revision, ata_parm->revision, sizeof(ata_parm->revision));
-    bswap(ata_parm->serial, sizeof(ata_parm->serial));
-    btrim(ata_parm->serial, sizeof(ata_parm->serial));
-    bpack(ata_parm->serial, ata_parm->serial, sizeof(ata_parm->serial));
-    atadev->param = ata_parm;
-    return 0;
-}
-
-#if 0
-
-static void 
-ata_boot_attach(void)
-{
-    struct ata_channel *ch;
-    int ctlr;
-
-    crit_enter();
-
-    /*
-     * run through all ata devices and look for real ATA & ATAPI devices
-     * using the hints we found in the early probe, this avoids some of
-     * the delays probing of non-exsistent devices can cause.
-     */
-    for (ctlr=0; ctlr<devclass_get_maxunit(ata_devclass); ctlr++) {
-       if (!(ch = devclass_get_softc(ata_devclass, ctlr)))
-           continue;
-       if (ch->devices & ATA_ATA_SLAVE)
-           if (ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY))
-               ch->devices &= ~ATA_ATA_SLAVE;
-       if (ch->devices & ATA_ATAPI_SLAVE)
-           if (ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY))
-               ch->devices &= ~ATA_ATAPI_SLAVE;
-       if (ch->devices & ATA_ATA_MASTER)
-           if (ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY))
-               ch->devices &= ~ATA_ATA_MASTER;
-       if (ch->devices & ATA_ATAPI_MASTER)
-           if (ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY))
-               ch->devices &= ~ATA_ATAPI_MASTER;
-    }
-
-#if NATADISK > 0
-    /* now we know whats there, do the real attach, first the ATA disks */
-    for (ctlr=0; ctlr<devclass_get_maxunit(ata_devclass); ctlr++) {
-       if (!(ch = devclass_get_softc(ata_devclass, ctlr)))
-           continue;
-       if (ch->devices & ATA_ATA_MASTER)
-           ad_attach(&ch->device[MASTER], 0);
-       if (ch->devices & ATA_ATA_SLAVE)
-           ad_attach(&ch->device[SLAVE], 0);
-    }
-    ata_raid_attach();
-#endif
-#if DEV_ATAPIALL
-    /* then the atapi devices */
-    for (ctlr=0; ctlr<devclass_get_maxunit(ata_devclass); ctlr++) {
-       if (!(ch = devclass_get_softc(ata_devclass, ctlr)))
-           continue;
-       if (ch->devices & ATA_ATAPI_MASTER)
-           atapi_attach(&ch->device[MASTER], 0);
-       if (ch->devices & ATA_ATAPI_SLAVE)
-           atapi_attach(&ch->device[SLAVE], 0);
-#if NATAPICAM > 0
-       atapi_cam_attach_bus(ch);
-#endif
-    }
-#endif
-    crit_exit();
-}
-
-#endif
-
-static void
-ata_intr(void *data)
-{
-    struct ata_channel *ch = (struct ata_channel *)data;
-    /* 
-     * on PCI systems we might share an interrupt line with another
-     * device or our twin ATA channel, so call ch->intr_func to figure 
-     * out if it is really an interrupt we should process here
-     */
-    if (ch->intr_func && ch->intr_func(ch))
-       return;
-
-    /* if drive is busy it didn't interrupt */
-    if (ATA_INB(ch->r_altio, ATA_ALTSTAT) & ATA_S_BUSY) {
-       DELAY(100);
-       if (!(ATA_INB(ch->r_altio, ATA_ALTSTAT) & ATA_S_DRQ))
-           return;
-    }
-
-    /* clear interrupt and get status */
-    ch->status = ATA_INB(ch->r_io, ATA_STATUS);
-
-    if (ch->status & ATA_S_ERROR)
-       ch->error = ATA_INB(ch->r_io, ATA_ERROR);
-
-    /* find & call the responsible driver to process this interrupt */
-    switch (ch->active) {
-#if NATADISK > 0
-    case ATA_ACTIVE_ATA:
-       if (!ch->running || ad_interrupt(ch->running) == ATA_OP_CONTINUES)
-           return;
-       break;
-#endif
-#if DEV_ATAPIALL
-    case ATA_ACTIVE_ATAPI:
-       if (!ch->running || atapi_interrupt(ch->running) == ATA_OP_CONTINUES)
-           return;
-       break;
-#endif
-    case ATA_WAIT_INTR:
-    case ATA_WAIT_INTR | ATA_CONTROL:
-       wakeup((caddr_t)ch);
-       break;
-
-    case ATA_WAIT_READY:
-    case ATA_WAIT_READY | ATA_CONTROL:
-       break;
-
-    case ATA_IDLE:
-       if (ch->flags & ATA_QUEUED) {
-           ch->active = ATA_ACTIVE;
-           if (ata_service(ch) == ATA_OP_CONTINUES)
-               return;
-       }
-       /* FALLTHROUGH */
-
-    default:
-#ifdef ATA_DEBUG
-    {
-       static int intr_count = 0;
-
-       if (intr_count++ < 10)
-           ata_printf(ch, -1, "unwanted interrupt #%d active=%02x s=%02x\n",
-                      intr_count, ch->active, ch->status);
-    }
-#endif
-       break;
-    }
-    ch->active &= ATA_CONTROL;
-    if (ch->active & ATA_CONTROL)
-       return;
-    ch->running = NULL;
-    ata_start(ch);
-    return;
-}
-
-void
-ata_start(struct ata_channel *ch)
-{
-#if NATADISK > 0
-    struct ad_request *ad_request; 
-#endif
-#if DEV_ATAPIALL
-    struct atapi_request *atapi_request;
-#endif
-
-    crit_enter();      /* interlock non-atomic channel lock */
-    if (!ATA_LOCK_CH(ch, ATA_ACTIVE)) {
-       crit_exit();
-       return;
-    }
-
-#if NATADISK > 0
-    /* find & call the responsible driver if anything on the ATA queue */
-    if (TAILQ_EMPTY(&ch->ata_queue)) {
-       if (ch->devices & (ATA_ATA_MASTER) && ch->device[MASTER].driver)
-           ad_start(&ch->device[MASTER]);
-       if (ch->devices & (ATA_ATA_SLAVE) && ch->device[SLAVE].driver)
-           ad_start(&ch->device[SLAVE]);
-    }
-    if ((ad_request = TAILQ_FIRST(&ch->ata_queue))) {
-       TAILQ_REMOVE(&ch->ata_queue, ad_request, chain);
-       ch->active = ATA_ACTIVE_ATA;
-       ch->running = ad_request;
-
-       /*
-        * The donecount had better be 0 here because the channel may not
-        * have retained the setup for the request (if a retry).
-        */
-       KKASSERT(ad_request->donecount == 0);
-       if (ad_transfer(ad_request) == ATA_OP_CONTINUES) {
-           crit_exit();
-           return;
-       }
-    }
-
-#endif
-#if DEV_ATAPIALL
-    /* find & call the responsible driver if anything on the ATAPI queue */
-    if (TAILQ_EMPTY(&ch->atapi_queue)) {
-       if (ch->devices & (ATA_ATAPI_MASTER) && ch->device[MASTER].driver)
-           atapi_start(&ch->device[MASTER]);
-       if (ch->devices & (ATA_ATAPI_SLAVE) && ch->device[SLAVE].driver)
-           atapi_start(&ch->device[SLAVE]);
-    }
-    if ((atapi_request = TAILQ_FIRST(&ch->atapi_queue))) {
-       TAILQ_REMOVE(&ch->atapi_queue, atapi_request, chain);
-       ch->active = ATA_ACTIVE_ATAPI;
-       ch->running = atapi_request;
-       if (atapi_transfer(atapi_request) == ATA_OP_CONTINUES) {
-           crit_exit();
-           return;
-       }
-    }
-#endif
-    ATA_UNLOCK_CH(ch);
-    crit_exit();
-}
-
-void
-ata_reset(struct ata_channel *ch)
-{
-    u_int8_t lsb, msb, ostat0, ostat1;
-    u_int8_t stat0 = 0, stat1 = 0;
-    int mask = 0, timeout;
-
-    /* do we have any signs of ATA/ATAPI HW being present ? */
-    ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
-    DELAY(10);
-    ostat0 = ATA_INB(ch->r_io, ATA_STATUS);
-    if ((ostat0 & 0xf8) != 0xf8 && ostat0 != 0xa5) {
-       stat0 = ATA_S_BUSY;
-       mask |= 0x01;
-    }
-    ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
-    DELAY(10); 
-    ostat1 = ATA_INB(ch->r_io, ATA_STATUS);
-    if ((ostat1 & 0xf8) != 0xf8 && ostat1 != 0xa5) {
-       stat1 = ATA_S_BUSY;
-       mask |= 0x02;
-    }
-
-    ch->devices = 0;
-    if (!mask)
-       return;
-
-    /* in some setups we dont want to test for a slave */
-    if (ch->flags & ATA_NO_SLAVE) {
-       stat1 = 0x0;
-       mask &= ~0x02;
-    }
-
-    if (bootverbose)
-       ata_printf(ch, -1, "mask=%02x ostat0=%02x ostat2=%02x\n",
-                  mask, ostat0, ostat1);
-
-    /* reset channel */
-    ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
-    DELAY(10);
-    ATA_OUTB(ch->r_altio, ATA_ALTSTAT, ATA_A_IDS | ATA_A_RESET);
-    DRIVERSLEEP(10000); 
-    ATA_OUTB(ch->r_altio, ATA_ALTSTAT, ATA_A_IDS);
-    DRIVERSLEEP(100000);
-    ATA_INB(ch->r_io, ATA_ERROR);
-
-    /* wait for BUSY to go inactive */
-    for (timeout = 0; timeout < 3100; timeout++) {
-       if (stat0 & ATA_S_BUSY) {
-           ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
-           DELAY(10);
-
-           /* check for ATAPI signature while its still there */
-           lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-           msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
-           stat0 = ATA_INB(ch->r_io, ATA_STATUS);
-           if (!(stat0 & ATA_S_BUSY)) {
-               if (bootverbose)
-                   ata_printf(ch, ATA_MASTER, "ATAPI %02x %02x\n", lsb, msb);
-               if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB)
-                   ch->devices |= ATA_ATAPI_MASTER;
-           }
-       }
-       if (stat1 & ATA_S_BUSY) {
-           ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
-           DELAY(10);
-
-           /* check for ATAPI signature while its still there */
-           lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-           msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
-           stat1 = ATA_INB(ch->r_io, ATA_STATUS);
-           if (!(stat1 & ATA_S_BUSY)) {
-               if (bootverbose)
-                   ata_printf(ch, ATA_SLAVE, "ATAPI %02x %02x\n", lsb, msb);
-               if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB)
-                   ch->devices |= ATA_ATAPI_SLAVE;
-           }
-       }
-       if (mask == 0x01)      /* wait for master only */
-           if (!(stat0 & ATA_S_BUSY))
-               break;
-       if (mask == 0x02)      /* wait for slave only */
-           if (!(stat1 & ATA_S_BUSY))
-               break;
-       if (mask == 0x03)      /* wait for both master & slave */
-           if (!(stat0 & ATA_S_BUSY) && !(stat1 & ATA_S_BUSY))
-               break;
-       DRIVERSLEEP(10000);
-    }  
-    /*
-     * some devices release BUSY before they are ready to accept commands.
-     * We must wait at least 50ms before attempting to issue a command after
-     * BUSY is released.
-     */
-    DRIVERSLEEP(50000);
-    ATA_OUTB(ch->r_altio, ATA_ALTSTAT, ATA_A_4BIT);
-
-    if (stat0 & ATA_S_BUSY)
-       mask &= ~0x01;
-    if (stat1 & ATA_S_BUSY)
-       mask &= ~0x02;
-    if (bootverbose)
-       ata_printf(ch, -1, "mask=%02x stat0=%02x stat1=%02x\n", 
-                  mask, stat0, stat1);
-    if (!mask)
-       return;
-
-    if (mask & 0x01 && ostat0 != 0x00 && !(ch->devices & ATA_ATAPI_MASTER)) {
-       ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
-       DELAY(10);
-       ATA_OUTB(ch->r_io, ATA_ERROR, 0x58);
-       ATA_OUTB(ch->r_io, ATA_CYL_LSB, 0xa5);
-       lsb = ATA_INB(ch->r_io, ATA_ERROR);
-       msb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-       if (bootverbose)
-           ata_printf(ch, ATA_MASTER, "ATA %02x %02x\n", lsb, msb);
-       if (lsb != 0x58 && msb == 0xa5)
-           ch->devices |= ATA_ATA_MASTER;
-    }
-    if (mask & 0x02 && ostat1 != 0x00 && !(ch->devices & ATA_ATAPI_SLAVE)) {
-       ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
-       DELAY(10);
-       ATA_OUTB(ch->r_io, ATA_ERROR, 0x58);
-       ATA_OUTB(ch->r_io, ATA_CYL_LSB, 0xa5);
-       lsb = ATA_INB(ch->r_io, ATA_ERROR);
-       msb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-       if (bootverbose)
-           ata_printf(ch, ATA_SLAVE, "ATA %02x %02x\n", lsb, msb);
-       if (lsb != 0x58 && msb == 0xa5)
-           ch->devices |= ATA_ATA_SLAVE;
-    }
-    if (bootverbose)
-       ata_printf(ch, -1, "devices=%02x\n", ch->devices);
-}
-
-int
-ata_reinit(struct ata_channel *ch)
-{
-    int devices, misdev, newdev;
-
-    if (!ch->r_io || !ch->r_altio || !ch->r_irq)
-       return ENXIO;
-
-    ATA_FORCELOCK_CH(ch, ATA_CONTROL);
-    ch->running = NULL;
-    devices = ch->devices;
-    ata_printf(ch, -1, "resetting devices .. ");
-    ata_reset(ch);
-
-    if ((misdev = devices & ~ch->devices)) {
-       if (misdev)
-           kprintf("\n");
-#if NATADISK > 0
-       if (misdev & ATA_ATA_MASTER && ch->device[MASTER].driver)
-           ad_detach(&ch->device[MASTER], 0);
-       if (misdev & ATA_ATA_SLAVE && ch->device[SLAVE].driver)
-           ad_detach(&ch->device[SLAVE], 0);
-#endif
-#if DEV_ATAPIALL
-       if (misdev & ATA_ATAPI_MASTER && ch->device[MASTER].driver)
-           atapi_detach(&ch->device[MASTER]);
-       if (misdev & ATA_ATAPI_SLAVE && ch->device[SLAVE].driver)
-           atapi_detach(&ch->device[SLAVE]);
-#endif
-       if (misdev & ATA_ATA_MASTER || misdev & ATA_ATAPI_MASTER) {
-           if (ch->device[MASTER].param)
-               kfree(ch->device[MASTER].param, M_ATA);
-           ch->device[MASTER].param = NULL;
-       }
-       if (misdev & ATA_ATA_SLAVE || misdev & ATA_ATAPI_SLAVE) {
-           if (ch->device[SLAVE].param)
-               kfree(ch->device[SLAVE].param, M_ATA);
-           ch->device[SLAVE].param = NULL;
-       }
-    }
-    if ((newdev = ~devices & ch->devices)) {
-       if (newdev & ATA_ATA_MASTER)
-           if (ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY))
-               ch->devices &= ~ATA_ATA_MASTER;
-       if (newdev & ATA_ATA_SLAVE)
-           if (ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY))
-               ch->devices &= ~ATA_ATA_SLAVE;
-       if (newdev & ATA_ATAPI_MASTER)
-           if (ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY))
-               ch->devices &= ~ATA_ATAPI_MASTER;
-       if (newdev & ATA_ATAPI_SLAVE)
-           if (ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY))
-               ch->devices &= ~ATA_ATAPI_SLAVE;
-    }
-    newdev = ~devices & ch->devices;
-    if (!misdev && newdev)
-       kprintf("\n");
-#if NATADISK > 0
-    if (newdev & ATA_ATA_MASTER && !ch->device[MASTER].driver)
-       ad_attach(&ch->device[MASTER], 1);
-    else if (ch->devices & ATA_ATA_MASTER && ch->device[MASTER].driver) {
-       ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY);
-       ad_reinit(&ch->device[MASTER]);
-    }
-    if (newdev & ATA_ATA_SLAVE && !ch->device[SLAVE].driver)
-       ad_attach(&ch->device[SLAVE], 1);
-    else if (ch->devices & (ATA_ATA_SLAVE) && ch->device[SLAVE].driver) {
-       ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY);
-       ad_reinit(&ch->device[SLAVE]);
-    }
-#endif
-#if DEV_ATAPIALL
-    if (newdev & ATA_ATAPI_MASTER && !ch->device[MASTER].driver)
-       atapi_attach(&ch->device[MASTER], 1);
-    else if (ch->devices & (ATA_ATAPI_MASTER) && ch->device[MASTER].driver) {
-       ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY);
-       atapi_reinit(&ch->device[MASTER]);
-    }
-    if (newdev & ATA_ATAPI_SLAVE && !ch->device[SLAVE].driver)
-       atapi_attach(&ch->device[SLAVE], 1);
-    else if (ch->devices & (ATA_ATAPI_SLAVE) && ch->device[SLAVE].driver) {
-       ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY);
-       atapi_reinit(&ch->device[SLAVE]);
-    }
-#endif
-#if NATAPICAM > 0
-    if (ch->devices & (ATA_ATAPI_MASTER | ATA_ATAPI_SLAVE))
-       atapi_cam_reinit_bus(ch);
-#endif
-    kprintf("done\n");
-    ATA_UNLOCK_CH(ch);
-    ata_start(ch);
-    return 0;
-}
-
-static int
-ata_service(struct ata_channel *ch)
-{
-    /* do we have a SERVICE request from the drive ? */
-    if ((ch->status & (ATA_S_SERVICE|ATA_S_ERROR|ATA_S_DRQ)) == ATA_S_SERVICE) {
-       ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT,
-                ata_dmastatus(ch) | ATA_BMSTAT_INTERRUPT);
-#if NATADISK > 0
-       if ((ATA_INB(ch->r_io, ATA_DRIVE) & ATA_SLAVE) == ATA_MASTER) {
-           if ((ch->devices & ATA_ATA_MASTER) && ch->device[MASTER].driver)
-               return ad_service((struct ad_softc *)
-                                 ch->device[MASTER].driver, 0);
-       }
-       else {
-           if ((ch->devices & ATA_ATA_SLAVE) && ch->device[SLAVE].driver)
-               return ad_service((struct ad_softc *)
-                                 ch->device[SLAVE].driver, 0);
-       }
-#endif
-    }
-    return ATA_OP_FINISHED;
-}
-
-int
-ata_wait(struct ata_device *atadev, u_int8_t mask)
-{
-    int timeout = 0;
-    
-    DELAY(1);
-    while (timeout < 5000000) { /* timeout 5 secs */
-       atadev->channel->status = ATA_INB(atadev->channel->r_io, ATA_STATUS);
-
-       /* if drive fails status, reselect the drive just to be sure */
-       if (atadev->channel->status == 0xff) {
-           ata_prtdev(atadev, "no status, reselecting device\n");
-           ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM|atadev->unit);
-           DELAY(10);
-           atadev->channel->status = ATA_INB(atadev->channel->r_io,ATA_STATUS);
-           if (atadev->channel->status == 0xff)
-               return -1;
-       }
-
-       /* are we done ? */
-       if (!(atadev->channel->status & ATA_S_BUSY))
-           break;            
-
-       if (timeout > 1000) {
-           timeout += 1000;
-           DELAY(1000);
-       }
-       else {
-           timeout += 10;
-           DELAY(10);
-       }
-    }   
-    if (atadev->channel->status & ATA_S_ERROR)
-       atadev->channel->error = ATA_INB(atadev->channel->r_io, ATA_ERROR);
-    if (timeout >= 5000000)     
-       return -1;          
-    if (!mask)    
-       return (atadev->channel->status & ATA_S_ERROR);  
-    
-    /* Wait 50 msec for bits wanted. */           
-    timeout = 5000;
-    while (timeout--) {          
-       atadev->channel->status = ATA_INB(atadev->channel->r_io, ATA_STATUS);
-       if ((atadev->channel->status & mask) == mask) {
-           if (atadev->channel->status & ATA_S_ERROR)
-               atadev->channel->error=ATA_INB(atadev->channel->r_io,ATA_ERROR);
-           return (atadev->channel->status & ATA_S_ERROR);           
-       }
-       DELAY (10);        
-    }    
-    return -1;     
-}   
-
-int
-ata_command(struct ata_device *atadev, u_int8_t command,
-          u_int64_t lba, u_int16_t count, u_int8_t feature, int flags)
-{
-    int error = 0;
-#ifdef ATA_DEBUG
-    ata_prtdev(atadev, "ata_command: addr=%04lx, cmd=%02x, "
-              "lba=%lld, count=%d, feature=%d, flags=%02x\n",
-              rman_get_start(atadev->channel->r_io), 
-              command, lba, count, feature, flags);
-#endif
-
-    /* select device */
-    ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM | atadev->unit);
-
-    /* disable interrupt from device */
-    if (atadev->channel->flags & ATA_QUEUED)
-       ATA_OUTB(atadev->channel->r_altio, ATA_ALTSTAT, ATA_A_IDS | ATA_A_4BIT);
-
-    /* ready to issue command ? */
-    if (ata_wait(atadev, 0) < 0) { 
-       ata_prtdev(atadev, "timeout sending command=%02x s=%02x e=%02x\n",
-                  command, atadev->channel->status, atadev->channel->error);
-       return -1;
-    }
-
-    /* only use 48bit addressing if needed because of the overhead */
-    if ((lba >= 268435455 || count > 256) && atadev->param &&
-       atadev->param->support.address48) {
-       ATA_OUTB(atadev->channel->r_io, ATA_FEATURE, (feature>>8) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_FEATURE, feature);
-       ATA_OUTB(atadev->channel->r_io, ATA_COUNT, (count>>8) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_COUNT, count & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, (lba>>24) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, lba & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_LSB, (lba>>32) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_LSB, (lba>>8) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_MSB, (lba>>40) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_MSB, (lba>>16) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_LBA | atadev->unit);
-
-       /* translate command into 48bit version */
-       switch (command) {
-       case ATA_C_READ:
-           command = ATA_C_READ48; break;
-       case ATA_C_READ_MUL:
-           command = ATA_C_READ_MUL48; break;
-       case ATA_C_READ_DMA:
-           command = ATA_C_READ_DMA48; break;
-       case ATA_C_READ_DMA_QUEUED:
-           command = ATA_C_READ_DMA_QUEUED48; break;
-       case ATA_C_WRITE:
-           command = ATA_C_WRITE48; break;
-       case ATA_C_WRITE_MUL:
-           command = ATA_C_WRITE_MUL48; break;
-       case ATA_C_WRITE_DMA:
-           command = ATA_C_WRITE_DMA48; break;
-       case ATA_C_WRITE_DMA_QUEUED:
-           command = ATA_C_WRITE_DMA_QUEUED48; break;
-       case ATA_C_FLUSHCACHE:
-           command = ATA_C_FLUSHCACHE48; break;
-       default:
-           ata_prtdev(atadev, "can't translate cmd to 48bit version\n");
-           return -1;
-       }
-    }
-    else {
-       ATA_OUTB(atadev->channel->r_io, ATA_FEATURE, feature);
-       ATA_OUTB(atadev->channel->r_io, ATA_COUNT, count);
-       ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, lba & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_LSB, (lba>>8) & 0xff);
-       ATA_OUTB(atadev->channel->r_io, ATA_CYL_MSB, (lba>>16) & 0xff);
-       if (atadev->flags & ATA_D_USE_CHS)
-           ATA_OUTB(atadev->channel->r_io, ATA_DRIVE,
-                    ATA_D_IBM | atadev->unit | ((lba>>24) & 0xf));
-       else
-           ATA_OUTB(atadev->channel->r_io, ATA_DRIVE,
-                    ATA_D_IBM | ATA_D_LBA | atadev->unit | ((lba>>24) &0xf));
-    }
-
-    switch (flags & ATA_WAIT_MASK) {
-    case ATA_IMMEDIATE:
-       ATA_OUTB(atadev->channel->r_io, ATA_CMD, command);
-
-       /* enable interrupt */
-       if (atadev->channel->flags & ATA_QUEUED)
-           ATA_OUTB(atadev->channel->r_altio, ATA_ALTSTAT, ATA_A_4BIT);
-       break;
-
-    case ATA_WAIT_INTR:
-       atadev->channel->active |= ATA_WAIT_INTR;
-       ATA_OUTB(atadev->channel->r_io, ATA_CMD, command);
-
-       /* enable interrupt */
-       if (atadev->channel->flags & ATA_QUEUED)
-           ATA_OUTB(atadev->channel->r_altio, ATA_ALTSTAT, ATA_A_4BIT);
-
-       if (tsleep((caddr_t)atadev->channel, 0, "atacmd", 10 * hz)) {
-           ata_prtdev(atadev, "timeout waiting for interrupt\n");
-           atadev->channel->active &= ~ATA_WAIT_INTR;
-           error = -1;
-       }
-       break;
-    
-    case ATA_WAIT_READY:
-       atadev->channel->active |= ATA_WAIT_READY;
-       ATA_OUTB(atadev->channel->r_io, ATA_CMD, command);
-       if (ata_wait(atadev, ATA_S_READY) < 0) { 
-           ata_prtdev(atadev, "timeout waiting for cmd=%02x s=%02x e=%02x\n",
-                      command, atadev->channel->status,atadev->channel->error);
-           error = -1;
-       }
-       atadev->channel->active &= ~ATA_WAIT_READY;
-       break;
-    }
-    return error;
-}
-
-static void
-ata_enclosure_start(struct ata_device *atadev)
-{
-    ATA_INB(atadev->channel->r_io, ATA_DRIVE);   
-    DELAY(1);
-    ATA_INB(atadev->channel->r_io, ATA_DRIVE);   
-    DELAY(1);
-    ATA_INB(atadev->channel->r_io, ATA_CMD);     
-    DELAY(1);
-    ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM | atadev->unit);    
-    DELAY(1);
-    ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM | atadev->unit);    
-    DELAY(1);
-    ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM | atadev->unit);    
-    DELAY(1);
-    ATA_INB(atadev->channel->r_io, ATA_COUNT);
-    DELAY(1);
-    ATA_INB(atadev->channel->r_io, ATA_DRIVE);
-    DELAY(1);
-}
-
-static void
-ata_enclosure_end(struct ata_device *atadev)
-{
-    ATA_OUTB(atadev->channel->r_io, ATA_DRIVE, ATA_D_IBM | atadev->unit);    
-    DELAY(1);
-}
-
-static void
-ata_enclosure_chip_start(struct ata_device *atadev)
-{
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x0b);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x0a);
-    DELAY(25);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x08);
-}
-
-static void
-ata_enclosure_chip_end(struct ata_device *atadev)
-{
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x08);
-    DELAY(64);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x0a);
-    DELAY(25);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x0b);
-    DELAY(64);
-}
-
-static u_int8_t
-ata_enclosure_chip_rdbit(struct ata_device *atadev)
-{
-    u_int8_t val;
-
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0);
-    DELAY(64);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x02);
-    DELAY(25);
-    val = ATA_INB(atadev->channel->r_io, ATA_SECTOR) & 0x01;
-    DELAY(38);
-    return val;
-}
-
-static void
-ata_enclosure_chip_wrbit(struct ata_device *atadev, u_int8_t data)
-{
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x08 | (data & 0x01));
-    DELAY(64);
-    ATA_OUTB(atadev->channel->r_io, ATA_SECTOR, 0x08 | 0x02 | (data & 0x01));
-    DELAY(64);
-}
-
-static u_int8_t
-ata_enclosure_chip_rw(struct ata_device *atadev, int rw, u_int8_t val)
-{
-    int i;
-
-    if (rw) {
-       for (i = 0; i < 8; i++)
-           ata_enclosure_chip_wrbit(atadev, (val & (0x80 >> i)) ? 1 : 0);
-    }
-    else {
-       for (i = 0; i < 8; i++)
-           val = (val << 1) | ata_enclosure_chip_rdbit(atadev);
-    }
-    ata_enclosure_chip_wrbit(atadev, 0);
-    return val;
-}
-
-static u_int8_t
-ata_enclosure_sensor(struct ata_device *atadev, 
-                    int rw, u_int8_t idx, u_int8_t data)
-{
-    ata_enclosure_start(atadev);
-    ata_enclosure_chip_start(atadev);
-    ata_enclosure_chip_rw(atadev, 1, 0x5a);
-    ata_enclosure_chip_rw(atadev, 1, idx);
-    if (rw) {
-       ata_enclosure_chip_rw(atadev, 1, data);
-    }
-    else {
-       ata_enclosure_chip_end(atadev);
-       ata_enclosure_chip_start(atadev);
-       ata_enclosure_chip_rw(atadev, 1, 0x5b);
-       data = ata_enclosure_chip_rw(atadev, 0, 0);
-    }
-    ata_enclosure_chip_end(atadev); 
-    ata_enclosure_end(atadev);
-    return data;
-}
-
-static int
-ata_enclosure_status(struct ata_device *atadev,
-                    int *fan, int *temp, int *v05, int *v12)
-{
-    u_int8_t id1, id2, cnt, div;
-    int error = ENXIO;
-
-    if (atadev->flags & ATA_D_ENC_PRESENT) {
-       ATA_SLEEPLOCK_CH(atadev->channel, ATA_CONTROL);
-       ata_enclosure_sensor(atadev, 1, 0x4e, 0);
-       id1 = ata_enclosure_sensor(atadev, 0, 0x4f, 0);
-       ata_enclosure_sensor(atadev, 1, 0x4e, 0x80);
-       id2 = ata_enclosure_sensor(atadev, 0, 0x4f, 0);
-       if (id1 == 0xa3 && id2 == 0x5c) {
-           div = 1 << (((ata_enclosure_sensor(atadev, 0, 0x5d, 0)&0x20)>>3)+
-                       ((ata_enclosure_sensor(atadev, 0, 0x47, 0)&0x30)>>4)+1);
-           cnt = ata_enclosure_sensor(atadev, 0, 0x28, 0);
-           if (cnt == 0xff)
-               *fan = 0;
-           else
-               *fan = 1350000 / cnt / div;
-           ata_enclosure_sensor(atadev, 1, 0x4e, 0x01);
-           *temp = (ata_enclosure_sensor(atadev, 0, 0x50, 0) * 10) +
-                   (ata_enclosure_sensor(atadev, 0, 0x50, 0) & 0x80 ? 5 : 0);
-           *v05 = ata_enclosure_sensor(atadev, 0, 0x23, 0) * 27;
-           *v12 = ata_enclosure_sensor(atadev, 0, 0x24, 0) * 61;
-           error = 0;
-       }
-       ATA_UNLOCK_CH(atadev->channel);
-    }
-    return error;
-}
-    
-void
-ata_enclosure_print(struct ata_device *atadev)
-{
-    u_int8_t id, st;
-    int fan, temp, v05, v12;
-
-    ATA_SLEEPLOCK_CH(atadev->channel, ATA_CONTROL);
-    ata_enclosure_start(atadev);
-    id = ATA_INB(atadev->channel->r_io, ATA_DRIVE);
-    DELAY(1);
-    st = ATA_INB(atadev->channel->r_io, ATA_COUNT);
-    DELAY(1);
-    ata_enclosure_end(atadev);
-    ATA_UNLOCK_CH(atadev->channel);
-
-    switch (id & 0x93) {
-    case 0x00:
-       ata_prtdev(atadev, "Universal enclosure");
-       break;
-    case 0x01:
-       ata_prtdev(atadev, "FastSwap enclosure");
-       break;
-    case 0x10:
-    case 0x11:
-       ata_prtdev(atadev, "SuperSwap enclosure");
-       break;
-    default:
-        atadev->flags &= ~ATA_D_ENC_PRESENT;
-       return;
-    }
-    atadev->flags |= ATA_D_ENC_PRESENT;
-
-    if (ata_enclosure_status(atadev, &fan, &temp, &v05, &v12))
-       kprintf(" detected\n");
-    else
-       kprintf(" [FAN:%drpm TEMP:%d.%01dC %d.%03dV %d.%03dV]\n",
-              fan, temp/10, temp%10, v05/1000, v05%1000, v12/1000, v12%1000);
-}
-
-void
-ata_enclosure_leds(struct ata_device *atadev, u_int8_t color)
-{
-    if (atadev->flags & ATA_D_ENC_PRESENT) {
-       u_int8_t reg;
-
-       ata_enclosure_start(atadev);
-       reg = ATA_INB(atadev->channel->r_io, ATA_COUNT);          
-       DELAY(1);
-       ATA_OUTB(atadev->channel->r_io, ATA_COUNT,
-                (color & ATA_LED_MASK) | (reg & ~ATA_LED_MASK));         
-       DELAY(1);
-       ata_enclosure_end(atadev);
-    }
-}
-
-static void
-ata_change_mode(struct ata_device *atadev, int mode)
-{
-    int umode, wmode, pmode;
-
-    umode = ata_umode(atadev->param);
-    wmode = ata_wmode(atadev->param);
-    pmode = ata_pmode(atadev->param);
-    
-    switch (mode & ATA_DMA_MASK) {
-    case ATA_UDMA:
-       if ((mode & ATA_MODE_MASK) < umode)
-           umode = mode & ATA_MODE_MASK;
-       break;
-    case ATA_WDMA:
-       if ((mode & ATA_MODE_MASK) < wmode)
-           wmode = mode & ATA_MODE_MASK;
-       umode = -1;
-       break;
-    default:
-       if (((mode & ATA_MODE_MASK) - ATA_PIO0) < pmode)
-           pmode = (mode & ATA_MODE_MASK) - ATA_PIO0;
-       umode = -1;
-       wmode = -1;
-    }
-
-    crit_enter();      /* interlock non-atomic channel lock */
-    ATA_SLEEPLOCK_CH(atadev->channel, ATA_ACTIVE);
-    ata_dmainit(atadev, pmode, wmode, umode);
-    ATA_UNLOCK_CH(atadev->channel);
-    crit_exit();
-    ata_start(atadev->channel); /* XXX SOS */
-}
-
-int
-ata_printf(struct ata_channel *ch, int device, const char * fmt, ...)
-{
-    __va_list ap;
-    int ret;
-
-    if (device == -1)
-       ret = kprintf("ata%d: ", device_get_unit(ch->dev));
-    else {
-       if (ch->device[ATA_DEV(device)].name)
-           ret = kprintf("%s: ", ch->device[ATA_DEV(device)].name);
-       else
-           ret = kprintf("ata%d-%s: ", device_get_unit(ch->dev),
-                        (device == ATA_MASTER) ? "master" : "slave");
-    }
-    __va_start(ap, fmt);
-    ret += kvprintf(fmt, ap);
-    __va_end(ap);
-    return ret;
-}
-
-int
-ata_prtdev(struct ata_device *atadev, const char * fmt, ...)
-{
-    __va_list ap;
-    int ret;
-
-    if (atadev->name)
-       ret = kprintf("%s: ", atadev->name);
-    else
-       ret = kprintf("ata%d-%s: ", device_get_unit(atadev->channel->dev),
-                    (atadev->unit == ATA_MASTER) ? "master" : "slave");
-    __va_start(ap, fmt);
-    ret += kvprintf(fmt, ap);
-    __va_end(ap);
-    return ret;
-}
-
-void
-ata_set_name(struct ata_device *atadev, char *name, int lun)
-{
-    atadev->name = kmalloc(strlen(name) + 4, M_ATA, M_INTWAIT);
-    ksprintf(atadev->name, "%s%d", name, lun);
-}
-
-void
-ata_free_name(struct ata_device *atadev)
-{
-    if (atadev->name)
-       kfree(atadev->name, M_ATA);
-    atadev->name = NULL;
-}
-    
-int
-ata_get_lun(u_int32_t *map)
-{
-    int lun = ffs(~*map) - 1;
-
-    *map |= (1 << lun);
-    return lun;
-}
-
-int
-ata_test_lun(u_int32_t *map, int lun)
-{
-    return (*map & (1 << lun));
-}
-
-void
-ata_free_lun(u_int32_t *map, int lun)
-{
-    *map &= ~(1 << lun);
-}
-char *
-ata_mode2str(int mode)
-{
-    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_DMA: return "BIOSDMA";
-    case ATA_WDMA2: return "WDMA2";
-    case ATA_UDMA2: return "UDMA33";
-    case ATA_UDMA4: return "UDMA66";
-    case ATA_UDMA5: return "UDMA100";
-    case ATA_UDMA6: return "UDMA133";
-    default: return "???";
-    }
-}
-
-int
-ata_pmode(struct ata_params *ap)
-{
-    if (ap->atavalid & ATA_FLAG_64_70) {
-       if (ap->apiomodes & 2)
-           return 4;
-       if (ap->apiomodes & 1) 
-           return 3;
-    }  
-    if (ap->retired_piomode == 2)
-       return 2;
-    if (ap->retired_piomode == 1)
-       return 1;
-    if (ap->retired_piomode == 0)
-       return 0;
-    return -1; 
-} 
-
-int
-ata_wmode(struct ata_params *ap)
-{
-    if (ap->mwdmamodes & 0x04)
-       return 2;
-    if (ap->mwdmamodes & 0x02)
-       return 1;
-    if (ap->mwdmamodes & 0x01)
-       return 0;
-    return -1;
-}
-
-int
-ata_umode(struct ata_params *ap)
-{
-    if (ap->atavalid & ATA_FLAG_88) {
-       if (ap->udmamodes & 0x40)
-           return 6;
-       if (ap->udmamodes & 0x20)
-           return 5;
-       if (ap->udmamodes & 0x10)
-           return 4;
-       if (ap->udmamodes & 0x08)
-           return 3;
-       if (ap->udmamodes & 0x04)
-           return 2;
-       if (ap->udmamodes & 0x02)
-           return 1;
-       if (ap->udmamodes & 0x01)
-           return 0;
-    }
-    return -1;
-}
-
-static void
-bswap(int8_t *buf, int len) 
-{
-    u_int16_t *ptr = (u_int16_t*)(buf + len);
-
-    while (--ptr >= (u_int16_t*)buf)
-       *ptr = ntohs(*ptr);
-} 
-
-static void
-btrim(int8_t *buf, int len)
-{ 
-    int8_t *ptr;
-
-    for (ptr = buf; ptr < buf+len; ++ptr) 
-       if (!*ptr)
-           *ptr = ' ';
-    for (ptr = buf + len - 1; ptr >= buf && *ptr == ' '; --ptr)
-       *ptr = 0;
-}
-
-static void
-bpack(int8_t *src, int8_t *dst, int len)
-{
-    int i, j, blank;
-
-    for (i = j = blank = 0 ; i < len; i++) {
-       if (blank && src[i] == ' ') continue;
-       if (blank && src[i] != ' ') {
-           dst[j++] = src[i];
-           blank = 0;
-           continue;
-       }
-       if (src[i] == ' ') {
-           blank = 1;
-           if (i == 0)
-               continue;
-       }
-       dst[j++] = src[i];
-    }
-    if (j < len) 
-       dst[j] = 0x00;
-}
-
-static void
-ata_init(void)
-{
-    make_dev(&ata_ops, 0, UID_ROOT, GID_OPERATOR, 0600, "ata");
-}
-
-SYSINIT(atadev, SI_SUB_DRIVERS, SI_ORDER_SECOND, ata_init, NULL)
diff --git a/sys/dev/disk/ata/ata-all.h b/sys/dev/disk/ata/ata-all.h
deleted file mode 100644 (file)
index dbc026e..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-all.h,v 1.26.2.12 2003/01/30 07:19:59 sos Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-all.h,v 1.8 2006/10/12 04:02:37 y0netan1 Exp $
- */
-
-#ifndef _SYS_MPIPE_H_
-#include <sys/mpipe.h>
-#endif
-
-/* ATA register defines */
-#define ATA_DATA                       0x00    /* data register */
-#define ATA_ERROR                      0x01    /* (R) error register */
-#define                ATA_E_NM                0x02    /* no media */
-#define                ATA_E_ABORT             0x04    /* command aborted */
-#define                ATA_E_MCR               0x08    /* media change request */
-#define                ATA_E_IDNF              0x10    /* ID not found */
-#define                ATA_E_MC                0x20    /* media changed */
-#define                ATA_E_UNC               0x40    /* uncorrectable data */
-#define                ATA_E_ICRC              0x80    /* UDMA crc error */
-
-#define ATA_FEATURE                    0x01    /* (W) feature register */
-#define                ATA_F_DMA               0x01    /* enable DMA */
-#define                ATA_F_OVL               0x02    /* enable overlap */
-
-#define ATA_COUNT                      0x02    /* (W) sector count */
-#define ATA_IREASON                    0x02    /* (R) interrupt reason */
-#define                ATA_I_CMD               0x01    /* cmd (1) | data (0) */
-#define                ATA_I_IN                0x02    /* read (1) | write (0) */
-#define                ATA_I_RELEASE           0x04    /* released bus (1) */
-#define                ATA_I_TAGMASK           0xf8    /* tag mask */
-
-#define ATA_SECTOR                     0x03    /* sector # */
-#define ATA_CYL_LSB                    0x04    /* cylinder# LSB */
-#define ATA_CYL_MSB                    0x05    /* cylinder# MSB */
-#define ATA_DRIVE                      0x06    /* Sector/Drive/Head register */
-#define                ATA_D_LBA               0x40    /* use LBA addressing */
-#define                ATA_D_IBM               0xa0    /* 512 byte sectors, ECC */
-
-#define ATA_CMD                                0x07    /* command register */
-#define                ATA_C_NOP               0x00    /* NOP command */
-#define                    ATA_C_F_FLUSHQUEUE  0x00    /* flush queued cmd's */
-#define                    ATA_C_F_AUTOPOLL    0x01    /* start autopoll function */
-#define                ATA_C_ATAPI_RESET       0x08    /* reset ATAPI device */
-#define                ATA_C_READ              0x20    /* read command */
-#define                ATA_C_READ48            0x24    /* read command */
-#define                ATA_C_READ_DMA48        0x25    /* read w/DMA command */
-#define                ATA_C_READ_DMA_QUEUED48 0x26    /* read w/DMA QUEUED command */
-#define                ATA_C_READ_MUL48        0x29    /* read multi command */
-#define                ATA_C_WRITE             0x30    /* write command */
-#define                ATA_C_WRITE48           0x34    /* write command */
-#define                ATA_C_WRITE_DMA48       0x35    /* write w/DMA command */
-#define                ATA_C_WRITE_DMA_QUEUED48 0x36   /* write w/DMA QUEUED command */
-#define                ATA_C_WRITE_MUL48       0x39    /* write multi command */
-#define                ATA_C_PACKET_CMD        0xa0    /* packet command */
-#define                ATA_C_ATAPI_IDENTIFY    0xa1    /* get ATAPI params*/
-#define                ATA_C_SERVICE           0xa2    /* service command */
-#define                ATA_C_READ_MUL          0xc4    /* read multi command */
-#define                ATA_C_WRITE_MUL         0xc5    /* write multi command */
-#define                ATA_C_SET_MULTI         0xc6    /* set multi size command */
-#define                ATA_C_READ_DMA_QUEUED   0xc7    /* read w/DMA QUEUED command */
-#define                ATA_C_READ_DMA          0xc8    /* read w/DMA command */
-#define                ATA_C_WRITE_DMA         0xca    /* write w/DMA command */
-#define                ATA_C_WRITE_DMA_QUEUED  0xcc    /* write w/DMA QUEUED command */
-#define                ATA_C_SLEEP             0xe6    /* sleep command */
-#define                ATA_C_FLUSHCACHE        0xe7    /* flush cache to disk */
-#define                ATA_C_FLUSHCACHE48      0xea    /* flush cache to disk */
-#define                ATA_C_ATA_IDENTIFY      0xec    /* get ATA params */
-#define                ATA_C_SETFEATURES       0xef    /* features command */
-#define                    ATA_C_F_SETXFER     0x03    /* set transfer mode */
-#define                    ATA_C_F_ENAB_WCACHE 0x02    /* enable write cache */
-#define                    ATA_C_F_DIS_WCACHE  0x82    /* disable write cache */
-#define                    ATA_C_F_ENAB_RCACHE 0xaa    /* enable readahead cache */
-#define                    ATA_C_F_DIS_RCACHE  0x55    /* disable readahead cache */
-#define                    ATA_C_F_ENAB_RELIRQ 0x5d    /* enable release interrupt */
-#define                    ATA_C_F_DIS_RELIRQ  0xdd    /* disable release interrupt */
-#define                    ATA_C_F_ENAB_SRVIRQ 0x5e    /* enable service interrupt */
-#define                    ATA_C_F_DIS_SRVIRQ  0xde    /* disable service interrupt */
-
-#define ATA_STATUS                     0x07    /* status register */
-#define                ATA_S_ERROR             0x01    /* error */
-#define                ATA_S_INDEX             0x02    /* index */
-#define                ATA_S_CORR              0x04    /* data corrected */
-#define                ATA_S_DRQ               0x08    /* data request */
-#define                ATA_S_DSC               0x10    /* drive seek completed */
-#define                ATA_S_SERVICE           0x10    /* drive needs service */
-#define                ATA_S_DWF               0x20    /* drive write fault */
-#define                ATA_S_DMA               0x20    /* DMA ready */
-#define                ATA_S_READY             0x40    /* drive ready */
-#define                ATA_S_BUSY              0x80    /* busy */
-
-#define ATA_ALTSTAT                    0x00    /* alternate status register */
-#define ATA_ALTOFFSET                  0x206   /* alternate registers offset */
-#define ATA_PCCARD_ALTOFFSET           0x0e    /* do for PCCARD devices */
-#define                ATA_A_IDS               0x02    /* disable interrupts */
-#define                ATA_A_RESET             0x04    /* RESET controller */
-#define                ATA_A_4BIT              0x08    /* 4 head bits */
-
-/* misc defines */
-#define ATA_PRIMARY                    0x1f0
-#define ATA_SECONDARY                  0x170
-#define ATA_IOSIZE                     0x08
-#define ATA_ALTIOSIZE                  0x01
-#define ATA_BMIOSIZE                   0x08
-#define ATA_OP_FINISHED                        0x00
-#define ATA_OP_CONTINUES               0x01
-#define ATA_IOADDR_RID                 0
-#define ATA_ALTADDR_RID                        1
-#define ATA_BMADDR_RID                 2
-#define ATA_IRQ_RID                    0
-#define ATA_DEV(device)                        ((device == ATA_MASTER) ? 0 : 1)
-
-/* busmaster DMA related defines */
-#define ATA_DMA_ENTRIES                        256
-#define ATA_DMA_EOT                    0x80000000
-
-#define ATA_BMCMD_PORT                 0x00
-#define                ATA_BMCMD_START_STOP    0x01
-#define                ATA_BMCMD_WRITE_READ    0x08
-
-#define ATA_BMDEVSPEC_0                        0x01
-
-#define ATA_BMSTAT_PORT                        0x02
-#define                ATA_BMSTAT_ACTIVE       0x01
-#define                ATA_BMSTAT_ERROR        0x02
-#define                ATA_BMSTAT_INTERRUPT    0x04
-#define                ATA_BMSTAT_MASK         0x07
-#define                ATA_BMSTAT_DMA_MASTER   0x20
-#define                ATA_BMSTAT_DMA_SLAVE    0x40
-#define                ATA_BMSTAT_DMA_SIMPLEX  0x80
-
-#define ATA_BMDEVSPEC_1                        0x03
-#define ATA_BMDTP_PORT                 0x04
-
-/* structure for holding DMA address data */
-struct ata_dmaentry {
-    u_int32_t base;
-    u_int32_t count;
-};  
-
-struct ata_dmastate {
-    bus_dma_tag_t      ddmatag;        /* data DMA tag */
-    bus_dmamap_t       ddmamap;        /* data DMA map */
-    bus_dma_tag_t      cdmatag;        /* control DMA tag */
-    bus_dmamap_t       cdmamap;        /* control DMA map */
-    struct ata_dmaentry        *dmatab;        /* DMA transfer table */
-    bus_addr_t         mdmatab;        /* bus address of dmatab */
-    int                        flags;          /* debugging    */
-#define        ATA_DS_ACTIVE   0x01            /* debugging */
-#define        ATA_DS_READ     0x02            /* transaction is a read */
-};
-
-/* structure describing an ATA/ATAPI device */
-struct ata_device {
-    struct ata_channel         *channel;
-    int                                unit;           /* unit number */
-#define ATA_MASTER                     0x00
-#define ATA_SLAVE                      0x10
-
-    char                       *name;          /* device name */
-    struct ata_params          *param;         /* ata param structure */
-    void                       *driver;        /* ptr to driver for device */
-    int                                flags;
-#define                ATA_D_USE_CHS           0x0001
-#define                ATA_D_DETACHING         0x0002
-#define                ATA_D_MEDIA_CHANGED     0x0004
-#define                ATA_D_ENC_PRESENT       0x0008
-
-    int                                mode;           /* transfermode */
-    int                                cmd;            /* last cmd executed */
-    void                       *result;        /* misc data */
-    struct ata_dmastate                dmastate;
-};
-
-/* structure describing an ATA channel */
-struct ata_channel {
-    struct device              *dev;           /* device handle */
-    int                                unit;           /* channel number */
-    struct resource            *r_io;          /* io addr resource handle */
-    struct resource            *r_altio;       /* altio addr resource handle */
-    struct resource            *r_bmio;        /* bmio addr resource handle */
-    struct resource            *r_irq;         /* interrupt of this channel */
-    void                       *ih;            /* interrupt handle */
-    int (*intr_func)(struct ata_channel *);    /* interrupt function */
-    u_int32_t                  chiptype;       /* pciid of controller chip */
-    u_int32_t                  alignment;      /* dma engine min alignment */
-    int                                flags;          /* controller flags */
-#define                ATA_NO_SLAVE            0x01
-#define                ATA_USE_16BIT           0x02
-#define                ATA_ATAPI_DMA_RO        0x04
-#define                ATA_QUEUED              0x08
-#define                ATA_DMA_ACTIVE          0x10
-
-    struct ata_device          device[2];      /* devices on this channel */
-#define                MASTER                  0x00
-#define                SLAVE                   0x01
-
-    int                                devices;        /* what is present */
-#define                ATA_ATA_MASTER          0x01
-#define                ATA_ATA_SLAVE           0x02
-#define                ATA_ATAPI_MASTER        0x04
-#define                ATA_ATAPI_SLAVE         0x08
-
-    u_int8_t                   status;         /* last controller status */
-    u_int8_t                   error;          /* last controller error */
-    int                                active;         /* active processing request */
-#define                ATA_IDLE                0x0000
-#define                ATA_IMMEDIATE           0x0001
-#define                ATA_WAIT_INTR           0x0002
-#define                ATA_WAIT_READY          0x0004
-#define                ATA_WAIT_MASK           0x0007
-#define                ATA_ACTIVE              0x0010
-#define                ATA_ACTIVE_ATA          0x0020
-#define                ATA_ACTIVE_ATAPI        0x0040
-#define                ATA_CONTROL             0x0080
-
-    TAILQ_HEAD(, ad_request)   ata_queue;      /* head of ATA queue */
-    TAILQ_HEAD(, atapi_request) atapi_queue;   /* head of ATAPI queue */
-    void                       *running;       /* currently running request */
-    struct malloc_pipe         req_mpipe;      /* request allocations */
-    struct malloc_pipe         dma_mpipe;      /* dma allocations */
-};
-
-/* disk bay/enclosure related */
-#define                ATA_LED_OFF             0x00
-#define                ATA_LED_RED             0x01
-#define                ATA_LED_GREEN           0x02
-#define                ATA_LED_ORANGE          0x03
-#define                ATA_LED_MASK            0x03
-
-/* externs */
-extern devclass_t ata_devclass;
-extern int     ata_mpipe_size;
-/* public prototypes */
-int ata_probe(device_t);
-int ata_attach(device_t);
-int ata_detach(device_t);
-int ata_resume(device_t);
-int ata_suspend(device_t);
-
-void ata_start(struct ata_channel *);
-void ata_reset(struct ata_channel *);
-int ata_reinit(struct ata_channel *);
-int ata_wait(struct ata_device *, u_int8_t);
-int ata_command(struct ata_device *, u_int8_t, u_int64_t, u_int16_t, u_int8_t, int);
-void ata_enclosure_leds(struct ata_device *, u_int8_t);
-void ata_enclosure_print(struct ata_device *);
-int ata_printf(struct ata_channel *, int, const char *, ...) __printflike(3, 4);
-int ata_prtdev(struct ata_device *, const char *, ...) __printflike(2, 3);
-void ata_set_name(struct ata_device *, char *, int);
-void ata_free_name(struct ata_device *);
-int ata_get_lun(u_int32_t *);
-int ata_test_lun(u_int32_t *, int);
-void ata_free_lun(u_int32_t *, int);
-char *ata_mode2str(int);
-int ata_pmode(struct ata_params *);
-int ata_wmode(struct ata_params *);
-int ata_umode(struct ata_params *);
-int ata_find_dev(device_t, u_int32_t, u_int32_t);
-
-int ata_dmaalloc(struct ata_device *, int);
-void ata_dmafree(struct ata_device *);
-void ata_dmafreetags(struct ata_channel *);
-void ata_dmainit(struct ata_device *, int, int, int);
-int ata_dmasetup(struct ata_device *, caddr_t, int);
-int ata_dmastart(struct ata_device *, caddr_t, int32_t, int);
-int ata_dmastatus(struct ata_channel *);
-int ata_dmadone(struct ata_device *);
-
-/* macros for locking a channel */
-#define ATA_LOCK_CH(ch, value)\
-       (((ch)->active == ATA_IDLE) ? ((ch)->active = value) : 0)
-
-#define ATA_SLEEPLOCK_CH(ch, value) {\
-       while ((ch)->active != ATA_IDLE)\
-           tsleep((caddr_t)&(ch), 0, "atalck", 1);\
-       (ch)->active = value; }
-
-#define ATA_FORCELOCK_CH(ch, value) \
-       (ch)->active = value
-
-#define ATA_UNLOCK_CH(ch) \
-       (ch)->active = ATA_IDLE
-
-/* macros to hide busspace uglyness */
-#define ATA_INB(res, offset) \
-       bus_space_read_1(rman_get_bustag((res)), \
-                        rman_get_bushandle((res)), (offset))
-#define ATA_INW(res, offset) \
-       bus_space_read_2(rman_get_bustag((res)), \
-                        rman_get_bushandle((res)), (offset))
-#define ATA_INL(res, offset) \
-       bus_space_read_4(rman_get_bustag((res)), \
-                        rman_get_bushandle((res)), (offset))
-#define ATA_INSW(res, offset, addr, count) \
-       bus_space_read_multi_2(rman_get_bustag((res)), \
-                              rman_get_bushandle((res)), \
-                              (offset), (addr), (count))
-#define ATA_INSL(res, offset, addr, count) \
-       bus_space_read_multi_4(rman_get_bustag((res)), \
-                              rman_get_bushandle((res)), \
-                              (offset), (addr), (count))
-#define ATA_OUTB(res, offset, value) \
-       bus_space_write_1(rman_get_bustag((res)), \
-                         rman_get_bushandle((res)), (offset), (value))
-#define ATA_OUTW(res, offset, value) \
-       bus_space_write_2(rman_get_bustag((res)), \
-                         rman_get_bushandle((res)), (offset), (value))
-#define ATA_OUTL(res, offset, value) \
-       bus_space_write_4(rman_get_bustag((res)), \
-                         rman_get_bushandle((res)), (offset), (value))
-#define ATA_OUTSW(res, offset, addr, count) \
-       bus_space_write_multi_2(rman_get_bustag((res)), \
-                               rman_get_bushandle((res)), \
-                               (offset), (addr), (count))
-#define ATA_OUTSL(res, offset, addr, count) \
-       bus_space_write_multi_4(rman_get_bustag((res)), \
-                               rman_get_bushandle((res)), \
-                               (offset), (addr), (count))
diff --git a/sys/dev/disk/ata/ata-card.c b/sys/dev/disk/ata/ata-card.c
deleted file mode 100644 (file)
index d9aadae..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-card.c,v 1.4.2.1 2002/03/18 08:37:33 sos Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/malloc.h>
-#include <sys/rman.h>
-
-#include <machine/stdarg.h>
-#include "ata-all.h"
-
-#include <bus/pccard/pccard_cis.h>
-#include <bus/pccard/pccardreg.h>
-#include <bus/pccard/pccardvar.h>
-#include <bus/pccard/pccarddevs.h>
-
-static const struct pccard_product ata_pccard_products[] = {
-       PCMCIA_CARD(FREECOM, PCCARDIDE, 0),
-       PCMCIA_CARD(EXP, EXPMULTIMEDIA, 0),
-       PCMCIA_CARD(IODATA3, CBIDE2, 0),
-       PCMCIA_CARD(OEM2, CDROM1, 0),
-       PCMCIA_CARD(OEM2, IDE, 0),
-       PCMCIA_CARD(PANASONIC, KXLC005, 0),
-       PCMCIA_CARD(TEAC, IDECARDII, 0),
-       {NULL}
-};
-
-static int
-ata_pccard_match(device_t dev)
-{
-    const struct pccard_product *pp;
-    u_int32_t fcn = PCCARD_FUNCTION_UNSPEC;
-
-    fcn = pccard_get_function_number(dev);
-
-    /* if it says its a disk we should register it */
-    if (fcn == PCCARD_FUNCTION_DISK)
-       return (0);
-
-    /* match other devices here, primarily cdrom/dvd rom */
-    if ((pp = pccard_product_lookup(dev, ata_pccard_products,
-                                   sizeof(ata_pccard_products[0]), NULL))) {
-       if (pp->pp_name)
-           device_set_desc(dev, pp->pp_name);
-       return (0);
-    }
-    return (ENXIO);
-}
-
-static int
-ata_pccard_probe(device_t dev)
-{
-    struct ata_channel *ch = device_get_softc(dev);
-    struct resource *io;
-    int rid, len, start, end;
-    u_long tmp;
-
-    /* allocate the io range to get start and length */
-    rid = ATA_IOADDR_RID;
-    len = bus_get_resource_count(dev, SYS_RES_IOPORT, rid);
-    io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
-                           ATA_IOSIZE, RF_ACTIVE);
-    if (!io)
-       return ENOMEM;
-
-    /* reallocate the io address to only cover the io ports */
-    start = rman_get_start(io);
-    end = start + ATA_IOSIZE - 1;
-    bus_release_resource(dev, SYS_RES_IOPORT, rid, io);
-    io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
-                           start, end, ATA_IOSIZE, RF_ACTIVE);
-    bus_release_resource(dev, SYS_RES_IOPORT, rid, io);
-
-    /* 
-     * if we got more than the default ATA_IOSIZE ports, this is likely
-     * a pccard system where the altio ports are located at offset 14
-     * otherwise its the normal altio offset
-     */
-    if (bus_get_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID, &tmp, &tmp)) {
-       if (len > ATA_IOSIZE) {
-           bus_set_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID,
-                            start + ATA_PCCARD_ALTOFFSET, ATA_ALTIOSIZE, -1);
-       }
-       else {
-           bus_set_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID, 
-                            start + ATA_ALTOFFSET, ATA_ALTIOSIZE, -1);
-       }
-    }
-    else
-       return ENOMEM;
-
-    ch->unit = 0;
-    ch->flags |= (ATA_USE_16BIT | ATA_NO_SLAVE);
-    return ata_probe(dev);
-}
-
-static device_method_t ata_pccard_methods[] = {
-    /* device interface */
-    DEVMETHOD(device_probe,    pccard_compat_probe),
-    DEVMETHOD(device_attach,   pccard_compat_attach),
-    DEVMETHOD(device_detach,   ata_detach),
-
-    /* Card interface */
-    DEVMETHOD(card_compat_match,       ata_pccard_match),
-    DEVMETHOD(card_compat_probe,       ata_pccard_probe),
-    DEVMETHOD(card_compat_attach,      ata_attach),
-
-    { 0, 0 }
-};
-
-static driver_t ata_pccard_driver = {
-    "ata",
-    ata_pccard_methods,
-    sizeof(struct ata_channel),
-};
-
-DRIVER_MODULE(ata, pccard, ata_pccard_driver, ata_devclass, NULL, NULL);
diff --git a/sys/dev/disk/ata/ata-disk.c b/sys/dev/disk/ata/ata-disk.c
deleted file mode 100644 (file)
index e87898d..0000000
+++ /dev/null
@@ -1,988 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-disk.c,v 1.60.2.24 2003/01/30 07:19:59 sos Exp $
- */
-
-#include "opt_ata.h"
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/ata.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/buf.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/disk.h>
-#include <sys/devicestat.h>
-#include <sys/cons.h>
-#include <sys/sysctl.h>
-#include <sys/syslog.h>
-#include <sys/rman.h>
-#include <sys/proc.h>
-#include <sys/buf2.h>
-#include <sys/thread2.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-
-#include <machine/md_var.h>
-#include <machine/clock.h>
-
-#include "ata-all.h"
-#include "ata-disk.h"
-#include "ata-raid.h"
-
-/* device structures */
-static d_open_t                adopen;
-static d_close_t       adclose;
-static d_strategy_t    adstrategy;
-static d_dump_t                addump;
-
-static struct dev_ops ad_ops = {
-       { "ad", 0, D_DISK },
-       .d_open =       adopen,
-       .d_close =      adclose,
-       .d_read =       physread,
-       .d_write =      physwrite,
-       .d_strategy =   adstrategy,
-       .d_dump =       addump,
-};
-
-/* prototypes */
-static void ad_requeue(struct ata_channel *, struct ad_request *);
-static void ad_invalidatequeue(struct ad_softc *, struct ad_request *);
-static int ad_tagsupported(struct ad_softc *);
-static void ad_timeout(struct ad_request *);
-static void ad_free(struct ad_request *);
-static int ad_version(u_int16_t);
-
-/* misc defines */
-#define AD_MAX_RETRIES 3
-
-/* internal vars */
-static u_int32_t adp_lun_map = 0;
-static int ata_dma = 1;
-static int ata_wc = 1;
-static int ata_tags = 0; 
-TUNABLE_INT("hw.ata.ata_dma", &ata_dma);
-TUNABLE_INT("hw.ata.wc", &ata_wc);
-TUNABLE_INT("hw.ata.tags", &ata_tags);
-static MALLOC_DEFINE(M_AD, "AD driver", "ATA disk driver");
-
-/* sysctl vars */
-SYSCTL_DECL(_hw_ata);
-SYSCTL_INT(_hw_ata, OID_AUTO, ata_dma, CTLFLAG_RD, &ata_dma, 0,
-          "ATA disk DMA mode control");
-SYSCTL_INT(_hw_ata, OID_AUTO, wc, CTLFLAG_RD, &ata_wc, 0,
-          "ATA disk write caching");
-SYSCTL_INT(_hw_ata, OID_AUTO, tags, CTLFLAG_RD, &ata_tags, 0,
-          "ATA disk tagged queuing support");
-
-void
-ad_attach(struct ata_device *atadev, int alreadylocked)
-{
-    struct ad_softc *adp;
-    struct disk_info info;
-    cdev_t dev;
-
-    adp = kmalloc(sizeof(struct ad_softc), M_AD, M_WAITOK | M_ZERO);
-
-    KKASSERT(atadev->channel->req_mpipe.max_count != 0);
-
-    adp->device = atadev;
-#ifdef ATA_STATIC_ID
-    adp->lun = (device_get_unit(atadev->channel->dev)<<1)+ATA_DEV(atadev->unit);
-#else
-    adp->lun = ata_get_lun(&adp_lun_map);
-#endif
-    ata_set_name(atadev, "ad", adp->lun);
-    adp->heads = atadev->param->heads;
-    adp->sectors = atadev->param->sectors;
-    adp->total_secs = atadev->param->cylinders * adp->heads * adp->sectors;    
-    bioq_init(&adp->bio_queue);
-
-    /* does this device need oldstyle CHS addressing */
-    if (!ad_version(atadev->param->version_major) || 
-       !(atadev->param->atavalid & ATA_FLAG_54_58) || !atadev->param->lba_size)
-       adp->flags |= AD_F_CHS_USED;
-
-    /* use the 28bit LBA size if valid */
-    if (atadev->param->cylinders == 16383 &&
-       adp->total_secs < atadev->param->lba_size)
-       adp->total_secs = atadev->param->lba_size;
-
-    /* use the 48bit LBA size if valid */
-    if (atadev->param->support.address48 &&
-       atadev->param->lba_size48 > 268435455)
-       adp->total_secs = atadev->param->lba_size48;
-    
-    if (!alreadylocked)
-       ATA_SLEEPLOCK_CH(atadev->channel, ATA_CONTROL);
-    /* use multiple sectors/interrupt if device supports it */
-    adp->transfersize = DEV_BSIZE;
-    if (ad_version(atadev->param->version_major)) {
-       int secsperint = max(1, min(atadev->param->sectors_intr, 16));
-
-       if (!ata_command(atadev, ATA_C_SET_MULTI, 0, secsperint,
-                        0, ATA_WAIT_INTR) && !ata_wait(atadev, 0))
-       adp->transfersize *= secsperint;
-    }
-
-    /* enable read caching if not default on device */
-    if (ata_command(atadev, ATA_C_SETFEATURES,
-                   0, 0, ATA_C_F_ENAB_RCACHE, ATA_WAIT_INTR))
-       ata_prtdev(atadev, "enabling readahead cache failed\n");
-
-    /* enable write caching if allowed and not default on device */
-    if (ata_wc || (ata_tags && ad_tagsupported(adp))) {
-       if (ata_command(atadev, ATA_C_SETFEATURES,
-                       0, 0, ATA_C_F_ENAB_WCACHE, ATA_WAIT_INTR))
-           ata_prtdev(atadev, "enabling write cache failed\n");
-    }
-    else {
-       if (ata_command(atadev, ATA_C_SETFEATURES,
-                       0, 0, ATA_C_F_DIS_WCACHE, ATA_WAIT_INTR))
-           ata_prtdev(atadev, "disabling write cache failed\n");
-    }
-
-    /* use DMA if allowed and if drive/controller supports it */
-    if (ata_dma)
-       ata_dmainit(atadev, ata_pmode(atadev->param), 
-                   ata_wmode(atadev->param), ata_umode(atadev->param));
-    else
-       ata_dmainit(atadev, ata_pmode(atadev->param), -1, -1);
-
-    /* use tagged queueing if allowed and supported */
-    if (ata_tags && ad_tagsupported(adp)) {
-       adp->num_tags = atadev->param->queuelen;
-       adp->flags |= AD_F_TAG_ENABLED;
-       adp->device->channel->flags |= ATA_QUEUED;
-       if (ata_command(atadev, ATA_C_SETFEATURES,
-                       0, 0, ATA_C_F_DIS_RELIRQ, ATA_WAIT_INTR))
-           ata_prtdev(atadev, "disabling release interrupt failed\n");
-       if (ata_command(atadev, ATA_C_SETFEATURES,
-                       0, 0, ATA_C_F_DIS_SRVIRQ, ATA_WAIT_INTR))
-           ata_prtdev(atadev, "disabling service interrupt failed\n");
-    }
-
-    ATA_UNLOCK_CH(atadev->channel);
-
-    devstat_add_entry(&adp->stats, "ad", adp->lun, DEV_BSIZE,
-                     DEVSTAT_NO_ORDERED_TAGS,
-                     DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE,
-                     DEVSTAT_PRIORITY_DISK);
-
-    dev = disk_create(adp->lun, &adp->disk, &ad_ops);
-    dev->si_drv1 = adp;
-    dev->si_iosize_max = 256 * DEV_BSIZE;
-    adp->dev = dev;
-
-    /* construct the disk_info */
-    bzero(&info, sizeof(info));
-    info.d_media_blksize = DEV_BSIZE;
-    info.d_media_blocks = adp->total_secs;
-    info.d_nheads = adp->heads;
-    info.d_secpertrack = adp->sectors;
-    info.d_ncylinders = adp->total_secs / 
-                        (info.d_nheads * info.d_secpertrack);
-    info.d_secpercyl = info.d_secpertrack * info.d_nheads;
-    disk_setdiskinfo(&adp->disk, &info);
-
-    atadev->driver = adp;
-    atadev->flags = 0;
-
-    /* if this disk belongs to an ATA RAID dont print the probe */
-    if (ata_raiddisk_attach(adp))
-       adp->flags |= AD_F_RAID_SUBDISK;
-    else {
-       if (atadev->driver) {
-           ad_print(adp);
-           ata_enclosure_print(atadev);
-       }
-    }
-}
-
-void
-ad_detach(struct ata_device *atadev, int flush) /* get rid of flush XXX SOS */
-{
-    struct ad_softc *adp = atadev->driver;
-    struct ad_request *request;
-    struct bio *bio;
-    struct buf *bp;
-
-    atadev->flags |= ATA_D_DETACHING;
-    ata_prtdev(atadev, "removed from configuration\n");
-    ad_invalidatequeue(adp, NULL);
-    TAILQ_FOREACH(request, &atadev->channel->ata_queue, chain) {
-       if (request->softc != adp)
-           continue;
-       TAILQ_REMOVE(&atadev->channel->ata_queue, request, chain);
-       request->bio->bio_buf->b_error = ENXIO;
-       request->bio->bio_buf->b_flags |= B_ERROR;
-       biodone(request->bio);
-       ad_free(request);
-    }
-    ata_dmafree(atadev);
-    while ((bio = bioq_first(&adp->bio_queue))) {
-       bioq_remove(&adp->bio_queue, bio); 
-       bp = bio->bio_buf;
-       bp->b_error = ENXIO;
-       bp->b_flags |= B_ERROR;
-       biodone(bio);
-    }
-    disk_invalidate(&adp->disk);
-    devstat_remove_entry(&adp->stats);
-    disk_destroy(&adp->disk);
-    if (flush) {
-       if (ata_command(atadev, ATA_C_FLUSHCACHE, 0, 0, 0, ATA_WAIT_READY))
-           ata_prtdev(atadev, "flushing cache on detach failed\n");
-    }
-    if (adp->flags & AD_F_RAID_SUBDISK)
-       ata_raiddisk_detach(adp);
-    ata_free_name(atadev);
-    ata_free_lun(&adp_lun_map, adp->lun);
-    atadev->driver = NULL;
-    atadev->flags = 0;
-    kfree(adp, M_AD);
-}
-
-static int
-adopen(struct dev_open_args *ap)
-{
-    struct ad_softc *adp = ap->a_head.a_dev->si_drv1;
-
-    if (adp->flags & AD_F_RAID_SUBDISK)
-       return EBUSY;
-    return 0;
-}
-
-static int
-adclose(struct dev_close_args *ap)
-{
-    struct ad_softc *adp = ap->a_head.a_dev->si_drv1;
-
-    crit_enter();      /* interlock non-atomic channel lock */
-    ATA_SLEEPLOCK_CH(adp->device->channel, ATA_CONTROL);
-    if (ata_command(adp->device, ATA_C_FLUSHCACHE, 0, 0, 0, ATA_WAIT_READY))
-       ata_prtdev(adp->device, "flushing cache on close failed\n");
-    ATA_UNLOCK_CH(adp->device->channel);
-    crit_exit();
-    return 0;
-}
-
-/*
- * note: always use the passed device rather then bp->b_dev, as the bp
- * may have been translated through several layers.
- */
-static int 
-adstrategy(struct dev_strategy_args *ap)
-{
-    cdev_t dev = ap->a_head.a_dev;
-    struct bio *bio = ap->a_bio;
-    struct buf *bp = bio->bio_buf;
-    struct ad_softc *adp = dev->si_drv1;
-
-    if (adp->device->flags & ATA_D_DETACHING) {
-       bp->b_error = ENXIO;
-       bp->b_flags |= B_ERROR;
-       biodone(bio);
-       return(0);
-    }
-    bio->bio_driver_info = dev;
-    crit_enter();
-    bioqdisksort(&adp->bio_queue, bio);
-    crit_exit();
-    ata_start(adp->device->channel);
-    return(0);
-}
-
-int
-addump(struct dev_dump_args *ap)
-{
-    cdev_t dev = ap->a_head.a_dev;
-    struct ad_softc *adp = dev->si_drv1;
-    struct ad_request request;
-
-    if (!adp)
-       return ENXIO;
-
-    /* force PIO mode for dumps */
-    adp->device->mode = ATA_PIO;
-    ata_reinit(adp->device->channel);
-
-    /* set up request */
-    bzero(&request, sizeof(struct ad_request));
-    request.softc = adp;
-    request.blockaddr = ap->a_offset / DEV_BSIZE;
-    request.bytecount = ap->a_length;
-    request.data = ap->a_virtual;
-    callout_init(&request.callout);
-    while (request.bytecount > 0) {
-        ad_transfer(&request);
-        if (request.flags & ADR_F_ERROR)
-           return EIO;
-        request.donecount += request.currentsize;
-        request.bytecount -= request.currentsize;
-        DELAY(20);
-    }
-
-    if (ata_wait(adp->device, ATA_S_READY | ATA_S_DSC) < 0)
-       ata_prtdev(adp->device, "timeout waiting for final ready\n");
-
-    return 0;
-}
-
-/*
- * Critical section is held when this function is called
- * by ata_start().
- */
-void
-ad_start(struct ata_device *atadev)
-{
-    struct ad_softc *adp = atadev->driver;
-    struct bio *bio = bioq_first(&adp->bio_queue);
-    struct buf *bp;
-    struct ad_request *request;
-    int tag = 0;
-
-    if (bio == NULL)
-       return;
-    bp = bio->bio_buf;
-
-    /* if tagged queueing enabled get next free tag */
-    if (adp->flags & AD_F_TAG_ENABLED) {
-       while (tag <= adp->num_tags && adp->tags[tag])
-           tag++;
-       if (tag > adp->num_tags )
-           return;
-    }
-
-    /*
-     * Allocate a request.  The allocation can only fail if the pipeline
-     * is full, in which case the request will be picked up later when
-     * ad_start() is called after another request completes.
-     */
-    request = mpipe_alloc_nowait(&atadev->channel->req_mpipe);
-    if (request == NULL) {
-       ata_prtdev(atadev, "pipeline full allocating request in ad_start\n");
-       return;
-    }
-
-    KASSERT((bio->bio_offset & DEV_BMASK) == 0,
-           ("bio_offset not on sector boundary %08llx", bio->bio_offset));
-
-    /* setup request */
-    request->softc = adp;
-    request->bio = bio;
-    request->blockaddr = (u_int64_t)(bio->bio_offset >> DEV_BSHIFT);
-    request->bytecount = bp->b_bcount;
-    request->data = bp->b_data;
-    request->tag = tag;
-    callout_init(&request->callout);
-    if (bp->b_cmd == BUF_CMD_READ)
-       request->flags |= ADR_F_READ;
-    if (adp->device->mode >= ATA_DMA) {
-       if (ata_dmaalloc(atadev, M_NOWAIT) != 0) {
-           mpipe_free(&atadev->channel->req_mpipe, request);
-           ata_prtdev(atadev, "pipeline full allocated dmabuf in ad_start\n");
-           /* do not revert to PIO, wait for ad_start after I/O completion */
-           return;
-       }
-    }
-
-    /* insert in tag array */
-    adp->tags[tag] = request;
-
-    /* remove from drive queue */
-    bioq_remove(&adp->bio_queue, bio); 
-
-    /* link onto controller queue */
-    TAILQ_INSERT_TAIL(&atadev->channel->ata_queue, request, chain);
-}
-
-void
-ad_requeue(struct ata_channel *chan, struct ad_request *req)
-{
-        if (req->donecount) {
-                ata_printf(chan, -1,
-                       "WARNING: resetting donecount %u for retry\n",
-                        req->donecount);
-                req->bytecount += req->donecount;
-                req->donecount = 0;
-        }
-        TAILQ_INSERT_HEAD(&chan->ata_queue, req, chain);
-}
-
-int
-ad_transfer(struct ad_request *request)
-{
-    struct ad_softc *adp;
-    u_int64_t lba;
-    u_int32_t count, max_count;
-    u_int8_t cmd;
-    int flags = ATA_IMMEDIATE;
-
-    /* get request params */
-    adp = request->softc;
-
-    /* calculate transfer details */
-    lba = request->blockaddr + (request->donecount / DEV_BSIZE);
-   
-    if (request->donecount == 0) {
-
-       /* start timeout for this transfer */
-       if (dumping) {
-               callout_stop(&request->callout);
-       } else {
-               callout_reset(&request->callout, 10 * hz, 
-                               (void *)ad_timeout, request);
-       }
-
-       /* setup transfer parameters */
-       count = howmany(request->bytecount, DEV_BSIZE);
-       max_count = adp->device->param->support.address48 ? 65536 : 256;
-       if (count > max_count) {
-           ata_prtdev(adp->device,
-                      "count %d size transfers not supported\n", count);
-           count = max_count;
-       }
-
-       if (adp->flags & AD_F_CHS_USED) {
-           int sector = (lba % adp->sectors) + 1;
-           int cylinder = lba / (adp->sectors * adp->heads);
-           int head = (lba % (adp->sectors * adp->heads)) / adp->sectors;
-
-           lba = (sector&0xff) | ((cylinder&0xffff)<<8) | ((head&0xf)<<24);
-           adp->device->flags |= ATA_D_USE_CHS;
-       }
-
-       /* setup first transfer length */
-       request->currentsize = min(request->bytecount, adp->transfersize);
-
-       devstat_start_transaction(&adp->stats);
-
-       /* does this drive & transfer work with DMA ? */
-       request->flags &= ~ADR_F_DMA_USED;
-       if (adp->device->mode >= ATA_DMA &&
-           !ata_dmasetup(adp->device, request->data, request->bytecount)) {
-           request->flags |= ADR_F_DMA_USED;
-           request->currentsize = request->bytecount;
-
-           /* do we have tags enabled ? */
-           if (adp->flags & AD_F_TAG_ENABLED) {
-               cmd = (request->flags & ADR_F_READ) ?
-                   ATA_C_READ_DMA_QUEUED : ATA_C_WRITE_DMA_QUEUED;
-
-               if (ata_command(adp->device, cmd, lba,
-                               request->tag << 3, count, flags)) {
-                   ata_prtdev(adp->device, "error executing command");
-                   goto transfer_failed;
-               }
-               if (ata_wait(adp->device, ATA_S_READY)) {
-                   ata_prtdev(adp->device, "timeout waiting for READY\n");
-                   goto transfer_failed;
-               }
-               adp->outstanding++;
-
-               /* if ATA bus RELEASE check for SERVICE */
-               if (adp->flags & AD_F_TAG_ENABLED &&
-                   ATA_INB(adp->device->channel->r_io, ATA_IREASON) &
-                   ATA_I_RELEASE)
-                   return ad_service(adp, 1);
-           }
-           else {
-               cmd = (request->flags & ADR_F_READ) ?
-                   ATA_C_READ_DMA : ATA_C_WRITE_DMA;
-
-               if (ata_command(adp->device, cmd, lba, count, 0, flags)) {
-                   ata_prtdev(adp->device, "error executing command");
-                   goto transfer_failed;
-               }
-#if 0
-               /*
-                * wait for data transfer phase
-                *
-                * well this should be here acording to specs, but older
-                * promise controllers doesn't like it, they lockup!
-                */
-               if (ata_wait(adp->device, ATA_S_READY | ATA_S_DRQ)) {
-                   ata_prtdev(adp->device, "timeout waiting for data phase\n");
-                   goto transfer_failed;
-               }
-#endif
-           }
-
-           /* start transfer, return and wait for interrupt */
-           ata_dmastart(adp->device, request->data, request->bytecount,
-                       request->flags & ADR_F_READ);
-           return ATA_OP_CONTINUES;
-       }
-
-       /* does this drive support multi sector transfers ? */
-       if (request->currentsize > DEV_BSIZE)
-           cmd = request->flags&ADR_F_READ ? ATA_C_READ_MUL : ATA_C_WRITE_MUL;
-
-       /* just plain old single sector transfer */
-       else
-           cmd = request->flags&ADR_F_READ ? ATA_C_READ : ATA_C_WRITE;
-
-       if (ata_command(adp->device, cmd, lba, count, 0, flags)){
-           ata_prtdev(adp->device, "error executing command");
-           goto transfer_failed;
-       }
-    }
-   
-    /* calculate this transfer length */
-    request->currentsize = min(request->bytecount, adp->transfersize);
-
-    /* if this is a PIO read operation, return and wait for interrupt */
-    if (request->flags & ADR_F_READ)
-       return ATA_OP_CONTINUES;
-
-    /* ready to write PIO data ? */
-    if (ata_wait(adp->device, (ATA_S_READY | ATA_S_DSC | ATA_S_DRQ)) < 0) {
-       ata_prtdev(adp->device, "timeout waiting for DRQ");
-       goto transfer_failed;
-    }
-
-    /* output the data */
-    if (adp->device->channel->flags & ATA_USE_16BIT)
-       ATA_OUTSW(adp->device->channel->r_io, ATA_DATA,
-                 (void *)((uintptr_t)request->data + request->donecount),
-                 request->currentsize / sizeof(int16_t));
-    else
-       ATA_OUTSL(adp->device->channel->r_io, ATA_DATA,
-                 (void *)((uintptr_t)request->data + request->donecount),
-                 request->currentsize / sizeof(int32_t));
-    return ATA_OP_CONTINUES;
-
-transfer_failed:
-    callout_stop(&request->callout);
-    ad_invalidatequeue(adp, request);
-    kprintf(" - resetting\n");
-
-    /* if retries still permit, reinject this request */
-    if (request->retries++ < AD_MAX_RETRIES)
-       ad_requeue(adp->device->channel, request);
-    else {
-       /* retries all used up, return error */
-       request->bio->bio_buf->b_error = EIO;
-       request->bio->bio_buf->b_flags |= B_ERROR;
-       request->bio->bio_buf->b_resid = request->bytecount;
-       devstat_end_transaction_buf(&adp->stats, request->bio->bio_buf);
-       biodone(request->bio);
-       ad_free(request);
-    }
-    ata_reinit(adp->device->channel);
-    return ATA_OP_CONTINUES;
-}
-
-int
-ad_interrupt(struct ad_request *request)
-{
-    struct ad_softc *adp = request->softc;
-    int dma_stat = 0;
-    cdev_t dev;
-
-    /* finish DMA transfer */
-    if (request->flags & ADR_F_DMA_USED)
-       dma_stat = ata_dmadone(adp->device);
-
-    dev = request->bio->bio_driver_info;
-    /* do we have a corrected soft error ? */
-    if (adp->device->channel->status & ATA_S_CORR)
-       diskerr(request->bio, dev,
-               "soft error (ECC corrected)", LOG_PRINTF,
-               request->donecount);
-
-    /* did any real errors happen ? */
-    if ((adp->device->channel->status & ATA_S_ERROR) ||
-       (request->flags & ADR_F_DMA_USED && dma_stat & ATA_BMSTAT_ERROR)) {
-       adp->device->channel->error =
-           ATA_INB(adp->device->channel->r_io, ATA_ERROR);
-       diskerr(request->bio, dev,
-               (adp->device->channel->error & ATA_E_ICRC) ?
-               "UDMA ICRC error" : "hard error", LOG_PRINTF,
-               request->donecount);
-
-       /* if this is a UDMA CRC error, reinject request */
-       if (request->flags & ADR_F_DMA_USED &&
-           adp->device->channel->error & ATA_E_ICRC) {
-           callout_stop(&request->callout);
-           ad_invalidatequeue(adp, request);
-
-           if (request->retries++ < AD_MAX_RETRIES)
-               kprintf(" retrying\n");
-           else {
-               ata_dmainit(adp->device, ata_pmode(adp->device->param), -1, -1);
-               kprintf(" falling back to PIO mode\n");
-           }
-           ad_requeue(adp->device->channel, request);
-           return ATA_OP_FINISHED;
-       }
-
-       /* if using DMA, try once again in PIO mode */
-       if (request->flags & ADR_F_DMA_USED) {
-           callout_stop(&request->callout);
-           ad_invalidatequeue(adp, request);
-           ata_dmainit(adp->device, ata_pmode(adp->device->param), -1, -1);
-           request->flags |= ADR_F_FORCE_PIO;
-           kprintf(" trying PIO mode\n");
-           ad_requeue(adp->device->channel, request);
-           return ATA_OP_FINISHED;
-       }
-
-       request->flags |= ADR_F_ERROR;
-       kprintf(" status=%02x error=%02x\n", 
-              adp->device->channel->status, adp->device->channel->error);
-    }
-
-    /* if we arrived here with forced PIO mode, DMA doesn't work right */
-    if (request->flags & ADR_F_FORCE_PIO && !(request->flags & ADR_F_ERROR))
-       ata_prtdev(adp->device, "DMA problem fallback to PIO mode\n");
-
-    /* if this was a PIO read operation, get the data */
-    if (!(request->flags & ADR_F_DMA_USED) &&
-       (request->flags & (ADR_F_READ | ADR_F_ERROR)) == ADR_F_READ) {
-
-       /* ready to receive data? */
-       if ((adp->device->channel->status & ATA_S_READY) == 0)
-           ata_prtdev(adp->device, "read interrupt arrived early");
-
-       if (ata_wait(adp->device, (ATA_S_READY | ATA_S_DSC | ATA_S_DRQ)) != 0) {
-           ata_prtdev(adp->device, "read error detected (too) late");
-           request->flags |= ADR_F_ERROR;
-       }
-       else {
-           /* data ready, read in */
-           if (adp->device->channel->flags & ATA_USE_16BIT)
-               ATA_INSW(adp->device->channel->r_io, ATA_DATA,
-                        (void*)((uintptr_t)request->data + request->donecount),
-                        request->currentsize / sizeof(int16_t));
-           else
-               ATA_INSL(adp->device->channel->r_io, ATA_DATA,
-                        (void*)((uintptr_t)request->data + request->donecount),
-                        request->currentsize / sizeof(int32_t));
-       }
-    }
-
-    /* finish up transfer */
-    if (request->flags & ADR_F_ERROR) {
-       request->bio->bio_buf->b_error = EIO;
-       request->bio->bio_buf->b_flags |= B_ERROR;
-    } 
-    else {
-       request->bytecount -= request->currentsize;
-       request->donecount += request->currentsize;
-       if (request->bytecount > 0) {
-           ad_transfer(request);
-           return ATA_OP_CONTINUES;
-       }
-    }
-
-    /* disarm timeout for this transfer */
-    callout_stop(&request->callout);
-
-    request->bio->bio_buf->b_resid = request->bytecount;
-
-    devstat_end_transaction_buf(&adp->stats, request->bio->bio_buf);
-    biodone(request->bio);
-    ad_free(request);
-    adp->outstanding--;
-
-    /* check for SERVICE (tagged operations only) */
-    return ad_service(adp, 1);
-}
-
-int
-ad_service(struct ad_softc *adp, int change)
-{
-    /* do we have to check the other device on this channel ? */
-    if (adp->device->channel->flags & ATA_QUEUED && change) {
-       int device = adp->device->unit;
-
-       if (adp->device->unit == ATA_MASTER) {
-           if ((adp->device->channel->devices & ATA_ATA_SLAVE) &&
-               (adp->device->channel->device[SLAVE].driver) &&
-               ((struct ad_softc *) (adp->device->channel->
-                device[SLAVE].driver))->flags & AD_F_TAG_ENABLED)
-               device = ATA_SLAVE;
-       }
-       else {
-           if ((adp->device->channel->devices & ATA_ATA_MASTER) &&
-               (adp->device->channel->device[MASTER].driver) &&
-               ((struct ad_softc *) (adp->device->channel->
-                device[MASTER].driver))->flags & AD_F_TAG_ENABLED)
-               device = ATA_MASTER;
-       }
-       if (device != adp->device->unit &&
-           ((struct ad_softc *)
-            (adp->device->channel->
-             device[ATA_DEV(device)].driver))->outstanding > 0) {
-           ATA_OUTB(adp->device->channel->r_io, ATA_DRIVE, ATA_D_IBM | device);
-           adp = adp->device->channel->device[ATA_DEV(device)].driver;
-           DELAY(10);
-       }
-    }
-    adp->device->channel->status =
-       ATA_INB(adp->device->channel->r_altio, ATA_ALTSTAT);
-    /* do we have a SERVICE request from the drive ? */
-    if (adp->flags & AD_F_TAG_ENABLED &&
-       adp->outstanding > 0 &&
-       adp->device->channel->status & ATA_S_SERVICE) {
-       struct ad_request *request;
-       int tag;
-
-       /* check for error */
-       if (adp->device->channel->status & ATA_S_ERROR) {
-           ata_prtdev(adp->device, "Oops! controller says s=0x%02x e=0x%02x\n",
-                      adp->device->channel->status,
-                      adp->device->channel->error);
-           ad_invalidatequeue(adp, NULL);
-           return ATA_OP_FINISHED;
-       }
-
-       /* issue SERVICE cmd */
-       if (ata_command(adp->device, ATA_C_SERVICE, 0, 0, 0, ATA_IMMEDIATE)) {
-           ata_prtdev(adp->device, "problem executing SERVICE cmd\n");
-           ad_invalidatequeue(adp, NULL);
-           return ATA_OP_FINISHED;
-       }
-
-       /* setup the transfer environment when ready */
-       if (ata_wait(adp->device, ATA_S_READY)) {
-           ata_prtdev(adp->device, "SERVICE timeout tag=%d s=%02x e=%02x\n",
-                      ATA_INB(adp->device->channel->r_io, ATA_COUNT) >> 3,
-                      adp->device->channel->status,
-                      adp->device->channel->error);
-           ad_invalidatequeue(adp, NULL);
-           return ATA_OP_FINISHED;
-       }
-       tag = ATA_INB(adp->device->channel->r_io, ATA_COUNT) >> 3;
-       if (!(request = adp->tags[tag])) {
-           ata_prtdev(adp->device, "no request for tag=%d\n", tag);    
-           ad_invalidatequeue(adp, NULL);
-           return ATA_OP_FINISHED;
-       }
-       ATA_FORCELOCK_CH(adp->device->channel, ATA_ACTIVE_ATA);
-       adp->device->channel->running = request;
-       request->serv++;
-
-       /* start DMA transfer when ready */
-       if (ata_wait(adp->device, ATA_S_READY | ATA_S_DRQ)) {
-           ata_prtdev(adp->device, "timeout starting DMA s=%02x e=%02x\n",
-                      adp->device->channel->status,
-                      adp->device->channel->error);
-           ad_invalidatequeue(adp, NULL);
-           return ATA_OP_FINISHED;
-       }
-       ata_dmastart(adp->device, request->data, request->bytecount,
-                   request->flags & ADR_F_READ);
-       return ATA_OP_CONTINUES;
-    }
-    return ATA_OP_FINISHED;
-}
-
-static void
-ad_free(struct ad_request *request)
-{
-    crit_enter();
-    ata_dmafree(request->softc->device);
-    request->softc->tags[request->tag] = NULL;
-    mpipe_free(&request->softc->device->channel->req_mpipe, request);
-    crit_exit();
-}
-
-static void
-ad_invalidatequeue(struct ad_softc *adp, struct ad_request *request)
-{
-    /* if tags used invalidate all other tagged transfers */
-    if (adp->flags & AD_F_TAG_ENABLED) {
-       struct ad_request *tmpreq;
-       int tag;
-
-       ata_prtdev(adp->device, "invalidating queued requests\n");
-       for (tag = 0; tag <= adp->num_tags; tag++) {
-           tmpreq = adp->tags[tag];
-           adp->tags[tag] = NULL;
-           if (tmpreq == request || tmpreq == NULL)
-               continue;
-           callout_stop(&request->callout);
-           ad_requeue(adp->device->channel, tmpreq);
-       }
-       if (ata_command(adp->device, ATA_C_NOP,
-                       0, 0, ATA_C_F_FLUSHQUEUE, ATA_WAIT_READY))
-           ata_prtdev(adp->device, "flush queue failed\n");
-       adp->outstanding = 0;
-    }
-}
-
-static int
-ad_tagsupported(struct ad_softc *adp)
-{
-    const char *good[] = {"IBM-DPTA", "IBM-DTLA", NULL};
-    int i = 0;
-
-    switch (adp->device->channel->chiptype) {
-    case 0x4d33105a: /* Promises before TX2 doesn't work with tagged queuing */
-    case 0x4d38105a:
-    case 0x0d30105a:
-    case 0x4d30105a:  
-       return 0;
-    }
-
-    /* check that drive does DMA, has tags enabled, and is one we know works */
-    if (adp->device->mode >= ATA_DMA && adp->device->param->support.queued && 
-       adp->device->param->enabled.queued) {
-       while (good[i] != NULL) {
-           if (!strncmp(adp->device->param->model, good[i], strlen(good[i])))
-               return 1;
-           i++;
-       }
-       /* 
-        * check IBM's new obscure way of naming drives 
-        * we want "IC" (IBM CORP) and "AT" or "AV" (ATA interface)
-        * but doesn't care about the other info (size, capacity etc)
-        */
-       if (!strncmp(adp->device->param->model, "IC", 2) &&
-           (!strncmp(adp->device->param->model + 8, "AT", 2) ||
-            !strncmp(adp->device->param->model + 8, "AV", 2)))
-               return 1;
-    }
-    return 0;
-}
-
-static void
-ad_timeout(struct ad_request *request)
-{
-    struct ad_softc *adp = request->softc;
-
-    adp->device->channel->running = NULL;
-    ata_prtdev(adp->device, "%s command timeout tag=%d serv=%d - resetting\n",
-              (request->flags & ADR_F_READ) ? "READ" : "WRITE",
-              request->tag, request->serv);
-
-    if (request->flags & ADR_F_DMA_USED) {
-       ata_dmadone(adp->device);
-       ad_invalidatequeue(adp, request);
-       if (request->retries == AD_MAX_RETRIES) {
-           ata_dmainit(adp->device, ata_pmode(adp->device->param), -1, -1);
-           ata_prtdev(adp->device, "trying fallback to PIO mode\n");
-           request->retries = 0;
-       }
-    }
-
-    /* if retries still permit, reinject this request */
-    if (request->retries++ < AD_MAX_RETRIES) {
-       ad_requeue(adp->device->channel, request);
-    }
-    else {
-       /* retries all used up, return error */
-       request->bio->bio_buf->b_error = EIO;
-       request->bio->bio_buf->b_flags |= B_ERROR;
-       devstat_end_transaction_buf(&adp->stats, request->bio->bio_buf);
-       biodone(request->bio);
-       ad_free(request);
-    }
-    ata_reinit(adp->device->channel);
-}
-
-void
-ad_reinit(struct ata_device *atadev)
-{
-    struct ad_softc *adp = atadev->driver;
-
-    /* reinit disk parameters */
-    ad_invalidatequeue(atadev->driver, NULL);
-    ata_command(atadev, ATA_C_SET_MULTI, 0,
-               adp->transfersize / DEV_BSIZE, 0, ATA_WAIT_READY);
-    if (adp->device->mode >= ATA_DMA)
-       ata_dmainit(atadev, ata_pmode(adp->device->param),
-                   ata_wmode(adp->device->param),
-                   ata_umode(adp->device->param));
-    else
-       ata_dmainit(atadev, ata_pmode(adp->device->param), -1, -1);
-}
-
-void
-ad_print(struct ad_softc *adp) 
-{
-    if (bootverbose) {
-       ata_prtdev(adp->device, "<%.40s/%.8s> ATA-%d disk at ata%d-%s\n", 
-                  adp->device->param->model, adp->device->param->revision,
-                  ad_version(adp->device->param->version_major), 
-                  device_get_unit(adp->device->channel->dev),
-                  (adp->device->unit == ATA_MASTER) ? "master" : "slave");
-
-       ata_prtdev(adp->device,
-                  "%lluMB (%llu sectors), %llu C, %u H, %u S, %u B\n",
-                  (unsigned long long)(adp->total_secs /
-                  ((1024L*1024L)/DEV_BSIZE)),
-                  (unsigned long long) adp->total_secs,
-                  (unsigned long long) (adp->total_secs /
-                   (adp->heads * adp->sectors)),
-                  adp->heads, adp->sectors, DEV_BSIZE);
-
-       ata_prtdev(adp->device, "%d secs/int, %d depth queue, %s%s\n", 
-                  adp->transfersize / DEV_BSIZE, adp->num_tags + 1,
-                  (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "",
-                  ata_mode2str(adp->device->mode));
-
-       ata_prtdev(adp->device, "piomode=%d dmamode=%d udmamode=%d cblid=%d\n",
-                  ata_pmode(adp->device->param), ata_wmode(adp->device->param),
-                  ata_umode(adp->device->param), 
-                  adp->device->param->hwres_cblid);
-
-    }
-    else
-       ata_prtdev(adp->device,"%lluMB <%.40s> [%lld/%d/%d] at ata%d-%s %s%s\n",
-                  (unsigned long long)(adp->total_secs /
-                  ((1024L * 1024L) / DEV_BSIZE)),
-                  adp->device->param->model,
-                  (unsigned long long)(adp->total_secs /
-                   (adp->heads*adp->sectors)),
-                  adp->heads, adp->sectors,
-                  device_get_unit(adp->device->channel->dev),
-                  (adp->device->unit == ATA_MASTER) ? "master" : "slave",
-                  (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "",
-                  ata_mode2str(adp->device->mode));
-}
-
-static int
-ad_version(u_int16_t version)
-{
-    int bit;
-
-    if (version == 0xffff)
-       return 0;
-    for (bit = 15; bit >= 0; bit--)
-       if (version & (1<<bit))
-           return bit;
-    return 0;
-}
diff --git a/sys/dev/disk/ata/ata-disk.h b/sys/dev/disk/ata/ata-disk.h
deleted file mode 100644 (file)
index 04454ff..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-disk.h,v 1.22.2.7 2002/03/18 08:37:33 sos Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-disk.h,v 1.8 2007/05/15 20:29:16 dillon Exp $
- */
-
-/* structure describing an ATA disk request */
-struct ad_request {
-    struct ad_softc            *softc;         /* ptr to parent device */
-    u_int64_t                  blockaddr;      /* block number */
-    u_int32_t                  bytecount;      /* bytes to transfer */
-    u_int32_t                  donecount;      /* bytes transferred */
-    u_int32_t                  currentsize;    /* size of current transfer */
-    struct callout             callout;        /* handle for timeout */ 
-    int                                retries;        /* retry count */
-    int                                flags;
-#define                ADR_F_READ              0x0001
-#define                ADR_F_ERROR             0x0002
-#define                ADR_F_DMA_USED          0x0004
-#define                ADR_F_QUEUED            0x0008
-#define                ADR_F_FORCE_PIO         0x0010
-
-    caddr_t                    data;           /* pointer to data buf */
-    struct bio                 *bio;           /* associated bio ptr */
-    u_int8_t                   tag;            /* tag ID of this request */
-    int                                serv;           /* request had service */
-    TAILQ_ENTRY(ad_request)    chain;          /* list management */
-};
-
-/* structure describing an ATA disk */
-struct ad_softc {  
-    struct ata_device          *device;        /* ptr to device softc */
-    int                                lun;            /* logical unit number */
-    u_int64_t                  total_secs;     /* total # of sectors (LBA) */
-    u_int8_t                   heads;
-    u_int8_t                   sectors;
-    u_int32_t                  transfersize;   /* size of each transfer */
-    int                                num_tags;       /* number of tags supported */
-    int                                flags;          /* drive flags */
-#define                AD_F_LABELLING          0x0001          
-#define                AD_F_CHS_USED           0x0002
-#define                AD_F_32B_ENABLED        0x0004
-#define                AD_F_TAG_ENABLED        0x0008
-#define                AD_F_RAID_SUBDISK       0x0010
-
-    struct ad_request          *tags[32];      /* tag array of requests */
-    int                                outstanding;    /* tags not serviced yet */
-    struct bio_queue_head      bio_queue;      /* head of request queue */
-    struct devstat             stats;          /* devstat entry */
-    struct disk                        disk;           /* disklabel/slice stuff */
-    cdev_t                     dev;            /* device place holder */
-};
-
-void ad_attach(struct ata_device *, int);
-void ad_detach(struct ata_device *, int);
-void ad_reinit(struct ata_device *);
-void ad_start(struct ata_device *);
-int ad_transfer(struct ad_request *);
-int ad_interrupt(struct ad_request *);
-int ad_service(struct ad_softc *, int);
-void ad_print(struct ad_softc *);
diff --git a/sys/dev/disk/ata/ata-dma.c b/sys/dev/disk/ata/ata-dma.c
deleted file mode 100644 (file)
index 8c5e453..0000000
+++ /dev/null
@@ -1,1628 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-dma.c,v 1.35.2.31 2003/05/07 16:46:11 jhb Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-dma.c,v 1.31 2006/12/12 19:01:31 dillon Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/ata.h>
-#include <sys/buf.h>
-#include <sys/malloc.h> 
-#include <sys/mpipe.h> 
-#include <sys/bus.h>
-#include <sys/disk.h>
-#include <sys/devicestat.h>
-#include <sys/rman.h>
-
-#include <vm/vm.h>          
-#include <vm/pmap.h>
-
-#include <bus/pci/pcivar.h>
-#include "ata-all.h"
-
-/* prototypes */
-static void cyrix_timing(struct ata_device *, int, int);
-static void promise_timing(struct ata_device *, int, int);
-static void hpt_timing(struct ata_device *, int, int);
-static int hpt_cable80(struct ata_device *);
-
-/* misc defines */
-#define ATAPI_DEVICE(atadev) \
-       ((atadev->unit == ATA_MASTER && \
-         atadev->channel->devices & ATA_ATAPI_MASTER) || \
-        (atadev->unit == ATA_SLAVE && \
-        atadev->channel->devices & ATA_ATAPI_SLAVE))
-
-int ata_dma_debug = 0;
-
-int
-ata_dmaalloc(struct ata_device *atadev, int flags)
-{
-    struct ata_channel *ch = atadev->channel;
-
-    if (atadev->dmastate.dmatab != NULL)
-       return(0);
-
-    KKASSERT(ch->dma_mpipe.max_count != 0);
-    if (flags & M_RNOWAIT)
-       atadev->dmastate.dmatab = mpipe_alloc_nowait(&ch->dma_mpipe);
-    else
-       atadev->dmastate.dmatab = mpipe_alloc_waitok(&ch->dma_mpipe);
-
-    if (atadev->dmastate.dmatab != NULL) {
-       KKASSERT(((uintptr_t)atadev->dmastate.dmatab & PAGE_MASK) == 0);
-       return(0);
-    }
-    return(ENOBUFS);
-}
-
-void
-ata_dmafree(struct ata_device *atadev)
-{
-    struct ata_channel *ch = atadev->channel;
-
-    if (atadev->dmastate.dmatab) {
-       mpipe_free(&ch->dma_mpipe, atadev->dmastate.dmatab);
-       atadev->dmastate.dmatab = NULL;
-    }
-}
-
-void
-ata_dmafreetags(struct ata_channel *ch)
-{
-}
-
-static void
-ata_dmacreate(struct ata_device *atadev, int apiomode, int mode)
-{
-    atadev->mode = mode;
-}
-
-void
-ata_dmainit(struct ata_device *atadev, int apiomode, int wdmamode, int udmamode)
-{
-    device_t parent = device_get_parent(atadev->channel->dev);
-    int chiptype = atadev->channel->chiptype;
-    int chiprev = pci_get_revid(parent);
-    int channel = atadev->channel->unit;
-    int device = ATA_DEV(atadev->unit);
-    int devno = (channel << 1) + device;
-    int error;
-
-    /* set our most pessimistic default mode */
-    atadev->mode = ATA_PIO;
-
-    if (!atadev->channel->r_bmio)
-       return;
-
-    /* if simplex controller, only allow DMA on primary channel */
-    if (channel == 1) {
-       ATA_OUTB(atadev->channel->r_bmio, ATA_BMSTAT_PORT,
-                ATA_INB(atadev->channel->r_bmio, ATA_BMSTAT_PORT) &
-                (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE));
-       if (ATA_INB(atadev->channel->r_bmio, ATA_BMSTAT_PORT) & 
-           ATA_BMSTAT_DMA_SIMPLEX) {
-           ata_prtdev(atadev, "simplex device, DMA on primary only\n");
-           return;
-       }
-    }
-
-    /* DMA engine address alignment is usually 1 word (2 bytes) */
-    atadev->channel->alignment = 0x1;
-
-#if 1
-    if (udmamode > 2 && !atadev->param->hwres_cblid) {
-       ata_prtdev(atadev,"DMA limited to UDMA33, non-ATA66 cable or device\n");
-       udmamode = 2;
-    }
-#endif
-    switch (chiptype) {
-
-    case 0x27df8086:   /* Intel ICH7 ATA */
-    case 0x27c48086:   /* Intel ICH7M SATA */
-    case 0x269e8086:   /* Intel ICH6 SATA */
-    case 0x26808086:   /* Intel ICH6 SATA */
-    case 0x266f8086:   /* Intel ICH6 ATA */
-    case 0x26528086:   /* Intel ICH6R/RW SATA */
-    case 0x26538086:   /* Intel ICH6M SATA */
-    case 0x26518086:   /* Intel ICH6/W SATA */
-    case 0x24db8086:   /* Intel ICH5 */
-    case 0x24d18086:   /* Intel ICH5 SATA */
-    case 0x24ca8086:   /* Intel ICH4 mobile */
-    case 0x24cb8086:   /* Intel ICH4 */
-    case 0x248a8086:   /* Intel ICH3 mobile */ 
-    case 0x248b8086:   /* Intel ICH3 */
-    case 0x244a8086:   /* Intel ICH2 mobile */ 
-    case 0x244b8086:   /* Intel ICH2 */
-       if (udmamode >= 5) {
-           int32_t mask48, new48;
-           int16_t word54;
-
-           word54 = pci_read_config(parent, 0x54, 2);
-           if (word54 & (0x10 << devno)) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA5,  ATA_C_F_SETXFER,ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA5 on Intel chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
-                   new48 = (1 << devno) + (1 << (16 + (devno << 2)));
-                   pci_write_config(parent, 0x48,
-                                    (pci_read_config(parent, 0x48, 4) &
-                                    ~mask48) | new48, 4);
-                   pci_write_config(parent, 0x54, word54 | (0x1000<<devno), 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-                   return;
-               }
-           }
-       }
-       /* make sure eventual ATA100 mode from the BIOS is disabled */
-       pci_write_config(parent, 0x54, 
-                        pci_read_config(parent, 0x54, 2) & ~(0x1000<<devno),2);
-       /* FALLTHROUGH */
-
-    case 0x24118086:   /* Intel ICH */
-    case 0x76018086:   /* Intel ICH */
-       if (udmamode >= 4) {
-           int32_t mask48, new48;
-           int16_t word54;
-
-           word54 = pci_read_config(parent, 0x54, 2);
-           if (word54 & (0x10 << devno)) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA4 on Intel chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
-                   new48 = (1 << devno) + (2 << (16 + (devno << 2)));
-                   pci_write_config(parent, 0x48,
-                                    (pci_read_config(parent, 0x48, 4) &
-                                    ~mask48) | new48, 4);
-                   pci_write_config(parent, 0x54, word54 | (1 << devno), 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-                   return;
-               }
-           }
-       }           
-       /* make sure eventual ATA66 mode from the BIOS is disabled */
-       pci_write_config(parent, 0x54, 
-                        pci_read_config(parent, 0x54, 2) & ~(1 << devno), 2);
-       /* FALLTHROUGH */
-
-    case 0x71118086:   /* Intel PIIX4 */
-    case 0x84CA8086:   /* Intel PIIX4 */
-    case 0x71998086:   /* Intel PIIX4e */
-    case 0x24218086:   /* Intel ICH0 */
-       if (udmamode >= 2) {
-           int32_t mask48, new48;
-
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on Intel chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
-               new48 = (1 << devno) + (2 << (16 + (devno << 2)));
-               pci_write_config(parent, 0x48, 
-                                (pci_read_config(parent, 0x48, 4) &
-                                ~mask48) | new48, 4);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       /* make sure eventual ATA33 mode from the BIOS is disabled */
-       pci_write_config(parent, 0x48, 
-                        pci_read_config(parent, 0x48, 4) & ~(1 << devno), 4);
-       /* FALLTHROUGH */
-
-    case 0x70108086:   /* Intel PIIX3 */
-       if (wdmamode >= 2 && apiomode >= 4) {
-           int32_t mask40, new40, mask44, new44;
-
-           /* if SITRE not set doit for both channels */
-           if (!((pci_read_config(parent,0x40,4)>>(channel<<8))&0x4000)) {
-               new40 = pci_read_config(parent, 0x40, 4);
-               new44 = pci_read_config(parent, 0x44, 4); 
-               if (!(new40 & 0x00004000)) {
-                   new44 &= ~0x0000000f;
-                   new44 |= ((new40&0x00003000)>>10)|((new40&0x00000300)>>8);
-               }
-               if (!(new40 & 0x40000000)) {
-                   new44 &= ~0x000000f0;
-                   new44 |= ((new40&0x30000000)>>22)|((new40&0x03000000)>>20);
-               }
-               new40 |= 0x40004000;
-               pci_write_config(parent, 0x40, new40, 4);
-               pci_write_config(parent, 0x44, new44, 4);
-           }
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Intel chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               if (device == ATA_MASTER) {
-                   mask40 = 0x0000330f;
-                   new40 = 0x00002307;
-                   mask44 = 0;
-                   new44 = 0;
-               }
-               else {
-                   mask40 = 0x000000f0;
-                   new40 = 0x00000070;
-                   mask44 = 0x0000000f;
-                   new44 = 0x0000000b;
-               }
-               if (channel) {
-                   mask40 <<= 16;
-                   new40 <<= 16;
-                   mask44 <<= 4;
-                   new44 <<= 4;
-               }
-               pci_write_config(parent, 0x40,
-                                (pci_read_config(parent, 0x40, 4) & ~mask40)|
-                                new40, 4);
-               pci_write_config(parent, 0x44,
-                                (pci_read_config(parent, 0x44, 4) & ~mask44)|
-                                new44, 4);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x12308086:   /* Intel PIIX */
-       if (wdmamode >= 2 && apiomode >= 4) {
-           int32_t word40;
-
-           word40 = pci_read_config(parent, 0x40, 4);
-           word40 >>= channel * 16;
-
-           /* Check for timing config usable for DMA on controller */
-           if (!((word40 & 0x3300) == 0x2300 &&
-                 ((word40 >> (device ? 4 : 0)) & 1) == 1))
-               break;
-
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Intel chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       break;
-
-    case 0x522910b9:   /* AcerLabs Aladdin IV/V */
-       /* the older Aladdin doesn't support ATAPI DMA on both master & slave */
-       if (chiprev < 0xc2 &&
-           atadev->channel->devices & ATA_ATAPI_MASTER && 
-           atadev->channel->devices & ATA_ATAPI_SLAVE) {
-           ata_prtdev(atadev, "two atapi devices on this channel, no DMA\n");
-           break;
-       }
-#if !defined(NO_ATANG)
-       pci_write_config(parent, 0x58 + (channel << 2), 0x00310001, 4);
-#endif
-       if (udmamode >= 5 && chiprev >= 0xc4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on Acer chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               int32_t word54 = pci_read_config(parent, 0x54, 4);
-       
-               pci_write_config(parent, 0x4b,
-                                pci_read_config(parent, 0x4b, 1) | 0x01, 1);
-               word54 &= ~(0x000f000f << (devno << 2));
-               word54 |= (0x000f0005 << (devno << 2));
-               pci_write_config(parent, 0x54, word54, 4);
-               pci_write_config(parent, 0x53, 
-                                pci_read_config(parent, 0x53, 1) | 0x03, 1);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-       if (udmamode >= 4 && chiprev >= 0xc2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on Acer chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               int32_t word54 = pci_read_config(parent, 0x54, 4);
-       
-               pci_write_config(parent, 0x4b,
-                                pci_read_config(parent, 0x4b, 1) | 0x01, 1);
-               word54 &= ~(0x000f000f << (devno << 2));
-               word54 |= (0x00080005 << (devno << 2));
-               pci_write_config(parent, 0x54, word54, 4);
-               pci_write_config(parent, 0x53, 
-                                pci_read_config(parent, 0x53, 1) | 0x03, 1);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       if (udmamode >= 2 && chiprev >= 0x20) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on Acer chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               int32_t word54 = pci_read_config(parent, 0x54, 4);
-       
-               word54 &= ~(0x000f000f << (devno << 2));
-               word54 |= (0x000a0005 << (devno << 2));
-               pci_write_config(parent, 0x54, word54, 4);
-               pci_write_config(parent, 0x53, 
-                                pci_read_config(parent, 0x53, 1) | 0x03, 1);
-               atadev->channel->flags |= ATA_ATAPI_DMA_RO;
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-
-       /* make sure eventual UDMA mode from the BIOS is disabled */
-       pci_write_config(parent, 0x56, pci_read_config(parent, 0x56, 2) &
-                                      ~(0x0008 << (devno << 2)), 2);
-
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Acer chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               pci_write_config(parent, 0x53, 
-                                pci_read_config(parent, 0x53, 1) | 0x03, 1);
-               atadev->channel->flags |= ATA_ATAPI_DMA_RO;
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       pci_write_config(parent, 0x53,
-                        (pci_read_config(parent, 0x53, 1) & ~0x01) | 0x02, 1);
-#if !defined(NO_ATANG)
-       error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                           ATA_PIO0 + apiomode,
-                           ATA_C_F_SETXFER, ATA_WAIT_READY);
-       if (bootverbose)
-           ata_prtdev(atadev, "%s setting PIO%d on Acer chip\n",
-                       (error) ? "failed" : "success",
-                       (apiomode >= 0) ? apiomode : 0);
-       if (!error) {
-           int32_t word54 = pci_read_config(parent, 0x54, 4);
-           int32_t timing;
-
-           switch(ATA_PIO0 + apiomode) {
-           case ATA_PIO0: timing = 0x006d0003; break;
-           case ATA_PIO1: timing = 0x00580002; break;
-           case ATA_PIO2: timing = 0x00440001; break;
-           case ATA_PIO3: timing = 0x00330001; break;
-           case ATA_PIO4: timing = 0x00310001; break;
-           default:       timing = 0x006d0003; break;
-           }
-           pci_write_config(parent, 0x58 + (channel << 2), timing, 4);
-           word54 &= ~(0x000f000f << (devno << 2));
-           word54 |= (0x00000004 << (devno << 2));
-           pci_write_config(parent, 0x54, word54, 4);
-           atadev->mode = ATA_PIO0 + apiomode;
-           return;
-       }
-#endif
-       break;
-
-    case 0x31491106:   /* VIA 8237 SATA part */
-       if (udmamode) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA + udmamode,
-                               ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA%d on VIA chip\n",
-                           (error) ? "failed" : "success", udmamode);
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_UDMA + udmamode);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x01bc10de:   /* NVIDIA nForce1 */
-    case 0x006510de:   /* NVIDIA nForce2 */
-    case 0x00d510de:   /* NVIDIA nForce3 */
-    case 0x00e310de:   /* NVIDIA nForce3 PRO S1 */
-    case 0x00e510de:   /* NVIDIA nForce3 PRO */
-    case 0x74691022:   /* AMD 8111 */
-    case 0x74411022:   /* AMD 768 */
-    case 0x74111022:   /* AMD 766 */
-    case 0x74091022:   /* AMD 756 */
-    case 0x05711106:   /* VIA 82C571, 82C586, 82C596, 82C686, 8231,8233,8235 */
-       {
-           int via_modes[][7] = {
-               { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 },   /* VIA ATA33 */
-               { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 },   /* VIA ATA66 */
-               { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 },   /* VIA ATA100 */
-               { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 },   /* VIA ATA133 */
-               { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }};  /* AMD/NVIDIA */
-           int *reg_val = NULL;
-           int reg_off = 0x53;
-           char *chip = "VIA";
-
-           if (ata_find_dev(parent, 0x31471106, 0) ||          /* 8233a */
-               ata_find_dev(parent, 0x31771106, 0) ||          /* 8235 */
-               ata_find_dev(parent, 0x31491106, 0)) {          /* 8237 */
-               udmamode = imin(udmamode, 6);
-               reg_val = via_modes[3];
-           }
-           else if (ata_find_dev(parent, 0x06861106, 0x40) ||  /* 82C686b */
-               ata_find_dev(parent, 0x82311106, 0) ||          /* 8231 */
-               ata_find_dev(parent, 0x30741106, 0) ||          /* 8233 */
-               ata_find_dev(parent, 0x31091106, 0)) {          /* 8233c */
-               udmamode = imin(udmamode, 5);
-               reg_val = via_modes[2];
-           }
-           else if (ata_find_dev(parent, 0x06861106, 0x10) ||  /* 82C686a */
-                    ata_find_dev(parent, 0x05961106, 0x12)) {  /* 82C596b */
-               udmamode = imin(udmamode, 4);
-               reg_val = via_modes[1];
-           }
-           else if (ata_find_dev(parent, 0x06861106, 0)) {     /* 82C686 */
-               udmamode = imin(udmamode, 2);
-               reg_val = via_modes[1];
-           }
-           else if (ata_find_dev(parent, 0x05961106, 0) ||     /* 82C596a */
-                    ata_find_dev(parent, 0x05861106, 0x03)) {  /* 82C586b */
-               udmamode = imin(udmamode, 2);
-               reg_val = via_modes[0];
-           }
-           else if (chiptype == 0x74691022 ||          /* AMD 8111 */
-                    chiptype == 0x74411022 ||          /* AMD 768 */
-                    chiptype == 0x74111022) {          /* AMD 766 */
-               udmamode = imin(udmamode, 5);
-               reg_val = via_modes[4];
-               chip = "AMD";
-           }
-           else if (chiptype == 0x74091022) {          /* AMD 756 */
-               udmamode = imin(udmamode, 4);
-               reg_val = via_modes[4];
-               chip = "AMD";
-           }
-           else if (chiptype == 0x01bc10de) {          /* nForce1 */
-               udmamode = imin(udmamode, 5);
-               reg_val = via_modes[4];
-#if !defined(NO_ATANG)
-               reg_off += 0x10;
-#endif
-               chip = "nVIDIA";
-           }
-           else if (chiptype == 0x006510de ||          /* nForce2 */
-                    chiptype == 0x00d510de ||          /* nForce3 */
-                    chiptype == 0x00e310de ||          /* nForce3 PRO S1 */
-                    chiptype == 0x00e510de) {          /* nForce3 PRO */
-               udmamode = imin(udmamode, 6);
-               reg_val = via_modes[4];
-#if !defined(NO_ATANG)
-               reg_off += 0x10;
-#endif
-               chip = "nVIDIA";
-           }
-           else 
-               udmamode = 0;
-
-           reg_off -= devno;
-
-           if (udmamode >= 6) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA6, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA6 on %s chip\n",
-                              (error) ? "failed" : "success", chip);
-               if (!error) {
-                   pci_write_config(parent, reg_off, reg_val[6], 1);
-                   pci_write_config(parent, reg_off - 8, 0x20, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA6);
-                   return;
-               }
-           }
-           if (udmamode >= 5) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA5 on %s chip\n",
-                              (error) ? "failed" : "success", chip);
-               if (!error) {
-                   pci_write_config(parent, reg_off, reg_val[5], 1);
-                   pci_write_config(parent, reg_off - 8, 0x20, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-                   return;
-               }
-           }
-           if (udmamode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA4 on %s chip\n",
-                              (error) ? "failed" : "success", chip);
-               if (!error) {
-                   pci_write_config(parent, reg_off, reg_val[4], 1);
-                   pci_write_config(parent, reg_off - 8, 0x20, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-                   return;
-               }
-           }
-           if (udmamode >= 2) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA2 on %s chip\n",
-                              (error) ? "failed" : "success", chip);
-               if (!error) {
-                   pci_write_config(parent, reg_off, reg_val[2], 1);
-                   pci_write_config(parent, reg_off - 8, 0x20, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-                   return;
-               }
-           }
-           if (wdmamode >= 2 && apiomode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting WDMA2 on %s chip\n",
-                              (error) ? "failed" : "success", chip);
-               if (!error) {
-                   pci_write_config(parent, reg_off, 0x0b, 1);
-                   pci_write_config(parent, reg_off - 8, 0x20, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-                   return;
-               }
-           }
-           pci_write_config(parent, reg_off, 0x8b, 1);
-           switch(apiomode) {
-           case 0:
-               pci_write_config(parent, reg_off - 8, 0xa8, 1);
-               break;
-           case 1:
-               pci_write_config(parent, reg_off - 8, 0x65, 1);
-               break;
-           case 2:
-               pci_write_config(parent, reg_off - 8, 0x42, 1);
-               break;
-           case 3:
-               pci_write_config(parent, reg_off - 8, 0x22, 1);
-               break;
-           case 4:
-               pci_write_config(parent, reg_off - 8, 0x20, 1);
-               break;
-           }
-       }
-       break;
-
-    case 0x55131039:   /* SiS 5591 */
-       if (ata_find_dev(parent, 0x06301039, 0x30) ||   /* SiS 630 */
-           ata_find_dev(parent, 0x06331039, 0) ||      /* SiS 633 */
-           ata_find_dev(parent, 0x06351039, 0) ||      /* SiS 635 */
-           ata_find_dev(parent, 0x06401039, 0) ||      /* SiS 640 */
-           ata_find_dev(parent, 0x06451039, 0) ||      /* SiS 645 */
-           ata_find_dev(parent, 0x06461039, 0) ||      /* SiS 645DX */
-           ata_find_dev(parent, 0x06481039, 0) ||      /* SiS 648 */
-           ata_find_dev(parent, 0x06501039, 0) ||      /* SiS 650 */
-           ata_find_dev(parent, 0x07301039, 0) ||      /* SiS 730 */
-           ata_find_dev(parent, 0x07331039, 0) ||      /* SiS 733 */
-           ata_find_dev(parent, 0x07351039, 0) ||      /* SiS 735 */
-           ata_find_dev(parent, 0x07401039, 0) ||      /* SiS 740 */
-           ata_find_dev(parent, 0x07451039, 0) ||      /* SiS 745 */
-           ata_find_dev(parent, 0x07461039, 0) ||      /* SiS 746 */
-           ata_find_dev(parent, 0x07501039, 0)) {      /* SiS 750 */
-           int8_t reg = 0x40 + (devno << 1);
-           int16_t val = pci_read_config(parent, reg, 2) & 0x0fff;
-
-           if (udmamode >= 5) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA5 on SiS chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, reg, val | 0x8000, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-                   return;
-               }
-           }
-           if (udmamode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA4 on SiS chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, reg, val | 0x9000, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-                   return;
-               }
-           }
-           if (udmamode >= 2) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA2 on SiS chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, reg, val | 0xb000, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-                   return;
-               }
-           }
-       } else if (ata_find_dev(parent, 0x05301039, 0) || /* SiS 530 */
-                  ata_find_dev(parent, 0x05401039, 0) || /* SiS 540 */
-                  ata_find_dev(parent, 0x06201039, 0) || /* SiS 620 */
-                  ata_find_dev(parent, 0x06301039, 0)) { /* SiS 630 */
-           int8_t reg = 0x40 + (devno << 1);
-           int16_t val = pci_read_config(parent, reg, 2) & 0x0fff;
-
-           if (udmamode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA4 on SiS chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, reg, val | 0x9000, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-                   return;
-               }
-           }
-           if (udmamode >= 2) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA2 on SiS chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, reg, val | 0xa000, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-                   return;
-               }
-           }
-       } else if (udmamode >= 2 && chiprev > 0xc1) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on SiS chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               pci_write_config(parent, 0x40 + (devno << 1), 0xa301, 2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (wdmamode >=2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on SiS chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               pci_write_config(parent, 0x40 + (devno << 1), 0x0301, 2);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x35121095:   /* SiI 3512 SATA controller */
-       /* EXPERIMENTAL!  Works with FN85 AMD 64 3200+ motherboard */
-       /* FALLTHROUGH */
-    case 0x31241095:   /* SiI 3124 SATA controller */
-    case 0x31141095:   /* SiI 3114 SATA controller */
-    case 0x31121095:   /* SiI 3112 SATA controller */
-    case 0x06801095:   /* SiI 0680 ATA133 controller */
-       {
-           u_int8_t ureg = 0xac + (device * 0x02) + (channel * 0x10);
-           u_int8_t uval = pci_read_config(parent, ureg, 1);
-           u_int8_t mreg = channel ? 0x84 : 0x80;
-           u_int8_t mask = device ? 0x30 : 0x03;
-           u_int8_t mode = pci_read_config(parent, mreg, 1);
-
-           /* enable UDMA mode */
-           pci_write_config(parent, mreg,
-                            (mode & ~mask) | (device ? 0x30 : 0x03), 1);
-           if (udmamode >= 6) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA6, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA6 on SiI chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, ureg, (uval & ~0x3f) | 0x01, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA6);
-                   return;
-               }
-           }
-           if (udmamode >= 5) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA5 on SiI chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, ureg, (uval & ~0x3f) | 0x02, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-                   return;
-               }
-           }
-           if (udmamode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA4 on SiI chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, ureg, (uval & ~0x3f) | 0x03, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-                   return;
-               }
-           }
-           if (udmamode >= 2) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting UDMA2 on SiI chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, ureg, (uval & ~0x3f) | 0x07, 1);
-                   ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-                   return;
-               }
-           }
-
-           /* disable UDMA mode and enable WDMA mode */
-           pci_write_config(parent, mreg,
-                            (mode & ~mask) | (device ? 0x20 : 0x02), 1);
-           if (wdmamode >= 2 && apiomode >= 4) {
-               error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                                   ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-               if (bootverbose)
-                   ata_prtdev(atadev, "%s setting WDMA2 on SiI chip\n",
-                              (error) ? "failed" : "success");
-               if (!error) {
-                   pci_write_config(parent, ureg - 0x4, 0x10c1, 2);
-                   ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-                   return;
-               }
-           }
-
-           /* restore PIO mode */
-           pci_write_config(parent, mreg, mode, 1);
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x06491095:   /* CMD 649 ATA100 controller */
-       if (udmamode >= 5) {
-           u_int8_t umode;
-
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on CMD chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               umode = pci_read_config(parent, channel ? 0x7b : 0x73, 1);
-               umode &= ~(device ? 0xca : 0x35);
-               umode |= (device ? 0x0a : 0x05);
-               pci_write_config(parent, channel ? 0x7b : 0x73, umode, 1);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-       /* FALLTHROUGH */
-
-    case 0x06481095:   /* CMD 648 ATA66 controller */
-       if (udmamode >= 4) {
-           u_int8_t umode;
-
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on CMD chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               umode = pci_read_config(parent, channel ? 0x7b : 0x73, 1);
-               umode &= ~(device ? 0xca : 0x35);
-               umode |= (device ? 0x4a : 0x15);
-               pci_write_config(parent, channel ? 0x7b : 0x73, umode, 1);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       if (udmamode >= 2) {
-           u_int8_t umode;
-
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on CMD chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               umode = pci_read_config(parent, channel ? 0x7b : 0x73, 1);
-               umode &= ~(device ? 0xca : 0x35);
-               umode |= (device ? 0x42 : 0x11);
-               pci_write_config(parent, channel ? 0x7b : 0x73, umode, 1);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       /* make sure eventual UDMA mode from the BIOS is disabled */
-       pci_write_config(parent, channel ? 0x7b : 0x73, 
-                        pci_read_config(parent, channel ? 0x7b : 0x73, 1)&
-#if !defined(NO_ATANG)
-                        ~(device ? 0xca : 0x53), 1);
-#else
-                        ~(device ? 0xca : 0x35), 1);
-#endif
-       /* FALLTHROUGH */
-
-    case 0x06461095:   /* CMD 646 ATA controller */
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on CMD chip\n",
-                          error ? "failed" : "success");
-           if (!error) {
-               int32_t offset = (devno < 3) ? (devno << 1) : 7;
-
-               pci_write_config(parent, 0x54 + offset, 0x3f, 1);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0xc6931080:   /* Cypress 82c693 ATA controller */
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Cypress chip\n",
-                          error ? "failed" : "success");
-           if (!error) {
-               pci_write_config(atadev->channel->dev,
-                               channel ? 0x4e:0x4c, 0x2020, 2);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x01021078:   /* Cyrix 5530 ATA33 controller */
-       atadev->channel->alignment = 0xf;       /* DMA engine requires 16 byte alignment */
-       if (udmamode >= 2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on Cyrix chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               cyrix_timing(atadev, devno, ATA_UDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Cyrix chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               cyrix_timing(atadev, devno, ATA_WDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                           ATA_PIO0 + apiomode, ATA_C_F_SETXFER,
-                           ATA_WAIT_READY);
-       if (bootverbose)
-           ata_prtdev(atadev, "%s setting %s on Cyrix chip\n",
-                      (error) ? "failed" : "success",
-                      ata_mode2str(ATA_PIO0 + apiomode));
-       cyrix_timing(atadev, devno, ATA_PIO0 + apiomode);
-       atadev->mode = ATA_PIO0 + apiomode;
-       return;
-
-#if !defined(NO_ATANG)
-    case 0x02131166:   /* ServerWorks CSB6 ATA 100 controller (chan 0+1) */
-#endif
-    case 0x02121166:   /* ServerWorks CSB5 ATA66/100 controller */
-#if !defined(NO_ATANG)
-       if (udmamode >= 5 && (chiptype == 0x02131166 ||
-                             (chiptype == 0x02121166 &&
-                             chiprev >= 0x92))) {
-#else
-       if (udmamode >= 5 && chiprev >= 0x92) {
-#endif
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on ServerWorks chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               u_int16_t reg56;
-
-               pci_write_config(parent, 0x54, 
-                                pci_read_config(parent, 0x54, 1) |
-                                (0x01 << devno), 1);
-               reg56 = pci_read_config(parent, 0x56, 2);
-               reg56 &= ~(0xf << (devno * 4));
-               reg56 |= (0x5 << (devno * 4));
-               pci_write_config(parent, 0x56, reg56, 2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-#if !defined(NO_ATANG)
-       /* FALLTHROUGH */
-    case 0x02171166:   /* Server Works CSB6 ATA 66 controller chan 2 */
-#endif
-       if (udmamode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on ServerWorks chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               u_int16_t reg56;
-
-               pci_write_config(parent, 0x54, 
-                                pci_read_config(parent, 0x54, 1) |
-                                (0x01 << devno), 1);
-               reg56 = pci_read_config(parent, 0x56, 2);
-               reg56 &= ~(0xf << (devno * 4));
-               reg56 |= (0x4 << (devno * 4));
-               pci_write_config(parent, 0x56, reg56, 2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       /* FALLTHROUGH */
-
-    case 0x02111166:   /* ServerWorks ROSB4 ATA33 controller */
-       if (udmamode >= 2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on ServerWorks chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               u_int16_t reg56;
-
-               pci_write_config(parent, 0x54, 
-                                pci_read_config(parent, 0x54, 1) |
-                                (0x01 << devno), 1);
-               reg56 = pci_read_config(parent, 0x56, 2);
-               reg56 &= ~(0xf << (devno * 4));
-               reg56 |= (0x2 << (devno * 4));
-               pci_write_config(parent, 0x56, reg56, 2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on ServerWorks chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               int offset = devno ^ 0x01; /* (chan*2) + (dev==ATA_MASTER)*/
-               int word44 = pci_read_config(parent, 0x44, 4);
-
-               pci_write_config(parent, 0x54,
-                                pci_read_config(parent, 0x54, 1) &
-                                ~(0x01 << devno), 1);
-               word44 &= ~(0xff << (offset << 8));
-               word44 |= (0x20 << (offset << 8));
-               pci_write_config(parent, 0x44, 0x20, 4);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       /* we could set PIO mode timings, but we assume the BIOS did that */
-       break;
-
-    case 0x4d69105a:   /* Promise TX2 ATA133 controllers */
-    case 0x5275105a:   /* Promise TX2 ATA133 controllers */
-    case 0x6269105a:   /* Promise TX2 ATA133 controllers */
-    case 0x7275105a:   /* Promise TX2 ATA133 controllers */
-       ATA_OUTB(atadev->channel->r_bmio, ATA_BMDEVSPEC_0, 0x0b);
-       if (udmamode >= 6 &&
-           !(ATA_INB(atadev->channel->r_bmio, ATA_BMDEVSPEC_1) & 0x04)) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA6, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA6 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_UDMA6);
-               return;
-           }
-       }
-       /* FALLTHROUGH */
-
-    case 0x4d68105a:   /* Promise TX2 ATA100 controllers */
-    case 0x6268105a:   /* Promise TX2 ATA100 controllers */
-       ATA_OUTB(atadev->channel->r_bmio, ATA_BMDEVSPEC_0, 0x0b);
-       if (udmamode >= 5 && 
-           !(ATA_INB(atadev->channel->r_bmio, ATA_BMDEVSPEC_1) & 0x04)) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-       ATA_OUTB(atadev->channel->r_bmio, ATA_BMDEVSPEC_0, 0x0b);
-       if (udmamode >= 4 && 
-           !(ATA_INB(atadev->channel->r_bmio, ATA_BMDEVSPEC_1) & 0x04)) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       if (udmamode >= 2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       break;
-
-    case 0x0d30105a:   /* Promise OEM ATA100 controllers */
-    case 0x4d30105a:   /* Promise Ultra/FastTrak 100 controllers */
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 5 && 
-           !(pci_read_config(parent, 0x50, 2)&(channel ? 1<<11 : 1<<10))){
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               promise_timing(atadev, devno, ATA_UDMA5);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-       /* FALLTHROUGH */
-
-    case 0x0d38105a:   /* Promise FastTrak 66 controllers */
-    case 0x4d38105a:   /* Promise Ultra/FastTrak 66 controllers */
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 4 && 
-           !(pci_read_config(parent, 0x50, 2)&(channel ? 1<<11 : 1<<10))){
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               promise_timing(atadev, devno, ATA_UDMA4);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       /* FALLTHROUGH */
-
-    case 0x4d33105a:   /* Promise Ultra/FastTrak 33 controllers */
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               promise_timing(atadev, devno, ATA_UDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (!ATAPI_DEVICE(atadev) && wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on Promise chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               promise_timing(atadev, devno, ATA_WDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                           ATA_PIO0 + apiomode, 
-                           ATA_C_F_SETXFER, ATA_WAIT_READY);
-       if (bootverbose)
-           ata_prtdev(atadev, "%s setting PIO%d on Promise chip\n",
-                      (error) ? "failed" : "success",
-                      (apiomode >= 0) ? apiomode : 0);
-       promise_timing(atadev, devno, ATA_PIO0 + apiomode);
-       atadev->mode = ATA_PIO0 + apiomode;
-       return;
-    
-    case 0x00041103:   /* HighPoint HPT366/368/370/372 controllers */
-    case 0x00051103:   /* HighPoint HPT372 controllers */
-    case 0x00081103:   /* HighPoint HPT374 controllers */
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 6 && hpt_cable80(atadev) &&
-           ((chiptype == 0x00041103 && chiprev >= 0x05) ||
-            (chiptype == 0x00051103 && chiprev >= 0x01) ||
-            (chiptype == 0x00081103 && chiprev >= 0x07))) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA6, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA6 on HighPoint chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               hpt_timing(atadev, devno, ATA_UDMA6);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA6);
-               return;
-           }
-       }
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 5 && hpt_cable80(atadev) &&
-           ((chiptype == 0x00041103 && chiprev >= 0x03) ||
-            (chiptype == 0x00051103 && chiprev >= 0x01) ||
-            (chiptype == 0x00081103 && chiprev >= 0x07))) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA5 on HighPoint chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               hpt_timing(atadev, devno, ATA_UDMA5);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA5);
-               return;
-           }
-       }
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 4 && hpt_cable80(atadev)) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA4 on HighPoint chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               hpt_timing(atadev, devno, ATA_UDMA4);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA4);
-               return;
-           }
-       }
-       if (!ATAPI_DEVICE(atadev) && udmamode >= 2) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting UDMA2 on HighPoint chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               hpt_timing(atadev, devno, ATA_UDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_UDMA2);
-               return;
-           }
-       }
-       if (!ATAPI_DEVICE(atadev) && wdmamode >= 2 && apiomode >= 4) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on HighPoint chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               hpt_timing(atadev, devno, ATA_WDMA2);
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-       error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                           ATA_PIO0 + apiomode, 
-                           ATA_C_F_SETXFER, ATA_WAIT_READY);
-       if (bootverbose)
-           ata_prtdev(atadev, "%s setting PIO%d on HighPoint chip\n",
-                      (error) ? "failed" : "success",
-                      (apiomode >= 0) ? apiomode : 0);
-       hpt_timing(atadev, devno, ATA_PIO0 + apiomode);
-       atadev->mode = ATA_PIO0 + apiomode;
-       return;
-
-    case 0x000116ca:   /* Cenatek Rocket Drive controller */
-       if (wdmamode >= 0 &&
-           (ATA_INB(atadev->channel->r_bmio, ATA_BMSTAT_PORT) & 
-            (device ? ATA_BMSTAT_DMA_SLAVE : ATA_BMSTAT_DMA_MASTER)))
-           ata_dmacreate(atadev, apiomode, ATA_DMA);
-       else
-           atadev->mode = ATA_PIO;
-       return;
-
-    default:           /* unknown controller chip */
-       /* better not try generic DMA on ATAPI devices it almost never works */
-       if (ATAPI_DEVICE(atadev))
-           break;
-
-       /* if controller says its setup for DMA take the easy way out */
-       /* the downside is we dont know what DMA mode we are in */
-       if ((udmamode >= 0 || wdmamode >= 2) &&
-           (ATA_INB(atadev->channel->r_bmio, ATA_BMSTAT_PORT) &
-            (device ? ATA_BMSTAT_DMA_SLAVE : ATA_BMSTAT_DMA_MASTER))) {
-           ata_dmacreate(atadev, apiomode, ATA_DMA);
-           return;
-       }
-
-       /* well, we have no support for this, but try anyways */
-       if ((wdmamode >= 2 && apiomode >= 4) && atadev->channel->r_bmio) {
-           error = ata_command(atadev, ATA_C_SETFEATURES, 0,
-                               ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
-           if (bootverbose)
-               ata_prtdev(atadev, "%s setting WDMA2 on generic chip\n",
-                          (error) ? "failed" : "success");
-           if (!error) {
-               ata_dmacreate(atadev, apiomode, ATA_WDMA2);
-               return;
-           }
-       }
-    }
-    error = ata_command(atadev, ATA_C_SETFEATURES, 0, ATA_PIO0 + apiomode,
-                       ATA_C_F_SETXFER, ATA_WAIT_READY);
-    if (bootverbose)
-       ata_prtdev(atadev, "%s setting PIO%d on generic chip\n",
-                  (error) ? "failed" : "success", apiomode < 0 ? 0 : apiomode);
-    if (!error)
-       atadev->mode = ATA_PIO0 + apiomode;
-    else {
-       if (bootverbose)
-           ata_prtdev(atadev, "using PIO mode set by BIOS\n");
-       atadev->mode = ATA_PIO;
-    }
-}
-
-int
-ata_dmasetup(struct ata_device *atadev, caddr_t data, int32_t count)
-{
-    struct ata_channel *ch = atadev->channel;
-    struct ata_dmastate *ds = &atadev->dmastate;
-    u_int32_t dma_count, dma_base;
-    int i = 0;
-
-    if (((uintptr_t)data & ch->alignment) || (count & ch->alignment)) {
-       ata_prtdev(atadev, "non aligned DMA transfer attempted\n");
-       return -1;
-    }
-
-    if (!count) {
-       ata_prtdev(atadev, "zero length DMA transfer attempted\n");
-       return -1;
-    }
-    
-    dma_base = vtophys(data);
-    dma_count = imin(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK)));
-    data += dma_count;
-    count -= dma_count;
-
-    while (count) {
-       ds->dmatab[i].base = dma_base;
-       ds->dmatab[i].count = (dma_count & 0xffff);
-       i++; 
-       if (i >= ATA_DMA_ENTRIES) {
-           ata_prtdev(atadev, "too many segments in DMA table\n");
-           return -1;
-       }
-       dma_base = vtophys(data);
-       dma_count = imin(count, PAGE_SIZE);
-       data += imin(count, PAGE_SIZE);
-       count -= imin(count, PAGE_SIZE);
-    }
-    ds->dmatab[i].base = dma_base;
-    ds->dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT;
-    return 0;
-}
-
-int
-ata_dmastart(struct ata_device *atadev, caddr_t data, int32_t count, int dir)
-{
-    struct ata_channel *ch = atadev->channel;
-    struct ata_dmastate *ds = &atadev->dmastate;
-
-    ch->flags |= ATA_DMA_ACTIVE;
-    ATA_OUTL(ch->r_bmio, ATA_BMDTP_PORT, vtophys(ds->dmatab));
-    ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT, dir ? ATA_BMCMD_WRITE_READ : 0);
-    ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT, 
-        (ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT) | 
-         (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
-    ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT, 
-        ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
-    return(0);
-}
-
-int
-ata_dmadone(struct ata_device *atadev)
-{
-    struct ata_channel *ch;
-    struct ata_dmastate *ds;
-    int error;
-
-    ch = atadev->channel;
-    ds = &atadev->dmastate;
-
-    ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT, 
-               ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
-    error = ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT);
-    ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT, 
-            error | ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR);
-    ch->flags &= ~ATA_DMA_ACTIVE;
-    ds->flags = 0;
-    return error & ATA_BMSTAT_MASK;
-}
-
-int
-ata_dmastatus(struct ata_channel *ch)
-{
-    return ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
-}
-
-static void
-cyrix_timing(struct ata_device *atadev, int devno, int mode)
-{
-    u_int32_t reg20 = 0x0000e132;
-    u_int32_t reg24 = 0x00017771;
-
-    switch (mode) {
-    case ATA_PIO0:     reg20 = 0x0000e132; break;
-    case ATA_PIO1:     reg20 = 0x00018121; break;
-    case ATA_PIO2:     reg20 = 0x00024020; break;
-    case ATA_PIO3:     reg20 = 0x00032010; break;
-    case ATA_PIO4:     reg20 = 0x00040010; break;
-    case ATA_WDMA2:    reg24 = 0x00002020; break;
-    case ATA_UDMA2:    reg24 = 0x00911030; break;
-    }
-    ATA_OUTL(atadev->channel->r_bmio, (devno << 3) + 0x20, reg20);
-    ATA_OUTL(atadev->channel->r_bmio, (devno << 3) + 0x24, reg24);
-}
-
-static void
-promise_timing(struct ata_device *atadev, int devno, int mode)
-{
-    u_int32_t timing = 0;
-    /* XXX: Endianess */
-    struct promise_timing {
-       u_int8_t  pa:4;
-       u_int8_t  prefetch:1;
-       u_int8_t  iordy:1;
-       u_int8_t  errdy:1;
-       u_int8_t  syncin:1;
-       u_int8_t  pb:5;
-       u_int8_t  mb:3;
-       u_int8_t  mc:4;
-       u_int8_t  dmaw:1;
-       u_int8_t  dmar:1;
-       u_int8_t  iordyp:1;
-       u_int8_t  dmarqp:1;
-       u_int8_t  reserved:8;
-    } *t = (struct promise_timing*)&timing;
-
-    t->iordy = 1; t->iordyp = 1;
-    if (mode >= ATA_DMA) {
-       t->prefetch = 1; t->errdy = 1; t->syncin = 1;
-    }
-
-    switch (atadev->channel->chiptype) {
-    case 0x4d33105a:  /* Promise Ultra/Fasttrak 33 */
-       switch (mode) {
-       default:
-       case ATA_PIO0:  t->pa =  9; t->pb = 19; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO1:  t->pa =  5; t->pb = 12; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO2:  t->pa =  3; t->pb =  8; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO3:  t->pa =  2; t->pb =  6; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO4:  t->pa =  1; t->pb =  4; t->mb = 7; t->mc = 15; break;
-       case ATA_WDMA2: t->pa =  3; t->pb =  7; t->mb = 3; t->mc =  3; break;
-       case ATA_UDMA2: t->pa =  3; t->pb =  7; t->mb = 1; t->mc =  1; break;
-       }
-       break;
-
-    case 0x4d38105a:  /* Promise Ultra/Fasttrak 66 */
-    case 0x4d30105a:  /* Promise Ultra/Fasttrak 100 */
-    case 0x0d30105a:  /* Promise OEM ATA 100 */
-       switch (mode) {
-       default:
-       case ATA_PIO0:  t->pa = 15; t->pb = 31; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO1:  t->pa = 10; t->pb = 24; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO2:  t->pa =  6; t->pb = 16; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO3:  t->pa =  4; t->pb = 12; t->mb = 7; t->mc = 15; break;
-       case ATA_PIO4:  t->pa =  2; t->pb =  8; t->mb = 7; t->mc = 15; break;
-       case ATA_WDMA2: t->pa =  6; t->pb = 14; t->mb = 6; t->mc =  6; break;
-       case ATA_UDMA2: t->pa =  6; t->pb = 14; t->mb = 2; t->mc =  2; break;
-       case ATA_UDMA4: t->pa =  3; t->pb =  7; t->mb = 1; t->mc =  1; break;
-       case ATA_UDMA5: t->pa =  3; t->pb =  7; t->mb = 1; t->mc =  1; break;
-       }
-       break;
-    }
-    pci_write_config(device_get_parent(atadev->channel->dev), 
-                   0x60 + (devno<<2), timing, 4);
-}
-
-static void
-hpt_timing(struct ata_device *atadev, int devno, int mode)
-{
-    device_t parent = device_get_parent(atadev->channel->dev);
-    u_int32_t chiptype = atadev->channel->chiptype;
-    int chiprev = pci_get_revid(parent);
-    u_int32_t timing;
-
-    if (chiptype == 0x00081103 && chiprev >= 0x07) {
-       switch (mode) {                                         /* HPT374 */
-       case ATA_PIO0:  timing = 0x0ac1f48a; break;
-       case ATA_PIO1:  timing = 0x0ac1f465; break;
-       case ATA_PIO2:  timing = 0x0a81f454; break;
-       case ATA_PIO3:  timing = 0x0a81f443; break;
-       case ATA_PIO4:  timing = 0x0a81f442; break;
-       case ATA_WDMA2: timing = 0x22808242; break;
-       case ATA_UDMA2: timing = 0x120c8242; break;
-       case ATA_UDMA4: timing = 0x12ac8242; break;
-       case ATA_UDMA5: timing = 0x12848242; break;
-       case ATA_UDMA6: timing = 0x12808242; break;
-       default:        timing = 0x0d029d5e;
-       }
-    }
-    else if ((chiptype == 0x00041103 && chiprev >= 0x05) ||
-            (chiptype == 0x00051103 && chiprev >= 0x01)) {
-       switch (mode) {                                         /* HPT372 */
-       case ATA_PIO0:  timing = 0x0d029d5e; break;
-       case ATA_PIO1:  timing = 0x0d029d26; break;
-       case ATA_PIO2:  timing = 0x0c829ca6; break;
-       case ATA_PIO3:  timing = 0x0c829c84; break;
-       case ATA_PIO4:  timing = 0x0c829c62; break;
-       case ATA_WDMA2: timing = 0x2c829262; break;
-       case ATA_UDMA2: timing = 0x1c91dc62; break;
-       case ATA_UDMA4: timing = 0x1c8ddc62; break;
-       case ATA_UDMA5: timing = 0x1c6ddc62; break;
-       case ATA_UDMA6: timing = 0x1c81dc62; break;
-       default:        timing = 0x0d029d5e;
-       }
-    }
-    else if (chiptype == 0x00041103 && chiprev >= 0x03) {
-       switch (mode) {                                         /* HPT370 */
-       case ATA_PIO0:  timing = 0x06914e57; break;
-       case ATA_PIO1:  timing = 0x06914e43; break;
-       case ATA_PIO2:  timing = 0x06514e33; break;
-       case ATA_PIO3:  timing = 0x06514e22; break;
-       case ATA_PIO4:  timing = 0x06514e21; break;
-       case ATA_WDMA2: timing = 0x26514e21; break;
-       case ATA_UDMA2: timing = 0x16494e31; break;
-       case ATA_UDMA4: timing = 0x16454e31; break;
-       case ATA_UDMA5: timing = 0x16454e31; break;
-       default:        timing = 0x06514e57;
-       }
-       pci_write_config(parent, 0x40 + (devno << 2) , timing, 4);
-    }
-    else {                                                     /* HPT36[68] */
-       switch (pci_read_config(parent, 0x41 + (devno << 2), 1)) {
-       case 0x85:      /* 25Mhz */
-           switch (mode) {
-           case ATA_PIO0:      timing = 0x40d08585; break;
-           case ATA_PIO1:      timing = 0x40d08572; break;
-           case ATA_PIO2:      timing = 0x40ca8542; break;
-           case ATA_PIO3:      timing = 0x40ca8532; break;
-           case ATA_PIO4:      timing = 0x40ca8521; break;
-           case ATA_WDMA2:     timing = 0x20ca8521; break;
-           case ATA_UDMA2:     timing = 0x10cf8521; break;
-           case ATA_UDMA4:     timing = 0x10c98521; break;
-           default:            timing = 0x01208585;
-           }
-           break;
-       default:
-       case 0xa7:      /* 33MHz */
-           switch (mode) {
-           case ATA_PIO0:      timing = 0x40d0a7aa; break;
-           case ATA_PIO1:      timing = 0x40d0a7a3; break;
-           case ATA_PIO2:      timing = 0x40d0a753; break;
-           case ATA_PIO3:      timing = 0x40c8a742; break;
-           case ATA_PIO4:      timing = 0x40c8a731; break;
-           case ATA_WDMA2:     timing = 0x20c8a731; break;
-           case ATA_UDMA2:     timing = 0x10caa731; break;
-           case ATA_UDMA4:     timing = 0x10c9a731; break;
-           default:            timing = 0x0120a7a7;
-           }
-           break;
-       case 0xd9:      /* 40Mhz */
-           switch (mode) {
-           case ATA_PIO0:      timing = 0x4018d9d9; break;
-           case ATA_PIO1:      timing = 0x4010d9c7; break;
-           case ATA_PIO2:      timing = 0x4010d997; break;
-           case ATA_PIO3:      timing = 0x4010d974; break;
-           case ATA_PIO4:      timing = 0x4008d963; break;
-           case ATA_WDMA2:     timing = 0x2008d943; break;
-           case ATA_UDMA2:     timing = 0x100bd943; break;
-           case ATA_UDMA4:     timing = 0x100fd943; break;
-           default:            timing = 0x0120d9d9;
-           }
-       }
-    }
-    pci_write_config(parent, 0x40 + (devno << 2) , timing, 4);
-}
-
-static int
-hpt_cable80(struct ata_device *atadev)
-{
-    device_t parent = device_get_parent(atadev->channel->dev);
-    u_int8_t reg, val, res;
-
-    if (atadev->channel->chiptype == 0x00081103 && pci_get_function(parent) == 1) {
-       reg = atadev->channel->unit ? 0x57 : 0x53;
-       val = pci_read_config(parent, reg, 1);
-       pci_write_config(parent, reg, val | 0x80, 1);
-    }
-    else {
-       reg = 0x5b;
-       val = pci_read_config(parent, reg, 1);
-       pci_write_config(parent, reg, val & 0xfe, 1);
-    }
-    res = pci_read_config(parent, 0x5a, 1) & (atadev->channel->unit ? 0x01 : 0x02);
-    pci_write_config(parent, reg, val, 1);
-    return !res;
-}
diff --git a/sys/dev/disk/ata/ata-isa.c b/sys/dev/disk/ata/ata-isa.c
deleted file mode 100644 (file)
index 05781c1..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-isa.c,v 1.4.2.1 2002/03/18 08:37:33 sos Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/disk.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/buf.h>
-#include <sys/malloc.h>
-#include <sys/devicestat.h>
-#include <sys/sysctl.h>
-#include <sys/rman.h>
-
-#include <machine/stdarg.h>
-
-#include <bus/isa/isavar.h>
-#include "ata-all.h"
-
-/* local vars */
-static struct isa_pnp_id ata_ids[] = {
-    {0x0006d041,       "Generic ESDI/IDE/ATA controller"},     /* PNP0600 */
-    {0x0106d041,       "Plus Hardcard II"},                    /* PNP0601 */
-    {0x0206d041,       "Plus Hardcard IIXL/EZ"},               /* PNP0602 */
-    {0x0306d041,       "Generic ATA"},                         /* PNP0603 */
-    {0}
-};
-
-static int
-ata_isa_probe(device_t dev)
-{
-    struct ata_channel *ch = device_get_softc(dev);
-    struct resource *io;
-    u_long tmp;
-    int rid;
-
-    /* check isapnp ids */
-    if (ISA_PNP_PROBE(device_get_parent(dev), dev, ata_ids) == ENXIO)
-       return ENXIO;
-    
-    /* allocate the io port range to get the start address */
-    rid = ATA_IOADDR_RID;
-    io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
-                           ATA_IOSIZE, RF_ACTIVE);
-    if (!io)
-       return ENOMEM;
-
-    /* set the altport range */
-    if (bus_get_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID, &tmp, &tmp)) {
-       bus_set_resource(dev, SYS_RES_IOPORT, ATA_ALTADDR_RID,
-                        rman_get_start(io) + ATA_ALTOFFSET, ATA_ALTIOSIZE, -1);
-    }
-
-    bus_release_resource(dev, SYS_RES_IOPORT, rid, io);
-    ch->unit = 0;
-    ch->flags |= ATA_USE_16BIT;
-    return ata_probe(dev);
-}
-
-static device_method_t ata_isa_methods[] = {
-    /* device interface */
-    DEVMETHOD(device_probe,    ata_isa_probe),
-    DEVMETHOD(device_attach,   ata_attach),
-    DEVMETHOD(device_resume,   ata_resume),
-    DEVMETHOD(device_suspend,  ata_suspend),
-    { 0, 0 }
-};
-
-static driver_t ata_isa_driver = {
-    "ata",
-    ata_isa_methods,
-    sizeof(struct ata_channel),
-};
-
-DRIVER_MODULE(ata, isa, ata_isa_driver, ata_devclass, NULL, NULL);
-
-/* 
- * the following is a bandaid to get ISA only setups to link,
- * since these are getting rare the ugliness is kept here
- */
-#include "use_pci.h"
-#if NPCI == 0
-int
-ata_dmaalloc(struct ata_device *ch, int flags)
-{
-    return 0;
-}
-
-void
-ata_dmafree(struct ata_device *atadev)
-{
-}
-
-void
-ata_dmafreetags(struct ata_channel *ch)
-{
-}
-
-void
-ata_dmainit(struct ata_device *atadev, int piomode, int wdmamode, int udmamode)
-{
-}
-
-int
-ata_dmasetup(struct ata_device *atadev, caddr_t data, int32_t count)
-{
-    return -1;
-}
-
-int
-ata_dmastart(struct ata_device *atadev, caddr_t data, int32_t count, int dir)
-{
-    return -1;
-}
-
-int
-ata_dmadone(struct ata_device *atadev)
-{
-    return -1;
-}
-
-int
-ata_dmastatus(struct ata_channel *ch)
-{
-    return -1;
-}
-#endif
diff --git a/sys/dev/disk/ata/ata-pci.c b/sys/dev/disk/ata/ata-pci.c
deleted file mode 100644 (file)
index 7dfb2d7..0000000
+++ /dev/null
@@ -1,987 +0,0 @@
-/*-
- * Copyright (c) 1998,1999,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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-pci.c,v 1.32.2.15 2003/06/06 13:27:05 fjoe Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/disk.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/buf.h>
-#include <sys/malloc.h>
-#include <sys/devicestat.h>
-#include <sys/sysctl.h>
-#include <sys/rman.h>
-#include <sys/machintr.h>
-
-#include <machine/stdarg.h>
-#include <machine/clock.h>
-
-#include <bus/pci/pcivar.h>
-#include <bus/pci/pcireg.h>
-#include "ata-all.h"
-
-/* device structures */
-struct ata_pci_controller {
-    struct resource *bmio;
-    int bmaddr;
-    struct resource *irq;
-    int irqcnt;
-};
-
-/* misc defines */
-#define IOMASK                 0xfffffffc
-#define GRANDPARENT(dev)       device_get_parent(device_get_parent(dev))
-#define ATA_MASTERDEV(dev)     ((pci_get_progif(dev) & 0x80) && \
-                                (pci_get_progif(dev) & 0x05) != 0x05)
-
-int
-ata_find_dev(device_t dev, u_int32_t devid, u_int32_t revid)
-{
-    device_t *children;
-    int nchildren, i;
-
-    if (device_get_children(device_get_parent(dev), &children, &nchildren))
-       return 0;
-
-    for (i = 0; i < nchildren; i++) {
-       if (pci_get_devid(children[i]) == devid &&
-           pci_get_revid(children[i]) >= revid) {
-           kfree(children, M_TEMP);
-           return 1;
-       }
-    }
-    kfree(children, M_TEMP);
-    return 0;
-}
-
-static void
-ata_via_southbridge_fixup(device_t dev)
-{
-    device_t *children;
-    int nchildren, i;
-
-    if (device_get_children(device_get_parent(dev), &children, &nchildren))
-       return;
-
-    for (i = 0; i < nchildren; i++) {
-       if (pci_get_devid(children[i]) == 0x03051106 ||         /* VIA VT8363 */
-           pci_get_devid(children[i]) == 0x03911106 ||         /* VIA VT8371 */
-           pci_get_devid(children[i]) == 0x31021106 ||         /* VIA VT8662 */
-           pci_get_devid(children[i]) == 0x31121106) {         /* VIA VT8361 */
-           u_int8_t reg76 = pci_read_config(children[i], 0x76, 1);
-
-           if ((reg76 & 0xf0) != 0xd0) {
-               device_printf(dev,
-               "Correcting VIA config for southbridge data corruption bug\n");
-               pci_write_config(children[i], 0x75, 0x80, 1);
-               pci_write_config(children[i], 0x76, (reg76 & 0x0f) | 0xd0, 1);
-           }
-           break;
-       }
-    }
-    kfree(children, M_TEMP);
-}
-
-static const char *
-ata_pci_match(device_t dev)
-{
-    if (pci_get_class(dev) != PCIC_STORAGE)
-       return NULL;
-
-    switch (pci_get_devid(dev)) {
-    /* supported chipsets */
-    case 0x12308086:
-       return "Intel PIIX ATA controller";
-
-    case 0x70108086:
-       return "Intel PIIX3 ATA controller";
-
-    case 0x71118086:
-    case 0x71998086:
-    case 0x84ca8086:
-       return "Intel PIIX4 ATA33 controller";
-
-    case 0x24218086:
-       return "Intel ICH0 ATA33 controller";
-
-    case 0x24118086:
-    case 0x76018086:
-       return "Intel ICH ATA66 controller";
-
-    case 0x244a8086:
-    case 0x244b8086:
-       return "Intel ICH2 ATA100 controller";
-
-    case 0x248a8086:
-    case 0x248b8086:
-       return "Intel ICH3 ATA100 controller";
-
-    case 0x24ca8086:
-    case 0x24cb8086:
-       return "Intel ICH4 ATA100 controller";
-
-    case 0x24d18086:
-       return "Intel ICH5 SATA150 controller";
-
-    case 0x24db8086:
-       return "Intel ICH5 ATA100 controller";
-
-    case 0x269e8086:
-    case 0x26808086:
-       return "Intel ICH6 SATA300 controller";
-
-    case 0x26518086:
-       return "Intel ICH6/W SATA150 controller";
-
-    case 0x26528086:
-       return "Intel ICH6R/RW SATA150 controller";
-       
-    case 0x26538086:
-       return "Intel ICH6M SATA150 controller";
-       
-    case 0x266f8086:
-       return "Intel ICH6R/RW ATA100 controller";
-
-    case 0x27df8086:
-       return "Intel ICH7 ATA controller";
-
-    case 0x27c48086:
-       return "Intel ICH7M SATA controller";
-
-    case 0x522910b9:
-       if (pci_get_revid(dev) >= 0xc4)
-           return "AcerLabs Aladdin ATA100 controller";
-       else if (pci_get_revid(dev) >= 0xc2)
-           return "AcerLabs Aladdin ATA66 controller";
-       else if (pci_get_revid(dev) >= 0x20)
-           return "AcerLabs Aladdin ATA33 controller";
-       else
-           return "AcerLabs Aladdin ATA controller";
-
-    case 0x05711106: 
-       if (ata_find_dev(dev, 0x05861106, 0x02))
-           return "VIA 82C586 ATA33 controller";
-       if (ata_find_dev(dev, 0x05861106, 0))
-           return "VIA 82C586 ATA controller";
-       if (ata_find_dev(dev, 0x05961106, 0x12))
-           return "VIA 82C596 ATA66 controller";
-       if (ata_find_dev(dev, 0x05961106, 0))
-           return "VIA 82C596 ATA33 controller";
-       if (ata_find_dev(dev, 0x06861106, 0x40))
-           return "VIA 82C686 ATA100 controller";
-       if (ata_find_dev(dev, 0x06861106, 0x10))
-           return "VIA 82C686 ATA66 controller";
-       if (ata_find_dev(dev, 0x06861106, 0))
-           return "VIA 82C686 ATA33 controller";
-       if (ata_find_dev(dev, 0x82311106, 0))
-           return "VIA 8231 ATA100 controller";
-       if (ata_find_dev(dev, 0x30741106, 0) ||
-           ata_find_dev(dev, 0x31091106, 0))
-           return "VIA 8233 ATA100 controller";
-       if (ata_find_dev(dev, 0x31471106, 0))
-           return "VIA 8233 ATA133 controller";
-       if (ata_find_dev(dev, 0x31771106, 0))
-           return "VIA 8235 ATA133 controller";
-       if (ata_find_dev(dev, 0x31491106, 0))
-           return "VIA 8237 ATA133 controller";
-       return "VIA Apollo ATA controller";
-
-    case 0x31491106:
-        return "VIA 8237 SATA 150 controller";
-
-    case 0x55131039:
-       if (ata_find_dev(dev, 0x07461039, 0))
-           return "SiS 5591 ATA133 controller";
-       if (ata_find_dev(dev, 0x06301039, 0x30) ||
-           ata_find_dev(dev, 0x06331039, 0) ||
-           ata_find_dev(dev, 0x06351039, 0) ||
-           ata_find_dev(dev, 0x06401039, 0) ||
-           ata_find_dev(dev, 0x06451039, 0) ||
-           ata_find_dev(dev, 0x06461039, 0) ||
-           ata_find_dev(dev, 0x06481039, 0) ||
-           ata_find_dev(dev, 0x06501039, 0) ||
-           ata_find_dev(dev, 0x07301039, 0) ||
-           ata_find_dev(dev, 0x07331039, 0) ||
-           ata_find_dev(dev, 0x07351039, 0) ||
-           ata_find_dev(dev, 0x07401039, 0) ||
-           ata_find_dev(dev, 0x07451039, 0) ||
-           ata_find_dev(dev, 0x07501039, 0))
-           return "SiS 5591 ATA100 controller";
-       else if (ata_find_dev(dev, 0x05301039, 0) ||
-           ata_find_dev(dev, 0x05401039, 0) ||
-           ata_find_dev(dev, 0x06201039, 0) ||
-           ata_find_dev(dev, 0x06301039, 0))
-           return "SiS 5591 ATA66 controller";
-       else
-           return "SiS 5591 ATA33 controller";
-
-    case 0x35121095:
-       return "SiI 3512 SATA controller";
-
-    case 0x31121095:
-       return "SiI 3112 SATA controller";
-
-    case 0x31141095:
-       return "SiI 3114 SATA controller";
-
-    case 0x31241095:
-       return "SiI 3124 SATA controller";
-
-    case 0x06801095:
-       return "SiI 0680 ATA133 controller";
-
-    case 0x06491095:
-       return "CMD 649 ATA100 controller";
-
-    case 0x06481095:
-       return "CMD 648 ATA66 controller";
-
-    case 0x06461095:
-       return "CMD 646 ATA controller";
-
-    case 0xc6931080:
-       if (pci_get_subclass(dev) == PCIS_STORAGE_IDE)
-           return "Cypress 82C693 ATA controller";
-       return NULL;
-
-    case 0x01021078:
-       return "Cyrix 5530 ATA33 controller";
-
-    case 0x74091022:
-       return "AMD 756 ATA66 controller";
-
-    case 0x74111022:
-       return "AMD 766 ATA100 controller";
-
-    case 0x74411022:
-       return "AMD 768 ATA100 controller";
-
-    case 0x74691022:
-       return "AMD 8111 UltraATA/133 controller";
-
-    case 0x01bc10de:
-       return "nVIDIA nForce1 ATA100 controller";
-
-    case 0x006510de:
-       return "nVIDIA nForce2 ATA133 controller";
-
-    case 0x00d510de:
-       return "nVIDIA nForce3 ATA133 controller";
-
-    case 0x00e310de:
-       return "nVIDIA nForce3 PRO S1 controller";
-
-    case 0x00e510de:
-       return "nVIDIA nForce3 PRO controller";
-
-    case 0x02111166:
-       return "ServerWorks ROSB4 ATA33 controller";
-
-    case 0x02121166:
-       if (pci_get_revid(dev) >= 0x92)
-           return "ServerWorks CSB5 ATA100 controller";
-       else
-           return "ServerWorks CSB5 ATA66 controller";
-
-    case 0x02131166:
-       return "ServerWorks CSB6 ATA100 controller (channel 0+1)";
-
-    case 0x02171166:
-       return "ServerWorks CSB6 ATA66 controller (channel 2)";
-
-    case 0x4d33105a:
-       return "Promise ATA33 controller";
-
-    case 0x0d38105a:
-    case 0x4d38105a:
-       return "Promise ATA66 controller";
-
-    case 0x0d30105a:
-    case 0x4d30105a:
-       return "Promise ATA100 controller";
-
-    case 0x4d68105a:
-    case 0x6268105a: 
-       if (pci_get_devid(GRANDPARENT(dev)) == 0x00221011 &&
-           pci_get_class(GRANDPARENT(dev)) == PCIC_BRIDGE) {
-           static long start = 0, end = 0;
-
-           /* we belive we are on a TX4, now do our (simple) magic */
-           if (pci_get_slot(dev) == 1) {
-               bus_get_resource(dev, SYS_RES_IRQ, 0, &start, &end);
-               return "Promise TX4 ATA100 controller (channel 0+1)";
-           }
-           else if (pci_get_slot(dev) == 2 && start && end) {
-               bus_set_resource(dev, SYS_RES_IRQ, 0, start, end,
-                   machintr_legacy_intr_cpuid(start));
-               start = end = 0;
-               return "Promise TX4 ATA100 controller (channel 2+3)";
-           }
-           else
-               start = end = 0;
-       }
-       return "Promise TX2 ATA100 controller";
-
-    case 0x4d69105a:
-    case 0x5275105a:
-    case 0x6269105a: 
-    case 0x7275105a: 
-       return "Promise TX2 ATA133 controller";
-
-    case 0x00041103:
-       switch (pci_get_revid(dev)) {
-       case 0x00:
-       case 0x01:
-           return "HighPoint HPT366 ATA66 controller";
-       case 0x02:
-           return "HighPoint HPT368 ATA66 controller";
-       case 0x03:
-       case 0x04:
-           return "HighPoint HPT370 ATA100 controller";
-       case 0x05:
-           return "HighPoint HPT372 ATA133 controller";
-       }
-       return NULL;
-
-    case 0x00051103:
-       switch (pci_get_revid(dev)) {
-       case 0x01:
-       case 0x02:
-           return "HighPoint HPT372 ATA133 controller";
-       }
-       return NULL;
-
-    case 0x00081103:
-       switch (pci_get_revid(dev)) {
-       case 0x07:
-           return "HighPoint HPT374 ATA133 controller";
-       }
-       return NULL;
-
-    case 0x000116ca:
-       return "Cenatek Rocket Drive controller";
-
-   /* unsupported but known chipsets, generic DMA only */
-    case 0x10001042:
-    case 0x10011042:
-       return "RZ 100? ATA controller !WARNING! buggy chip data loss possible";
-
-    case 0x06401095:
-       return "CMD 640 ATA controller !WARNING! buggy chip data loss possible";
-
-    /* unknown chipsets, try generic DMA if it seems possible */
-    default:
-       if (pci_get_class(dev) == PCIC_STORAGE &&
-           (pci_get_subclass(dev) == PCIS_STORAGE_IDE))
-           return "Generic PCI ATA controller";
-    }
-    return NULL;
-}
-
-static int
-ata_pci_probe(device_t dev)
-{
-    const char *desc = ata_pci_match(dev);
-    
-    if (desc) {
-       device_set_desc(dev, desc);
-       device_set_async_attach(dev, TRUE);
-       return 0;
-    } else {
-       return ENXIO;
-    }
-}
-
-static int
-ata_pci_add_child(device_t dev, int unit)
-{
-    device_t child;
-
-    /* check if this is located at one of the std addresses */
-    if (ATA_MASTERDEV(dev)) {
-       if (!(child = device_add_child(dev, "ata", unit)))
-           return ENOMEM;
-    }
-    else {
-       if (!(child = device_add_child(dev, "ata", 2)))
-           return ENOMEM;
-    }
-    return 0;
-}
-
-static int
-ata_pci_attach(device_t dev)
-{
-    struct ata_pci_controller *controller = device_get_softc(dev);
-    u_int8_t class, subclass;
-    u_int32_t type, cmd;
-    int rid;
-    int flags;
-
-    /* set up vendor-specific stuff */
-    type = pci_get_devid(dev);
-    class = pci_get_class(dev);
-    subclass = pci_get_subclass(dev);
-    cmd = pci_read_config(dev, PCIR_COMMAND, 4);
-
-    if (!(cmd & PCIM_CMD_PORTEN)) {
-       device_printf(dev, "ATA channel disabled by BIOS\n");
-       return 0;
-    }
-
-    /* is busmastering supported ? */
-    if ((cmd & (PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN)) == 
-       (PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN)) {
-
-       /* is there a valid port range to connect to ? */
-       rid = 0x20;
-       controller->bmio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
-                                             0, ~0, 1, RF_ACTIVE);
-       if (!controller->bmio)
-           device_printf(dev, "Busmastering DMA not configured\n");
-    }
-    else
-       device_printf(dev, "Busmastering DMA not supported\n");
-
-    /* do extra chipset specific setups */
-    flags = 0;
-
-    switch (type) {
-    case 0x522910b9: /* Aladdin need to activate the ATAPI FIFO */
-       pci_write_config(dev, 0x53, 
-                        (pci_read_config(dev, 0x53, 1) & ~0x01) | 0x02, 1);
-       break;
-
-    case 0x4d38105a: /* Promise 66 & 100 (before TX2) need the clock changed */
-    case 0x4d30105a:
-    case 0x0d30105a:
-       ATA_OUTB(controller->bmio, 0x11, ATA_INB(controller->bmio, 0x11)|0x0a);
-       /* FALLTHROUGH */
-
-    case 0x4d33105a: /* Promise (before TX2) need burst mode turned on */
-       ATA_OUTB(controller->bmio, 0x1f, ATA_INB(controller->bmio, 0x1f)|0x01);
-       break;
-
-    case 0x00041103:   /* HighPoint HPT366/368/370/372 */
-       if (pci_get_revid(dev) < 2) {   /* HPT 366 */
-           /* turn off interrupt prediction */
-           pci_write_config(dev, 0x51, 
-                            (pci_read_config(dev, 0x51, 1) & ~0x80), 1);
-           break;
-       }
-       if (pci_get_revid(dev) < 5) {   /* HPT368/370 */
-           /* turn off interrupt prediction */
-           pci_write_config(dev, 0x51,
-                            (pci_read_config(dev, 0x51, 1) & ~0x03), 1);
-           pci_write_config(dev, 0x55,
-                            (pci_read_config(dev, 0x55, 1) & ~0x03), 1);
-
-           /* turn on interrupts */
-           pci_write_config(dev, 0x5a,
-                            (pci_read_config(dev, 0x5a, 1) & ~0x10), 1);
-
-           /* set clocks etc */
-           pci_write_config(dev, 0x5b, 0x22, 1);
-           break;
-       }
-       /* FALLTHROUGH */
-
-    case 0x00051103:   /* HighPoint HPT372 */
-    case 0x00081103:   /* HighPoint HPT374 */
-       /* turn off interrupt prediction */
-       pci_write_config(dev, 0x51, (pci_read_config(dev, 0x51, 1) & ~0x03), 1);
-       pci_write_config(dev, 0x55, (pci_read_config(dev, 0x55, 1) & ~0x03), 1);
-
-       /* turn on interrupts */
-       pci_write_config(dev, 0x5a, (pci_read_config(dev, 0x5a, 1) & ~0x10), 1);
-
-       /* set clocks etc */
-       pci_write_config(dev, 0x5b,
-                        (pci_read_config(dev, 0x5b, 1) & 0x01) | 0x20, 1);
-       break;
-
-    case 0x05711106: /* VIA 82C586, '596, '686 default setup */
-       /* prepare for ATA-66 on the 82C686a and 82C596b */
-       if ((ata_find_dev(dev, 0x06861106, 0x10) && 
-            !ata_find_dev(dev, 0x06861106, 0x40)) || 
-           ata_find_dev(dev, 0x05961106, 0x12))
-           pci_write_config(dev, 0x50, 0x030b030b, 4);   
-
-       /* the southbridge might need the data corruption fix */
-       if (ata_find_dev(dev, 0x06861106, 0x40) ||
-           ata_find_dev(dev, 0x82311106, 0x10))
-           ata_via_southbridge_fixup(dev);
-
-       /* set fifo configuration half'n'half */
-       pci_write_config(dev, 0x43, 
-                        (pci_read_config(dev, 0x43, 1) & 0x90) | 0x2a, 1);
-
-       /* set status register read retry */
-       pci_write_config(dev, 0x44, pci_read_config(dev, 0x44, 1) | 0x08, 1);
-
-       /* set DMA read & end-of-sector fifo flush */
-       pci_write_config(dev, 0x46, 
-                        (pci_read_config(dev, 0x46, 1) & 0x0c) | 0xf0, 1);
-
-       /* set sector size */
-       pci_write_config(dev, 0x60, DEV_BSIZE, 2);
-       pci_write_config(dev, 0x68, DEV_BSIZE, 2);
-       break;
-    case 0x74111022: /* AMD 766 default setup */
-       flags = 1;      /* bugged */
-       /* fall through */
-    case 0x74091022: /* AMD 756 default setup */
-    case 0x74411022: /* AMD 768 default setup */
-    case 0x746d1022: /* AMD 8111 default setup */
-       if (flags) {
-               pci_write_config(dev, 0x41,  
-                               pci_read_config(dev, 0x41, 1) & 0x0f, 1);
-       } else {
-               pci_write_config(dev, 0x41, 
-                               pci_read_config(dev, 0x41, 1) | 0xf0, 1);
-       }
-       break;
-    case 0x01bc10de: /* NVIDIA nForce1 default setup */
-    case 0x006510de: /* NVIDIA nForce2 default setup */
-       flags = 1;
-       /* fall through */
-    case 0x00d510de: /* NVIDIA nForce3 default setup */
-       if (flags) {
-               pci_write_config(dev, 0x51, 
-                               pci_read_config(dev, 0x51, 1) & 0x0f, 1);  
-       } else {
-               pci_write_config(dev, 0x51,
-                               pci_read_config(dev, 0x51, 1) | 0xf0, 1);  
-       }
-       break;
-
-    case 0x02111166: /* ServerWorks ROSB4 enable UDMA33 */
-       pci_write_config(dev, 0x64,   
-                        (pci_read_config(dev, 0x64, 4) & ~0x00002000) |
-                        0x00004000, 4);
-       break;
-       
-    case 0x02121166: /* ServerWorks CSB5 enable UDMA66/100 depending on rev */
-       pci_write_config(dev, 0x5a,   
-                        (pci_read_config(dev, 0x5a, 1) & ~0x40) |
-                        (pci_get_revid(dev) >= 0x92) ? 0x03 : 0x02, 1);
-       break;
-
-    case 0x06801095: /* SiI 0680 set ATA reference clock speed */
-       if ((pci_read_config(dev, 0x8a, 1) & 0x30) != 0x10)
-           pci_write_config(dev, 0x8a, 
-                            (pci_read_config(dev, 0x8a, 1) & 0x0F) | 0x10, 1);
-       if ((pci_read_config(dev, 0x8a, 1) & 0x30) != 0x10)
-           device_printf(dev, "SiI 0680 could not set clock\n");
-       break;
-
-    case 0x06491095:
-    case 0x06481095:
-    case 0x06461095: /* CMD 646 enable interrupts, set DMA read mode */
-       pci_write_config(dev, 0x71, 0x01, 1);
-       break;
-
-    case 0x10001042:   /* RZ 100? known bad, no DMA */
-    case 0x10011042:
-    case 0x06401095:   /* CMD 640 known bad, no DMA */
-       controller->bmio = NULL;
-       device_printf(dev, "Busmastering DMA disabled\n");
-    }
-
-    if (controller->bmio) {
-       controller->bmaddr = rman_get_start(controller->bmio);
-       BUS_RELEASE_RESOURCE(device_get_parent(dev), dev,
-                            SYS_RES_IOPORT, rid, controller->bmio);
-       controller->bmio = NULL;
-    }
-
-    /*
-     * the Cypress chip is a mess, it contains two ATA functions, but 
-     * both channels are visible on the first one.
-     * simply ignore the second function for now, as the right
-     * solution (ignoring the second channel on the first function)
-     * doesn't work with the crappy ATA interrupt setup on the alpha.
-     */
-    if (pci_get_devid(dev) == 0xc6931080 && pci_get_function(dev) > 1)
-       return 0;
-
-    ata_pci_add_child(dev, 0);
-
-    if (ATA_MASTERDEV(dev) || pci_read_config(dev, 0x18, 4) & IOMASK)
-       ata_pci_add_child(dev, 1);
-
-    return bus_generic_attach(dev);
-}
-
-static int
-ata_pci_intr(struct ata_channel *ch)
-{
-    u_int8_t dmastat;
-
-    /* 
-     * since we might share the IRQ with another device, and in some
-     * cases with our twin channel, we only want to process interrupts
-     * that we know this channel generated.
-     */
-    switch (ch->chiptype) {
-    case 0x00041103:   /* HighPoint HPT366/368/370/372 */
-    case 0x00051103:   /* HighPoint HPT372 */
-    case 0x00081103:   /* HighPoint HPT374 */
-       if (((dmastat = ata_dmastatus(ch)) &
-           (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != ATA_BMSTAT_INTERRUPT)
-           return 1;
-       ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT, dmastat | ATA_BMSTAT_INTERRUPT);
-       DELAY(1);
-       return 0;
-
-    case 0x06481095:   /* CMD 648 */
-    case 0x06491095:   /* CMD 649 */
-       if (!(pci_read_config(device_get_parent(ch->dev), 0x71, 1) &
-             (ch->unit ? 0x08 : 0x04)))
-           return 1;
-#if !defined(NO_ATANG)
-       pci_write_config(device_get_parent(ch->dev), 0x71,
-               pci_read_config(device_get_parent(ch->dev), 0x71, 1) &
-               ~(ch->unit ? 0x04 : 0x08), 1);
-       break;
-#endif
-
-    case 0x06801095:   /* SiI 680 */
-       if (!(pci_read_config(device_get_parent(ch->dev),
-                               (ch->unit ? 0xb1 : 0xa1), 1) & 0x08))
-           return 1;
-       break;
-
-    case 0x4d33105a:   /* Promise Ultra/Fasttrak 33 */
-    case 0x0d38105a:   /* Promise Fasttrak 66 */
-    case 0x4d38105a:   /* Promise Ultra/Fasttrak 66 */
-    case 0x0d30105a:   /* Promise OEM ATA100 */
-    case 0x4d30105a:   /* Promise Ultra/Fasttrak 100 */
-       if (!(ATA_INL(ch->r_bmio, (ch->unit ? 0x14 : 0x1c)) &
-             (ch->unit ? 0x00004000 : 0x00000400)))
-           return 1;
-       break;
-
-    case 0x4d68105a:   /* Promise TX2 ATA100 */
-    case 0x6268105a:   /* Promise TX2 ATA100 */
-    case 0x4d69105a:   /* Promise TX2 ATA133 */
-    case 0x5275105a:   /* Promise TX2 ATA133 */
-    case 0x6269105a:   /* Promise TX2 ATA133 */
-    case 0x7275105a:   /* Promise TX2 ATA133 */
-       ATA_OUTB(ch->r_bmio, ATA_BMDEVSPEC_0, 0x0b);
-       if (!(ATA_INB(ch->r_bmio, ATA_BMDEVSPEC_1) & 0x20))
-           return 1;
-       break;
-
-    case 0x24d18086:   /* Intel ICH5 SATA150 */
-    case 0x24db8086:   /* Intel ICH5 ATA100 */
-    case 0x26518086:   /* Intel ICH6 SATA150 */
-    case 0x26528086:   /* Intel ICH6R SATA150 */
-    case 0x26808086:   /* Intel ICH6R SATA150 */
-    case 0x260e8086:   /* Intel ICH6 SATA300 */
-       dmastat = ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT);
-       if ((dmastat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) !=
-               ATA_BMSTAT_INTERRUPT)
-           return 1;
-       ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT, dmastat &
-           ~(ATA_BMSTAT_DMA_SIMPLEX | ATA_BMSTAT_ERROR));
-       DELAY(1);
-       return 0;
-
-    }
-
-    if (ch->flags & ATA_DMA_ACTIVE) {
-       if (!((dmastat = ata_dmastatus(ch)) & ATA_BMSTAT_INTERRUPT))
-           return 1;
-       ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT, dmastat | ATA_BMSTAT_INTERRUPT);
-       DELAY(1);
-    }
-    return 0;
-}
-
-static int
-ata_pci_print_child(device_t dev, device_t child)
-{
-    struct ata_channel *ch = device_get_softc(child);
-    int retval = 0;
-
-    retval += bus_print_child_header(dev, child);
-    retval += kprintf(": at 0x%lx", rman_get_start(ch->r_io));
-
-    if (ATA_MASTERDEV(dev))
-       retval += kprintf(" irq %d", 14 + ch->unit);
-    
-    retval += bus_print_child_footer(dev, child);
-
-    return retval;
-}
-
-static struct resource *
-ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags, int cpuid)
-{
-    struct ata_pci_controller *controller = device_get_softc(dev);
-    struct resource *res = NULL;
-    int unit = ((struct ata_channel *)device_get_softc(child))->unit;
-    int myrid;
-
-    if (type == SYS_RES_IOPORT) {
-       switch (*rid) {
-       case ATA_IOADDR_RID:
-           if (ATA_MASTERDEV(dev)) {
-               myrid = 0;
-               start = (unit ? ATA_SECONDARY : ATA_PRIMARY);
-               end = start + ATA_IOSIZE - 1;
-               count = ATA_IOSIZE;
-               res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                        SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags, cpuid);
-           }
-           else {
-               myrid = 0x10 + 8 * unit;
-               res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
-                                        SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags, cpuid);
-           }
-           break;
-
-       case ATA_ALTADDR_RID:
-           if (ATA_MASTERDEV(dev)) {
-               myrid = 0;
-               start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + ATA_ALTOFFSET;
-               end = start + ATA_ALTIOSIZE - 1;
-               count = ATA_ALTIOSIZE;
-               res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                        SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags, cpuid);
-           }
-           else {
-               myrid = 0x14 + 8 * unit;
-               res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
-                                        SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags, cpuid);
-               if (res) {
-                       start = rman_get_start(res) + 2;
-                       end = start + ATA_ALTIOSIZE - 1;
-                       count = ATA_ALTIOSIZE;
-                       BUS_RELEASE_RESOURCE(device_get_parent(dev), dev,
-                                            SYS_RES_IOPORT, myrid, res);
-                       res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
-                                                SYS_RES_IOPORT, &myrid,
-                                                start, end, count, flags,
-                                                cpuid);
-               }
-           }
-           break;
-
-       case ATA_BMADDR_RID:
-           if (controller->bmaddr) {
-               myrid = 0x20;
-               start = (unit == 0 ? 
-                        controller->bmaddr : controller->bmaddr+ATA_BMIOSIZE);
-               end = start + ATA_BMIOSIZE - 1;
-               count = ATA_BMIOSIZE;
-               res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                        SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags, cpuid);
-           }
-       }
-       return res;
-    }
-
-    if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) {
-       if (ATA_MASTERDEV(dev)) {
-           int irq = (unit == 0 ? 14 : 15);
-
-           cpuid = machintr_legacy_intr_cpuid(irq);
-           return BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                     SYS_RES_IRQ, rid, irq, irq, 1, flags,
-                                     cpuid);
-       }
-       else {
-           /* primary and secondary channels share interrupt, keep track */
-           if (!controller->irq) {
-               controller->irq = BUS_ALLOC_RESOURCE(device_get_parent(dev), 
-                                                    dev, SYS_RES_IRQ,
-                                                    rid, 0, ~0, 1, flags,
-                                                    cpuid);
-           }
-           controller->irqcnt++;
-           return controller->irq;
-       }
-    }
-    return 0;
-}
-
-static int
-ata_pci_release_resource(device_t dev, device_t child, int type, int rid,
-                        struct resource *r)
-{
-    struct ata_pci_controller *controller = device_get_softc(dev);
-    int unit = ((struct ata_channel *)device_get_softc(child))->unit;
-
-    if (type == SYS_RES_IOPORT) {
-       switch (rid) {
-       case ATA_IOADDR_RID:
-           if (ATA_MASTERDEV(dev))
-               return BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
-                                           SYS_RES_IOPORT, 0x0, r);
-           else
-               return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev,
-                                           SYS_RES_IOPORT, 0x10 + 8 * unit, r);
-           break;
-
-       case ATA_ALTADDR_RID:
-           if (ATA_MASTERDEV(dev))
-               return BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
-                                           SYS_RES_IOPORT, 0x0, r);
-           else
-               return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev,
-                                           SYS_RES_IOPORT, 0x14 + 8 * unit, r);
-           break;
-
-       case ATA_BMADDR_RID:
-           return BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
-                                       SYS_RES_IOPORT, 0x20, r);
-       default:
-           return ENOENT;
-       }
-    }
-    if (type == SYS_RES_IRQ) {
-       if (rid != ATA_IRQ_RID)
-           return ENOENT;
-
-       if (ATA_MASTERDEV(dev)) {
-           return BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
-                                       SYS_RES_IRQ, rid, r);
-       }
-       else {
-           /* primary and secondary channels share interrupt, keep track */
-           if (--controller->irqcnt)
-               return 0;
-           controller->irq = NULL;
-           return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev,
-                                       SYS_RES_IRQ, rid, r);
-       }
-    }
-    return EINVAL;
-}
-
-static int
-ata_pci_setup_intr(device_t dev, device_t child, struct resource *irq, 
-                  int flags, driver_intr_t *intr, void *arg,
-                  void **cookiep, lwkt_serialize_t serializer)
-{
-    if (ATA_MASTERDEV(dev)) {
-       return BUS_SETUP_INTR(device_get_parent(dev), child, irq,
-                             flags, intr, arg, cookiep, serializer);
-    }
-    else
-       return BUS_SETUP_INTR(device_get_parent(dev), dev, irq,
-                             flags, intr, arg, cookiep, serializer);
-}
-
-static int
-ata_pci_teardown_intr(device_t dev, device_t child, struct resource *irq,
-                     void *cookie)
-{
-    if (ATA_MASTERDEV(dev)) {
-       return BUS_TEARDOWN_INTR(device_get_parent(dev), child, irq, cookie);
-    }
-    else
-       return BUS_TEARDOWN_INTR(device_get_parent(dev), dev, irq, cookie);
-}
-
-static device_method_t ata_pci_methods[] = {
-    /* device interface */
-    DEVMETHOD(device_probe,            ata_pci_probe),
-    DEVMETHOD(device_attach,           ata_pci_attach),
-    DEVMETHOD(device_shutdown,         bus_generic_shutdown),
-    DEVMETHOD(device_suspend,          bus_generic_suspend),
-    DEVMETHOD(device_resume,           bus_generic_resume),
-
-    /* bus methods */
-    DEVMETHOD(bus_print_child,         ata_pci_print_child),
-    DEVMETHOD(bus_alloc_resource,      ata_pci_alloc_resource),
-    DEVMETHOD(bus_release_resource,    ata_pci_release_resource),
-    DEVMETHOD(bus_activate_resource,   bus_generic_activate_resource),
-    DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
-    DEVMETHOD(bus_setup_intr,          ata_pci_setup_intr),
-    DEVMETHOD(bus_teardown_intr,       ata_pci_teardown_intr),
-    { 0, 0 }
-};
-
-static driver_t ata_pci_driver = {
-    "atapci",
-    ata_pci_methods,
-    sizeof(struct ata_pci_controller),
-};
-
-static devclass_t ata_pci_devclass;
-
-DRIVER_MODULE(atapci, pci, ata_pci_driver, ata_pci_devclass, NULL, NULL);
-
-static int
-ata_pcisub_probe(device_t dev)
-{
-    struct ata_channel *ch = device_get_softc(dev);
-    device_t *children;
-    int count, i;
-
-    /* find channel number on this controller */
-    device_get_children(device_get_parent(dev), &children, &count);
-    for (i = 0; i < count; i++) {
-       if (children[i] == dev)
-           ch->unit = i;
-    }
-    kfree(children, M_TEMP);
-    ch->chiptype = pci_get_devid(device_get_parent(dev));
-    ch->intr_func = ata_pci_intr;
-    return ata_probe(dev);
-}
-
-static device_method_t ata_pcisub_methods[] = {
-    /* device interface */
-    DEVMETHOD(device_probe,    ata_pcisub_probe),
-    DEVMETHOD(device_attach,   ata_attach),
-    DEVMETHOD(device_detach,   ata_detach),
-    DEVMETHOD(device_resume,   ata_resume),
-    DEVMETHOD(device_suspend,  ata_suspend),
-    { 0, 0 }
-};
-
-static driver_t ata_pcisub_driver = {
-    "ata",
-    ata_pcisub_methods,
-    sizeof(struct ata_channel),
-};
-
-DRIVER_MODULE(ata, atapci, ata_pcisub_driver, ata_devclass, NULL, NULL);
diff --git a/sys/dev/disk/ata/ata-raid.c b/sys/dev/disk/ata/ata-raid.c
deleted file mode 100644 (file)
index 954a5a5..0000000
+++ /dev/null
@@ -1,1470 +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,
- *    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.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * 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: src/sys/dev/ata/ata-raid.c,v 1.3.2.19 2003/01/30 07:19:59 sos Exp $
- */
-
-#include "opt_ata.h"
-#include <sys/param.h>
-#include <sys/systm.h> 
-#include <sys/ata.h> 
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/buf.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/disk.h>
-#include <sys/devicestat.h>
-#include <sys/cons.h>
-#include <sys/rman.h>
-#include <sys/proc.h>
-#include <sys/buf2.h>
-#include <sys/thread2.h>
-
-#include "ata-all.h"
-#include "ata-disk.h"
-#include "ata-raid.h"
-
-/* device structures */
-static d_open_t                aropen;
-static d_strategy_t    arstrategy;
-
-static struct dev_ops ar_ops = {
-       { "ar", 0, D_DISK },
-       .d_open =       aropen,
-       .d_close =      nullclose,
-       .d_read =       physread,
-       .d_write =      physwrite,
-       .d_strategy =   arstrategy,
-};  
-
-/* prototypes */
-static void ar_attach_raid(struct ar_softc *, int);
-static void ar_done(struct bio *);
-static void ar_config_changed(struct ar_softc *, int);
-static int ar_rebuild(struct ar_softc *);
-static int ar_highpoint_read_conf(struct ad_softc *, struct ar_softc **);
-static int ar_highpoint_write_conf(struct ar_softc *);
-static int ar_promise_read_conf(struct ad_softc *, struct ar_softc **, int);
-static int ar_promise_write_conf(struct ar_softc *);
-static int ar_rw(struct ad_softc *, u_int32_t, int, caddr_t, int);
-static struct ata_device *ar_locate_disk(int);
-
-/* internal vars */
-static struct ar_softc **ar_table = NULL;
-static MALLOC_DEFINE(M_AR, "AR driver", "ATA RAID driver");
-
-int
-ata_raiddisk_attach(struct ad_softc *adp)
-{
-    struct ar_softc *rdp;
-    int array, disk;
-
-    if (ar_table) {
-       for (array = 0; array < MAX_ARRAYS; array++) {
-           if (!(rdp = ar_table[array]) || !rdp->flags)
-               continue;
-   
-           for (disk = 0; disk < rdp->total_disks; disk++) {
-               if ((rdp->disks[disk].flags & AR_DF_ASSIGNED) &&
-                   rdp->disks[disk].device == adp->device) {
-                   ata_prtdev(rdp->disks[disk].device,
-                              "inserted into ar%d disk%d as spare\n",
-                              array, disk);
-                   rdp->disks[disk].flags |= (AR_DF_PRESENT | AR_DF_SPARE);
-                   AD_SOFTC(rdp->disks[disk])->flags = AD_F_RAID_SUBDISK;
-                   ar_config_changed(rdp, 1);
-                   return 1;
-               }
-           }
-       }
-    }
-
-    if (!ar_table) {
-       ar_table = kmalloc(sizeof(struct ar_soft *) * MAX_ARRAYS,
-                         M_AR, M_WAITOK | M_ZERO);
-    }
-
-    switch(adp->device->channel->chiptype) {
-    case 0x4d33105a: case 0x4d38105a: case 0x4d30105a:
-    case 0x0d30105a: case 0x4d68105a: case 0x6268105a:
-    case 0x4d69105a: case 0x5275105a: case 0x6269105a:
-    case 0x7275105a:
-       /* test RAID bit in PCI reg XXX */
-       return (ar_promise_read_conf(adp, ar_table, 0));
-
-    case 0x00041103: case 0x00051103: case 0x00081103:
-       return (ar_highpoint_read_conf(adp, ar_table));
-
-    default:
-       return (ar_promise_read_conf(adp, ar_table, 1));
-    }
-    return 0;
-}
-
-int
-ata_raiddisk_detach(struct ad_softc *adp)
-{
-    struct ar_softc *rdp;
-    int array, disk;
-
-    if (ar_table) {
-       for (array = 0; array < MAX_ARRAYS; array++) {
-           if (!(rdp = ar_table[array]) || !rdp->flags)
-               continue; 
-           for (disk = 0; disk < rdp->total_disks; disk++) {
-               if (rdp->disks[disk].device == adp->device) {
-                   ata_prtdev(rdp->disks[disk].device,
-                              "deleted from ar%d disk%d\n", array, disk);
-                   rdp->disks[disk].flags &= ~(AR_DF_PRESENT | AR_DF_ONLINE);
-                   AD_SOFTC(rdp->disks[disk])->flags &= ~AD_F_RAID_SUBDISK;
-                   ar_config_changed(rdp, 1);
-                   return 1;
-               }
-           }
-       }
-    }
-    return 0;
-}
-
-void
-ata_raid_attach()
-{
-    struct ar_softc *rdp;
-    int array;
-
-    if (!ar_table)
-       return;
-
-    for (array = 0; array < MAX_ARRAYS; array++) {
-       if (!(rdp = ar_table[array]) || !rdp->flags)
-           continue;
-       ar_attach_raid(rdp, 0);
-    }
-}
-
-static void
-ar_attach_raid(struct ar_softc *rdp, int update)
-{
-       struct disk_info info;
-    cdev_t dev;
-    int disk;
-
-    ar_config_changed(rdp, update);
-    dev = disk_create(rdp->lun, &rdp->disk, &ar_ops);
-    dev->si_drv1 = rdp;
-    dev->si_iosize_max = 256 * DEV_BSIZE;
-    rdp->dev = dev;
-
-       /*
-        * Set disk info, as it appears that all needed data is available already.
-        * Setting the disk info will also cause the probing to start.
-        */
-    bzero(&info, sizeof(info));
-    info.d_media_blksize = DEV_BSIZE;          /* mandatory */
-    info.d_media_blocks = rdp->total_sectors;
-
-    info.d_secpertrack = rdp->sectors;         /* optional */
-    info.d_nheads = rdp->heads;
-    info.d_ncylinders = rdp->cylinders;
-    info.d_secpercyl = rdp->sectors * rdp->heads;
-
-    kprintf("ar%d: %lluMB <ATA ", rdp->lun, (unsigned long long)
-          (rdp->total_sectors / ((1024L * 1024L) / DEV_BSIZE)));
-    switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-    case AR_F_RAID0:
-       kprintf("RAID0 "); break;
-    case AR_F_RAID1:
-       kprintf("RAID1 "); break;
-    case AR_F_SPAN:
-       kprintf("SPAN "); break;
-    case (AR_F_RAID0 | AR_F_RAID1):
-       kprintf("RAID0+1 "); break;
-    default:
-       kprintf("unknown 0x%x> ", rdp->flags);
-       return;
-    }
-    kprintf("array> [%d/%d/%d] status: ",
-          rdp->cylinders, rdp->heads, rdp->sectors);
-    switch (rdp->flags & (AR_F_DEGRADED | AR_F_READY)) {
-    case AR_F_READY:
-       kprintf("READY");
-       break;
-    case (AR_F_DEGRADED | AR_F_READY):
-       kprintf("DEGRADED");
-       break;
-    default:
-       kprintf("BROKEN");
-       break;
-    }
-    kprintf(" subdisks:\n");
-    for (disk = 0; disk < rdp->total_disks; disk++) {
-       if (rdp->disks[disk].flags & AR_DF_PRESENT) {
-           if (rdp->disks[disk].flags & AR_DF_ONLINE)
-               kprintf(" %d READY ", disk);
-           else if (rdp->disks[disk].flags & AR_DF_SPARE)
-               kprintf(" %d SPARE ", disk);
-           else
-               kprintf(" %d FREE  ", disk);
-           ad_print(AD_SOFTC(rdp->disks[disk]));
-           kprintf("         ");
-           ata_enclosure_print(AD_SOFTC(rdp->disks[disk])->device);
-       }
-       else if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
-           kprintf(" %d DOWN\n", disk);
-       else
-           kprintf(" %d INVALID no RAID config info on this disk\n", disk);
-    }
-    disk_setdiskinfo(&rdp->disk, &info);
-}
-
-int
-ata_raid_create(struct raid_setup *setup)
-{
-    struct ata_device *atadev;
-    struct ar_softc *rdp;
-    int array, disk;
-    int ctlr = 0, disk_size = 0, total_disks = 0;
-
-    if (!ar_table) {
-       ar_table = kmalloc(sizeof(struct ar_soft *) * MAX_ARRAYS,
-                         M_AR, M_WAITOK | M_ZERO);
-    }
-    for (array = 0; array < MAX_ARRAYS; array++) {
-       if (!ar_table[array])
-           break;
-    }
-    if (array >= MAX_ARRAYS)
-       return ENOSPC;
-
-    rdp = kmalloc(sizeof(struct ar_softc), M_AR, M_WAITOK | M_ZERO);
-
-    for (disk = 0; disk < setup->total_disks; disk++) {
-       if ((atadev = ar_locate_disk(setup->disks[disk]))) {
-           rdp->disks[disk].device = atadev;
-           if (AD_SOFTC(rdp->disks[disk])->flags & AD_F_RAID_SUBDISK) {
-               setup->disks[disk] = -1;
-               kfree(rdp, M_AR);
-               return EBUSY;
-           }
-
-           switch (rdp->disks[disk].device->channel->chiptype & 0xffff) {
-           case 0x1103:
-               ctlr |= AR_F_HIGHPOINT_RAID;
-               rdp->disks[disk].disk_sectors =
-                   AD_SOFTC(rdp->disks[disk])->total_secs;
-               break;
-
-           default:
-               ctlr |= AR_F_FREEBSD_RAID;
-               /* FALLTHROUGH */
-
-           case 0x105a:        
-               ctlr |= AR_F_PROMISE_RAID;
-               rdp->disks[disk].disk_sectors =
-                   PR_LBA(AD_SOFTC(rdp->disks[disk]));
-               break;
-           }
-           if ((rdp->flags & (AR_F_PROMISE_RAID|AR_F_HIGHPOINT_RAID)) &&
-               (rdp->flags & (AR_F_PROMISE_RAID|AR_F_HIGHPOINT_RAID)) !=
-                (ctlr & (AR_F_PROMISE_RAID|AR_F_HIGHPOINT_RAID))) {
-               kfree(rdp, M_AR);
-               return EXDEV;
-           }
-           else
-               rdp->flags |= ctlr;
-           
-           if (disk_size)
-               disk_size = min(rdp->disks[disk].disk_sectors, disk_size);
-           else
-               disk_size = rdp->disks[disk].disk_sectors;
-           rdp->disks[disk].flags = 
-               (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
-
-           total_disks++;
-       }
-       else {
-           setup->disks[disk] = -1;
-           kfree(rdp, M_AR);
-           return ENXIO;
-       }
-    }
-    if (!total_disks) {
-       kfree(rdp, M_AR);
-       return ENODEV;
-    }
-
-    switch (setup->type) {
-    case 1:
-       rdp->flags |= AR_F_RAID0;
-       break;
-    case 2:
-       rdp->flags |= AR_F_RAID1;
-       if (total_disks != 2) {
-           kfree(rdp, M_AR);
-           return EPERM;
-       }
-       break;
-    case 3:
-       rdp->flags |= (AR_F_RAID0 | AR_F_RAID1);
-       if (total_disks % 2 != 0) {
-           kfree(rdp, M_AR);
-           return EPERM;
-       }
-       break;
-    case 4:
-       rdp->flags |= AR_F_SPAN;
-       break;
-    }
-
-    for (disk = 0; disk < total_disks; disk++)
-       AD_SOFTC(rdp->disks[disk])->flags = AD_F_RAID_SUBDISK;
-
-    rdp->lun = array;
-    if (rdp->flags & AR_F_RAID0) {
-       int bit = 0;
-
-       while (setup->interleave >>= 1)
-           bit++;
-       if (rdp->flags & AR_F_PROMISE_RAID)
-           rdp->interleave = min(max(2, 1 << bit), 2048);
-       if (rdp->flags & AR_F_HIGHPOINT_RAID)
-           rdp->interleave = min(max(32, 1 << bit), 128);
-    }
-    rdp->total_disks = total_disks;
-    rdp->width = total_disks / ((rdp->flags & AR_F_RAID1) ? 2 : 1);    
-    rdp->total_sectors = disk_size * rdp->width;
-    rdp->heads = 255;
-    rdp->sectors = 63;
-    rdp->cylinders = rdp->total_sectors / (255 * 63);
-    if (rdp->flags & AR_F_PROMISE_RAID) {
-       rdp->offset = 0;
-       rdp->reserved = 63;
-    }
-    if (rdp->flags & AR_F_HIGHPOINT_RAID) {
-       rdp->offset = HPT_LBA + 1;
-       rdp->reserved = HPT_LBA + 1;
-    }
-    rdp->lock_start = rdp->lock_end = 0xffffffff;
-    rdp->flags |= AR_F_READY;
-
-    ar_table[array] = rdp;
-    ar_attach_raid(rdp, 1);
-    setup->unit = array;
-    return 0;
-}
-
-int
-ata_raid_delete(int array)
-{
-    struct ar_softc *rdp;
-    int disk;
-
-    if (!ar_table) {
-       kprintf("ar: no memory for ATA raid array\n");
-       return 0;
-    }
-    if (!(rdp = ar_table[array]))
-       return ENXIO;
-    
-    rdp->flags &= ~AR_F_READY;
-    for (disk = 0; disk < rdp->total_disks; disk++) {
-       if ((rdp->disks[disk].flags&AR_DF_PRESENT) && rdp->disks[disk].device) {
-           AD_SOFTC(rdp->disks[disk])->flags &= ~AD_F_RAID_SUBDISK;
-           ata_enclosure_leds(rdp->disks[disk].device, ATA_LED_GREEN);
-           rdp->disks[disk].flags = 0;
-       }
-    }
-    if (rdp->flags & AR_F_PROMISE_RAID)
-       ar_promise_write_conf(rdp);
-    else
-       ar_highpoint_write_conf(rdp);
-    disk_invalidate(&rdp->disk);
-    disk_destroy(&rdp->disk);
-    kfree(rdp, M_AR);
-    ar_table[array] = NULL;
-    return 0;
-}
-
-int
-ata_raid_status(int array, struct raid_status *status)
-{
-    struct ar_softc *rdp;
-    int i;
-
-    if (!ar_table || !(rdp = ar_table[array]))
-       return ENXIO;
-
-    switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-    case AR_F_RAID0:
-       status->type = AR_RAID0;
-       break;
-    case AR_F_RAID1:
-       status->type = AR_RAID1;
-       break;
-    case AR_F_RAID0 | AR_F_RAID1:
-       status->type = AR_RAID0 | AR_RAID1;
-       break;
-    case AR_F_SPAN:
-       status->type = AR_SPAN;
-       break;
-    }
-    status->total_disks = rdp->total_disks;
-    for (i = 0; i < rdp->total_disks; i++ ) {
-       if ((rdp->disks[i].flags & AR_DF_PRESENT) && rdp->disks[i].device)
-           status->disks[i] = AD_SOFTC(rdp->disks[i])->lun;
-       else
-           status->disks[i] = -1;
-    }
-    status->interleave = rdp->interleave;
-    status->status = 0;
-    if (rdp->flags & AR_F_READY)
-       status->status |= AR_READY;
-    if (rdp->flags & AR_F_DEGRADED)
-       status->status |= AR_DEGRADED;
-    if (rdp->flags & AR_F_REBUILDING) {
-       status->status |= AR_REBUILDING;
-       status->progress = 100*rdp->lock_start/(rdp->total_sectors/rdp->width);
-    }
-    return 0;
-}
-
-int
-ata_raid_rebuild(int array)
-{
-    struct ar_softc *rdp;
-
-    if (!ar_table || !(rdp = ar_table[array]))
-       return ENXIO;
-    if (rdp->flags & AR_F_REBUILDING)
-       return EBUSY;
-    /* create process here XXX SOS */
-    return ar_rebuild(rdp);
-}
-
-static int
-aropen(struct dev_open_args *ap)
-{
-#if 0
-    struct ar_softc *rdp = ap->a_head.a_dev->si_drv1;
-    struct disk_info info;
-
-    bzero(&info, sizeof(info));
-    info.d_media_blksize = DEV_BSIZE;          /* mandatory */
-    info.d_media_blocks = rdp->total_sectors;
-
-    info.d_secpertrack = rdp->sectors;         /* optional */
-    info.d_nheads = rdp->heads;
-    info.d_ncylinders = rdp->cylinders;
-    info.d_secpercyl = rdp->sectors * rdp->heads;
-    disk_setdiskinfo(&rdp->disk, &info);
-    return 0;
-#endif
-}
-
-static int
-arstrategy(struct dev_strategy_args *ap)
-{
-    cdev_t dev = ap->a_head.a_dev;
-    struct bio *bio = ap->a_bio;
-    struct buf *bp = bio->bio_buf;
-    struct ar_softc *rdp = dev->si_drv1;
-    int blkno, count, chunk, lba, lbs, tmplba;
-    int orig_blkno;
-    int buf1_blkno;
-    int drv = 0, change = 0;
-    caddr_t data;
-
-    if (!(rdp->flags & AR_F_READY)) {
-       bp->b_flags |= B_ERROR;
-       bp->b_error = EIO;
-       biodone(bio);
-       return(0);
-    }
-
-    KKASSERT((bio->bio_offset & DEV_BMASK) == 0);
-
-    bp->b_resid = bp->b_bcount;
-    blkno = (int)(bio->bio_offset >> DEV_BSHIFT);
-    orig_blkno = blkno;
-    data = bp->b_data;
-
-    for (count = howmany(bp->b_bcount, DEV_BSIZE); count > 0; 
-        count -= chunk, blkno += chunk, data += (chunk * DEV_BSIZE)) {
-       struct ar_buf *buf1, *buf2;
-
-       switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-       case AR_F_SPAN:
-           lba = blkno;
-           while (lba >= AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved)
-               lba -= AD_SOFTC(rdp->disks[drv++])->total_secs-rdp->reserved;
-           chunk = min(AD_SOFTC(rdp->disks[drv])->total_secs-rdp->reserved-lba,
-                       count);
-           break;
-       
-       case AR_F_RAID0:
-       case AR_F_RAID0 | AR_F_RAID1:
-           tmplba = blkno / rdp->interleave;
-           chunk = blkno % rdp->interleave;
-           if (tmplba == rdp->total_sectors / rdp->interleave) {
-               lbs = (rdp->total_sectors-(tmplba*rdp->interleave))/rdp->width;
-               drv = chunk / lbs;
-               lba = ((tmplba/rdp->width)*rdp->interleave) + chunk%lbs;
-               chunk = min(count, lbs);
-           }
-           else {
-               drv = tmplba % rdp->width;
-               lba = ((tmplba / rdp->width) * rdp->interleave) + chunk;
-               chunk = min(count, rdp->interleave - chunk);
-           }
-           break;
-
-       case AR_F_RAID1:
-           drv = 0;
-           lba = blkno;
-           chunk = count;
-           break;
-
-       default:
-           kprintf("ar%d: unknown array type in arstrategy\n", rdp->lun);
-           bp->b_flags |= B_ERROR;
-           bp->b_error = EIO;
-           biodone(bio);
-           return(0);
-       }
-
-       buf1 = kmalloc(sizeof(struct ar_buf), M_AR, M_INTWAIT | M_ZERO);
-       initbufbio(&buf1->bp);
-       BUF_LOCK(&buf1->bp, LK_EXCLUSIVE);
-       buf1->bp.b_bio1.bio_offset = (off_t)lba << DEV_BSHIFT;
-       if ((buf1->drive = drv) > 0)
-           buf1->bp.b_bio1.bio_offset += (off_t)rdp->offset << DEV_BSHIFT;
-       buf1->bp.b_bio1.bio_caller_info1.ptr = (void *)rdp;
-       buf1->bp.b_bcount = chunk * DEV_BSIZE;
-       buf1->bp.b_data = data;
-       buf1->bp.b_flags = bp->b_flags | B_PAGING;
-       buf1->bp.b_cmd = bp->b_cmd;
-       buf1->bp.b_bio1.bio_done = ar_done;
-       buf1->org = bio;
-       buf1_blkno = (int)(buf1->bp.b_bio1.bio_offset >> DEV_BSHIFT);
-
-       switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-       case AR_F_SPAN:
-       case AR_F_RAID0:
-           if ((rdp->disks[buf1->drive].flags &
-                (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
-               !AD_SOFTC(rdp->disks[buf1->drive])->dev) {
-               rdp->disks[buf1->drive].flags &= ~AR_DF_ONLINE;
-               ar_config_changed(rdp, 1);
-               BUF_UNLOCK(&buf1->bp);
-               uninitbufbio(&buf1->bp);
-               kfree(buf1, M_AR);
-               bp->b_flags |= B_ERROR;
-               bp->b_error = EIO;
-               biodone(bio);
-               return(0);
-           }
-           dev_dstrategy(AD_SOFTC(rdp->disks[buf1->drive])->dev,
-                         &buf1->bp.b_bio1);
-           break;
-
-       case AR_F_RAID1:
-       case AR_F_RAID0 | AR_F_RAID1:
-           if ((rdp->flags & AR_F_REBUILDING) && bp->b_cmd != BUF_CMD_READ) {
-               if ((orig_blkno >= rdp->lock_start &&
-                    orig_blkno < rdp->lock_end) ||
-                   ((orig_blkno + chunk) > rdp->lock_start &&
-                    (orig_blkno + chunk) <= rdp->lock_end)) {
-                   tsleep(rdp, 0, "arwait", 0);
-               }
-           }
-           if ((rdp->disks[buf1->drive].flags &
-                (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
-               !AD_SOFTC(rdp->disks[buf1->drive])->dev) {
-               rdp->disks[buf1->drive].flags &= ~AR_DF_ONLINE;
-               change = 1;
-           }
-           if ((rdp->disks[buf1->drive + rdp->width].flags &
-                (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
-               !AD_SOFTC(rdp->disks[buf1->drive + rdp->width])->dev) {
-               rdp->disks[buf1->drive + rdp->width].flags &= ~AR_DF_ONLINE;
-               change = 1;
-           }
-           if (change)
-               ar_config_changed(rdp, 1);
-               
-           if (!(rdp->flags & AR_F_READY)) {
-               BUF_UNLOCK(&buf1->bp);
-               uninitbufbio(&buf1->bp);
-               kfree(buf1, M_AR);
-               bp->b_flags |= B_ERROR;
-               bp->b_error = EIO;
-               biodone(bio);
-               return(0);
-           }
-           if (bp->b_cmd == BUF_CMD_READ) {
-               if ((buf1_blkno <
-                    (rdp->disks[buf1->drive].last_lba - AR_PROXIMITY) ||
-                    buf1_blkno >
-                    (rdp->disks[buf1->drive].last_lba + AR_PROXIMITY) ||
-                    !(rdp->disks[buf1->drive].flags & AR_DF_ONLINE)) &&
-                    (rdp->disks[buf1->drive+rdp->width].flags & AR_DF_ONLINE))
-                       buf1->drive = buf1->drive + rdp->width;
-           } else {
-               if ((rdp->disks[buf1->drive+rdp->width].flags & AR_DF_ONLINE) ||
-                   ((rdp->flags & AR_F_REBUILDING) &&
-                    (rdp->disks[buf1->drive+rdp->width].flags & AR_DF_SPARE) &&
-                    buf1_blkno < rdp->lock_start)) {
-                   if ((rdp->disks[buf1->drive].flags & AR_DF_ONLINE) ||
-                       ((rdp->flags & AR_F_REBUILDING) &&
-                        (rdp->disks[buf1->drive].flags & AR_DF_SPARE) &&
-                        buf1_blkno < rdp->lock_start)) {
-                       buf2 = kmalloc(sizeof(struct ar_buf), M_AR, M_INTWAIT);
-                       bcopy(buf1, buf2, sizeof(struct ar_buf));
-                       initbufbio(&buf2->bp);
-                       BUF_LOCK(&buf2->bp, LK_EXCLUSIVE);
-                       buf2->bp.b_bio1.bio_offset = buf1->bp.b_bio1.bio_offset;
-                       buf1->mirror = buf2;
-                       buf2->mirror = buf1;
-                       buf2->drive = buf1->drive + rdp->width;
-                       dev_dstrategy(AD_SOFTC(rdp->disks[buf2->drive])->dev,
-                                     &buf2->bp.b_bio1);
-                       rdp->disks[buf2->drive].last_lba = buf1_blkno + chunk;
-                       /* XXX free buf2? */
-                   }
-                   else
-                       buf1->drive = buf1->drive + rdp->width;
-               }
-           }
-           dev_dstrategy(AD_SOFTC(rdp->disks[buf1->drive])->dev,
-                         &buf1->bp.b_bio1);
-           rdp->disks[buf1->drive].last_lba = buf1_blkno + chunk;
-           break;
-
-       default:
-           kprintf("ar%d: unknown array type in arstrategy\n", rdp->lun);
-       }
-    }
-    return(0);
-}
-
-static void
-ar_done(struct bio *bio)
-{
-    struct ar_softc *rdp = (struct ar_softc *)bio->bio_caller_info1.ptr;
-    struct ar_buf *buf = (struct ar_buf *)bio->bio_buf;
-
-    get_mplock();
-
-    switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-    case AR_F_SPAN:
-    case AR_F_RAID0:
-       if (buf->bp.b_flags & B_ERROR) {
-           rdp->disks[buf->drive].flags &= ~AR_DF_ONLINE;
-           ar_config_changed(rdp, 1);
-           buf->org->bio_buf->b_flags |= B_ERROR;
-           buf->org->bio_buf->b_error = EIO;
-           biodone(buf->org);
-       }
-       else {
-           buf->org->bio_buf->b_resid -= buf->bp.b_bcount;
-           if (buf->org->bio_buf->b_resid == 0)
-               biodone(buf->org);
-       }
-       break;
-
-    case AR_F_RAID1:
-    case AR_F_RAID0 | AR_F_RAID1:
-       if (buf->bp.b_flags & B_ERROR) {
-           rdp->disks[buf->drive].flags &= ~AR_DF_ONLINE;
-           ar_config_changed(rdp, 1);
-           if (rdp->flags & AR_F_READY) {
-               if (buf->bp.b_cmd == BUF_CMD_READ) {
-                   if (buf->drive < rdp->width)
-                       buf->drive = buf->drive + rdp->width;
-                   else
-                       buf->drive = buf->drive - rdp->width;
-                   buf->bp.b_flags = buf->org->bio_buf->b_flags | B_PAGING;
-                   buf->bp.b_error = 0;
-                   dev_dstrategy(AD_SOFTC(rdp->disks[buf->drive])->dev,
-                                 &buf->bp.b_bio1);
-                   rel_mplock();
-                   return;
-               }
-               else {
-                   if (buf->flags & AB_F_DONE) {
-                       buf->org->bio_buf->b_resid -= buf->bp.b_bcount;
-                       if (buf->org->bio_buf->b_resid == 0)
-                           biodone(buf->org);
-                   }
-                   else
-                       buf->mirror->flags |= AB_F_DONE;
-               }
-           }
-           else {
-               buf->org->bio_buf->b_flags |= B_ERROR;
-               buf->org->bio_buf->b_error = EIO;
-               biodone(buf->org);
-           }
-       } 
-       else {
-           if (buf->bp.b_cmd != BUF_CMD_READ) {
-               if (buf->mirror && !(buf->flags & AB_F_DONE)){
-                   buf->mirror->flags |= AB_F_DONE;
-                   break;
-               }
-           }
-           buf->org->bio_buf->b_resid -= buf->bp.b_bcount;
-           if (buf->org->bio_buf->b_resid == 0)
-               biodone(buf->org);
-       }
-       break;
-       
-    default:
-       kprintf("ar%d: unknown array type in ar_done\n", rdp->lun);
-    }
-    BUF_UNLOCK(&buf->bp);
-    uninitbufbio(&buf->bp);
-    kfree(buf, M_AR);
-    rel_mplock();
-}
-
-static void
-ar_config_changed(struct ar_softc *rdp, int writeback)
-{
-    int disk, flags;
-
-    flags = rdp->flags;
-    rdp->flags |= AR_F_READY;
-    rdp->flags &= ~AR_F_DEGRADED;
-
-    for (disk = 0; disk < rdp->total_disks; disk++)
-       if (!(rdp->disks[disk].flags & AR_DF_PRESENT))
-           rdp->disks[disk].flags &= ~AR_DF_ONLINE;
-
-    for (disk = 0; disk < rdp->total_disks; disk++) {
-       switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) {
-       case AR_F_SPAN:
-       case AR_F_RAID0:
-           if (!(rdp->disks[disk].flags & AR_DF_ONLINE)) {
-               rdp->flags &= ~AR_F_READY;
-               kprintf("ar%d: ERROR - array broken\n", rdp->lun);
-           }
-           break;
-
-       case AR_F_RAID1:
-       case AR_F_RAID0 | AR_F_RAID1:
-           if (disk < rdp->width) {
-               if (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
-                   !(rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) {
-                   rdp->flags &= ~AR_F_READY;
-                   kprintf("ar%d: ERROR - array broken\n", rdp->lun);
-               }
-               else if (((rdp->disks[disk].flags & AR_DF_ONLINE) &&
-                         !(rdp->disks
-                           [disk + rdp->width].flags & AR_DF_ONLINE))||
-                        (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
-                         (rdp->disks
-                          [disk + rdp->width].flags & AR_DF_ONLINE))) {
-                   rdp->flags |= AR_F_DEGRADED;
-                   if (!(flags & AR_F_DEGRADED))
-                       kprintf("ar%d: WARNING - mirror lost\n", rdp->lun);
-               }
-           }
-           break;
-       }
-       if ((rdp->disks[disk].flags&AR_DF_PRESENT) && rdp->disks[disk].device) {
-           if (rdp->disks[disk].flags & AR_DF_ONLINE)
-               ata_enclosure_leds(rdp->disks[disk].device, ATA_LED_GREEN);
-           else
-               ata_enclosure_leds(rdp->disks[disk].device, ATA_LED_RED);
-       }
-    }
-    if (writeback) {
-       if (rdp->flags & AR_F_PROMISE_RAID)
-           ar_promise_write_conf(rdp);
-       if (rdp->flags & AR_F_HIGHPOINT_RAID)
-           ar_highpoint_write_conf(rdp);
-    }
-}
-
-static int
-ar_rebuild(struct ar_softc *rdp)
-{
-    int disk, count = 0, error = 0;
-    caddr_t buffer;
-
-    if ((rdp->flags & (AR_F_READY|AR_F_DEGRADED)) != (AR_F_READY|AR_F_DEGRADED))
-       return EEXIST;
-
-    for (disk = 0; disk < rdp->total_disks; disk++) {
-       if (((rdp->disks[disk].flags&(AR_DF_PRESENT|AR_DF_ONLINE|AR_DF_SPARE))==
-            (AR_DF_PRESENT | AR_DF_SPARE)) && rdp->disks[disk].device) {
-           if (AD_SOFTC(rdp->disks[disk])->total_secs <
-               rdp->disks[disk].disk_sectors) {
-               ata_prtdev(rdp->disks[disk].device,
-                          "disk capacity too small for this RAID config\n");
-#if 0
-               rdp->disks[disk].flags &= ~AR_DF_SPARE;
-               AD_SOFTC(rdp->disks[disk])->flags &= ~AD_F_RAID_SUBDISK;
-#endif
-               continue;
-           }
-           ata_enclosure_leds(rdp->disks[disk].device, ATA_LED_ORANGE);
-           count++;
-       }
-    }
-    if (!count)
-       return ENODEV;
-
-    /* setup start conditions */
-    crit_enter();
-    rdp->lock_start = 0;
-    rdp->lock_end = rdp->lock_start + 256;
-    rdp->flags |= AR_F_REBUILDING;
-    crit_exit();
-    buffer = kmalloc(256 * DEV_BSIZE, M_AR, M_WAITOK | M_ZERO);
-
-    /* now go copy entire disk(s) */
-    while (rdp->lock_end < (rdp->total_sectors / rdp->width)) {
-       int size = min(256, (rdp->total_sectors / rdp->width) - rdp->lock_end);
-
-       for (disk = 0; disk < rdp->width; disk++) {
-           struct ad_softc *adp;
-
-           if (((rdp->disks[disk].flags & AR_DF_ONLINE) &&
-                (rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) ||
-               ((rdp->disks[disk].flags & AR_DF_ONLINE) && 
-                !(rdp->disks[disk + rdp->width].flags & AR_DF_SPARE)) ||
-               ((rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE) &&
-                !(rdp->disks[disk].flags & AR_DF_SPARE)))
-               continue;
-
-           if (rdp->disks[disk].flags & AR_DF_ONLINE)
-               adp = AD_SOFTC(rdp->disks[disk]);
-           else
-               adp = AD_SOFTC(rdp->disks[disk + rdp->width]);
-           if ((error = ar_rw(adp, rdp->lock_start,
-                              size * DEV_BSIZE, buffer, AR_READ | AR_WAIT)))
-               break;
-
-           if (rdp->disks[disk].flags & AR_DF_ONLINE)
-               adp = AD_SOFTC(rdp->disks[disk + rdp->width]);
-           else
-               adp = AD_SOFTC(rdp->disks[disk]);
-           if ((error = ar_rw(adp, rdp->lock_start,
-                              size * DEV_BSIZE, buffer, AR_WRITE | AR_WAIT)))
-               break;
-       }
-       if (error) {
-           wakeup(rdp);
-           kfree(buffer, M_AR);
-           return error;
-       }
-       crit_enter();
-       rdp->lock_start = rdp->lock_end;
-       rdp->lock_end = rdp->lock_start + size;
-       crit_exit();
-       wakeup(rdp);
-    }
-    kfree(buffer, M_AR);
-    for (disk = 0; disk < rdp->total_disks; disk++) {
-       if ((rdp->disks[disk].flags&(AR_DF_PRESENT|AR_DF_ONLINE|AR_DF_SPARE))==
-           (AR_DF_PRESENT | AR_DF_SPARE)) {
-           rdp->disks[disk].flags &= ~AR_DF_SPARE;
-           rdp->disks[disk].flags |= (AR_DF_ASSIGNED | AR_DF_ONLINE);
-       }
-    }
-    crit_enter();
-    rdp->lock_start = 0xffffffff;
-    rdp->lock_end = 0xffffffff;
-    rdp->flags &= ~AR_F_REBUILDING;
-    crit_exit();
-    ar_config_changed(rdp, 1);
-    return 0;
-}
-
-static int
-ar_highpoint_read_conf(struct ad_softc *adp, struct ar_softc **raidp)
-{
-    struct highpoint_raid_conf *info;
-    struct ar_softc *raid = NULL;
-    int array, disk_number = 0, retval = 0;
-
-    info = kmalloc(sizeof(struct highpoint_raid_conf), M_AR, M_INTWAIT|M_ZERO);
-
-    if (ar_rw(adp, HPT_LBA, sizeof(struct highpoint_raid_conf),
-             (caddr_t)info, AR_READ | AR_WAIT)) {
-       if (bootverbose)
-           kprintf("ar: HighPoint read conf failed\n");
-       goto highpoint_out;
-    }
-
-    /* check if this is a HighPoint RAID struct */
-    if (info->magic != HPT_MAGIC_OK && info->magic != HPT_MAGIC_BAD) {
-       if (bootverbose)
-           kprintf("ar: HighPoint check1 failed\n");
-       goto highpoint_out;
-    }
-
-    /* is this disk defined, or an old leftover/spare ? */
-    if (!info->magic_0) {
-       if (bootverbose)
-           kprintf("ar: HighPoint check2 failed\n");
-       goto highpoint_out;
-    }
-
-    /* now convert HighPoint config info into our generic form */
-    for (array = 0; array < MAX_ARRAYS; array++) {
-       if (!raidp[array]) {
-           raidp[array] = kmalloc(sizeof(struct ar_softc), M_AR,
-                                        M_INTWAIT | M_ZERO);
-       }
-       raid = raidp[array];
-       if (raid->flags & AR_F_PROMISE_RAID)
-           continue;
-
-       switch (info->type) {
-       case HPT_T_RAID0:
-           if ((info->order & (HPT_O_RAID0|HPT_O_OK))==(HPT_O_RAID0|HPT_O_OK))
-               goto highpoint_raid1;
-           if (info->order & (HPT_O_RAID0 | HPT_O_RAID1))
-               goto highpoint_raid01;
-           if (raid->magic_0 && raid->magic_0 != info->magic_0)
-               continue;
-           raid->magic_0 = info->magic_0;
-           raid->flags |= AR_F_RAID0;
-           raid->interleave = 1 << info->stripe_shift;
-           disk_number = info->disk_number;
-           if (!(info->order & HPT_O_OK))
-               info->magic = 0;        /* mark bad */
-           break;
-
-       case HPT_T_RAID1:
-highpoint_raid1:
-           if (raid->magic_0 && raid->magic_0 != info->magic_0)
-               continue;
-           raid->magic_0 = info->magic_0;
-           raid->flags |= AR_F_RAID1;
-           disk_number = (info->disk_number > 0);
-           break;
-
-       case HPT_T_RAID01_RAID0:
-highpoint_raid01:
-           if (info->order & HPT_O_RAID0) {
-               if ((raid->magic_0 && raid->magic_0 != info->magic_0) ||
-                   (raid->magic_1 && raid->magic_1 != info->magic_1))
-                   continue;
-               raid->magic_0 = info->magic_0;
-               raid->magic_1 = info->magic_1;
-               raid->flags |= (AR_F_RAID0 | AR_F_RAID1);
-               raid->interleave = 1 << info->stripe_shift;
-               disk_number = info->disk_number;
-           }
-           else {
-               if (raid->magic_1 && raid->magic_1 != info->magic_1)
-                   continue;
-               raid->magic_1 = info->magic_1;
-               raid->flags |= (AR_F_RAID0 | AR_F_RAID1);
-               raid->interleave = 1 << info->stripe_shift;
-               disk_number = info->disk_number + info->array_width;
-               if (!(info->order & HPT_O_RAID1))
-                   info->magic = 0;    /* mark bad */
-           }
-           break;
-
-       case HPT_T_SPAN:
-           if (raid->magic_0 && raid->magic_0 != info->magic_0)
-               continue;
-           raid->magic_0 = info->magic_0;
-           raid->flags |= AR_F_SPAN;
-           disk_number = info->disk_number;
-           break;
-
-       default:
-           kprintf("ar%d: HighPoint unknown RAID type 0x%02x\n",
-                  array, info->type);
-           goto highpoint_out;
-       }
-
-       raid->flags |= AR_F_HIGHPOINT_RAID;
-       raid->disks[disk_number].device = adp->device;
-       raid->disks[disk_number].flags = (AR_DF_PRESENT | AR_DF_ASSIGNED);
-       raid->lun = array;
-       if (info->magic == HPT_MAGIC_OK) {
-           raid->disks[disk_number].flags |= AR_DF_ONLINE;
-           raid->flags |= AR_F_READY;
-           raid->width = info->array_width;
-           raid->heads = 255;
-           raid->sectors = 63;
-           raid->cylinders = info->total_sectors / (63 * 255);
-           raid->total_sectors = info->total_sectors;
-           raid->offset = HPT_LBA + 1;
-           raid->reserved = HPT_LBA + 1;
-           raid->lock_start = raid->lock_end = info->rebuild_lba;
-           raid->disks[disk_number].disk_sectors =
-               info->total_sectors / info->array_width;
-       }
-       else
-           raid->disks[disk_number].flags &= ~ AR_DF_ONLINE;
-
-       if ((raid->flags & AR_F_RAID0) && (raid->total_disks < raid->width))