--- /dev/null
+From fb5d40d4fca272286695c67da0a2d0a9d0954615 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:33 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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,
+--
+cgit v0.11.2
+
--- /dev/null
+From de665f28f788ad72ff6a0ce6ac2721d77248b7cf Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:34 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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
+--
+cgit v0.11.2
+
--- /dev/null
+From 9022d375bd22869ba3e5ad3635f00427cfb934fc Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:35 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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;
+--
+cgit v0.11.2
+
--- /dev/null
+From c6992781d9e8086d592f95870092a59042d111a2 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:36 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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;
+ }
+
+--
+cgit v0.11.2
+
--- /dev/null
+From 55b8760847a6e593ab67448ca79f83c4b1a9f012 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:37 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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)
+--
+cgit v0.11.2
+
--- /dev/null
+From 8b1462e0ebb677ee07da6c18f7047539ea6e449e Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:38 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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;
+--
+cgit v0.11.2
+
--- /dev/null
+From e728f8e39ffd8f7054e0718b4fb308c32235a5c2 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:39 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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;
+--
+cgit v0.11.2
+
--- /dev/null
+From 84859c926b0828b07b2c3dd66a440ef4120a8668 Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:40 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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",
+--
+cgit v0.11.2
+
--- /dev/null
+From ead1cbf92745b2b52846da56c9b3dd83ea4e718b Mon Sep 17 00:00:00 2001
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
+Date: Fri, 28 Aug 2015 06:38:41 -0400
+Subject: 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: James Bottomley <JBottomley@Odin.com>
+---
+ 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
+--
+cgit v0.11.2
+
# also update proxmox-ve/changelog if you change KERNEL_VER or KREL
KERNEL_VER=4.2.6
-PKGREL=27
+PKGREL=28
# also include firmware of previous version into
# the fw package: fwlist-2.6.32-PREV-pve
KREL=1
cd ${KERNEL_SRC}; patch -p1 <../kvm-x86-obey-KVM_X86_QUIRK_CD_NW_CLEARED-in-kvm_set_cr0.patch
cd ${KERNEL_SRC}; patch -p1 <../KVM-svm-unconditionally-intercept-DB.patch
cd ${KERNEL_SRC}; patch -p1 <../apparmor-socket-mediation.patch
+ # backport aacraid update from kernel 4.4rc5
+ cd ${KERNEL_SRC}; patch -p1 <../0001-aacraid-fix-for-LD.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0002-aacraid-add-power-management.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0003-aacraid-change-interrupt-mode.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0004-aacraid-enable-64bit-write.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0005-aacraid-tune-response-path.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0006-aacraid-reset-irq-affinity.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0007-aacraid-ioctl-fix.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0008-aacraid-use-pci-enable-msix-range.patch
+ cd ${KERNEL_SRC}; patch -p1 <../0009-aacraid-update-driver-version.patch
sed -i ${KERNEL_SRC}/Makefile -e 's/^EXTRAVERSION.*$$/EXTRAVERSION=${EXTRAVERSION}/'
touch $@
+pve-kernel (4.2.6-28) unstable; urgency=medium
+
+ * update aacraid driver (backport from kernel 4.4rc5)
+
+ -- Proxmox Support Team <support@proxmox.com> Sat, 19 Dec 2015 15:26:05 +0100
+
pve-kernel (4.2.6-27) unstable; urgency=medium
* AppArmor: add temporary socket mediation fix