All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20160103050516.111799314@telegraphics.com.au>

diff --git a/a/1.txt b/N1/1.txt
index d4a7c8b..6333d06 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,945 +1,3 @@
-The NCR5380 drivers have a home-spun linked list implementation for
-scsi_cmnd structs that uses cmd->host_scribble as a 'next' pointer. Adopt
-the standard list_head data structure and list operations instead. Remove
-the eh_abort_handler rather than convert it. Doing the conversion would
-only be churn because the existing EH handlers don't work and get replaced
-in a subsequent patch.
-
-Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
-Reviewed-by: Hannes Reinecke <hare@suse.com>
-Tested-by: Ondrej Zary <linux@rainbow-software.org>
-Tested-by: Michael Schmitz <schmitzmic@gmail.com>
-
----
-
-Changed since v2:
-- Fix NULL pointer dereference in NCR5380_reselect() when SUPPORT_TAGS is
-  enabled in the atari_NCR5380.c core driver.
-
----
- drivers/scsi/NCR5380.c       |  214 +++++---------------------------
- drivers/scsi/NCR5380.h       |   16 ++
- drivers/scsi/arm/cumana_1.c  |    1 
- drivers/scsi/arm/oak.c       |    1 
- drivers/scsi/atari_NCR5380.c |  287 ++++++-------------------------------------
- drivers/scsi/atari_scsi.c    |    1 
- drivers/scsi/dmx3191d.c      |    1 
- drivers/scsi/dtc.c           |    1 
- drivers/scsi/g_NCR5380.c     |    1 
- drivers/scsi/mac_scsi.c      |    1 
- drivers/scsi/pas16.c         |    1 
- drivers/scsi/sun3_scsi.c     |    1 
- drivers/scsi/t128.c          |    1 
- 13 files changed, 106 insertions(+), 421 deletions(-)
-
-Index: linux/drivers/scsi/NCR5380.c
-===================================================================
---- linux.orig/drivers/scsi/NCR5380.c	2016-01-03 16:04:18.000000000 +1100
-+++ linux/drivers/scsi/NCR5380.c	2016-01-03 16:04:20.000000000 +1100
-@@ -622,8 +622,9 @@ static int NCR5380_init(struct Scsi_Host
- #endif
- 	spin_lock_init(&hostdata->lock);
- 	hostdata->connected = NULL;
--	hostdata->issue_queue = NULL;
--	hostdata->disconnected_queue = NULL;
-+	INIT_LIST_HEAD(&hostdata->unissued);
-+	INIT_LIST_HEAD(&hostdata->disconnected);
-+
- 	hostdata->flags = flags;
- 	
- 	INIT_WORK(&hostdata->main_task, NCR5380_main);
-@@ -738,7 +739,7 @@ static int NCR5380_queue_command(struct
-                                  struct scsi_cmnd *cmd)
- {
- 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
--	struct scsi_cmnd *tmp;
-+	struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);
- 	unsigned long flags;
- 
- #if (NDEBUG & NDEBUG_NO_WRITE)
-@@ -752,12 +753,6 @@ static int NCR5380_queue_command(struct
- 	}
- #endif				/* (NDEBUG & NDEBUG_NO_WRITE) */
- 
--	/* 
--	 * We use the host_scribble field as a pointer to the next command  
--	 * in a queue 
--	 */
--
--	cmd->host_scribble = NULL;
- 	cmd->result = 0;
- 
- 	spin_lock_irqsave(&hostdata->lock, flags);
-@@ -769,13 +764,11 @@ static int NCR5380_queue_command(struct
- 	 * sense data is only guaranteed to be valid while the condition exists.
- 	 */
- 
--	if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
--		cmd->host_scribble = (unsigned char *) hostdata->issue_queue;
--		hostdata->issue_queue = cmd;
--	} else {
--		for (tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (struct scsi_cmnd *) tmp->host_scribble);
--		tmp->host_scribble = (unsigned char *) cmd;
--	}
-+	if (cmd->cmnd[0] == REQUEST_SENSE)
-+		list_add(&ncmd->list, &hostdata->unissued);
-+	else
-+		list_add_tail(&ncmd->list, &hostdata->unissued);
-+
- 	spin_unlock_irqrestore(&hostdata->lock, flags);
- 
- 	dsprintk(NDEBUG_QUEUES, instance, "command %p added to %s of queue\n",
-@@ -803,7 +796,7 @@ static void NCR5380_main(struct work_str
- 	struct NCR5380_hostdata *hostdata =
- 		container_of(work, struct NCR5380_hostdata, main_task);
- 	struct Scsi_Host *instance = hostdata->host;
--	struct scsi_cmnd *tmp, *prev;
-+	struct NCR5380_cmd *ncmd, *n;
- 	int done;
- 	
- 	spin_lock_irq(&hostdata->lock);
-@@ -816,23 +809,20 @@ static void NCR5380_main(struct work_str
- 			 * Search through the issue_queue for a command destined
- 			 * for a target that's not busy.
- 			 */
--			for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble)
--			{
-+			list_for_each_entry_safe(ncmd, n, &hostdata->unissued,
-+			                         list) {
-+				struct scsi_cmnd *tmp = NCR5380_to_scmd(ncmd);
-+
- 				dsprintk(NDEBUG_QUEUES, instance, "main: tmp=%p target=%d busy=%d lun=%llu\n",
- 				         tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],
- 				         tmp->device->lun);
- 				/*  When we find one, remove it from the issue queue. */
- 				if (!(hostdata->busy[tmp->device->id] &
- 				      (1 << (u8)(tmp->device->lun & 0xff)))) {
--					if (prev) {
--						prev->host_scribble = tmp->host_scribble;
--					} else {
--						hostdata->issue_queue = (struct scsi_cmnd *) tmp->host_scribble;
--					}
--					tmp->host_scribble = NULL;
-+					list_del(&ncmd->list);
- 					dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,
--					         instance, "main: removed %p from issue queue %p\n",
--					         tmp, prev);
-+					         instance, "main: removed %p from issue queue\n",
-+					         tmp);
- 
- 					/* 
- 					 * Attempt to establish an I_T_L nexus here. 
-@@ -851,8 +841,7 @@ static void NCR5380_main(struct work_str
- 						/* OK or bad target */
- 					} else {
- 						/* Need to retry */
--						tmp->host_scribble = (unsigned char *) hostdata->issue_queue;
--						hostdata->issue_queue = tmp;
-+						list_add(&ncmd->list, &hostdata->unissued);
- 						dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,
- 						         instance, "main: select() failed, %p returned to issue queue\n",
- 						         tmp);
-@@ -1744,6 +1733,8 @@ static void NCR5380_information_transfer
- 	struct scsi_cmnd *cmd;
- 
- 	while ((cmd = hostdata->connected)) {
-+		struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);
-+
- 		tmp = NCR5380_read(STATUS_REG);
- 		/* We only have a valid SCSI phase when REQ is asserted */
- 		if (tmp & SR_REQ) {
-@@ -1875,9 +1866,7 @@ static void NCR5380_information_transfer
- 					if ((cmd->cmnd[0] != REQUEST_SENSE) && (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) {
- 						scsi_eh_prep_cmnd(cmd, &hostdata->ses, NULL, 0, ~0);
- 
--						cmd->host_scribble = (unsigned char *)
--						    hostdata->issue_queue;
--						hostdata->issue_queue = (struct scsi_cmnd *) cmd;
-+						list_add(&ncmd->list, &hostdata->unissued);
- 						dsprintk(NDEBUG_AUTOSENSE | NDEBUG_QUEUES,
- 						         instance, "REQUEST SENSE cmd %p added to head of issue queue\n",
- 						         cmd);
-@@ -1911,10 +1900,8 @@ static void NCR5380_information_transfer
- 				case DISCONNECT:{
- 						/* Accept message by clearing ACK */
- 						NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
--						cmd->host_scribble = (unsigned char *)
--						    hostdata->disconnected_queue;
- 						hostdata->connected = NULL;
--						hostdata->disconnected_queue = cmd;
-+						list_add(&ncmd->list, &hostdata->disconnected);
- 						dsprintk(NDEBUG_INFORMATION | NDEBUG_QUEUES,
- 						         instance, "connected command %p for target %d lun %llu moved to disconnected queue\n",
- 						         cmd, scmd_id(cmd), cmd->device->lun);
-@@ -2087,7 +2074,8 @@ static void NCR5380_reselect(struct Scsi
- 	int len;
- 	unsigned char msg[3];
- 	unsigned char *data;
--	struct scsi_cmnd *tmp = NULL, *prev;
-+	struct NCR5380_cmd *ncmd;
-+	struct scsi_cmnd *tmp;
- 
- 	/*
- 	 * Disable arbitration, etc. since the host adapter obviously
-@@ -2156,16 +2144,14 @@ static void NCR5380_reselect(struct Scsi
- 	 * just reestablished, and remove it from the disconnected queue.
- 	 */
- 
--	for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;
--	     tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble) {
--		if ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)) {
--			if (prev) {
--				prev->host_scribble = tmp->host_scribble;
--			} else {
--				hostdata->disconnected_queue =
--					(struct scsi_cmnd *) tmp->host_scribble;
--			}
--			tmp->host_scribble = NULL;
-+	tmp = NULL;
-+	list_for_each_entry(ncmd, &hostdata->disconnected, list) {
-+		struct scsi_cmnd *cmd = NCR5380_to_scmd(ncmd);
-+
-+		if (target_mask == (1 << scmd_id(cmd)) &&
-+		    lun == (u8)cmd->device->lun) {
-+			list_del(&ncmd->list);
-+			tmp = cmd;
- 			break;
- 		}
- 	}
-@@ -2261,146 +2247,18 @@ static int NCR5380_abort(struct scsi_cmn
- {
- 	struct Scsi_Host *instance = cmd->device->host;
- 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
--	struct scsi_cmnd *tmp, **prev;
- 	unsigned long flags;
- 
--	scmd_printk(KERN_WARNING, cmd, "aborting command\n");
--
- 	spin_lock_irqsave(&hostdata->lock, flags);
- 
-+#if (NDEBUG & NDEBUG_ANY)
-+	scmd_printk(KERN_INFO, cmd, "aborting command\n");
-+#endif
- 	NCR5380_dprint(NDEBUG_ANY, instance);
- 	NCR5380_dprint_phase(NDEBUG_ANY, instance);
- 
--	dprintk(NDEBUG_ABORT, "scsi%d : abort called\n", instance->host_no);
--	dprintk(NDEBUG_ABORT, "        basr 0x%X, sr 0x%X\n", NCR5380_read(BUS_AND_STATUS_REG), NCR5380_read(STATUS_REG));
--
--#if 0
--/*
-- * Case 1 : If the command is the currently executing command, 
-- * we'll set the aborted flag and return control so that 
-- * information transfer routine can exit cleanly.
-- */
--
--	if (hostdata->connected == cmd) {
--		dprintk(NDEBUG_ABORT, "scsi%d : aborting connected command\n", instance->host_no);
--/*
-- * We should perform BSY checking, and make sure we haven't slipped
-- * into BUS FREE.
-- */
--
--		NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN);
--/* 
-- * Since we can't change phases until we've completed the current 
-- * handshake, we have to source or sink a byte of data if the current
-- * phase is not MSGOUT.
-- */
--
--/* 
-- * Return control to the executing NCR drive so we can clear the
-- * aborted flag and get back into our main loop.
-- */
--
--		return SUCCESS;
--	}
--#endif
--
--/* 
-- * Case 2 : If the command hasn't been issued yet, we simply remove it 
-- *          from the issue queue.
-- */
-- 
--	dprintk(NDEBUG_ABORT, "scsi%d : abort going into loop.\n", instance->host_no);
--	for (prev = (struct scsi_cmnd **) &(hostdata->issue_queue), tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)
--		if (cmd == tmp) {
--			(*prev) = (struct scsi_cmnd *) tmp->host_scribble;
--			tmp->host_scribble = NULL;
--			spin_unlock_irqrestore(&hostdata->lock, flags);
--			tmp->result = DID_ABORT << 16;
--			dprintk(NDEBUG_ABORT, "scsi%d : abort removed command from issue queue.\n", instance->host_no);
--			tmp->scsi_done(tmp);
--			return SUCCESS;
--		}
--#if (NDEBUG  & NDEBUG_ABORT)
--	/* KLL */
--		else if (prev == tmp)
--			printk(KERN_ERR "scsi%d : LOOP\n", instance->host_no);
--#endif
--
--/* 
-- * Case 3 : If any commands are connected, we're going to fail the abort
-- *          and let the high level SCSI driver retry at a later time or 
-- *          issue a reset.
-- *
-- *          Timeouts, and therefore aborted commands, will be highly unlikely
-- *          and handling them cleanly in this situation would make the common
-- *          case of noresets less efficient, and would pollute our code.  So,
-- *          we fail.
-- */
--
--	if (hostdata->connected) {
--		spin_unlock_irqrestore(&hostdata->lock, flags);
--		dprintk(NDEBUG_ABORT, "scsi%d : abort failed, command connected.\n", instance->host_no);
--		return FAILED;
--	}
--/*
-- * Case 4: If the command is currently disconnected from the bus, and 
-- *      there are no connected commands, we reconnect the I_T_L or 
-- *      I_T_L_Q nexus associated with it, go into message out, and send 
-- *      an abort message.
-- *
-- * This case is especially ugly. In order to reestablish the nexus, we
-- * need to call NCR5380_select().  The easiest way to implement this 
-- * function was to abort if the bus was busy, and let the interrupt
-- * handler triggered on the SEL for reselect take care of lost arbitrations
-- * where necessary, meaning interrupts need to be enabled.
-- *
-- * When interrupts are enabled, the queues may change - so we 
-- * can't remove it from the disconnected queue before selecting it
-- * because that could cause a failure in hashing the nexus if that 
-- * device reselected.
-- * 
-- * Since the queues may change, we can't use the pointers from when we
-- * first locate it.
-- *
-- * So, we must first locate the command, and if NCR5380_select()
-- * succeeds, then issue the abort, relocate the command and remove
-- * it from the disconnected queue.
-- */
--
--	for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; tmp = (struct scsi_cmnd *) tmp->host_scribble)
--		if (cmd == tmp) {
--			dprintk(NDEBUG_ABORT, "scsi%d : aborting disconnected command.\n", instance->host_no);
--
--			if (NCR5380_select(instance, cmd)) {
--				spin_unlock_irq(&hostdata->lock);
--				return FAILED;
--			}
--			dprintk(NDEBUG_ABORT, "scsi%d : nexus reestablished.\n", instance->host_no);
--
--			do_abort(instance);
--
--			for (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue), tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)
--				if (cmd == tmp) {
--					*prev = (struct scsi_cmnd *) tmp->host_scribble;
--					tmp->host_scribble = NULL;
--					spin_unlock_irqrestore(&hostdata->lock, flags);
--					tmp->result = DID_ABORT << 16;
--					tmp->scsi_done(tmp);
--					return SUCCESS;
--				}
--		}
--/*
-- * Case 5 : If we reached this point, the command was not found in any of 
-- *          the queues.
-- *
-- * We probably reached this point because of an unlikely race condition
-- * between the command completing successfully and the abortion code,
-- * so we won't panic, but we will notify the user in case something really
-- * broke.
-- */
- 	spin_unlock_irqrestore(&hostdata->lock, flags);
--	printk(KERN_WARNING "scsi%d : warning : SCSI command probably completed successfully\n"
--			"         before abortion\n", instance->host_no);
-+
- 	return FAILED;
- }
- 
-Index: linux/drivers/scsi/atari_NCR5380.c
-===================================================================
---- linux.orig/drivers/scsi/atari_NCR5380.c	2016-01-03 16:04:19.000000000 +1100
-+++ linux/drivers/scsi/atari_NCR5380.c	2016-01-03 16:04:20.000000000 +1100
-@@ -175,10 +175,6 @@
-  * possible) function may be used.
-  */
- 
--#define	NEXT(cmd)		((struct scsi_cmnd *)(cmd)->host_scribble)
--#define	SET_NEXT(cmd,next)	((cmd)->host_scribble = (void *)(next))
--#define	NEXTADDR(cmd)		((struct scsi_cmnd **)&(cmd)->host_scribble)
--
- #define	HOSTNO		instance->host_no
- 
- static int do_abort(struct Scsi_Host *);
-@@ -665,8 +661,9 @@ static int __init NCR5380_init(struct Sc
- #endif
- 	spin_lock_init(&hostdata->lock);
- 	hostdata->connected = NULL;
--	hostdata->issue_queue = NULL;
--	hostdata->disconnected_queue = NULL;
-+	INIT_LIST_HEAD(&hostdata->unissued);
-+	INIT_LIST_HEAD(&hostdata->disconnected);
-+
- 	hostdata->flags = flags;
- 
- 	INIT_WORK(&hostdata->main_task, NCR5380_main);
-@@ -781,7 +778,7 @@ static int NCR5380_queue_command(struct
-                                  struct scsi_cmnd *cmd)
- {
- 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
--	struct scsi_cmnd *tmp;
-+	struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);
- 	unsigned long flags;
- 
- #if (NDEBUG & NDEBUG_NO_WRITE)
-@@ -795,12 +792,6 @@ static int NCR5380_queue_command(struct
- 	}
- #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
- 
--	/*
--	 * We use the host_scribble field as a pointer to the next command
--	 * in a queue
--	 */
--
--	SET_NEXT(cmd, NULL);
- 	cmd->result = 0;
- 
- 	/*
-@@ -834,15 +825,11 @@ static int NCR5380_queue_command(struct
- 	 * sense data is only guaranteed to be valid while the condition exists.
- 	 */
- 
--	if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
--		SET_NEXT(cmd, hostdata->issue_queue);
--		hostdata->issue_queue = cmd;
--	} else {
--		for (tmp = (struct scsi_cmnd *)hostdata->issue_queue;
--		     NEXT(tmp); tmp = NEXT(tmp))
--			;
--		SET_NEXT(tmp, cmd);
--	}
-+	if (cmd->cmnd[0] == REQUEST_SENSE)
-+		list_add(&ncmd->list, &hostdata->unissued);
-+	else
-+		list_add_tail(&ncmd->list, &hostdata->unissued);
-+
- 	spin_unlock_irqrestore(&hostdata->lock, flags);
- 
- 	dsprintk(NDEBUG_QUEUES, instance, "command %p added to %s of queue\n",
-@@ -858,8 +845,8 @@ static inline void maybe_release_dma_irq
- 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
- 
- 	/* Caller does the locking needed to set & test these data atomically */
--	if (!hostdata->disconnected_queue &&
--	    !hostdata->issue_queue &&
-+	if (list_empty(&hostdata->disconnected) &&
-+	    list_empty(&hostdata->unissued) &&
- 	    !hostdata->connected &&
- 	    !hostdata->retain_dma_intr)
- 		NCR5380_release_dma_irq(instance);
-@@ -881,7 +868,7 @@ static void NCR5380_main(struct work_str
- 	struct NCR5380_hostdata *hostdata =
- 		container_of(work, struct NCR5380_hostdata, main_task);
- 	struct Scsi_Host *instance = hostdata->host;
--	struct scsi_cmnd *tmp, *prev;
-+	struct NCR5380_cmd *ncmd, *n;
- 	int done;
- 
- 	/*
-@@ -900,17 +887,9 @@ static void NCR5380_main(struct work_str
- 			 * Search through the issue_queue for a command destined
- 			 * for a target that's not busy.
- 			 */
--#if (NDEBUG & NDEBUG_LISTS)
--			for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL;
--			     tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp))
--				;
--			/*printk("%p  ", tmp);*/
--			if ((tmp == prev) && tmp)
--				printk(" LOOP\n");
--			/* else printk("\n"); */
--#endif
--			for (tmp = (struct scsi_cmnd *) hostdata->issue_queue,
--			     prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
-+			list_for_each_entry_safe(ncmd, n, &hostdata->unissued,
-+			                         list) {
-+				struct scsi_cmnd *tmp = NCR5380_to_scmd(ncmd);
- 				u8 lun = tmp->device->lun;
- 
- 				dsprintk(NDEBUG_QUEUES, instance, "main: tmp=%p target=%d busy=%d lun=%d\n",
-@@ -923,15 +902,10 @@ static void NCR5380_main(struct work_str
- 				    !(hostdata->busy[tmp->device->id] & (1 << lun))
- #endif
- 				    ) {
--					if (prev) {
--						SET_NEXT(prev, NEXT(tmp));
--					} else {
--						hostdata->issue_queue = NEXT(tmp);
--					}
--					SET_NEXT(tmp, NULL);
-+					list_del(&ncmd->list);
- 					dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,
--					         instance, "main: removed %p from issue queue %p\n",
--					         tmp, prev);
-+					         instance, "main: removed %p from issue queue\n",
-+					         tmp);
- 
- 					hostdata->retain_dma_intr++;
- 
-@@ -960,8 +934,7 @@ static void NCR5380_main(struct work_str
- 						maybe_release_dma_irq(instance);
- 					} else {
- 						/* Need to retry */
--						SET_NEXT(tmp, hostdata->issue_queue);
--						hostdata->issue_queue = tmp;
-+						list_add(&ncmd->list, &hostdata->unissued);
- 						dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,
- 						         instance, "main: select() failed, %p returned to issue queue\n",
- 						         tmp);
-@@ -1834,6 +1807,8 @@ static void NCR5380_information_transfer
- #endif
- 
- 	while ((cmd = hostdata->connected)) {
-+		struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);
-+
- 		tmp = NCR5380_read(STATUS_REG);
- 		/* We only have a valid SCSI phase when REQ is asserted */
- 		if (tmp & SR_REQ) {
-@@ -2042,8 +2017,7 @@ static void NCR5380_information_transfer
- 					    (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) {
- 						scsi_eh_prep_cmnd(cmd, &hostdata->ses, NULL, 0, ~0);
- 
--						SET_NEXT(cmd, hostdata->issue_queue);
--						hostdata->issue_queue = (struct scsi_cmnd *) cmd;
-+						list_add(&ncmd->list, &hostdata->unissued);
- 						dsprintk(NDEBUG_AUTOSENSE | NDEBUG_QUEUES,
- 						         instance, "REQUEST SENSE cmd %p added to head of issue queue\n",
- 						         cmd);
-@@ -2092,9 +2066,8 @@ static void NCR5380_information_transfer
- 				case DISCONNECT:
- 					/* Accept message by clearing ACK */
- 					NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
--					SET_NEXT(cmd, hostdata->disconnected_queue);
- 					hostdata->connected = NULL;
--					hostdata->disconnected_queue = cmd;
-+					list_add(&ncmd->list, &hostdata->disconnected);
- 					dsprintk(NDEBUG_INFORMATION | NDEBUG_QUEUES,
- 					         instance, "connected command %p for target %d lun %llu moved to disconnected queue\n",
- 					         cmd, scmd_id(cmd), cmd->device->lun);
-@@ -2288,7 +2261,8 @@ static void NCR5380_reselect(struct Scsi
- 	unsigned char msg[3];
- 	int __maybe_unused len;
- 	unsigned char __maybe_unused *data, __maybe_unused phase;
--	struct scsi_cmnd *tmp = NULL, *prev;
-+	struct NCR5380_cmd *ncmd;
-+	struct scsi_cmnd *tmp;
- 
- 	/*
- 	 * Disable arbitration, etc. since the host adapter obviously
-@@ -2379,19 +2353,18 @@ static void NCR5380_reselect(struct Scsi
- 	 * just reestablished, and remove it from the disconnected queue.
- 	 */
- 
--	for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;
--	     tmp; prev = tmp, tmp = NEXT(tmp)) {
--		if ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)
-+	tmp = NULL;
-+	list_for_each_entry(ncmd, &hostdata->disconnected, list) {
-+		struct scsi_cmnd *cmd = NCR5380_to_scmd(ncmd);
-+
-+		if (target_mask == (1 << scmd_id(cmd)) &&
-+		    lun == (u8)cmd->device->lun
- #ifdef SUPPORT_TAGS
--		    && (tag == tmp->tag)
-+		    && (tag == cmd->tag)
- #endif
- 		    ) {
--			if (prev) {
--				SET_NEXT(prev, NEXT(tmp));
--			} else {
--				hostdata->disconnected_queue = NEXT(tmp);
--			}
--			SET_NEXT(tmp, NULL);
-+			list_del(&ncmd->list);
-+			tmp = cmd;
- 			break;
- 		}
- 	}
-@@ -2489,188 +2462,18 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
- {
- 	struct Scsi_Host *instance = cmd->device->host;
- 	struct NCR5380_hostdata *hostdata = shost_priv(instance);
--	struct scsi_cmnd *tmp, **prev;
- 	unsigned long flags;
- 
--	scmd_printk(KERN_NOTICE, cmd, "aborting command\n");
--
- 	spin_lock_irqsave(&hostdata->lock, flags);
- 
-+#if (NDEBUG & NDEBUG_ANY)
-+	scmd_printk(KERN_INFO, cmd, "aborting command\n");
-+#endif
- 	NCR5380_dprint(NDEBUG_ANY, instance);
- 	NCR5380_dprint_phase(NDEBUG_ANY, instance);
- 
--	dprintk(NDEBUG_ABORT, "scsi%d: abort called basr 0x%02x, sr 0x%02x\n", HOSTNO,
--		    NCR5380_read(BUS_AND_STATUS_REG),
--		    NCR5380_read(STATUS_REG));
--
--#if 1
--	/*
--	 * Case 1 : If the command is the currently executing command,
--	 * we'll set the aborted flag and return control so that
--	 * information transfer routine can exit cleanly.
--	 */
--
--	if (hostdata->connected == cmd) {
--
--		dprintk(NDEBUG_ABORT, "scsi%d: aborting connected command\n", HOSTNO);
--		/*
--		 * We should perform BSY checking, and make sure we haven't slipped
--		 * into BUS FREE.
--		 */
--
--		/*	NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN); */
--		/*
--		 * Since we can't change phases until we've completed the current
--		 * handshake, we have to source or sink a byte of data if the current
--		 * phase is not MSGOUT.
--		 */
--
--		/*
--		 * Return control to the executing NCR drive so we can clear the
--		 * aborted flag and get back into our main loop.
--		 */
--
--		if (do_abort(instance) == 0) {
--			hostdata->connected = NULL;
--			cmd->result = DID_ABORT << 16;
--#ifdef SUPPORT_TAGS
--			cmd_free_tag(cmd);
--#else
--			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
--#endif
--			maybe_release_dma_irq(instance);
--			spin_unlock_irqrestore(&hostdata->lock, flags);
--			cmd->scsi_done(cmd);
--			return SUCCESS;
--		} else {
--			spin_unlock_irqrestore(&hostdata->lock, flags);
--			printk("scsi%d: abort of connected command failed!\n", HOSTNO);
--			return FAILED;
--		}
--	}
--#endif
--
--	/*
--	 * Case 2 : If the command hasn't been issued yet, we simply remove it
--	 *	    from the issue queue.
--	 */
--	for (prev = (struct scsi_cmnd **)&(hostdata->issue_queue),
--	     tmp = (struct scsi_cmnd *)hostdata->issue_queue;
--	     tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) {
--		if (cmd == tmp) {
--			(*prev) = NEXT(tmp);
--			SET_NEXT(tmp, NULL);
--			tmp->result = DID_ABORT << 16;
--			maybe_release_dma_irq(instance);
--			spin_unlock_irqrestore(&hostdata->lock, flags);
--			dprintk(NDEBUG_ABORT, "scsi%d: abort removed command from issue queue.\n",
--				    HOSTNO);
--			/* Tagged queuing note: no tag to free here, hasn't been assigned
--			 * yet... */
--			tmp->scsi_done(tmp);
--			return SUCCESS;
--		}
--	}
--
--	/*
--	 * Case 3 : If any commands are connected, we're going to fail the abort
--	 *	    and let the high level SCSI driver retry at a later time or
--	 *	    issue a reset.
--	 *
--	 *	    Timeouts, and therefore aborted commands, will be highly unlikely
--	 *          and handling them cleanly in this situation would make the common
--	 *	    case of noresets less efficient, and would pollute our code.  So,
--	 *	    we fail.
--	 */
--
--	if (hostdata->connected) {
--		spin_unlock_irqrestore(&hostdata->lock, flags);
--		dprintk(NDEBUG_ABORT, "scsi%d: abort failed, command connected.\n", HOSTNO);
--		return FAILED;
--	}
--
--	/*
--	 * Case 4: If the command is currently disconnected from the bus, and
--	 *	there are no connected commands, we reconnect the I_T_L or
--	 *	I_T_L_Q nexus associated with it, go into message out, and send
--	 *      an abort message.
--	 *
--	 * This case is especially ugly. In order to reestablish the nexus, we
--	 * need to call NCR5380_select().  The easiest way to implement this
--	 * function was to abort if the bus was busy, and let the interrupt
--	 * handler triggered on the SEL for reselect take care of lost arbitrations
--	 * where necessary, meaning interrupts need to be enabled.
--	 *
--	 * When interrupts are enabled, the queues may change - so we
--	 * can't remove it from the disconnected queue before selecting it
--	 * because that could cause a failure in hashing the nexus if that
--	 * device reselected.
--	 *
--	 * Since the queues may change, we can't use the pointers from when we
--	 * first locate it.
--	 *
--	 * So, we must first locate the command, and if NCR5380_select()
--	 * succeeds, then issue the abort, relocate the command and remove
--	 * it from the disconnected queue.
--	 */
--
--	for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp;
--	     tmp = NEXT(tmp)) {
--		if (cmd == tmp) {
--			dprintk(NDEBUG_ABORT, "scsi%d: aborting disconnected command.\n", HOSTNO);
--
--			if (NCR5380_select(instance, cmd)) {
--				spin_unlock_irq(&hostdata->lock);
--				return FAILED;
--			}
--			dprintk(NDEBUG_ABORT, "scsi%d: nexus reestablished.\n", HOSTNO);
--
--			do_abort(instance);
--
--			for (prev = (struct scsi_cmnd **)&(hostdata->disconnected_queue),
--			     tmp = (struct scsi_cmnd *)hostdata->disconnected_queue;
--			     tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) {
--				if (cmd == tmp) {
--					*prev = NEXT(tmp);
--					SET_NEXT(tmp, NULL);
--					tmp->result = DID_ABORT << 16;
--					/* We must unlock the tag/LUN immediately here, since the
--					 * target goes to BUS FREE and doesn't send us another
--					 * message (COMMAND_COMPLETE or the like)
--					 */
--#ifdef SUPPORT_TAGS
--					cmd_free_tag(tmp);
--#else
--					hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
--#endif
--					maybe_release_dma_irq(instance);
--					spin_unlock_irqrestore(&hostdata->lock, flags);
--					tmp->scsi_done(tmp);
--					return SUCCESS;
--				}
--			}
--		}
--	}
--
--	/* Maybe it is sufficient just to release the ST-DMA lock... (if
--	 * possible at all) At least, we should check if the lock could be
--	 * released after the abort, in case it is kept due to some bug.
--	 */
--	maybe_release_dma_irq(instance);
- 	spin_unlock_irqrestore(&hostdata->lock, flags);
- 
--	/*
--	 * Case 5 : If we reached this point, the command was not found in any of
--	 *	    the queues.
--	 *
--	 * We probably reached this point because of an unlikely race condition
--	 * between the command completing successfully and the abortion code,
--	 * so we won't panic, but we will notify the user in case something really
--	 * broke.
--	 */
--
--	printk(KERN_INFO "scsi%d: warning : SCSI command probably completed successfully before abortion\n", HOSTNO);
--
- 	return FAILED;
- }
- 
-@@ -2710,16 +2513,18 @@ static int NCR5380_bus_reset(struct scsi
- 	 * commands!
- 	 */
- 
--	if (hostdata->issue_queue)
--		dsprintk(NDEBUG_ABORT, instance, "reset aborted issued command(s)\n");
- 	if (hostdata->connected)
- 		dsprintk(NDEBUG_ABORT, instance, "reset aborted a connected command\n");
--	if (hostdata->disconnected_queue)
--		dsprintk(NDEBUG_ABORT, instance, "reset aborted disconnected command(s)\n");
--
--	hostdata->issue_queue = NULL;
- 	hostdata->connected = NULL;
--	hostdata->disconnected_queue = NULL;
-+
-+	if (!list_empty(&hostdata->unissued))
-+		dsprintk(NDEBUG_ABORT, instance, "reset aborted unissued list\n");
-+	INIT_LIST_HEAD(&hostdata->unissued);
-+
-+	if (!list_empty(&hostdata->disconnected))
-+		dsprintk(NDEBUG_ABORT, instance, "reset aborted disconnected list\n");
-+	INIT_LIST_HEAD(&hostdata->disconnected);
-+
- #ifdef SUPPORT_TAGS
- 	free_all_tags(hostdata);
- #endif
-Index: linux/drivers/scsi/NCR5380.h
-===================================================================
---- linux.orig/drivers/scsi/NCR5380.h	2016-01-03 16:04:19.000000000 +1100
-+++ linux/drivers/scsi/NCR5380.h	2016-01-03 16:04:20.000000000 +1100
-@@ -24,6 +24,7 @@
- 
- #include <linux/delay.h>
- #include <linux/interrupt.h>
-+#include <linux/list.h>
- #include <linux/workqueue.h>
- #include <scsi/scsi_dbg.h>
- #include <scsi/scsi_eh.h>
-@@ -254,8 +255,8 @@ struct NCR5380_hostdata {
- #endif
- 	unsigned char last_message;		/* last message OUT */
- 	struct scsi_cmnd *connected;		/* currently connected cmnd */
--	struct scsi_cmnd *issue_queue;		/* waiting to be issued */
--	struct scsi_cmnd *disconnected_queue;	/* waiting for reconnect */
-+	struct list_head unissued;		/* waiting to be issued */
-+	struct list_head disconnected;		/* waiting for reconnect */
- 	spinlock_t lock;			/* protects this struct */
- 	int flags;
- 	struct scsi_eh_save ses;
-@@ -277,6 +278,17 @@ struct NCR5380_hostdata {
- 
- #ifdef __KERNEL__
- 
-+struct NCR5380_cmd {
-+	struct list_head list;
-+};
-+
-+#define NCR5380_CMD_SIZE		(sizeof(struct NCR5380_cmd))
-+
-+static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
-+{
-+	return ((struct scsi_cmnd *)ncmd_ptr) - 1;
-+}
-+
- #ifndef NDEBUG
- #define NDEBUG (0)
- #endif
-Index: linux/drivers/scsi/arm/cumana_1.c
-===================================================================
---- linux.orig/drivers/scsi/arm/cumana_1.c	2016-01-03 16:04:00.000000000 +1100
-+++ linux/drivers/scsi/arm/cumana_1.c	2016-01-03 16:04:20.000000000 +1100
-@@ -208,6 +208,7 @@ static struct scsi_host_template cumanas
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
- 	.proc_name		= "CumanaSCSI-1",
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int cumanascsi1_probe(struct expansion_card *ec,
-Index: linux/drivers/scsi/arm/oak.c
-===================================================================
---- linux.orig/drivers/scsi/arm/oak.c	2016-01-03 16:04:12.000000000 +1100
-+++ linux/drivers/scsi/arm/oak.c	2016-01-03 16:04:20.000000000 +1100
-@@ -114,6 +114,7 @@ static struct scsi_host_template oakscsi
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
- 	.proc_name		= "oakscsi",
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
-Index: linux/drivers/scsi/atari_scsi.c
-===================================================================
---- linux.orig/drivers/scsi/atari_scsi.c	2016-01-03 16:04:12.000000000 +1100
-+++ linux/drivers/scsi/atari_scsi.c	2016-01-03 16:04:20.000000000 +1100
-@@ -780,6 +780,7 @@ static struct scsi_host_template atari_s
- 	.eh_bus_reset_handler	= atari_scsi_bus_reset,
- 	.this_id		= 7,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int __init atari_scsi_probe(struct platform_device *pdev)
-Index: linux/drivers/scsi/dmx3191d.c
-===================================================================
---- linux.orig/drivers/scsi/dmx3191d.c	2016-01-03 16:04:08.000000000 +1100
-+++ linux/drivers/scsi/dmx3191d.c	2016-01-03 16:04:20.000000000 +1100
-@@ -61,6 +61,7 @@ static struct scsi_host_template dmx3191
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int dmx3191d_probe_one(struct pci_dev *pdev,
-Index: linux/drivers/scsi/dtc.c
-===================================================================
---- linux.orig/drivers/scsi/dtc.c	2016-01-03 16:04:03.000000000 +1100
-+++ linux/drivers/scsi/dtc.c	2016-01-03 16:04:20.000000000 +1100
-@@ -452,5 +452,6 @@ static struct scsi_host_template driver_
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- #include "scsi_module.c"
-Index: linux/drivers/scsi/g_NCR5380.c
-===================================================================
---- linux.orig/drivers/scsi/g_NCR5380.c	2016-01-03 16:04:12.000000000 +1100
-+++ linux/drivers/scsi/g_NCR5380.c	2016-01-03 16:04:20.000000000 +1100
-@@ -728,6 +728,7 @@ static struct scsi_host_template driver_
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- #include "scsi_module.c"
-Index: linux/drivers/scsi/mac_scsi.c
-===================================================================
---- linux.orig/drivers/scsi/mac_scsi.c	2016-01-03 16:04:03.000000000 +1100
-+++ linux/drivers/scsi/mac_scsi.c	2016-01-03 16:04:20.000000000 +1100
-@@ -323,6 +323,7 @@ static struct scsi_host_template mac_scs
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int __init mac_scsi_probe(struct platform_device *pdev)
-Index: linux/drivers/scsi/pas16.c
-===================================================================
---- linux.orig/drivers/scsi/pas16.c	2016-01-03 16:04:03.000000000 +1100
-+++ linux/drivers/scsi/pas16.c	2016-01-03 16:04:20.000000000 +1100
-@@ -562,6 +562,7 @@ static struct scsi_host_template driver_
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- #include "scsi_module.c"
- 
-Index: linux/drivers/scsi/sun3_scsi.c
-===================================================================
---- linux.orig/drivers/scsi/sun3_scsi.c	2016-01-03 16:04:12.000000000 +1100
-+++ linux/drivers/scsi/sun3_scsi.c	2016-01-03 16:04:20.000000000 +1100
-@@ -468,6 +468,7 @@ static struct scsi_host_template sun3_sc
- 	.sg_tablesize		= SG_NONE,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- 
- static int __init sun3_scsi_probe(struct platform_device *pdev)
-Index: linux/drivers/scsi/t128.c
-===================================================================
---- linux.orig/drivers/scsi/t128.c	2016-01-03 16:04:03.000000000 +1100
-+++ linux/drivers/scsi/t128.c	2016-01-03 16:04:20.000000000 +1100
-@@ -406,5 +406,6 @@ static struct scsi_host_template driver_
- 	.sg_tablesize		= SG_ALL,
- 	.cmd_per_lun		= 2,
- 	.use_clustering		= DISABLE_CLUSTERING,
-+	.cmd_size		= NCR5380_CMD_SIZE,
- };
- #include "scsi_module.c"
+An embedded and charset-unspecified text was scrubbed...
+Name: ncr5380-use-list_head
+URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160103/d5845f08/attachment.ksh>
diff --git a/a/content_digest b/N1/content_digest
index 406b257..d249186 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,962 +1,12 @@
  "ref\020160103050501.042035135@telegraphics.com.au\0"
- "From\0Finn Thain <fthain@telegraphics.com.au>\0"
+ "From\0fthain@telegraphics.com.au (Finn Thain)\0"
  "Subject\0[PATCH v4 57/78] ncr5380: Use standard list data structure\0"
  "Date\0Sun, 03 Jan 2016 16:05:58 +1100\0"
- "To\0James E.J. Bottomley <JBottomley@odin.com>"
-  Martin K. Petersen <martin.petersen@oracle.com>
-  Michael Schmitz <schmitzmic@gmail.com>
-  linux-m68k@vger.kernel.org
-  linux-scsi@vger.kernel.org
-  linux-kernel@vger.kernel.org
-  Russell King <linux@arm.linux.org.uk>
- " linux-arm-kernel@lists.infradead.org\0"
+ "To\0linux-arm-kernel@lists.infradead.org\0"
  "\00:1\0"
- "fn\0ncr5380-use-list_head\0"
  "b\0"
- "The NCR5380 drivers have a home-spun linked list implementation for\n"
- "scsi_cmnd structs that uses cmd->host_scribble as a 'next' pointer. Adopt\n"
- "the standard list_head data structure and list operations instead. Remove\n"
- "the eh_abort_handler rather than convert it. Doing the conversion would\n"
- "only be churn because the existing EH handlers don't work and get replaced\n"
- "in a subsequent patch.\n"
- "\n"
- "Signed-off-by: Finn Thain <fthain@telegraphics.com.au>\n"
- "Reviewed-by: Hannes Reinecke <hare@suse.com>\n"
- "Tested-by: Ondrej Zary <linux@rainbow-software.org>\n"
- "Tested-by: Michael Schmitz <schmitzmic@gmail.com>\n"
- "\n"
- "---\n"
- "\n"
- "Changed since v2:\n"
- "- Fix NULL pointer dereference in NCR5380_reselect() when SUPPORT_TAGS is\n"
- "  enabled in the atari_NCR5380.c core driver.\n"
- "\n"
- "---\n"
- " drivers/scsi/NCR5380.c       |  214 +++++---------------------------\n"
- " drivers/scsi/NCR5380.h       |   16 ++\n"
- " drivers/scsi/arm/cumana_1.c  |    1 \n"
- " drivers/scsi/arm/oak.c       |    1 \n"
- " drivers/scsi/atari_NCR5380.c |  287 ++++++-------------------------------------\n"
- " drivers/scsi/atari_scsi.c    |    1 \n"
- " drivers/scsi/dmx3191d.c      |    1 \n"
- " drivers/scsi/dtc.c           |    1 \n"
- " drivers/scsi/g_NCR5380.c     |    1 \n"
- " drivers/scsi/mac_scsi.c      |    1 \n"
- " drivers/scsi/pas16.c         |    1 \n"
- " drivers/scsi/sun3_scsi.c     |    1 \n"
- " drivers/scsi/t128.c          |    1 \n"
- " 13 files changed, 106 insertions(+), 421 deletions(-)\n"
- "\n"
- "Index: linux/drivers/scsi/NCR5380.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/NCR5380.c\t2016-01-03 16:04:18.000000000 +1100\n"
- "+++ linux/drivers/scsi/NCR5380.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -622,8 +622,9 @@ static int NCR5380_init(struct Scsi_Host\n"
- " #endif\n"
- " \tspin_lock_init(&hostdata->lock);\n"
- " \thostdata->connected = NULL;\n"
- "-\thostdata->issue_queue = NULL;\n"
- "-\thostdata->disconnected_queue = NULL;\n"
- "+\tINIT_LIST_HEAD(&hostdata->unissued);\n"
- "+\tINIT_LIST_HEAD(&hostdata->disconnected);\n"
- "+\n"
- " \thostdata->flags = flags;\n"
- " \t\n"
- " \tINIT_WORK(&hostdata->main_task, NCR5380_main);\n"
- "@@ -738,7 +739,7 @@ static int NCR5380_queue_command(struct\n"
- "                                  struct scsi_cmnd *cmd)\n"
- " {\n"
- " \tstruct NCR5380_hostdata *hostdata = shost_priv(instance);\n"
- "-\tstruct scsi_cmnd *tmp;\n"
- "+\tstruct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);\n"
- " \tunsigned long flags;\n"
- " \n"
- " #if (NDEBUG & NDEBUG_NO_WRITE)\n"
- "@@ -752,12 +753,6 @@ static int NCR5380_queue_command(struct\n"
- " \t}\n"
- " #endif\t\t\t\t/* (NDEBUG & NDEBUG_NO_WRITE) */\n"
- " \n"
- "-\t/* \n"
- "-\t * We use the host_scribble field as a pointer to the next command  \n"
- "-\t * in a queue \n"
- "-\t */\n"
- "-\n"
- "-\tcmd->host_scribble = NULL;\n"
- " \tcmd->result = 0;\n"
- " \n"
- " \tspin_lock_irqsave(&hostdata->lock, flags);\n"
- "@@ -769,13 +764,11 @@ static int NCR5380_queue_command(struct\n"
- " \t * sense data is only guaranteed to be valid while the condition exists.\n"
- " \t */\n"
- " \n"
- "-\tif (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {\n"
- "-\t\tcmd->host_scribble = (unsigned char *) hostdata->issue_queue;\n"
- "-\t\thostdata->issue_queue = cmd;\n"
- "-\t} else {\n"
- "-\t\tfor (tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (struct scsi_cmnd *) tmp->host_scribble);\n"
- "-\t\ttmp->host_scribble = (unsigned char *) cmd;\n"
- "-\t}\n"
- "+\tif (cmd->cmnd[0] == REQUEST_SENSE)\n"
- "+\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- "+\telse\n"
- "+\t\tlist_add_tail(&ncmd->list, &hostdata->unissued);\n"
- "+\n"
- " \tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- " \n"
- " \tdsprintk(NDEBUG_QUEUES, instance, \"command %p added to %s of queue\\n\",\n"
- "@@ -803,7 +796,7 @@ static void NCR5380_main(struct work_str\n"
- " \tstruct NCR5380_hostdata *hostdata =\n"
- " \t\tcontainer_of(work, struct NCR5380_hostdata, main_task);\n"
- " \tstruct Scsi_Host *instance = hostdata->host;\n"
- "-\tstruct scsi_cmnd *tmp, *prev;\n"
- "+\tstruct NCR5380_cmd *ncmd, *n;\n"
- " \tint done;\n"
- " \t\n"
- " \tspin_lock_irq(&hostdata->lock);\n"
- "@@ -816,23 +809,20 @@ static void NCR5380_main(struct work_str\n"
- " \t\t\t * Search through the issue_queue for a command destined\n"
- " \t\t\t * for a target that's not busy.\n"
- " \t\t\t */\n"
- "-\t\t\tfor (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble)\n"
- "-\t\t\t{\n"
- "+\t\t\tlist_for_each_entry_safe(ncmd, n, &hostdata->unissued,\n"
- "+\t\t\t                         list) {\n"
- "+\t\t\t\tstruct scsi_cmnd *tmp = NCR5380_to_scmd(ncmd);\n"
- "+\n"
- " \t\t\t\tdsprintk(NDEBUG_QUEUES, instance, \"main: tmp=%p target=%d busy=%d lun=%llu\\n\",\n"
- " \t\t\t\t         tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],\n"
- " \t\t\t\t         tmp->device->lun);\n"
- " \t\t\t\t/*  When we find one, remove it from the issue queue. */\n"
- " \t\t\t\tif (!(hostdata->busy[tmp->device->id] &\n"
- " \t\t\t\t      (1 << (u8)(tmp->device->lun & 0xff)))) {\n"
- "-\t\t\t\t\tif (prev) {\n"
- "-\t\t\t\t\t\tprev->host_scribble = tmp->host_scribble;\n"
- "-\t\t\t\t\t} else {\n"
- "-\t\t\t\t\t\thostdata->issue_queue = (struct scsi_cmnd *) tmp->host_scribble;\n"
- "-\t\t\t\t\t}\n"
- "-\t\t\t\t\ttmp->host_scribble = NULL;\n"
- "+\t\t\t\t\tlist_del(&ncmd->list);\n"
- " \t\t\t\t\tdsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,\n"
- "-\t\t\t\t\t         instance, \"main: removed %p from issue queue %p\\n\",\n"
- "-\t\t\t\t\t         tmp, prev);\n"
- "+\t\t\t\t\t         instance, \"main: removed %p from issue queue\\n\",\n"
- "+\t\t\t\t\t         tmp);\n"
- " \n"
- " \t\t\t\t\t/* \n"
- " \t\t\t\t\t * Attempt to establish an I_T_L nexus here. \n"
- "@@ -851,8 +841,7 @@ static void NCR5380_main(struct work_str\n"
- " \t\t\t\t\t\t/* OK or bad target */\n"
- " \t\t\t\t\t} else {\n"
- " \t\t\t\t\t\t/* Need to retry */\n"
- "-\t\t\t\t\t\ttmp->host_scribble = (unsigned char *) hostdata->issue_queue;\n"
- "-\t\t\t\t\t\thostdata->issue_queue = tmp;\n"
- "+\t\t\t\t\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- " \t\t\t\t\t\tdsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t\t         instance, \"main: select() failed, %p returned to issue queue\\n\",\n"
- " \t\t\t\t\t\t         tmp);\n"
- "@@ -1744,6 +1733,8 @@ static void NCR5380_information_transfer\n"
- " \tstruct scsi_cmnd *cmd;\n"
- " \n"
- " \twhile ((cmd = hostdata->connected)) {\n"
- "+\t\tstruct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);\n"
- "+\n"
- " \t\ttmp = NCR5380_read(STATUS_REG);\n"
- " \t\t/* We only have a valid SCSI phase when REQ is asserted */\n"
- " \t\tif (tmp & SR_REQ) {\n"
- "@@ -1875,9 +1866,7 @@ static void NCR5380_information_transfer\n"
- " \t\t\t\t\tif ((cmd->cmnd[0] != REQUEST_SENSE) && (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) {\n"
- " \t\t\t\t\t\tscsi_eh_prep_cmnd(cmd, &hostdata->ses, NULL, 0, ~0);\n"
- " \n"
- "-\t\t\t\t\t\tcmd->host_scribble = (unsigned char *)\n"
- "-\t\t\t\t\t\t    hostdata->issue_queue;\n"
- "-\t\t\t\t\t\thostdata->issue_queue = (struct scsi_cmnd *) cmd;\n"
- "+\t\t\t\t\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- " \t\t\t\t\t\tdsprintk(NDEBUG_AUTOSENSE | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t\t         instance, \"REQUEST SENSE cmd %p added to head of issue queue\\n\",\n"
- " \t\t\t\t\t\t         cmd);\n"
- "@@ -1911,10 +1900,8 @@ static void NCR5380_information_transfer\n"
- " \t\t\t\tcase DISCONNECT:{\n"
- " \t\t\t\t\t\t/* Accept message by clearing ACK */\n"
- " \t\t\t\t\t\tNCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);\n"
- "-\t\t\t\t\t\tcmd->host_scribble = (unsigned char *)\n"
- "-\t\t\t\t\t\t    hostdata->disconnected_queue;\n"
- " \t\t\t\t\t\thostdata->connected = NULL;\n"
- "-\t\t\t\t\t\thostdata->disconnected_queue = cmd;\n"
- "+\t\t\t\t\t\tlist_add(&ncmd->list, &hostdata->disconnected);\n"
- " \t\t\t\t\t\tdsprintk(NDEBUG_INFORMATION | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t\t         instance, \"connected command %p for target %d lun %llu moved to disconnected queue\\n\",\n"
- " \t\t\t\t\t\t         cmd, scmd_id(cmd), cmd->device->lun);\n"
- "@@ -2087,7 +2074,8 @@ static void NCR5380_reselect(struct Scsi\n"
- " \tint len;\n"
- " \tunsigned char msg[3];\n"
- " \tunsigned char *data;\n"
- "-\tstruct scsi_cmnd *tmp = NULL, *prev;\n"
- "+\tstruct NCR5380_cmd *ncmd;\n"
- "+\tstruct scsi_cmnd *tmp;\n"
- " \n"
- " \t/*\n"
- " \t * Disable arbitration, etc. since the host adapter obviously\n"
- "@@ -2156,16 +2144,14 @@ static void NCR5380_reselect(struct Scsi\n"
- " \t * just reestablished, and remove it from the disconnected queue.\n"
- " \t */\n"
- " \n"
- "-\tfor (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;\n"
- "-\t     tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble) {\n"
- "-\t\tif ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)) {\n"
- "-\t\t\tif (prev) {\n"
- "-\t\t\t\tprev->host_scribble = tmp->host_scribble;\n"
- "-\t\t\t} else {\n"
- "-\t\t\t\thostdata->disconnected_queue =\n"
- "-\t\t\t\t\t(struct scsi_cmnd *) tmp->host_scribble;\n"
- "-\t\t\t}\n"
- "-\t\t\ttmp->host_scribble = NULL;\n"
- "+\ttmp = NULL;\n"
- "+\tlist_for_each_entry(ncmd, &hostdata->disconnected, list) {\n"
- "+\t\tstruct scsi_cmnd *cmd = NCR5380_to_scmd(ncmd);\n"
- "+\n"
- "+\t\tif (target_mask == (1 << scmd_id(cmd)) &&\n"
- "+\t\t    lun == (u8)cmd->device->lun) {\n"
- "+\t\t\tlist_del(&ncmd->list);\n"
- "+\t\t\ttmp = cmd;\n"
- " \t\t\tbreak;\n"
- " \t\t}\n"
- " \t}\n"
- "@@ -2261,146 +2247,18 @@ static int NCR5380_abort(struct scsi_cmn\n"
- " {\n"
- " \tstruct Scsi_Host *instance = cmd->device->host;\n"
- " \tstruct NCR5380_hostdata *hostdata = shost_priv(instance);\n"
- "-\tstruct scsi_cmnd *tmp, **prev;\n"
- " \tunsigned long flags;\n"
- " \n"
- "-\tscmd_printk(KERN_WARNING, cmd, \"aborting command\\n\");\n"
- "-\n"
- " \tspin_lock_irqsave(&hostdata->lock, flags);\n"
- " \n"
- "+#if (NDEBUG & NDEBUG_ANY)\n"
- "+\tscmd_printk(KERN_INFO, cmd, \"aborting command\\n\");\n"
- "+#endif\n"
- " \tNCR5380_dprint(NDEBUG_ANY, instance);\n"
- " \tNCR5380_dprint_phase(NDEBUG_ANY, instance);\n"
- " \n"
- "-\tdprintk(NDEBUG_ABORT, \"scsi%d : abort called\\n\", instance->host_no);\n"
- "-\tdprintk(NDEBUG_ABORT, \"        basr 0x%X, sr 0x%X\\n\", NCR5380_read(BUS_AND_STATUS_REG), NCR5380_read(STATUS_REG));\n"
- "-\n"
- "-#if 0\n"
- "-/*\n"
- "- * Case 1 : If the command is the currently executing command, \n"
- "- * we'll set the aborted flag and return control so that \n"
- "- * information transfer routine can exit cleanly.\n"
- "- */\n"
- "-\n"
- "-\tif (hostdata->connected == cmd) {\n"
- "-\t\tdprintk(NDEBUG_ABORT, \"scsi%d : aborting connected command\\n\", instance->host_no);\n"
- "-/*\n"
- "- * We should perform BSY checking, and make sure we haven't slipped\n"
- "- * into BUS FREE.\n"
- "- */\n"
- "-\n"
- "-\t\tNCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN);\n"
- "-/* \n"
- "- * Since we can't change phases until we've completed the current \n"
- "- * handshake, we have to source or sink a byte of data if the current\n"
- "- * phase is not MSGOUT.\n"
- "- */\n"
- "-\n"
- "-/* \n"
- "- * Return control to the executing NCR drive so we can clear the\n"
- "- * aborted flag and get back into our main loop.\n"
- "- */\n"
- "-\n"
- "-\t\treturn SUCCESS;\n"
- "-\t}\n"
- "-#endif\n"
- "-\n"
- "-/* \n"
- "- * Case 2 : If the command hasn't been issued yet, we simply remove it \n"
- "- *          from the issue queue.\n"
- "- */\n"
- "- \n"
- "-\tdprintk(NDEBUG_ABORT, \"scsi%d : abort going into loop.\\n\", instance->host_no);\n"
- "-\tfor (prev = (struct scsi_cmnd **) &(hostdata->issue_queue), tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)\n"
- "-\t\tif (cmd == tmp) {\n"
- "-\t\t\t(*prev) = (struct scsi_cmnd *) tmp->host_scribble;\n"
- "-\t\t\ttmp->host_scribble = NULL;\n"
- "-\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\ttmp->result = DID_ABORT << 16;\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d : abort removed command from issue queue.\\n\", instance->host_no);\n"
- "-\t\t\ttmp->scsi_done(tmp);\n"
- "-\t\t\treturn SUCCESS;\n"
- "-\t\t}\n"
- "-#if (NDEBUG  & NDEBUG_ABORT)\n"
- "-\t/* KLL */\n"
- "-\t\telse if (prev == tmp)\n"
- "-\t\t\tprintk(KERN_ERR \"scsi%d : LOOP\\n\", instance->host_no);\n"
- "-#endif\n"
- "-\n"
- "-/* \n"
- "- * Case 3 : If any commands are connected, we're going to fail the abort\n"
- "- *          and let the high level SCSI driver retry at a later time or \n"
- "- *          issue a reset.\n"
- "- *\n"
- "- *          Timeouts, and therefore aborted commands, will be highly unlikely\n"
- "- *          and handling them cleanly in this situation would make the common\n"
- "- *          case of noresets less efficient, and would pollute our code.  So,\n"
- "- *          we fail.\n"
- "- */\n"
- "-\n"
- "-\tif (hostdata->connected) {\n"
- "-\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\tdprintk(NDEBUG_ABORT, \"scsi%d : abort failed, command connected.\\n\", instance->host_no);\n"
- "-\t\treturn FAILED;\n"
- "-\t}\n"
- "-/*\n"
- "- * Case 4: If the command is currently disconnected from the bus, and \n"
- "- *      there are no connected commands, we reconnect the I_T_L or \n"
- "- *      I_T_L_Q nexus associated with it, go into message out, and send \n"
- "- *      an abort message.\n"
- "- *\n"
- "- * This case is especially ugly. In order to reestablish the nexus, we\n"
- "- * need to call NCR5380_select().  The easiest way to implement this \n"
- "- * function was to abort if the bus was busy, and let the interrupt\n"
- "- * handler triggered on the SEL for reselect take care of lost arbitrations\n"
- "- * where necessary, meaning interrupts need to be enabled.\n"
- "- *\n"
- "- * When interrupts are enabled, the queues may change - so we \n"
- "- * can't remove it from the disconnected queue before selecting it\n"
- "- * because that could cause a failure in hashing the nexus if that \n"
- "- * device reselected.\n"
- "- * \n"
- "- * Since the queues may change, we can't use the pointers from when we\n"
- "- * first locate it.\n"
- "- *\n"
- "- * So, we must first locate the command, and if NCR5380_select()\n"
- "- * succeeds, then issue the abort, relocate the command and remove\n"
- "- * it from the disconnected queue.\n"
- "- */\n"
- "-\n"
- "-\tfor (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; tmp = (struct scsi_cmnd *) tmp->host_scribble)\n"
- "-\t\tif (cmd == tmp) {\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d : aborting disconnected command.\\n\", instance->host_no);\n"
- "-\n"
- "-\t\t\tif (NCR5380_select(instance, cmd)) {\n"
- "-\t\t\t\tspin_unlock_irq(&hostdata->lock);\n"
- "-\t\t\t\treturn FAILED;\n"
- "-\t\t\t}\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d : nexus reestablished.\\n\", instance->host_no);\n"
- "-\n"
- "-\t\t\tdo_abort(instance);\n"
- "-\n"
- "-\t\t\tfor (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue), tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)\n"
- "-\t\t\t\tif (cmd == tmp) {\n"
- "-\t\t\t\t\t*prev = (struct scsi_cmnd *) tmp->host_scribble;\n"
- "-\t\t\t\t\ttmp->host_scribble = NULL;\n"
- "-\t\t\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\t\t\ttmp->result = DID_ABORT << 16;\n"
- "-\t\t\t\t\ttmp->scsi_done(tmp);\n"
- "-\t\t\t\t\treturn SUCCESS;\n"
- "-\t\t\t\t}\n"
- "-\t\t}\n"
- "-/*\n"
- "- * Case 5 : If we reached this point, the command was not found in any of \n"
- "- *          the queues.\n"
- "- *\n"
- "- * We probably reached this point because of an unlikely race condition\n"
- "- * between the command completing successfully and the abortion code,\n"
- "- * so we won't panic, but we will notify the user in case something really\n"
- "- * broke.\n"
- "- */\n"
- " \tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\tprintk(KERN_WARNING \"scsi%d : warning : SCSI command probably completed successfully\\n\"\n"
- "-\t\t\t\"         before abortion\\n\", instance->host_no);\n"
- "+\n"
- " \treturn FAILED;\n"
- " }\n"
- " \n"
- "Index: linux/drivers/scsi/atari_NCR5380.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/atari_NCR5380.c\t2016-01-03 16:04:19.000000000 +1100\n"
- "+++ linux/drivers/scsi/atari_NCR5380.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -175,10 +175,6 @@\n"
- "  * possible) function may be used.\n"
- "  */\n"
- " \n"
- "-#define\tNEXT(cmd)\t\t((struct scsi_cmnd *)(cmd)->host_scribble)\n"
- "-#define\tSET_NEXT(cmd,next)\t((cmd)->host_scribble = (void *)(next))\n"
- "-#define\tNEXTADDR(cmd)\t\t((struct scsi_cmnd **)&(cmd)->host_scribble)\n"
- "-\n"
- " #define\tHOSTNO\t\tinstance->host_no\n"
- " \n"
- " static int do_abort(struct Scsi_Host *);\n"
- "@@ -665,8 +661,9 @@ static int __init NCR5380_init(struct Sc\n"
- " #endif\n"
- " \tspin_lock_init(&hostdata->lock);\n"
- " \thostdata->connected = NULL;\n"
- "-\thostdata->issue_queue = NULL;\n"
- "-\thostdata->disconnected_queue = NULL;\n"
- "+\tINIT_LIST_HEAD(&hostdata->unissued);\n"
- "+\tINIT_LIST_HEAD(&hostdata->disconnected);\n"
- "+\n"
- " \thostdata->flags = flags;\n"
- " \n"
- " \tINIT_WORK(&hostdata->main_task, NCR5380_main);\n"
- "@@ -781,7 +778,7 @@ static int NCR5380_queue_command(struct\n"
- "                                  struct scsi_cmnd *cmd)\n"
- " {\n"
- " \tstruct NCR5380_hostdata *hostdata = shost_priv(instance);\n"
- "-\tstruct scsi_cmnd *tmp;\n"
- "+\tstruct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);\n"
- " \tunsigned long flags;\n"
- " \n"
- " #if (NDEBUG & NDEBUG_NO_WRITE)\n"
- "@@ -795,12 +792,6 @@ static int NCR5380_queue_command(struct\n"
- " \t}\n"
- " #endif /* (NDEBUG & NDEBUG_NO_WRITE) */\n"
- " \n"
- "-\t/*\n"
- "-\t * We use the host_scribble field as a pointer to the next command\n"
- "-\t * in a queue\n"
- "-\t */\n"
- "-\n"
- "-\tSET_NEXT(cmd, NULL);\n"
- " \tcmd->result = 0;\n"
- " \n"
- " \t/*\n"
- "@@ -834,15 +825,11 @@ static int NCR5380_queue_command(struct\n"
- " \t * sense data is only guaranteed to be valid while the condition exists.\n"
- " \t */\n"
- " \n"
- "-\tif (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {\n"
- "-\t\tSET_NEXT(cmd, hostdata->issue_queue);\n"
- "-\t\thostdata->issue_queue = cmd;\n"
- "-\t} else {\n"
- "-\t\tfor (tmp = (struct scsi_cmnd *)hostdata->issue_queue;\n"
- "-\t\t     NEXT(tmp); tmp = NEXT(tmp))\n"
- "-\t\t\t;\n"
- "-\t\tSET_NEXT(tmp, cmd);\n"
- "-\t}\n"
- "+\tif (cmd->cmnd[0] == REQUEST_SENSE)\n"
- "+\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- "+\telse\n"
- "+\t\tlist_add_tail(&ncmd->list, &hostdata->unissued);\n"
- "+\n"
- " \tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- " \n"
- " \tdsprintk(NDEBUG_QUEUES, instance, \"command %p added to %s of queue\\n\",\n"
- "@@ -858,8 +845,8 @@ static inline void maybe_release_dma_irq\n"
- " \tstruct NCR5380_hostdata *hostdata = shost_priv(instance);\n"
- " \n"
- " \t/* Caller does the locking needed to set & test these data atomically */\n"
- "-\tif (!hostdata->disconnected_queue &&\n"
- "-\t    !hostdata->issue_queue &&\n"
- "+\tif (list_empty(&hostdata->disconnected) &&\n"
- "+\t    list_empty(&hostdata->unissued) &&\n"
- " \t    !hostdata->connected &&\n"
- " \t    !hostdata->retain_dma_intr)\n"
- " \t\tNCR5380_release_dma_irq(instance);\n"
- "@@ -881,7 +868,7 @@ static void NCR5380_main(struct work_str\n"
- " \tstruct NCR5380_hostdata *hostdata =\n"
- " \t\tcontainer_of(work, struct NCR5380_hostdata, main_task);\n"
- " \tstruct Scsi_Host *instance = hostdata->host;\n"
- "-\tstruct scsi_cmnd *tmp, *prev;\n"
- "+\tstruct NCR5380_cmd *ncmd, *n;\n"
- " \tint done;\n"
- " \n"
- " \t/*\n"
- "@@ -900,17 +887,9 @@ static void NCR5380_main(struct work_str\n"
- " \t\t\t * Search through the issue_queue for a command destined\n"
- " \t\t\t * for a target that's not busy.\n"
- " \t\t\t */\n"
- "-#if (NDEBUG & NDEBUG_LISTS)\n"
- "-\t\t\tfor (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL;\n"
- "-\t\t\t     tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp))\n"
- "-\t\t\t\t;\n"
- "-\t\t\t/*printk(\"%p  \", tmp);*/\n"
- "-\t\t\tif ((tmp == prev) && tmp)\n"
- "-\t\t\t\tprintk(\" LOOP\\n\");\n"
- "-\t\t\t/* else printk(\"\\n\"); */\n"
- "-#endif\n"
- "-\t\t\tfor (tmp = (struct scsi_cmnd *) hostdata->issue_queue,\n"
- "-\t\t\t     prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {\n"
- "+\t\t\tlist_for_each_entry_safe(ncmd, n, &hostdata->unissued,\n"
- "+\t\t\t                         list) {\n"
- "+\t\t\t\tstruct scsi_cmnd *tmp = NCR5380_to_scmd(ncmd);\n"
- " \t\t\t\tu8 lun = tmp->device->lun;\n"
- " \n"
- " \t\t\t\tdsprintk(NDEBUG_QUEUES, instance, \"main: tmp=%p target=%d busy=%d lun=%d\\n\",\n"
- "@@ -923,15 +902,10 @@ static void NCR5380_main(struct work_str\n"
- " \t\t\t\t    !(hostdata->busy[tmp->device->id] & (1 << lun))\n"
- " #endif\n"
- " \t\t\t\t    ) {\n"
- "-\t\t\t\t\tif (prev) {\n"
- "-\t\t\t\t\t\tSET_NEXT(prev, NEXT(tmp));\n"
- "-\t\t\t\t\t} else {\n"
- "-\t\t\t\t\t\thostdata->issue_queue = NEXT(tmp);\n"
- "-\t\t\t\t\t}\n"
- "-\t\t\t\t\tSET_NEXT(tmp, NULL);\n"
- "+\t\t\t\t\tlist_del(&ncmd->list);\n"
- " \t\t\t\t\tdsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,\n"
- "-\t\t\t\t\t         instance, \"main: removed %p from issue queue %p\\n\",\n"
- "-\t\t\t\t\t         tmp, prev);\n"
- "+\t\t\t\t\t         instance, \"main: removed %p from issue queue\\n\",\n"
- "+\t\t\t\t\t         tmp);\n"
- " \n"
- " \t\t\t\t\thostdata->retain_dma_intr++;\n"
- " \n"
- "@@ -960,8 +934,7 @@ static void NCR5380_main(struct work_str\n"
- " \t\t\t\t\t\tmaybe_release_dma_irq(instance);\n"
- " \t\t\t\t\t} else {\n"
- " \t\t\t\t\t\t/* Need to retry */\n"
- "-\t\t\t\t\t\tSET_NEXT(tmp, hostdata->issue_queue);\n"
- "-\t\t\t\t\t\thostdata->issue_queue = tmp;\n"
- "+\t\t\t\t\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- " \t\t\t\t\t\tdsprintk(NDEBUG_MAIN | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t\t         instance, \"main: select() failed, %p returned to issue queue\\n\",\n"
- " \t\t\t\t\t\t         tmp);\n"
- "@@ -1834,6 +1807,8 @@ static void NCR5380_information_transfer\n"
- " #endif\n"
- " \n"
- " \twhile ((cmd = hostdata->connected)) {\n"
- "+\t\tstruct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);\n"
- "+\n"
- " \t\ttmp = NCR5380_read(STATUS_REG);\n"
- " \t\t/* We only have a valid SCSI phase when REQ is asserted */\n"
- " \t\tif (tmp & SR_REQ) {\n"
- "@@ -2042,8 +2017,7 @@ static void NCR5380_information_transfer\n"
- " \t\t\t\t\t    (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) {\n"
- " \t\t\t\t\t\tscsi_eh_prep_cmnd(cmd, &hostdata->ses, NULL, 0, ~0);\n"
- " \n"
- "-\t\t\t\t\t\tSET_NEXT(cmd, hostdata->issue_queue);\n"
- "-\t\t\t\t\t\thostdata->issue_queue = (struct scsi_cmnd *) cmd;\n"
- "+\t\t\t\t\t\tlist_add(&ncmd->list, &hostdata->unissued);\n"
- " \t\t\t\t\t\tdsprintk(NDEBUG_AUTOSENSE | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t\t         instance, \"REQUEST SENSE cmd %p added to head of issue queue\\n\",\n"
- " \t\t\t\t\t\t         cmd);\n"
- "@@ -2092,9 +2066,8 @@ static void NCR5380_information_transfer\n"
- " \t\t\t\tcase DISCONNECT:\n"
- " \t\t\t\t\t/* Accept message by clearing ACK */\n"
- " \t\t\t\t\tNCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);\n"
- "-\t\t\t\t\tSET_NEXT(cmd, hostdata->disconnected_queue);\n"
- " \t\t\t\t\thostdata->connected = NULL;\n"
- "-\t\t\t\t\thostdata->disconnected_queue = cmd;\n"
- "+\t\t\t\t\tlist_add(&ncmd->list, &hostdata->disconnected);\n"
- " \t\t\t\t\tdsprintk(NDEBUG_INFORMATION | NDEBUG_QUEUES,\n"
- " \t\t\t\t\t         instance, \"connected command %p for target %d lun %llu moved to disconnected queue\\n\",\n"
- " \t\t\t\t\t         cmd, scmd_id(cmd), cmd->device->lun);\n"
- "@@ -2288,7 +2261,8 @@ static void NCR5380_reselect(struct Scsi\n"
- " \tunsigned char msg[3];\n"
- " \tint __maybe_unused len;\n"
- " \tunsigned char __maybe_unused *data, __maybe_unused phase;\n"
- "-\tstruct scsi_cmnd *tmp = NULL, *prev;\n"
- "+\tstruct NCR5380_cmd *ncmd;\n"
- "+\tstruct scsi_cmnd *tmp;\n"
- " \n"
- " \t/*\n"
- " \t * Disable arbitration, etc. since the host adapter obviously\n"
- "@@ -2379,19 +2353,18 @@ static void NCR5380_reselect(struct Scsi\n"
- " \t * just reestablished, and remove it from the disconnected queue.\n"
- " \t */\n"
- " \n"
- "-\tfor (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;\n"
- "-\t     tmp; prev = tmp, tmp = NEXT(tmp)) {\n"
- "-\t\tif ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)\n"
- "+\ttmp = NULL;\n"
- "+\tlist_for_each_entry(ncmd, &hostdata->disconnected, list) {\n"
- "+\t\tstruct scsi_cmnd *cmd = NCR5380_to_scmd(ncmd);\n"
- "+\n"
- "+\t\tif (target_mask == (1 << scmd_id(cmd)) &&\n"
- "+\t\t    lun == (u8)cmd->device->lun\n"
- " #ifdef SUPPORT_TAGS\n"
- "-\t\t    && (tag == tmp->tag)\n"
- "+\t\t    && (tag == cmd->tag)\n"
- " #endif\n"
- " \t\t    ) {\n"
- "-\t\t\tif (prev) {\n"
- "-\t\t\t\tSET_NEXT(prev, NEXT(tmp));\n"
- "-\t\t\t} else {\n"
- "-\t\t\t\thostdata->disconnected_queue = NEXT(tmp);\n"
- "-\t\t\t}\n"
- "-\t\t\tSET_NEXT(tmp, NULL);\n"
- "+\t\t\tlist_del(&ncmd->list);\n"
- "+\t\t\ttmp = cmd;\n"
- " \t\t\tbreak;\n"
- " \t\t}\n"
- " \t}\n"
- "@@ -2489,188 +2462,18 @@ int NCR5380_abort(struct scsi_cmnd *cmd)\n"
- " {\n"
- " \tstruct Scsi_Host *instance = cmd->device->host;\n"
- " \tstruct NCR5380_hostdata *hostdata = shost_priv(instance);\n"
- "-\tstruct scsi_cmnd *tmp, **prev;\n"
- " \tunsigned long flags;\n"
- " \n"
- "-\tscmd_printk(KERN_NOTICE, cmd, \"aborting command\\n\");\n"
- "-\n"
- " \tspin_lock_irqsave(&hostdata->lock, flags);\n"
- " \n"
- "+#if (NDEBUG & NDEBUG_ANY)\n"
- "+\tscmd_printk(KERN_INFO, cmd, \"aborting command\\n\");\n"
- "+#endif\n"
- " \tNCR5380_dprint(NDEBUG_ANY, instance);\n"
- " \tNCR5380_dprint_phase(NDEBUG_ANY, instance);\n"
- " \n"
- "-\tdprintk(NDEBUG_ABORT, \"scsi%d: abort called basr 0x%02x, sr 0x%02x\\n\", HOSTNO,\n"
- "-\t\t    NCR5380_read(BUS_AND_STATUS_REG),\n"
- "-\t\t    NCR5380_read(STATUS_REG));\n"
- "-\n"
- "-#if 1\n"
- "-\t/*\n"
- "-\t * Case 1 : If the command is the currently executing command,\n"
- "-\t * we'll set the aborted flag and return control so that\n"
- "-\t * information transfer routine can exit cleanly.\n"
- "-\t */\n"
- "-\n"
- "-\tif (hostdata->connected == cmd) {\n"
- "-\n"
- "-\t\tdprintk(NDEBUG_ABORT, \"scsi%d: aborting connected command\\n\", HOSTNO);\n"
- "-\t\t/*\n"
- "-\t\t * We should perform BSY checking, and make sure we haven't slipped\n"
- "-\t\t * into BUS FREE.\n"
- "-\t\t */\n"
- "-\n"
- "-\t\t/*\tNCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN); */\n"
- "-\t\t/*\n"
- "-\t\t * Since we can't change phases until we've completed the current\n"
- "-\t\t * handshake, we have to source or sink a byte of data if the current\n"
- "-\t\t * phase is not MSGOUT.\n"
- "-\t\t */\n"
- "-\n"
- "-\t\t/*\n"
- "-\t\t * Return control to the executing NCR drive so we can clear the\n"
- "-\t\t * aborted flag and get back into our main loop.\n"
- "-\t\t */\n"
- "-\n"
- "-\t\tif (do_abort(instance) == 0) {\n"
- "-\t\t\thostdata->connected = NULL;\n"
- "-\t\t\tcmd->result = DID_ABORT << 16;\n"
- "-#ifdef SUPPORT_TAGS\n"
- "-\t\t\tcmd_free_tag(cmd);\n"
- "-#else\n"
- "-\t\t\thostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);\n"
- "-#endif\n"
- "-\t\t\tmaybe_release_dma_irq(instance);\n"
- "-\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\tcmd->scsi_done(cmd);\n"
- "-\t\t\treturn SUCCESS;\n"
- "-\t\t} else {\n"
- "-\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\tprintk(\"scsi%d: abort of connected command failed!\\n\", HOSTNO);\n"
- "-\t\t\treturn FAILED;\n"
- "-\t\t}\n"
- "-\t}\n"
- "-#endif\n"
- "-\n"
- "-\t/*\n"
- "-\t * Case 2 : If the command hasn't been issued yet, we simply remove it\n"
- "-\t *\t    from the issue queue.\n"
- "-\t */\n"
- "-\tfor (prev = (struct scsi_cmnd **)&(hostdata->issue_queue),\n"
- "-\t     tmp = (struct scsi_cmnd *)hostdata->issue_queue;\n"
- "-\t     tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) {\n"
- "-\t\tif (cmd == tmp) {\n"
- "-\t\t\t(*prev) = NEXT(tmp);\n"
- "-\t\t\tSET_NEXT(tmp, NULL);\n"
- "-\t\t\ttmp->result = DID_ABORT << 16;\n"
- "-\t\t\tmaybe_release_dma_irq(instance);\n"
- "-\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d: abort removed command from issue queue.\\n\",\n"
- "-\t\t\t\t    HOSTNO);\n"
- "-\t\t\t/* Tagged queuing note: no tag to free here, hasn't been assigned\n"
- "-\t\t\t * yet... */\n"
- "-\t\t\ttmp->scsi_done(tmp);\n"
- "-\t\t\treturn SUCCESS;\n"
- "-\t\t}\n"
- "-\t}\n"
- "-\n"
- "-\t/*\n"
- "-\t * Case 3 : If any commands are connected, we're going to fail the abort\n"
- "-\t *\t    and let the high level SCSI driver retry at a later time or\n"
- "-\t *\t    issue a reset.\n"
- "-\t *\n"
- "-\t *\t    Timeouts, and therefore aborted commands, will be highly unlikely\n"
- "-\t *          and handling them cleanly in this situation would make the common\n"
- "-\t *\t    case of noresets less efficient, and would pollute our code.  So,\n"
- "-\t *\t    we fail.\n"
- "-\t */\n"
- "-\n"
- "-\tif (hostdata->connected) {\n"
- "-\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\tdprintk(NDEBUG_ABORT, \"scsi%d: abort failed, command connected.\\n\", HOSTNO);\n"
- "-\t\treturn FAILED;\n"
- "-\t}\n"
- "-\n"
- "-\t/*\n"
- "-\t * Case 4: If the command is currently disconnected from the bus, and\n"
- "-\t *\tthere are no connected commands, we reconnect the I_T_L or\n"
- "-\t *\tI_T_L_Q nexus associated with it, go into message out, and send\n"
- "-\t *      an abort message.\n"
- "-\t *\n"
- "-\t * This case is especially ugly. In order to reestablish the nexus, we\n"
- "-\t * need to call NCR5380_select().  The easiest way to implement this\n"
- "-\t * function was to abort if the bus was busy, and let the interrupt\n"
- "-\t * handler triggered on the SEL for reselect take care of lost arbitrations\n"
- "-\t * where necessary, meaning interrupts need to be enabled.\n"
- "-\t *\n"
- "-\t * When interrupts are enabled, the queues may change - so we\n"
- "-\t * can't remove it from the disconnected queue before selecting it\n"
- "-\t * because that could cause a failure in hashing the nexus if that\n"
- "-\t * device reselected.\n"
- "-\t *\n"
- "-\t * Since the queues may change, we can't use the pointers from when we\n"
- "-\t * first locate it.\n"
- "-\t *\n"
- "-\t * So, we must first locate the command, and if NCR5380_select()\n"
- "-\t * succeeds, then issue the abort, relocate the command and remove\n"
- "-\t * it from the disconnected queue.\n"
- "-\t */\n"
- "-\n"
- "-\tfor (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp;\n"
- "-\t     tmp = NEXT(tmp)) {\n"
- "-\t\tif (cmd == tmp) {\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d: aborting disconnected command.\\n\", HOSTNO);\n"
- "-\n"
- "-\t\t\tif (NCR5380_select(instance, cmd)) {\n"
- "-\t\t\t\tspin_unlock_irq(&hostdata->lock);\n"
- "-\t\t\t\treturn FAILED;\n"
- "-\t\t\t}\n"
- "-\t\t\tdprintk(NDEBUG_ABORT, \"scsi%d: nexus reestablished.\\n\", HOSTNO);\n"
- "-\n"
- "-\t\t\tdo_abort(instance);\n"
- "-\n"
- "-\t\t\tfor (prev = (struct scsi_cmnd **)&(hostdata->disconnected_queue),\n"
- "-\t\t\t     tmp = (struct scsi_cmnd *)hostdata->disconnected_queue;\n"
- "-\t\t\t     tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) {\n"
- "-\t\t\t\tif (cmd == tmp) {\n"
- "-\t\t\t\t\t*prev = NEXT(tmp);\n"
- "-\t\t\t\t\tSET_NEXT(tmp, NULL);\n"
- "-\t\t\t\t\ttmp->result = DID_ABORT << 16;\n"
- "-\t\t\t\t\t/* We must unlock the tag/LUN immediately here, since the\n"
- "-\t\t\t\t\t * target goes to BUS FREE and doesn't send us another\n"
- "-\t\t\t\t\t * message (COMMAND_COMPLETE or the like)\n"
- "-\t\t\t\t\t */\n"
- "-#ifdef SUPPORT_TAGS\n"
- "-\t\t\t\t\tcmd_free_tag(tmp);\n"
- "-#else\n"
- "-\t\t\t\t\thostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);\n"
- "-#endif\n"
- "-\t\t\t\t\tmaybe_release_dma_irq(instance);\n"
- "-\t\t\t\t\tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- "-\t\t\t\t\ttmp->scsi_done(tmp);\n"
- "-\t\t\t\t\treturn SUCCESS;\n"
- "-\t\t\t\t}\n"
- "-\t\t\t}\n"
- "-\t\t}\n"
- "-\t}\n"
- "-\n"
- "-\t/* Maybe it is sufficient just to release the ST-DMA lock... (if\n"
- "-\t * possible at all) At least, we should check if the lock could be\n"
- "-\t * released after the abort, in case it is kept due to some bug.\n"
- "-\t */\n"
- "-\tmaybe_release_dma_irq(instance);\n"
- " \tspin_unlock_irqrestore(&hostdata->lock, flags);\n"
- " \n"
- "-\t/*\n"
- "-\t * Case 5 : If we reached this point, the command was not found in any of\n"
- "-\t *\t    the queues.\n"
- "-\t *\n"
- "-\t * We probably reached this point because of an unlikely race condition\n"
- "-\t * between the command completing successfully and the abortion code,\n"
- "-\t * so we won't panic, but we will notify the user in case something really\n"
- "-\t * broke.\n"
- "-\t */\n"
- "-\n"
- "-\tprintk(KERN_INFO \"scsi%d: warning : SCSI command probably completed successfully before abortion\\n\", HOSTNO);\n"
- "-\n"
- " \treturn FAILED;\n"
- " }\n"
- " \n"
- "@@ -2710,16 +2513,18 @@ static int NCR5380_bus_reset(struct scsi\n"
- " \t * commands!\n"
- " \t */\n"
- " \n"
- "-\tif (hostdata->issue_queue)\n"
- "-\t\tdsprintk(NDEBUG_ABORT, instance, \"reset aborted issued command(s)\\n\");\n"
- " \tif (hostdata->connected)\n"
- " \t\tdsprintk(NDEBUG_ABORT, instance, \"reset aborted a connected command\\n\");\n"
- "-\tif (hostdata->disconnected_queue)\n"
- "-\t\tdsprintk(NDEBUG_ABORT, instance, \"reset aborted disconnected command(s)\\n\");\n"
- "-\n"
- "-\thostdata->issue_queue = NULL;\n"
- " \thostdata->connected = NULL;\n"
- "-\thostdata->disconnected_queue = NULL;\n"
- "+\n"
- "+\tif (!list_empty(&hostdata->unissued))\n"
- "+\t\tdsprintk(NDEBUG_ABORT, instance, \"reset aborted unissued list\\n\");\n"
- "+\tINIT_LIST_HEAD(&hostdata->unissued);\n"
- "+\n"
- "+\tif (!list_empty(&hostdata->disconnected))\n"
- "+\t\tdsprintk(NDEBUG_ABORT, instance, \"reset aborted disconnected list\\n\");\n"
- "+\tINIT_LIST_HEAD(&hostdata->disconnected);\n"
- "+\n"
- " #ifdef SUPPORT_TAGS\n"
- " \tfree_all_tags(hostdata);\n"
- " #endif\n"
- "Index: linux/drivers/scsi/NCR5380.h\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/NCR5380.h\t2016-01-03 16:04:19.000000000 +1100\n"
- "+++ linux/drivers/scsi/NCR5380.h\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -24,6 +24,7 @@\n"
- " \n"
- " #include <linux/delay.h>\n"
- " #include <linux/interrupt.h>\n"
- "+#include <linux/list.h>\n"
- " #include <linux/workqueue.h>\n"
- " #include <scsi/scsi_dbg.h>\n"
- " #include <scsi/scsi_eh.h>\n"
- "@@ -254,8 +255,8 @@ struct NCR5380_hostdata {\n"
- " #endif\n"
- " \tunsigned char last_message;\t\t/* last message OUT */\n"
- " \tstruct scsi_cmnd *connected;\t\t/* currently connected cmnd */\n"
- "-\tstruct scsi_cmnd *issue_queue;\t\t/* waiting to be issued */\n"
- "-\tstruct scsi_cmnd *disconnected_queue;\t/* waiting for reconnect */\n"
- "+\tstruct list_head unissued;\t\t/* waiting to be issued */\n"
- "+\tstruct list_head disconnected;\t\t/* waiting for reconnect */\n"
- " \tspinlock_t lock;\t\t\t/* protects this struct */\n"
- " \tint flags;\n"
- " \tstruct scsi_eh_save ses;\n"
- "@@ -277,6 +278,17 @@ struct NCR5380_hostdata {\n"
- " \n"
- " #ifdef __KERNEL__\n"
- " \n"
- "+struct NCR5380_cmd {\n"
- "+\tstruct list_head list;\n"
- "+};\n"
- "+\n"
- "+#define NCR5380_CMD_SIZE\t\t(sizeof(struct NCR5380_cmd))\n"
- "+\n"
- "+static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)\n"
- "+{\n"
- "+\treturn ((struct scsi_cmnd *)ncmd_ptr) - 1;\n"
- "+}\n"
- "+\n"
- " #ifndef NDEBUG\n"
- " #define NDEBUG (0)\n"
- " #endif\n"
- "Index: linux/drivers/scsi/arm/cumana_1.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/arm/cumana_1.c\t2016-01-03 16:04:00.000000000 +1100\n"
- "+++ linux/drivers/scsi/arm/cumana_1.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -208,6 +208,7 @@ static struct scsi_host_template cumanas\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- " \t.proc_name\t\t= \"CumanaSCSI-1\",\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int cumanascsi1_probe(struct expansion_card *ec,\n"
- "Index: linux/drivers/scsi/arm/oak.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/arm/oak.c\t2016-01-03 16:04:12.000000000 +1100\n"
- "+++ linux/drivers/scsi/arm/oak.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -114,6 +114,7 @@ static struct scsi_host_template oakscsi\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- " \t.proc_name\t\t= \"oakscsi\",\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)\n"
- "Index: linux/drivers/scsi/atari_scsi.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/atari_scsi.c\t2016-01-03 16:04:12.000000000 +1100\n"
- "+++ linux/drivers/scsi/atari_scsi.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -780,6 +780,7 @@ static struct scsi_host_template atari_s\n"
- " \t.eh_bus_reset_handler\t= atari_scsi_bus_reset,\n"
- " \t.this_id\t\t= 7,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int __init atari_scsi_probe(struct platform_device *pdev)\n"
- "Index: linux/drivers/scsi/dmx3191d.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/dmx3191d.c\t2016-01-03 16:04:08.000000000 +1100\n"
- "+++ linux/drivers/scsi/dmx3191d.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -61,6 +61,7 @@ static struct scsi_host_template dmx3191\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int dmx3191d_probe_one(struct pci_dev *pdev,\n"
- "Index: linux/drivers/scsi/dtc.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/dtc.c\t2016-01-03 16:04:03.000000000 +1100\n"
- "+++ linux/drivers/scsi/dtc.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -452,5 +452,6 @@ static struct scsi_host_template driver_\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " #include \"scsi_module.c\"\n"
- "Index: linux/drivers/scsi/g_NCR5380.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/g_NCR5380.c\t2016-01-03 16:04:12.000000000 +1100\n"
- "+++ linux/drivers/scsi/g_NCR5380.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -728,6 +728,7 @@ static struct scsi_host_template driver_\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " #include \"scsi_module.c\"\n"
- "Index: linux/drivers/scsi/mac_scsi.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/mac_scsi.c\t2016-01-03 16:04:03.000000000 +1100\n"
- "+++ linux/drivers/scsi/mac_scsi.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -323,6 +323,7 @@ static struct scsi_host_template mac_scs\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int __init mac_scsi_probe(struct platform_device *pdev)\n"
- "Index: linux/drivers/scsi/pas16.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/pas16.c\t2016-01-03 16:04:03.000000000 +1100\n"
- "+++ linux/drivers/scsi/pas16.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -562,6 +562,7 @@ static struct scsi_host_template driver_\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " #include \"scsi_module.c\"\n"
- " \n"
- "Index: linux/drivers/scsi/sun3_scsi.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/sun3_scsi.c\t2016-01-03 16:04:12.000000000 +1100\n"
- "+++ linux/drivers/scsi/sun3_scsi.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -468,6 +468,7 @@ static struct scsi_host_template sun3_sc\n"
- " \t.sg_tablesize\t\t= SG_NONE,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " \n"
- " static int __init sun3_scsi_probe(struct platform_device *pdev)\n"
- "Index: linux/drivers/scsi/t128.c\n"
- "===================================================================\n"
- "--- linux.orig/drivers/scsi/t128.c\t2016-01-03 16:04:03.000000000 +1100\n"
- "+++ linux/drivers/scsi/t128.c\t2016-01-03 16:04:20.000000000 +1100\n"
- "@@ -406,5 +406,6 @@ static struct scsi_host_template driver_\n"
- " \t.sg_tablesize\t\t= SG_ALL,\n"
- " \t.cmd_per_lun\t\t= 2,\n"
- " \t.use_clustering\t\t= DISABLE_CLUSTERING,\n"
- "+\t.cmd_size\t\t= NCR5380_CMD_SIZE,\n"
- " };\n"
- " #include \"scsi_module.c\""
+ "An embedded and charset-unspecified text was scrubbed...\n"
+ "Name: ncr5380-use-list_head\n"
+ URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160103/d5845f08/attachment.ksh>
 
-297313faf61a7bd00f3eea2808aa66200afe97bf45b00d9d47d449ccde8b12b2
+96533dc7001aa33afc4a0802378d1427423183d2435ce4a1482bd9b6fb365bec

diff --git a/a/content_digest b/N2/content_digest
index 406b257..c8359c2 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -5,9 +5,9 @@
  "To\0James E.J. Bottomley <JBottomley@odin.com>"
   Martin K. Petersen <martin.petersen@oracle.com>
   Michael Schmitz <schmitzmic@gmail.com>
-  linux-m68k@vger.kernel.org
-  linux-scsi@vger.kernel.org
-  linux-kernel@vger.kernel.org
+  <linux-m68k@vger.kernel.org>
+  <linux-scsi@vger.kernel.org>
+  <linux-kernel@vger.kernel.org>
   Russell King <linux@arm.linux.org.uk>
  " linux-arm-kernel@lists.infradead.org\0"
  "\00:1\0"
@@ -959,4 +959,4 @@
  " };\n"
  " #include \"scsi_module.c\""
 
-297313faf61a7bd00f3eea2808aa66200afe97bf45b00d9d47d449ccde8b12b2
+a27d9e41ca52f8c1d074993bcaf71611dca5cf2d0a5c8d9ae7cebb12171f369c

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.