PERFORCE change 197083 for review

John Baldwin jhb at FreeBSD.org
Tue Aug 2 18:34:57 UTC 2011


http://p4web.freebsd.org/@@197083?ac=10

Change 197083 by jhb at jhb_jhbbsd on 2011/08/02 18:34:46

	IFC @197082

Affected files ...

.. //depot/projects/pci/sys/amd64/amd64/machdep.c#5 integrate
.. //depot/projects/pci/sys/arm/arm/irq_dispatch.S#3 integrate
.. //depot/projects/pci/sys/arm/sa11x0/sa11x0_irq.S#3 integrate
.. //depot/projects/pci/sys/boot/forth/loader.conf#4 integrate
.. //depot/projects/pci/sys/cam/ata/ata_da.c#5 integrate
.. //depot/projects/pci/sys/cam/cam_periph.c#4 integrate
.. //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c#2 integrate
.. //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#4 integrate
.. //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c#2 integrate
.. //depot/projects/pci/sys/compat/linprocfs/linprocfs.c#5 integrate
.. //depot/projects/pci/sys/conf/NOTES#7 integrate
.. //depot/projects/pci/sys/conf/newvers.sh#3 integrate
.. //depot/projects/pci/sys/conf/options#9 integrate
.. //depot/projects/pci/sys/dev/ahci/ahci.c#6 integrate
.. //depot/projects/pci/sys/dev/ahci/ahci.h#4 integrate
.. //depot/projects/pci/sys/dev/ata/chipsets/ata-nvidia.c#2 integrate
.. //depot/projects/pci/sys/dev/ath/ath_dfs/null/dfs_null.c#3 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah.h#7 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_desc.h#4 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_eeprom.h#4 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_eeprom_9287.c#2 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_eeprom_v14.c#5 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_eeprom_v14.h#5 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ah_eeprom_v4k.c#3 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5212/ar5212_ani.c#2 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416.h#5 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c#4 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c#6 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c#5 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c#7 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c#3 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar9002/ar9280.c#3 integrate
.. //depot/projects/pci/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c#6 integrate
.. //depot/projects/pci/sys/dev/ath/if_ath.c#8 integrate
.. //depot/projects/pci/sys/dev/ath/if_ath_sysctl.c#6 integrate
.. //depot/projects/pci/sys/dev/ath/if_athvar.h#5 integrate
.. //depot/projects/pci/sys/dev/hptiop/hptiop.c#2 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt.c#4 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt.h#4 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_cam.c#4 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_debug.c#3 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_pci.c#4 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_raid.c#2 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_raid.h#2 integrate
.. //depot/projects/pci/sys/dev/mpt/mpt_user.c#3 integrate
.. //depot/projects/pci/sys/dev/re/if_re.c#3 integrate
.. //depot/projects/pci/sys/dev/usb/input/ums.c#5 integrate
.. //depot/projects/pci/sys/fs/cd9660/iso.h#2 integrate
.. //depot/projects/pci/sys/fs/msdosfs/msdosfsmount.h#2 integrate
.. //depot/projects/pci/sys/fs/nfsclient/nfs_clnode.c#4 integrate
.. //depot/projects/pci/sys/fs/nfsclient/nfs_clvnops.c#6 integrate
.. //depot/projects/pci/sys/fs/nfsclient/nfsnode.h#3 integrate
.. //depot/projects/pci/sys/fs/nfsserver/nfs_nfsdserv.c#5 integrate
.. //depot/projects/pci/sys/fs/ntfs/ntfs.h#2 integrate
.. //depot/projects/pci/sys/fs/smbfs/smbfs.h#2 integrate
.. //depot/projects/pci/sys/i386/i386/machdep.c#5 integrate
.. //depot/projects/pci/sys/i386/ibcs2/imgact_coff.c#2 integrate
.. //depot/projects/pci/sys/kern/kern_conf.c#3 integrate
.. //depot/projects/pci/sys/kern/kern_jail.c#5 integrate
.. //depot/projects/pci/sys/kern/kern_linker.c#4 integrate
.. //depot/projects/pci/sys/kern/kern_lock.c#2 integrate
.. //depot/projects/pci/sys/kern/kern_shutdown.c#4 integrate
.. //depot/projects/pci/sys/kern/subr_smp.c#6 integrate
.. //depot/projects/pci/sys/kern/vfs_mount.c#6 integrate
.. //depot/projects/pci/sys/kern/vfs_subr.c#7 integrate
.. //depot/projects/pci/sys/mips/mips/exception.S#3 integrate
.. //depot/projects/pci/sys/net/if_lagg.c#5 integrate
.. //depot/projects/pci/sys/netgraph/ng_ether.c#4 integrate
.. //depot/projects/pci/sys/netgraph/ng_mppc.c#3 integrate
.. //depot/projects/pci/sys/netgraph/ng_parse.c#2 integrate
.. //depot/projects/pci/sys/netinet/ip_divert.c#4 integrate
.. //depot/projects/pci/sys/nfsclient/nfs_node.c#2 integrate
.. //depot/projects/pci/sys/nfsclient/nfsnode.h#2 integrate
.. //depot/projects/pci/sys/pc98/pc98/machdep.c#5 integrate
.. //depot/projects/pci/sys/pci/if_rlreg.h#2 integrate
.. //depot/projects/pci/sys/powerpc/aim/locore32.S#5 integrate
.. //depot/projects/pci/sys/powerpc/booke/locore.S#4 integrate
.. //depot/projects/pci/sys/powerpc/booke/platform_bare.c#3 integrate
.. //depot/projects/pci/sys/powerpc/booke/pmap.c#4 integrate
.. //depot/projects/pci/sys/powerpc/conf/MPC85XX#3 integrate
.. //depot/projects/pci/sys/powerpc/mpc85xx/atpic.c#2 integrate
.. //depot/projects/pci/sys/powerpc/powermac/fcu.c#4 integrate
.. //depot/projects/pci/sys/sys/mount.h#3 integrate
.. //depot/projects/pci/sys/sys/systm.h#7 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_alloc.c#8 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_softdep.c#7 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_vfsops.c#5 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_vnops.c#4 integrate
.. //depot/projects/pci/sys/ufs/ufs/inode.h#3 integrate
.. //depot/projects/pci/sys/vm/device_pager.c#4 integrate
.. //depot/projects/pci/sys/vm/swap_pager.c#4 integrate
.. //depot/projects/pci/sys/vm/swap_pager.h#2 integrate

