linux: Update to v4.2.1-openpower1

This brings in the 4.2.1 stable release, and the accraid RAID driver for
PMC-Sierra RAID  on Habanero.

The RAID driver is submitted upstream to the linux-scsi mailing list,
but is not yet in a tree.

The stable release brings in a few commits that are of interest to
OpenPower platforms:

 94d718d024e xfs: return errors from partial I/O failures to files
 2937b784b19 xfs: Fix file type directory corruption for btree directories
 95310b79776 libxfs: readahead of dir3 data blocks should use the read verifier
 0a3b19cef4f sched: Fix cpu_active_mask/cpu_online_mask race

Signed-off-by: Joel Stanley <joel@jms.id.au>
diff --git a/openpower/linux/linux-0001-powerpc-Add-openpower_defconfig.patch b/openpower/linux/linux-0001-powerpc-Add-openpower_defconfig.patch
index 51b51c3..970a6dc 100644
--- a/openpower/linux/linux-0001-powerpc-Add-openpower_defconfig.patch
+++ b/openpower/linux/linux-0001-powerpc-Add-openpower_defconfig.patch
@@ -1,24 +1,28 @@
-From 89cf6cbb22c46699151caf946856fd1f32412ef5 Mon Sep 17 00:00:00 2001
+From 359e321ac2e989d5a1b9810f3c1e54bc4971c331 Mon Sep 17 00:00:00 2001
 From: Jeremy Kerr <jk@ozlabs.org>
 Date: Fri, 12 Dec 2014 08:03:11 +0800
-Subject: [PATCH 1/9] powerpc: Add openpower_defconfig
+Subject: [PATCH 01/18] powerpc: Add openpower_defconfig
 
 Simplifies building an openpower kernel a little. It is based on the
 configuration used by the op-build openpower buildroot overlay.
 
 Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
 Signed-off-by: Joel Stanley <joel@jms.id.au>
+
+add accraid
+
+Signed-off-by: Joel Stanley <joel@jms.id.au>
 ---
- arch/powerpc/configs/openpower_defconfig | 216 +++++++++++++++++++++++++++++++
- 1 file changed, 216 insertions(+)
+ arch/powerpc/configs/openpower_defconfig | 217 +++++++++++++++++++++++++++++++
+ 1 file changed, 217 insertions(+)
  create mode 100644 arch/powerpc/configs/openpower_defconfig
 
 diff --git a/arch/powerpc/configs/openpower_defconfig b/arch/powerpc/configs/openpower_defconfig
 new file mode 100644
-index 0000000..314177e
+index 0000000..4d6779a
 --- /dev/null
 +++ b/arch/powerpc/configs/openpower_defconfig
-@@ -0,0 +1,216 @@
+@@ -0,0 +1,217 @@
 +CONFIG_PPC64=y
 +CONFIG_ALTIVEC=y
 +CONFIG_VSX=y
@@ -100,6 +104,7 @@
 +CONFIG_SCSI_CXGB4_ISCSI=y
 +CONFIG_SCSI_BNX2_ISCSI=y
 +CONFIG_BE2ISCSI=y
++CONFIG_SCSI_AACRAID=y
 +CONFIG_SCSI_MPT2SAS=y
 +CONFIG_SCSI_IBMVSCSI=y
 +CONFIG_SCSI_SYM53C8XX_2=y
diff --git a/openpower/linux/linux-0002-net-bnx2x-Add-shutdown-handler.patch b/openpower/linux/linux-0002-net-bnx2x-Add-shutdown-handler.patch
index a6dd2a0..8fbb009 100644
--- a/openpower/linux/linux-0002-net-bnx2x-Add-shutdown-handler.patch
+++ b/openpower/linux/linux-0002-net-bnx2x-Add-shutdown-handler.patch
@@ -1,7 +1,7 @@
-From 28d7a2c24daad8af0089c22ee2ea94ffa57a63ff Mon Sep 17 00:00:00 2001
+From 1f3e4395adc3b9f1d2ec088dd18e88a6fc89330d Mon Sep 17 00:00:00 2001
 From: Jeremy Kerr <jk@ozlabs.org>
 Date: Fri, 7 Mar 2014 10:17:22 +0800
-Subject: [PATCH 2/9] net/bnx2x: Add shutdown handler
+Subject: [PATCH 02/18] net/bnx2x: Add shutdown handler
 
 This change uses the existing .remove handler for device shutdown.
 
diff --git a/openpower/linux/linux-0003-xhci-do-not-halt-the-secondary-HCD.patch b/openpower/linux/linux-0003-xhci-do-not-halt-the-secondary-HCD.patch
index 586c97c..b8030c3 100644
--- a/openpower/linux/linux-0003-xhci-do-not-halt-the-secondary-HCD.patch
+++ b/openpower/linux/linux-0003-xhci-do-not-halt-the-secondary-HCD.patch
@@ -1,7 +1,7 @@
-From 4e2b4ad4e52739f9e57eb62fed48a61348d272dd Mon Sep 17 00:00:00 2001
+From a8538355237e20fe0a0b204ca67465350701f98c Mon Sep 17 00:00:00 2001
 From: Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com>
 Date: Mon, 10 Mar 2014 13:02:13 -0300
-Subject: [PATCH 3/9] xhci: do not halt the secondary HCD
+Subject: [PATCH 03/18] xhci: do not halt the secondary HCD
 
 We can't halt the secondary HCD, because it's also the primary HCD,
 which will cause problems if we have devices attached to the primary
diff --git a/openpower/linux/linux-0004-xhci-Use-xhci_pci_remove-for-xhci-device-shutdown.patch b/openpower/linux/linux-0004-xhci-Use-xhci_pci_remove-for-xhci-device-shutdown.patch
index ea566f0..687622e 100644
--- a/openpower/linux/linux-0004-xhci-Use-xhci_pci_remove-for-xhci-device-shutdown.patch
+++ b/openpower/linux/linux-0004-xhci-Use-xhci_pci_remove-for-xhci-device-shutdown.patch
@@ -1,7 +1,7 @@
-From 778e896031b1143c90d98f1675e1fbbc3edfc044 Mon Sep 17 00:00:00 2001
+From 179982a2b95c1151ecca72cbe3c74464d2852e10 Mon Sep 17 00:00:00 2001
 From: Thadeu Lima De Souza Cascardo <thadeul@br.ibm.com>
 Date: Tue, 25 Mar 2014 10:45:16 -0400
-Subject: [PATCH 4/9] xhci: Use xhci_pci_remove for xhci device shutdown
+Subject: [PATCH 04/18] xhci: Use xhci_pci_remove for xhci device shutdown
 
 Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
 Signed-off-by: Joel Stanley <joel@jms.id.au>
diff --git a/openpower/linux/linux-0005-drm-ast-Default-to-8bpp-on-big-endian.patch b/openpower/linux/linux-0005-drm-ast-Default-to-8bpp-on-big-endian.patch
index 70e0ffc..205e1f6 100644
--- a/openpower/linux/linux-0005-drm-ast-Default-to-8bpp-on-big-endian.patch
+++ b/openpower/linux/linux-0005-drm-ast-Default-to-8bpp-on-big-endian.patch
@@ -1,7 +1,7 @@
-From f830d515678686ba2975dca0eac47dbae77a63b3 Mon Sep 17 00:00:00 2001
+From bea892898f5fe11ac0c24404db59d3ade6981b9e Mon Sep 17 00:00:00 2001
 From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
 Date: Fri, 31 Oct 2014 15:06:38 +1100
