* [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010
@ 2015-06-11 1:42 rajinikanth.pandurangan
2015-06-11 1:42 ` rajinikanth.pandurangan
` (9 more replies)
0 siblings, 10 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
This patchset includes the following changes (bug fixes and new feature support)
specific to aacraid driver.
V2:
* Removed IRQF_DISABLED
* Removed unwanted macro definition "sa_writeq"
* Replaced pci_enable_msix()with "pci_enable_msix_exact()"
Rajinikanth Pandurangan (9):
[SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
[SCSI] aacraid: Add Power Management support
[SCSI] aacraid: Enable MSI interrupt for series-6 controller
[SCSI] aacraid: Enable 64-bit write to controller register
[SCSI] aacraid: Tune response path if IsFastPath bit set
[SCSI] aacraid: Reset irq affinity hints before releasing irq
[SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
[SCSI] aacraid: Send commit-config to controller firmware
[SCSI] aacraid: Update driver version
drivers/scsi/aacraid/aachba.c | 263 +++++++++++++++++++++-------------------
drivers/scsi/aacraid/aacraid.h | 18 ++-
drivers/scsi/aacraid/comminit.c | 155 ++++++++++++-----------
drivers/scsi/aacraid/commsup.c | 113 ++++++++++++-----
drivers/scsi/aacraid/linit.c | 159 +++++++++++++++++++++++-
drivers/scsi/aacraid/rx.c | 1 +
drivers/scsi/aacraid/sa.c | 1 +
drivers/scsi/aacraid/src.c | 64 +++-------
8 files changed, 491 insertions(+), 283 deletions(-)
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
` (8 subsequent siblings)
9 siblings, 0 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
This patchset includes the following changes (bug fixes and new feature support)
specific to aacraid driver.
V2:
* Removed IRQF_DISABLED
* Removed unwanted macro definition "sa_writeq"
* Replaced pci_enable_msix()with "pci_enable_msix_exact()"
Rajinikanth Pandurangan (9):
[SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
[SCSI] aacraid: Add Power Management support
[SCSI] aacraid: Enable MSI interrupt for series-6 controller
[SCSI] aacraid: Enable 64-bit write to controller register
[SCSI] aacraid: Tune response path if IsFastPath bit set
[SCSI] aacraid: Reset irq affinity hints before releasing irq
[SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
[SCSI] aacraid: Send commit-config to controller firmware
[SCSI] aacraid: Update driver version
drivers/scsi/aacraid/aachba.c | 263 +++++++++++++++++++++-------------------
drivers/scsi/aacraid/aacraid.h | 18 ++-
drivers/scsi/aacraid/comminit.c | 155 ++++++++++++-----------
drivers/scsi/aacraid/commsup.c | 113 ++++++++++++-----
drivers/scsi/aacraid/linit.c | 159 +++++++++++++++++++++++-
drivers/scsi/aacraid/rx.c | 1 +
drivers/scsi/aacraid/sa.c | 1 +
drivers/scsi/aacraid/src.c | 64 +++-------
8 files changed, 491 insertions(+), 283 deletions(-)
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
2015-06-11 1:42 ` rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-16 11:27 ` Johannes Thumshirn
` (2 more replies)
2015-06-11 1:42 ` [Patch V2 2/9] [SCSI] aacraid: Add Power Management support rajinikanth.pandurangan
` (7 subsequent siblings)
9 siblings, 3 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Driver sends the right size of the response buffer.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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,
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:42 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
` (6 subsequent siblings)
9 siblings, 2 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
* .suspend() and .resume() routines implemented in the driver
* aac_release_resources() initiates firmware shutdown
* aac_acquire_resources re-initializes the host interface
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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..e0a76d5 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_exact(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_exact(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..8020348 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(1);
+
+ 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
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (2 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 2/9] [SCSI] aacraid: Add Power Management support rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-16 11:33 ` Johannes Thumshirn
` (2 more replies)
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
` (5 subsequent siblings)
9 siblings, 3 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Enable MSI interrupt mode for series-6 controller.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/src.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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;
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (3 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-11 10:01 ` Johannes Thumshirn
` (2 more replies)
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
` (4 subsequent siblings)
9 siblings, 3 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
If writeq() not supported, then do atomic two 32bit write
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 e0a76d5..e4ff47e 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;
}
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (4 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-18 17:30 ` Rajinikanth Pandurangan
` (2 more replies)
2015-06-11 1:42 ` [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq rajinikanth.pandurangan
` (3 subsequent siblings)
9 siblings, 3 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
If 'IsFastPath' bit is set, then response path assumes no error
and skips error check.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 fe59b00..864e9f6 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)
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (5 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-16 11:40 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend rajinikanth.pandurangan
` (2 subsequent siblings)
9 siblings, 2 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Reset irq affinity hints before releasing IRQ
Removed duplicate code of IRQ acquire/release
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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;
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (6 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-16 11:41 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware rajinikanth.pandurangan
2015-06-11 1:42 ` [Patch V2 9/9] [SCSI] aacraid: Update driver version rajinikanth.pandurangan
9 siblings, 2 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Driver blocks ioctls once it received shutdown/suspend request during
suspend/hybernation. This patch unblocks ioctls on resume path.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 8020348..1142c28 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;
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (7 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-24 5:42 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 9/9] [SCSI] aacraid: Update driver version rajinikanth.pandurangan
9 siblings, 1 reply; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Controller BIOS/UEFI driver used to send this request. But for
IBM-Power system there is no BIOS/UEFI driver. So this change is
required for IBM, otherwise controller will be read-only mode.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/linit.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 1142c28..3df0dfb 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1270,8 +1270,11 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
shost->max_channel = aac->maximum_num_channels;
else
shost->max_channel = 0;
-
+#if defined(__powerpc__) || defined(__PPC__) || defined(__ppc__)
+ aac_get_config_status(aac, 1);
+#else
aac_get_config_status(aac, 0);
+#endif
aac_get_containers(aac);
list_add(&aac->entry, insert);
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Patch V2 9/9] [SCSI] aacraid: Update driver version
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
` (8 preceding siblings ...)
2015-06-11 1:42 ` [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware rajinikanth.pandurangan
@ 2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-16 11:43 ` Johannes Thumshirn
2015-06-24 5:42 ` Mahesh Rajashekhara
9 siblings, 2 replies; 35+ messages in thread
From: rajinikanth.pandurangan @ 2015-06-11 1:42 UTC (permalink / raw)
To: jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat, rajinikanth.pandurangan
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/aacraid.h | 2 +-
drivers/scsi/aacraid/linit.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 7b95227..73c3384 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
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 3df0dfb..1627928 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -56,7 +56,7 @@
#include "aacraid.h"
-#define AAC_DRIVER_VERSION "1.2-1"
+#define AAC_DRIVER_VERSION "1.2-2"
#ifndef AAC_DRIVER_BRANCH
#define AAC_DRIVER_BRANCH ""
#endif
--
1.9.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* Re: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
@ 2015-06-11 10:01 ` Johannes Thumshirn
2015-06-11 18:08 ` Rajinikanth Pandurangan
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 16:03 ` Tomas Henzl
2 siblings, 1 reply; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-11 10:01 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:26PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> If writeq() not supported, then do atomic two 32bit write
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 e0a76d5..e4ff47e 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;
> }
Why not make src_writeq() a wrapper over either writeq() or
spin_lock_irqsave(); src_writel() x2; spin_unlock_irqrestore(), depending on
the presence of writeq?
>
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
2015-06-11 10:01 ` Johannes Thumshirn
@ 2015-06-11 18:08 ` Rajinikanth Pandurangan
0 siblings, 0 replies; 35+ messages in thread
From: Rajinikanth Pandurangan @ 2015-06-11 18:08 UTC (permalink / raw)
To: Johannes Thumshirn
Cc: jbottomley, linux-scsi, aacraid, Harry Yang, Mahesh Rajashekhara,
Rich Bono, Achim Leubner, Murthy Bhat
Hello Johannes,
My comments are inline.
Thanks,
-Raj P.
-----Original Message-----
From: Johannes Thumshirn [mailto:jthumshirn@suse.de]
Sent: Thursday, June 11, 2015 3:02 AM
To: Rajinikanth Pandurangan
Cc: jbottomley@parallels.com; linux-scsi@vger.kernel.org; aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat
Subject: Re: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
On Wed, Jun 10, 2015 at 06:42:26PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> If writeq() not supported, then do atomic two 32bit write
>
> Signed-off-by: Rajinikanth Pandurangan
> <rajinikanth.pandurangan@pmcs.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 e0a76d5..e4ff47e 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;
> }
Why not make src_writeq() a wrapper over either writeq() or spin_lock_irqsave(); src_writel() x2; spin_unlock_irqrestore(), depending on the presence of writeq?
[RajP] Yes, agreed. Will include it in our next submission.
>
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi"
> in the body of a message to majordomo@vger.kernel.org More majordomo
> info at http://vger.kernel.org/majordomo-info.html
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
@ 2015-06-16 11:27 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:21 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-16 11:27 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:23PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Driver sends the right size of the response buffer.
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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,
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
@ 2015-06-16 11:33 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 16:01 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-16 11:33 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:25PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Enable MSI interrupt mode for series-6 controller.
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
> ---
> drivers/scsi/aacraid/src.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> 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;
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq
2015-06-11 1:42 ` [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq rajinikanth.pandurangan
@ 2015-06-16 11:40 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-16 11:40 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:28PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Reset irq affinity hints before releasing IRQ
> Removed duplicate code of IRQ acquire/release
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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;
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
2015-06-11 1:42 ` [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend rajinikanth.pandurangan
@ 2015-06-16 11:41 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-16 11:41 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:29PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Driver blocks ioctls once it received shutdown/suspend request during
> suspend/hybernation. This patch unblocks ioctls on resume path.
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 8020348..1142c28 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;
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 9/9] [SCSI] aacraid: Update driver version
2015-06-11 1:42 ` [Patch V2 9/9] [SCSI] aacraid: Update driver version rajinikanth.pandurangan
@ 2015-06-16 11:43 ` Johannes Thumshirn
2015-06-24 5:42 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Johannes Thumshirn @ 2015-06-16 11:43 UTC (permalink / raw)
To: rajinikanth.pandurangan
Cc: jbottomley, linux-scsi, aacraid, harry.yang, mahesh.rajashekhara,
rich.bono, achim.leubner, murthy.bhat
On Wed, Jun 10, 2015 at 06:42:31PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
> ---
> drivers/scsi/aacraid/aacraid.h | 2 +-
> drivers/scsi/aacraid/linit.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 7b95227..73c3384 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
> diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
> index 3df0dfb..1627928 100644
> --- a/drivers/scsi/aacraid/linit.c
> +++ b/drivers/scsi/aacraid/linit.c
> @@ -56,7 +56,7 @@
>
> #include "aacraid.h"
>
> -#define AAC_DRIVER_VERSION "1.2-1"
> +#define AAC_DRIVER_VERSION "1.2-2"
> #ifndef AAC_DRIVER_BRANCH
> #define AAC_DRIVER_BRANCH ""
> #endif
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
@ 2015-06-18 17:30 ` Rajinikanth Pandurangan
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 18:05 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Rajinikanth Pandurangan @ 2015-06-18 17:30 UTC (permalink / raw)
To: jbottomley, linux-scsi, Johannes Thumshirn (jthumshirn@suse.de)
Cc: aacraid, Harry Yang, Mahesh Rajashekhara, Rich Bono,
Achim Leubner, Murthy Bhat
Hi,
Any review comments on this patch. please let us known if any changes are required.
Thanks,
-Raj P.
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Wednesday, June 10, 2015 6:42 PM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
If 'IsFastPath' bit is set, then response path assumes no error
and skips error check.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 fe59b00..864e9f6 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)
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
2015-06-16 11:27 ` Johannes Thumshirn
@ 2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:21 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:40 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Driver sends the right size of the response buffer.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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,
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
2015-06-11 1:42 ` [Patch V2 2/9] [SCSI] aacraid: Add Power Management support rajinikanth.pandurangan
@ 2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:42 ` Tomas Henzl
1 sibling, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:40 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
* .suspend() and .resume() routines implemented in the driver
* aac_release_resources() initiates firmware shutdown
* aac_acquire_resources re-initializes the host interface
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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..e0a76d5 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_exact(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_exact(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..8020348 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(1);
+
+ 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
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
2015-06-16 11:33 ` Johannes Thumshirn
@ 2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 16:01 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:40 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Enable MSI interrupt mode for series-6 controller.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/src.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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;
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
2015-06-11 10:01 ` Johannes Thumshirn
@ 2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 16:03 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:41 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
If writeq() not supported, then do atomic two 32bit write
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 e0a76d5..e4ff47e 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;
}
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
2015-06-18 17:30 ` Rajinikanth Pandurangan
@ 2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 18:05 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:41 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
If 'IsFastPath' bit is set, then response path assumes no error
and skips error check.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 fe59b00..864e9f6 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)
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq
2015-06-11 1:42 ` [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq rajinikanth.pandurangan
2015-06-16 11:40 ` Johannes Thumshirn
@ 2015-06-24 5:41 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:41 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Reset irq affinity hints before releasing IRQ
Removed duplicate code of IRQ acquire/release
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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;
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
2015-06-11 1:42 ` [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend rajinikanth.pandurangan
2015-06-16 11:41 ` Johannes Thumshirn
@ 2015-06-24 5:41 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:41 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:12 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Driver blocks ioctls once it received shutdown/suspend request during
suspend/hybernation. This patch unblocks ioctls on resume path.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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 8020348..1142c28 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;
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware
2015-06-11 1:42 ` [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware rajinikanth.pandurangan
@ 2015-06-24 5:42 ` Mahesh Rajashekhara
0 siblings, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:42 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:13 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Description:
Controller BIOS/UEFI driver used to send this request. But for
IBM-Power system there is no BIOS/UEFI driver. So this change is
required for IBM, otherwise controller will be read-only mode.
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/linit.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 1142c28..3df0dfb 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1270,8 +1270,11 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
shost->max_channel = aac->maximum_num_channels;
else
shost->max_channel = 0;
-
+#if defined(__powerpc__) || defined(__PPC__) || defined(__ppc__)
+ aac_get_config_status(aac, 1);
+#else
aac_get_config_status(aac, 0);
+#endif
aac_get_containers(aac);
list_add(&aac->entry, insert);
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 9/9] [SCSI] aacraid: Update driver version
2015-06-11 1:42 ` [Patch V2 9/9] [SCSI] aacraid: Update driver version rajinikanth.pandurangan
2015-06-16 11:43 ` Johannes Thumshirn
@ 2015-06-24 5:42 ` Mahesh Rajashekhara
1 sibling, 0 replies; 35+ messages in thread
From: Mahesh Rajashekhara @ 2015-06-24 5:42 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Rich Bono, Achim Leubner, Murthy Bhat
Reviewed-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
-----Original Message-----
From: Rajinikanth Pandurangan
Sent: Thursday, June 11, 2015 7:13 AM
To: jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat; Rajinikanth Pandurangan
Subject: [Patch V2 9/9] [SCSI] aacraid: Update driver version
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
---
drivers/scsi/aacraid/aacraid.h | 2 +-
drivers/scsi/aacraid/linit.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 7b95227..73c3384 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
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 3df0dfb..1627928 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -56,7 +56,7 @@
#include "aacraid.h"
-#define AAC_DRIVER_VERSION "1.2-1"
+#define AAC_DRIVER_VERSION "1.2-2"
#ifndef AAC_DRIVER_BRANCH
#define AAC_DRIVER_BRANCH ""
#endif
--
1.9.3
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
2015-06-16 11:27 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
@ 2015-06-25 15:21 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 15:21 UTC (permalink / raw)
To: rajinikanth.pandurangan, jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Driver sends the right size of the response buffer.
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Tomas
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
2015-06-11 1:42 ` [Patch V2 2/9] [SCSI] aacraid: Add Power Management support rajinikanth.pandurangan
2015-06-24 5:40 ` Mahesh Rajashekhara
@ 2015-06-25 15:42 ` Tomas Henzl
2015-06-25 16:54 ` Rajinikanth Pandurangan
1 sibling, 1 reply; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 15:42 UTC (permalink / raw)
To: rajinikanth.pandurangan, jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> * .suspend() and .resume() routines implemented in the driver
> * aac_release_resources() initiates firmware shutdown
> * aac_acquire_resources re-initializes the host interface
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.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..e0a76d5 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_exact(dev->pdev,
> + dev->msixentry,
> + msi_count);
> + /* Che
Hi,
pci_enable_msix_exact returns either an error value or 0.
Maybe what you wanted is pci_enable_msix_range (...., 1, msi_count);
Please do not make silent changes like this,
without describing it - it looks like only a whole code
block was moved.
Also there is a rule which should be followed, that is that
every single functional change need it's own patch.
When you send a new version of any patch add a description
what is new in that newer version.
Cheers,
Tomas
ck how many MSIX vectors are allocated */
> + if (i >= 0) {
> + dev->msi_enabled = 1;
> + if (i) {
> + msi_count = i;
> + if (pci_enable_msix_exact(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..8020348 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(1);
> +
> + 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
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
2015-06-16 11:33 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
@ 2015-06-25 16:01 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 16:01 UTC (permalink / raw)
To: rajinikanth.pandurangan, jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> Enable MSI interrupt mode for series-6 controller.
What seem problematic to me is that you still keep the module
option 'aac_msi' and a poor user might try
"IRQ handling. 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)");
to manipulate the driver naturally withou any success.
Please either change the above description or add a new
option so it is not confusing.
Btw msi-x is now supported?
Cheers,
Tomas
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
> ---
> drivers/scsi/aacraid/src.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> 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;
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
2015-06-11 10:01 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
@ 2015-06-25 16:03 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 16:03 UTC (permalink / raw)
To: rajinikanth.pandurangan, jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> If writeq() not supported, then do atomic two 32bit write
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Tomas
^ permalink raw reply [flat|nested] 35+ messages in thread
* RE: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
2015-06-25 15:42 ` Tomas Henzl
@ 2015-06-25 16:54 ` Rajinikanth Pandurangan
2015-06-25 17:52 ` Tomas Henzl
0 siblings, 1 reply; 35+ messages in thread
From: Rajinikanth Pandurangan @ 2015-06-25 16:54 UTC (permalink / raw)
To: Tomas Henzl, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Mahesh Rajashekhara, Rich Bono,
Achim Leubner, Murthy Bhat
Hello Tomas,
Please see my response below.
Thanks,
-Raj P.
-----Original Message-----
From: Tomas Henzl [mailto:thenzl@redhat.com]
Sent: Thursday, June 25, 2015 8:43 AM
To: Rajinikanth Pandurangan; jbottomley@parallels.com; linux-scsi@vger.kernel.org
Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat
Subject: Re: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> * .suspend() and .resume() routines implemented in the driver
> * aac_release_resources() initiates firmware shutdown
> * aac_acquire_resources re-initializes the host interface
>
> Signed-off-by: Rajinikanth Pandurangan
> <rajinikanth.pandurangan@pmcs.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..e0a76d5 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_exact(dev->pdev,
> + dev->msixentry,
> + msi_count);
> + /* Che
Hi,
pci_enable_msix_exact returns either an error value or 0.
Maybe what you wanted is pci_enable_msix_range (...., 1, msi_count);
Please do not make silent changes like this, without describing it - it looks like only a whole code block was moved.
Also there is a rule which should be followed, that is that every single functional change need it's own patch.
When you send a new version of any patch add a description what is new in that newer version.
[RajP] Yes, original intention was just to move the whole code block up. But when you reviewed my V1, you suggested to change pci_enable_msix() as it's deprecated. So I made this change in my V2, and I included the following in my description but missed in this particular.
======================
V2:
* Removed IRQF_DISABLED
* Removed unwanted macro definition "sa_writeq"
* Replaced pci_enable_msix()with "pci_enable_msix_exact()"
================
Thanks,
-Raj P
Cheers,
Tomas
ck how many MSIX vectors are allocated */
> + if (i >= 0) {
> + dev->msi_enabled = 1;
> + if (i) {
> + msi_count = i;
> + if (pci_enable_msix_exact(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..8020348 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(1);
> +
> + 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
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
2015-06-25 16:54 ` Rajinikanth Pandurangan
@ 2015-06-25 17:52 ` Tomas Henzl
0 siblings, 0 replies; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 17:52 UTC (permalink / raw)
To: Rajinikanth Pandurangan, jbottomley, linux-scsi
Cc: aacraid, Harry Yang, Mahesh Rajashekhara, Rich Bono,
Achim Leubner, Murthy Bhat
On 06/25/2015 06:54 PM, Rajinikanth Pandurangan wrote:
> Hello Tomas,
>
> Please see my response below.
>
> Thanks,
> -Raj P.
>
> -----Original Message-----
> From: Tomas Henzl [mailto:thenzl@redhat.com]
> Sent: Thursday, June 25, 2015 8:43 AM
> To: Rajinikanth Pandurangan; jbottomley@parallels.com; linux-scsi@vger.kernel.org
> Cc: aacraid@pmc-sierra.com; Harry Yang; Mahesh Rajashekhara; Rich Bono; Achim Leubner; Murthy Bhat
> Subject: Re: [Patch V2 2/9] [SCSI] aacraid: Add Power Management support
>
> On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
>> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>>
>> Description:
>> * .suspend() and .resume() routines implemented in the driver
>> * aac_release_resources() initiates firmware shutdown
>> * aac_acquire_resources re-initializes the host interface
>>
>> Signed-off-by: Rajinikanth Pandurangan
>> <rajinikanth.pandurangan@pmcs.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..e0a76d5 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_exact(dev->pdev,
>> + dev->msixentry,
>> + msi_count);
>> + /* Che
> Hi,
> pci_enable_msix_exact returns either an error value or 0.
> Maybe what you wanted is pci_enable_msix_range (...., 1, msi_count);
>
> Please do not make silent changes like this, without describing it - it looks like only a whole code block was moved.
> Also there is a rule which should be followed, that is that every single functional change need it's own patch.
>
> When you send a new version of any patch add a description what is new in that newer version.
>
> [RajP] Yes, original intention was just to move the whole code block up. But when you reviewed my V1, you suggested to change pci_enable_msix() as it's deprecated. So I made this change in my V2, and I included the following in my description but missed in this particular.
Yes, I found the description in 0/9 later, if you place
the description in each patch even distracted people
like me will find it :)
And I suggested the switch to the newer functions, but not
as a one to one replacement. Please in a new version keep in this patch
the 'pci_enable_msix' and add to the series a new patch
which will replace it with pci_enable_msix_exact or pci_enable_msix_range.
The way how you use it now is wrong.
>
> ======================
> V2:
> * Removed IRQF_DISABLED
> * Removed unwanted macro definition "sa_writeq"
> * Replaced pci_enable_msix()with "pci_enable_msix_exact()"
> ================
> Thanks,
> -Raj P
>
> Cheers,
> Tomas
>
> ck how many MSIX vectors are allocated */
>> + if (i >= 0) {
>> + dev->msi_enabled = 1;
>> + if (i) {
>> + msi_count = i;
>> + if (pci_enable_msix_exact(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..8020348 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(1);
>> +
>> + 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
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
2015-06-18 17:30 ` Rajinikanth Pandurangan
2015-06-24 5:41 ` Mahesh Rajashekhara
@ 2015-06-25 18:05 ` Tomas Henzl
2 siblings, 0 replies; 35+ messages in thread
From: Tomas Henzl @ 2015-06-25 18:05 UTC (permalink / raw)
To: rajinikanth.pandurangan, jbottomley, linux-scsi
Cc: aacraid, harry.yang, mahesh.rajashekhara, rich.bono,
achim.leubner, murthy.bhat
On 06/11/2015 03:42 AM, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
>
> Description:
> If 'IsFastPath' bit is set, then response path assumes no error
> and skips error check.
>
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
> ---
> drivers/scsi/aacraid/aachba.c | 259 ++++++++++++++++++++++--------------------
> 1 file changed, 137 insertions(+), 122 deletions(-)
>
With this patch applied we get :
if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
/* fast response */
srbreply->srb_status = cpu_to_le32(SRB_STATUS_SUCCESS);
srbreply->scsi_status = cpu_to_le32(SAM_STAT_GOOD);
} else {
/*
* Calculate resid for sg
*/
....
}
/*
* OR in the scsi status (already shifted up a bit)
*/
scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
aac_fib_complete(fibptr);
aac_fib_free(fibptr);
scsicmd->scsi_done(scsicmd);
}
>From that it looks like you do not need set
srbreply->srb_status = cpu_to_le32(SRB_STATUS_SUCCESS);
because it's never used later.
You could you rearrange it to :
if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
/* fast response */
srbreply->scsi_status = cpu_to_le32(SAM_STAT_GOOD);
goto done;
}
/*
* Calculate resid for sg
*/
....
done:
/*
* OR in the scsi status (already shifted up a bit)
*/
scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
aac_fib_complete(fibptr);
aac_fib_free(fibptr);
scsicmd->scsi_done(scsicmd);
The advantage is that you don't need move ~150 lines one tab to
the right and don't have to wrap lines because of the 80 char limit.
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index fe59b00..864e9f6 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)
>
^ permalink raw reply [flat|nested] 35+ messages in thread
end of thread, other threads:[~2015-06-25 18:05 UTC | newest]
Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-11 1:42 [Patch V2 0/9] [SCSI] aacraid: Patchset for aacraid driver version 41010 rajinikanth.pandurangan
2015-06-11 1:42 ` rajinikanth.pandurangan
2015-06-11 1:42 ` [Patch V2 1/9] [SCSI] aacraid: Fix for logical device name and UID not exposed to the OS rajinikanth.pandurangan
2015-06-16 11:27 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:21 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 2/9] [SCSI] aacraid: Add Power Management support rajinikanth.pandurangan
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 15:42 ` Tomas Henzl
2015-06-25 16:54 ` Rajinikanth Pandurangan
2015-06-25 17:52 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 3/9] [SCSI] aacraid: Enable MSI interrupt for series-6 controller rajinikanth.pandurangan
2015-06-16 11:33 ` Johannes Thumshirn
2015-06-24 5:40 ` Mahesh Rajashekhara
2015-06-25 16:01 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 4/9] [SCSI] aacraid: Enable 64-bit write to controller register rajinikanth.pandurangan
2015-06-11 10:01 ` Johannes Thumshirn
2015-06-11 18:08 ` Rajinikanth Pandurangan
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 16:03 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 5/9] [SCSI] aacraid: Tune response path if IsFastPath bit set rajinikanth.pandurangan
2015-06-18 17:30 ` Rajinikanth Pandurangan
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-25 18:05 ` Tomas Henzl
2015-06-11 1:42 ` [Patch V2 6/9] [SCSI] aacraid: Reset irq affinity hints before releasing irq rajinikanth.pandurangan
2015-06-16 11:40 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 7/9] [SCSI] aacraid: Unblock IOCTLs to controller once system resumed from suspend rajinikanth.pandurangan
2015-06-16 11:41 ` Johannes Thumshirn
2015-06-24 5:41 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 8/9] [SCSI] aacraid: Send commit-config to controller firmware rajinikanth.pandurangan
2015-06-24 5:42 ` Mahesh Rajashekhara
2015-06-11 1:42 ` [Patch V2 9/9] [SCSI] aacraid: Update driver version rajinikanth.pandurangan
2015-06-16 11:43 ` Johannes Thumshirn
2015-06-24 5:42 ` Mahesh Rajashekhara
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.