linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] megaraid: Fixes for SCSI EH rework
@ 2021-08-19  9:16 Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 1/3] megaraid: complete all commands in megaraid_reset() Hannes Reinecke
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Hannes Reinecke @ 2021-08-19  9:16 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke

Hi all,

with the SCSI EH rework the scsi_cmnd argument for the SCSI EH
callbacks is going away, so we need to fixup the drivers to work
without it.

This patchset modifies the megaraid driver to not rely on a
specific command for the SCSI EH callbacks.

As usual, comments and reviews are welcome.

Hannes Reinecke (3):
  megaraid: complete all commands in megaraid_reset()
  megaraid: rename megaraid_abort_and_reset() to __megaraid_abort()
  megaraid: remove pointless bus_reset and device_reset handler

 drivers/scsi/megaraid.c | 63 +++++++++++++++++++++++++++--------------
 drivers/scsi/megaraid.h |  2 +-
 2 files changed, 42 insertions(+), 23 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] megaraid: complete all commands in megaraid_reset()
  2021-08-19  9:16 [PATCH 0/3] megaraid: Fixes for SCSI EH rework Hannes Reinecke
@ 2021-08-19  9:16 ` Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 2/3] megaraid: rename megaraid_abort_and_reset() to __megaraid_abort() Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 3/3] megaraid: remove pointless bus_reset and device_reset handler Hannes Reinecke
  2 siblings, 0 replies; 4+ messages in thread
From: Hannes Reinecke @ 2021-08-19  9:16 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke

When calling host reset all commands need to be completed, not
just that one triggering SCSI EH.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/megaraid.c | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 56910e94dbf2..10c1793d4b6d 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -1887,7 +1887,8 @@ megaraid_reset(struct scsi_cmnd *cmd)
 {
 	adapter_t	*adapter;
 	megacmd_t	mc;
-	int		rval;
+	int		rval = SUCCESS;
+	struct list_head	*pos, *next;
 
 	adapter = (adapter_t *)cmd->device->host->hostdata;
 
@@ -1905,7 +1906,37 @@ megaraid_reset(struct scsi_cmnd *cmd)
 
 	spin_lock_irq(&adapter->lock);
 
-	rval =  megaraid_abort_and_reset(adapter, cmd, SCB_RESET);
+	dev_warn(&adapter->dev->dev, "RESET HBA\n");
+
+	list_for_each_safe(pos, next, &adapter->pending_list) {
+		scb_t *scb = list_entry(pos, scb_t, list);
+
+		scb->state |= SCB_RESET;
+
+		/*
+		 * Check if this command has firmware ownership. If
+		 * yes, we cannot reset this command. Whenever f/w
+		 * completes this command, we will return appropriate
+		 * status from ISR.
+		 */
+		if( scb->state & SCB_ISSUED ) {
+			dev_warn(&adapter->dev->dev,
+				 "RESET[%x], fw owner\n",
+				 scb->idx);
+			rval = FAILED;
+			break;
+		}
+		/*
+		 * Not yet issued! Remove from the pending
+		 * list
+		 */
+		dev_warn(&adapter->dev->dev,
+			 "RESET[%x], driver owner\n", scb->idx);
+		scb->cmd->result = (DID_RESET << 16);
+		list_add_tail(SCSI_LIST(scb->cmd),
+			      &adapter->completed_list);
+		mega_free_scb(adapter, scb);
+	}
 
 	/*
 	 * This is required here to complete any completed requests
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] megaraid: rename megaraid_abort_and_reset() to __megaraid_abort()
  2021-08-19  9:16 [PATCH 0/3] megaraid: Fixes for SCSI EH rework Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 1/3] megaraid: complete all commands in megaraid_reset() Hannes Reinecke
@ 2021-08-19  9:16 ` Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 3/3] megaraid: remove pointless bus_reset and device_reset handler Hannes Reinecke
  2 siblings, 0 replies; 4+ messages in thread
From: Hannes Reinecke @ 2021-08-19  9:16 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke

megaraid_abort_and_reset() now only tries to abort / complete a
single command, so rename it to __megaraid_abort() to signal the
change in functionality.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/megaraid.c | 26 ++++++++------------------
 drivers/scsi/megaraid.h |  2 +-
 2 files changed, 9 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 10c1793d4b6d..b213ad62639d 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -1870,7 +1870,7 @@ megaraid_abort(struct scsi_cmnd *cmd)
 
 	adapter = (adapter_t *)cmd->device->host->hostdata;
 
-	rval =  megaraid_abort_and_reset(adapter, cmd, SCB_ABORT);
+	rval =  __megaraid_abort(adapter, cmd);
 
 	/*
 	 * This is required here to complete any completed requests
@@ -1949,22 +1949,20 @@ megaraid_reset(struct scsi_cmnd *cmd)
 }
 
 /**
- * megaraid_abort_and_reset()
+ * __megaraid_abort()
  * @adapter: megaraid soft state
  * @cmd: scsi command to be aborted or reset
- * @aor: abort or reset flag
  *
  * Try to locate the scsi command in the pending queue. If found and is not
  * issued to the controller, abort/reset it. Otherwise return failure
  */
 static int