Differences ...

==== //depot/projects/pci/sys/amd64/amd64/machdep.c#5 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.751 2011/06/08 08:12:15 avg Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.752 2011/07/30 13:33:05 bz Exp $");
 
 #include "opt_atalk.h"
 #include "opt_atpic.h"
@@ -1309,7 +1309,7 @@
 {
 	int i, physmap_idx, pa_indx, da_indx;
 	vm_paddr_t pa, physmap[PHYSMAP_SIZE];
-	u_long physmem_tunable;
+	u_long physmem_tunable, memtest, tmpul;
 	pt_entry_t *pte;
 	struct bios_smap *smapbase, *smap, *smapend;
 	u_int32_t smapsize;
@@ -1372,6 +1372,14 @@
 		Maxmem = atop(physmem_tunable);
 
 	/*
+	 * By default keep the memtest enabled.  Use a general name so that
+	 * one could eventually do more with the code than just disable it.
+	 */
+	memtest = 1;
+	if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul))
+		memtest = tmpul;
+
+	/*
 	 * Don't allow MAXMEM or hw.physmem to extend the amount of memory
 	 * in the system.
 	 */
@@ -1433,6 +1441,8 @@
 				goto do_dump_avail;
 
 			page_bad = FALSE;
+			if (memtest == 0)
+				goto skip_memtest;
 
 			/*
 			 * map page into kernel: valid, read/write,non-cacheable
@@ -1470,6 +1480,7 @@
 			 */
 			*(int *)ptr = tmp;
 
+skip_memtest:
 			/*
 			 * Adjust array of valid/good pages.
 			 */

==== //depot/projects/pci/sys/arm/arm/irq_dispatch.S#3 (text+ko) ====

