Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Apr 2006 22:43:39 GMT
From:      John-Mark Gurney <jmg@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 95401 for review
Message-ID:  <200604162243.k3GMhdjZ079309@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=95401

Change 95401 by jmg@jmg_arlene on 2006/04/16 22:43:18

	pull in latest ata code..  there's been a few revs, this'll make
	it easier for sos to help us...

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-all.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-all.h#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-chipset.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-disk.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-pci.h#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-queue.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-raid.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-usb.c#1 branch
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/atapi-cam.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/atapi-cd.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/atapi-fd.c#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/dev/ata/atapi-fd.h#3 integrate
.. //depot/projects/kmacy_sun4v/src/sys/sys/ata.h#3 integrate

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-all.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.264 2006/02/09 20:54:42 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.272 2006/04/14 16:25:42 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -73,13 +73,13 @@
 /* global vars */
 MALLOC_DEFINE(M_ATA, "ata_generic", "ATA driver generic layer");
 int (*ata_raid_ioctl_func)(u_long cmd, caddr_t data) = NULL;
+struct intr_config_hook *ata_delayed_attach = NULL;
 devclass_t ata_devclass;
 uma_zone_t ata_request_zone;
 uma_zone_t ata_composite_zone;
 int ata_wc = 1;
 
 /* local vars */
-static struct intr_config_hook *ata_delayed_attach = NULL;
 static int ata_dma = 1;
 static int atapi_dma = 1;
 
@@ -160,6 +160,11 @@
     if (!ch->r_irq)
 	return ENXIO;
 