-Subject: [PATCH 5/9] drm/ast: Default to 8bpp on big endian
+Subject: [PATCH 05/18] drm/ast: Default to 8bpp on big endian
 
 This chip is LE only (some versions support HW swappers but not
 the latest and the driver doesn't anyway).
diff --git a/openpower/linux/linux-0006-powerpc-kexec-Reset-secondary-cpu-endianess-before-k.patch b/openpower/linux/linux-0006-powerpc-kexec-Reset-secondary-cpu-endianess-before-k.patch
index 0381305..1754ea4 100644
--- a/openpower/linux/linux-0006-powerpc-kexec-Reset-secondary-cpu-endianess-before-k.patch
+++ b/openpower/linux/linux-0006-powerpc-kexec-Reset-secondary-cpu-endianess-before-k.patch
@@ -1,7 +1,8 @@
-From 301de197bdeefada57511b991f67a584e3ab2c43 Mon Sep 17 00:00:00 2001
+From 2d2ab23cbdbbb1907f1f34085c3904efe1979df0 Mon Sep 17 00:00:00 2001
 From: Samuel Mendoza-Jonas <sam.mj@au1.ibm.com>
 Date: Mon, 29 Jun 2015 13:43:51 +1000
-Subject: [PATCH 6/9] powerpc/kexec: Reset secondary cpu endianess before kexec
+Subject: [PATCH 06/18] powerpc/kexec: Reset secondary cpu endianess before
+ kexec
 
 If the target kernel does not inlcude the FIXUP_ENDIAN check, coming
 from a different-endian kernel will cause the target kernel to panic.
diff --git a/openpower/linux/linux-0007-powerpc-kexec-Reset-HILE-before-kexec_sequence.patch b/openpower/linux/linux-0007-powerpc-kexec-Reset-HILE-before-kexec_sequence.patch
index 3fc25ca..66f59b4 100644
--- a/openpower/linux/linux-0007-powerpc-kexec-Reset-HILE-before-kexec_sequence.patch
+++ b/openpower/linux/linux-0007-powerpc-kexec-Reset-HILE-before-kexec_sequence.patch
@@ -1,7 +1,7 @@
-From a198d8086077cb97afdb24658ef549717e6bdec7 Mon Sep 17 00:00:00 2001
+From b7d553c5fce6888aa29a19627b20d9f34d0aee57 Mon Sep 17 00:00:00 2001
 From: Samuel Mendoza-Jonas <sam.mj@au1.ibm.com>
 Date: Wed, 22 Jul 2015 11:09:15 +1000
-Subject: [PATCH 7/9] powerpc/kexec: Reset HILE before kexec_sequence
+Subject: [PATCH 07/18] powerpc/kexec: Reset HILE before kexec_sequence
 
 On powernv secondary cpus are returned to OPAL, and will then enter
 the target kernel in big-endian. However if it is set the HILE bit
diff --git a/openpower/linux/linux-0008-Revert-powerpc-Reject-binutils-2.24-when-building-li.patch b/openpower/linux/linux-0008-Revert-powerpc-Reject-binutils-2.24-when-building-li.patch
index c6fb8ed..5dda631 100644
--- a/openpower/linux/linux-0008-Revert-powerpc-Reject-binutils-2.24-when-building-li.patch
+++ b/openpower/linux/linux-0008-Revert-powerpc-Reject-binutils-2.24-when-building-li.patch
@@ -1,7 +1,7 @@
-From f738525309bdd1b85add503ddadea7968428f4d1 Mon Sep 17 00:00:00 2001
+From 6e423929667756362eec6155eb371843c6e65038 Mon Sep 17 00:00:00 2001
 From: Joel Stanley <joel@jms.id.au>
 Date: Fri, 11 Sep 2015 14:43:18 +0930
-Subject: [PATCH 8/9] Revert "powerpc: Reject binutils 2.24 when building
+Subject: [PATCH 08/18] Revert "powerpc: Reject binutils 2.24 when building
  little endian"
 
 This reverts commit 60e065f70bdb0b0e916389024922ad40f3270c96.
diff --git a/openpower/linux/linux-0009-aacraid-Fix-for-LD-name-and-UID-not-exposed-to-OS.patch b/openpower/linux/linux-0009-aacraid-Fix-for-LD-name-and-UID-not-exposed-to-OS.patch
new file mode 100644
index 0000000..e9950d5
--- /dev/null
+++ b/openpower/linux/linux-0009-aacraid-Fix-for-LD-name-and-UID-not-exposed-to-OS.patch
@@ -0,0 +1,41 @@
+From 317f2be52fd70c80cc5e421f08d6e229552d096c Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:33 -0400
+Subject: [PATCH 09/18] aacraid: Fix for LD name and UID not exposed to OS
+
+Driver sends the right size of the response buffer.
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aachba.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
+index 9b3dd6e..fe59b00 100644
+--- a/drivers/scsi/aacraid/aachba.c
++++ b/drivers/scsi/aacraid/aachba.c
+@@ -570,7 +570,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
+ 
+ 	status = aac_fib_send(ContainerCommand,
+ 		  cmd_fibcontext,
+-		  sizeof (struct aac_get_name),
++		  sizeof(struct aac_get_name_resp),
+ 		  FsaNormal,
+ 		  0, 1,
+ 		  (fib_callback)get_container_name_callback,
+@@ -1052,7 +1052,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
+ 
+ 	status = aac_fib_send(ContainerCommand,
+ 		  cmd_fibcontext,
+-		  sizeof (struct aac_get_serial),
++		  sizeof(struct aac_get_serial_resp),
+ 		  FsaNormal,
+ 		  0, 1,
+ 		  (fib_callback) get_container_serial_callback,
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0010-aacraid-Add-Power-Management-support.patch b/openpower/linux/linux-0010-aacraid-Add-Power-Management-support.patch
new file mode 100644
index 0000000..32e39f7
--- /dev/null
+++ b/openpower/linux/linux-0010-aacraid-Add-Power-Management-support.patch
@@ -0,0 +1,441 @@
+From b39c80fbb42cfca6766807c2f846c4d77dae0fa7 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:34 -0400
+Subject: [PATCH 10/18] aacraid: Add Power Management support
+
+* .suspend() and .resume() routines implemented in the driver
+* aac_release_resources() initiates firmware shutdown
+* aac_acquire_resources re-initializes the host interface
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aacraid.h  |   5 ++
+ drivers/scsi/aacraid/comminit.c | 154 ++++++++++++++++++++--------------------
+ drivers/scsi/aacraid/linit.c    | 147 ++++++++++++++++++++++++++++++++++++++
+ drivers/scsi/aacraid/rx.c       |   1 +
+ drivers/scsi/aacraid/sa.c       |   1 +
+ drivers/scsi/aacraid/src.c      |   2 +
+ 6 files changed, 232 insertions(+), 78 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index 40fe65c..62b0999 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -547,6 +547,7 @@ struct adapter_ops
+ 	int  (*adapter_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);
+ 	int  (*adapter_check_health)(struct aac_dev *dev);
+ 	int  (*adapter_restart)(struct aac_dev *dev, int bled);
++	void (*adapter_start)(struct aac_dev *dev);
+ 	/* Transport operations */
+ 	int  (*adapter_ioremap)(struct aac_dev * dev, u32 size);
+ 	irq_handler_t adapter_intr;
+@@ -1247,6 +1248,9 @@ struct aac_dev
+ #define aac_adapter_restart(dev,bled) \
+ 	(dev)->a_ops.adapter_restart(dev,bled)
+ 
++#define aac_adapter_start(dev) \
++	((dev)->a_ops.adapter_start(dev))
++
+ #define aac_adapter_ioremap(dev, size) \
+ 	(dev)->a_ops.adapter_ioremap(dev, size)
+ 
+@@ -2127,6 +2131,7 @@ int aac_sa_init(struct aac_dev *dev);
+ int aac_src_init(struct aac_dev *dev);
+ int aac_srcv_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);
++void aac_define_int_mode(struct aac_dev *dev);
+ 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,
+diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
+index 45db84a..45a0a04 100644
+--- a/drivers/scsi/aacraid/comminit.c
++++ b/drivers/scsi/aacraid/comminit.c
+@@ -43,8 +43,6 @@
+ 
+ #include "aacraid.h"
+ 
+-static void aac_define_int_mode(struct aac_dev *dev);
+-
+ struct aac_common aac_config = {
+ 	.irq_mod = 1
+ };
+@@ -338,6 +336,82 @@ static int aac_comm_init(struct aac_dev * dev)
+ 	return 0;
+ }
+ 
++void aac_define_int_mode(struct aac_dev *dev)
++{
++	int i, msi_count;
++
++	msi_count = i = 0;
++	/* max. vectors from GET_COMM_PREFERRED_SETTINGS */
++	if (dev->max_msix == 0 ||
++	    dev->pdev->device == PMC_DEVICE_S6 ||
++	    dev->sync_mode) {
++		dev->max_msix = 1;
++		dev->vector_cap =
++			dev->scsi_host_ptr->can_queue +
++			AAC_NUM_MGT_FIB;
++		return;
++	}
++
++	/* Don't bother allocating more MSI-X vectors than cpus */
++	msi_count = min(dev->max_msix,
++		(unsigned int)num_online_cpus());
++
++	dev->max_msix = msi_count;
++
++	if (msi_count > AAC_MAX_MSIX)
++		msi_count = AAC_MAX_MSIX;
++
++	for (i = 0; i < msi_count; i++)
++		dev->msixentry[i].entry = i;
++
++	if (msi_count > 1 &&
++	    pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) {
++		i = pci_enable_msix(dev->pdev,
++				    dev->msixentry,
++				    msi_count);
++		 /* Check how many MSIX vectors are allocated */
++		if (i >= 0) {
++			dev->msi_enabled = 1;
++			if (i) {
++				msi_count = i;
++				if (pci_enable_msix(dev->pdev,
++				    dev->msixentry,
++				    msi_count)) {
++					dev->msi_enabled = 0;
++					printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
++							dev->name, dev->id, i);
++				}
++			}
++		} else {
++			dev->msi_enabled = 0;
++			printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
++					dev->name, dev->id, i);
++		}
++	}
++
++	if (!dev->msi_enabled) {
++		msi_count = 1;
++		i = pci_enable_msi(dev->pdev);
++
++		if (!i) {
++			dev->msi_enabled = 1;
++			dev->msi = 1;
++		} else {
++			printk(KERN_ERR "%s%d: MSI not supported!! Will try INTx 0x%x.\n",
++					dev->name, dev->id, i);
++		}
++	}
++
++	if (!dev->msi_enabled)
++		dev->max_msix = msi_count = 1;
++	else {
++		if (dev->max_msix > msi_count)
++			dev->max_msix = msi_count;
++	}
++	dev->vector_cap =
++		(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) /
++		msi_count;
++}
+ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
+ {
+ 	u32 status[5];
+@@ -508,79 +582,3 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
+ 	return dev;
+ }
+ 
+-static void aac_define_int_mode(struct aac_dev *dev)
+-{
+-
+-	int i, msi_count;
+-
+-	msi_count = i = 0;
+-	/* max. vectors from GET_COMM_PREFERRED_SETTINGS */
+-	if (dev->max_msix == 0 ||
+-	    dev->pdev->device == PMC_DEVICE_S6 ||
+-	    dev->sync_mode) {
+-		dev->max_msix = 1;
+-		dev->vector_cap =
+-			dev->scsi_host_ptr->can_queue +
+-			AAC_NUM_MGT_FIB;
+-		return;
+-	}
+-
+-	msi_count = min(dev->max_msix,
+-		(unsigned int)num_online_cpus());
+-
+-	dev->max_msix = msi_count;
+-
+-	if (msi_count > AAC_MAX_MSIX)
+-		msi_count = AAC_MAX_MSIX;
+-
+-	for (i = 0; i < msi_count; i++)
+-		dev->msixentry[i].entry = i;
+-
+-	if (msi_count > 1 &&
+-	    pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) {
+-		i = pci_enable_msix(dev->pdev,
+-				    dev->msixentry,
+-				    msi_count);
+-		 /* Check how many MSIX vectors are allocated */
+-		if (i >= 0) {
+-			dev->msi_enabled = 1;
+-			if (i) {
+-				msi_count = i;
+-				if (pci_enable_msix(dev->pdev,
+-				    dev->msixentry,
+-				    msi_count)) {
+-					dev->msi_enabled = 0;
+-					printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
+-							dev->name, dev->id, i);
+-				}
+-			}
+-		} else {
+-			dev->msi_enabled = 0;
+-			printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
+-					dev->name, dev->id, i);
+-		}
+-	}
+-
+-	if (!dev->msi_enabled) {
+-		msi_count = 1;
+-		i = pci_enable_msi(dev->pdev);
+-
+-		if (!i) {
+-			dev->msi_enabled = 1;
+-			dev->msi = 1;
+-		} else {
+-			printk(KERN_ERR "%s%d: MSI not supported!! Will try INTx 0x%x.\n",
+-					dev->name, dev->id, i);
+-		}
+-	}
+-
+-	if (!dev->msi_enabled)
+-		dev->max_msix = msi_count = 1;
+-	else {
+-		if (dev->max_msix > msi_count)
+-			dev->max_msix = msi_count;
+-	}
+-	dev->vector_cap =
+-		(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) /
+-		msi_count;
+-}
+diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
+index 9eec027..37375cf 100644
+--- a/drivers/scsi/aacraid/linit.c
++++ b/drivers/scsi/aacraid/linit.c
+@@ -1317,6 +1317,149 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+ 	return error;
+ }
+ 
++#if (defined(CONFIG_PM))
++void aac_release_resources(struct aac_dev *aac)
++{
++	int i;
++
++	aac_adapter_disable_int(aac);
++	if (aac->pdev->device == PMC_DEVICE_S6 ||
++	    aac->pdev->device == PMC_DEVICE_S7 ||
++	    aac->pdev->device == PMC_DEVICE_S8 ||
++	    aac->pdev->device == PMC_DEVICE_S9) {
++		if (aac->max_msix > 1) {
++			for (i = 0; i < aac->max_msix; i++)
++				free_irq(aac->msixentry[i].vector,
++					&(aac->aac_msix[i]));
++		} else {
++			free_irq(aac->pdev->irq, &(aac->aac_msix[0]));
++		}
++	} else {
++		free_irq(aac->pdev->irq, aac);
++	}
++	if (aac->msi)
++		pci_disable_msi(aac->pdev);
++	else if (aac->max_msix > 1)
++		pci_disable_msix(aac->pdev);
++
++}
++
++static int aac_acquire_resources(struct aac_dev *dev)
++{
++	int i, j;
++	int instance = dev->id;
++	const char *name = dev->name;
++	unsigned long status;
++	/*
++	 *	First clear out all interrupts.  Then enable the one's that we
++	 *	can handle.
++	 */
++	while (!((status = src_readl(dev, MUnit.OMR)) & KERNEL_UP_AND_RUNNING)
++		|| status == 0xffffffff)
++			msleep(20);
++
++	aac_adapter_disable_int(dev);
++	aac_adapter_enable_int(dev);
++
++
++	if ((dev->pdev->device == PMC_DEVICE_S7 ||
++	     dev->pdev->device == PMC_DEVICE_S8 ||
++	     dev->pdev->device == PMC_DEVICE_S9))
++		aac_define_int_mode(dev);
++
++	if (dev->msi_enabled)
++		aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
++
++	if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
++		for (i = 0; i < dev->max_msix; i++) {
++			dev->aac_msix[i].vector_no = i;
++			dev->aac_msix[i].dev = dev;
++
++			if (request_irq(dev->msixentry[i].vector,
++					dev->a_ops.adapter_intr,
++					0, "aacraid", &(dev->aac_msix[i]))) {
++				printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
++						name, instance, i);
++				for (j = 0 ; j < i ; j++)
++					free_irq(dev->msixentry[j].vector,
++						 &(dev->aac_msix[j]));
++				pci_disable_msix(dev->pdev);
++				goto error_iounmap;
++			}
++		}
++	} else {
++		dev->aac_msix[0].vector_no = 0;
++		dev->aac_msix[0].dev = dev;
++
++		if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
++			IRQF_SHARED, "aacraid",
++			&(dev->aac_msix[0])) < 0) {
++			if (dev->msi)
++				pci_disable_msi(dev->pdev);
++			printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
++					name, instance);
++			goto error_iounmap;
++		}
++	}
++
++	aac_adapter_enable_int(dev);
++
++	if (!dev->sync_mode)
++		aac_adapter_start(dev);
++	return 0;
++
++error_iounmap:
++	return -1;
++
++}
++static int aac_suspend(struct pci_dev *pdev, pm_message_t state)
++{
++
++	struct Scsi_Host *shost = pci_get_drvdata(pdev);
++	struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
++
++	scsi_block_requests(shost);
++	aac_send_shutdown(aac);
++
++	aac_release_resources(aac);
++
++	pci_set_drvdata(pdev, shost);
++	pci_save_state(pdev);
++	pci_disable_device(pdev);
++	pci_set_power_state(pdev, pci_choose_state(pdev, state));
++
++	return 0;
++}
++
++static int aac_resume(struct pci_dev *pdev)
++{
++	struct Scsi_Host *shost = pci_get_drvdata(pdev);
++	struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
++	int r;
++
++	pci_set_power_state(pdev, PCI_D0);
++	pci_enable_wake(pdev, PCI_D0, 0);
++	pci_restore_state(pdev);
++	r = pci_enable_device(pdev);
++
++	if (r)
++		goto fail_device;
++
++	pci_set_master(pdev);
++	if (aac_acquire_resources(aac))
++		goto fail_device;
++	scsi_unblock_requests(shost);
++
++	return 0;
++
++fail_device:
++	printk(KERN_INFO "%s%d: resume failed.\n", aac->name, aac->id);
++	scsi_host_put(shost);
++	pci_disable_device(pdev);
++	return -ENODEV;
++}
++#endif
++
+ static void aac_shutdown(struct pci_dev *dev)
+ {
+ 	struct Scsi_Host *shost = pci_get_drvdata(dev);
+@@ -1356,6 +1499,10 @@ static struct pci_driver aac_pci_driver = {
+ 	.id_table	= aac_pci_tbl,
+ 	.probe		= aac_probe_one,
+ 	.remove		= aac_remove_one,
++#if (defined(CONFIG_PM))
++	.suspend	= aac_suspend,
++	.resume		= aac_resume,
++#endif
+ 	.shutdown	= aac_shutdown,
+ };
+ 
+diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
+index 9570612..ac16380 100644
+--- a/drivers/scsi/aacraid/rx.c
++++ b/drivers/scsi/aacraid/rx.c
+@@ -623,6 +623,7 @@ int _aac_rx_init(struct aac_dev *dev)
+ 	dev->a_ops.adapter_sync_cmd = rx_sync_cmd;
+ 	dev->a_ops.adapter_check_health = aac_rx_check_health;
+ 	dev->a_ops.adapter_restart = aac_rx_restart_adapter;
++	dev->a_ops.adapter_start = aac_rx_start_adapter;
+ 
+ 	/*
+ 	 *	First clear out all interrupts.  Then enable the one's that we
+diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
+index e66477c..869aea2 100644
+--- a/drivers/scsi/aacraid/sa.c
++++ b/drivers/scsi/aacraid/sa.c
+@@ -372,6 +372,7 @@ int aac_sa_init(struct aac_dev *dev)
+ 	dev->a_ops.adapter_sync_cmd = sa_sync_cmd;
+ 	dev->a_ops.adapter_check_health = aac_sa_check_health;
+ 	dev->a_ops.adapter_restart = aac_sa_restart_adapter;
++	dev->a_ops.adapter_start = aac_sa_start_adapter;
+ 	dev->a_ops.adapter_intr = aac_sa_intr;
+ 	dev->a_ops.adapter_deliver = aac_rx_deliver_producer;
+ 	dev->a_ops.adapter_ioremap = aac_sa_ioremap;
+diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
+index e63cf9f..b147341 100644
+--- a/drivers/scsi/aacraid/src.c
++++ b/drivers/scsi/aacraid/src.c
+@@ -726,6 +726,7 @@ int aac_src_init(struct aac_dev *dev)
+ 	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;
++	dev->a_ops.adapter_start = aac_src_start_adapter;
+ 
+ 	/*
+ 	 *	First clear out all interrupts.  Then enable the one's that we
+@@ -892,6 +893,7 @@ int aac_srcv_init(struct aac_dev *dev)
+ 	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;
++	dev->a_ops.adapter_start = aac_src_start_adapter;
+ 
+ 	/*
+ 	 *	First clear out all interrupts.  Then enable the one's that we
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0011-aacraid-Change-interrupt-mode-to-MSI-for-Series-6.patch b/openpower/linux/linux-0011-aacraid-Change-interrupt-mode-to-MSI-for-Series-6.patch
new file mode 100644
index 0000000..1ed4ef9
--- /dev/null
+++ b/openpower/linux/linux-0011-aacraid-Change-interrupt-mode-to-MSI-for-Series-6.patch
@@ -0,0 +1,46 @@
+From d9ba7aa29b0b509f955fc699e2cc46586350cc70 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:35 -0400
+Subject: [PATCH 11/18] aacraid: Change interrupt mode to MSI for Series 6
+
+This change always sets MSI interrupt mode for series-6 controller.
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aachba.c | 2 +-
+ drivers/scsi/aacraid/src.c    | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
+index fe59b00..05f2a02 100644
+--- a/drivers/scsi/aacraid/aachba.c
++++ b/drivers/scsi/aacraid/aachba.c
+@@ -259,7 +259,7 @@ MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
+ 	" 0=off, 1=on");
+ module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(msi, "IRQ handling."
+-	" 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)");
++	" 0=PIC(default), 1=MSI, 2=MSI-X)");
+ module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
+ 	" adapter to have it's kernel up and\n"
+diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
+index b147341..eb07b3d 100644
+--- a/drivers/scsi/aacraid/src.c
++++ b/drivers/scsi/aacraid/src.c
+@@ -742,7 +742,7 @@ int aac_src_init(struct aac_dev *dev)
+ 	if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
+ 		goto error_iounmap;
+ 
+-	dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
++	dev->msi = !pci_enable_msi(dev->pdev);
+ 
+ 	dev->aac_msix[0].vector_no = 0;
+ 	dev->aac_msix[0].dev = dev;
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0012-aacraid-Tune-response-path-if-IsFastPath-bit-set.patch b/openpower/linux/linux-0012-aacraid-Tune-response-path-if-IsFastPath-bit-set.patch
new file mode 100644
index 0000000..f4069ac
--- /dev/null
+++ b/openpower/linux/linux-0012-aacraid-Tune-response-path-if-IsFastPath-bit-set.patch
@@ -0,0 +1,319 @@
+From 3347b9a251462899045c322ff17a8b6b69ec6bc2 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:37 -0400
+Subject: [PATCH 12/18] aacraid: Tune response path if IsFastPath bit set
+
+If 'IsFastPath' bit is set, then response path assumes no error and skips error check.
+
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aachba.c | 259 ++++++++++++++++++++++--------------------
+ 1 file changed, 137 insertions(+), 122 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
+index 05f2a02..e4c2437 100644
+--- a/drivers/scsi/aacraid/aachba.c
++++ b/drivers/scsi/aacraid/aachba.c
+@@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
+ 		return;
+ 
+ 	BUG_ON(fibptr == NULL);
+-
+ 	dev = fibptr->dev;
+ 
+-	srbreply = (struct aac_srb_reply *) fib_data(fibptr);
++	scsi_dma_unmap(scsicmd);
+ 
++	/* expose physical device if expose_physicald flag is on */
++	if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
++	  && expose_physicals > 0)
++		aac_expose_phy_device(scsicmd);
++
++	srbreply = (struct aac_srb_reply *) fib_data(fibptr);
+ 	scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */
+ 
+ 	if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
+@@ -2994,147 +2999,157 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
+ 		 */
+ 		scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
+ 				   - le32_to_cpu(srbreply->data_xfer_length));
+-	}
+-
+-	scsi_dma_unmap(scsicmd);
+-
+-	/* expose physical device if expose_physicald flag is on */
+-	if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
+-	  && expose_physicals > 0)
+-		aac_expose_phy_device(scsicmd);
++		/*
++		 * First check the fib status
++		 */
+ 
+-	/*
+-	 * First check the fib status
+-	 */
++		if (le32_to_cpu(srbreply->status) != ST_OK) {
++			int len;
+ 
+-	if (le32_to_cpu(srbreply->status) != ST_OK){
+-		int len;
+-		printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
+-		len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
+-			    SCSI_SENSE_BUFFERSIZE);
+-		scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
+-		memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
+-	}
++			printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
++			len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
++				    SCSI_SENSE_BUFFERSIZE);
++			scsicmd->result = DID_ERROR << 16
++						| COMMAND_COMPLETE << 8
++						| SAM_STAT_CHECK_CONDITION;
++			memcpy(scsicmd->sense_buffer,
++					srbreply->sense_data, len);
++		}
+ 
+-	/*
+-	 * Next check the srb status
+-	 */
+-	switch( (le32_to_cpu(srbreply->srb_status))&0x3f){
+-	case SRB_STATUS_ERROR_RECOVERY:
+-	case SRB_STATUS_PENDING:
+-	case SRB_STATUS_SUCCESS:
+-		scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
+-		break;
+-	case SRB_STATUS_DATA_OVERRUN:
+-		switch(scsicmd->cmnd[0]){
+-		case  READ_6:
+-		case  WRITE_6:
+-		case  READ_10:
+-		case  WRITE_10:
+-		case  READ_12:
+-		case  WRITE_12:
+-		case  READ_16:
+-		case  WRITE_16:
+-			if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) {
+-				printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
+-			} else {
+-				printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
++		/*
++		 * Next check the srb status
++		 */
++		switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
++		case SRB_STATUS_ERROR_RECOVERY:
++		case SRB_STATUS_PENDING:
++		case SRB_STATUS_SUCCESS:
++			scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
++			break;
++		case SRB_STATUS_DATA_OVERRUN:
++			switch (scsicmd->cmnd[0]) {
++			case  READ_6:
++			case  WRITE_6:
++			case  READ_10:
++			case  WRITE_10:
++			case  READ_12:
++			case  WRITE_12:
++			case  READ_16:
++			case  WRITE_16:
++				if (le32_to_cpu(srbreply->data_xfer_length)
++							< scsicmd->underflow)
++					printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
++				else
++					printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
++				scsicmd->result = DID_ERROR << 16
++							| COMMAND_COMPLETE << 8;
++				break;
++			case INQUIRY: {
++				scsicmd->result = DID_OK << 16
++							| COMMAND_COMPLETE << 8;
++				break;
++			}
++			default:
++				scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
++				break;
+ 			}
+-			scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
+ 			break;
+-		case INQUIRY: {
+-			scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
++		case SRB_STATUS_ABORTED:
++			scsicmd->result = DID_ABORT << 16 | ABORT << 8;
+ 			break;
+-		}
+-		default:
+-			scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
++		case SRB_STATUS_ABORT_FAILED:
++			/*
++			 * Not sure about this one - but assuming the
++			 * hba was trying to abort for some reason
++			 */
++			scsicmd->result = DID_ERROR << 16 | ABORT << 8;
++			break;
++		case SRB_STATUS_PARITY_ERROR:
++			scsicmd->result = DID_PARITY << 16
++						| MSG_PARITY_ERROR << 8;
++			break;
++		case SRB_STATUS_NO_DEVICE:
++		case SRB_STATUS_INVALID_PATH_ID:
++		case SRB_STATUS_INVALID_TARGET_ID:
++		case SRB_STATUS_INVALID_LUN:
++		case SRB_STATUS_SELECTION_TIMEOUT:
++			scsicmd->result = DID_NO_CONNECT << 16
++						| COMMAND_COMPLETE << 8;
+ 			break;
+-		}
+-		break;
+-	case SRB_STATUS_ABORTED:
+-		scsicmd->result = DID_ABORT << 16 | ABORT << 8;
+-		break;
+-	case SRB_STATUS_ABORT_FAILED:
+-		// Not sure about this one - but assuming the hba was trying to abort for some reason
+-		scsicmd->result = DID_ERROR << 16 | ABORT << 8;
+-		break;
+-	case SRB_STATUS_PARITY_ERROR:
+-		scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
+-		break;
+-	case SRB_STATUS_NO_DEVICE:
+-	case SRB_STATUS_INVALID_PATH_ID:
+-	case SRB_STATUS_INVALID_TARGET_ID:
+-	case SRB_STATUS_INVALID_LUN:
+-	case SRB_STATUS_SELECTION_TIMEOUT:
+-		scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
+-		break;
+ 
+-	case SRB_STATUS_COMMAND_TIMEOUT:
+-	case SRB_STATUS_TIMEOUT:
+-		scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8;
+-		break;
++		case SRB_STATUS_COMMAND_TIMEOUT:
++		case SRB_STATUS_TIMEOUT:
++			scsicmd->result = DID_TIME_OUT << 16
++						| COMMAND_COMPLETE << 8;
++			break;
+ 
+-	case SRB_STATUS_BUSY:
+-		scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
+-		break;
++		case SRB_STATUS_BUSY:
++			scsicmd->result = DID_BUS_BUSY << 16
++						| COMMAND_COMPLETE << 8;
++			break;
+ 
+-	case SRB_STATUS_BUS_RESET:
+-		scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8;
+-		break;
++		case SRB_STATUS_BUS_RESET:
++			scsicmd->result = DID_RESET << 16
++						| COMMAND_COMPLETE << 8;
++			break;
+ 
+-	case SRB_STATUS_MESSAGE_REJECTED:
+-		scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
+-		break;
+-	case SRB_STATUS_REQUEST_FLUSHED:
+-	case SRB_STATUS_ERROR:
+-	case SRB_STATUS_INVALID_REQUEST:
+-	case SRB_STATUS_REQUEST_SENSE_FAILED:
+-	case SRB_STATUS_NO_HBA:
+-	case SRB_STATUS_UNEXPECTED_BUS_FREE:
+-	case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
+-	case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
+-	case SRB_STATUS_DELAYED_RETRY:
+-	case SRB_STATUS_BAD_FUNCTION:
+-	case SRB_STATUS_NOT_STARTED:
+-	case SRB_STATUS_NOT_IN_USE:
+-	case SRB_STATUS_FORCE_ABORT:
+-	case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
+-	default:
++		case SRB_STATUS_MESSAGE_REJECTED:
++			scsicmd->result = DID_ERROR << 16
++						| MESSAGE_REJECT << 8;
++			break;
++		case SRB_STATUS_REQUEST_FLUSHED:
++		case SRB_STATUS_ERROR:
++		case SRB_STATUS_INVALID_REQUEST:
++		case SRB_STATUS_REQUEST_SENSE_FAILED:
++		case SRB_STATUS_NO_HBA:
++		case SRB_STATUS_UNEXPECTED_BUS_FREE:
++		case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
++		case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
++		case SRB_STATUS_DELAYED_RETRY:
++		case SRB_STATUS_BAD_FUNCTION:
++		case SRB_STATUS_NOT_STARTED:
++		case SRB_STATUS_NOT_IN_USE:
++		case SRB_STATUS_FORCE_ABORT:
++		case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
++		default:
+ #ifdef AAC_DETAILED_STATUS_INFO
+-		printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
+-			le32_to_cpu(srbreply->srb_status) & 0x3F,
+-			aac_get_status_string(
+-				le32_to_cpu(srbreply->srb_status) & 0x3F),
+-			scsicmd->cmnd[0],
+-			le32_to_cpu(srbreply->scsi_status));
++			printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
++				le32_to_cpu(srbreply->srb_status) & 0x3F,
++				aac_get_status_string(
++					le32_to_cpu(srbreply->srb_status) & 0x3F),
++				scsicmd->cmnd[0],
++				le32_to_cpu(srbreply->scsi_status));
+ #endif
+-		if ((scsicmd->cmnd[0] == ATA_12)
+-		  || (scsicmd->cmnd[0] == ATA_16)) {
+-			if (scsicmd->cmnd[2] & (0x01 << 5)) {
+-				scsicmd->result = DID_OK << 16
+-						| COMMAND_COMPLETE << 8;
++			if ((scsicmd->cmnd[0] == ATA_12)
++				|| (scsicmd->cmnd[0] == ATA_16)) {
++					if (scsicmd->cmnd[2] & (0x01 << 5)) {
++						scsicmd->result = DID_OK << 16
++							| COMMAND_COMPLETE << 8;
+ 				break;
++				} else {
++					scsicmd->result = DID_ERROR << 16
++						| COMMAND_COMPLETE << 8;
++					break;
++				}
+ 			} else {
+ 				scsicmd->result = DID_ERROR << 16
+-						| COMMAND_COMPLETE << 8;
++					| COMMAND_COMPLETE << 8;
+ 				break;
+ 			}
+-		} else {
+-			scsicmd->result = DID_ERROR << 16
+-					| COMMAND_COMPLETE << 8;
+-			break;
+ 		}
+-	}
+-	if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
+-		int len;
+-		scsicmd->result |= SAM_STAT_CHECK_CONDITION;
+-		len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
+-			    SCSI_SENSE_BUFFERSIZE);
++		if (le32_to_cpu(srbreply->scsi_status)
++				== SAM_STAT_CHECK_CONDITION) {
++			int len;
++
++			scsicmd->result |= SAM_STAT_CHECK_CONDITION;
++			len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
++				    SCSI_SENSE_BUFFERSIZE);
+ #ifdef AAC_DETAILED_STATUS_INFO
+-		printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
+-					le32_to_cpu(srbreply->status), len);
++			printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
++						le32_to_cpu(srbreply->status), len);
+ #endif
+-		memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
++			memcpy(scsicmd->sense_buffer,
++					srbreply->sense_data, len);
++		}
+ 	}
+ 	/*
+ 	 * OR in the scsi status (already shifted up a bit)
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0013-aacraid-Enable-64bit-write-to-controller-register.patch b/openpower/linux/linux-0013-aacraid-Enable-64bit-write-to-controller-register.patch
new file mode 100644
index 0000000..c0fb3d2
--- /dev/null
+++ b/openpower/linux/linux-0013-aacraid-Enable-64bit-write-to-controller-register.patch
@@ -0,0 +1,92 @@
+From e778c7f7ca05f9abad4d590e3979b3c3970cfd26 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:36 -0400
+Subject: [PATCH 13/18] aacraid: Enable 64bit write to controller register
+
+If writeq() not supported, then do atomic two 32bit write
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aacraid.h  |  9 +++++++++
+ drivers/scsi/aacraid/comminit.c |  1 +
+ drivers/scsi/aacraid/src.c      | 12 ++++++++++--
+ 3 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index 62b0999..e54f597 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -844,6 +844,10 @@ struct src_registers {
+ 						&((AEP)->regs.src.bar0->CSR))
+ #define src_writel(AEP, CSR, value)	writel(value, \
+ 						&((AEP)->regs.src.bar0->CSR))
++#if defined(writeq)
++#define	src_writeq(AEP, CSR, value)	writeq(value, \
++						&((AEP)->regs.src.bar0->CSR))
++#endif
+ 
+ #define SRC_ODR_SHIFT		12
+ #define SRC_IDR_SHIFT		9
+@@ -1163,6 +1167,11 @@ struct aac_dev
+ 	struct fsa_dev_info	*fsa_dev;
+ 	struct task_struct	*thread;
+ 	int			cardtype;
++	/*
++	 *This lock will protect the two 32-bit
++	 *writes to the Inbound Queue
++	 */
++	spinlock_t		iq_lock;
+ 
+ 	/*
+ 	 *	The following is the device specific extension.
+diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
+index 45a0a04..b4b6088 100644
+--- a/drivers/scsi/aacraid/comminit.c
++++ b/drivers/scsi/aacraid/comminit.c
+@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
+ 	dev->management_fib_count = 0;
+ 	spin_lock_init(&dev->manage_lock);
+ 	spin_lock_init(&dev->sync_lock);
++	spin_lock_init(&dev->iq_lock);
+ 	dev->max_fib_size = sizeof(struct hw_fib);
+ 	dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
+ 		- sizeof(struct aac_fibhdr)
+diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
+index eb07b3d..1409a0b 100644
+--- a/drivers/scsi/aacraid/src.c
++++ b/drivers/scsi/aacraid/src.c
+@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
+ 	u32 fibsize;
+ 	dma_addr_t address;
+ 	struct aac_fib_xporthdr *pFibX;
++#if !defined(writeq)
++	unsigned long flags;
++#endif
++
+ 	u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
+ 
+ 	atomic_inc(&q->numpending);
+@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
+ 			return -EINVAL;
+ 		address |= fibsize;
+ 	}
+-
++#if defined(writeq)
++	src_writeq(dev, MUnit.IQ_L, (u64)address);
++#else
++	spin_lock_irqsave(&fib->dev->iq_lock, flags);
+ 	src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
+ 	src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
+-
++	spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
++#endif
+ 	return 0;
+ }
+ 
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0014-aacraid-IOCTL-fix.patch b/openpower/linux/linux-0014-aacraid-IOCTL-fix.patch
new file mode 100644
index 0000000..6faddc8
--- /dev/null
+++ b/openpower/linux/linux-0014-aacraid-IOCTL-fix.patch
@@ -0,0 +1,36 @@
+From 892fadaa9806538ae2c419449c66f4c2838fff2d Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:39 -0400
+Subject: [PATCH 14/18] aacraid: IOCTL fix
+
+Driver blocks ioctls once it received shutdown/suspend request during
+suspend/hybernation. This patch unblocks ioctls on resume path.
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/linit.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
+index 37375cf..3b6e5c6 100644
+--- a/drivers/scsi/aacraid/linit.c
++++ b/drivers/scsi/aacraid/linit.c
+@@ -1448,6 +1448,11 @@ static int aac_resume(struct pci_dev *pdev)
+ 	pci_set_master(pdev);
+ 	if (aac_acquire_resources(aac))
+ 		goto fail_device;
++	/*
++	* reset this flag to unblock ioctl() as it was set at
++	* aac_send_shutdown() to block ioctls from upperlayer
++	*/
++	aac->adapter_shutdown = 0;
+ 	scsi_unblock_requests(shost);
+ 
+ 	return 0;
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0015-aacraid-Reset-irq-affinity-hints.patch b/openpower/linux/linux-0015-aacraid-Reset-irq-affinity-hints.patch
new file mode 100644
index 0000000..e9d6d9d
--- /dev/null
+++ b/openpower/linux/linux-0015-aacraid-Reset-irq-affinity-hints.patch
@@ -0,0 +1,242 @@
+From 81d42e7a457e420041f27b97efdfc6176647876a Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:38 -0400
+Subject: [PATCH 15/18] aacraid: Reset irq affinity hints
+
+Reset irq affinity hints before releasing IRQ.
+Removed duplicate code of IRQ acquire/release.
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aacraid.h |   2 +
+ drivers/scsi/aacraid/commsup.c | 113 ++++++++++++++++++++++++++++++-----------
+ drivers/scsi/aacraid/src.c     |  48 ++---------------
+ 3 files changed, 88 insertions(+), 75 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index e54f597..7b95227 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -2110,6 +2110,8 @@ static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor)
+ #define AAC_OWNER_ERROR_HANDLER	0x103
+ #define AAC_OWNER_FIRMWARE	0x106
+ 
++int aac_acquire_irq(struct aac_dev *dev);
++void aac_free_irq(struct aac_dev *dev);
+ const char *aac_driverinfo(struct Scsi_Host *);
+ struct fib *aac_fib_alloc(struct aac_dev *dev);
+ int aac_fib_setup(struct aac_dev *dev);
+diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
+index 4da5749..a1f90fe 100644
+--- a/drivers/scsi/aacraid/commsup.c
++++ b/drivers/scsi/aacraid/commsup.c
+@@ -1270,13 +1270,12 @@ retry_next:
+ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
+ {
+ 	int index, quirks;
+-	int retval, i;
++	int retval;
+ 	struct Scsi_Host *host;
+ 	struct scsi_device *dev;
+ 	struct scsi_cmnd *command;
+ 	struct scsi_cmnd *command_list;
+ 	int jafo = 0;
+-	int cpu;
+ 
+ 	/*
+ 	 * Assumptions:
+@@ -1339,35 +1338,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
+ 	aac->comm_phys = 0;
+ 	kfree(aac->queues);
+ 	aac->queues = NULL;
+-	cpu = cpumask_first(cpu_online_mask);
+-	if (aac->pdev->device == PMC_DEVICE_S6 ||
+-	    aac->pdev->device == PMC_DEVICE_S7 ||
+-	    aac->pdev->device == PMC_DEVICE_S8 ||
+-	    aac->pdev->device == PMC_DEVICE_S9) {
+-		if (aac->max_msix > 1) {
+-			for (i = 0; i < aac->max_msix; i++) {
+-				if (irq_set_affinity_hint(
+-				    aac->msixentry[i].vector,
+-				    NULL)) {
+-					printk(KERN_ERR "%s%d: Failed to reset IRQ affinity for cpu %d\n",
+-						aac->name,
+-						aac->id,
+-						cpu);
+-				}
+-				cpu = cpumask_next(cpu,
+-						cpu_online_mask);
+-				free_irq(aac->msixentry[i].vector,
+-					 &(aac->aac_msix[i]));
+-			}
+-			pci_disable_msix(aac->pdev);
+-		} else {
+-			free_irq(aac->pdev->irq, &(aac->aac_msix[0]));
+-		}
+-	} else {
+-		free_irq(aac->pdev->irq, aac);
+-	}
+-	if (aac->msi)
+-		pci_disable_msi(aac->pdev);
++	aac_free_irq(aac);
+ 	kfree(aac->fsa_dev);
+ 	aac->fsa_dev = NULL;
+ 	quirks = aac_get_driver_ident(index)->quirks;
+@@ -1978,3 +1949,83 @@ int aac_command_thread(void *data)
+ 	dev->aif_thread = 0;
+ 	return 0;
+ }
++
++int aac_acquire_irq(struct aac_dev *dev)
++{
++	int i;
++	int j;
++	int ret = 0;
++	int cpu;
++
++	cpu = cpumask_first(cpu_online_mask);
++	if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
++		for (i = 0; i < dev->max_msix; i++) {
++			dev->aac_msix[i].vector_no = i;
++			dev->aac_msix[i].dev = dev;
++			if (request_irq(dev->msixentry[i].vector,
++					dev->a_ops.adapter_intr,
++					0, "aacraid", &(dev->aac_msix[i]))) {
++				printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
++						dev->name, dev->id, i);
++				for (j = 0 ; j < i ; j++)
++					free_irq(dev->msixentry[j].vector,
++						 &(dev->aac_msix[j]));
++				pci_disable_msix(dev->pdev);
++				ret = -1;
++			}
++			if (irq_set_affinity_hint(dev->msixentry[i].vector,
++							get_cpu_mask(cpu))) {
++				printk(KERN_ERR "%s%d: Failed to set IRQ affinity for cpu %d\n",
++					    dev->name, dev->id, cpu);
++			}
++			cpu = cpumask_next(cpu, cpu_online_mask);
++		}
++	} else {
++		dev->aac_msix[0].vector_no = 0;
++		dev->aac_msix[0].dev = dev;
++
++		if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
++			IRQF_SHARED, "aacraid",
++			&(dev->aac_msix[0])) < 0) {
++			if (dev->msi)
++				pci_disable_msi(dev->pdev);
++			printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
++					dev->name, dev->id);
++			ret = -1;
++		}
++	}
++	return ret;
++}
++
++void aac_free_irq(struct aac_dev *dev)
++{
++	int i;
++	int cpu;
++
++	cpu = cpumask_first(cpu_online_mask);
++	if (dev->pdev->device == PMC_DEVICE_S6 ||
++	    dev->pdev->device == PMC_DEVICE_S7 ||
++	    dev->pdev->device == PMC_DEVICE_S8 ||
++	    dev->pdev->device == PMC_DEVICE_S9) {
++		if (dev->max_msix > 1) {
++			for (i = 0; i < dev->max_msix; i++) {
++				if (irq_set_affinity_hint(
++					dev->msixentry[i].vector, NULL)) {
++					printk(KERN_ERR "%s%d: Failed to reset IRQ affinity for cpu %d\n",
++					    dev->name, dev->id, cpu);
++				}
++				cpu = cpumask_next(cpu, cpu_online_mask);
++				free_irq(dev->msixentry[i].vector,
++						&(dev->aac_msix[i]));
++			}
++		} else {
++			free_irq(dev->pdev->irq, &(dev->aac_msix[0]));
++		}
++	} else {
++		free_irq(dev->pdev->irq, dev);
++	}
++	if (dev->msi)
++		pci_disable_msi(dev->pdev);
++	else if (dev->max_msix > 1)
++		pci_disable_msix(dev->pdev);
++}
+diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
+index 1409a0b..2aa34ea 100644
+--- a/drivers/scsi/aacraid/src.c
++++ b/drivers/scsi/aacraid/src.c
+@@ -798,9 +798,7 @@ int aac_srcv_init(struct aac_dev *dev)
+ 	unsigned long status;
+ 	int restart = 0;
+ 	int instance = dev->id;
+-	int i, j;
+ 	const char *name = dev->name;
+-	int cpu;
+ 
+ 	dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
+ 	dev->a_ops.adapter_comm = aac_src_select_comm;
+@@ -918,48 +916,10 @@ int aac_srcv_init(struct aac_dev *dev)
+ 		goto error_iounmap;
+ 	if (dev->msi_enabled)
+ 		aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
+-	if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
+-		cpu = cpumask_first(cpu_online_mask);
+-		for (i = 0; i < dev->max_msix; i++) {
+-			dev->aac_msix[i].vector_no = i;
+-			dev->aac_msix[i].dev = dev;
+-
+-			if (request_irq(dev->msixentry[i].vector,
+-					dev->a_ops.adapter_intr,
+-					0,
+-					"aacraid",
+-					&(dev->aac_msix[i]))) {
+-				printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
+-						name, instance, i);
+-				for (j = 0 ; j < i ; j++)
+-					free_irq(dev->msixentry[j].vector,
+-						 &(dev->aac_msix[j]));
+-				pci_disable_msix(dev->pdev);
+-				goto error_iounmap;
+-			}
+-			if (irq_set_affinity_hint(
+-			   dev->msixentry[i].vector,
+-			   get_cpu_mask(cpu))) {
+-				printk(KERN_ERR "%s%d: Failed to set IRQ affinity for cpu %d\n",
+-						name, instance, cpu);
+-			}
+-			cpu = cpumask_next(cpu, cpu_online_mask);
+-		}
+-	} else {
+-		dev->aac_msix[0].vector_no = 0;
+-		dev->aac_msix[0].dev = dev;
+-
+-		if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
+-				IRQF_SHARED,
+-				"aacraid",
+-				&(dev->aac_msix[0])) < 0) {
+-			if (dev->msi)
+-				pci_disable_msi(dev->pdev);
+-			printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
+-					name, instance);
+-			goto error_iounmap;
+-		}
+-	}
++
++	if (aac_acquire_irq(dev))
++		goto error_iounmap;
++
+ 	dev->dbg_base = dev->base_start;
+ 	dev->dbg_base_mapped = dev->base;
+ 	dev->dbg_size = dev->base_size;
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0016-aacraid-Use-pci_enable_msix_range.patch b/openpower/linux/linux-0016-aacraid-Use-pci_enable_msix_range.patch
new file mode 100644
index 0000000..b3ba206
--- /dev/null
+++ b/openpower/linux/linux-0016-aacraid-Use-pci_enable_msix_range.patch
@@ -0,0 +1,74 @@
+From e27d0ec1620e6c79a1cfe7286ad142f6c0701011 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:40 -0400
+Subject: [PATCH 16/18] aacraid: Use pci_enable_msix_range()
+
+As pci_enable_msix() deprecated, replaced with pci_enable_msix_range()
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aacraid.h  |  2 +-
+ drivers/scsi/aacraid/comminit.c | 20 ++++++--------------
+ 2 files changed, 7 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index 7b95227..2de5ebc 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -12,7 +12,7 @@
+  *              D E F I N E S
+  *----------------------------------------------------------------------------*/
+ 
+-#define AAC_MAX_MSIX		8	/* vectors */
++#define AAC_MAX_MSIX		32	/* vectors */
+ #define AAC_PCI_MSI_ENABLE	0x8000
+ 
+ enum {
+diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
+index b4b6088..0e954e3 100644
+--- a/drivers/scsi/aacraid/comminit.c
++++ b/drivers/scsi/aacraid/comminit.c
+@@ -338,7 +338,7 @@ static int aac_comm_init(struct aac_dev * dev)
+ 
+ void aac_define_int_mode(struct aac_dev *dev)
+ {
+-	int i, msi_count;
++	int i, msi_count, min_msix;
+ 
+ 	msi_count = i = 0;
+ 	/* max. vectors from GET_COMM_PREFERRED_SETTINGS */
+@@ -366,22 +366,14 @@ void aac_define_int_mode(struct aac_dev *dev)
+ 
+ 	if (msi_count > 1 &&
+ 	    pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) {
+-		i = pci_enable_msix(dev->pdev,
++		min_msix = 2;
++		i = pci_enable_msix_range(dev->pdev,
+ 				    dev->msixentry,
++				    min_msix,
+ 				    msi_count);
+-		 /* Check how many MSIX vectors are allocated */
+-		if (i >= 0) {
++		if (i > 0) {
+ 			dev->msi_enabled = 1;
+-			if (i) {
+-				msi_count = i;
+-				if (pci_enable_msix(dev->pdev,
+-				    dev->msixentry,
+-				    msi_count)) {
+-					dev->msi_enabled = 0;
+-					printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
+-							dev->name, dev->id, i);
+-				}
+-			}
++			msi_count = i;
+ 		} else {
+ 			dev->msi_enabled = 0;
+ 			printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0017-aacraid-Update-driver-version.patch b/openpower/linux/linux-0017-aacraid-Update-driver-version.patch
new file mode 100644
index 0000000..09345a3
--- /dev/null
+++ b/openpower/linux/linux-0017-aacraid-Update-driver-version.patch
@@ -0,0 +1,30 @@
+From f11a9348cf2abcc11bc1b98a9976d73107df88b0 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:41 -0400
+Subject: [PATCH 17/18] aacraid: Update driver version
+
+Reviewed-by: Tomas Henzl <thenzl@redhat.com>
+Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
+Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/scsi/aacraid/aacraid.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+index 2de5ebc..074878b 100644
+--- a/drivers/scsi/aacraid/aacraid.h
++++ b/drivers/scsi/aacraid/aacraid.h
+@@ -62,7 +62,7 @@ enum {
+ #define	PMC_GLOBAL_INT_BIT0		0x00000001
+ 
+ #ifndef AAC_DRIVER_BUILD
+-# define AAC_DRIVER_BUILD 40709
++# define AAC_DRIVER_BUILD 41010
+ # define AAC_DRIVER_BRANCH "-ms"
+ #endif
+ #define MAXIMUM_NUM_CONTAINERS	32
+-- 
+2.5.0
+
diff --git a/openpower/linux/linux-0009-Release-4.2-openpower1.patch b/openpower/linux/linux-0018-Release-4.2.1-openpower1.patch
similarity index 72%
rename from openpower/linux/linux-0009-Release-4.2-openpower1.patch
rename to openpower/linux/linux-0018-Release-4.2.1-openpower1.patch
index 8d1d304..289a627 100644
--- a/openpower/linux/linux-0009-Release-4.2-openpower1.patch
+++ b/openpower/linux/linux-0018-Release-4.2.1-openpower1.patch
@@ -1,7 +1,7 @@
-From a5b82ac114aaa4235f61cd2c289e3afc2aca667c Mon Sep 17 00:00:00 2001
+From 5c51532db6ffcf1ec521a8a0d19cf3e814f6b428 Mon Sep 17 00:00:00 2001
 From: Joel Stanley <joel@jms.id.au>
 Date: Fri, 11 Sep 2015 16:09:56 +0930
-Subject: [PATCH 9/9] Release 4.2-openpower1
+Subject: [PATCH 18/18] Release 4.2.1-openpower1
 
 Signed-off-by: Joel Stanley <joel@jms.id.au>
 ---
@@ -9,13 +9,13 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/Makefile b/Makefile
-index c361593..0d12263 100644
+index a03efc1..49bbfb6 100644
 --- a/Makefile
 +++ b/Makefile
 @@ -1,7 +1,7 @@
  VERSION = 4
  PATCHLEVEL = 2
- SUBLEVEL = 0
+ SUBLEVEL = 1
 -EXTRAVERSION =
 +EXTRAVERSION = -openpower1
  NAME = Hurr durr I'ma sheep