All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kashyap Desai <kashyap.desai@broadcom.com>
To: linux-scsi@vger.kernel.org
Cc: Kashyap Desai <kashyap.desai@broadcom.com>, sathya.prakash@broadcom.com
Subject: [PATCH v2 10/24] mpi3mr: add support of timestamp sync with firmware
Date: Wed,  7 Apr 2021 07:34:37 +0530	[thread overview]
Message-ID: <20210407020451.924822-11-kashyap.desai@broadcom.com> (raw)
In-Reply-To: <20210407020451.924822-1-kashyap.desai@broadcom.com>

[-- Attachment #1: Type: text/plain, Size: 5008 bytes --]

This operation requests that the IOC update the TimeStamp.

When the I/O Unit is powered on, it sets the TimeStamp field value to
0x0000_0000_0000_0000 and increments the current value every millisecond.
A host driver sets the TimeStamp field to the current time by using an
IOCInit request. The TimeStamp field is periodically updated by host driver.

Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cc: sathya.prakash@broadcom.com
---
 drivers/scsi/mpi3mr/mpi3mr.h    |  3 ++
 drivers/scsi/mpi3mr/mpi3mr_fw.c | 74 +++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)

diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
index d18bfb954bc4..801612c9eb2a 100644
--- a/drivers/scsi/mpi3mr/mpi3mr.h
+++ b/drivers/scsi/mpi3mr/mpi3mr.h
@@ -99,6 +99,7 @@ extern struct list_head mrioc_list;
 #define MPI3MR_PORTENABLE_TIMEOUT		300
 #define MPI3MR_RESETTM_TIMEOUT			30
 #define MPI3MR_RESET_HOST_IOWAIT_TIMEOUT	5
+#define MPI3MR_TSUPDATE_INTERVAL		900
 #define MPI3MR_DEFAULT_SHUTDOWN_TIME		120
 
 #define MPI3MR_WATCHDOG_INTERVAL		1000 /* in milli seconds */
