[pve-devel] r6156 - pve-kernel-2.6.32-rh/trunk

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Jun 24 12:35:51 CEST 2011


Author: dietmar
Date: 2011-06-24 12:35:51 +0200 (Fri, 24 Jun 2011)
New Revision: 6156

Added:
   pve-kernel-2.6.32-rh/trunk/SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch
Removed:
   pve-kernel-2.6.32-rh/trunk/aacraid_source_1.1.7-28000.tgz
   pve-kernel-2.6.32-rh/trunk/applydebpatches.pl
   pve-kernel-2.6.32-rh/trunk/iscsideb/
   pve-kernel-2.6.32-rh/trunk/scst-disable-debug.diff
   pve-kernel-2.6.32-rh/trunk/scst-snap-21.12.09.tgz
Modified:
   pve-kernel-2.6.32-rh/trunk/Makefile
   pve-kernel-2.6.32-rh/trunk/README
   pve-kernel-2.6.32-rh/trunk/changelog.Debian
   pve-kernel-2.6.32-rh/trunk/config-2.6.32.diff
Log:


Modified: pve-kernel-2.6.32-rh/trunk/Makefile
===================================================================
--- pve-kernel-2.6.32-rh/trunk/Makefile	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/Makefile	2011-06-24 10:35:51 UTC (rev 6156)
@@ -42,23 +42,15 @@
 #BNX2DIR=netxtreme2-6.2.23
 #BNX2SRC=${BNX2DIR}.tar.gz
 
-AACRAIDDIR=aacraid
-AACRAIDSRC=aacraid_source_1.1.7-28000.tgz
-
 ARECADIR=arcmsr.1.20.0X.15-110330
 ARECASRC=${ARECADIR}.zip
 
-SCSTDIR=scst
-SCSTSRC=scst-snap-21.12.09.tgz
-ISCSIDIR=iscsi-scst
-ISCSI_DEB=iscsi-scst_1.0.1.1-4_${ARCH}.deb
-
 DST_DEB=${PACKAGE}_${KERNEL_VER}-${PKGREL}_${ARCH}.deb
 HDR_DEB=${HDRPACKAGE}_${KERNEL_VER}-${PKGREL}_${ARCH}.deb
 PVEPKG=proxmox-ve-${KERNEL_VER}
 PVE_DEB=${PVEPKG}_${RELEASE}-${PKGREL}_all.deb
 
-all: check_gcc ${DST_DEB} ${PVE_DEB} ${FW_DEB} ${HDR_DEB} ${ISCSI_DEB}
+all: check_gcc ${DST_DEB} ${PVE_DEB} ${FW_DEB} ${HDR_DEB}
 
 ${PVE_DEB} pve: proxmox-ve/control proxmox-ve/postinst
 	rm -rf proxmox-ve/data
@@ -94,7 +86,7 @@
 	./find-firmware.pl data/lib/modules/${KVNAME} >fwlist.tmp
 	mv fwlist.tmp $@
 
-data: .compile_mark ${KERNEL_CFG} arcmsr.ko aoe.ko e1000e.ko igb.ko ixgbe.ko iscsi-scst.ko scst-modules.tar aacraid.ko
+data: .compile_mark ${KERNEL_CFG} arcmsr.ko aoe.ko e1000e.ko igb.ko ixgbe.ko
 	rm -rf data tmp; mkdir -p tmp/lib/modules/${KVNAME}
 	mkdir tmp/boot
 	install -m 644 ${KERNEL_CFG} tmp/boot/config-${KVNAME}
@@ -117,11 +109,6 @@
 	#install -m 644 cnic.ko tmp/lib/modules/${KVNAME}/kernel/drivers/net/
 	# install areca driver
 	install -m 644 arcmsr.ko tmp/lib/modules/${KVNAME}/kernel/drivers/scsi/arcmsr/
-	# install aacraid 
-	install -m 644 aacraid.ko tmp/lib/modules/${KVNAME}/kernel/drivers/scsi/aacraid
-	# install scst modules
-	install -m 644 -D iscsi-scst.ko tmp/lib/modules/${KVNAME}/extra/scst/iscsi-scst.ko
-	tar xf scst-modules.tar -C tmp/lib/modules/${KVNAME}/extra/scst
 	# remove firmware
 	rm -rf tmp/lib/firmware
 	# strip debug info
@@ -141,26 +128,15 @@
 	patch ${KERNEL_CFG}.new config-${KERNEL_VER}.diff
 	mv ${KERNEL_CFG}.new ${KERNEL_CFG}
 
-# adjust scst patch for openvz code
-put_page_callback-2.6.32.patch: scst-src/AskingQuestions put_page_callback-2.6.32.patch.diff
-	cp scst-src/iscsi-scst/kernel/patches/put_page_callback-2.6.32.patch $@.tmp
-	patch $@.tmp <put_page_callback-2.6.32.patch.diff
-	mv $@.tmp $@
-
-
-${KERNEL_SRC}/README: ${KERNEL_SRC}.org/README scst-src/AskingQuestions put_page_callback-2.6.32.patch
+${KERNEL_SRC}/README: ${KERNEL_SRC}.org/README
 	rm -rf ${KERNEL_SRC}
 	cp -a ${KERNEL_SRC}.org ${KERNEL_SRC}
 	cd ${KERNEL_SRC}; patch -p1 <../bootsplash-3.1.9-2.6.31-rh.patch
 	cd ${KERNEL_SRC}; patch -p1 <../${RHKERSRCDIR}/patch-042stab018
 	cd ${KERNEL_SRC}; patch -p1 <../do-not-use-barrier-on-ext3.patch
+	cd ${KERNEL_SRC}; patch -p1 <../SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch
 	cd ${KERNEL_SRC}; patch -p1 <../fix-register-corruption-in-pvclock-scale-delta.patch
-	#cd ${KERNEL_SRC}; patch -p1 <../use-init-task-credential.patch
 	cd ${KERNEL_SRC}; patch -p1 <../bridge-patch.diff
-	cd ${KERNEL_SRC}; patch -p1 <../scst-src/scst/kernel/scst_exec_req_fifo-2.6.32.patch
-	cd ${KERNEL_SRC}; patch -p1 <../scst-src/scst/kernel/io_context-2.6.32.patch
-	#cd ${KERNEL_SRC}; patch -p1 <../scst-src/scst/kernel/readahead-2.6.32.patch
-	cd ${KERNEL_SRC}; patch -p1 <../put_page_callback-2.6.32.patch
 	cd ${KERNEL_SRC}; patch -p1 <../ovz-fix-slow-fsync.patch
 	sed -i ${KERNEL_SRC}/Makefile -e 's/^EXTRAVERSION.*$$/EXTRAVERSION=${EXTRAVERSION}/'
 	touch $@
@@ -177,15 +153,6 @@
 	cd ${RHKERSRCDIR};rpm2cpio ../${KERNELSRCRPM} |cpio -i
 	touch $@
 
-aacraid.ko: ${AACRAIDSRC}
-	rm -rf ${AACRAIDDIR}
-	mkdir ${AACRAIDDIR}
-	cd ${AACRAIDDIR};tar xf ../${AACRAIDSRC}
-	mkdir -p /lib/modules/${KVNAME}
-	ln -sf ${TOP}/${KERNEL_SRC} /lib/modules/${KVNAME}/build
-	cd ${AACRAIDDIR}; make KVER=${KVNAME}
-	cp ${AACRAIDDIR}/aacraid.ko aacraid.ko
-
 aoe.ko aoe: .compile_mark ${AOESRC}
 	# aoe driver updates
 	rm -rf ${AOEDIR} aoe.ko
@@ -235,31 +202,7 @@
 	cd ${ARECADIR}; make -C ${TOP}/${KERNEL_SRC} CONFIG_SCSI_ARCMSR=m SUBDIRS=${TOP}/${ARECADIR} modules
 	cp ${ARECADIR}/arcmsr.ko arcmsr.ko
 
-scst-src/AskingQuestions:
-	#svn co https://scst.svn.sourceforge.net/svnroot/scst/trunk scst-src
-	tar xf ${SCSTSRC}
 