+    /* grap the channel lock so no new requests gets launched */
+    mtx_lock(&ch->state_mtx);
+    ch->state |= ATA_STALL_QUEUE;
+    mtx_unlock(&ch->state_mtx);
+
     /* detach & delete all children */
     if (!device_get_children(dev, &children, &nchildren)) {
 	for (i = 0; i < nchildren; i++)
@@ -196,9 +201,14 @@
     while (ATA_LOCKING(dev, ATA_LF_LOCK) != ch->unit)
 	tsleep(&dev, PRIBIO, "atarini", 1);
 
+    /* catch eventual request in ch->running */
+    mtx_lock(&ch->state_mtx);
+    if ((request = ch->running))
+	callout_stop(&request->callout);
+    ch->running = NULL;
+
     /* unconditionally grap the channel lock */
-    mtx_lock(&ch->state_mtx);
-    ch->state = ATA_STALL_QUEUE;
+    ch->state |= ATA_STALL_QUEUE;
     mtx_unlock(&ch->state_mtx);
 
     /* reset the controller HW, the channel and device(s) */
@@ -208,53 +218,37 @@
     if (!device_get_children(dev, &children, &nchildren)) {
 	mtx_lock(&Giant);       /* newbus suckage it needs Giant */
 	for (i = 0; i < nchildren; i++) {
-	    if (children[i] && device_is_attached(children[i]))
-		if (ATA_REINIT(children[i])) {
-		    /*
-		     * if we have a running request and its device matches
-		     * this child we need to inform the request that the 
-		     * device is gone and remove it from ch->running
-		     */
-		    mtx_lock(&ch->state_mtx);
-		    if (ch->running && ch->running->dev == children[i]) {
-			callout_stop(&ch->running->callout);
-			request = ch->running;
-			ch->running = NULL;
-		    }
-		    else
-			request = NULL;
-		    mtx_unlock(&ch->state_mtx);
+	    /* did any children go missing ? */
+	    if (children[i] && device_is_attached(children[i]) &&
+		ATA_REINIT(children[i])) {
+		/*
+		 * if we had a running request and its device matches
+		 * this child we need to inform the request that the 
+		 * device is gone.
+		 */
+		if (request && request->dev == children[i]) {
+		    request->result = ENXIO;
+		    device_printf(request->dev, "FAILURE - device detached\n");
 
-		    if (request) {
-			request->result = ENXIO;
-			device_printf(request->dev,
-				      "FAILURE - device detached\n");
-
-			/* if not timeout finish request here */
-			if (!(request->flags & ATA_R_TIMEOUT))
+		    /* if not timeout finish request here */
+		    if (!(request->flags & ATA_R_TIMEOUT))
 			    ata_finish(request);
-		    }
-		    device_delete_child(dev, children[i]);
+		    request = NULL;
 		}
+		device_delete_child(dev, children[i]);
+	    }
 	}
 	free(children, M_TEMP);
 	mtx_unlock(&Giant);     /* newbus suckage dealt with, release Giant */
     }
 
-    /* catch request in ch->running if we havn't already */
-    mtx_lock(&ch->state_mtx);
-    if ((request = ch->running))
-	callout_stop(&request->callout);
-    ch->running = NULL;
-    mtx_unlock(&ch->state_mtx);
-
-    /* if we got one put it on the queue again */
-    if (request) {
+    /* if we still have a good request put it on the queue again */
+    if (request && !(request->flags & ATA_R_TIMEOUT)) {
 	device_printf(request->dev,
 		      "WARNING - %s requeued due to channel reset",
 		      ata_cmd2str(request));
 	if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-	    printf(" LBA=%llu", (unsigned long long)request->u.ata.lba);
+	    printf(" LBA=%ju", request->u.ata.lba);
 	printf("\n");
 	request->flags |= ATA_R_REQUEUE;
 	ata_queue_request(request);
@@ -283,8 +277,8 @@
     if (!dev || !(ch = device_get_softc(dev)))
 	return ENXIO;
 
-    /* wait for the channel to be IDLE before entering suspend mode */
-    while (1) {
+    /* wait for the channel to be IDLE or detached before suspending */
+    while (ch->r_irq) {
 	mtx_lock(&ch->state_mtx);
 	if (ch->state == ATA_IDLE) {
 	    ch->state = ATA_ACTIVE;
@@ -335,13 +329,13 @@
 	ATA_DEBUG_RQ(request, "interrupt");
 
 	/* safetycheck for the right state */
-	if (ch->state != ATA_ACTIVE && ch->state != ATA_STALL_QUEUE) {
+	if (ch->state == ATA_IDLE) {
 	    device_printf(request->dev, "interrupt on idle channel ignored\n");
 	    break;
 	}
 
 	/*
-	 * we have the HW locks, so end the tranaction for this request
+	 * we have the HW locks, so end the transaction for this request
 	 * if it finishes immediately otherwise wait for next interrupt
 	 */
 	if (ch->hw.end_transaction(request) == ATA_OP_FINISHED) {
@@ -491,7 +485,11 @@
 	if (ioc_request->flags & ATA_CMD_WRITE)
 	    request->flags |= ATA_R_WRITE;
 	ata_queue_request(request);
-	if (!(request->flags & ATA_R_ATAPI)) {
+	if (request->flags & ATA_R_ATAPI) {
+	    bcopy(&request->u.atapi.sense, &ioc_request->u.atapi.sense,
+		  sizeof(struct atapi_sense));
+	}
+	else {
 	    ioc_request->u.ata.command = request->u.ata.command;
 	    ioc_request->u.ata.feature = request->u.ata.feature;
 	    ioc_request->u.ata.lba = request->u.ata.lba;
@@ -631,7 +629,8 @@
 
 	if (bootverbose)
 	    printf("ata%d-%s: pio=%s wdma=%s udma=%s cable=%s wire\n",
-		   ch->unit, atadev->unit == ATA_MASTER ? "master":"slave",
+		   device_get_unit(ch->dev),
+		   atadev->unit == ATA_MASTER ? "master" : "slave",
 		   ata_mode2str(ata_pmode(atacap)),
 		   ata_mode2str(ata_wmode(atacap)),
 		   ata_mode2str(ata_umode(atacap)),
@@ -853,6 +852,9 @@
     case ATA_UDMA6: return "UDMA133";
     case ATA_SA150: return "SATA150";
     case ATA_SA300: return "SATA300";
+    case ATA_USB: return "USB";
+    case ATA_USB1: return "USB1";
+    case ATA_USB2: return "USB2";
     default:
 	if (mode & ATA_DMA_MASK)
 	    return "BIOSDMA";

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-all.h#3 (text+ko) ====

@@ -23,7 +23,7 @@
  * (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.114 2006/02/23 20:15:22 sos Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.117 2006/03/31 08:09:04 sos Exp $
  */
 
 /* ATA register defines */
@@ -53,24 +53,7 @@
 #define         ATA_E_MC                0x20    /* media changed */
 #define         ATA_E_UNC               0x40    /* uncorrectable data */
 #define         ATA_E_ICRC              0x80    /* UDMA crc error */
-#define         ATA_E_MASK              0x0f    /* error mask */
-#define         ATA_SK_MASK             0xf0    /* sense key mask */
-#define         ATA_SK_NO_SENSE         0x00    /* no specific sense key info */
-#define         ATA_SK_RECOVERED_ERROR  0x10    /* command OK, data recovered */
-#define         ATA_SK_NOT_READY        0x20    /* no access to drive */
-#define         ATA_SK_MEDIUM_ERROR     0x30    /* non-recovered data error */
-#define         ATA_SK_HARDWARE_ERROR   0x40    /* non-recoverable HW failure */
-#define         ATA_SK_ILLEGAL_REQUEST  0x50    /* invalid command param(s) */
-#define         ATA_SK_UNIT_ATTENTION   0x60    /* media changed */
-#define         ATA_SK_DATA_PROTECT     0x70    /* write protect */
-#define         ATA_SK_BLANK_CHECK      0x80    /* blank check */
-#define         ATA_SK_VENDOR_SPECIFIC  0x90    /* vendor specific skey */
-#define         ATA_SK_COPY_ABORTED     0xa0    /* copy aborted */
-#define         ATA_SK_ABORTED_COMMAND  0xb0    /* command aborted, try again */
-#define         ATA_SK_EQUAL            0xc0    /* equal */
-#define         ATA_SK_VOLUME_OVERFLOW  0xd0    /* volume overflow */
-#define         ATA_SK_MISCOMPARE       0xe0    /* data dont match the medium */
-#define         ATA_SK_RESERVED         0xf0
+#define		ATA_E_ATAPI_SENSE_MASK	0xf0	/* ATAPI sense key mask */
 
 #define ATA_IREASON                     9       /* (R) interrupt reason */
 #define         ATA_I_CMD               0x01    /* cmd (1) | data (0) */
@@ -284,7 +267,8 @@
 #define ATA_PC98_BANKADDR_RID           9
 #define ATA_IRQ_RID                     0
 #define ATA_DEV(device)                 ((device == ATA_MASTER) ? 0 : 1)
-#define ATA_CFA_MAGIC                   0x848A
+#define ATA_CFA_MAGIC1                  0x844A
+#define ATA_CFA_MAGIC2                  0x848A
 #define ATAPI_MAGIC_LSB                 0x14
 #define ATAPI_MAGIC_MSB                 0xeb
 #define ATAPI_P_READ                    (ATA_S_DRQ | ATA_I_IN)
@@ -298,28 +282,6 @@
 #define ATA_OP_FINISHED                 1
 #define ATA_MAX_28BIT_LBA               268435455UL
 
-/* ATAPI request sense structure */
-struct atapi_sense {
-    u_int8_t    error_code      :7;             /* current or deferred errors */
-    u_int8_t    valid           :1;             /* follows ATAPI spec */
-    u_int8_t    segment;                        /* Segment number */
-    u_int8_t    sense_key       :4;             /* sense key */
-    u_int8_t    reserved2_4     :1;             /* reserved */
-    u_int8_t    ili             :1;             /* incorrect length indicator */
-    u_int8_t    eom             :1;             /* end of medium */
-    u_int8_t    filemark        :1;             /* filemark */
-    u_int32_t   cmd_info __packed;              /* cmd information */
-    u_int8_t    sense_length;                   /* additional sense len (n-7) */
-    u_int32_t   cmd_specific_info __packed;     /* additional cmd spec info */
-    u_int8_t    asc;                            /* additional sense code */
-    u_int8_t    ascq;                           /* additional sense code qual */
-    u_int8_t    replaceable_unit_code;          /* replaceable unit code */
-    u_int8_t    sk_specific     :7;             /* sense key specific */
-    u_int8_t    sksv            :1;             /* sense key specific info OK */
-    u_int8_t    sk_specific1;                   /* sense key specific */
-    u_int8_t    sk_specific2;                   /* sense key specific */
-};
-
 /* structure used for composite atomic operations */
 #define MAX_COMPOSITES          32              /* u_int32_t bits */
 struct ata_composite {
@@ -348,9 +310,8 @@
 	} ata;
 	struct {
 	    u_int8_t            ccb[16];        /* ATAPI command block */
-	    struct atapi_sense  sense_data;     /* ATAPI request sense data */
-	    u_int8_t            sense_key;      /* ATAPI request sense key */
-	    u_int8_t            sense_cmd;      /* ATAPI saved command */
+	    struct atapi_sense  sense;          /* ATAPI request sense data */
+	    u_int8_t            saved_cmd;      /* ATAPI saved command */
 	} atapi;
     } u;
     u_int32_t                   bytecount;      /* bytes to transfer */
@@ -372,6 +333,8 @@
 #define         ATA_R_DIRECT            0x00001000
 
 #define         ATA_R_DEBUG             0x10000000
+#define         ATA_R_DANGER1           0x20000000
+#define         ATA_R_DANGER2           0x40000000
 
     u_int8_t                    status;         /* ATA status */
     u_int8_t                    error;          /* ATA error */
@@ -525,6 +488,7 @@
 
 /* externs */
 extern int (*ata_raid_ioctl_func)(u_long cmd, caddr_t data);
+extern struct intr_config_hook *ata_delayed_attach;
 extern devclass_t ata_devclass;
 extern int ata_wc;
  
@@ -569,8 +533,10 @@
 /* macros for alloc/free of struct ata_request */
 extern uma_zone_t ata_request_zone;
 #define ata_alloc_request() uma_zalloc(ata_request_zone, M_NOWAIT | M_ZERO)
-#define ata_free_request(request) uma_zfree(ata_request_zone, request)
-
+#define ata_free_request(request) { \
+	if (!(request->flags & ATA_R_DANGER2)) \
+	    uma_zfree(ata_request_zone, request); \
+	}
 /* macros for alloc/free of struct ata_composite */
 extern uma_zone_t ata_composite_zone;
 #define ata_alloc_composite() uma_zalloc(ata_composite_zone, M_NOWAIT | M_ZERO)

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-chipset.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.160 2006/02/23 18:52:15 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.161 2006/03/13 14:01:37 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -2068,8 +2068,11 @@
     struct ata_pci_controller *ctlr = device_get_softc(dev);
     struct ata_chip_id *idx;
     static struct ata_chip_id ids[] =
-    {{ ATA_JMB360, 0, 0, 0, ATA_SA300, "JMB360" },
-     { ATA_JMB363, 0, 1, 0, ATA_SA300, "JMB363" },
+    {{ ATA_JMB360, 0, 1, 0, ATA_SA300, "JMB360" },
+     { ATA_JMB361, 0, 1, 1, ATA_SA300, "JMB361" },
+     { ATA_JMB363, 0, 2, 1, ATA_SA300, "JMB363" },
+     { ATA_JMB365, 0, 1, 2, ATA_SA300, "JMB365" },
+     { ATA_JMB366, 0, 2, 2, ATA_SA300, "JMB366" },
      { 0, 0, 0, 0, 0, 0}};
     char buffer[64];
 
@@ -2094,6 +2097,7 @@
 
     /* set controller configuration to a setup we support */
     pci_write_config(dev, 0x40, 0x80c0a131, 4);
+    pci_write_config(dev, 0x80, 0x01200000, 4);
 
     ctlr->allocate = ata_jmicron_allocate;
     ctlr->reset = ata_jmicron_reset;
@@ -2118,10 +2122,6 @@
 	ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC,
 		 ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) | ATA_AHCI_GHC_AE);
 
-	/* get the number of HW channels */
-	ctlr->channels =
-	    (ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_NPMASK) + 1;
-
 	/* clear interrupts */
 	ATA_OUTL(ctlr->r_res2, ATA_AHCI_IS, ATA_INL(ctlr->r_res2, ATA_AHCI_IS));
 
@@ -2134,21 +2134,22 @@
 			 pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
     }
 
-    /* add in PATA channel(s) */
-    ctlr->channels += ctlr->chip->cfg1;
+    /* set the number of HW channels */ 
+    ctlr->channels = ctlr->chip->cfg1 + ctlr->chip->cfg2;
     return 0;
 }
 
 static int
 ata_jmicron_allocate(device_t dev)
 {
+    struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
     struct ata_channel *ch = device_get_softc(dev);
     int error;
 
-    if (ch->unit >= 2) {
-	ch->unit -= 2;
+    if (ch->unit >= ctlr->chip->cfg1) {
+	ch->unit -= ctlr->chip->cfg1;
 	error = ata_pci_allocate(dev);
-	ch->unit += 2;
+	ch->unit += ctlr->chip->cfg1;
     }
     else
 	error = ata_ahci_allocate(dev);
@@ -2158,9 +2159,10 @@
 static void
 ata_jmicron_reset(device_t dev)
 {
+    struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
     struct ata_channel *ch = device_get_softc(dev);
 
-    if (ch->unit >= 2)
+    if (ch->unit >= ctlr->chip->cfg1)
 	ata_generic_reset(dev);
     else
 	ata_ahci_reset(dev);
@@ -2169,9 +2171,10 @@
 static void
 ata_jmicron_dmainit(device_t dev)
 {
+    struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
     struct ata_channel *ch = device_get_softc(dev);
 
-    if (ch->unit >= 2)
+    if (ch->unit >= ctlr->chip->cfg1)
 	ata_pci_dmainit(dev);
     else
 	ata_ahci_dmainit(dev);
@@ -2180,9 +2183,10 @@
 static void
 ata_jmicron_setmode(device_t dev, int mode)
 {
+    struct ata_pci_controller *ctlr = device_get_softc(GRANDPARENT(dev));
     struct ata_channel *ch = device_get_softc(device_get_parent(dev));
 
-    if (ch->unit >= 2) {
+    if (ch->unit >= ctlr->chip->cfg1) {
 	struct ata_device *atadev = device_get_softc(dev);
 
 	/* check for 80pin cable present */

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-disk.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.193 2006/01/18 09:14:55 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.197 2006/03/31 08:09:04 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -71,7 +71,8 @@
     struct ata_device *atadev = device_get_softc(dev);
 
     if (!(atadev->param.config & ATA_PROTO_ATAPI) ||
-	(atadev->param.config == ATA_CFA_MAGIC))
+	(atadev->param.config == ATA_CFA_MAGIC1) ||
+	(atadev->param.config == ATA_CFA_MAGIC2))
 	return 0;
     else
 	return ENXIO;
@@ -295,8 +296,14 @@
     struct bio bp;
 
     /* length zero is special and really means flush buffers to media */
-    if (!length)
-	return ata_controlcmd(dp->d_drv1, ATA_FLUSHCACHE, 0, 0, 0);
+    if (!length) {
+        struct ata_device *atadev = device_get_softc(dp->d_drv1);
+	int error = 0;
+
+	if (atadev->param.support.command2 & ATA_SUPPORT_FLUSHCACHE)
+	    error = ata_controlcmd(dp->d_drv1, ATA_FLUSHCACHE, 0, 0, 0);
+	return error;
+    }
 
     bzero(&bp, sizeof(struct bio));
     bp.bio_disk = dp;
@@ -365,19 +372,17 @@
 	strncpy(product, atadev->param.model, 40);
     }
 
-    device_printf(dev, "%lluMB <%s%s %.8s> at ata%d-%s %s%s\n",
-		  (unsigned long long)(adp->total_secs / (1048576 / DEV_BSIZE)),
+    device_printf(dev, "%juMB <%s%s %.8s> at ata%d-%s %s%s\n",
+		  adp->total_secs / (1048576 / DEV_BSIZE),
 		  vendor, product, atadev->param.revision,
 		  device_get_unit(ch->dev),
 		  (atadev->unit == ATA_MASTER) ? "master" : "slave",
 		  (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "",
 		  ata_mode2str(atadev->mode));
     if (bootverbose) {
-	device_printf(dev, "%llu sectors [%lldC/%dH/%dS] "
-		      "%d sectors/interrupt %d depth queue\n",
-		      (unsigned long long)adp->total_secs,
-		      (unsigned long long)(adp->total_secs /
-					   (adp->heads * adp->sectors)),
+	device_printf(dev, "%ju sectors [%juC/%dH/%dS] "
+		      "%d sectors/interrupt %d depth queue\n", adp->total_secs,
+		      adp->total_secs / (adp->heads * adp->sectors),
 		      adp->heads, adp->sectors, atadev->max_iosize / DEV_BSIZE,
 		      adp->num_tags + 1);
     }

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-pci.h#3 (text+ko) ====

@@ -23,7 +23,7 @@
  * (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.h,v 1.63 2006/02/16 17:09:24 sos Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.64 2006/03/13 14:01:37 sos Exp $
  */
 
 /* structure holding chipset config info */
@@ -161,7 +161,10 @@
 
 #define ATA_JMICRON_ID		0x197b
 #define ATA_JMB360		0x2360197b
+#define ATA_JMB361		0x2361197b
 #define ATA_JMB363		0x2363197b
+#define ATA_JMB365		0x2365197b
+#define ATA_JMB366		0x2366197b
 
 #define ATA_MARVELL_ID          0x11ab
 #define ATA_M88SX5040           0x504011ab

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-queue.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.56 2006/02/23 20:15:22 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.63 2006/03/31 08:09:05 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -51,17 +51,24 @@
 void
 ata_queue_request(struct ata_request *request)
 {
-    struct ata_channel *ch = device_get_softc(device_get_parent(request->dev));
+    struct ata_channel *ch;
 
-    /* mark request as virgin (this might be a ATA_R_REQUEUE) */
+    /* treat request as virgin (this might be an ATA_R_REQUEUE) */
     request->result = request->status = request->error = 0;
-    request->parent = device_get_parent(request->dev);
+
+    /* check that that the device is still valid */
+    if (!(request->parent = device_get_parent(request->dev))) {
+	request->result = ENXIO;
+	if (request->callback)
+	    (request->callback)(request);
+	return;
+    }
+    ch = device_get_softc(request->parent);
     callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED);
-
     if (!request->callback && !(request->flags & ATA_R_REQUEUE))
 	sema_init(&request->done, 0, "ATA request done");
 
-    /* in ATA_STALL_QUEUE state we call HW directly (used only during reinit) */
+    /* in ATA_STALL_QUEUE state we call HW directly */
     if ((ch->state & ATA_STALL_QUEUE) && (request->flags & ATA_R_CONTROL)) {
 	mtx_lock(&ch->state_mtx);
 	ch->running = request;
@@ -95,12 +102,14 @@
     /* if this is not a callback wait until request is completed */
     if (!request->callback) {
 	ATA_DEBUG_RQ(request, "wait for completition");
-	while (!dumping &&
-	       sema_timedwait(&request->done, request->timeout * hz * 4)) {
+	if (!dumping &&
+	    sema_timedwait(&request->done, request->timeout * hz * 4)) {
 	    device_printf(request->dev,
-		"req=%p %s semaphore timeout !! DANGER Will Robinson !!\n",
-		      request, ata_cmd2str(request));
-	    ata_start(ch->dev);
+			  "WARNING - %s taskqueue timeout "
+			  "- completing request directly\n",
+			  ata_cmd2str(request));
+	    request->flags |= ATA_R_DANGER1;
+	    ata_completed(request, 0);
 	}
 	sema_destroy(&request->done);
     }
@@ -252,15 +261,28 @@
     struct ata_device *atadev = device_get_softc(request->dev);
     struct ata_composite *composite;
 
+    if (request->flags & ATA_R_DANGER2) {
+	device_printf(request->dev,
+		      "WARNING - %s freeing taskqueue zombie request\n",
+		      ata_cmd2str(request));
+	request->flags &= ~(ATA_R_DANGER1 | ATA_R_DANGER2);
+	ata_free_request(request);
+	return;
+    }
+    if (request->flags & ATA_R_DANGER1)
+	request->flags |= ATA_R_DANGER2
+
     ATA_DEBUG_RQ(request, "completed entered");
 
     /* if we had a timeout, reinit channel and deal with the falldown */
     if (request->flags & ATA_R_TIMEOUT) {
 	/*
-	 * if reinit succeeds and the device doesn't get detached and
+	 * if the channel is still present and
+	 * reinit succeeds and
+	 * the device doesn't get detached and
 	 * there are retries left we reinject this request
 	 */
-	if (!ata_reinit(ch->dev) && !request->result &&
+	if (ch && !ata_reinit(ch->dev) && !request->result &&
 	    (request->retries-- > 0)) {
 	    if (!(request->flags & ATA_R_QUIET)) {
 		device_printf(request->dev,
@@ -268,7 +290,7 @@
 			      ata_cmd2str(request), request->retries,
 			      request->retries == 1 ? "y" : "ies");
 		if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-		    printf(" LBA=%llu", (unsigned long long)request->u.ata.lba);
+		    printf(" LBA=%ju", request->u.ata.lba);
 		printf("\n");
 	    }
 	    request->flags &= ~(ATA_R_TIMEOUT | ATA_R_DEBUG);
@@ -285,15 +307,14 @@
 		    device_printf(request->dev, "FAILURE - %s timed out",
 				  ata_cmd2str(request));
 		    if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-			printf(" LBA=%llu",
-			       (unsigned long long)request->u.ata.lba);
+			printf(" LBA=%ju", request->u.ata.lba);
 		    printf("\n");
 		}
 	    }
 	    request->result = EIO;
 	}
     }
-    else {
+    else if (!(request->flags & ATA_R_ATAPI) ){
 	/* if this is a soft ECC error warn about it */
 	/* XXX SOS we could do WARF here */
 	if ((request->status & (ATA_S_CORR | ATA_S_ERROR)) == ATA_S_CORR) {
@@ -301,7 +322,7 @@
 			  "WARNING - %s soft error (ECC corrected)",
 			  ata_cmd2str(request));
 	    if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-		printf(" LBA=%llu", (unsigned long long)request->u.ata.lba);
+		printf(" LBA=%ju", request->u.ata.lba);
 	    printf("\n");
 	}
 
@@ -312,7 +333,7 @@
 			      "WARNING - %s UDMA ICRC error (retrying request)",
 			      ata_cmd2str(request));
 		if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-		    printf(" LBA=%llu", (unsigned long long)request->u.ata.lba);
+		    printf(" LBA=%ju", request->u.ata.lba);
 		printf("\n");
 		request->flags |= (ATA_R_AT_HEAD | ATA_R_REQUEUE);
 		ata_queue_request(request);
@@ -340,7 +361,7 @@
 		    (request->dmastat & ATA_BMSTAT_ERROR))
 		    printf(" dma=0x%02x", request->dmastat);
 		if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL)))
-		    printf(" LBA=%llu", (unsigned long long)request->u.ata.lba);
+		    printf(" LBA=%ju", request->u.ata.lba);
 		printf("\n");
 	    }
 	    request->result = EIO;
@@ -354,16 +375,15 @@
 	    break;
 
 	/* if we have a sensekey -> request sense from device */
-	if (request->error & ATA_SK_MASK &&
-	    request->u.atapi.ccb[0] != ATAPI_REQUEST_SENSE) {
+	if ((request->error & ATA_E_ATAPI_SENSE_MASK) &&
+	    (request->u.atapi.ccb[0] != ATAPI_REQUEST_SENSE)) {
 	    static u_int8_t ccb[16] = { ATAPI_REQUEST_SENSE, 0, 0, 0,
 					sizeof(struct atapi_sense),
 					0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
-	    request->u.atapi.sense_key = request->error;
-	    request->u.atapi.sense_cmd = request->u.atapi.ccb[0];
+	    request->u.atapi.saved_cmd = request->u.atapi.ccb[0];
 	    bcopy(ccb, request->u.atapi.ccb, 16);
-	    request->data = (caddr_t)&request->u.atapi.sense_data;
+	    request->data = (caddr_t)&request->u.atapi.sense;
 	    request->bytecount = sizeof(struct atapi_sense);
 	    request->donecount = 0;
 	    request->transfersize = sizeof(struct atapi_sense);
@@ -375,21 +395,21 @@
 	    return;
 	}
 
-	switch (request->u.atapi.sense_key & ATA_SK_MASK) {
-	case ATA_SK_RECOVERED_ERROR:
+	switch (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK) {
+	case ATA_SENSE_RECOVERED_ERROR:
 	    device_printf(request->dev, "WARNING - %s recovered error\n",
 			  ata_cmd2str(request));
 	    /* FALLTHROUGH */
 
-	case ATA_SK_NO_SENSE:
+	case ATA_SENSE_NO_SENSE:
 	    request->result = 0;
 	    break;
 
-	case ATA_SK_NOT_READY: 
+	case ATA_SENSE_NOT_READY: 
 	    request->result = EBUSY;
 	    break;
 
-	case ATA_SK_UNIT_ATTENTION:
+	case ATA_SENSE_UNIT_ATTENTION:
 	    atadev->flags |= ATA_D_MEDIA_CHANGED;
 	    request->result = EIO;
 	    break;
@@ -402,22 +422,19 @@
 	    device_printf(request->dev,
 			  "FAILURE - %s %s asc=0x%02x ascq=0x%02x ",
 			  ata_cmd2str(request), ata_skey2str(
-			  (request->u.atapi.sense_key & ATA_SK_MASK) >> 4),
-			  request->u.atapi.sense_data.asc,
-			  request->u.atapi.sense_data.ascq);
-	    if (request->u.atapi.sense_data.sksv)
-		printf("sks=0x%02x 0x%02x 0x%02x ",
-		       request->u.atapi.sense_data.sk_specific,
-		       request->u.atapi.sense_data.sk_specific1,
-		       request->u.atapi.sense_data.sk_specific2);
-	    printf("error=%b\n",
-		   (request->u.atapi.sense_key & ATA_E_MASK),
-		   "\20\4MEDIA_CHANGE_REQUEST\3ABORTED"
-		   "\2NO_MEDIA\1ILLEGAL_LENGTH");
+			  (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK)),
+			  request->u.atapi.sense.asc,
+			  request->u.atapi.sense.ascq);
+	    if (request->u.atapi.sense.specific & ATA_SENSE_SPEC_VALID)
+		printf("sks=0x%02x 0x%02x 0x%02x\n",
+		       request->u.atapi.sense.specific & ATA_SENSE_SPEC_MASK,
+		       request->u.atapi.sense.specific1,
+		       request->u.atapi.sense.specific2);
 	}
 
-	if ((request->u.atapi.sense_key ?
-	     request->u.atapi.sense_key : request->error) & ATA_E_MASK)
+	if ((request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ?
+	     request->u.atapi.sense.key & ATA_SENSE_KEY_MASK : 
+	     request->error))
 	    request->result = EIO;
     }
 
@@ -461,7 +478,9 @@
     else
 	sema_post(&request->done);
 
-    ata_start(ch->dev);
+    /* only call ata_start if channel is present */
+    if (ch)
+	ata_start(ch->dev);
 }
 
 void
@@ -505,7 +524,6 @@
     if ((request = ch->running) && (!dev || request->dev == dev)) {
 	callout_stop(&request->callout);
 	ch->running = NULL;
-	ch->state = ATA_IDLE;
 	request->result = ENXIO;
 	TAILQ_INSERT_TAIL(&fail_requests, request, chain);
     }
@@ -527,9 +545,6 @@
         TAILQ_REMOVE(&fail_requests, request, chain);
         ata_finish(request);
     }
-
-    /* we might have work for the other device on this channel */
-    ata_start(ch->dev);
 }
 
 static u_int64_t
@@ -613,8 +628,8 @@
     static char buffer[20];
 
     if (request->flags & ATA_R_ATAPI) {
-	switch (request->u.atapi.sense_key ?
-		request->u.atapi.sense_cmd : request->u.atapi.ccb[0]) {
+	switch (request->u.atapi.sense.key ?
+		request->u.atapi.saved_cmd : request->u.atapi.ccb[0]) {
 	case 0x00: return ("TEST_UNIT_READY");
 	case 0x01: return ("REZERO");
 	case 0x03: return ("REQUEST_SENSE");
@@ -655,6 +670,7 @@
 	case 0x5b: return ("CLOSE_TRACK/SESSION");
 	case 0x5c: return ("READ_BUFFER_CAPACITY");
 	case 0x5d: return ("SEND_CUE_SHEET");
+        case 0x96: return ("SERVICE_ACTION_IN");
 	case 0xa1: return ("BLANK_CMD");
 	case 0xa3: return ("SEND_KEY");
 	case 0xa4: return ("REPORT_KEY");

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/ata-raid.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-raid.c,v 1.118 2006/02/17 13:02:09 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-raid.c,v 1.120 2006/04/15 10:27:41 maxim Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -148,14 +148,14 @@
     rdp->disk->d_unit = rdp->lun;
     disk_create(rdp->disk, DISK_VERSION);
 
-    printf("ar%d: %lluMB <%s %s%s> status: %s\n", rdp->lun,
-	   (unsigned long long)(rdp->total_sectors / ((1024L*1024L)/DEV_BSIZE)),
+    printf("ar%d: %juMB <%s %s%s> status: %s\n", rdp->lun,
+	   rdp->total_sectors / ((1024L * 1024L) / DEV_BSIZE),
 	   ata_raid_format(rdp), ata_raid_type(rdp),
 	   buffer, ata_raid_flags(rdp));
 
     if (testing || bootverbose)
-	printf("ar%d: %llu sectors [%dC/%dH/%dS] <%s> subdisks defined as:\n",
-	       rdp->lun, (unsigned long long)rdp->total_sectors,
+	printf("ar%d: %ju sectors [%dC/%dH/%dS] <%s> subdisks defined as:\n",
+	       rdp->lun, rdp->total_sectors,
 	       rdp->cylinders, rdp->heads, rdp->sectors, rdp->name);
 
     for (disk = 0; disk < rdp->total_disks; disk++) {
@@ -974,7 +974,7 @@
 		 * metadata format from the disks (if we support it).
 		 */
 		printf("WARNING!! - not able to determine metadata format\n"
-		       "WARNING!! - Using FreeBSD PsuedoRAID metadata\n"
+		       "WARNING!! - Using FreeBSD PseudoRAID metadata\n"
 		       "If that is not what you want, use the BIOS to "
 		       "create the array\n");
 		ctlr = AR_F_FREEBSD_RAID;
@@ -4234,13 +4234,11 @@
     printf("type                %s\n", ata_raid_type(raid));
     printf("flags               0x%02x %b\n", raid->status, raid->status,
 	   "\20\3REBUILDING\2DEGRADED\1READY\n");
-    printf("magic_0             0x%016llx\n",(unsigned long long)raid->magic_0);
-    printf("magic_1             0x%016llx\n",(unsigned long long)raid->magic_1);
+    printf("magic_0             0x%016jx\n", raid->magic_0);
+    printf("magic_1             0x%016jx\n",raid->magic_1);
     printf("generation          %u\n", raid->generation);
-    printf("total_sectors       %llu\n",
-	   (unsigned long long)raid->total_sectors);
-    printf("offset_sectors      %llu\n",
-	   (unsigned long long)raid->offset_sectors);
+    printf("total_sectors       %ju\n", raid->total_sectors);
+    printf("offset_sectors      %ju\n", raid->offset_sectors);
     printf("heads               %u\n", raid->heads);
     printf("sectors             %u\n", raid->sectors);
     printf("cylinders           %u\n", raid->cylinders);
@@ -4252,8 +4250,8 @@
 	       raid->disks[i].flags, "\20\4ONLINE\3SPARE\2ASSIGNED\1PRESENT\n");
 	if (raid->disks[i].dev) {
 	    printf("        ");
-	    device_printf(raid->disks[i].dev, " sectors %lld\n",
-			  (long long)raid->disks[i].sectors);
+	    device_printf(raid->disks[i].dev, " sectors %jd\n",
+			  raid->disks[i].sectors);
 	}
     }
     printf("=================================================\n");
@@ -4426,9 +4424,9 @@
     printf("config_entries      0x%02x\n", meta->config_entries);
     for (i = 0; i < meta->config_entries; i++) {
 	printf("config %d:\n", i);
-	printf("    total_sectors       %llu\n",
-	       (unsigned long long)(meta->configs[0].total_sectors +
-	       ((u_int64_t)meta->configs_high[0].total_sectors << 32)));
+	printf("    total_sectors       %ju\n",
+	       meta->configs[0].total_sectors +
+	       ((u_int64_t)meta->configs_high[0].total_sectors << 32));
 	printf("    type                %s\n",
 	       ata_raid_hptv3_type(meta->configs[i].type)); 
 	printf("    total_disks         %u\n", meta->configs[i].total_disks);
@@ -4437,9 +4435,9 @@
 	printf("    status              %b\n", meta->configs[i].status,
 	       "\20\2RAID5\1NEED_REBUILD\n");
 	printf("    critical_disks      %u\n", meta->configs[i].critical_disks);
-	printf("    rebuild_lba         %llu\n",
-	       (unsigned long long)(meta->configs_high[0].rebuild_lba +
-	       ((u_int64_t)meta->configs_high[0].rebuild_lba << 32)));
+	printf("    rebuild_lba         %ju\n",
+	       meta->configs_high[0].rebuild_lba +
+	       ((u_int64_t)meta->configs_high[0].rebuild_lba << 32));
     }
     printf("name                <%.16s>\n", meta->name);
     printf("timestamp           0x%08x\n", meta->timestamp);
@@ -4491,8 +4489,7 @@
     map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
     for (j = 0; j < meta->total_volumes; j++) {
 	printf("name                %.16s\n", map->name);
-	printf("total_sectors       %llu\n",
-	       (unsigned long long)map->total_sectors);
+	printf("total_sectors       %ju\n", map->total_sectors);
 	printf("state               %u\n", map->state);
 	printf("reserved            %u\n", map->reserved);
 	printf("offset              %u\n", map->offset);
@@ -4537,8 +4534,7 @@
 	   *((u_int16_t *)meta->timestamp_0), meta->timestamp_0[2],
 	   meta->timestamp_0[3], meta->timestamp_0[5], meta->timestamp_0[4],
 	   meta->timestamp_0[7], meta->timestamp_0[6]);
-    printf("total_sectors       %lld\n",
-	   (unsigned long long)meta->total_sectors);
+    printf("total_sectors       %jd\n", meta->total_sectors);
     printf("type                %s\n", ata_raid_ite_type(meta->type));
     printf("stripe_1kblocks     %u\n", meta->stripe_1kblocks);
     printf("timestamp_1         %04x/%02x/%02x %02x:%02x:%02x.%02x\n",
@@ -4732,8 +4728,8 @@
     printf("revision            %.4s\n", meta->revision);
     printf("dummy_1             0x%08x\n", meta->dummy_1);
     printf("magic_0             0x%08x\n", meta->magic_0);
-    printf("magic_1             0x%016llx\n",(unsigned long long)meta->magic_1);
-    printf("magic_2             0x%016llx\n",(unsigned long long)meta->magic_2);
+    printf("magic_1             0x%016jx\n", meta->magic_1);
+    printf("magic_2             0x%016jx\n", meta->magic_2);
     printf("flags               0x%02x\n", meta->flags);
     printf("array_width         %d\n", meta->array_width);
     printf("total_disks         %d\n", meta->total_disks);
@@ -4777,7 +4773,7 @@
     printf("********* ATA Promise FastTrak Metadata *********\n");
     printf("promise_id          <%s>\n", meta->promise_id);
     printf("dummy_0             0x%08x\n", meta->dummy_0);
-    printf("magic_0             0x%016llx\n",(unsigned long long)meta->magic_0);
+    printf("magic_0             0x%016jx\n", meta->magic_0);
     printf("magic_1             0x%04x\n", meta->magic_1);
     printf("magic_2             0x%08x\n", meta->magic_2);
     printf("integrity           0x%08x %b\n", meta->raid.integrity,
@@ -4789,8 +4785,7 @@
     printf("disk_number         %d\n", meta->raid.disk_number);
     printf("channel             0x%02x\n", meta->raid.channel);
     printf("device              0x%02x\n", meta->raid.device);
-    printf("magic_0             0x%016llx\n",
-	   (unsigned long long)meta->raid.magic_0);
+    printf("magic_0             0x%016jx\n", meta->raid.magic_0);
     printf("disk_offset         %u\n", meta->raid.disk_offset);
     printf("disk_sectors        %u\n", meta->raid.disk_sectors);
     printf("rebuild_lba         0x%08x\n", meta->raid.rebuild_lba);
@@ -4807,8 +4802,7 @@
     printf("cylinders           %u\n", meta->raid.cylinders);
     printf("heads               %u\n", meta->raid.heads);
     printf("sectors             %u\n", meta->raid.sectors);
-    printf("magic_1             0x%016llx\n",
-	   (unsigned long long)meta->raid.magic_1);
+    printf("magic_1             0x%016jx\n", meta->raid.magic_1);
     printf("DISK#   flags dummy_0 channel device  magic_0\n");
     for (i = 0; i < 8; i++) {
 	printf("  %d    %b    0x%02x  0x%02x  0x%02x  ",
@@ -4816,8 +4810,7 @@
 	       "\20\10READY\7DOWN\6REDIR\5DUPLICATE\4SPARE"
 	       "\3ASSIGNED\2ONLINE\1VALID\n", meta->raid.disk[i].dummy_0,
 	       meta->raid.disk[i].channel, meta->raid.disk[i].device);
-	printf("0x%016llx\n",
-	       (unsigned long long)meta->raid.disk[i].magic_0);
+	printf("0x%016jx\n", meta->raid.disk[i].magic_0);
     }
     printf("checksum            0x%08x\n", meta->checksum);
     printf("=================================================\n");
@@ -4842,8 +4835,7 @@
 ata_raid_sii_print_meta(struct sii_raid_conf *meta)
 {
     printf("******* ATA Silicon Image Medley Metadata *******\n");
-    printf("total_sectors       %llu\n",
-	   (unsigned long long)meta->total_sectors);
+    printf("total_sectors       %ju\n", meta->total_sectors);
     printf("dummy_0             0x%04x\n", meta->dummy_0);
     printf("dummy_1             0x%04x\n", meta->dummy_1);
     printf("controller_pci_id   0x%08x\n", meta->controller_pci_id);
@@ -4860,7 +4852,7 @@
     printf("raid0_ident         %u\n", meta->raid0_ident);
     printf("raid1_disks         %u\n", meta->raid1_disks);
     printf("raid1_ident         %u\n", meta->raid1_ident);
-    printf("rebuild_lba         %llu\n", (unsigned long long)meta->rebuild_lba);
+    printf("rebuild_lba         %ju\n", meta->rebuild_lba);
     printf("generation          0x%08x\n", meta->generation);
     printf("status              0x%02x %b\n",
 	    meta->status, meta->status,
@@ -4943,8 +4935,7 @@
     printf(" stripe_disks       %d\n", meta->stripe_layout & VIA_L_DISKS);
     printf(" stripe_sectors     %d\n",
 	   0x08 << ((meta->stripe_layout & VIA_L_MASK) >> VIA_L_SHIFT));
-    printf("disk_sectors        %llu\n",
-	   (unsigned long long)meta->disk_sectors);
+    printf("disk_sectors        %ju\n", meta->disk_sectors);
     printf("disk_id             0x%08x\n", meta->disk_id);
     printf("DISK#   disk_id\n");
     for (i = 0; i < 8; i++) {

==== //depot/projects/kmacy_sun4v/src/sys/dev/ata/atapi-cam.c#3 (text+ko) ====


>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604162243.k3GMhdjZ079309>