@@ -72,7 +72,7 @@
 #include <machine/asm.h>
 #include <machine/asmacros.h>
 #include <machine/armreg.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/irq_dispatch.S,v 1.5 2011/07/18 15:19:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/irq_dispatch.S,v 1.6 2011/08/02 17:49:27 attilio Exp $");
 
 /*
  * irq_entry:
@@ -109,9 +109,9 @@
 _C_LABEL(intrcnt):
 	.space NIRQ * 4
 _C_LABEL(sintrnames):
-	.word NIRQ * (MAXCOMLEN + 1)
+	.int NIRQ * (MAXCOMLEN + 1)
 _C_LABEL(sintrcnt):
-	.word NIRQ * 4
+	.int NIRQ * 4
 
 	.global _C_LABEL(current_intr_depth)
 _C_LABEL(current_intr_depth):

==== //depot/projects/pci/sys/arm/sa11x0/sa11x0_irq.S#3 (text+ko) ====

@@ -36,7 +36,7 @@
 #include <machine/armreg.h>
 #include <machine/asmacros.h>
 #include <arm/sa11x0/sa11x0_reg.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_irq.S,v 1.5 2011/07/18 15:19:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_irq.S,v 1.6 2011/08/02 17:49:27 attilio Exp $");
 Lcurrent_intr_depth:
 	.word	_C_LABEL(current_intr_depth)
 
@@ -122,7 +122,7 @@
 	.global _C_LABEL(intrnames), _C_LABEL(sintrnames)
 _C_LABEL(intrnames): 
 _C_LABEL(sintrnames):
-	.word	0
+	.int	0
 
 	.globl	_C_LABEL(intrcnt), _C_LABEL(sintrcnt)
 

==== //depot/projects/pci/sys/boot/forth/loader.conf#4 (text+ko) ====

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.157 2011/04/13 12:19:03 pluknet Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.158 2011/07/25 21:52:17 rodrigc Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -55,6 +55,11 @@
 #prompt="\\${interpret}"	# Set the command prompt
 #root_disk_unit="0"		# Force the root disk unit number
 #rootdev="disk1s1a"		# Set the root filesystem
+#tftp.blksize="1428"		# Set the RFC 2348 TFTP block size.
+				# If the TFTP server does not support RFC 2348,
+				# the block size is set to 512.  If the value
+				# is out of range ( < 8 || > 9008 ) an error is
+				# returned.
 
 
 ##############################################################

==== //depot/projects/pci/sys/cam/ata/ata_da.c#5 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.35 2011/06/18 22:26:58 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.38 2011/07/30 21:42:53 mav Exp $");
 
 #include "opt_ada.h"
 #include "opt_ata.h"
@@ -69,6 +69,7 @@
 #define ATA_MAX_28BIT_LBA               268435455UL
 
 typedef enum {
+	ADA_STATE_RAHEAD,
 	ADA_STATE_WCACHE,
 	ADA_STATE_NORMAL
 } ada_state;
@@ -94,7 +95,8 @@
 } ada_quirks;
 
 typedef enum {
-	ADA_CCB_WCACHE		= 0x01,
+	ADA_CCB_RAHEAD		= 0x01,
+	ADA_CCB_WCACHE		= 0x02,
 	ADA_CCB_BUFFER_IO	= 0x03,
 	ADA_CCB_WAITING		= 0x04,
 	ADA_CCB_DUMP		= 0x05,
@@ -132,6 +134,7 @@
 	int	 outstanding_cmds;
 	int	 trim_max_ranges;
 	int	 trim_running;
+	int	 read_ahead;
 	int	 write_cache;
 #ifdef ADA_TEST_FAILURE
 	int      force_read_error;
@@ -294,10 +297,19 @@
 #define	ADA_DEFAULT_SPINDOWN_SUSPEND	1
 #endif
 
+#ifndef	ADA_DEFAULT_READ_AHEAD
+#define	ADA_DEFAULT_READ_AHEAD	1
+#endif
+
 #ifndef	ADA_DEFAULT_WRITE_CACHE
 #define	ADA_DEFAULT_WRITE_CACHE	1
 #endif
 
+#define	ADA_RA	(softc->read_ahead >= 0 ? \
+		 softc->read_ahead : ada_read_ahead)
+#define	ADA_WC	(softc->write_cache >= 0 ? \
+		 softc->write_cache : ada_write_cache)
+
 /*
  * Most platforms map firmware geometry to actual, but some don't.  If
  * not overridden, default to nothing.
@@ -312,6 +324,7 @@
 static int ada_send_ordered = ADA_DEFAULT_SEND_ORDERED;
 static int ada_spindown_shutdown = ADA_DEFAULT_SPINDOWN_SHUTDOWN;
 static int ada_spindown_suspend = ADA_DEFAULT_SPINDOWN_SUSPEND;
+static int ada_read_ahead = ADA_DEFAULT_READ_AHEAD;
 static int ada_write_cache = ADA_DEFAULT_WRITE_CACHE;
 
 SYSCTL_NODE(_kern_cam, OID_AUTO, ada, CTLFLAG_RD, 0,
@@ -334,6 +347,9 @@
 SYSCTL_INT(_kern_cam_ada, OID_AUTO, spindown_suspend, CTLFLAG_RW,
            &ada_spindown_suspend, 0, "Spin down upon suspend");
 TUNABLE_INT("kern.cam.ada.spindown_suspend", &ada_spindown_suspend);
+SYSCTL_INT(_kern_cam_ada, OID_AUTO, read_ahead, CTLFLAG_RW,
+           &ada_read_ahead, 0, "Enable disk read-ahead");
+TUNABLE_INT("kern.cam.ada.read_ahead", &ada_read_ahead);
 SYSCTL_INT(_kern_cam_ada, OID_AUTO, write_cache, CTLFLAG_RW,
            &ada_write_cache, 0, "Enable disk write cache");
 TUNABLE_INT("kern.cam.ada.write_cache", &ada_write_cache);
@@ -425,7 +441,8 @@
 
 	softc = (struct ada_softc *)periph->softc;
 	/* We only sync the cache if the drive is capable of it. */
