|
|
a8a466 |
From 081008132942c3c50c43d1fded60080cfa8cda91 Mon Sep 17 00:00:00 2001
|
|
|
a8a466 |
From: Suganath Prabu Subramani <suganath-prabu.subramani@broadcom.com>
|
|
|
a8a466 |
Date: Wed, 26 Oct 2016 13:34:40 +0530
|
|
|
a8a466 |
Subject: [PATCH 09/11] scsi: mpt3sas: Use the new MPI 2.6 32-bit Atomic
|
|
|
a8a466 |
Request Descriptors for SAS35 devices.
|
|
|
a8a466 |
|
|
|
a8a466 |
Support Atomic Request Descriptors for Ventura/SAS35 devices.
|
|
|
a8a466 |
|
|
|
a8a466 |
Signed-off-by: Chaitra P B <chaitra.basappa@broadcom.com>
|
|
|
a8a466 |
Signed-off-by: Sathya Prakash <sathya.prakash@broadcom.com>
|
|
|
a8a466 |
Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
|
|
|
a8a466 |
Reviewed-by: Hannes Reinecke <hare@suse.com>
|
|
|
a8a466 |
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
|
|
|
a8a466 |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
|
a8a466 |
---
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_base.c | 141 +++++++++++++++++++++++++++----
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_base.h | 18 ++--
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_config.c | 2 +-
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_ctl.c | 22 ++---
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_scsih.c | 24 +++---
|
|
|
a8a466 |
drivers/scsi/mpt3sas/mpt3sas_transport.c | 8 +-
|
|
|
a8a466 |
6 files changed, 161 insertions(+), 54 deletions(-)
|
|
|
a8a466 |
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
|
a8a466 |
index b26fa23..9ef253b 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
|
a8a466 |
@@ -850,7 +850,7 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 msix_index, u32 reply)
|
|
|
a8a466 |
ack_request->EventContext = mpi_reply->EventContext;
|
|
|
a8a466 |
ack_request->VF_ID = 0; /* TODO */
|
|
|
a8a466 |
ack_request->VP_ID = 0;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
|
|
|
a8a466 |
out:
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -2454,15 +2454,15 @@ _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
|
|
|
a8a466 |
#endif
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
- * mpt3sas_base_put_smid_scsi_io - send SCSI_IO request to firmware
|
|
|
a8a466 |
+ * _base_put_smid_scsi_io - send SCSI_IO request to firmware
|
|
|
a8a466 |
* @ioc: per adapter object
|
|
|
a8a466 |
* @smid: system request message index
|
|
|
a8a466 |
* @handle: device handle
|
|
|
a8a466 |
*
|
|
|
a8a466 |
* Return nothing.
|
|
|
a8a466 |
*/
|
|
|
a8a466 |
-void
|
|
|
a8a466 |
-mpt3sas_base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 handle)
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 handle)
|
|
|
a8a466 |
{
|
|
|
a8a466 |
Mpi2RequestDescriptorUnion_t descriptor;
|
|
|
a8a466 |
u64 *request = (u64 *)&descriptor;
|
|
|
a8a466 |
@@ -2478,15 +2478,15 @@ mpt3sas_base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 handle)
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
- * mpt3sas_base_put_smid_fast_path - send fast path request to firmware
|
|
|
a8a466 |
+ * _base_put_smid_fast_path - send fast path request to firmware
|
|
|
a8a466 |
* @ioc: per adapter object
|
|
|
a8a466 |
* @smid: system request message index
|
|
|
a8a466 |
* @handle: device handle
|
|
|
a8a466 |
*
|
|
|
a8a466 |
* Return nothing.
|
|
|
a8a466 |
*/
|
|
|
a8a466 |
-void
|
|
|
a8a466 |
-mpt3sas_base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
u16 handle)
|
|
|
a8a466 |
{
|
|
|
a8a466 |
Mpi2RequestDescriptorUnion_t descriptor;
|
|
|
a8a466 |
@@ -2503,14 +2503,14 @@ mpt3sas_base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
- * mpt3sas_base_put_smid_hi_priority - send Task Managment request to firmware
|
|
|
a8a466 |
+ * _base_put_smid_hi_priority - send Task Management request to firmware
|
|
|
a8a466 |
* @ioc: per adapter object
|
|
|
a8a466 |
* @smid: system request message index
|
|
|
a8a466 |
* @msix_task: msix_task will be same as msix of IO incase of task abort else 0.
|
|
|
a8a466 |
* Return nothing.
|
|
|
a8a466 |
*/
|
|
|
a8a466 |
-void
|
|
|
a8a466 |
-mpt3sas_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
u16 msix_task)
|
|
|
a8a466 |
{
|
|
|
a8a466 |
Mpi2RequestDescriptorUnion_t descriptor;
|
|
|
a8a466 |
@@ -2527,14 +2527,14 @@ mpt3sas_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
- * mpt3sas_base_put_smid_default - Default, primarily used for config pages
|
|
|
a8a466 |
+ * _base_put_smid_default - Default, primarily used for config pages
|
|
|
a8a466 |
* @ioc: per adapter object
|
|
|
a8a466 |
* @smid: system request message index
|
|
|
a8a466 |
*
|
|
|
a8a466 |
* Return nothing.
|
|
|
a8a466 |
*/
|
|
|
a8a466 |
-void
|
|
|
a8a466 |
-mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
|
|
a8a466 |
{
|
|
|
a8a466 |
Mpi2RequestDescriptorUnion_t descriptor;
|
|
|
a8a466 |
u64 *request = (u64 *)&descriptor;
|
|
|
a8a466 |
@@ -2549,6 +2549,95 @@ mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
+* _base_put_smid_scsi_io_atomic - send SCSI_IO request to firmware using
|
|
|
a8a466 |
+* Atomic Request Descriptor
|
|
|
a8a466 |
+* @ioc: per adapter object
|
|
|
a8a466 |
+* @smid: system request message index
|
|
|
a8a466 |
+* @handle: device handle, unused in this function, for function type match
|
|
|
a8a466 |
+*
|
|
|
a8a466 |
+* Return nothing.
|
|
|
a8a466 |
+*/
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_scsi_io_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+ u16 handle)
|
|
|
a8a466 |
+{
|
|
|
a8a466 |
+ Mpi26AtomicRequestDescriptor_t descriptor;
|
|
|
a8a466 |
+ u32 *request = (u32 *)&descriptor;
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
|
|
|
a8a466 |
+ descriptor.MSIxIndex = _base_get_msix_index(ioc);
|
|
|
a8a466 |
+ descriptor.SMID = cpu_to_le16(smid);
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
|
|
a8a466 |
+}
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+/**
|
|
|
a8a466 |
+ * _base_put_smid_fast_path_atomic - send fast path request to firmware
|
|
|
a8a466 |
+ * using Atomic Request Descriptor
|
|
|
a8a466 |
+ * @ioc: per adapter object
|
|
|
a8a466 |
+ * @smid: system request message index
|
|
|
a8a466 |
+ * @handle: device handle, unused in this function, for function type match
|
|
|
a8a466 |
+ * Return nothing
|
|
|
a8a466 |
+ */
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_fast_path_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+ u16 handle)
|
|
|
a8a466 |
+{
|
|
|
a8a466 |
+ Mpi26AtomicRequestDescriptor_t descriptor;
|
|
|
a8a466 |
+ u32 *request = (u32 *)&descriptor;
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ descriptor.RequestFlags = MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO;
|
|
|
a8a466 |
+ descriptor.MSIxIndex = _base_get_msix_index(ioc);
|
|
|
a8a466 |
+ descriptor.SMID = cpu_to_le16(smid);
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
|
|
a8a466 |
+}
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+/**
|
|
|
a8a466 |
+ * _base_put_smid_hi_priority_atomic - send Task Management request to
|
|
|
a8a466 |
+ * firmware using Atomic Request Descriptor
|
|
|
a8a466 |
+ * @ioc: per adapter object
|
|
|
a8a466 |
+ * @smid: system request message index
|
|
|
a8a466 |
+ * @msix_task: msix_task will be same as msix of IO incase of task abort else 0
|
|
|
a8a466 |
+ *
|
|
|
a8a466 |
+ * Return nothing.
|
|
|
a8a466 |
+ */
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_hi_priority_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+ u16 msix_task)
|
|
|
a8a466 |
+{
|
|
|
a8a466 |
+ Mpi26AtomicRequestDescriptor_t descriptor;
|
|
|
a8a466 |
+ u32 *request = (u32 *)&descriptor;
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
|
|
|
a8a466 |
+ descriptor.MSIxIndex = msix_task;
|
|
|
a8a466 |
+ descriptor.SMID = cpu_to_le16(smid);
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
|
|
a8a466 |
+}
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+/**
|
|
|
a8a466 |
+ * _base_put_smid_default - Default, primarily used for config pages
|
|
|
a8a466 |
+ * use Atomic Request Descriptor
|
|
|
a8a466 |
+ * @ioc: per adapter object
|
|
|
a8a466 |
+ * @smid: system request message index
|
|
|
a8a466 |
+ *
|
|
|
a8a466 |
+ * Return nothing.
|
|
|
a8a466 |
+ */
|
|
|
a8a466 |
+static void
|
|
|
a8a466 |
+_base_put_smid_default_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
|
|
a8a466 |
+{
|
|
|
a8a466 |
+ Mpi26AtomicRequestDescriptor_t descriptor;
|
|
|
a8a466 |
+ u32 *request = (u32 *)&descriptor;
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
|
|
|
a8a466 |
+ descriptor.MSIxIndex = _base_get_msix_index(ioc);
|
|
|
a8a466 |
+ descriptor.SMID = cpu_to_le16(smid);
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+ writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
|
|
a8a466 |
+}
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+/**
|
|
|
a8a466 |
* _base_display_OEMs_branding - Display branding string
|
|
|
a8a466 |
* @ioc: per adapter object
|
|
|
a8a466 |
*
|
|
|
a8a466 |
@@ -4058,7 +4147,7 @@ mpt3sas_base_sas_iounit_control(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
mpi_request->Operation == MPI2_SAS_OP_PHY_LINK_RESET)
|
|
|
a8a466 |
ioc->ioc_link_reset_in_progress = 1;
|
|
|
a8a466 |
init_completion(&ioc->base_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
|
|
a8a466 |
msecs_to_jiffies(10000));
|
|
|
a8a466 |
if ((mpi_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET ||
|
|
|
a8a466 |
@@ -4160,7 +4249,7 @@ mpt3sas_base_scsi_enclosure_processor(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
ioc->base_cmds.smid = smid;
|
|
|
a8a466 |
memcpy(request, mpi_request, sizeof(Mpi2SepReply_t));
|
|
|
a8a466 |
init_completion(&ioc->base_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
|
|
a8a466 |
msecs_to_jiffies(10000));
|
|
|
a8a466 |
if (!(ioc->base_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
@@ -4351,6 +4440,8 @@ _base_get_ioc_facts(struct MPT3SAS_ADAPTER *ioc, int sleep_flag)
|
|
|
a8a466 |
if ((facts->IOCCapabilities &
|
|
|
a8a466 |
MPI2_IOCFACTS_CAPABILITY_RDPQ_ARRAY_CAPABLE))
|
|
|
a8a466 |
ioc->rdpq_array_capable = 1;
|
|
|
a8a466 |
+ if (facts->IOCCapabilities & MPI26_IOCFACTS_CAPABILITY_ATOMIC_REQ)
|
|
|
a8a466 |
+ ioc->atomic_desc_capable = 1;
|
|
|
a8a466 |
facts->FWVersion.Word = le32_to_cpu(mpi_reply.FWVersion.Word);
|
|
|
a8a466 |
facts->IOCRequestFrameSize =
|
|
|
a8a466 |
le16_to_cpu(mpi_reply.IOCRequestFrameSize);
|
|
|
a8a466 |
@@ -4582,7 +4673,7 @@ _base_send_port_enable(struct MPT3SAS_ADAPTER *ioc, int sleep_flag)
|
|
|
a8a466 |
mpi_request->Function = MPI2_FUNCTION_PORT_ENABLE;
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->port_enable_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->port_enable_cmds.done,
|
|
|
a8a466 |
300*HZ);
|
|
|
a8a466 |
if (!(ioc->port_enable_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
@@ -4646,7 +4737,7 @@ mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc)
|
|
|
a8a466 |
memset(mpi_request, 0, sizeof(Mpi2PortEnableRequest_t));
|
|
|
a8a466 |
mpi_request->Function = MPI2_FUNCTION_PORT_ENABLE;
|
|
|
a8a466 |
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
return 0;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -4767,7 +4858,7 @@ _base_event_notification(struct MPT3SAS_ADAPTER *ioc, int sleep_flag)
|
|
|
a8a466 |
mpi_request->EventMasks[i] =
|
|
|
a8a466 |
cpu_to_le32(ioc->event_masks[i]);
|
|
|
a8a466 |
init_completion(&ioc->base_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, 30*HZ);
|
|
|
a8a466 |
if (!(ioc->base_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
pr_err(MPT3SAS_FMT "%s: timeout\n",
|
|
|
a8a466 |
@@ -5316,9 +5407,23 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
|
|
|
a8a466 |
ioc->build_sg = &_base_build_sg_ieee;
|
|
|
a8a466 |
ioc->build_zero_len_sge = &_base_build_zero_len_sge_ieee;
|
|
|
a8a466 |
ioc->sge_size_ieee = sizeof(Mpi2IeeeSgeSimple64_t);
|
|
|
a8a466 |
+
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
+ if (ioc->atomic_desc_capable) {
|
|
|
a8a466 |
+ ioc->put_smid_default = &_base_put_smid_default_atomic;
|
|
|
a8a466 |
+ ioc->put_smid_scsi_io = &_base_put_smid_scsi_io_atomic;
|
|
|
a8a466 |
+ ioc->put_smid_fast_path = &_base_put_smid_fast_path_atomic;
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority = &_base_put_smid_hi_priority_atomic;
|
|
|
a8a466 |
+ } else {
|
|
|
a8a466 |
+ ioc->put_smid_default = &_base_put_smid_default;
|
|
|
a8a466 |
+ ioc->put_smid_scsi_io = &_base_put_smid_scsi_io;
|
|
|
a8a466 |
+ ioc->put_smid_fast_path = &_base_put_smid_fast_path;
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority = &_base_put_smid_hi_priority;
|
|
|
a8a466 |
+ }
|
|
|
a8a466 |
+
|
|
|
a8a466 |
+
|
|
|
a8a466 |
/*
|
|
|
a8a466 |
* These function pointers for other requests that don't
|
|
|
a8a466 |
* the require IEEE scatter gather elements.
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
|
|
|
a8a466 |
index 240c360..b8c8be4 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
|
|
|
a8a466 |
@@ -740,7 +740,10 @@ typedef void (*MPT_BUILD_SG)(struct MPT3SAS_ADAPTER *ioc, void *psge,
|
|
|
a8a466 |
typedef void (*MPT_BUILD_ZERO_LEN_SGE)(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
void *paddr);
|
|
|
a8a466 |
|
|
|
a8a466 |
-
|
|
|
a8a466 |
+/* To support atomic and non atomic descriptors*/
|
|
|
a8a466 |
+typedef void (*PUT_SMID_IO_FP_HIP) (struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
+ u16 funcdep);
|
|
|
a8a466 |
+typedef void (*PUT_SMID_DEFAULT) (struct MPT3SAS_ADAPTER *ioc, u16 smid);
|
|
|
a8a466 |
|
|
|
a8a466 |
/* IOC Facts and Port Facts converted from little endian to cpu */
|
|
|
a8a466 |
union mpi3_version_union {
|
|
|
a8a466 |
@@ -1208,6 +1211,12 @@ struct MPT3SAS_ADAPTER {
|
|
|
a8a466 |
void *device_remove_in_progress;
|
|
|
a8a466 |
u16 device_remove_in_progress_sz;
|
|
|
a8a466 |
u8 is_gen35_ioc;
|
|
|
a8a466 |
+ u8 atomic_desc_capable;
|
|
|
a8a466 |
+ PUT_SMID_IO_FP_HIP put_smid_scsi_io;
|
|
|
a8a466 |
+ PUT_SMID_IO_FP_HIP put_smid_fast_path;
|
|
|
a8a466 |
+ PUT_SMID_IO_FP_HIP put_smid_hi_priority;
|
|
|
a8a466 |
+ PUT_SMID_DEFAULT put_smid_default;
|
|
|
a8a466 |
+
|
|
|
a8a466 |
};
|
|
|
a8a466 |
|
|
|
a8a466 |
typedef u8 (*MPT_CALLBACK)(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
|
|
|
a8a466 |
@@ -1253,13 +1262,6 @@ u16 mpt3sas_base_get_smid_scsiio(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx,
|
|
|
a8a466 |
|
|
|
a8a466 |
u16 mpt3sas_base_get_smid(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx);
|
|
|
a8a466 |
void mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid);
|
|
|
a8a466 |
-void mpt3sas_base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
- u16 handle);
|
|
|
a8a466 |
-void mpt3sas_base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
|
|
a8a466 |
- u16 handle);
|
|
|
a8a466 |
-void mpt3sas_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
- u16 smid, u16 msix_task);
|
|
|
a8a466 |
-void mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid);
|
|
|
a8a466 |
void mpt3sas_base_initialize_callback_handler(void);
|
|
|
a8a466 |
u8 mpt3sas_base_register_callback_handler(MPT_CALLBACK cb_func);
|
|
|
a8a466 |
void mpt3sas_base_release_callback_handler(u8 cb_idx);
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_config.c b/drivers/scsi/mpt3sas/mpt3sas_config.c
|
|
|
a8a466 |
index a6914ec..b024e14 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_config.c
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_config.c
|
|
|
a8a466 |
@@ -385,7 +385,7 @@ _config_request(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|
|
a8a466 |
memcpy(config_request, mpi_request, sizeof(Mpi2ConfigRequest_t));
|
|
|
a8a466 |
_config_display_some_debug(ioc, smid, "config_request", NULL);
|
|
|
a8a466 |
init_completion(&ioc->config_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->config_cmds.done,
|
|
|
a8a466 |
timeout*HZ);
|
|
|
a8a466 |
if (!(ioc->config_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
|
a8a466 |
index a66c0c8..8273e8c 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
|
a8a466 |
@@ -813,9 +813,9 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
ioc->build_sg(ioc, psge, data_out_dma, data_out_sz,
|
|
|
a8a466 |
data_in_dma, data_in_sz);
|
|
|
a8a466 |
if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST)
|
|
|
a8a466 |
- mpt3sas_base_put_smid_scsi_io(ioc, smid, device_handle);
|
|
|
a8a466 |
+ ioc->put_smid_scsi_io(ioc, smid, device_handle);
|
|
|
a8a466 |
else
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_SCSI_TASK_MGMT:
|
|
|
a8a466 |
@@ -850,7 +850,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
tm_request->DevHandle));
|
|
|
a8a466 |
ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz,
|
|
|
a8a466 |
data_in_dma, data_in_sz);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_SMP_PASSTHROUGH:
|
|
|
a8a466 |
@@ -881,7 +881,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
}
|
|
|
a8a466 |
ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma,
|
|
|
a8a466 |
data_in_sz);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_SATA_PASSTHROUGH:
|
|
|
a8a466 |
@@ -896,7 +896,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
}
|
|
|
a8a466 |
ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma,
|
|
|
a8a466 |
data_in_sz);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_FW_DOWNLOAD:
|
|
|
a8a466 |
@@ -904,7 +904,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
{
|
|
|
a8a466 |
ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma,
|
|
|
a8a466 |
data_in_sz);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_TOOLBOX:
|
|
|
a8a466 |
@@ -919,7 +919,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz,
|
|
|
a8a466 |
data_in_dma, data_in_sz);
|
|
|
a8a466 |
}
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
case MPI2_FUNCTION_SAS_IO_UNIT_CONTROL:
|
|
|
a8a466 |
@@ -938,7 +938,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
|
|
|
a8a466 |
default:
|
|
|
a8a466 |
ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz,
|
|
|
a8a466 |
data_in_dma, data_in_sz);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
break;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -1533,7 +1533,7 @@ _ctl_diag_register_2(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
cpu_to_le32(ioc->product_specific[buffer_type][i]);
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->ctl_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
|
|
a8a466 |
MPT3_IOCTL_DEFAULT_TIMEOUT*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -1882,7 +1882,7 @@ mpt3sas_send_diag_release(struct MPT3SAS_ADAPTER *ioc, u8 buffer_type,
|
|
|
a8a466 |
mpi_request->VP_ID = 0;
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->ctl_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
|
|
a8a466 |
MPT3_IOCTL_DEFAULT_TIMEOUT*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -2150,7 +2150,7 @@ _ctl_diag_read_buffer(struct MPT3SAS_ADAPTER *ioc, void __user *arg)
|
|
|
a8a466 |
mpi_request->VP_ID = 0;
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->ctl_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
|
|
a8a466 |
MPT3_IOCTL_DEFAULT_TIMEOUT*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
|
a8a466 |
index 0ff2ed3..0dcf826 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
|
a8a466 |
@@ -2339,7 +2339,7 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
|
|
|
a8a466 |
msix_task = scsi_lookup->msix_io;
|
|
|
a8a466 |
else
|
|
|
a8a466 |
msix_task = 0;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_hi_priority(ioc, smid, msix_task);
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority(ioc, smid, msix_task);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->tm_cmds.done, timeout*HZ);
|
|
|
a8a466 |
if (!(ioc->tm_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
pr_err(MPT3SAS_FMT "%s: timeout\n",
|
|
|
a8a466 |
@@ -3252,7 +3252,7 @@ _scsih_tm_tr_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
|
|
|
a8a466 |
mpi_request->DevHandle = cpu_to_le16(handle);
|
|
|
a8a466 |
mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
|
|
|
a8a466 |
set_bit(handle, ioc->device_remove_in_progress);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
mpt3sas_trigger_master(ioc, MASTER_TRIGGER_DEVICE_REMOVAL);
|
|
|
a8a466 |
|
|
|
a8a466 |
out:
|
|
|
a8a466 |
@@ -3351,7 +3351,7 @@ _scsih_tm_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
|
|
|
a8a466 |
mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
|
|
|
a8a466 |
mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
|
|
|
a8a466 |
mpi_request->DevHandle = mpi_request_tm->DevHandle;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid_sas_ctrl);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid_sas_ctrl);
|
|
|
a8a466 |
|
|
|
a8a466 |
return _scsih_check_for_pending_tm(ioc, smid);
|
|
|
a8a466 |
}
|
|
|
a8a466 |
@@ -3446,7 +3446,7 @@ _scsih_tm_tr_volume_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
|
|
|
a8a466 |
mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
|
|
|
a8a466 |
mpi_request->DevHandle = cpu_to_le16(handle);
|
|
|
a8a466 |
mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
+ ioc->put_smid_hi_priority(ioc, smid, 0);
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
@@ -3538,7 +3538,7 @@ _scsih_issue_delayed_event_ack(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 event,
|
|
|
a8a466 |
ack_request->EventContext = event_context;
|
|
|
a8a466 |
ack_request->VF_ID = 0; /* TODO */
|
|
|
a8a466 |
ack_request->VP_ID = 0;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
@@ -3595,7 +3595,7 @@ _scsih_issue_delayed_sas_io_unit_ctrl(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
|
|
|
a8a466 |
mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
|
|
|
a8a466 |
mpi_request->DevHandle = handle;
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
}
|
|
|
a8a466 |
|
|
|
a8a466 |
/**
|
|
|
a8a466 |
@@ -4218,12 +4218,12 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
|
|
|
a8a466 |
if (sas_target_priv_data->flags & MPT_TARGET_FASTPATH_IO) {
|
|
|
a8a466 |
mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len |
|
|
|
a8a466 |
MPI25_SCSIIO_IOFLAGS_FAST_PATH);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_fast_path(ioc, smid, handle);
|
|
|
a8a466 |
+ ioc->put_smid_fast_path(ioc, smid, handle);
|
|
|
a8a466 |
} else
|
|
|
a8a466 |
- mpt3sas_base_put_smid_scsi_io(ioc, smid,
|
|
|
a8a466 |
+ ioc->put_smid_scsi_io(ioc, smid,
|
|
|
a8a466 |
le16_to_cpu(mpi_request->DevHandle));
|
|
|
a8a466 |
} else
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
return 0;
|
|
|
a8a466 |
|
|
|
a8a466 |
out:
|
|
|
a8a466 |
@@ -4719,7 +4719,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
|
|
|
a8a466 |
memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
|
|
|
a8a466 |
mpi_request->DevHandle =
|
|
|
a8a466 |
cpu_to_le16(sas_device_priv_data->sas_target->handle);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_scsi_io(ioc, smid,
|
|
|
a8a466 |
+ ioc->put_smid_scsi_io(ioc, smid,
|
|
|
a8a466 |
sas_device_priv_data->sas_target->handle);
|
|
|
a8a466 |
return 0;
|
|
|
a8a466 |
}
|
|
|
a8a466 |
@@ -6330,7 +6330,7 @@ _scsih_ir_fastpath(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phys_disk_num)
|
|
|
a8a466 |
handle, phys_disk_num));
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->scsih_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
@@ -8180,7 +8180,7 @@ _scsih_ir_shutdown(struct MPT3SAS_ADAPTER *ioc)
|
|
|
a8a466 |
if (!ioc->hide_ir_msg)
|
|
|
a8a466 |
pr_info(MPT3SAS_FMT "IR shutdown (sending)\n", ioc->name);
|
|
|
a8a466 |
init_completion(&ioc->scsih_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
|
|
|
a8a466 |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c b/drivers/scsi/mpt3sas/mpt3sas_transport.c
|
|
|
a8a466 |
index a01b235..4b7c32b 100644
|
|
|
a8a466 |
--- a/drivers/scsi/mpt3sas/mpt3sas_transport.c
|
|
|
a8a466 |
+++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c
|
|
|
a8a466 |
@@ -393,7 +393,7 @@ _transport_expander_report_manufacture(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
"report_manufacture - send to sas_addr(0x%016llx)\n",
|
|
|
a8a466 |
ioc->name, (unsigned long long)sas_address));
|
|
|
a8a466 |
init_completion(&ioc->transport_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
|
|
a8a466 |
10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -1197,7 +1197,7 @@ _transport_get_expander_phy_error_log(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
ioc->name, (unsigned long long)phy->identify.sas_address,
|
|
|
a8a466 |
phy->number));
|
|
|
a8a466 |
init_completion(&ioc->transport_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
|
|
a8a466 |
10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -1516,7 +1516,7 @@ _transport_expander_phy_control(struct MPT3SAS_ADAPTER *ioc,
|
|
|
a8a466 |
ioc->name, (unsigned long long)phy->identify.sas_address,
|
|
|
a8a466 |
phy->number, phy_operation));
|
|
|
a8a466 |
init_completion(&ioc->transport_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
|
|
a8a466 |
10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
@@ -2036,7 +2036,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|
|
a8a466 |
"%s - sending smp request\n", ioc->name, __func__));
|
|
|
a8a466 |
|
|
|
a8a466 |
init_completion(&ioc->transport_cmds.done);
|
|
|
a8a466 |
- mpt3sas_base_put_smid_default(ioc, smid);
|
|
|
a8a466 |
+ ioc->put_smid_default(ioc, smid);
|
|
|
a8a466 |
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
|
|
a8a466 |
10*HZ);
|
|
|
a8a466 |
|
|
|
a8a466 |
--
|
|
|
a8a466 |
1.8.3.1
|
|
|
a8a466 |
|