@@ -631,6 +632,7 @@ struct scmd_priv {
  * @dev_handle_bitmap_sz: Device handle bitmap size
  * @removepend_bitmap: Remove pending bitmap
  * @delayed_rmhs_list: Delayed device removal list
+ * @ts_update_counter: Timestamp update counter
  * @fault_dbg: Fault debug flag
  * @reset_in_progress: Reset in progress flag
  * @unrecoverable: Controller unrecoverable flag
@@ -753,6 +755,7 @@ struct mpi3mr_ioc {
 	void *removepend_bitmap;
 	struct list_head delayed_rmhs_list;
 
+	u32 ts_update_counter;
 	u8 fault_dbg;
 	u8 reset_in_progress;
 	u8 unrecoverable;
diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
index b8e9c87ea677..d47031d05322 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
@@ -1485,6 +1485,74 @@ int mpi3mr_op_request_post(struct mpi3mr_ioc *mrioc,
 	return retval;
 }
 
+/**
+ * mpi3mr_sync_timestamp - Issue time stamp sync request
+ * @mrioc: Adapter reference
+ *
+ * Issue IO unit control MPI request to synchornize firmware
+ * timestamp with host time.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static int mpi3mr_sync_timestamp(struct mpi3mr_ioc *mrioc)
+{
+	ktime_t current_time;
+	Mpi3IoUnitControlRequest_t iou_ctrl;
+	int retval = 0;
+
+	memset(&iou_ctrl, 0, sizeof(iou_ctrl));
+	mutex_lock(&mrioc->init_cmds.mutex);
+	if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) {
+		retval = -1;
+		ioc_err(mrioc, "Issue IOUCTL TimeStamp: command is in use\n");
+		mutex_unlock(&mrioc->init_cmds.mutex);
+		goto out;
+	}
+	mrioc->init_cmds.state = MPI3MR_CMD_PENDING;
+	mrioc->init_cmds.is_waiting = 1;
+	mrioc->init_cmds.callback = NULL;
+	iou_ctrl.HostTag = cpu_to_le16(MPI3MR_HOSTTAG_INITCMDS);
+	iou_ctrl.Function = MPI3_FUNCTION_IO_UNIT_CONTROL;
+	iou_ctrl.Operation = MPI3_CTRL_OP_UPDATE_TIMESTAMP;
+	current_time = ktime_get_real();
+	iou_ctrl.Param64[0] = cpu_to_le64(ktime_to_ms(current_time));
+
+	init_completion(&mrioc->init_cmds.done);
+	retval = mpi3mr_admin_request_post(mrioc, &iou_ctrl,
+	    sizeof(iou_ctrl), 0);
+	if (retval) {
+		ioc_err(mrioc, "Issue IOUCTL TimeStamp: Admin Post failed\n");
+		goto out_unlock;
+	}
+
+	wait_for_completion_timeout(&mrioc->init_cmds.done,
+	    (MPI3MR_INTADMCMD_TIMEOUT * HZ));
+	if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
+		ioc_err(mrioc, "Issue IOUCTL TimeStamp: command timed out\n");
+		mrioc->init_cmds.is_waiting = 0;
+		mpi3mr_soft_reset_handler(mrioc,
+		    MPI3MR_RESET_FROM_TSU_TIMEOUT, 1);
+		retval = -1;
+		goto out_unlock;
+	}
+	if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK)
+	    != MPI3_IOCSTATUS_SUCCESS) {
+		ioc_err(mrioc,
+		    "Issue IOUCTL TimeStamp: Failed IOCStatus(0x%04x) Loginfo(0x%08x)\n",
+		    (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK),
+		    mrioc->init_cmds.ioc_loginfo);
+		retval = -1;
+		goto out_unlock;
+	}
+
+out_unlock:
+	mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED;
+	mutex_unlock(&mrioc->init_cmds.mutex);
+
+out:
+	return retval;
+}
+
 /**
  * mpi3mr_watchdog_work - watchdog thread to monitor faults
  * @work: work struct
@@ -1503,6 +1571,11 @@ static void mpi3mr_watchdog_work(struct work_struct *work)
 	enum mpi3mr_iocstate ioc_state;
 	u32 fault, host_diagnostic;
 
+	if (mrioc->ts_update_counter++ >= MPI3MR_TSUPDATE_INTERVAL) {
+		mrioc->ts_update_counter = 0;
+		mpi3mr_sync_timestamp(mrioc);
+	}
+
 	/*Check for fault state every one second and issue Soft reset*/
 	ioc_state = mpi3mr_get_iocstate(mrioc);
 	if (ioc_state == MRIOC_STATE_FAULT) {
@@ -3313,6 +3386,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
 		mrioc->reset_in_progress = 0;
 		scsi_unblock_requests(mrioc->shost);
 		mpi3mr_rfresh_tgtdevs(mrioc);
+		mrioc->ts_update_counter = 0;
 		spin_lock_irqsave(&mrioc->watchdog_lock, flags);
 		if (mrioc->watchdog_work_q)
 			queue_delayed_work(mrioc->watchdog_work_q,
-- 
2.18.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4212 bytes --]

  parent reply	other threads:[~2021-04-07  2:04 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  2:04 [PATCH v2 00/24] Introducing mpi3mr driver Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 01/24] mpi3mr: add mpi30 Rev-R headers and Kconfig Kashyap Desai
2021-04-15 10:30   ` Tomas Henzl
2021-04-15 20:31   ` Bart Van Assche
2021-04-16 10:53     ` Kashyap Desai
2021-04-16 15:40       ` Bart Van Assche
2021-04-19 10:20         ` Kashyap Desai
2021-04-20  6:33           ` Christoph Hellwig
2021-04-23 13:18             ` Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 02/24] mpi3mr: base driver code Kashyap Desai
2021-04-07  4:17   ` kernel test robot
2021-04-07  4:17     ` kernel test robot
2021-04-07  4:33   ` kernel test robot
2021-04-07  4:33     ` kernel test robot
2021-04-07  2:04 ` [PATCH v2 03/24] mpi3mr: create operational request and reply queue pair Kashyap Desai
2021-04-15 10:35   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 04/24] mpi3mr: add support of queue command processing Kashyap Desai
2021-04-15 10:36   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 05/24] mpi3mr: add support of internal watchdog thread Kashyap Desai
2021-04-15 10:37   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 06/24] mpi3mr: add support of event handling part-1 Kashyap Desai
2021-04-15 10:40   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 07/24] mpi3mr: add support of event handling pcie devices part-2 Kashyap Desai
2021-04-15 11:10   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 08/24] mpi3mr: add support of event handling part-3 Kashyap Desai
2021-04-15 11:11   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 09/24] mpi3mr: add support for recovering controller Kashyap Desai
2021-04-15 11:21   ` Tomas Henzl
2021-04-07  2:04 ` Kashyap Desai [this message]
2021-04-15 11:22   ` [PATCH v2 10/24] mpi3mr: add support of timestamp sync with firmware Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 11/24] mpi3mr: print ioc info for debugging Kashyap Desai
2021-04-15 11:55   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 12/24] mpi3mr: add bios_param shost template hook Kashyap Desai
2021-04-15 11:56   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 13/24] mpi3mr: implement scsi error handler hooks Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 14/24] mpi3mr: add change queue depth support Kashyap Desai
2021-04-15 12:16   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 15/24] mpi3mr: allow certain commands during pci-remove hook Kashyap Desai
2021-04-15 12:19   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 16/24] mpi3mr: hardware workaround for UNMAP commands to nvme drives Kashyap Desai
2021-04-15 12:20   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 17/24] mpi3mr: add support of threaded isr Kashyap Desai
2021-04-15 12:22   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 18/24] mpi3mr: add complete support of soft reset Kashyap Desai
2021-04-15 12:32   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 19/24] mpi3mr: print pending host ios for debug Kashyap Desai
2021-04-15 12:43   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 20/24] mpi3mr: wait for pending IO completions upon detection of VD IO timeout Kashyap Desai
2021-04-15 12:45   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 21/24] mpi3mr: add support of PM suspend and resume Kashyap Desai
2021-04-15 12:46   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 22/24] mpi3mr: add support of DSN secure fw check Kashyap Desai
2021-04-15 12:48   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 23/24] mpi3mr: add eedp dif dix support Kashyap Desai
2021-04-15 12:50   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 24/24] mpi3mr: add event handling debug prints Kashyap Desai
2021-04-15 12:52   ` Tomas Henzl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210407020451.924822-11-kashyap.desai@broadcom.com \
    --to=kashyap.desai@broadcom.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=sathya.prakash@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.