-megaraid_abort_and_reset(adapter_t *adapter, struct scsi_cmnd *cmd, int aor)
+__megaraid_abort(adapter_t *adapter, struct scsi_cmnd *cmd)
 {
 	struct list_head	*pos, *next;
 	scb_t			*scb;
 
-	dev_warn(&adapter->dev->dev, "%s cmd=%x <c=%d t=%d l=%d>\n",
-	     (aor == SCB_ABORT)? "ABORTING":"RESET",
+	dev_warn(&adapter->dev->dev, "ABORTING cmd=%x <c=%d t=%d l=%d>\n",
 	     cmd->cmnd[0], cmd->device->channel,
 	     cmd->device->id, (u32)cmd->device->lun);
 
@@ -1977,7 +1975,7 @@ megaraid_abort_and_reset(adapter_t *adapter, struct scsi_cmnd *cmd, int aor)
 
 		if (scb->cmd == cmd) { /* Found command */
 
-			scb->state |= aor;
+			scb->state |= SCB_ABORT;
 
 			/*
 			 * Check if this command has firmware ownership. If
@@ -1988,8 +1986,7 @@ megaraid_abort_and_reset(adapter_t *adapter, struct scsi_cmnd *cmd, int aor)
 			if( scb->state & SCB_ISSUED ) {
 
 				dev_warn(&adapter->dev->dev,
-					"%s[%x], fw owner\n",
-					(aor==SCB_ABORT) ? "ABORTING":"RESET",
+					"ABORTING[%x], fw owner\n",
 					scb->idx);
 
 				return FAILED;
@@ -2001,18 +1998,11 @@ megaraid_abort_and_reset(adapter_t *adapter, struct scsi_cmnd *cmd, int aor)
 				 * list
 				 */
 				dev_warn(&adapter->dev->dev,
-					"%s-[%x], driver owner\n",
-					(aor==SCB_ABORT) ? "ABORTING":"RESET",
+					"ABORTING[%x], driver owner\n",
 					scb->idx);
 
 				mega_free_scb(adapter, scb);
-
-				if( aor == SCB_ABORT ) {
-					cmd->result = (DID_ABORT << 16);
-				}
-				else {
-					cmd->result = (DID_RESET << 16);
-				}
+				cmd->result = (DID_ABORT << 16);
 
 				list_add_tail(SCSI_LIST(cmd),
 						&adapter->completed_list);
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h
index cce23a086fbe..8188c7f90faf 100644
--- a/drivers/scsi/megaraid.h
+++ b/drivers/scsi/megaraid.h
@@ -953,7 +953,7 @@ static void mega_free_scb(adapter_t *, scb_t *);
 
 static int megaraid_abort(struct scsi_cmnd *);
 static int megaraid_reset(struct scsi_cmnd *);
-static int megaraid_abort_and_reset(adapter_t *, struct scsi_cmnd *, int);
+static int __megaraid_abort(adapter_t *, struct scsi_cmnd *);
 static int megaraid_biosparam(struct scsi_device *, struct block_device *,
 		sector_t, int []);
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] megaraid: remove pointless bus_reset and device_reset handler
  2021-08-19  9:16 [PATCH 0/3] megaraid: Fixes for SCSI EH rework Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 1/3] megaraid: complete all commands in megaraid_reset() Hannes Reinecke
  2021-08-19  9:16 ` [PATCH 2/3] megaraid: rename megaraid_abort_and_reset() to __megaraid_abort() Hannes Reinecke
@ 2021-08-19  9:16 ` Hannes Reinecke
  2 siblings, 0 replies; 4+ messages in thread
From: Hannes Reinecke @ 2021-08-19  9:16 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke

Both bus and device reset would be calling into the same function
as host reset, so remove them as host reset will always be called.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/megaraid.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index b213ad62639d..ad0ea6dbd513 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -4156,8 +4156,6 @@ static struct scsi_host_template megaraid_template = {
 	.sg_tablesize			= MAX_SGLIST,
 	.cmd_per_lun			= DEF_CMD_PER_LUN,
 	.eh_abort_handler		= megaraid_abort,
-	.eh_device_reset_handler	= megaraid_reset,
-	.eh_bus_reset_handler		= megaraid_reset,
 	.eh_host_reset_handler		= megaraid_reset,
 	.no_write_same			= 1,
 };
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-08-19  9:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-19  9:16 [PATCH 0/3] megaraid: Fixes for SCSI EH rework Hannes Reinecke
2021-08-19  9:16 ` [PATCH 1/3] megaraid: complete all commands in megaraid_reset() Hannes Reinecke
2021-08-19  9:16 ` [PATCH 2/3] megaraid: rename megaraid_abort_and_reset() to __megaraid_abort() Hannes Reinecke
2021-08-19  9:16 ` [PATCH 3/3] megaraid: remove pointless bus_reset and device_reset handler Hannes Reinecke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).