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.