From: Finn Thain <fthain@telegraphics.com.au> To: "James E.J. Bottomley" <JBottomley@odin.com>, Michael Schmitz <schmitzmic@gmail.com>, <linux-m68k@vger.kernel.org>, <linux-scsi@vger.kernel.org>, <linux-kernel@vger.kernel.org> Subject: [PATCH 25/71] ncr5380: Rework disconnect versus poll logic Date: Wed, 18 Nov 2015 19:35:20 +1100 [thread overview] Message-ID: <20151118083502.471575952@telegraphics.com.au> (raw) In-Reply-To: 20151118083455.331768508@telegraphics.com.au [-- Attachment #1: ncr5380-disconnection-reconnection --] [-- Type: text/plain, Size: 16918 bytes --] The atari_NCR5380.c and NCR5380.c core drivers differ in their handling of target disconnection. This is partly because atari_NCR5380.c had all of the polling and sleeping removed to become entirely interrupt-driven, and it is partly because of damage done to NCR5380.c after atari_NCR5380.c was forked. See commit 37cd23b44929 ("Linux 2.1.105") in history/history.git. The polling changes that were made in v2.1.105 are questionable at best: if REQ is not already asserted when NCR5380_transfer_pio() is invoked, and if the expected phase is DATA IN or DATA OUT, the function will schedule main() to execute after USLEEP_SLEEP jiffies and then return. The problems here are the expected REQ timing and the sleep interval*. Avoid this issue by using NCR5380_poll_politely() instead of scheduling main(). The atari_NCR5380.c core driver requires the use of the chip interrupt and always permits target disconnection. It sets the cmd->device->disconnect flag when a device disconnects, but never tests this flag. The NCR5380.c core driver permits disconnection only when instance->irq != NO_IRQ. It sets the cmd->device->disconnect flag when a device disconnects and it tests this flag in a couple of places: 1. During NCR5380_information_transfer(), following COMMAND OUT phase, if !cmd->device->disconnect, the initiator will take a guess as to whether or not the target will then choose to go to MESSAGE IN phase and disconnect. If the driver guesses "yes", it will schedule main() to execute after USLEEP_SLEEP jiffies and then return there. Unfortunately the driver may guess "yes" even after it has denied the target the disconnection privilege. When the target does not disconnect, the sleep can be beneficial, assuming the sleep interval is appropriate (mostly it is not*). And even if the driver guesses "yes" correctly, and the target would then disconnect, the driver still has to go through the MESSAGE IN phase in order to get to BUS FREE phase. The main loop can do nothing useful until BUS FREE, and sleeping just delays the phase transition. 2. If !cmd->device->disconnect and REQ is not already asserted when NCR5380_information_transfer() is invoked, the function polls for REQ for USLEEP_POLL jiffies. If REQ is not asserted, it then schedules main() to execute after USLEEP_SLEEP jiffies and returns. The idea is apparently to yeild the CPU while waiting for REQ. This is conditional upon !cmd->device->disconnect, but there seems to be no rhyme or reason for that. For example, the flag may be unset because disconnection privilege was denied because the driver has no IRQ. Or the flag may be unset because the device has never needed to disconnect before. Or if the flag is set, disconnection may have no relevance to the present bus phase. Another deficiency of the existing algorithm is as follows. When the driver has no IRQ, it prevents disconnection, and generally polls and sleeps more than it would normally. Now, if the driver is going to poll anyway, why not allow the target to disconnect? That way the driver can do something useful with the bus instead of polling unproductively! Avoid this pointless latency, complexity and guesswork by using NCR5380_poll_politely() instead of scheduling main(). * For g_NCR5380, the time intervals for USLEEP_SLEEP and USLEEP_POLL are 200 ms and 10 ms, respectively. They are 20 ms and 200 ms respectively for the other NCR5380 drivers. There doesn't seem to be any reason for this discrepancy. The timing seems to have no relation to the type of adapter. Bizarrely, the timing in g_NCR5380 seems to relate only to one particular type of target device. This patch attempts to solve the problem for all NCR5380 drivers and all target devices. Signed-off-by: Finn Thain <fthain@telegraphics.com.au> --- drivers/scsi/NCR5380.c | 137 ++----------------------------------------- drivers/scsi/NCR5380.h | 11 --- drivers/scsi/atari_NCR5380.c | 24 ++----- drivers/scsi/g_NCR5380.c | 4 - 4 files changed, 15 insertions(+), 161 deletions(-) Index: linux/drivers/scsi/NCR5380.c =================================================================== --- linux.orig/drivers/scsi/NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -139,17 +139,7 @@ * piece of hardware that requires you to sit in a loop polling for * the REQ signal as long as you are connected. Some devices are * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect - * while doing long seek operations. - * - * The workaround for this is to keep track of devices that have - * disconnected. If the device hasn't disconnected, for commands that - * should disconnect, we do something like - * - * while (!REQ is asserted) { sleep for N usecs; poll for M usecs } - * - * Some tweaking of N and M needs to be done. An algorithm based - * on "time to data" would give the best results as long as short time - * to datas (ie, on the same track) were considered, however these + * while doing long seek operations. [...] These * broken devices are the exception rather than the rule and I'd rather * spend my time optimizing for the normal case. * @@ -220,10 +210,6 @@ * Defaults for these will be provided although the user may want to adjust * these to allocate CPU resources to the SCSI driver or "real" code. * - * USLEEP_SLEEP - amount of time, in jiffies, to sleep - * - * USLEEP_POLL - amount of time, in jiffies, to poll - * * These macros MUST be defined : * * NCR5380_read(register) - read from the specified register @@ -458,73 +444,6 @@ static void NCR5380_print_phase(struct S } #endif -/* - * These need tweaking, and would probably work best as per-device - * flags initialized differently for disk, tape, cd, etc devices. - * People with broken devices are free to experiment as to what gives - * the best results for them. - * - * USLEEP_SLEEP should be a minimum seek time. - * - * USLEEP_POLL should be a maximum rotational latency. - */ -#ifndef USLEEP_SLEEP -/* 20 ms (reasonable hard disk speed) */ -#define USLEEP_SLEEP msecs_to_jiffies(20) -#endif -/* 300 RPM (floppy speed) */ -#ifndef USLEEP_POLL -#define USLEEP_POLL msecs_to_jiffies(200) -#endif - -/* - * Function : int should_disconnect (unsigned char cmd) - * - * Purpose : decide whether a command would normally disconnect or - * not, since if it won't disconnect we should go to sleep. - * - * Input : cmd - opcode of SCSI command - * - * Returns : DISCONNECT_LONG if we should disconnect for a really long - * time (ie always, sleep, look for REQ active, sleep), - * DISCONNECT_TIME_TO_DATA if we would only disconnect for a normal - * time-to-data delay, DISCONNECT_NONE if this command would return - * immediately. - * - * Future sleep algorithms based on time to data can exploit - * something like this so they can differentiate between "normal" - * (ie, read, write, seek) and unusual commands (ie, * format). - * - * Note : We don't deal with commands that handle an immediate disconnect, - * - */ - -static int should_disconnect(unsigned char cmd) -{ - switch (cmd) { - case READ_6: - case WRITE_6: - case SEEK_6: - case READ_10: - case WRITE_10: - case SEEK_10: - return DISCONNECT_TIME_TO_DATA; - case FORMAT_UNIT: - case SEARCH_HIGH: - case SEARCH_LOW: - case SEARCH_EQUAL: - return DISCONNECT_LONG; - default: - return DISCONNECT_NONE; - } -} - -static void NCR5380_set_timer(struct NCR5380_hostdata *hostdata, unsigned long timeout) -{ - hostdata->time_expires = jiffies + timeout; - queue_delayed_work(hostdata->work_q, &hostdata->coroutine, timeout); -} - static int probe_irq __initdata; @@ -623,9 +542,6 @@ static void prepare_info(struct Scsi_Hos "can_queue %d, cmd_per_lun %d, " "sg_tablesize %d, this_id %d, " "flags { %s%s%s%s}, " -#if defined(USLEEP_POLL) && defined(USLEEP_SLEEP) - "USLEEP_POLL %lu, USLEEP_SLEEP %lu, " -#endif "options { %s} ", instance->hostt->name, instance->io_port, instance->n_io_port, instance->base, instance->irq, @@ -635,9 +551,6 @@ static void prepare_info(struct Scsi_Hos hostdata->flags & FLAG_DTC3181E ? "DTC3181E " : "", hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "", hostdata->flags & FLAG_TOSHIBA_DELAY ? "TOSHIBA_DELAY " : "", -#if defined(USLEEP_POLL) && defined(USLEEP_SLEEP) - USLEEP_POLL, USLEEP_SLEEP, -#endif #ifdef AUTOPROBE_IRQ "AUTOPROBE_IRQ " #endif @@ -812,7 +725,6 @@ static int NCR5380_init(struct Scsi_Host hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT | flags; hostdata->host = instance; - hostdata->time_expires = 0; prepare_info(instance); @@ -1034,7 +946,6 @@ static void NCR5380_main(struct work_str #ifdef REAL_DMA && !hostdata->dmalen #endif - && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) ) { dprintk(NDEBUG_MAIN, "scsi%d : main() : performing information transfer\n", instance->host_no); NCR5380_information_transfer(instance); @@ -1414,11 +1325,6 @@ static int NCR5380_transfer_pio(struct S unsigned char p = *phase, tmp; int c = *count; unsigned char *d = *data; - /* - * RvC: some administrative data to process polling time - */ - int break_allowed = 0; - struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; if (!(p & SR_IO)) dprintk(NDEBUG_PIO, "scsi%d : pio write %d bytes\n", instance->host_no, c); @@ -1433,35 +1339,19 @@ static int NCR5380_transfer_pio(struct S NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p)); - /* RvC: don't know if this is necessary, but other SCSI I/O is short - * so breaks are not necessary there - */ - if ((p == PHASE_DATAIN) || (p == PHASE_DATAOUT)) { - break_allowed = 1; - } do { /* * Wait for assertion of REQ, after which the phase bits will be * valid */ - /* RvC: we simply poll once, after that we stop temporarily - * and let the device buffer fill up - * if breaking is not allowed, we keep polling as long as needed - */ - - /* FIXME */ - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ) && !break_allowed); - if (!(tmp & SR_REQ)) { - /* timeout condition */ - NCR5380_set_timer(hostdata, USLEEP_SLEEP); + if (NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0) break; - } dprintk(NDEBUG_HANDSHAKE, "scsi%d : REQ detected\n", instance->host_no); /* Check for phase mismatch */ - if ((tmp & PHASE_MASK) != p) { + if ((NCR5380_read(STATUS_REG) & PHASE_MASK) != p) { dprintk(NDEBUG_HANDSHAKE, "scsi%d : phase mismatch\n", instance->host_no); NCR5380_dprint_phase(NDEBUG_HANDSHAKE, instance); break; @@ -1933,8 +1823,6 @@ static void NCR5380_information_transfer unsigned char *data; unsigned char phase, tmp, extended_msg[10], old_phase = 0xff; struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected; - /* RvC: we need to set the end of the polling time */ - unsigned long poll_time = jiffies + USLEEP_POLL; while (1) { tmp = NCR5380_read(STATUS_REG); @@ -2134,7 +2022,6 @@ static void NCR5380_information_transfer case DISCONNECT:{ /* Accept message by clearing ACK */ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - cmd->device->disconnect = 1; LIST(cmd, hostdata->disconnected_queue); cmd->host_scribble = (unsigned char *) hostdata->disconnected_queue; @@ -2266,11 +2153,6 @@ static void NCR5380_information_transfer * use the dma transfer function. */ NCR5380_transfer_pio(instance, &phase, &len, &data); - if (!cmd->device->disconnect && should_disconnect(cmd->cmnd[0])) { - NCR5380_set_timer(hostdata, USLEEP_SLEEP); - dprintk(NDEBUG_USLEEP, "scsi%d : issued command, sleeping until %lu\n", instance->host_no, hostdata->time_expires); - return; - } break; case PHASE_STATIN: len = 1; @@ -2282,15 +2164,10 @@ static void NCR5380_information_transfer printk("scsi%d : unknown phase\n", instance->host_no); NCR5380_dprint(NDEBUG_ANY, instance); } /* switch(phase) */ - } /* if (tmp * SR_REQ) */ - else { - /* RvC: go to sleep if polling time expired - */ - if (!cmd->device->disconnect && time_after_eq(jiffies, poll_time)) { - NCR5380_set_timer(hostdata, USLEEP_SLEEP); - dprintk(NDEBUG_USLEEP, "scsi%d : poll timed out, sleeping until %lu\n", instance->host_no, hostdata->time_expires); - return; - } + } else { + spin_unlock_irq(instance->host_lock); + NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); + spin_lock_irq(instance->host_lock); } } /* while (1) */ } Index: linux/drivers/scsi/NCR5380.h =================================================================== --- linux.orig/drivers/scsi/NCR5380.h 2015-11-18 19:33:33.000000000 +1100 +++ linux/drivers/scsi/NCR5380.h 2015-11-18 19:33:38.000000000 +1100 @@ -205,16 +205,6 @@ #define PHASE_SR_TO_TCR(phase) ((phase) >> 2) -/* - * The internal should_disconnect() function returns these based on the - * expected length of a disconnect if a device supports disconnect/ - * reconnect. - */ - -#define DISCONNECT_NONE 0 -#define DISCONNECT_TIME_TO_DATA 1 -#define DISCONNECT_LONG 2 - /* * "Special" value for the (unsigned char) command tag, to indicate * I_T_L nexus instead of I_T_L_Q. @@ -266,7 +256,6 @@ struct NCR5380_hostdata { volatile struct scsi_cmnd *issue_queue; /* waiting to be issued */ volatile struct scsi_cmnd *disconnected_queue; /* waiting for reconnect */ int flags; - unsigned long time_expires; /* in jiffies, set prior to sleeping */ struct delayed_work coroutine; /* our co-routine */ struct scsi_eh_save ses; char info[256]; Index: linux/drivers/scsi/atari_NCR5380.c =================================================================== --- linux.orig/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -126,17 +126,7 @@ * piece of hardware that requires you to sit in a loop polling for * the REQ signal as long as you are connected. Some devices are * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect - * while doing long seek operations. - * - * The workaround for this is to keep track of devices that have - * disconnected. If the device hasn't disconnected, for commands that - * should disconnect, we do something like - * - * while (!REQ is asserted) { sleep for N usecs; poll for M usecs } - * - * Some tweaking of N and M needs to be done. An algorithm based - * on "time to data" would give the best results as long as short time - * to datas (ie, on the same track) were considered, however these + * while doing long seek operations. [...] These * broken devices are the exception rather than the rule and I'd rather * spend my time optimizing for the normal case. * @@ -1734,13 +1724,14 @@ static int NCR5380_transfer_pio(struct S * Wait for assertion of REQ, after which the phase bits will be * valid */ - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ)) - ; + + if (NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0) + break; dprintk(NDEBUG_HANDSHAKE, "scsi%d: REQ detected\n", HOSTNO); /* Check for phase mismatch */ - if ((tmp & PHASE_MASK) != p) { + if ((NCR5380_read(STATUS_REG) & PHASE_MASK) != p) { dprintk(NDEBUG_PIO, "scsi%d: phase mismatch\n", HOSTNO); NCR5380_dprint_phase(NDEBUG_PIO, instance); break; @@ -2393,7 +2384,6 @@ static void NCR5380_information_transfer /* Accept message by clearing ACK */ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); local_irq_save(flags); - cmd->device->disconnect = 1; LIST(cmd,hostdata->disconnected_queue); SET_NEXT(cmd, hostdata->disconnected_queue); hostdata->connected = NULL; @@ -2558,7 +2548,9 @@ static void NCR5380_information_transfer printk("scsi%d: unknown phase\n", HOSTNO); NCR5380_dprint(NDEBUG_ANY, instance); } /* switch(phase) */ - } /* if (tmp * SR_REQ) */ + } else { + NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); + } } /* while (1) */ } Index: linux/drivers/scsi/g_NCR5380.c =================================================================== --- linux.orig/drivers/scsi/g_NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/g_NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -56,10 +56,6 @@ * */ -/* settings for DTC3181E card with only Mustek scanner attached */ -#define USLEEP_POLL msecs_to_jiffies(10) -#define USLEEP_SLEEP msecs_to_jiffies(200) - #define AUTOPROBE_IRQ #ifdef CONFIG_SCSI_GENERIC_NCR53C400
WARNING: multiple messages have this Message-ID (diff)
From: Finn Thain <fthain@telegraphics.com.au> To: "James E.J. Bottomley" <JBottomley@odin.com>, Michael Schmitz <schmitzmic@gmail.com>, linux-m68k@vger.kernel.org, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 25/71] ncr5380: Rework disconnect versus poll logic Date: Wed, 18 Nov 2015 19:35:20 +1100 [thread overview] Message-ID: <20151118083502.471575952@telegraphics.com.au> (raw) In-Reply-To: 20151118083455.331768508@telegraphics.com.au [-- Attachment #1: ncr5380-disconnection-reconnection --] [-- Type: text/plain, Size: 16916 bytes --] The atari_NCR5380.c and NCR5380.c core drivers differ in their handling of target disconnection. This is partly because atari_NCR5380.c had all of the polling and sleeping removed to become entirely interrupt-driven, and it is partly because of damage done to NCR5380.c after atari_NCR5380.c was forked. See commit 37cd23b44929 ("Linux 2.1.105") in history/history.git. The polling changes that were made in v2.1.105 are questionable at best: if REQ is not already asserted when NCR5380_transfer_pio() is invoked, and if the expected phase is DATA IN or DATA OUT, the function will schedule main() to execute after USLEEP_SLEEP jiffies and then return. The problems here are the expected REQ timing and the sleep interval*. Avoid this issue by using NCR5380_poll_politely() instead of scheduling main(). The atari_NCR5380.c core driver requires the use of the chip interrupt and always permits target disconnection. It sets the cmd->device->disconnect flag when a device disconnects, but never tests this flag. The NCR5380.c core driver permits disconnection only when instance->irq != NO_IRQ. It sets the cmd->device->disconnect flag when a device disconnects and it tests this flag in a couple of places: 1. During NCR5380_information_transfer(), following COMMAND OUT phase, if !cmd->device->disconnect, the initiator will take a guess as to whether or not the target will then choose to go to MESSAGE IN phase and disconnect. If the driver guesses "yes", it will schedule main() to execute after USLEEP_SLEEP jiffies and then return there. Unfortunately the driver may guess "yes" even after it has denied the target the disconnection privilege. When the target does not disconnect, the sleep can be beneficial, assuming the sleep interval is appropriate (mostly it is not*). And even if the driver guesses "yes" correctly, and the target would then disconnect, the driver still has to go through the MESSAGE IN phase in order to get to BUS FREE phase. The main loop can do nothing useful until BUS FREE, and sleeping just delays the phase transition. 2. If !cmd->device->disconnect and REQ is not already asserted when NCR5380_information_transfer() is invoked, the function polls for REQ for USLEEP_POLL jiffies. If REQ is not asserted, it then schedules main() to execute after USLEEP_SLEEP jiffies and returns. The idea is apparently to yeild the CPU while waiting for REQ. This is conditional upon !cmd->device->disconnect, but there seems to be no rhyme or reason for that. For example, the flag may be unset because disconnection privilege was denied because the driver has no IRQ. Or the flag may be unset because the device has never needed to disconnect before. Or if the flag is set, disconnection may have no relevance to the present bus phase. Another deficiency of the existing algorithm is as follows. When the driver has no IRQ, it prevents disconnection, and generally polls and sleeps more than it would normally. Now, if the driver is going to poll anyway, why not allow the target to disconnect? That way the driver can do something useful with the bus instead of polling unproductively! Avoid this pointless latency, complexity and guesswork by using NCR5380_poll_politely() instead of scheduling main(). * For g_NCR5380, the time intervals for USLEEP_SLEEP and USLEEP_POLL are 200 ms and 10 ms, respectively. They are 20 ms and 200 ms respectively for the other NCR5380 drivers. There doesn't seem to be any reason for this discrepancy. The timing seems to have no relation to the type of adapter. Bizarrely, the timing in g_NCR5380 seems to relate only to one particular type of target device. This patch attempts to solve the problem for all NCR5380 drivers and all target devices. Signed-off-by: Finn Thain <fthain@telegraphics.com.au> --- drivers/scsi/NCR5380.c | 137 ++----------------------------------------- drivers/scsi/NCR5380.h | 11 --- drivers/scsi/atari_NCR5380.c | 24 ++----- drivers/scsi/g_NCR5380.c | 4 - 4 files changed, 15 insertions(+), 161 deletions(-) Index: linux/drivers/scsi/NCR5380.c =================================================================== --- linux.orig/drivers/scsi/NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -139,17 +139,7 @@ * piece of hardware that requires you to sit in a loop polling for * the REQ signal as long as you are connected. Some devices are * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect - * while doing long seek operations. - * - * The workaround for this is to keep track of devices that have - * disconnected. If the device hasn't disconnected, for commands that - * should disconnect, we do something like - * - * while (!REQ is asserted) { sleep for N usecs; poll for M usecs } - * - * Some tweaking of N and M needs to be done. An algorithm based - * on "time to data" would give the best results as long as short time - * to datas (ie, on the same track) were considered, however these + * while doing long seek operations. [...] These * broken devices are the exception rather than the rule and I'd rather * spend my time optimizing for the normal case. * @@ -220,10 +210,6 @@ * Defaults for these will be provided although the user may want to adjust * these to allocate CPU resources to the SCSI driver or "real" code. * - * USLEEP_SLEEP - amount of time, in jiffies, to sleep - * - * USLEEP_POLL - amount of time, in jiffies, to poll - * * These macros MUST be defined : * * NCR5380_read(register) - read from the specified register @@ -458,73 +444,6 @@ static void NCR5380_print_phase(struct S } #endif -/* - * These need tweaking, and would probably work best as per-device - * flags initialized differently for disk, tape, cd, etc devices. - * People with broken devices are free to experiment as to what gives - * the best results for them. - * - * USLEEP_SLEEP should be a minimum seek time. - * - * USLEEP_POLL should be a maximum rotational latency. - */ -#ifndef USLEEP_SLEEP -/* 20 ms (reasonable hard disk speed) */ -#define USLEEP_SLEEP msecs_to_jiffies(20) -#endif -/* 300 RPM (floppy speed) */ -#ifndef USLEEP_POLL -#define USLEEP_POLL msecs_to_jiffies(200) -#endif - -/* - * Function : int should_disconnect (unsigned char cmd) - * - * Purpose : decide whether a command would normally disconnect or - * not, since if it won't disconnect we should go to sleep. - * - * Input : cmd - opcode of SCSI command - * - * Returns : DISCONNECT_LONG if we should disconnect for a really long - * time (ie always, sleep, look for REQ active, sleep), - * DISCONNECT_TIME_TO_DATA if we would only disconnect for a normal - * time-to-data delay, DISCONNECT_NONE if this command would return - * immediately. - * - * Future sleep algorithms based on time to data can exploit - * something like this so they can differentiate between "normal" - * (ie, read, write, seek) and unusual commands (ie, * format). - * - * Note : We don't deal with commands that handle an immediate disconnect, - * - */ - -static int should_disconnect(unsigned char cmd) -{ - switch (cmd) { - case READ_6: - case WRITE_6: - case SEEK_6: - case READ_10: - case WRITE_10: - case SEEK_10: - return DISCONNECT_TIME_TO_DATA; - case FORMAT_UNIT: - case SEARCH_HIGH: - case SEARCH_LOW: - case SEARCH_EQUAL: - return DISCONNECT_LONG; - default: - return DISCONNECT_NONE; - } -} - -static void NCR5380_set_timer(struct NCR5380_hostdata *hostdata, unsigned long timeout) -{ - hostdata->time_expires = jiffies + timeout; - queue_delayed_work(hostdata->work_q, &hostdata->coroutine, timeout); -} - static int probe_irq __initdata; @@ -623,9 +542,6 @@ static void prepare_info(struct Scsi_Hos "can_queue %d, cmd_per_lun %d, " "sg_tablesize %d, this_id %d, " "flags { %s%s%s%s}, " -#if defined(USLEEP_POLL) && defined(USLEEP_SLEEP) - "USLEEP_POLL %lu, USLEEP_SLEEP %lu, " -#endif "options { %s} ", instance->hostt->name, instance->io_port, instance->n_io_port, instance->base, instance->irq, @@ -635,9 +551,6 @@ static void prepare_info(struct Scsi_Hos hostdata->flags & FLAG_DTC3181E ? "DTC3181E " : "", hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "", hostdata->flags & FLAG_TOSHIBA_DELAY ? "TOSHIBA_DELAY " : "", -#if defined(USLEEP_POLL) && defined(USLEEP_SLEEP) - USLEEP_POLL, USLEEP_SLEEP, -#endif #ifdef AUTOPROBE_IRQ "AUTOPROBE_IRQ " #endif @@ -812,7 +725,6 @@ static int NCR5380_init(struct Scsi_Host hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT | flags; hostdata->host = instance; - hostdata->time_expires = 0; prepare_info(instance); @@ -1034,7 +946,6 @@ static void NCR5380_main(struct work_str #ifdef REAL_DMA && !hostdata->dmalen #endif - && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) ) { dprintk(NDEBUG_MAIN, "scsi%d : main() : performing information transfer\n", instance->host_no); NCR5380_information_transfer(instance); @@ -1414,11 +1325,6 @@ static int NCR5380_transfer_pio(struct S unsigned char p = *phase, tmp; int c = *count; unsigned char *d = *data; - /* - * RvC: some administrative data to process polling time - */ - int break_allowed = 0; - struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; if (!(p & SR_IO)) dprintk(NDEBUG_PIO, "scsi%d : pio write %d bytes\n", instance->host_no, c); @@ -1433,35 +1339,19 @@ static int NCR5380_transfer_pio(struct S NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p)); - /* RvC: don't know if this is necessary, but other SCSI I/O is short - * so breaks are not necessary there - */ - if ((p == PHASE_DATAIN) || (p == PHASE_DATAOUT)) { - break_allowed = 1; - } do { /* * Wait for assertion of REQ, after which the phase bits will be * valid */ - /* RvC: we simply poll once, after that we stop temporarily - * and let the device buffer fill up - * if breaking is not allowed, we keep polling as long as needed - */ - - /* FIXME */ - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ) && !break_allowed); - if (!(tmp & SR_REQ)) { - /* timeout condition */ - NCR5380_set_timer(hostdata, USLEEP_SLEEP); + if (NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0) break; - } dprintk(NDEBUG_HANDSHAKE, "scsi%d : REQ detected\n", instance->host_no); /* Check for phase mismatch */ - if ((tmp & PHASE_MASK) != p) { + if ((NCR5380_read(STATUS_REG) & PHASE_MASK) != p) { dprintk(NDEBUG_HANDSHAKE, "scsi%d : phase mismatch\n", instance->host_no); NCR5380_dprint_phase(NDEBUG_HANDSHAKE, instance); break; @@ -1933,8 +1823,6 @@ static void NCR5380_information_transfer unsigned char *data; unsigned char phase, tmp, extended_msg[10], old_phase = 0xff; struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected; - /* RvC: we need to set the end of the polling time */ - unsigned long poll_time = jiffies + USLEEP_POLL; while (1) { tmp = NCR5380_read(STATUS_REG); @@ -2134,7 +2022,6 @@ static void NCR5380_information_transfer case DISCONNECT:{ /* Accept message by clearing ACK */ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - cmd->device->disconnect = 1; LIST(cmd, hostdata->disconnected_queue); cmd->host_scribble = (unsigned char *) hostdata->disconnected_queue; @@ -2266,11 +2153,6 @@ static void NCR5380_information_transfer * use the dma transfer function. */ NCR5380_transfer_pio(instance, &phase, &len, &data); - if (!cmd->device->disconnect && should_disconnect(cmd->cmnd[0])) { - NCR5380_set_timer(hostdata, USLEEP_SLEEP); - dprintk(NDEBUG_USLEEP, "scsi%d : issued command, sleeping until %lu\n", instance->host_no, hostdata->time_expires); - return; - } break; case PHASE_STATIN: len = 1; @@ -2282,15 +2164,10 @@ static void NCR5380_information_transfer printk("scsi%d : unknown phase\n", instance->host_no); NCR5380_dprint(NDEBUG_ANY, instance); } /* switch(phase) */ - } /* if (tmp * SR_REQ) */ - else { - /* RvC: go to sleep if polling time expired - */ - if (!cmd->device->disconnect && time_after_eq(jiffies, poll_time)) { - NCR5380_set_timer(hostdata, USLEEP_SLEEP); - dprintk(NDEBUG_USLEEP, "scsi%d : poll timed out, sleeping until %lu\n", instance->host_no, hostdata->time_expires); - return; - } + } else { + spin_unlock_irq(instance->host_lock); + NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); + spin_lock_irq(instance->host_lock); } } /* while (1) */ } Index: linux/drivers/scsi/NCR5380.h =================================================================== --- linux.orig/drivers/scsi/NCR5380.h 2015-11-18 19:33:33.000000000 +1100 +++ linux/drivers/scsi/NCR5380.h 2015-11-18 19:33:38.000000000 +1100 @@ -205,16 +205,6 @@ #define PHASE_SR_TO_TCR(phase) ((phase) >> 2) -/* - * The internal should_disconnect() function returns these based on the - * expected length of a disconnect if a device supports disconnect/ - * reconnect. - */ - -#define DISCONNECT_NONE 0 -#define DISCONNECT_TIME_TO_DATA 1 -#define DISCONNECT_LONG 2 - /* * "Special" value for the (unsigned char) command tag, to indicate * I_T_L nexus instead of I_T_L_Q. @@ -266,7 +256,6 @@ struct NCR5380_hostdata { volatile struct scsi_cmnd *issue_queue; /* waiting to be issued */ volatile struct scsi_cmnd *disconnected_queue; /* waiting for reconnect */ int flags; - unsigned long time_expires; /* in jiffies, set prior to sleeping */ struct delayed_work coroutine; /* our co-routine */ struct scsi_eh_save ses; char info[256]; Index: linux/drivers/scsi/atari_NCR5380.c =================================================================== --- linux.orig/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -126,17 +126,7 @@ * piece of hardware that requires you to sit in a loop polling for * the REQ signal as long as you are connected. Some devices are * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect - * while doing long seek operations. - * - * The workaround for this is to keep track of devices that have - * disconnected. If the device hasn't disconnected, for commands that - * should disconnect, we do something like - * - * while (!REQ is asserted) { sleep for N usecs; poll for M usecs } - * - * Some tweaking of N and M needs to be done. An algorithm based - * on "time to data" would give the best results as long as short time - * to datas (ie, on the same track) were considered, however these + * while doing long seek operations. [...] These * broken devices are the exception rather than the rule and I'd rather * spend my time optimizing for the normal case. * @@ -1734,13 +1724,14 @@ static int NCR5380_transfer_pio(struct S * Wait for assertion of REQ, after which the phase bits will be * valid */ - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ)) - ; + + if (NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0) + break; dprintk(NDEBUG_HANDSHAKE, "scsi%d: REQ detected\n", HOSTNO); /* Check for phase mismatch */ - if ((tmp & PHASE_MASK) != p) { + if ((NCR5380_read(STATUS_REG) & PHASE_MASK) != p) { dprintk(NDEBUG_PIO, "scsi%d: phase mismatch\n", HOSTNO); NCR5380_dprint_phase(NDEBUG_PIO, instance); break; @@ -2393,7 +2384,6 @@ static void NCR5380_information_transfer /* Accept message by clearing ACK */ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); local_irq_save(flags); - cmd->device->disconnect = 1; LIST(cmd,hostdata->disconnected_queue); SET_NEXT(cmd, hostdata->disconnected_queue); hostdata->connected = NULL; @@ -2558,7 +2548,9 @@ static void NCR5380_information_transfer printk("scsi%d: unknown phase\n", HOSTNO); NCR5380_dprint(NDEBUG_ANY, instance); } /* switch(phase) */ - } /* if (tmp * SR_REQ) */ + } else { + NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); + } } /* while (1) */ } Index: linux/drivers/scsi/g_NCR5380.c =================================================================== --- linux.orig/drivers/scsi/g_NCR5380.c 2015-11-18 19:33:35.000000000 +1100 +++ linux/drivers/scsi/g_NCR5380.c 2015-11-18 19:33:38.000000000 +1100 @@ -56,10 +56,6 @@ * */ -/* settings for DTC3181E card with only Mustek scanner attached */ -#define USLEEP_POLL msecs_to_jiffies(10) -#define USLEEP_SLEEP msecs_to_jiffies(200) - #define AUTOPROBE_IRQ #ifdef CONFIG_SCSI_GENERIC_NCR53C400
next prev parent reply other threads:[~2015-11-18 9:05 UTC|newest] Thread overview: 268+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-11-18 8:34 [PATCH 00/71] More fixes, cleanup and modernization for NCR5380 drivers Finn Thain 2015-11-18 8:34 ` Finn Thain 2015-11-18 8:34 ` [PATCH 01/71] atari_scsi: Fix SCSI host ID setting Finn Thain 2015-11-18 8:34 ` Finn Thain 2015-11-19 7:37 ` Hannes Reinecke 2015-11-18 8:34 ` [PATCH 02/71] ncr5380: Remove redundant static variable initializers Finn Thain 2015-11-18 8:34 ` Finn Thain 2015-11-19 7:37 ` Hannes Reinecke 2015-11-18 8:34 ` [PATCH 03/71] ncr5380: Eliminate PDEBUG*, TDEBUG* and DTCDEBUG* macros Finn Thain 2015-11-18 8:34 ` Finn Thain 2015-11-19 7:38 ` Hannes Reinecke 2015-11-18 8:34 ` [PATCH 04/71] ncr5380: Remove more pointless macros Finn Thain 2015-11-18 8:34 ` Finn Thain 2015-11-19 7:38 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 05/71] ncr5380: Remove NCR5380_local_declare and NCR5380_setup macros Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 7:41 ` Hannes Reinecke 2015-11-19 7:41 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 06/71] ncr5380: Remove NCR5380_instance_name macro Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 7:41 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 07/71] ncr5380: Split NCR5380_init() into two functions Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 13:30 ` Hannes Reinecke 2015-11-19 13:30 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 08/71] ncr5380: Move NCR53C400-specific code Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 13:31 ` Hannes Reinecke 2015-11-19 13:31 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 09/71] atari_NCR5380: Reset bus on driver initialization if required Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 13:38 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 10/71] atari_NCR5380: Remove RESET_BOOT, CONFIG_ATARI_SCSI_TOSHIBA_DELAY and CONFIG_ATARI_SCSI_RESET_BOOT Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 3:05 ` Michael Schmitz 2015-11-19 4:05 ` Finn Thain 2015-11-19 4:43 ` Michael Schmitz 2015-11-19 13:41 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 11/71] ncr5380: Simplify bus reset handlers Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 13:56 ` Hannes Reinecke 2015-11-19 13:56 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 12/71] ncr5380: Remove unused hostdata->aborted flag Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 14:13 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 13/71] ncr5380: Remove redundant register writes Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 14:14 ` Hannes Reinecke 2015-11-19 14:14 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 14/71] ncr5380: Use return instead of goto in NCR5380_select() Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 14:14 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 15/71] ncr5380: Always escalate bad target time-out " Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 14:15 ` Hannes Reinecke 2015-11-19 14:15 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 16/71] ncr5380: Proceed with next command after NCR5380_select() calls scsi_done Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-19 14:16 ` Hannes Reinecke 2015-11-18 8:35 ` [PATCH 17/71] ncr5380: Keep BSY asserted when entering SELECTION phase Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 18/71] ncr5380: Eliminate USLEEP_WAITLONG delay Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 19/71] ncr5380: Cleanup bogus {request,release}_region() calls Finn Thain 2015-11-18 8:35 ` [PATCH 19/71] ncr5380: Cleanup bogus {request, release}_region() calls Finn Thain 2015-11-18 8:35 ` [PATCH 19/71] ncr5380: Cleanup bogus {request,release}_region() calls Finn Thain 2015-11-18 8:35 ` [PATCH 20/71] ncr5380: Introduce unbound workqueue Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 21/71] ncr5380: Sleep when polling, if possible Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 22/71] ncr5380: Eliminate selecting state Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-24 19:08 ` Ondrej Zary 2015-11-25 3:17 ` Finn Thain 2015-11-25 21:59 ` Ondrej Zary 2015-11-26 10:23 ` Finn Thain 2015-11-26 19:35 ` Ondrej Zary 2015-11-26 22:32 ` Finn Thain 2015-11-28 23:13 ` Ondrej Zary 2015-11-29 0:46 ` Finn Thain 2015-11-29 9:09 ` Ondrej Zary 2015-11-29 9:27 ` Geert Uytterhoeven 2015-11-29 10:25 ` Finn Thain 2015-11-29 13:50 ` Geert Uytterhoeven 2015-11-30 2:12 ` Finn Thain 2015-11-18 8:35 ` [PATCH 23/71] ncr5380: Always retry arbitration and selection Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 24/71] ncr5380: Implement NCR5380_dma_xfer_len and remove LIMIT_TRANSFERSIZE macro Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain [this message] 2015-11-18 8:35 ` [PATCH 25/71] ncr5380: Rework disconnect versus poll logic Finn Thain 2015-11-18 8:35 ` [PATCH 26/71] ncr5380: Fix NCR5380_transfer_pio() result Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 27/71] ncr5380: Add missing lock in eh_abort_handler Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 28/71] ncr5380: Drop DEF_SCSI_QCMD macro Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 29/71] ncr5380: Remove references to linked commands Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 30/71] ncr5380: Add missing break after case MESSAGE_REJECT Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 31/71] ncr5380: Fix !REQ timeout in do_abort() Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 32/71] ncr5380: Fix bus phase " Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 33/71] atari_NCR5380: Set do_abort() timeouts Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 34/71] atari_NCR5380: Use arbitration timeout Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 35/71] ncr5380: Dont wait for BUS FREE after disconnect Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 36/71] ncr5380: Use work_struct instead of delayed_work Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 37/71] ncr5380: Standardize work queueing algorithm Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 38/71] ncr5380: Remove UNSAFE macro Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 39/71] ncr5380: Standardize interrupt handling Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 40/71] ncr5380: Introduce NCR5380_poll_politely2 Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 41/71] ncr5380: Replace redundant flags with FLAG_NO_DMA_FIXUP Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 42/71] ncr5380: Replace READ_OVERRUNS macro with FLAG_NO_DMA_FIXUPS Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 43/71] ncr5380: Standardize reselection handling Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 44/71] ncr5380: Fix off-by-one bug in extended_msg[] bounds check Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 45/71] ncr5380: Cleanup #include directives Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 46/71] ncr5380: Fix NDEBUG_NO_DATAOUT flag Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 47/71] ncr5380: Fix and cleanup scsi_host_template initializers Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 48/71] atari_NCR5380: Fix queue_size limit Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 49/71] atari_NCR5380: Introduce FLAG_DTC3181E Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 50/71] ncr5380: Change instance->host_lock to hostdata->lock Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 51/71] ncr5380: Remove command list debug code Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 52/71] ncr5380: Remove H_NO macro and introduce dsprintk Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 53/71] ncr5380: Use shost_priv helper Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 54/71] ncr5380: Use dsprintk() for queue debugging Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 55/71] ncr5380: Remove LIST and REMOVE macros Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 56/71] ncr5380: Remove redundant volatile qualifiers Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 57/71] ncr5380: Use standard list data structure Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 58/71] ncr5380: Refactor command completion Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 59/71] ncr5380: Fix autosense bugs Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 60/71] ncr5380: Implement new eh_abort_handler Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 61/71] ncr5380: Fix EH during arbitration and selection Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 62/71] ncr5380: Implement new eh_bus_reset_handler Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 63/71] atari_NCR5380: Remove HOSTNO macro from printk() and seq_printf() calls Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:35 ` [PATCH 64/71] atari_NCR5380: Eliminate HOSTNO macro Finn Thain 2015-11-18 8:35 ` Finn Thain 2015-11-18 8:36 ` [PATCH 65/71] atari_scsi, sun3_scsi: Remove global Scsi_Host pointer Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 66/71] ncr5380: Fix soft lockups Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 67/71] ncr5380: Cleanup comments Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 68/71] ncr5380: Fix whitespace issues using regexp Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 69/71] ncr5380: Merge changes from atari_NCR5380.c Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 70/71] atari_NCR5380: Merge changes from NCR5380.c Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 8:36 ` [PATCH 71/71] ncr5380: Cleanup whitespace and parentheses Finn Thain 2015-11-18 8:36 ` Finn Thain 2015-11-18 11:35 ` [PATCH 00/71] More fixes, cleanup and modernization for NCR5380 drivers Ondrej Zary 2015-11-19 2:24 ` Finn Thain 2015-11-19 2:52 ` Michael Schmitz 2015-11-19 7:48 ` Ondrej Zary 2015-11-19 22:50 ` Ondrej Zary 2015-11-20 1:41 ` Finn Thain 2015-11-20 7:21 ` Finn Thain 2015-11-20 7:33 ` Christoph Hellwig 2015-11-20 8:19 ` Finn Thain 2015-11-20 9:16 ` Ondrej Zary 2015-11-20 10:00 ` Christoph Hellwig 2015-11-20 10:53 ` Finn Thain 2015-11-20 11:40 ` Ondrej Zary 2015-11-20 11:45 ` Christoph Hellwig 2015-11-20 12:23 ` Geert Uytterhoeven 2015-11-20 12:46 ` Ondrej Zary 2015-11-20 7:35 ` Ondrej Zary 2015-11-20 18:29 ` Ondrej Zary 2015-11-21 1:58 ` Finn Thain 2015-11-21 13:01 ` Ondrej Zary 2015-11-21 23:07 ` Ondrej Zary 2015-11-21 23:32 ` Finn Thain 2015-11-23 22:55 ` Ondrej Zary 2015-11-24 1:21 ` Finn Thain 2015-11-24 8:04 ` Ondrej Zary 2015-11-24 9:13 ` Finn Thain 2015-11-24 12:03 ` Ondrej Zary 2015-11-24 18:04 ` Ondrej Zary 2015-11-24 21:40 ` Ondrej Zary 2015-11-25 2:10 ` Finn Thain 2015-11-25 9:04 ` Ondrej Zary 2015-11-25 11:50 ` Finn Thain 2015-11-25 23:01 ` Ondrej Zary 2015-11-25 21:34 ` [PATCH 72/71] ncr5380: Fix pseudo-DMA Ondrej Zary 2015-11-29 9:39 ` [RFC PATCH 73/71] ncr5380: Use runtime register mapping Ondrej Zary 2015-11-30 11:50 ` Finn Thain 2015-11-29 9:39 ` [RFC PATCH 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary 2015-11-30 11:52 ` Finn Thain 2015-11-30 12:04 ` Finn Thain 2015-11-30 13:40 ` Ondrej Zary 2015-12-06 3:20 ` Finn Thain 2015-11-29 10:01 ` [RFC PATCH 75/71] ncr5380: Remove FLAG_DTC3181E Ondrej Zary 2015-11-30 4:56 ` Finn Thain 2015-12-03 23:03 ` [RFC PATCH 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary 2015-12-04 0:12 ` Julian Calaby 2015-12-04 8:38 ` Finn Thain 2015-12-05 1:32 ` Julian Calaby 2015-12-05 2:12 ` Finn Thain 2015-12-05 2:38 ` Julian Calaby 2015-12-04 9:08 ` Finn Thain 2015-12-04 9:32 ` Ondrej Zary 2015-12-04 9:20 ` Finn Thain 2015-12-03 23:03 ` [RFC PATCH 77/71] ncr5380: Fix wait for 53C80 registers registers after PDMA Ondrej Zary 2015-12-04 21:00 ` [PATCH 73/71] ncr5380: Use runtime register mapping Ondrej Zary 2015-12-06 3:39 ` Finn Thain 2015-12-06 8:42 ` Geert Uytterhoeven 2015-12-04 21:02 ` [PATCH 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary 2015-12-06 3:41 ` Finn Thain 2015-12-04 21:17 ` [PATCH 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary 2015-12-06 3:40 ` Finn Thain 2015-12-06 22:47 ` Ondrej Zary 2015-12-05 21:18 ` [RFC PATCH 78/71] ncr5380: Add support for HP 53C400A-based cards (C2502) Ondrej Zary 2015-12-06 3:39 ` Finn Thain 2015-12-06 22:20 ` [PATCH v2 73/71] ncr5380: Use runtime register mapping Ondrej Zary 2015-12-06 22:21 ` [PATCH v2 74/71] ncr5380: Enable PDMA for NCR53C400A Ondrej Zary 2015-12-08 2:05 ` Finn Thain 2015-12-09 13:39 ` Ondrej Zary 2015-12-10 23:39 ` Finn Thain 2015-12-06 22:55 ` [PATCH v2 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary 2015-12-06 23:17 ` [PATCH v2 77/71] ncr5380: Fix wait for 53C80 registers registers after PDMA Ondrej Zary 2015-12-07 3:16 ` Finn Thain 2015-12-07 8:08 ` Ondrej Zary 2015-12-06 23:20 ` [PATCH v3 76/71] ncr5380: Enable PDMA for DTC chips Ondrej Zary 2015-12-08 7:51 ` [PATCH v2 78/71] ncr5380: Add support for HP 53C400A-based cards (C2502) Ondrej Zary 2015-12-08 11:40 ` Finn Thain 2015-12-09 11:33 ` Ondrej Zary 2015-12-10 23:38 ` Finn Thain 2015-12-09 12:11 ` [PATCH v3 " Ondrej Zary
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20151118083502.471575952@telegraphics.com.au \ --to=fthain@telegraphics.com.au \ --cc=JBottomley@odin.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-m68k@vger.kernel.org \ --cc=linux-scsi@vger.kernel.org \ --cc=schmitzmic@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.