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-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
+