-	if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) {
+	if ((softc->flags & ADA_FLAG_CAN_FLUSHCACHE) != 0 &&
+	    (softc->flags & ADA_FLAG_PACK_INVALID) == 0) {
 
 		ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL);
 		cam_fill_ataio(&ccb->ataio,
@@ -467,12 +484,20 @@
 adaschedule(struct cam_periph *periph)
 {
 	struct ada_softc *softc = (struct ada_softc *)periph->softc;
+	uint32_t prio;
 
+	/* Check if cam_periph_getccb() was called. */
+	prio = periph->immediate_priority;
+
+	/* Check if we have more work to do. */
 	if (bioq_first(&softc->bio_queue) ||
 	    (!softc->trim_running && bioq_first(&softc->trim_queue))) {
-		/* Have more work to do, so ensure we stay scheduled */
-		xpt_schedule(periph, CAM_PRIORITY_NORMAL);
+		prio = CAM_PRIORITY_NORMAL;
 	}
+
+	/* Schedule CCB if any of above is true. */
+	if (prio != CAM_PRIORITY_NONE)
+		xpt_schedule(periph, prio);
 }
 
 /*
@@ -736,16 +761,19 @@
 
 		softc = (struct ada_softc *)periph->softc;
 		cam_periph_async(periph, code, path, arg);
-		if (ada_write_cache < 0 && softc->write_cache < 0)
-			break;
 		if (softc->state != ADA_STATE_NORMAL)
 			break;
 		xpt_setup_ccb(&cgd.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
 		cgd.ccb_h.func_code = XPT_GDEV_TYPE;
 		xpt_action((union ccb *)&cgd);
-		if ((cgd.ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) == 0)
-			break;
-		softc->state = ADA_STATE_WCACHE;
+		if (ADA_RA >= 0 &&
+		    cgd.ident_data.support.command1 & ATA_SUPPORT_LOOKAHEAD)
+			softc->state = ADA_STATE_RAHEAD;
+		else if (ADA_WC >= 0 &&
+		    cgd.ident_data.support.command1 & ATA_SUPPORT_WRITECACHE)
+			softc->state = ADA_STATE_WCACHE;
+		else
+		    break;
 		cam_periph_acquire(periph);
 		cam_freeze_devq_arg(periph->path,
 		    RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1);
@@ -788,6 +816,9 @@
 	}
 
 	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "read_ahead", CTLFLAG_RW | CTLFLAG_MPSAFE,
+		&softc->read_ahead, 0, "Enable disk read ahead.");
+	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
 		OID_AUTO, "write_cache", CTLFLAG_RW | CTLFLAG_MPSAFE,
 		&softc->write_cache, 0, "Enable disk write cache.");
 #ifdef ADA_TEST_FAILURE
@@ -921,6 +952,10 @@
 	quirks = softc->quirks;
 	TUNABLE_INT_FETCH(announce_buf, &quirks);
 	softc->quirks = quirks;
+	softc->read_ahead = -1;
+	snprintf(announce_buf, sizeof(announce_buf),
+	    "kern.cam.ada.%d.read_ahead", periph->unit_number);
+	TUNABLE_INT_FETCH(announce_buf, &softc->read_ahead);
 	softc->write_cache = -1;
 	snprintf(announce_buf, sizeof(announce_buf),
 	    "kern.cam.ada.%d.write_cache", periph->unit_number);
@@ -1043,7 +1078,14 @@
 	    (ADA_DEFAULT_TIMEOUT * hz) / ADA_ORDEREDTAG_INTERVAL,
 	    adasendorderedtag, softc);
 
-	if ((ada_write_cache >= 0 || softc->write_cache >= 0) &&
+	if (ADA_RA >= 0 &&
+	    cgd->ident_data.support.command1 & ATA_SUPPORT_LOOKAHEAD) {
+		softc->state = ADA_STATE_RAHEAD;
+		cam_periph_acquire(periph);
+		cam_freeze_devq_arg(periph->path,
+		    RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1);
+		xpt_schedule(periph, CAM_PRIORITY_DEV);
+	} else if (ADA_WC >= 0 &&
 	    cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) {
 		softc->state = ADA_STATE_WCACHE;
 		cam_periph_acquire(periph);
@@ -1316,8 +1358,19 @@
 		adaschedule(periph);
 		break;
 	}
+	case ADA_STATE_RAHEAD:
 	case ADA_STATE_WCACHE:
 	{
+		if (softc->flags & ADA_FLAG_PACK_INVALID) {
+			softc->state = ADA_STATE_NORMAL;
+			xpt_release_ccb(start_ccb);
+			cam_release_devq(periph->path,
+			    RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_DEV + 1, FALSE);
+			adaschedule(periph);
+			cam_periph_release_locked(periph);
+			return;
+		}
+
 		cam_fill_ataio(ataio,
 		    1,
 		    adadone,
@@ -1327,10 +1380,15 @@
 		    0,
 		    ada_default_timeout*1000);
 
-		ata_28bit_cmd(ataio, ATA_SETFEATURES, (softc->write_cache > 0 ||
-		     (softc->write_cache < 0 && ada_write_cache)) ?
-		    ATA_SF_ENAB_WCACHE : ATA_SF_DIS_WCACHE, 0, 0);
-		start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE;
+		if (softc->state == ADA_STATE_RAHEAD) {
+			ata_28bit_cmd(ataio, ATA_SETFEATURES, ADA_RA ?
+			    ATA_SF_ENAB_RCACHE : ATA_SF_DIS_RCACHE, 0, 0);
+			start_ccb->ccb_h.ccb_state = ADA_CCB_RAHEAD;
+		} else {
+			ata_28bit_cmd(ataio, ATA_SETFEATURES, ADA_WC ?
+			    ATA_SF_ENAB_WCACHE : ATA_SF_DIS_WCACHE, 0, 0);
+			start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE;
+		}
 		xpt_action(start_ccb);
 		break;
 	}
@@ -1342,6 +1400,7 @@
 {
 	struct ada_softc *softc;
 	struct ccb_ataio *ataio;
+	struct ccb_getdev *cgd;
 
 	softc = (struct ada_softc *)periph->softc;
 	ataio = &done_ccb->ataio;
@@ -1361,7 +1420,8 @@
 				return;
 			}
 			if (error != 0) {
-				if (error == ENXIO) {
+				if (error == ENXIO &&
+				    (softc->flags & ADA_FLAG_PACK_INVALID) == 0) {
 					/*
 					 * Catastrophic error.  Mark our pack as
 					 * invalid.
@@ -1421,6 +1481,47 @@
 			biodone(bp);
 		break;
 	}
+	case ADA_CCB_RAHEAD:
+	{
+		if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+			if (adaerror(done_ccb, 0, 0) == ERESTART) {
+				return;
+			} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
+				cam_release_devq(done_ccb->ccb_h.path,
+				    /*relsim_flags*/0,
+				    /*reduction*/0,
+				    /*timeout*/0,
+				    /*getcount_only*/0);
+			}
+		}
+
+		/*
+		 * Since our peripheral may be invalidated by an error
+		 * above or an external event, we must release our CCB
+		 * before releasing the reference on the peripheral.
+		 * The peripheral will only go away once the last reference
+		 * is removed, and we need it around for the CCB release
+		 * operation.
+		 */
+		cgd = (struct ccb_getdev *)done_ccb;
+		xpt_setup_ccb(&cgd->ccb_h, periph->path, CAM_PRIORITY_NORMAL);
+		cgd->ccb_h.func_code = XPT_GDEV_TYPE;
+		xpt_action((union ccb *)cgd);
+		if (ADA_WC >= 0 &&
+		    cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) {
+			softc->state = ADA_STATE_WCACHE;
+			xpt_release_ccb(done_ccb);
+			xpt_schedule(periph, CAM_PRIORITY_DEV);
+			return;
+		}
+		softc->state = ADA_STATE_NORMAL;
+		xpt_release_ccb(done_ccb);
+		cam_release_devq(periph->path,
+		    RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_DEV + 1, FALSE);
+		adaschedule(periph);
+		cam_periph_release_locked(periph);
+		return;
+	}
 	case ADA_CCB_WCACHE:
 	{
 		if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {

==== //depot/projects/pci/sys/cam/cam_periph.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_periph.c,v 1.96 2011/06/14 14:53:17 gibbs Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_periph.c,v 1.97 2011/07/29 20:30:28 mav Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1550,7 +1550,8 @@
 		 * make sure we actually have retries available.
 		 */
 		if ((err_action & SSQ_DECREMENT_COUNT) != 0) {
-		 	if (ccb->ccb_h.retry_count > 0)
+		 	if (ccb->ccb_h.retry_count > 0 &&
+			    (periph->flags & CAM_PERIPH_INVALID) == 0)
 		 		ccb->ccb_h.retry_count--;
 			else {
 				*action_string = "Retries exhausted";
@@ -1718,6 +1719,7 @@
 cam_periph_error(union ccb *ccb, cam_flags camflags,
 		 u_int32_t sense_flags, union ccb *save_ccb)
 {
+	struct cam_periph *periph;
 	const char *action_string;
 	cam_status  status;
 	int	    frozen;
@@ -1725,7 +1727,8 @@
 	int         openings;
 	u_int32_t   relsim_flags;
 	u_int32_t   timeout = 0;
-	
+
+	periph = xpt_path_periph(ccb->ccb_h.path);
 	action_string = NULL;
 	status = ccb->ccb_h.status;
 	frozen = (status & CAM_DEV_QFRZN) != 0;
@@ -1787,9 +1790,9 @@
 			xpt_print(ccb->ccb_h.path, "Data overrun\n");
 			printed++;
 		}
-		error = EIO;	/* we have to kill the command */
 		/* decrement the number of retries */
-		if (ccb->ccb_h.retry_count > 0) {
+		if (ccb->ccb_h.retry_count > 0 &&
+		    (periph->flags & CAM_PERIPH_INVALID) == 0) {
 			ccb->ccb_h.retry_count--;
 			error = ERESTART;
 		} else {
@@ -1808,7 +1811,8 @@
 		struct cam_path *newpath;
 
 		if ((camflags & CAM_RETRY_SELTO) != 0) {
-			if (ccb->ccb_h.retry_count > 0) {
+			if (ccb->ccb_h.retry_count > 0 &&
+			    (periph->flags & CAM_PERIPH_INVALID) == 0) {
 
 				ccb->ccb_h.retry_count--;
 				error = ERESTART;
@@ -1826,10 +1830,11 @@
 				timeout = periph_selto_delay;
 				break;
 			}
+			action_string = "Retries exhausted";
 		}
 		error = ENXIO;
 		/* Should we do more if we can't create the path?? */
-		if (xpt_create_path(&newpath, xpt_path_periph(ccb->ccb_h.path),
+		if (xpt_create_path(&newpath, periph,
 				    xpt_path_path_id(ccb->ccb_h.path),
 				    xpt_path_target_id(ccb->ccb_h.path),
 				    CAM_LUN_WILDCARD) != CAM_REQ_CMP) 
@@ -1874,11 +1879,16 @@
 		/* FALLTHROUGH */
 	case CAM_REQUEUE_REQ:
 		/* Unconditional requeue */
-		error = ERESTART;
 		if (bootverbose && printed == 0) {
 			xpt_print(ccb->ccb_h.path, "Request requeued\n");
 			printed++;
 		}
+		if ((periph->flags & CAM_PERIPH_INVALID) == 0)
+			error = ERESTART;
+		else {
+			action_string = "Retries exhausted";
+			error = EIO;
+		}
 		break;
 	case CAM_RESRC_UNAVAIL:
 		/* Wait a bit for the resource shortage to abate. */
@@ -1893,7 +1903,8 @@
 		/* FALLTHROUGH */
 	default:
 		/* decrement the number of retries */
-		if (ccb->ccb_h.retry_count > 0) {
+		if (ccb->ccb_h.retry_count > 0 &&
+		    (periph->flags & CAM_PERIPH_INVALID) == 0) {
 			ccb->ccb_h.retry_count--;
 			error = ERESTART;
 			if (bootverbose && printed == 0) {

==== //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c#2 (text+ko) ====

@@ -488,7 +488,7 @@
 txg_delay(dsl_pool_t *dp, uint64_t txg, int ticks)
 {
 	tx_state_t *tx = &dp->dp_tx;
-	int timeout = ddi_get_lbolt() + ticks;
+	clock_t timeout = ddi_get_lbolt() + ticks;
 
 	/* don't delay if this txg could transition to quiesing immediately */
 	if (tx->tx_open_txg > txg ||

==== //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#4 (text+ko) ====

@@ -612,7 +612,8 @@
 	/*
 	 * If we're in FRSYNC mode, sync out this znode before reading it.
 	 */
-	if (ioflag & FRSYNC || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
+	if (zfsvfs->z_log &&
+	    (ioflag & FRSYNC || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS))
 		zil_commit(zfsvfs->z_log, zp->z_id);
 
 	/*
@@ -6340,7 +6341,7 @@
 		if (error == 0)
 			*ap->a_size = (size_t)va.va_size;
 	} else if (ap->a_uio != NULL)
-		error = VOP_READ(vp, ap->a_uio, IO_UNIT | IO_SYNC, ap->a_cred);
+		error = VOP_READ(vp, ap->a_uio, IO_UNIT, ap->a_cred);
 
 	VOP_UNLOCK(vp, 0);
 	vn_close(vp, flags, ap->a_cred, td);

==== //depot/projects/pci/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c#2 (text+ko) ====

@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
  */
 
 /* Portions Copyright 2010 Robert Milkowski */
@@ -567,7 +568,7 @@
 
 	if (!list_is_empty(&zilog->zl_lwb_list)) {
 		ASSERT(zh->zh_claim_txg == 0);
-		ASSERT(!keep_first);
+		VERIFY(!keep_first);
 		while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) {
 			list_remove(&zilog->zl_lwb_list, lwb);
 			if (lwb->lwb_buf != NULL)
@@ -1668,20 +1669,9 @@
 void
 zil_free(zilog_t *zilog)
 {
-	lwb_t *head_lwb;
-
 	zilog->zl_stop_sync = 1;
 
-	/*
-	 * After zil_close() there should only be one lwb with a buffer.
-	 */
-	head_lwb = list_head(&zilog->zl_lwb_list);
-	if (head_lwb) {
-		ASSERT(head_lwb == list_tail(&zilog->zl_lwb_list));
-		list_remove(&zilog->zl_lwb_list, head_lwb);
-		zio_buf_free(head_lwb->lwb_buf, head_lwb->lwb_sz);
-		kmem_cache_free(zil_lwb_cache, head_lwb);
-	}
+	ASSERT(list_is_empty(&zilog->zl_lwb_list));
 	list_destroy(&zilog->zl_lwb_list);
 
 	avl_destroy(&zilog->zl_vdev_tree);
@@ -1721,6 +1711,10 @@
 {
 	zilog_t *zilog = dmu_objset_zil(os);
 
+	ASSERT(zilog->zl_clean_taskq == NULL);
+	ASSERT(zilog->zl_get_data == NULL);
+	ASSERT(list_is_empty(&zilog->zl_lwb_list));
+
 	zilog->zl_get_data = get_data;
 	zilog->zl_clean_taskq = taskq_create("zil_clean", 1, minclsyspri,
 	    2, 2, TASKQ_PREPOPULATE);
@@ -1734,7 +1728,7 @@
 void
 zil_close(zilog_t *zilog)
 {
-	lwb_t *tail_lwb;
+	lwb_t *lwb;
 	uint64_t txg = 0;
 
 	zil_commit(zilog, 0); /* commit all itx */
@@ -1746,9 +1740,9 @@
 	 * destroy the zl_clean_taskq.
 	 */
 	mutex_enter(&zilog->zl_lock);
-	tail_lwb = list_tail(&zilog->zl_lwb_list);
-	if (tail_lwb != NULL)
-		txg = tail_lwb->lwb_max_txg;
+	lwb = list_tail(&zilog->zl_lwb_list);
+	if (lwb != NULL)
+		txg = lwb->lwb_max_txg;
 	mutex_exit(&zilog->zl_lock);
 	if (txg)
 		txg_wait_synced(zilog->zl_dmu_pool, txg);
@@ -1756,6 +1750,19 @@
 	taskq_destroy(zilog->zl_clean_taskq);
 	zilog->zl_clean_taskq = NULL;
 	zilog->zl_get_data = NULL;
+
+	/*
+	 * We should have only one LWB left on the list; remove it now.
+	 */
+	mutex_enter(&zilog->zl_lock);
+	lwb = list_head(&zilog->zl_lwb_list);
+	if (lwb != NULL) {
+		ASSERT(lwb == list_tail(&zilog->zl_lwb_list));
+		list_remove(&zilog->zl_lwb_list, lwb);
+		zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
+		kmem_cache_free(zil_lwb_cache, lwb);
+	}
+	mutex_exit(&zilog->zl_lock);
 }
 
 /*

==== //depot/projects/pci/sys/compat/linprocfs/linprocfs.c#5 (text+ko) ====

@@ -42,7 +42,7 @@
 #include "opt_compat.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.160 2011/06/17 07:30:56 pluknet Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.161 2011/08/01 19:12:15 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -502,6 +502,33 @@
 	return (0);
 }
 
+static int
+linprocfs_doswaps(PFS_FILL_ARGS)
+{
+	struct xswdev xsw;
+	uintmax_t total, used;
+	int n;
+	char devname[SPECNAMELEN + 1];
+
+	sbuf_printf(sb, "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n");
+	mtx_lock(&Giant);
+	for (n = 0; ; n++) {
+		if (swap_dev_info(n, &xsw, devname, sizeof(devname)) != 0)
+			break;
+		total = (uintmax_t)xsw.xsw_nblks * PAGE_SIZE / 1024;
+		used  = (uintmax_t)xsw.xsw_used * PAGE_SIZE / 1024;
+
+		/*
+		 * The space and not tab after the device name is on
+		 * purpose.  Linux does so.
+		 */
+		sbuf_printf(sb, "/dev/%-34s unknown\t\t%jd\t%jd\t-1\n",
+		    devname, total, used);
+	}
+	mtx_unlock(&Giant);
+	return (0);
+}
+
 /*
  * Filler function for proc/uptime
  */
@@ -1490,6 +1517,8 @@
 	    NULL, NULL, NULL, 0);
 	pfs_create_file(root, "stat", &linprocfs_dostat,
 	    NULL, NULL, NULL, PFS_RD);
+	pfs_create_file(root, "swaps", &linprocfs_doswaps,
+	    NULL, NULL, NULL, PFS_RD);
 	pfs_create_file(root, "uptime", &linprocfs_douptime,
 	    NULL, NULL, NULL, PFS_RD);
 	pfs_create_file(root, "version", &linprocfs_doversion,

==== //depot/projects/pci/sys/conf/NOTES#7 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1617 2011/07/19 00:37:24 attilio Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1618 2011/07/25 09:12:48 avg Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -499,16 +499,6 @@
 options 	REGRESSION
 
 #
-# RESTARTABLE_PANICS allows one to continue from a panic as if it were
-# a call to the debugger to continue from a panic as instead.  It is only
-# useful if a kernel debugger is present.  To restart from a panic, reset
-# the panicstr variable to NULL and continue execution.  This option is
-# for development use only and should NOT be used in production systems
-# to "workaround" a panic.
-#
-#options 	RESTARTABLE_PANICS
-
-#
 # This option lets some drivers co-exist that can't co-exist in a running
 # system.  This is used to be able to compile all kernel code in one go for
 # quality assurance purposes (like this file, which the option takes it name

==== //depot/projects/pci/sys/conf/newvers.sh#3 (text+ko) ====

@@ -28,11 +28,11 @@
 # SUCH DAMAGE.
 #
 #	@(#)newvers.sh	8.1 (Berkeley) 4/20/94
-# $FreeBSD: src/sys/conf/newvers.sh,v 1.93 2011/05/23 19:57:12 ru Exp $
+# $FreeBSD: src/sys/conf/newvers.sh,v 1.94 2011/07/26 04:00:00 kensmith Exp $
 
 TYPE="FreeBSD"
 REVISION="9.0"
-BRANCH="CURRENT"
+BRANCH="BETA1"
 if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
 	BRANCH=${BRANCH_OVERRIDE}
 fi

==== //depot/projects/pci/sys/conf/options#9 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.737 2011/07/19 00:37:24 attilio Exp $
+# $FreeBSD: src/sys/conf/options,v 1.738 2011/07/25 09:12:48 avg Exp $
 #
 #        On the handling of kernel options
 #
@@ -579,7 +579,6 @@
 LOCK_PROFILING_FAST	opt_global.h
 MSIZE			opt_global.h
 REGRESSION		opt_global.h
-RESTARTABLE_PANICS	opt_global.h
 RWLOCK_NOINLINE		opt_global.h
 SX_NOINLINE		opt_global.h
 VFS_BIO_DEBUG		opt_global.h

==== //depot/projects/pci/sys/dev/ahci/ahci.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ahci/ahci.c,v 1.71 2011/06/30 19:23:17 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ahci/ahci.c,v 1.73 2011/08/02 11:07:47 mav Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
@@ -264,7 +264,7 @@
 	{0x0abe10de, 0x00, "NVIDIA MCP79",	AHCI_Q_NOAA},
 	{0x0abf10de, 0x00, "NVIDIA MCP79",	AHCI_Q_NOAA},
 	{0x0d8410de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOAA},
-	{0x0d8510de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOAA},
+	{0x0d8510de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOFORCE|AHCI_Q_NOAA},
 	{0x0d8610de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOAA},
 	{0x0d8710de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOAA},
 	{0x0d8810de, 0x00, "NVIDIA MCP89",	AHCI_Q_NOAA},
@@ -1879,12 +1879,13 @@
 			device_printf(dev, "Poll timeout on slot %d port %d\n",
 			    slot->slot, port);
 			device_printf(dev, "is %08x cs %08x ss %08x "
-			    "rs %08x tfd %02x serr %08x\n",
+			    "rs %08x tfd %02x serr %08x cmd %08x\n",
 			    ATA_INL(ch->r_mem, AHCI_P_IS),
 			    ATA_INL(ch->r_mem, AHCI_P_CI),
 			    ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots,
 			    ATA_INL(ch->r_mem, AHCI_P_TFD),
-			    ATA_INL(ch->r_mem, AHCI_P_SERR));
+			    ATA_INL(ch->r_mem, AHCI_P_SERR),
+			    ATA_INL(ch->r_mem, AHCI_P_CMD));
 			et = AHCI_ERR_TIMEOUT;
 		}
 
@@ -1960,8 +1961,12 @@
 		ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK)
 		    >> AHCI_P_CMD_CCS_SHIFT;
 		if ((sstatus & (1 << slot->slot)) != 0 || ccs == slot->slot ||
-		    ch->fbs_enabled)
+		    ch->fbs_enabled || ch->wrongccs)
+			slot->state = AHCI_SLOT_EXECUTING;
+		else if ((ch->rslots & (1 << ccs)) == 0) {
+			ch->wrongccs = 1;
 			slot->state = AHCI_SLOT_EXECUTING;
+		}
 
 		callout_reset(&slot->timeout,
 		    (int)slot->ccb->ccb_h.timeout * hz / 2000,
@@ -1971,10 +1976,12 @@
 
 	device_printf(dev, "Timeout on slot %d port %d\n",
 	    slot->slot, slot->ccb->ccb_h.target_id & 0x0f);
-	device_printf(dev, "is %08x cs %08x ss %08x rs %08x tfd %02x serr %08x\n",
+	device_printf(dev, "is %08x cs %08x ss %08x rs %08x tfd %02x "
+	    "serr %08x cmd %08x\n",
 	    ATA_INL(ch->r_mem, AHCI_P_IS), ATA_INL(ch->r_mem, AHCI_P_CI),
 	    ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots,
-	    ATA_INL(ch->r_mem, AHCI_P_TFD), ATA_INL(ch->r_mem, AHCI_P_SERR));
+	    ATA_INL(ch->r_mem, AHCI_P_TFD), ATA_INL(ch->r_mem, AHCI_P_SERR),
+	    ATA_INL(ch->r_mem, AHCI_P_CMD));
 
 	/* Handle frozen command. */
 	if (ch->frozen) {
@@ -1987,7 +1994,7 @@
 		}
 		xpt_done(fccb);
 	}
-	if (!ch->fbs_enabled) {
+	if (!ch->fbs_enabled && !ch->wrongccs) {
 		/* Without FBS we know real timeout source. */
 		ch->fatalerr = 1;
 		/* Handle command with timeout. */
@@ -2585,6 +2592,7 @@
 		xpt_release_simq(ch->sim, TRUE);
 	ch->eslots = 0;
 	ch->toslots = 0;
+	ch->wrongccs = 0;
 	ch->fatalerr = 0;
 	/* Tell the XPT about the event */
 	xpt_async(AC_BUS_RESET, ch->path, NULL);

==== //depot/projects/pci/sys/dev/ahci/ahci.h#4 (text+ko) ====

@@ -24,7 +24,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/ahci/ahci.h,v 1.18 2011/05/17 22:07:45 mav Exp $
+ * $FreeBSD: src/sys/dev/ahci/ahci.h,v 1.19 2011/07/29 20:35:23 mav Exp $
  */
 
 /* ATA register defines */
@@ -426,6 +426,7 @@
 	int			resetting;	/* Hard-reset in progress. */
 	int			resetpolldiv;	/* Hard-reset poll divider. */
 	int			listening;	/* SUD bit is cleared. */
+	int			wrongccs;	/* CCS field in CMD was wrong */
 	union ccb		*frozen;	/* Frozen command */
 	struct callout		pm_timer;	/* Power management events */
 	struct callout		reset_timer;	/* Hard-reset timeout */

==== //depot/projects/pci/sys/dev/ata/chipsets/ata-nvidia.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-nvidia.c,v 1.14 2010/10/18 11:30:13 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-nvidia.c,v 1.15 2011/08/02 11:07:47 mav Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -54,6 +54,7 @@
 /* local prototypes */
 static int ata_nvidia_chipinit(device_t dev);
 static int ata_nvidia_ch_attach(device_t dev);
+static int ata_nvidia_ch_attach_dumb(device_t dev);
 static int ata_nvidia_status(device_t dev);
 static void ata_nvidia_reset(device_t dev);
 static int ata_nvidia_setmode(device_t dev, int target, int mode);
@@ -62,6 +63,7 @@
 #define NV4             0x01
 #define NVQ             0x02
 #define NVAHCI          0x04
+#define NVNOFORCE       0x08
 
 
 /*
@@ -158,7 +160,7 @@
      { ATA_NFORCE_MCP79_AA, 0, NVAHCI,  0, ATA_SA300, "nForce MCP79" },
      { ATA_NFORCE_MCP79_AB, 0, NVAHCI,  0, ATA_SA300, "nForce MCP79" },
      { ATA_NFORCE_MCP89_A0, 0, NVAHCI,  0, ATA_SA300, "nForce MCP89" },
-     { ATA_NFORCE_MCP89_A1, 0, NVAHCI,  0, ATA_SA300, "nForce MCP89" },
+     { ATA_NFORCE_MCP89_A1, 0, NVAHCI|NVNOFORCE, 0, ATA_SA300, "nForce MCP89" },
      { ATA_NFORCE_MCP89_A2, 0, NVAHCI,  0, ATA_SA300, "nForce MCP89" },
      { ATA_NFORCE_MCP89_A3, 0, NVAHCI,  0, ATA_SA300, "nForce MCP89" },
      { ATA_NFORCE_MCP89_A4, 0, NVAHCI,  0, ATA_SA300, "nForce MCP89" },
@@ -178,7 +180,9 @@
 	return ENXIO;
 
     ata_set_desc(dev);
-    if (ctlr->chip->cfg1 & NVAHCI)
+    if ((ctlr->chip->cfg1 & NVAHCI) &&
+	((ctlr->chip->cfg1 & NVNOFORCE) == 0 ||
+	 pci_get_subclass(dev) != PCIS_STORAGE_IDE))
 	ctlr->chipinit = ata_ahci_chipinit;
     else
 	ctlr->chipinit = ata_nvidia_chipinit;
@@ -193,7 +197,10 @@
     if (ata_setup_interrupt(dev, ata_generic_intr))
 	return ENXIO;

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


More information about the p4-projects mailing list