]> git.proxmox.com Git - pve-kernel-jessie.git/commitdiff
update aacraid driver
authorDietmar Maurer <dietmar@proxmox.com>
Sat, 19 Dec 2015 14:26:17 +0000 (15:26 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Sat, 19 Dec 2015 14:27:28 +0000 (15:27 +0100)
0001-aacraid-fix-for-LD.patch [new file with mode: 0644]
0002-aacraid-add-power-management.patch [new file with mode: 0644]
0003-aacraid-change-interrupt-mode.patch [new file with mode: 0644]
0004-aacraid-enable-64bit-write.patch [new file with mode: 0644]
0005-aacraid-tune-response-path.patch [new file with mode: 0644]
0006-aacraid-reset-irq-affinity.patch [new file with mode: 0644]
0007-aacraid-ioctl-fix.patch [new file with mode: 0644]
0008-aacraid-use-pci-enable-msix-range.patch [new file with mode: 0644]
0009-aacraid-update-driver-version.patch [new file with mode: 0644]
Makefile
changelog.Debian

diff --git a/0001-aacraid-fix-for-LD.patch b/0001-aacraid-fix-for-LD.patch
new file mode 100644 (file)
index 0000000..6a5075a
--- /dev/null
@@ -0,0 +1,41 @@
+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
+
diff --git a/0002-aacraid-add-power-management.patch b/0002-aacraid-add-power-management.patch
new file mode 100644 (file)
index 0000000..689d1fa
--- /dev/null
@@ -0,0 +1,441 @@
+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
+
diff --git a/0003-aacraid-change-interrupt-mode.patch b/0003-aacraid-change-interrupt-mode.patch
new file mode 100644 (file)
index 0000000..51e9b1f
--- /dev/null
@@ -0,0 +1,46 @@
+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
+
diff --git a/0004-aacraid-enable-64bit-write.patch b/0004-aacraid-enable-64bit-write.patch
new file mode 100644 (file)
index 0000000..45977c7
--- /dev/null
@@ -0,0 +1,92 @@
+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
+
diff --git a/0005-aacraid-tune-response-path.patch b/0005-aacraid-tune-response-path.patch
new file mode 100644 (file)
index 0000000..d7d4b91
--- /dev/null
@@ -0,0 +1,320 @@
+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
+
diff --git a/0006-aacraid-reset-irq-affinity.patch b/0006-aacraid-reset-irq-affinity.patch
new file mode 100644 (file)
index 0000000..2ceb656
--- /dev/null
@@ -0,0 +1,242 @@
+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
+
diff --git a/0007-aacraid-ioctl-fix.patch b/0007-aacraid-ioctl-fix.patch
new file mode 100644 (file)
index 0000000..2873f90
--- /dev/null
@@ -0,0 +1,36 @@
+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
+
diff --git a/0008-aacraid-use-pci-enable-msix-range.patch b/0008-aacraid-use-pci-enable-msix-range.patch
new file mode 100644 (file)
index 0000000..04d2170
--- /dev/null
@@ -0,0 +1,74 @@
+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
+
diff --git a/0009-aacraid-update-driver-version.patch b/0009-aacraid-update-driver-version.patch
new file mode 100644 (file)
index 0000000..70ed0bd
--- /dev/null
@@ -0,0 +1,30 @@
+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
+
index 186ad62948d9ab088d7548ae01177f50ac0d11f0..ce86bc226fcb458744ca0ff26840f300f5e4fb96 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ RELEASE=4.1
 
 # 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
@@ -239,6 +239,16 @@ ${KERNEL_SRC}/README ${KERNEL_CFG_ORG}: ${KERNELSRCTAR}
        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 $@
 
index fc56f54c6729f252a24881e21bfe79057b64c470..dd0237a7596a72b60250ce733a051c624e4de7df 100644 (file)
@@ -1,3 +1,9 @@
+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