-scst-modules.tar scstmod ${SCSTDIR}/README: .compile_mark scst-src/AskingQuestions
-	rm -rf ${SCSTDIR}
-	rsync -a --exclude .svn scst-src/scst/ ${SCSTDIR}
-	mkdir -p /lib/modules/${KVNAME}
-	ln -sf ${TOP}/${KERNEL_SRC} /lib/modules/${KVNAME}/build
-	mkdir ${SCSTDIR}/modules
-	cd ${SCSTDIR}; patch -p 1 <../scst-disable-debug.diff
-	cd ${SCSTDIR}; make KDIR=/lib/modules/${KVNAME}/build
-	cd ${SCSTDIR}; cp src/*.ko src/dev_handlers/*.ko modules
-	tar cf scst-modules.tar -C ${SCSTDIR}/modules .	
-	touch ${SCSTDIR}/README
-
-${ISCSI_DEB} iscsi-scst.ko iscsi: .compile_mark ${SCSTDIR}/README scst-src/AskingQuestions
-	rm -rf ${ISCSIDIR} iscsi-scst.ko
-	rsync -a --exclude .svn scst-src/iscsi-scst/ ${ISCSIDIR}
-	cp -a iscsideb ${ISCSIDIR}/debian
-	cd ${ISCSIDIR}; export KVER=${KVNAME}; dpkg-buildpackage -b -rfakeroot -us -uc
-	cd ${ISCSIDIR}; make KVER=${KVNAME} mods
-	cp ${ISCSIDIR}/kernel/iscsi-scst.ko iscsi-scst.ko 
-	lintian ${ISCSI_DEB}
-
 headers_tmp := $(CURDIR)/tmp-headers
 headers_dir := $(headers_tmp)/usr/src/linux-headers-${KVNAME}
 
@@ -314,7 +257,7 @@
 	dpkg-deb --build fwdata ${FW_DEB}
 
 .PHONY: upload
-upload: ${DST_DEB} ${PVE_DEB} ${HDR_DEB} ${FW_DEB} ${ISCSI_DEB}
+upload: ${DST_DEB} ${PVE_DEB} ${HDR_DEB} ${FW_DEB}
 	umount /pve/${RELEASE}; mount /pve/${RELEASE} -o rw 
 	mkdir -p /pve/${RELEASE}/extra
 	mkdir -p /pve/${RELEASE}/install
@@ -322,9 +265,8 @@
 	rm -rf /pve/${RELEASE}/extra/${HDRPACKAGE}_*.deb
 	rm -rf /pve/${RELEASE}/extra/${PVEPKG}_*.deb
 	rm -rf /pve/${RELEASE}/extra/pve-firmware*.deb
-	rm -rf /pve/${RELEASE}/extra/iscsi-scst*.deb
 	rm -rf /pve/${RELEASE}/extra/Packages*
-	cp ${DST_DEB} ${PVE_DEB} ${HDR_DEB} ${FW_DEB} ${ISCSI_DEB} /pve/${RELEASE}/extra
+	cp ${DST_DEB} ${PVE_DEB} ${HDR_DEB} ${FW_DEB} /pve/${RELEASE}/extra
 	cd /pve/${RELEASE}/extra; dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
 	umount /pve/${RELEASE}; mount /pve/${RELEASE} -o ro
 
@@ -334,6 +276,6 @@
 
 .PHONY: clean
 clean:
-	rm -rf *~ .compile_mark ${KERNEL_CFG} ${KERNEL_SRC} tmp data proxmox-ve/data *.deb ${AOEDIR} aoe.ko ${headers_tmp} scst-src ${ISCSIDIR} ${ISCSI_DEB} iscsi-scst.ko scst-modules.tar ${SCSTDIR} put_page_callback-2.6.32.patch fwdata fwlist.tmp iscsideb/*~ iscsi-scst_* *.ko ${IXGBEDIR} ${E1000EDIR} e1000e.ko ${IGBDIR} igb.ko fwlist-${KVNAME} ${ARECADIR} arcmsr.ko ${AACRAIDDIR} aacraid.ko
+	rm -rf *~ .compile_mark ${KERNEL_CFG} ${KERNEL_SRC} tmp data proxmox-ve/data *.deb ${AOEDIR} aoe.ko ${headers_tmp} fwdata fwlist.tmp *.ko ${IXGBEDIR} ${E1000EDIR} e1000e.ko ${IGBDIR} igb.ko fwlist-${KVNAME} ${ARECADIR} arcmsr.ko
 
 

Modified: pve-kernel-2.6.32-rh/trunk/README
===================================================================
--- pve-kernel-2.6.32-rh/trunk/README	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/README	2011-06-24 10:35:51 UTC (rev 6156)
@@ -3,7 +3,6 @@
 
 We use the OpenVZ Kernel sources, available from:
 
-
 http://download.openvz.org/kernel/branches/rhel6-2.6.32/
 
 
@@ -20,14 +19,10 @@
 
 - include latest e1000e driver from intel/sourceforge
 
-- include latest AACRAID driver from Adaptec site
-
 - include update for ARECA RAID cards
 
   * ftp://ftp.areca.com.tw/RaidCards/AP_Drivers/Linux/DRIVER/SourceCode/arcmsr.1.20.0X.15-110330.zip
 
-- incluse SCST patches
-
 FIRMWARE:
 =========
 
@@ -64,7 +59,9 @@
   of bridge device, then address won't change. So we could omit
   that patch, requiring to set hwaddress in /etc/network/interfaces.
 
+ SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch: aacraid update
 
+
 Additional information
 ----------------------
 
@@ -82,9 +79,6 @@
 
 - disable CONFIG_PRINTK_TIME
 
-- enable zero copy patch for SCST
-	 CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION=y
-
 - enable common CONFIG_BLK_DEV_XXX to avoid hardware detection
   problems (udev, undate-initramfs hav serious problems without that)
 
@@ -96,5 +90,5 @@
 Testing final kernel with kvm
 -----------------------------
 
-kvm -kernel data/boot/vmlinuz-2.6.32-3-pve -initrd initrd.img-2.6.32-3-pve -append "vga=791 video=vesafb:ywrap,mtrr splash=silent" /dev/zero
+kvm -kernel data/boot/vmlinuz-2.6.32-6-pve -initrd initrd.img-2.6.32-6-pve -append "vga=791 video=vesafb:ywrap,mtrr splash=silent" /dev/zero
 

Added: pve-kernel-2.6.32-rh/trunk/SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch
===================================================================
--- pve-kernel-2.6.32-rh/trunk/SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch	                        (rev 0)
+++ pve-kernel-2.6.32-rh/trunk/SCSI-aacraid-Add-PMC-Sierra-SRC-based-controller.patch	2011-06-24 10:35:51 UTC (rev 6156)
@@ -0,0 +1,1445 @@
+commit e8b12f0fb8352237525961f14ec933e915848840
+Author: Mahesh Rajashekhara <Mahesh_Rajashekhara at pmc-sierra.com>
+Date:   Thu Mar 17 02:10:32 2011 -0700
+
+    [SCSI] aacraid: Add new code for PMC-Sierra's SRC based controller family
+    
+    Added new hardware device 0x28b interface for PMC-Sierra's SRC based
+    controller family.
+    
+    - new src.c file for 0x28b specific functions
+    - new XPORT header required
+    - sync. command interface: doorbell bits shifted (SRC_ODR_SHIFT, SRC_IDR_SHIFT)
+    - async. Interface: different inbound queue handling, no outbound I2O
+      queue available, using doorbell ("PmDoorBellResponseSent") and
+      response buffer on the host ("host_rrq") for status
+    - changed AIF (adapter initiated FIBs) interface: "DoorBellAifPending"
+      bit to inform about pending AIF, "AifRequest" command to read AIF,
+      "NoMoreAifDataAvailable" to mark the end of the AIFs
+    
+    Signed-off-by: Mahesh Rajashekhara <aacraid at pmc-sierra.com>
+    Signed-off-by: James Bottomley <James.Bottomley at suse.de>
+
+diff --git a/drivers/scsi/aacraid/Makefile b/drivers/scsi/aacraid/Makefile
+index 92df4d6..1bd9fd1 100644
+--- a/drivers/scsi/aacraid/Makefile
++++ b/drivers/scsi/aacraid/Makefile
+@@ -3,6 +3,6 @@
+ obj-$(CONFIG_SCSI_AACRAID) := aacraid.o
+ 
+ aacraid-objs	:= linit.o aachba.o commctrl.o comminit.o commsup.o \
+-		   dpcsup.o rx.o sa.o rkt.o nark.o
++		   dpcsup.o rx.o sa.o rkt.o nark.o src.o
+ 
+ EXTRA_CFLAGS	:= -Idrivers/scsi
+diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
+index 7df2dd1..118ce83 100644
+--- a/drivers/scsi/aacraid/aachba.c
++++ b/drivers/scsi/aacraid/aachba.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -1486,7 +1487,9 @@ int aac_get_adapter_info(struct aac_dev* dev)
+ 			dev->a_ops.adapter_write = aac_write_block;
+ 		}
+ 		dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
+-		if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
++		if (dev->adapter_info.options & AAC_OPT_NEW_COMM_TYPE1)
++			dev->adapter_info.options |= AAC_OPT_NEW_COMM;
++		if (!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
+ 			/*
+ 			 * Worst case size that could cause sg overflow when
+ 			 * we break up SG elements that are larger than 64KB.
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index 4dbcc05..29ab000 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -12,7 +12,7 @@
+  *----------------------------------------------------------------------------*/
+ 
+ #ifndef AAC_DRIVER_BUILD
+-# define AAC_DRIVER_BUILD 2461
++# define AAC_DRIVER_BUILD 28000
+ # define AAC_DRIVER_BRANCH "-ms"
+ #endif
+ #define MAXIMUM_NUM_CONTAINERS	32
+@@ -277,6 +277,16 @@ enum aac_queue_types {
+ 
+ #define		FsaNormal	1
+ 
++/* transport FIB header (PMC) */
++struct aac_fib_xporthdr {
++	u64	HostAddress;	/* FIB host address w/o xport header */
++	u32	Size;		/* FIB size excluding xport header */
++	u32	Handle;		/* driver handle to reference the FIB */
++	u64	Reserved[2];
++};
++
++#define		ALIGN32		32
++
+ /*
+  * Define the FIB. The FIB is the where all the requested data and
+  * command information are put to the application on the FSA adapter.
+@@ -394,7 +404,9 @@ enum fib_xfer_state {
+ 	AdapterMicroFib			= (1<<17),
+ 	BIOSFibPath			= (1<<18),
+ 	FastResponseCapable		= (1<<19),
+-	ApiFib				= (1<<20)	// Its an API Fib.
++	ApiFib				= (1<<20),	/* Its an API Fib */
++	/* PMC NEW COMM: There is no more AIF data pending */
++	NoMoreAifDataAvailable		= (1<<21)
+ };
+ 
+ /*
+@@ -404,6 +416,7 @@ enum fib_xfer_state {
+ 
+ #define ADAPTER_INIT_STRUCT_REVISION		3
+ #define ADAPTER_INIT_STRUCT_REVISION_4		4 // rocket science
++#define ADAPTER_INIT_STRUCT_REVISION_6		6 /* PMC src */
+ 
+ struct aac_init
+ {
+@@ -428,9 +441,15 @@ struct aac_init
+ #define INITFLAGS_NEW_COMM_SUPPORTED	0x00000001
+ #define INITFLAGS_DRIVER_USES_UTC_TIME	0x00000010
+ #define INITFLAGS_DRIVER_SUPPORTS_PM	0x00000020
++#define INITFLAGS_NEW_COMM_TYPE1_SUPPORTED	0x00000041
+ 	__le32	MaxIoCommands;	/* max outstanding commands */
+ 	__le32	MaxIoSize;	/* largest I/O command */
+ 	__le32	MaxFibSize;	/* largest FIB to adapter */
++	/* ADAPTER_INIT_STRUCT_REVISION_5 begins here */
++	__le32	MaxNumAif;	/* max number of aif */
++	/* ADAPTER_INIT_STRUCT_REVISION_6 begins here */
++	__le32	HostRRQ_AddrLow;
++	__le32	HostRRQ_AddrHigh;	/* Host RRQ (response queue) for SRC */
+ };
+ 
+ enum aac_log_level {
+@@ -685,7 +704,7 @@ struct rx_inbound {
+ #define OutboundDoorbellReg	MUnit.ODR
+ 
+ struct rx_registers {
+-	struct rx_mu_registers		MUnit;		/* 1300h - 1344h */
++	struct rx_mu_registers		MUnit;		/* 1300h - 1347h */
+ 	__le32				reserved1[2];	/* 1348h - 134ch */
+ 	struct rx_inbound		IndexRegs;
+ };
+@@ -703,7 +722,7 @@ struct rx_registers {
+ #define rkt_inbound rx_inbound
+ 
+ struct rkt_registers {
+-	struct rkt_mu_registers		MUnit;		 /* 1300h - 1344h */
++	struct rkt_mu_registers		MUnit;		 /* 1300h - 1347h */
+ 	__le32				reserved1[1006]; /* 1348h - 22fch */
+ 	struct rkt_inbound		IndexRegs;	 /* 2300h - */
+ };
+@@ -713,6 +732,44 @@ struct rkt_registers {
+ #define rkt_writeb(AEP, CSR, value)	writeb(value, &((AEP)->regs.rkt->CSR))
+ #define rkt_writel(AEP, CSR, value)	writel(value, &((AEP)->regs.rkt->CSR))
+ 
++/*
++ * PMC SRC message unit registers
++ */
++
++#define src_inbound rx_inbound
++
++struct src_mu_registers {
++				/*	PCI*| Name */
++	__le32	reserved0[8];	/*	00h | Reserved */
++	__le32	IDR;		/*	20h | Inbound Doorbell Register */
++	__le32	IISR;		/*	24h | Inbound Int. Status Register */
++	__le32	reserved1[3];	/*	28h | Reserved */
++	__le32	OIMR;		/*	34h | Outbound Int. Mask Register */
++	__le32	reserved2[25];	/*	38h | Reserved */
++	__le32	ODR_R;		/*	9ch | Outbound Doorbell Read */
++	__le32	ODR_C;		/*	a0h | Outbound Doorbell Clear */
++	__le32	reserved3[6];	/*	a4h | Reserved */
++	__le32	OMR;		/*	bch | Outbound Message Register */
++	__le32	IQ_L;		/*  c0h | Inbound Queue (Low address) */
++	__le32	IQ_H;		/*  c4h | Inbound Queue (High address) */
++};
++
++struct src_registers {
++	struct src_mu_registers MUnit;	/* 00h - c7h */
++	__le32 reserved1[130790];	/* c8h - 7fc5fh */
++	struct src_inbound IndexRegs;	/* 7fc60h */
++};
++
++#define src_readb(AEP, CSR)		readb(&((AEP)->regs.src.bar0->CSR))
++#define src_readl(AEP, CSR)		readl(&((AEP)->regs.src.bar0->CSR))
++#define src_writeb(AEP, CSR, value)	writeb(value, \
++						&((AEP)->regs.src.bar0->CSR))
++#define src_writel(AEP, CSR, value)	writel(value, \
++						&((AEP)->regs.src.bar0->CSR))
++
++#define SRC_ODR_SHIFT		12
++#define SRC_IDR_SHIFT		9
++
+ typedef void (*fib_callback)(void *ctxt, struct fib *fibctx);
+ 
+ struct aac_fib_context {
+@@ -879,6 +936,7 @@ struct aac_supplement_adapter_info
+ #define AAC_OPTION_MU_RESET		cpu_to_le32(0x00000001)
+ #define AAC_OPTION_IGNORE_RESET		cpu_to_le32(0x00000002)
+ #define AAC_OPTION_POWER_MANAGEMENT	cpu_to_le32(0x00000004)
++#define AAC_OPTION_DOORBELL_RESET	cpu_to_le32(0x00004000)
+ #define AAC_SIS_VERSION_V3	3
+ #define AAC_SIS_SLOT_UNKNOWN	0xFF
+ 
+@@ -940,6 +998,7 @@ struct aac_bus_info_response {
+ #define AAC_OPT_SUPPLEMENT_ADAPTER_INFO	cpu_to_le32(1<<16)
+ #define AAC_OPT_NEW_COMM		cpu_to_le32(1<<17)
+ #define AAC_OPT_NEW_COMM_64		cpu_to_le32(1<<18)
++#define AAC_OPT_NEW_COMM_TYPE1		cpu_to_le32(1<<28)
+ 
+ struct aac_dev
+ {
+@@ -952,6 +1011,7 @@ struct aac_dev
+ 	 */
+ 	unsigned		max_fib_size;
+ 	unsigned		sg_tablesize;
++	unsigned		max_num_aif;
+ 
+ 	/*
+ 	 *	Map for 128 fib objects (64k)
+@@ -980,10 +1040,21 @@ struct aac_dev
+ 	struct adapter_ops	a_ops;
+ 	unsigned long		fsrev;		/* Main driver's revision number */
+ 
+-	unsigned		base_size;	/* Size of mapped in region */
++	unsigned long		dbg_base;	/* address of UART
++						 * debug buffer */
++
++	unsigned		base_size, dbg_size;	/* Size of
++							 *  mapped in region */
++
+ 	struct aac_init		*init;		/* Holds initialization info to communicate with adapter */
+ 	dma_addr_t		init_pa;	/* Holds physical address of the init struct */
+ 
++	u32			*host_rrq;	/* response queue
++						 * if AAC_COMM_MESSAGE_TYPE1 */
++
++	dma_addr_t		host_rrq_pa;	/* phys. address */
++	u32			host_rrq_idx;	/* index into rrq buffer */
++
+ 	struct pci_dev		*pdev;		/* Our PCI interface */
+ 	void *			printfbuf;	/* pointer to buffer used for printf's from the adapter */
+ 	void *			comm_addr;	/* Base address of Comm area */
+@@ -1003,14 +1074,20 @@ struct aac_dev
+ 	 */
+ #ifndef AAC_MIN_FOOTPRINT_SIZE
+ #	define AAC_MIN_FOOTPRINT_SIZE 8192
++#	define AAC_MIN_SRC_BAR0_SIZE 0x400000
++#	define AAC_MIN_SRC_BAR1_SIZE 0x800
+ #endif
+ 	union
+ 	{
+ 		struct sa_registers __iomem *sa;
+ 		struct rx_registers __iomem *rx;
+ 		struct rkt_registers __iomem *rkt;
++		struct {
++			struct src_registers __iomem *bar0;
++			char __iomem *bar1;
++		} src;
+ 	} regs;
+-	volatile void __iomem *base;
++	volatile void __iomem *base, *dbg_base_mapped;
+ 	volatile struct rx_inbound __iomem *IndexRegs;
+ 	u32			OIMR; /* Mask Register Cache */
+ 	/*
+@@ -1031,9 +1108,8 @@ struct aac_dev
+ 	u8			comm_interface;
+ #	define AAC_COMM_PRODUCER 0
+ #	define AAC_COMM_MESSAGE  1
+-	/* macro side-effects BEWARE */
+-#	define			raw_io_interface \
+-	  init->InitStructRevision==cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4)
++#	define AAC_COMM_MESSAGE_TYPE1	3
++	u8			raw_io_interface;
+ 	u8			raw_io_64;
+ 	u8			printf_enabled;
+ 	u8			in_reset;
+@@ -1789,6 +1865,10 @@ extern struct aac_common aac_config;
+ #define DoorBellAdapterNormCmdNotFull	(1<<3)	/* Adapter -> Host */
+ #define DoorBellAdapterNormRespNotFull	(1<<4)	/* Adapter -> Host */
+ #define DoorBellPrintfReady		(1<<5)	/* Adapter -> Host */
++#define DoorBellAifPending		(1<<6)	/* Adapter -> Host */
++
++/* PMC specific outbound doorbell bits */
++#define PmDoorBellResponseSent		(1<<1)	/* Adapter -> Host */
+ 
+ /*
+  *	For FIB communication, we need all of the following things
+@@ -1831,6 +1911,9 @@ extern struct aac_common aac_config;
+ #define		AifReqAPIJobUpdate	109	/* Update a job report from the API */
+ #define		AifReqAPIJobFinish	110	/* Finish a job from the API */
+ 
++/* PMC NEW COMM: Request the event data */
++#define		AifReqEvent		200
++
+ /*
+  *	Adapter Initiated FIB command structures. Start with the adapter
+  *	initiated FIBs that really come from the adapter, and get responded
+@@ -1886,10 +1969,13 @@ int aac_rx_init(struct aac_dev *dev);
+ int aac_rkt_init(struct aac_dev *dev);
+ int aac_nark_init(struct aac_dev *dev);
+ int aac_sa_init(struct aac_dev *dev);
++int aac_src_init(struct aac_dev *dev);
+ int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify);
+ unsigned int aac_response_normal(struct aac_queue * q);
+ unsigned int aac_command_normal(struct aac_queue * q);
+-unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index);
++unsigned int aac_intr_normal(struct aac_dev *dev, u32 Index,
++			int isAif, int isFastResponse,
++			struct hw_fib *aif_fib);
+ int aac_reset_adapter(struct aac_dev * dev, int forced);
+ int aac_check_health(struct aac_dev * dev);
+ int aac_command_thread(void *data);
+diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
+index 645ddd9..8a0b330 100644
+--- a/drivers/scsi/aacraid/commctrl.c
++++ b/drivers/scsi/aacraid/commctrl.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
+index a726148..7ac8fdb 100644
+--- a/drivers/scsi/aacraid/comminit.c
++++ b/drivers/scsi/aacraid/comminit.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -52,12 +53,16 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
+ 	unsigned long size, align;
+ 	const unsigned long fibsize = 4096;
+ 	const unsigned long printfbufsiz = 256;
++	unsigned long host_rrq_size = 0;
+ 	struct aac_init *init;
+ 	dma_addr_t phys;
+ 	unsigned long aac_max_hostphysmempages;
+ 
+-	size = fibsize + sizeof(struct aac_init) + commsize + commalign + printfbufsiz;
+-
++	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1)
++		host_rrq_size = (dev->scsi_host_ptr->can_queue
++			+ AAC_NUM_MGT_FIB) * sizeof(u32);
++	size = fibsize + sizeof(struct aac_init) + commsize +
++			commalign + printfbufsiz + host_rrq_size;
+  
+ 	base = pci_alloc_consistent(dev->pdev, size, &phys);
+ 
+@@ -70,8 +75,14 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
+ 	dev->comm_phys = phys;
+ 	dev->comm_size = size;
+ 	
+-	dev->init = (struct aac_init *)(base + fibsize);
+-	dev->init_pa = phys + fibsize;
++	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) {
++		dev->host_rrq = (u32 *)(base + fibsize);
++		dev->host_rrq_pa = phys + fibsize;
++		memset(dev->host_rrq, 0, host_rrq_size);
++	}
++
++	dev->init = (struct aac_init *)(base + fibsize + host_rrq_size);
++	dev->init_pa = phys + fibsize + host_rrq_size;
+ 
+ 	init = dev->init;
+ 
+@@ -106,8 +117,13 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
+ 
+ 	init->InitFlags = 0;
+ 	if (dev->comm_interface == AAC_COMM_MESSAGE) {
+-		init->InitFlags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED);
++		init->InitFlags |= cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED);
+ 		dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n"));
++	} else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) {
++		init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_6);
++		init->InitFlags |= cpu_to_le32(INITFLAGS_NEW_COMM_TYPE1_SUPPORTED);
++		dprintk((KERN_WARNING
++			"aacraid: New Comm Interface type1 enabled\n"));
+ 	}
+ 	init->InitFlags |= cpu_to_le32(INITFLAGS_DRIVER_USES_UTC_TIME |
+ 				       INITFLAGS_DRIVER_SUPPORTS_PM);
+@@ -115,11 +131,18 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
+ 	init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9);
+ 	init->MaxFibSize = cpu_to_le32(dev->max_fib_size);
+ 
++	init->MaxNumAif = cpu_to_le32(dev->max_num_aif);
++	init->HostRRQ_AddrHigh = (u32)((u64)dev->host_rrq_pa >> 32);
++	init->HostRRQ_AddrLow = (u32)(dev->host_rrq_pa & 0xffffffff);
++
++
+ 	/*
+ 	 * Increment the base address by the amount already used
+ 	 */
+-	base = base + fibsize + sizeof(struct aac_init);
+-	phys = (dma_addr_t)((ulong)phys + fibsize + sizeof(struct aac_init));
++	base = base + fibsize + host_rrq_size + sizeof(struct aac_init);
++	phys = (dma_addr_t)((ulong)phys + fibsize + host_rrq_size +
++		sizeof(struct aac_init));
++
+ 	/*
+ 	 *	Align the beginning of Headers to commalign
+ 	 */
+@@ -314,15 +337,22 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
+ 		- sizeof(struct aac_write) + sizeof(struct sgentry))
+ 			/ sizeof(struct sgentry);
+ 	dev->comm_interface = AAC_COMM_PRODUCER;
+-	dev->raw_io_64 = 0;
++	dev->raw_io_interface = dev->raw_io_64 = 0;
++
+ 	if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES,
+ 		0, 0, 0, 0, 0, 0, status+0, status+1, status+2, NULL, NULL)) &&
+ 	 		(status[0] == 0x00000001)) {
+ 		if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64))
+ 			dev->raw_io_64 = 1;
+-		if (dev->a_ops.adapter_comm &&
+-		    (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM)))
+-			dev->comm_interface = AAC_COMM_MESSAGE;
++		if (dev->a_ops.adapter_comm) {
++			if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1)) {
++				dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
++				dev->raw_io_interface = 1;
++			} else if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM)) {
++				dev->comm_interface = AAC_COMM_MESSAGE;
++				dev->raw_io_interface = 1;
++			}
++		}
+ 		if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
+ 		    (status[2] > dev->base_size)) {
+ 			aac_adapter_ioremap(dev, 0);
+@@ -350,10 +380,12 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
+ 		 *	status[3] & 0xFFFF	maximum number FIBs outstanding
+ 		 */
+ 		host->max_sectors = (status[1] >> 16) << 1;
+-		dev->max_fib_size = status[1] & 0xFFFF;
++		/* Multiple of 32 for PMC */
++		dev->max_fib_size = status[1] & 0xFFE0;
+ 		host->sg_tablesize = status[2] >> 16;
+ 		dev->sg_tablesize = status[2] & 0xFFFF;
+ 		host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB;
++		dev->max_num_aif = status[4] & 0xFFFF;
+ 		/*
+ 		 *	NOTE:
+ 		 *	All these overrides are based on a fixed internal
+diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
+index 060ac4b..dd7ad3b 100644
+--- a/drivers/scsi/aacraid/commsup.c
++++ b/drivers/scsi/aacraid/commsup.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -63,9 +64,11 @@ static int fib_map_alloc(struct aac_dev *dev)
+ 	  "allocate hardware fibs pci_alloc_consistent(%p, %d * (%d + %d), %p)\n",
+ 	  dev->pdev, dev->max_fib_size, dev->scsi_host_ptr->can_queue,
+ 	  AAC_NUM_MGT_FIB, &dev->hw_fib_pa));
+-	if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, dev->max_fib_size
+-	  * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
+-	  &dev->hw_fib_pa))==NULL)
++	dev->hw_fib_va = pci_alloc_consistent(dev->pdev,
++		(dev->max_fib_size + sizeof(struct aac_fib_xporthdr))
++		* (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) + (ALIGN32 - 1),
++		&dev->hw_fib_pa);
++	if (dev->hw_fib_va == NULL)
+ 		return -ENOMEM;
+ 	return 0;
+ }
+@@ -110,9 +113,22 @@ int aac_fib_setup(struct aac_dev * dev)
+ 	if (i<0)
+ 		return -ENOMEM;
+ 
++	/* 32 byte alignment for PMC */
++	hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1);
++	dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va +
++		(hw_fib_pa - dev->hw_fib_pa));
++	dev->hw_fib_pa = hw_fib_pa;
++	memset(dev->hw_fib_va, 0,
++		(dev->max_fib_size + sizeof(struct aac_fib_xporthdr)) *
++		(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
++
++	/* add Xport header */
++	dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va +
++		sizeof(struct aac_fib_xporthdr));
++	dev->hw_fib_pa += sizeof(struct aac_fib_xporthdr);
++
+ 	hw_fib = dev->hw_fib_va;
+ 	hw_fib_pa = dev->hw_fib_pa;
+-	memset(hw_fib, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
+ 	/*
+ 	 *	Initialise the fibs
+ 	 */
+@@ -129,8 +145,10 @@ int aac_fib_setup(struct aac_dev * dev)
+ 		hw_fib->header.XferState = cpu_to_le32(0xffffffff);
+ 		hw_fib->header.SenderSize = cpu_to_le16(dev->max_fib_size);
+ 		fibptr->hw_fib_pa = hw_fib_pa;
+-		hw_fib = (struct hw_fib *)((unsigned char *)hw_fib + dev->max_fib_size);
+-		hw_fib_pa = hw_fib_pa + dev->max_fib_size;
++		hw_fib = (struct hw_fib *)((unsigned char *)hw_fib +
++			dev->max_fib_size + sizeof(struct aac_fib_xporthdr));
++		hw_fib_pa = hw_fib_pa +
++			dev->max_fib_size + sizeof(struct aac_fib_xporthdr);
+ 	}
+ 	/*
+ 	 *	Add the fib chain to the free list
+@@ -664,9 +682,14 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
+ 	unsigned long nointr = 0;
+ 	unsigned long qflags;
+ 
++	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) {
++		kfree(hw_fib);
++		return 0;
++	}
++
+ 	if (hw_fib->header.XferState == 0) {
+ 		if (dev->comm_interface == AAC_COMM_MESSAGE)
+-			kfree (hw_fib);
++			kfree(hw_fib);
+ 		return 0;
+ 	}
+ 	/*
+@@ -674,7 +697,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
+ 	 */
+ 	if (hw_fib->header.StructType != FIB_MAGIC) {
+ 		if (dev->comm_interface == AAC_COMM_MESSAGE)
+-			kfree (hw_fib);
++			kfree(hw_fib);
+ 		return -EINVAL;
+ 	}
+ 	/*
+diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c
+index 9c7408fe..f0c66a8 100644
+--- a/drivers/scsi/aacraid/dpcsup.c
++++ b/drivers/scsi/aacraid/dpcsup.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -228,6 +229,48 @@ unsigned int aac_command_normal(struct aac_queue *q)
+ 	return 0;
+ }
+ 
++/*
++ *
++ * aac_aif_callback
++ * @context: the context set in the fib - here it is scsi cmd
++ * @fibptr: pointer to the fib
++ *
++ * Handles the AIFs - new method (SRC)
++ *
++ */
++
++static void aac_aif_callback(void *context, struct fib * fibptr)
++{
++	struct fib *fibctx;
++	struct aac_dev *dev;
++	struct aac_aifcmd *cmd;
++	int status;
++
++	fibctx = (struct fib *)context;
++	BUG_ON(fibptr == NULL);
++	dev = fibptr->dev;
++
++	if (fibptr->hw_fib_va->header.XferState &
++	    cpu_to_le32(NoMoreAifDataAvailable)) {
++		aac_fib_complete(fibptr);
++		aac_fib_free(fibptr);
++		return;
++	}
++
++	aac_intr_normal(dev, 0, 1, 0, fibptr->hw_fib_va);
++
++	aac_fib_init(fibctx);
++	cmd = (struct aac_aifcmd *) fib_data(fibctx);
++	cmd->command = cpu_to_le32(AifReqEvent);
++
++	status = aac_fib_send(AifRequest,
++		fibctx,
++		sizeof(struct hw_fib)-sizeof(struct aac_fibhdr),
++		FsaNormal,
++		0, 1,
++		(fib_callback)aac_aif_callback, fibctx);
++}
++
+ 
+ /**
+  *	aac_intr_normal	-	Handle command replies
+@@ -230,17 +273,16 @@
+  *	all QE there are and wake up all the waiters before exiting.
+  */
+ 
+-unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
++unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
++		int isAif, int isFastResponse, struct hw_fib *aif_fib)
+ {
+ 	dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index));
+-	if ((index & 0x00000002L)) {
++	if (isAif == 1) { /* AIF - common */
+ 		struct hw_fib * hw_fib;
+ 		struct fib * fib;
+ 		struct aac_queue *q = &dev->queues->queue[HostNormCmdQueue];
+ 		unsigned long flags;
+ 
+-		if (index == 0xFFFFFFFEL) /* Special Case */
+-			return 0;	  /* Do nothing */
+ 		/*
+ 		 *	Allocate a FIB. For non queued stuff we can just use
+ 		 * the stack so we are happy. We need a fib object in order to
+@@ -263,8 +304,13 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
+ 			kfree (fib);
+ 			return 1;
+ 		}
+-		memcpy(hw_fib, (struct hw_fib *)(((uintptr_t)(dev->regs.sa)) +
+-		  (index & ~0x00000002L)), sizeof(struct hw_fib));
++		if (aif_fib != NULL) {
++			memcpy(hw_fib, aif_fib, sizeof(struct hw_fib));
++		} else {
++			memcpy(hw_fib,
++				(struct hw_fib *)(((uintptr_t)(dev->regs.sa)) +
++				index), sizeof(struct hw_fib));
++		}
+ 		INIT_LIST_HEAD(&fib->fiblink);
+ 		fib->type = FSAFS_NTC_FIB_CONTEXT;
+ 		fib->size = sizeof(struct fib);
+@@ -277,9 +323,26 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
+ 	        wake_up_interruptible(&q->cmdready);
+ 		spin_unlock_irqrestore(q->lock, flags);
+ 		return 1;
++	} else if (isAif == 2) {	/* AIF - new (SRC) */
++		struct fib *fibctx;
++		struct aac_aifcmd *cmd;
++
++		fibctx = aac_fib_alloc(dev);
++		if (!fibctx)
++			return 1;
++		aac_fib_init(fibctx);
++
++		cmd = (struct aac_aifcmd *) fib_data(fibctx);
++		cmd->command = cpu_to_le32(AifReqEvent);
++
++		return aac_fib_send(AifRequest,
++			fibctx,
++			sizeof(struct hw_fib)-sizeof(struct aac_fibhdr),
++			FsaNormal,
++			0, 1,
++			(fib_callback)aac_aif_callback, fibctx);
+ 	} else {
+-		int fast = index & 0x01;
+-		struct fib * fib = &dev->fibs[index >> 2];
++		struct fib *fib = &dev->fibs[index];
+ 		struct hw_fib * hwfib = fib->hw_fib_va;
+ 
+ 		/*
+@@ -298,7 +361,7 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
+ 			return 0;
+ 		}
+ 
+-		if (fast) {
++		if (isFastResponse) {
+ 			/*
+ 			 *	Doctor the fib
+ 			 */
+diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
+index 2c93d94..4ff2652 100644
+--- a/drivers/scsi/aacraid/linit.c
++++ b/drivers/scsi/aacraid/linit.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -54,7 +55,7 @@
+ 
+ #include "aacraid.h"
+ 
+-#define AAC_DRIVER_VERSION		"1.1-5"
++#define AAC_DRIVER_VERSION		"1.1-7"
+ #ifndef AAC_DRIVER_BRANCH
+ #define AAC_DRIVER_BRANCH		""
+ #endif
+@@ -161,6 +162,7 @@ static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
+ 	{ 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */
+ 	{ 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */
+ 	{ 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */
++	{ 0x9005, 0x028b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 62 }, /* Adaptec PMC Catch All */
+ 	{ 0,}
+ };
+ MODULE_DEVICE_TABLE(pci, aac_pci_tbl);
+@@ -235,7 +237,8 @@ static struct aac_driver_ident aac_drivers[] = {
+ 	{ aac_rx_init, "aacraid",  "Legend  ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend Catchall */
+ 	{ aac_rx_init, "aacraid",  "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Catch All */
+ 	{ aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Rocket Catch All */
+-	{ aac_nark_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec NEMER/ARK Catch All */
++	{ aac_nark_init, "aacraid", "ADAPTEC ", "RAID           ", 2 }, /* Adaptec NEMER/ARK Catch All */
++	{ aac_src_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec PMC Catch All */
+ };
+ 
+ /**
+@@ -653,8 +656,10 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
+ 	 * This adapter needs a blind reset, only do so for Adapters that
+ 	 * support a register, instead of a commanded, reset.
+ 	 */
+-	if ((aac->supplement_adapter_info.SupportedOptions2 &
+-	   AAC_OPTION_MU_RESET) &&
++	if (((aac->supplement_adapter_info.SupportedOptions2 &
++	  AAC_OPTION_MU_RESET) ||
++	  (aac->supplement_adapter_info.SupportedOptions2 &
++	  AAC_OPTION_DOORBELL_RESET)) &&
+ 	  aac_check_reset &&
+ 	  ((aac_check_reset != 1) ||
+ 	   !(aac->supplement_adapter_info.SupportedOptions2 &
+diff --git a/drivers/scsi/aacraid/nark.c b/drivers/scsi/aacraid/nark.c
+index c55f7c8..f397d21 100644
+--- a/drivers/scsi/aacraid/nark.c
++++ b/drivers/scsi/aacraid/nark.c
+@@ -4,7 +4,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2006-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c
+index 16d8db5..be44de9 100644
+--- a/drivers/scsi/aacraid/rkt.c
++++ b/drivers/scsi/aacraid/rkt.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
+index 84d77fd..ce530f1 100644
+--- a/drivers/scsi/aacraid/rx.c
++++ b/drivers/scsi/aacraid/rx.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -84,15 +85,35 @@ static irqreturn_t aac_rx_intr_producer(int irq, void *dev_id)
+ 
+ static irqreturn_t aac_rx_intr_message(int irq, void *dev_id)
+ {
++	int isAif, isFastResponse, isSpecial;
+ 	struct aac_dev *dev = dev_id;
+ 	u32 Index = rx_readl(dev, MUnit.OutboundQueue);
+ 	if (unlikely(Index == 0xFFFFFFFFL))
+ 		Index = rx_readl(dev, MUnit.OutboundQueue);
+ 	if (likely(Index != 0xFFFFFFFFL)) {
+ 		do {
+-			if (unlikely(aac_intr_normal(dev, Index))) {
+-				rx_writel(dev, MUnit.OutboundQueue, Index);
+-				rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespReady);
++			isAif = isFastResponse = isSpecial = 0;
++			if (Index & 0x00000002L) {
++				isAif = 1;
++				if (Index == 0xFFFFFFFEL)
++					isSpecial = 1;
++				Index &= ~0x00000002L;
++			} else {
++				if (Index & 0x00000001L)
++					isFastResponse = 1;
++				Index >>= 2;
++			}
++			if (!isSpecial) {
++				if (unlikely(aac_intr_normal(dev,
++						Index, isAif,
++						isFastResponse, NULL))) {
++					rx_writel(dev,
++						MUnit.OutboundQueue,
++						Index);
++					rx_writel(dev,
++						MUnit.ODR,
++						DoorBellAdapterNormRespReady);
++				}
+ 			}
+ 			Index = rx_readl(dev, MUnit.OutboundQueue);
+ 		} while (Index != 0xFFFFFFFFL);
+@@ -631,6 +652,10 @@ int _aac_rx_init(struct aac_dev *dev)
+ 			name, instance);
+ 		goto error_iounmap;
+ 	}
++	dev->dbg_base = dev->scsi_host_ptr->base;
++	dev->dbg_base_mapped = dev->base;
++	dev->dbg_size = dev->base_size;
++
+ 	aac_adapter_enable_int(dev);
+ 	/*
+ 	 *	Tell the adapter that all is configured, and it can
+diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
+index 622c21c..e5d4457 100644
+--- a/drivers/scsi/aacraid/sa.c
++++ b/drivers/scsi/aacraid/sa.c
+@@ -5,7 +5,8 @@
+  * based on the old aacraid driver that is..
+  * Adaptec aacraid device driver for Linux.
+  *
+- * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid at adaptec.com)
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -391,6 +392,10 @@ int aac_sa_init(struct aac_dev *dev)
+ 			name, instance);
+ 		goto error_iounmap;
+ 	}
++	dev->dbg_base = dev->scsi_host_ptr->base;
++	dev->dbg_base_mapped = dev->base;
++	dev->dbg_size = dev->base_size;
++
+ 	aac_adapter_enable_int(dev);
+ 
+ 	/*
+diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
+new file mode 100644
+index 0000000..c204946
+--- /dev/null
++++ b/drivers/scsi/aacraid/src.c
+@@ -0,0 +1,594 @@
++/*
++ *	Adaptec AAC series RAID controller driver
++ *	(c) Copyright 2001 Red Hat Inc.
++ *
++ * based on the old aacraid driver that is..
++ * Adaptec aacraid device driver for Linux.
++ *
++ * Copyright (c) 2000-2010 Adaptec, Inc.
++ *               2010 PMC-Sierra, Inc. (aacraid at pmc-sierra.com)
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; see the file COPYING.  If not, write to
++ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Module Name:
++ *  src.c
++ *
++ * Abstract: Hardware Device Interface for PMC SRC based controllers
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/pci.h>
++#include <linux/spinlock.h>
++#include <linux/slab.h>
++#include <linux/blkdev.h>
++#include <linux/delay.h>
++#include <linux/version.h>
++#include <linux/completion.h>
++#include <linux/time.h>
++#include <linux/interrupt.h>
++#include <scsi/scsi_host.h>
++
++#include "aacraid.h"
++
++static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
++{
++	struct aac_dev *dev = dev_id;
++	unsigned long bellbits, bellbits_shifted;
++	int our_interrupt = 0;
++	int isFastResponse;
++	u32 index, handle;
++
++	bellbits = src_readl(dev, MUnit.ODR_R);
++	if (bellbits & PmDoorBellResponseSent) {
++		bellbits = PmDoorBellResponseSent;
++		/* handle async. status */
++		our_interrupt = 1;
++		index = dev->host_rrq_idx;
++		if (dev->host_rrq[index] == 0) {
++			u32 old_index = index;
++			/* adjust index */
++			do {
++				index++;
++				if (index == dev->scsi_host_ptr->can_queue +
++							AAC_NUM_MGT_FIB)
++					index = 0;
++				if (dev->host_rrq[index] != 0)
++					break;
++			} while (index != old_index);
++			dev->host_rrq_idx = index;
++		}
++		for (;;) {
++			isFastResponse = 0;
++			/* remove toggle bit (31) */
++			handle = (dev->host_rrq[index] & 0x7fffffff);
++			/* check fast response bit (30) */
++			if (handle & 0x40000000)
++				isFastResponse = 1;
++			handle &= 0x0000ffff;
++			if (handle == 0)
++				break;
++
++			aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
++
++			dev->host_rrq[index++] = 0;
++			if (index == dev->scsi_host_ptr->can_queue +
++						AAC_NUM_MGT_FIB)
++				index = 0;
++			dev->host_rrq_idx = index;
++		}
++	} else {
++		bellbits_shifted = (bellbits >> SRC_ODR_SHIFT);
++		if (bellbits_shifted & DoorBellAifPending) {
++			our_interrupt = 1;
++			/* handle AIF */
++			aac_intr_normal(dev, 0, 2, 0, NULL);
++		}
++	}
++
++	if (our_interrupt) {
++		src_writel(dev, MUnit.ODR_C, bellbits);
++		return IRQ_HANDLED;
++	}
++	return IRQ_NONE;
++}
++
++/**
++ *	aac_src_disable_interrupt	-	Disable interrupts
++ *	@dev: Adapter
++ */
++
++static void aac_src_disable_interrupt(struct aac_dev *dev)
++{
++	src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
++}
++
++/**
++ *	aac_src_enable_interrupt_message	-	Enable interrupts
++ *	@dev: Adapter
++ */
++
++static void aac_src_enable_interrupt_message(struct aac_dev *dev)
++{
++	src_writel(dev, MUnit.OIMR, dev->OIMR = 0xfffffff8);
++}
++
++/**
++ *	src_sync_cmd	-	send a command and wait
++ *	@dev: Adapter
++ *	@command: Command to execute
++ *	@p1: first parameter
++ *	@ret: adapter status
++ *
++ *	This routine will send a synchronous command to the adapter and wait
++ *	for its	completion.
++ */
++
++static int src_sync_cmd(struct aac_dev *dev, u32 command,
++	u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
++	u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
++{
++	unsigned long start;
++	int ok;
++
++	/*
++	 *	Write the command into Mailbox 0
++	 */
++	writel(command, &dev->IndexRegs->Mailbox[0]);
++	/*
++	 *	Write the parameters into Mailboxes 1 - 6
++	 */
++	writel(p1, &dev->IndexRegs->Mailbox[1]);
++	writel(p2, &dev->IndexRegs->Mailbox[2]);
++	writel(p3, &dev->IndexRegs->Mailbox[3]);
++	writel(p4, &dev->IndexRegs->Mailbox[4]);
++
++	/*
++	 *	Clear the synch command doorbell to start on a clean slate.
++	 */
++	src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
++
++	/*
++	 *	Disable doorbell interrupts
++	 */
++	src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
++
++	/*
++	 *	Force the completion of the mask register write before issuing
++	 *	the interrupt.
++	 */
++	src_readl(dev, MUnit.OIMR);
++
++	/*
++	 *	Signal that there is a new synch command
++	 */
++	src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
++
++	ok = 0;
++	start = jiffies;
++
++	/*
++	 *	Wait up to 30 seconds
++	 */
++	while (time_before(jiffies, start+30*HZ)) {
++		/* Delay 5 microseconds to let Mon960 get info. */
++		udelay(5);
++
++		/* Mon960 will set doorbell0 bit
++		 * when it has completed the command
++		 */
++		if ((src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT) & OUTBOUNDDOORBELL_0) {
++			/* Clear the doorbell */
++			src_writel(dev,
++				MUnit.ODR_C,
++				OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
++			ok = 1;
++			break;
++		}
++
++		 /* Yield the processor in case we are slow */
++		msleep(1);
++	}
++	if (unlikely(ok != 1)) {
++		 /* Restore interrupt mask even though we timed out */
++		aac_adapter_enable_int(dev);
++		return -ETIMEDOUT;
++	}
++
++	 /* Pull the synch status from Mailbox 0 */
++	if (status)
++		*status = readl(&dev->IndexRegs->Mailbox[0]);
++	if (r1)
++		*r1 = readl(&dev->IndexRegs->Mailbox[1]);
++	if (r2)
++		*r2 = readl(&dev->IndexRegs->Mailbox[2]);
++	if (r3)
++		*r3 = readl(&dev->IndexRegs->Mailbox[3]);
++	if (r4)
++		*r4 = readl(&dev->IndexRegs->Mailbox[4]);
++
++	 /* Clear the synch command doorbell */
++	src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
++
++	 /* Restore interrupt mask */
++	aac_adapter_enable_int(dev);
++	return 0;
++
++}
++
++/**
++ *	aac_src_interrupt_adapter	-	interrupt adapter
++ *	@dev: Adapter
++ *
++ *	Send an interrupt to the i960 and breakpoint it.
++ */
++
++static void aac_src_interrupt_adapter(struct aac_dev *dev)
++{
++	src_sync_cmd(dev, BREAKPOINT_REQUEST,
++		0, 0, 0, 0, 0, 0,
++		NULL, NULL, NULL, NULL, NULL);
++}
++
++/**
++ *	aac_src_notify_adapter		-	send an event to the adapter
++ *	@dev: Adapter
++ *	@event: Event to send
++ *
++ *	Notify the i960 that something it probably cares about has
++ *	happened.
++ */
++
++static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
++{
++	switch (event) {
++
++	case AdapNormCmdQue:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_1 << SRC_ODR_SHIFT);
++		break;
++	case HostNormRespNotFull:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_4 << SRC_ODR_SHIFT);
++		break;
++	case AdapNormRespQue:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_2 << SRC_ODR_SHIFT);
++		break;
++	case HostNormCmdNotFull:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_3 << SRC_ODR_SHIFT);
++		break;
++	case FastIo:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_6 << SRC_ODR_SHIFT);
++		break;
++	case AdapPrintfDone:
++		src_writel(dev, MUnit.ODR_C,
++			INBOUNDDOORBELL_5 << SRC_ODR_SHIFT);
++		break;
++	default:
++		BUG();
++		break;
++	}
++}
++
++/**
++ *	aac_src_start_adapter		-	activate adapter
++ *	@dev:	Adapter
++ *
++ *	Start up processing on an i960 based AAC adapter
++ */
++
++static void aac_src_start_adapter(struct aac_dev *dev)
++{
++	struct aac_init *init;
++
++	init = dev->init;
++	init->HostElapsedSeconds = cpu_to_le32(get_seconds());
++
++	/* We can only use a 32 bit address here */
++	src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
++	  0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
++}
++
++/**
++ *	aac_src_check_health
++ *	@dev: device to check if healthy
++ *
++ *	Will attempt to determine if the specified adapter is alive and
++ *	capable of handling requests, returning 0 if alive.
++ */
++static int aac_src_check_health(struct aac_dev *dev)
++{
++	u32 status = src_readl(dev, MUnit.OMR);
++
++	/*
++	 *	Check to see if the board failed any self tests.
++	 */
++	if (unlikely(status & SELF_TEST_FAILED))
++		return -1;
++
++	/*
++	 *	Check to see if the board panic'd.
++	 */
++	if (unlikely(status & KERNEL_PANIC))
++		return (status >> 16) & 0xFF;
++	/*
++	 *	Wait for the adapter to be up and running.
++	 */
++	if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
++		return -3;
++	/*
++	 *	Everything is OK
++	 */
++	return 0;
++}
++
++/**
++ *	aac_src_deliver_message
++ *	@fib: fib to issue
++ *
++ *	Will send a fib, returning 0 if successful.
++ */
++static int aac_src_deliver_message(struct fib *fib)
++{
++	struct aac_dev *dev = fib->dev;
++	struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
++	unsigned long qflags;
++	u32 fibsize;
++	u64 address;
++	struct aac_fib_xporthdr *pFibX;
++
++	spin_lock_irqsave(q->lock, qflags);
++	q->numpending++;
++	spin_unlock_irqrestore(q->lock, qflags);
++
++	/* Calculate the amount to the fibsize bits */
++	fibsize = (sizeof(struct aac_fib_xporthdr) +
++		fib->hw_fib_va->header.Size + 127) / 128 - 1;
++	if (fibsize > (ALIGN32 - 1))
++		fibsize = ALIGN32 - 1;
++
++    /* Fill XPORT header */
++	pFibX = (struct aac_fib_xporthdr *)
++		((unsigned char *)fib->hw_fib_va -
++		sizeof(struct aac_fib_xporthdr));
++	pFibX->Handle = fib->hw_fib_va->header.SenderData + 1;
++	pFibX->HostAddress = fib->hw_fib_pa;
++	pFibX->Size = fib->hw_fib_va->header.Size;
++	address = fib->hw_fib_pa - (u64)sizeof(struct aac_fib_xporthdr);
++
++	src_writel(dev, MUnit.IQ_H, (u32)(address >> 32));
++	src_writel(dev, MUnit.IQ_L, (u32)(address & 0xffffffff) + fibsize);
++	return 0;
++}
++
++/**
++ *	aac_src_ioremap
++ *	@size: mapping resize request
++ *
++ */
++static int aac_src_ioremap(struct aac_dev *dev, u32 size)
++{
++	if (!size) {
++		iounmap(dev->regs.src.bar0);
++		dev->regs.src.bar0 = NULL;
++		iounmap(dev->base);
++		dev->base = NULL;
++		return 0;
++	}
++	dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
++		AAC_MIN_SRC_BAR1_SIZE);
++	dev->base = NULL;
++	if (dev->regs.src.bar1 == NULL)
++		return -1;
++	dev->base = dev->regs.src.bar0 = ioremap(dev->scsi_host_ptr->base,
++				size);
++	if (dev->base == NULL) {
++		iounmap(dev->regs.src.bar1);
++		dev->regs.src.bar1 = NULL;
++		return -1;
++	}
++	dev->IndexRegs = &((struct src_registers __iomem *)
++		dev->base)->IndexRegs;
++	return 0;
++}
++
++static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
++{
++	u32 var, reset_mask;
++
++	if (bled >= 0) {
++		if (bled)
++			printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n",
++				dev->name, dev->id, bled);
++		bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
++			0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
++			if (bled || (var != 0x00000001))
++				bled = -EINVAL;
++		if (dev->supplement_adapter_info.SupportedOptions2 &
++			AAC_OPTION_DOORBELL_RESET) {
++			src_writel(dev, MUnit.IDR, reset_mask);
++			msleep(5000); /* Delay 5 seconds */
++		}
++	}
++
++	if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
++		return -ENODEV;
++
++	if (startup_timeout < 300)
++		startup_timeout = 300;
++
++	return 0;
++}
++
++/**
++ *	aac_src_select_comm	-	Select communications method
++ *	@dev: Adapter
++ *	@comm: communications method
++ */
++int aac_src_select_comm(struct aac_dev *dev, int comm)
++{
++	switch (comm) {
++	case AAC_COMM_MESSAGE:
++		dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
++		dev->a_ops.adapter_intr = aac_src_intr_message;
++		dev->a_ops.adapter_deliver = aac_src_deliver_message;
++		break;
++	default:
++		return 1;
++	}
++	return 0;
++}
++
++/**
++ *  aac_src_init	-	initialize an Cardinal Frey Bar card
++ *  @dev: device to configure
++ *
++ */
++
++int aac_src_init(struct aac_dev *dev)
++{
++	unsigned long start;
++	unsigned long status;
++	int restart = 0;
++	int instance = dev->id;
++	const char *name = dev->name;
++
++	dev->a_ops.adapter_ioremap = aac_src_ioremap;
++	dev->a_ops.adapter_comm = aac_src_select_comm;
++
++	dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
++	if (aac_adapter_ioremap(dev, dev->base_size)) {
++		printk(KERN_WARNING "%s: unable to map adapter.\n", name);
++		goto error_iounmap;
++	}
++
++	/* Failure to reset here is an option ... */
++	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
++	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
++	if ((aac_reset_devices || reset_devices) &&
++		!aac_src_restart_adapter(dev, 0))
++		++restart;
++	/*
++	 *	Check to see if the board panic'd while booting.
++	 */
++	status = src_readl(dev, MUnit.OMR);
++	if (status & KERNEL_PANIC) {
++		if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
++			goto error_iounmap;
++		++restart;
++	}
++	/*
++	 *	Check to see if the board failed any self tests.
++	 */
++	status = src_readl(dev, MUnit.OMR);
++	if (status & SELF_TEST_FAILED) {
++		printk(KERN_ERR "%s%d: adapter self-test failed.\n",
++			dev->name, instance);
++		goto error_iounmap;
++	}
++	/*
++	 *	Check to see if the monitor panic'd while booting.
++	 */
++	if (status & MONITOR_PANIC) {
++		printk(KERN_ERR "%s%d: adapter monitor panic.\n",
++			dev->name, instance);
++		goto error_iounmap;
++	}
++	start = jiffies;
++	/*
++	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
++	 */
++	while (!((status = src_readl(dev, MUnit.OMR)) &
++		KERNEL_UP_AND_RUNNING)) {
++		if ((restart &&
++		  (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
++		  time_after(jiffies, start+HZ*startup_timeout)) {
++			printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
++					dev->name, instance, status);
++			goto error_iounmap;
++		}
++		if (!restart &&
++		  ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
++		  time_after(jiffies, start + HZ *
++		  ((startup_timeout > 60)
++		    ? (startup_timeout - 60)
++		    : (startup_timeout / 2))))) {
++			if (likely(!aac_src_restart_adapter(dev,
++			    aac_src_check_health(dev))))
++				start = jiffies;
++			++restart;
++		}
++		msleep(1);
++	}
++	if (restart && aac_commit)
++		aac_commit = 1;
++	/*
++	 *	Fill in the common function dispatch table.
++	 */
++	dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
++	dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
++	dev->a_ops.adapter_notify = aac_src_notify_adapter;
++	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
++	dev->a_ops.adapter_check_health = aac_src_check_health;
++	dev->a_ops.adapter_restart = aac_src_restart_adapter;
++
++	/*
++	 *	First clear out all interrupts.  Then enable the one's that we
++	 *	can handle.
++	 */
++	aac_adapter_comm(dev, AAC_COMM_MESSAGE);
++	aac_adapter_disable_int(dev);
++	src_writel(dev, MUnit.ODR_C, 0xffffffff);
++	aac_adapter_enable_int(dev);
++
++	if (aac_init_adapter(dev) == NULL)
++		goto error_iounmap;
++	if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
++		goto error_iounmap;
++
++	dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
++
++	if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
++			IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
++
++		if (dev->msi)
++			pci_disable_msi(dev->pdev);
++
++		printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
++			name, instance);
++		goto error_iounmap;
++	}
++	dev->dbg_base = pci_resource_start(dev->pdev, 2);
++	dev->dbg_base_mapped = dev->regs.src.bar1;
++	dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
++
++	aac_adapter_enable_int(dev);
++	/*
++	 *	Tell the adapter that all is configured, and it can
++	 * start accepting requests
++	 */
++	aac_src_start_adapter(dev);
++
++	return 0;
++
++error_iounmap:
++
++	return -1;
++}

Deleted: pve-kernel-2.6.32-rh/trunk/aacraid_source_1.1.7-28000.tgz
===================================================================
(Binary files differ)

Deleted: pve-kernel-2.6.32-rh/trunk/applydebpatches.pl
===================================================================
--- pve-kernel-2.6.32-rh/trunk/applydebpatches.pl	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/applydebpatches.pl	2011-06-24 10:35:51 UTC (rev 6156)
@@ -1,77 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use File::Path;
-
-my $dir = shift || die "no directory specified";
-my $debrev = shift || die "no revision specified";
-
-my $base =  "$dir/debian/patches";
-
-my @revisions = qw(orig base);
-
-
-for (my $i = 1; $i <= $debrev; $i++) { push @revisions, $i; }
-
-sub exec_script {
-    my ($path) = @_; 
-    
-    open(EXE, "<$path") || die "can't open '$path'";
-    while(defined(my $line = <EXE>)) {
-	if ($line =~ m/^rm\s(\S+)\s*$/) {
-	    my $fn = "$dir/$1";
-	    rmtree $fn if -e $fn;
-	} else { 
-	    die "EXEX failed: $line";
-	}
-    }
-    close(EXE);
-}
-
-sub apply_patch {
-    my ($path, $featureset, $opts) = @_;
-
-    die "no such file '$path'" if ! -f $path;
-
-    if ($featureset) {
-	#return if $featureset eq 'xen';
-	#return if $featureset eq 'vserver';
-	return if $featureset ne 'openvz';
-    }
-
-    print "apply $path $opts\n";
-
-    system ("cat $path|patch -d $dir $opts -p1 -f -s -t --no-backup-if-mismatch") == 0 ||
-	die "apply patch $path failed\n";
-
-}    
-
-sub try_apply_series {
-    my ($path) = @_;
-
-    return if ! -f $path;
-   
-    open(TMP, "<$path") || die "can't open '$path'";
-    while(defined(my $line = <TMP>)) {
-	next if $line =~m/^\s*$/;
-	next if $line =~m/^#/;
-	if ($line =~ m/^([+-])\s+(\S+)(\s+featureset=(\S+))?\s*$/) {
-	    apply_patch("$base/$2", $4, $1 eq '-' ? '-R' : '');
-	} elsif ($line =~ m/^X\s+(\S+)\s*$/) {
-	    exec_script("$base/$1");
-	} else {
-	    die "can't parse line: $line";
-	}
-    }
-    close(TMP);
-
-}
-
-foreach my $rev (@revisions) {
-    try_apply_series("$base/series/$rev");
-    try_apply_series("$base/series/${rev}squeeze1");
-}
-
-foreach my $rev (@revisions) {
-    try_apply_series("$base/series/$rev-extra");
-}

Modified: pve-kernel-2.6.32-rh/trunk/changelog.Debian
===================================================================
--- pve-kernel-2.6.32-rh/trunk/changelog.Debian	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/changelog.Debian	2011-06-24 10:35:51 UTC (rev 6156)
@@ -8,6 +8,8 @@
   
   * include ovz-fix-slow-fsync.patch
   
+  * removed SCST support
+  
  -- Proxmox Support Team <support at proxmox.com>  Fri, 24 Jun 2011 08:01:39 +0200
 
 pve-kernel-2.6.32 (2.6.32-35) unstable; urgency=low

Modified: pve-kernel-2.6.32-rh/trunk/config-2.6.32.diff
===================================================================
--- pve-kernel-2.6.32-rh/trunk/config-2.6.32.diff	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/config-2.6.32.diff	2011-06-24 10:35:51 UTC (rev 6156)
@@ -18,14 +18,6 @@
  # CONFIG_MODULE_SIG_FORCE is not set
  CONFIG_MODULE_VERIFY=y
  CONFIG_STOP_MACHINE=y
-@@ -602,6 +602,7 @@
- CONFIG_NET_KEY=m
- CONFIG_NET_KEY_MIGRATE=y
- CONFIG_INET=y
-+CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION=y
- CONFIG_IP_MULTICAST=y
- CONFIG_IP_ADVANCED_ROUTER=y
- CONFIG_ASK_IP_FIB_HASH=y
 @@ -1322,10 +1323,10 @@
  #
  # SCSI support type (disk, tape, CD-ROM)

Deleted: pve-kernel-2.6.32-rh/trunk/scst-disable-debug.diff
===================================================================
--- pve-kernel-2.6.32-rh/trunk/scst-disable-debug.diff	2011-06-24 09:46:10 UTC (rev 6155)
+++ pve-kernel-2.6.32-rh/trunk/scst-disable-debug.diff	2011-06-24 10:35:51 UTC (rev 6156)
@@ -1,22 +0,0 @@
---- scst/src/Makefile.org	2009-12-17 11:49:33.000000000 +0100
-+++ scst/src/Makefile	2009-12-17 11:51:03.000000000 +0100
-@@ -127,7 +127,7 @@
- 
- #EXTRA_CFLAGS += -DCONFIG_SCST_TRACING
- 
--EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG -g -fno-inline -fno-inline-functions
-+EXTRA_CFLAGS += -g -fno-inline -fno-inline-functions
- #EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG_TM -DCONFIG_SCST_TM_DBG_GO_OFFLINE
- #EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG_RETRY
- #EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG_OOM
---- scst/src/dev_handlers/Makefile.org	2009-12-17 12:40:58.000000000 +0100
-+++ scst/src/dev_handlers/Makefile	2009-12-17 12:41:09.000000000 +0100
-@@ -73,7 +73,7 @@
- EXTRA_CFLAGS += -DCONFIG_SCST_EXTRACHECKS
- 
- #EXTRA_CFLAGS += -DCONFIG_SCST_TRACING
--EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG -g -fno-inline -fno-inline-functions
-+EXTRA_CFLAGS += -g -fno-inline -fno-inline-functions
- 
- clean:
- 	rm -f *.o *.ko .*.cmd *.mod.c .*.d .depend Modules.symvers \

Deleted: pve-kernel-2.6.32-rh/trunk/scst-snap-21.12.09.tgz
===================================================================
(Binary files differ)



More information about the pve-devel mailing list