All of lore.kernel.org
 help / color / mirror / Atom feed
From: Finn Thain <fthain@telegraphics.com.au>
To: "James E.J. Bottomley" <JBottomley@odin.com>,
	Michael Schmitz <schmitzmic@gmail.com>,
	<linux-m68k@vger.kernel.org>, <linux-scsi@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: [PATCH 61/71] ncr5380: Fix EH during arbitration and selection
Date: Wed, 18 Nov 2015 19:35:56 +1100	[thread overview]
Message-ID: <20151118083516.944145264@telegraphics.com.au> (raw)
In-Reply-To: 20151118083455.331768508@telegraphics.com.au

[-- Attachment #1: ncr5380-fix-abort-during-select --]
[-- Type: text/plain, Size: 15500 bytes --]

During arbitration and selection, the relevant command is invisible to
exception handlers and can be found only in a pointer on the stack of a
different thread.

When eh_abort_handler can't find a given command, it can't decide whether
that command was completed already or is still in arbitration or selection
phase. But it must return either SUCCESS (e.g. command completed earlier)
or FAILED (could not abort the nexus, try bus reset).

The solution is to make sure all commands belonging to the LLD are always
visible to exception handlers. Add another scsi_cmnd pointer to the
hostdata struct to track the command in arbitration or selection phase.

Replace 'retain_dma_irq' with the new 'selecting' pointer, to bring
atari_NCR5380.c into line with NCR5380.c.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/scsi/NCR5380.c       |   78 +++++++++++++++++++++++++++++----------
 drivers/scsi/NCR5380.h       |    4 +-
 drivers/scsi/atari_NCR5380.c |   84 +++++++++++++++++++++++++++++++------------
 3 files changed, 121 insertions(+), 45 deletions(-)

Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c	2015-11-18 19:34:27.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c	2015-11-18 19:34:29.000000000 +1100
@@ -908,9 +908,9 @@ static void NCR5380_main(struct work_str
 			 * entire unit.
 			 */
 
-			if (!NCR5380_select(instance, cmd)) {
-				dsprintk(NDEBUG_MAIN, instance, "main: selected target %d for command %p\n",
-				         scmd_id(cmd), cmd);
+			cmd = NCR5380_select(instance, cmd);
+			if (!cmd) {
+				dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
 			} else {
 				dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
 				         "main: select failed, returning %p to queue\n", cmd);
@@ -1057,9 +1057,9 @@ static irqreturn_t NCR5380_intr(int irq,
  * Inputs : instance - instantiation of the 5380 driver on which this 
  *      target lives, cmd - SCSI command to execute.
  * 
- * Returns : -1 if selection failed but should be retried.
- *      0 if selection failed and should not be retried.
- *      0 if selection succeeded completely (hostdata->connected == cmd).
+ * Returns cmd if selection failed but should be retried,
+ * NULL if selection failed and should not be retried, or
+ * NULL if selection succeeded (hostdata->connected == cmd).
  *
  * Side effects : 
  *      If bus busy, arbitration failed, etc, NCR5380_select() will exit 
@@ -1077,7 +1077,8 @@ static irqreturn_t NCR5380_intr(int irq,
  *	Locks: caller holds hostdata lock in IRQ mode
  */
  
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
+                                        struct scsi_cmnd *cmd)
 {
 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
 	unsigned char tmp[3], phase;
@@ -1088,6 +1089,15 @@ static int NCR5380_select(struct Scsi_Ho
 	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
 	dprintk(NDEBUG_ARBITRATION, "scsi%d : starting arbitration, id = %d\n", instance->host_no, instance->this_id);
 
+	/*
+	 * Arbitration and selection phases are slow and involve dropping the
+	 * lock, so we have to watch out for EH. An exception handler may
+	 * change 'selecting' to NULL. This function will then return NULL
+	 * so that the caller will forget about 'cmd'. (During information
+	 * transfer phases, EH may change 'connected' to NULL.)
+	 */
+	hostdata->selecting = cmd;
+
 	/* 
 	 * Set the phase bits to 0, otherwise the NCR5380 won't drive the 
 	 * data bus during SELECTION.
@@ -1113,13 +1123,13 @@ static int NCR5380_select(struct Scsi_Ho
 	spin_lock_irq(&hostdata->lock);
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE)) {
 		/* Reselection interrupt */
-		return -1;
+		goto out;
 	}
 	if (err < 0) {
 		NCR5380_write(MODE_REG, MR_BASE);
 		shost_printk(KERN_ERR, instance,
 		             "select: arbitration timeout\n");
-		return -1;
+		goto out;
 	}
 	spin_unlock_irq(&hostdata->lock);
 
@@ -1131,7 +1141,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(MODE_REG, MR_BASE);
 		dprintk(NDEBUG_ARBITRATION, "scsi%d : lost arbitration, deasserting MR_ARBITRATE\n", instance->host_no);
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/* After/during arbitration, BSY should be asserted.
@@ -1150,7 +1160,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		dsprintk(NDEBUG_ARBITRATION, instance, "arbitration lost, negating SEL\n");
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 	/* 
 	 * Again, bus clear + bus settle time is 1.2us, however, this is 
@@ -1166,7 +1176,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	/* NCR5380_reselect() clears MODE_REG after a reselection interrupt */
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE))
-		return -1;
+		goto out;
+
+	if (!hostdata->selecting) {
+		NCR5380_write(MODE_REG, MR_BASE);
+		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+		goto out;
+	}
 
 	dprintk(NDEBUG_ARBITRATION, "scsi%d : won arbitration\n", instance->host_no);
 
@@ -1239,18 +1255,21 @@ static int NCR5380_select(struct Scsi_Ho
 		if (!hostdata->connected)
 			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 		printk("scsi%d : reselection after won arbitration?\n", instance->host_no);
-		return -1;
+		goto out;
 	}
 
 	if (err < 0) {
 		spin_lock_irq(&hostdata->lock);
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-		cmd->result = DID_BAD_TARGET << 16;
-		complete_cmd(instance, cmd);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		dprintk(NDEBUG_SELECTION, "scsi%d : target did not respond within 250ms\n",
-		        instance->host_no);
-		return 0;
+		/* Can't touch cmd if it has been reclaimed by the scsi ML */
+		if (hostdata->selecting) {
+			cmd->result = DID_BAD_TARGET << 16;
+			complete_cmd(instance, cmd);
+			dsprintk(NDEBUG_SELECTION, instance, "target did not respond within 250ms\n");
+			cmd = NULL;
+		}
+		goto out;
 	}
 
 	/* 
@@ -1286,7 +1305,11 @@ static int NCR5380_select(struct Scsi_Ho
 		shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		return -1;
+		goto out;
+	}
+	if (!hostdata->selecting) {
+		do_abort(instance);
+		goto out;
 	}
 
 	dprintk(NDEBUG_SELECTION, "scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->device->id);
@@ -1307,7 +1330,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	initialize_SCp(cmd);
 
-	return 0;
+	cmd = NULL;
+
+out:
+	if (!hostdata->selecting)
+		return NULL;
+	hostdata->selecting = NULL;
+	return cmd;
 }
 
 /* 
@@ -2359,6 +2388,15 @@ static int NCR5380_abort(struct scsi_cmn
 		cmd->scsi_done(cmd); /* No tag or busy flag to worry about */
 	}
 
+	if (hostdata->selecting == cmd) {
+		dsprintk(NDEBUG_ABORT, instance,
+		         "abort: cmd %p == selecting\n", cmd);
+		hostdata->selecting = NULL;
+		cmd->result = DID_ABORT << 16;
+		complete_cmd(instance, cmd);
+		goto out;
+	}
+
 	if (list_del_cmd(&hostdata->disconnected, cmd)) {
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: removed %p from disconnected list\n", cmd);
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h	2015-11-18 19:34:24.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h	2015-11-18 19:34:29.000000000 +1100
@@ -256,6 +256,7 @@ struct NCR5380_hostdata {
 #endif
 	unsigned char last_message;		/* last message OUT */
 	struct scsi_cmnd *connected;		/* currently connected cmnd */
+	struct scsi_cmnd *selecting;		/* cmnd to be connected */
 	struct list_head unissued;		/* waiting to be issued */
 	struct list_head autosense;		/* priority issue queue */
 	struct list_head disconnected;		/* waiting for reconnect */
@@ -266,7 +267,6 @@ struct NCR5380_hostdata {
 	char info[256];
 	int read_overruns;                /* number of bytes to cut from a
 	                                   * transfer to handle chip overruns */
-	int retain_dma_intr;
 	struct work_struct main_task;
 #ifdef SUPPORT_TAGS
 	struct tag_alloc TagAlloc[8][8];	/* 8 targets and 8 LUNs */
@@ -329,7 +329,7 @@ static irqreturn_t NCR5380_intr(int irq,
 static void NCR5380_main(struct work_struct *work);
 static const char *NCR5380_info(struct Scsi_Host *instance);
 static void NCR5380_reselect(struct Scsi_Host *instance);
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd);
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
 #if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
 static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
 #endif
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c	2015-11-18 19:34:27.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c	2015-11-18 19:34:29.000000000 +1100
@@ -882,7 +882,7 @@ static inline void maybe_release_dma_irq
 	    list_empty(&hostdata->unissued) &&
 	    list_empty(&hostdata->autosense) &&
 	    !hostdata->connected &&
-	    !hostdata->retain_dma_intr)
+	    !hostdata->selecting)
 		NCR5380_release_dma_irq(instance);
 }
 
@@ -1003,14 +1003,11 @@ static void NCR5380_main(struct work_str
 #ifdef SUPPORT_TAGS
 			cmd_get_tag(cmd, cmd->cmnd[0] != REQUEST_SENSE);
 #endif
-			hostdata->retain_dma_intr++;
-			if (!NCR5380_select(instance, cmd)) {
-				dsprintk(NDEBUG_MAIN, instance, "main: selected target %d for command %p\n",
-				         scmd_id(cmd), cmd);
-				hostdata->retain_dma_intr--;
+			cmd = NCR5380_select(instance, cmd);
+			if (!cmd) {
+				dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
 				maybe_release_dma_irq(instance);
 			} else {
-				hostdata->retain_dma_intr--;
 				dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
 				         "main: select failed, returning %p to queue\n", cmd);
 				requeue_cmd(instance, cmd);
@@ -1238,9 +1235,9 @@ static irqreturn_t NCR5380_intr(int irq,
  * Inputs : instance - instantiation of the 5380 driver on which this
  *	target lives, cmd - SCSI command to execute.
  *
- * Returns : -1 if selection failed but should be retried.
- *      0 if selection failed and should not be retried.
- *      0 if selection succeeded completely (hostdata->connected == cmd).
+ * Returns cmd if selection failed but should be retried,
+ * NULL if selection failed and should not be retried, or
+ * NULL if selection succeeded (hostdata->connected == cmd).
  *
  * Side effects :
  *	If bus busy, arbitration failed, etc, NCR5380_select() will exit
@@ -1256,7 +1253,8 @@ static irqreturn_t NCR5380_intr(int irq,
  *		cmd->result host byte set to DID_BAD_TARGET.
  */
 
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
+                                        struct scsi_cmnd *cmd)
 {
 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
 	unsigned char tmp[3], phase;
@@ -1269,6 +1267,15 @@ static int NCR5380_select(struct Scsi_Ho
 		   instance->this_id);
 
 	/*
+	 * Arbitration and selection phases are slow and involve dropping the
+	 * lock, so we have to watch out for EH. An exception handler may
+	 * change 'selecting' to NULL. This function will then return NULL
+	 * so that the caller will forget about 'cmd'. (During information
+	 * transfer phases, EH may change 'connected' to NULL.)
+	 */
+	hostdata->selecting = cmd;
+
+	/*
 	 * Set the phase bits to 0, otherwise the NCR5380 won't drive the
 	 * data bus during SELECTION.
 	 */
@@ -1293,13 +1300,13 @@ static int NCR5380_select(struct Scsi_Ho
 	spin_lock_irq(&hostdata->lock);
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE)) {
 		/* Reselection interrupt */
-		return -1;
+		goto out;
 	}
 	if (err < 0) {
 		NCR5380_write(MODE_REG, MR_BASE);
 		shost_printk(KERN_ERR, instance,
 		             "select: arbitration timeout\n");
-		return -1;
+		goto out;
 	}
 	spin_unlock_irq(&hostdata->lock);
 
@@ -1314,7 +1321,7 @@ static int NCR5380_select(struct Scsi_Ho
 		dprintk(NDEBUG_ARBITRATION, "scsi%d: lost arbitration, deasserting MR_ARBITRATE\n",
 			   HOSTNO);
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/* After/during arbitration, BSY should be asserted.
@@ -1333,7 +1340,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		dsprintk(NDEBUG_ARBITRATION, instance, "arbitration lost, negating SEL\n");
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/*
@@ -1350,7 +1357,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	/* NCR5380_reselect() clears MODE_REG after a reselection interrupt */
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE))
-		return -1;
+		goto out;
+
+	if (!hostdata->selecting) {
+		NCR5380_write(MODE_REG, MR_BASE);
+		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+		goto out;
+	}
 
 	dprintk(NDEBUG_ARBITRATION, "scsi%d: won arbitration\n", HOSTNO);
 
@@ -1426,17 +1439,21 @@ static int NCR5380_select(struct Scsi_Ho
 			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 		printk(KERN_ERR "scsi%d: reselection after won arbitration?\n",
 		       HOSTNO);
-		return -1;
+		goto out;
 	}
 
 	if (err < 0) {
 		spin_lock_irq(&hostdata->lock);
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-		cmd->result = DID_BAD_TARGET << 16;
-		complete_cmd(instance, cmd);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		dprintk(NDEBUG_SELECTION, "scsi%d: target did not respond within 250ms\n", HOSTNO);
-		return 0;
+		/* Can't touch cmd if it has been reclaimed by the scsi ML */
+		if (hostdata->selecting) {
+			cmd->result = DID_BAD_TARGET << 16;
+			complete_cmd(instance, cmd);
+			dsprintk(NDEBUG_SELECTION, instance, "target did not respond within 250ms\n");
+			cmd = NULL;
+		}
+		goto out;
 	}
 
 	/*
@@ -1472,7 +1489,11 @@ static int NCR5380_select(struct Scsi_Ho
 		shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		return -1;
+		goto out;
+	}
+	if (!hostdata->selecting) {
+		do_abort(instance);
+		goto out;
 	}
 
 	dprintk(NDEBUG_SELECTION, "scsi%d: target %d selected, going into MESSAGE OUT phase.\n",
@@ -1508,7 +1529,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	initialize_SCp(cmd);
 
-	return 0;
+	cmd = NULL;
+
+out:
+	if (!hostdata->selecting)
+		return NULL;
+	hostdata->selecting = NULL;
+	return cmd;
 }
 
 /*
@@ -2572,6 +2599,15 @@ static int NCR5380_abort(struct scsi_cmn
 		cmd->scsi_done(cmd); /* No tag or busy flag to worry about */
 	}
 
+	if (hostdata->selecting == cmd) {
+		dsprintk(NDEBUG_ABORT, instance,
+		         "abort: cmd %p == selecting\n", cmd);
+		hostdata->selecting = NULL;
+		cmd->result = DID_ABORT << 16;
+		complete_cmd(instance, cmd);
+		goto out;
+	}
+
 	if (list_del_cmd(&hostdata->disconnected, cmd)) {
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: removed %p from disconnected list\n", cmd);
@@ -2689,6 +2725,8 @@ static int NCR5380_bus_reset(struct scsi
 	 * commands!
 	 */
 
+	hostdata->selecting = NULL;
+
 	if (hostdata->connected)
 		dsprintk(NDEBUG_ABORT, instance, "reset aborted a connected command\n");
 	hostdata->connected = NULL;



WARNING: multiple messages have this Message-ID (diff)
From: Finn Thain <fthain@telegraphics.com.au>
To: "James E.J. Bottomley" <JBottomley@odin.com>,
	Michael Schmitz <schmitzmic@gmail.com>,
	linux-m68k@vger.kernel.org, linux-scsi@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH 61/71] ncr5380: Fix EH during arbitration and selection
Date: Wed, 18 Nov 2015 19:35:56 +1100	[thread overview]
Message-ID: <20151118083516.944145264@telegraphics.com.au> (raw)
In-Reply-To: 20151118083455.331768508@telegraphics.com.au

[-- Attachment #1: ncr5380-fix-abort-during-select --]
[-- Type: text/plain, Size: 15498 bytes --]

During arbitration and selection, the relevant command is invisible to
exception handlers and can be found only in a pointer on the stack of a
different thread.

When eh_abort_handler can't find a given command, it can't decide whether
that command was completed already or is still in arbitration or selection
phase. But it must return either SUCCESS (e.g. command completed earlier)
or FAILED (could not abort the nexus, try bus reset).

The solution is to make sure all commands belonging to the LLD are always
visible to exception handlers. Add another scsi_cmnd pointer to the
hostdata struct to track the command in arbitration or selection phase.

Replace 'retain_dma_irq' with the new 'selecting' pointer, to bring
atari_NCR5380.c into line with NCR5380.c.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/scsi/NCR5380.c       |   78 +++++++++++++++++++++++++++++----------
 drivers/scsi/NCR5380.h       |    4 +-
 drivers/scsi/atari_NCR5380.c |   84 +++++++++++++++++++++++++++++++------------
 3 files changed, 121 insertions(+), 45 deletions(-)

Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c	2015-11-18 19:34:27.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c	2015-11-18 19:34:29.000000000 +1100
@@ -908,9 +908,9 @@ static void NCR5380_main(struct work_str
 			 * entire unit.
 			 */
 
-			if (!NCR5380_select(instance, cmd)) {
-				dsprintk(NDEBUG_MAIN, instance, "main: selected target %d for command %p\n",
-				         scmd_id(cmd), cmd);
+			cmd = NCR5380_select(instance, cmd);
+			if (!cmd) {
+				dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
 			} else {
 				dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
 				         "main: select failed, returning %p to queue\n", cmd);
@@ -1057,9 +1057,9 @@ static irqreturn_t NCR5380_intr(int irq,
  * Inputs : instance - instantiation of the 5380 driver on which this 
  *      target lives, cmd - SCSI command to execute.
  * 
- * Returns : -1 if selection failed but should be retried.
- *      0 if selection failed and should not be retried.
- *      0 if selection succeeded completely (hostdata->connected == cmd).
+ * Returns cmd if selection failed but should be retried,
+ * NULL if selection failed and should not be retried, or
+ * NULL if selection succeeded (hostdata->connected == cmd).
  *
  * Side effects : 
  *      If bus busy, arbitration failed, etc, NCR5380_select() will exit 
@@ -1077,7 +1077,8 @@ static irqreturn_t NCR5380_intr(int irq,
  *	Locks: caller holds hostdata lock in IRQ mode
  */
  
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
+                                        struct scsi_cmnd *cmd)
 {
 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
 	unsigned char tmp[3], phase;
@@ -1088,6 +1089,15 @@ static int NCR5380_select(struct Scsi_Ho
 	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
 	dprintk(NDEBUG_ARBITRATION, "scsi%d : starting arbitration, id = %d\n", instance->host_no, instance->this_id);
 
+	/*
+	 * Arbitration and selection phases are slow and involve dropping the
+	 * lock, so we have to watch out for EH. An exception handler may
+	 * change 'selecting' to NULL. This function will then return NULL
+	 * so that the caller will forget about 'cmd'. (During information
+	 * transfer phases, EH may change 'connected' to NULL.)
+	 */
+	hostdata->selecting = cmd;
+
 	/* 
 	 * Set the phase bits to 0, otherwise the NCR5380 won't drive the 
 	 * data bus during SELECTION.
@@ -1113,13 +1123,13 @@ static int NCR5380_select(struct Scsi_Ho
 	spin_lock_irq(&hostdata->lock);
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE)) {
 		/* Reselection interrupt */
-		return -1;
+		goto out;
 	}
 	if (err < 0) {
 		NCR5380_write(MODE_REG, MR_BASE);
 		shost_printk(KERN_ERR, instance,
 		             "select: arbitration timeout\n");
-		return -1;
+		goto out;
 	}
 	spin_unlock_irq(&hostdata->lock);
 
@@ -1131,7 +1141,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(MODE_REG, MR_BASE);
 		dprintk(NDEBUG_ARBITRATION, "scsi%d : lost arbitration, deasserting MR_ARBITRATE\n", instance->host_no);
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/* After/during arbitration, BSY should be asserted.
@@ -1150,7 +1160,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		dsprintk(NDEBUG_ARBITRATION, instance, "arbitration lost, negating SEL\n");
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 	/* 
 	 * Again, bus clear + bus settle time is 1.2us, however, this is 
@@ -1166,7 +1176,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	/* NCR5380_reselect() clears MODE_REG after a reselection interrupt */
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE))
-		return -1;
+		goto out;
+
+	if (!hostdata->selecting) {
+		NCR5380_write(MODE_REG, MR_BASE);
+		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+		goto out;
+	}
 
 	dprintk(NDEBUG_ARBITRATION, "scsi%d : won arbitration\n", instance->host_no);
 
@@ -1239,18 +1255,21 @@ static int NCR5380_select(struct Scsi_Ho
 		if (!hostdata->connected)
 			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 		printk("scsi%d : reselection after won arbitration?\n", instance->host_no);
-		return -1;
+		goto out;
 	}
 
 	if (err < 0) {
 		spin_lock_irq(&hostdata->lock);
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-		cmd->result = DID_BAD_TARGET << 16;
-		complete_cmd(instance, cmd);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		dprintk(NDEBUG_SELECTION, "scsi%d : target did not respond within 250ms\n",
-		        instance->host_no);
-		return 0;
+		/* Can't touch cmd if it has been reclaimed by the scsi ML */
+		if (hostdata->selecting) {
+			cmd->result = DID_BAD_TARGET << 16;
+			complete_cmd(instance, cmd);
+			dsprintk(NDEBUG_SELECTION, instance, "target did not respond within 250ms\n");
+			cmd = NULL;
+		}
+		goto out;
 	}
 
 	/* 
@@ -1286,7 +1305,11 @@ static int NCR5380_select(struct Scsi_Ho
 		shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		return -1;
+		goto out;
+	}
+	if (!hostdata->selecting) {
+		do_abort(instance);
+		goto out;
 	}
 
 	dprintk(NDEBUG_SELECTION, "scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->device->id);
@@ -1307,7 +1330,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	initialize_SCp(cmd);
 
-	return 0;
+	cmd = NULL;
+
+out:
+	if (!hostdata->selecting)
+		return NULL;
+	hostdata->selecting = NULL;
+	return cmd;
 }
 
 /* 
@@ -2359,6 +2388,15 @@ static int NCR5380_abort(struct scsi_cmn
 		cmd->scsi_done(cmd); /* No tag or busy flag to worry about */
 	}
 
+	if (hostdata->selecting == cmd) {
+		dsprintk(NDEBUG_ABORT, instance,
+		         "abort: cmd %p == selecting\n", cmd);
+		hostdata->selecting = NULL;
+		cmd->result = DID_ABORT << 16;
+		complete_cmd(instance, cmd);
+		goto out;
+	}
+
 	if (list_del_cmd(&hostdata->disconnected, cmd)) {
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: removed %p from disconnected list\n", cmd);
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h	2015-11-18 19:34:24.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h	2015-11-18 19:34:29.000000000 +1100
@@ -256,6 +256,7 @@ struct NCR5380_hostdata {
 #endif
 	unsigned char last_message;		/* last message OUT */
 	struct scsi_cmnd *connected;		/* currently connected cmnd */
+	struct scsi_cmnd *selecting;		/* cmnd to be connected */
 	struct list_head unissued;		/* waiting to be issued */
 	struct list_head autosense;		/* priority issue queue */
 	struct list_head disconnected;		/* waiting for reconnect */
@@ -266,7 +267,6 @@ struct NCR5380_hostdata {
 	char info[256];
 	int read_overruns;                /* number of bytes to cut from a
 	                                   * transfer to handle chip overruns */
-	int retain_dma_intr;
 	struct work_struct main_task;
 #ifdef SUPPORT_TAGS
 	struct tag_alloc TagAlloc[8][8];	/* 8 targets and 8 LUNs */
@@ -329,7 +329,7 @@ static irqreturn_t NCR5380_intr(int irq,
 static void NCR5380_main(struct work_struct *work);
 static const char *NCR5380_info(struct Scsi_Host *instance);
 static void NCR5380_reselect(struct Scsi_Host *instance);
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd);
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
 #if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
 static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
 #endif
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c	2015-11-18 19:34:27.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c	2015-11-18 19:34:29.000000000 +1100
@@ -882,7 +882,7 @@ static inline void maybe_release_dma_irq
 	    list_empty(&hostdata->unissued) &&
 	    list_empty(&hostdata->autosense) &&
 	    !hostdata->connected &&
-	    !hostdata->retain_dma_intr)
+	    !hostdata->selecting)
 		NCR5380_release_dma_irq(instance);
 }
 
@@ -1003,14 +1003,11 @@ static void NCR5380_main(struct work_str
 #ifdef SUPPORT_TAGS
 			cmd_get_tag(cmd, cmd->cmnd[0] != REQUEST_SENSE);
 #endif
-			hostdata->retain_dma_intr++;
-			if (!NCR5380_select(instance, cmd)) {
-				dsprintk(NDEBUG_MAIN, instance, "main: selected target %d for command %p\n",
-				         scmd_id(cmd), cmd);
-				hostdata->retain_dma_intr--;
+			cmd = NCR5380_select(instance, cmd);
+			if (!cmd) {
+				dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
 				maybe_release_dma_irq(instance);
 			} else {
-				hostdata->retain_dma_intr--;
 				dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
 				         "main: select failed, returning %p to queue\n", cmd);
 				requeue_cmd(instance, cmd);
@@ -1238,9 +1235,9 @@ static irqreturn_t NCR5380_intr(int irq,
  * Inputs : instance - instantiation of the 5380 driver on which this
  *	target lives, cmd - SCSI command to execute.
  *
- * Returns : -1 if selection failed but should be retried.
- *      0 if selection failed and should not be retried.
- *      0 if selection succeeded completely (hostdata->connected == cmd).
+ * Returns cmd if selection failed but should be retried,
+ * NULL if selection failed and should not be retried, or
+ * NULL if selection succeeded (hostdata->connected == cmd).
  *
  * Side effects :
  *	If bus busy, arbitration failed, etc, NCR5380_select() will exit
@@ -1256,7 +1253,8 @@ static irqreturn_t NCR5380_intr(int irq,
  *		cmd->result host byte set to DID_BAD_TARGET.
  */
 
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
+static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
+                                        struct scsi_cmnd *cmd)
 {
 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
 	unsigned char tmp[3], phase;
@@ -1269,6 +1267,15 @@ static int NCR5380_select(struct Scsi_Ho
 		   instance->this_id);
 
 	/*
+	 * Arbitration and selection phases are slow and involve dropping the
+	 * lock, so we have to watch out for EH. An exception handler may
+	 * change 'selecting' to NULL. This function will then return NULL
+	 * so that the caller will forget about 'cmd'. (During information
+	 * transfer phases, EH may change 'connected' to NULL.)
+	 */
+	hostdata->selecting = cmd;
+
+	/*
 	 * Set the phase bits to 0, otherwise the NCR5380 won't drive the
 	 * data bus during SELECTION.
 	 */
@@ -1293,13 +1300,13 @@ static int NCR5380_select(struct Scsi_Ho
 	spin_lock_irq(&hostdata->lock);
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE)) {
 		/* Reselection interrupt */
-		return -1;
+		goto out;
 	}
 	if (err < 0) {
 		NCR5380_write(MODE_REG, MR_BASE);
 		shost_printk(KERN_ERR, instance,
 		             "select: arbitration timeout\n");
-		return -1;
+		goto out;
 	}
 	spin_unlock_irq(&hostdata->lock);
 
@@ -1314,7 +1321,7 @@ static int NCR5380_select(struct Scsi_Ho
 		dprintk(NDEBUG_ARBITRATION, "scsi%d: lost arbitration, deasserting MR_ARBITRATE\n",
 			   HOSTNO);
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/* After/during arbitration, BSY should be asserted.
@@ -1333,7 +1340,7 @@ static int NCR5380_select(struct Scsi_Ho
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		dsprintk(NDEBUG_ARBITRATION, instance, "arbitration lost, negating SEL\n");
 		spin_lock_irq(&hostdata->lock);
-		return -1;
+		goto out;
 	}
 
 	/*
@@ -1350,7 +1357,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	/* NCR5380_reselect() clears MODE_REG after a reselection interrupt */
 	if (!(NCR5380_read(MODE_REG) & MR_ARBITRATE))
-		return -1;
+		goto out;
+
+	if (!hostdata->selecting) {
+		NCR5380_write(MODE_REG, MR_BASE);
+		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+		goto out;
+	}
 
 	dprintk(NDEBUG_ARBITRATION, "scsi%d: won arbitration\n", HOSTNO);
 
@@ -1426,17 +1439,21 @@ static int NCR5380_select(struct Scsi_Ho
 			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 		printk(KERN_ERR "scsi%d: reselection after won arbitration?\n",
 		       HOSTNO);
-		return -1;
+		goto out;
 	}
 
 	if (err < 0) {
 		spin_lock_irq(&hostdata->lock);
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-		cmd->result = DID_BAD_TARGET << 16;
-		complete_cmd(instance, cmd);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		dprintk(NDEBUG_SELECTION, "scsi%d: target did not respond within 250ms\n", HOSTNO);
-		return 0;
+		/* Can't touch cmd if it has been reclaimed by the scsi ML */
+		if (hostdata->selecting) {
+			cmd->result = DID_BAD_TARGET << 16;
+			complete_cmd(instance, cmd);
+			dsprintk(NDEBUG_SELECTION, instance, "target did not respond within 250ms\n");
+			cmd = NULL;
+		}
+		goto out;
 	}
 
 	/*
@@ -1472,7 +1489,11 @@ static int NCR5380_select(struct Scsi_Ho
 		shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-		return -1;
+		goto out;
+	}
+	if (!hostdata->selecting) {
+		do_abort(instance);
+		goto out;
 	}
 
 	dprintk(NDEBUG_SELECTION, "scsi%d: target %d selected, going into MESSAGE OUT phase.\n",
@@ -1508,7 +1529,13 @@ static int NCR5380_select(struct Scsi_Ho
 
 	initialize_SCp(cmd);
 
-	return 0;
+	cmd = NULL;
+
+out:
+	if (!hostdata->selecting)
+		return NULL;
+	hostdata->selecting = NULL;
+	return cmd;
 }
 
 /*
@@ -2572,6 +2599,15 @@ static int NCR5380_abort(struct scsi_cmn
 		cmd->scsi_done(cmd); /* No tag or busy flag to worry about */
 	}
 
+	if (hostdata->selecting == cmd) {
+		dsprintk(NDEBUG_ABORT, instance,
+		         "abort: cmd %p == selecting\n", cmd);
+		hostdata->selecting = NULL;
+		cmd->result = DID_ABORT << 16;
+		complete_cmd(instance, cmd);
+		goto out;
+	}
+
 	if (list_del_cmd(&hostdata->disconnected, cmd)) {
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: removed %p from disconnected list\n", cmd);
@@ -2689,6 +2725,8 @@ static int NCR5380_bus_reset(struct scsi
 	 * commands!
 	 */
 
+	hostdata->selecting = NULL;
+
 	if (hostdata->connected)
 		dsprintk(NDEBUG_ABORT, instance, "reset aborted a connected command\n");
 	hostdata->connected = NULL;

  parent reply	other threads:[~2015-11-18  8:46 UTC|newest]

Thread overview: 268+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-18  8:34 [PATCH 00/71] More fixes, cleanup and modernization for NCR5380 drivers Finn Thain
2015-11-18  8:34 ` Finn Thain
2015-11-18  8:34 ` [PATCH 01/71] atari_scsi: Fix SCSI host ID setting Finn Thain
2015-11-18  8:34   ` Finn Thain
2015-11-19  7:37   ` Hannes Reinecke
2015-11-18  8:34 ` [PATCH 02/71] ncr5380: Remove redundant static variable initializers Finn Thain
2015-11-18  8:34   ` Finn Thain
2015-11-19  7:37   ` Hannes Reinecke
2015-11-18  8:34 ` [PATCH 03/71] ncr5380: Eliminate PDEBUG*, TDEBUG* and DTCDEBUG* macros Finn Thain
2015-11-18  8:34   ` Finn Thain
2015-11-19  7:38   ` Hannes Reinecke
2015-11-18  8:34 ` [PATCH 04/71] ncr5380: Remove more pointless macros Finn Thain
2015-11-18  8:34   ` Finn Thain
2015-11-19  7:38   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 05/71] ncr5380: Remove NCR5380_local_declare and NCR5380_setup macros Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19  7:41   ` Hannes Reinecke
2015-11-19  7:41     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 06/71] ncr5380: Remove NCR5380_instance_name macro Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19  7:41   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 07/71] ncr5380: Split NCR5380_init() into two functions Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 13:30   ` Hannes Reinecke
2015-11-19 13:30     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 08/71] ncr5380: Move NCR53C400-specific code Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 13:31   ` Hannes Reinecke
2015-11-19 13:31     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 09/71] atari_NCR5380: Reset bus on driver initialization if required Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 13:38   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 10/71] atari_NCR5380: Remove RESET_BOOT, CONFIG_ATARI_SCSI_TOSHIBA_DELAY and CONFIG_ATARI_SCSI_RESET_BOOT Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19  3:05   ` Michael Schmitz
2015-11-19  4:05     ` Finn Thain
2015-11-19  4:43       ` Michael Schmitz
2015-11-19 13:41   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 11/71] ncr5380: Simplify bus reset handlers Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 13:56   ` Hannes Reinecke
2015-11-19 13:56     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 12/71] ncr5380: Remove unused hostdata->aborted flag Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 14:13   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 13/71] ncr5380: Remove redundant register writes Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 14:14   ` Hannes Reinecke
2015-11-19 14:14     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 14/71] ncr5380: Use return instead of goto in NCR5380_select() Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 14:14   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 15/71] ncr5380: Always escalate bad target time-out " Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 14:15   ` Hannes Reinecke
2015-11-19 14:15     ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 16/71] ncr5380: Proceed with next command after NCR5380_select() calls scsi_done Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-19 14:16   ` Hannes Reinecke
2015-11-18  8:35 ` [PATCH 17/71] ncr5380: Keep BSY asserted when entering SELECTION phase Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 18/71] ncr5380: Eliminate USLEEP_WAITLONG delay Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 19/71] ncr5380: Cleanup bogus {request,release}_region() calls Finn Thain
2015-11-18  8:35   ` [PATCH 19/71] ncr5380: Cleanup bogus {request, release}_region() calls Finn Thain
2015-11-18  8:35   ` [PATCH 19/71] ncr5380: Cleanup bogus {request,release}_region() calls Finn Thain
2015-11-18  8:35 ` [PATCH 20/71] ncr5380: Introduce unbound workqueue Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 21/71] ncr5380: Sleep when polling, if possible Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 22/71] ncr5380: Eliminate selecting state Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-24 19:08   ` Ondrej Zary
2015-11-25  3:17     ` Finn Thain
2015-11-25 21:59       ` Ondrej Zary
2015-11-26 10:23         ` Finn Thain
2015-11-26 19:35           ` Ondrej Zary
2015-11-26 22:32             ` Finn Thain
2015-11-28 23:13               ` Ondrej Zary
2015-11-29  0:46                 ` Finn Thain
2015-11-29  9:09                   ` Ondrej Zary
2015-11-29  9:27               ` Geert Uytterhoeven
2015-11-29 10:25                 ` Finn Thain
2015-11-29 13:50                   ` Geert Uytterhoeven
2015-11-30  2:12                     ` Finn Thain
2015-11-18  8:35 ` [PATCH 23/71] ncr5380: Always retry arbitration and selection Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 24/71] ncr5380: Implement NCR5380_dma_xfer_len and remove LIMIT_TRANSFERSIZE macro Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 25/71] ncr5380: Rework disconnect versus poll logic Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 26/71] ncr5380: Fix NCR5380_transfer_pio() result Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 27/71] ncr5380: Add missing lock in eh_abort_handler Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 28/71] ncr5380: Drop DEF_SCSI_QCMD macro Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 29/71] ncr5380: Remove references to linked commands Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 30/71] ncr5380: Add missing break after case MESSAGE_REJECT Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 31/71] ncr5380: Fix !REQ timeout in do_abort() Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 32/71] ncr5380: Fix bus phase " Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 33/71] atari_NCR5380: Set do_abort() timeouts Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 34/71] atari_NCR5380: Use arbitration timeout Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 35/71] ncr5380: Dont wait for BUS FREE after disconnect Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 36/71] ncr5380: Use work_struct instead of delayed_work Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 37/71] ncr5380: Standardize work queueing algorithm Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 38/71] ncr5380: Remove UNSAFE macro Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 39/71] ncr5380: Standardize interrupt handling Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 40/71] ncr5380: Introduce NCR5380_poll_politely2 Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 41/71] ncr5380: Replace redundant flags with FLAG_NO_DMA_FIXUP Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 42/71] ncr5380: Replace READ_OVERRUNS macro with FLAG_NO_DMA_FIXUPS Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 43/71] ncr5380: Standardize reselection handling Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 44/71] ncr5380: Fix off-by-one bug in extended_msg[] bounds check Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 45/71] ncr5380: Cleanup #include directives Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 46/71] ncr5380: Fix NDEBUG_NO_DATAOUT flag Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 47/71] ncr5380: Fix and cleanup scsi_host_template initializers Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 48/71] atari_NCR5380: Fix queue_size limit Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 49/71] atari_NCR5380: Introduce FLAG_DTC3181E Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 50/71] ncr5380: Change instance->host_lock to hostdata->lock Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 51/71] ncr5380: Remove command list debug code Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 52/71] ncr5380: Remove H_NO macro and introduce dsprintk Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 53/71] ncr5380: Use shost_priv helper Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 54/71] ncr5380: Use dsprintk() for queue debugging Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 55/71] ncr5380: Remove LIST and REMOVE macros Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 56/71] ncr5380: Remove redundant volatile qualifiers Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 57/71] ncr5380: Use standard list data structure Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 58/71] ncr5380: Refactor command completion Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 59/71] ncr5380: Fix autosense bugs Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 60/71] ncr5380: Implement new eh_abort_handler Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` Finn Thain [this message]
2015-11-18  8:35   ` [PATCH 61/71] ncr5380: Fix EH during arbitration and selection Finn Thain
2015-11-18  8:35 ` [PATCH 62/71] ncr5380: Implement new eh_bus_reset_handler Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 63/71] atari_NCR5380: Remove HOSTNO macro from printk() and seq_printf() calls Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:35 ` [PATCH 64/71] atari_NCR5380: Eliminate HOSTNO macro Finn Thain
2015-11-18  8:35   ` Finn Thain
2015-11-18  8:36 ` [PATCH 65/71] atari_scsi, sun3_scsi: Remove global Scsi_Host pointer Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 66/71] ncr5380: Fix soft lockups Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 67/71] ncr5380: Cleanup comments Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 68/71] ncr5380: Fix whitespace issues using regexp Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 69/71] ncr5380: Merge changes from atari_NCR5380.c Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 70/71] atari_NCR5380: Merge changes from NCR5380.c Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18  8:36 ` [PATCH 71/71] ncr5380: Cleanup whitespace and parentheses Finn Thain
2015-11-18  8:36   ` Finn Thain
2015-11-18 11:35 ` [PATCH 00/71] More fixes, cleanup and modernization for NCR5380 drivers Ondrej Zary
2015-11-19  2:24   ` Finn Thain
2015-11-19  2:52     ` Michael Schmitz
2015-11-19  7:48     ` Ondrej Zary
2015-11-19 22:50     ` Ondrej Zary
2015-11-20  1:41       ` Finn Thain
2015-11-20  7:21         ` Finn Thain
2015-11-20  7:33           ` Christoph Hellwig
2015-11-20  8:19             ` Finn Thain
2015-11-20  9:16               ` Ondrej Zary
2015-11-20 10:00               ` Christoph Hellwig
2015-11-20 10:53                 ` Finn Thain
2015-11-20 11:40                   ` Ondrej Zary
2015-11-20 11:45                     ` Christoph Hellwig
2015-11-20 12:23                     ` Geert Uytterhoeven
2015-11-20 12:46                       ` Ondrej Zary
2015-11-20  7:35         ` Ondrej Zary
2015-11-20 18:29         ` Ondrej Zary
2015-11-21  1:58           ` Finn Thain
2015-11-21 13:01             ` Ondrej Zary
2015-11-21 23:07               ` Ondrej Zary
2015-11-21 23:32               ` Finn Thain
2015-11-23 22:55                 ` Ondrej Zary
2015-11-24  1:21                   ` Finn Thain
2015-11-24  8:04                     ` Ondrej Zary
2015-11-24  9:13                       ` Finn Thain
2015-11-24 12:03                         ` Ondrej Zary
2015-11-24 18:04                           ` Ondrej Zary
2015-11-24 21:40                         ` Ondrej Zary
2015-11-25  2:10                           ` Finn Thain
2015-11-25  9:04                             ` Ondrej Zary
2015-11-25 11:50                               ` Finn Thain
2015-11-25 23:01                               ` Ondrej Zary
2015-11-25 21:34 ` [PATCH 72/71] ncr5380: Fix pseudo-DMA Ondrej Zary
2015-11-29  9:39 ` [RFC PATCH 73/71] ncr5380: Use runtime register mapping Ondrej Zary
2015-11-30 11:50   ` Finn Thain
2015-11-29  9:39 ` [RFC PATCH 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary
2015-11-30 11:52   ` Finn Thain
2015-11-30 12:04   ` Finn Thain
2015-11-30 13:40     ` Ondrej Zary
2015-12-06  3:20       ` Finn Thain
2015-11-29 10:01 ` [RFC PATCH 75/71] ncr5380: Remove FLAG_DTC3181E Ondrej Zary
2015-11-30  4:56   ` Finn Thain
2015-12-03 23:03 ` [RFC PATCH 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary
2015-12-04  0:12   ` Julian Calaby
2015-12-04  8:38     ` Finn Thain
2015-12-05  1:32       ` Julian Calaby
2015-12-05  2:12         ` Finn Thain
2015-12-05  2:38           ` Julian Calaby
2015-12-04  9:08   ` Finn Thain
2015-12-04  9:32     ` Ondrej Zary
2015-12-04  9:20   ` Finn Thain
2015-12-03 23:03 ` [RFC PATCH 77/71] ncr5380: Fix wait for 53C80 registers registers after PDMA Ondrej Zary
2015-12-04 21:00 ` [PATCH 73/71] ncr5380: Use runtime register mapping Ondrej Zary
2015-12-06  3:39   ` Finn Thain
2015-12-06  8:42     ` Geert Uytterhoeven
2015-12-04 21:02 ` [PATCH 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary
2015-12-06  3:41   ` Finn Thain
2015-12-04 21:17 ` [PATCH 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary
2015-12-06  3:40   ` Finn Thain
2015-12-06 22:47     ` Ondrej Zary
2015-12-05 21:18 ` [RFC PATCH 78/71] ncr5380: Add support for HP 53C400A-based cards (C2502) Ondrej Zary
2015-12-06  3:39   ` Finn Thain
2015-12-06 22:20 ` [PATCH v2 73/71] ncr5380: Use runtime register mapping Ondrej Zary
2015-12-06 22:21 ` [PATCH v2 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary
2015-12-08  2:05   ` Finn Thain
2015-12-09 13:39     ` Ondrej Zary
2015-12-10 23:39       ` Finn Thain
2015-12-06 22:55 ` [PATCH v2 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary
2015-12-06 23:17 ` [PATCH v2 77/71] ncr5380: Fix wait for 53C80 registers registers after PDMA Ondrej Zary
2015-12-07  3:16   ` Finn Thain
2015-12-07  8:08     ` Ondrej Zary
2015-12-06 23:20 ` [PATCH v3 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary
2015-12-08  7:51 ` [PATCH v2 78/71] ncr5380: Add support for HP 53C400A-based cards (C2502) Ondrej Zary
2015-12-08 11:40   ` Finn Thain
2015-12-09 11:33     ` Ondrej Zary
2015-12-10 23:38       ` Finn Thain
2015-12-09 12:11 ` [PATCH v3 " Ondrej Zary

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=20151118083516.944145264@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=JBottomley@odin.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=schmitzmic@gmail.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.