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