* [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
@ 2014-10-27 5:26 Finn Thain
2014-10-27 5:26 ` [PATCH v2 01/36] ncr5380: Use printk() not pr_debug() Finn Thain
` (36 more replies)
0 siblings, 37 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
This patch series has fixes for bugs and compiler warnings as well as code
cleanup and modernization. It covers all ten NCR5380 drivers and the three
core NCR5380 drivers so it's fairly large.
These patches remove a lot of duplicated code and C pre-processor abuse.
There are also patches for scsi_add_host() conversion for atari_scsi,
mac_scsi and sun3_scsi.
Some steps are taken toward re-unification of the NCR5380 core driver forks
by reducing divergence between them. Also, the atari_NCR5380.c core driver
is generalized so it can be used by sun3_scsi.c (and others).
I have compile-tested all of the NCR5380 drivers (x86, ARM and m68k) and
executed mac_scsi and dmx3191d on suitable hardware. I found no regressions
but the core NCR5380 drivers have bugs unrelated to these patches.
Testing mac_scsi and dmx3191d provides only limited code coverage for these
patches. Some testing on Sun 3, Atari ST and/or Atari TT would be nice
(I don't have the hardware).
There are old bugs relating to exception handling and autosense in the
core NCR5380 drivers that can make testing difficult. I'm working on a
series of patches to address these bugs. Those patches are not yet ready
for submission but they were helpful for the testing I did and may be
helpful to other testers. Let me know if so.
Changes since v1:
- Re-based to v3.17.
- Addressed issues raised in code review (see relevant patches for details).
- Added patches 30 to 36, to remove sun3_NCR5380.c entirely and remove more
static variables from atari_NCR5380.c.
This patch set stops short of parameterizing the drivers with platform_data
and/or ops struct. IMHO, it would be premature to do such refactoring before
drivers have been purged of static variables and certain #ifdefs. After
that is done, entire modules could be replaced with platform devices.
Several patches in this set address issues with the tagged command queueing
code (see patches 7, 33 and 34). I've since learned from recent discussions
on the linux-scsi list that use of the tag member in struct scsi_cmnd is
deprecated. If removal of the tag member is imminent then it may be better
to remove TCQ support from all of the NCR5380 drivers instead of this
cleanup. Or it could be done separately.
Removal of TCQ code might make re-unification easier, by bringing
atari_NCR5380.c closer to NCR5380.c and eliminating some #ifdefs.
Changes to the TCQ code would affect atari_scsi, being the only driver to
#define SUPPORT_TAGS.
---
MAINTAINERS | 1
arch/m68k/atari/config.c | 27
arch/m68k/atari/stdma.c | 61
arch/m68k/include/asm/atari_stdma.h | 4
arch/m68k/include/asm/macintosh.h | 4
arch/m68k/mac/config.c | 146 +
arch/m68k/sun3/config.c | 60
drivers/scsi/Kconfig | 2
drivers/scsi/NCR5380.c | 295 +--
drivers/scsi/NCR5380.h | 78
drivers/scsi/arm/cumana_1.c | 18
drivers/scsi/arm/oak.c | 23
drivers/scsi/atari_NCR5380.c | 981 +++++-------
drivers/scsi/atari_scsi.c | 676 +++-----
drivers/scsi/atari_scsi.h | 60
drivers/scsi/dmx3191d.c | 31
drivers/scsi/dtc.c | 85 -
drivers/scsi/dtc.h | 26
drivers/scsi/g_NCR5380.c | 224 --
drivers/scsi/g_NCR5380.h | 26
drivers/scsi/mac_scsi.c | 542 ++----
drivers/scsi/mac_scsi.h | 74
drivers/scsi/pas16.c | 106 -
drivers/scsi/pas16.h | 21
drivers/scsi/sun3_NCR5380.c | 2933 ------------------------------------
drivers/scsi/sun3_scsi.c | 512 ++----
drivers/scsi/sun3_scsi.h | 84 -
drivers/scsi/t128.c | 83 -
drivers/scsi/t128.h | 23
29 files changed, 1745 insertions(+), 5461 deletions(-)
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 01/36] ncr5380: Use printk() not pr_debug()
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-27 5:26 ` [PATCH v2 02/36] ncr5380: Remove unused hostdata fields Finn Thain
` (35 subsequent siblings)
36 siblings, 0 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-use-printk-not-pr_debug --]
[-- Type: text/plain, Size: 983 bytes --]
Having defined NDEBUG, and having set the console log level, I'd like to see
some output. Don't use pr_debug(), it's annoying to have to define DEBUG as
well.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
Use of pr_debug() here was a bad idea of mine. Joe was right when
he questioned it.
---
drivers/scsi/NCR5380.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:06.000000000 +1100
@@ -296,7 +296,8 @@ struct NCR5380_hostdata {
#endif
#define dprintk(flg, fmt, ...) \
- do { if ((NDEBUG) & (flg)) pr_debug(fmt, ## __VA_ARGS__); } while (0)
+ do { if ((NDEBUG) & (flg)) \
+ printk(KERN_DEBUG fmt, ## __VA_ARGS__); } while (0)
#if NDEBUG
#define NCR5380_dprint(flg, arg) \
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 02/36] ncr5380: Remove unused hostdata fields
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
2014-10-27 5:26 ` [PATCH v2 01/36] ncr5380: Use printk() not pr_debug() Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-27 5:26 ` [PATCH v2 03/36] ncr5380: Fix compiler warnings and __setup options Finn Thain
` (34 subsequent siblings)
36 siblings, 0 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-unused-hostdata --]
[-- Type: text/plain, Size: 4335 bytes --]
Remove unused fields from hostdata structs declared with the
NCR5380_implementation_fields macro.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/dmx3191d.c | 4 ++--
drivers/scsi/mac_scsi.c | 33 ---------------------------------
drivers/scsi/mac_scsi.h | 3 +--
drivers/scsi/sun3_scsi.c | 2 --
drivers/scsi/sun3_scsi.h | 3 +--
5 files changed, 4 insertions(+), 41 deletions(-)
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:07.000000000 +1100
@@ -38,8 +38,8 @@
#define NCR5380_read(reg) inb(port + reg)
#define NCR5380_write(reg, value) outb(value, port + reg)
-#define NCR5380_implementation_fields unsigned int port
-#define NCR5380_local_declare() NCR5380_implementation_fields
+#define NCR5380_implementation_fields /* none */
+#define NCR5380_local_declare() unsigned int port
#define NCR5380_setup(instance) port = instance->io_port
/*
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:07.000000000 +1100
@@ -93,35 +93,6 @@ static volatile unsigned char *mac_scsi_
* NCR 5380 register access functions
*/
-#if 0
-/* Debug versions */
-#define CTRL(p,v) (*ctrl = (v))
-
-static char macscsi_read(struct Scsi_Host *instance, int reg)
-{
- int iobase = instance->io_port;
- int i;
- int *ctrl = &((struct NCR5380_hostdata *)instance->hostdata)->ctrl;
-
- CTRL(iobase, 0);
- i = in_8(iobase + (reg<<4));
- CTRL(iobase, 0x40);
-
- return i;
-}
-
-static void macscsi_write(struct Scsi_Host *instance, int reg, int value)
-{
- int iobase = instance->io_port;
- int *ctrl = &((struct NCR5380_hostdata *)instance->hostdata)->ctrl;
-
- CTRL(iobase, 0);
- out_8(iobase + (reg<<4), value);
- CTRL(iobase, 0x40);
-}
-#else
-
-/* Fast versions */
static __inline__ char macscsi_read(struct Scsi_Host *instance, int reg)
{
return in_8(instance->io_port + (reg<<4));
@@ -131,8 +102,6 @@ static __inline__ void macscsi_write(str
{
out_8(instance->io_port + (reg<<4), value);
}
-#endif
-
/*
* Function : mac_scsi_setup(char *str)
@@ -279,8 +248,6 @@ int __init macscsi_detect(struct scsi_ho
instance->n_io_port = 255;
- ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0;
-
if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, NCR5380_intr, 0, "ncr5380", instance)) {
printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n",
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.h 2014-10-27 16:25:07.000000000 +1100
@@ -47,8 +47,7 @@
#include <scsi/scsicam.h>
-#define NCR5380_implementation_fields \
- int port, ctrl
+#define NCR5380_implementation_fields /* none */
#define NCR5380_local_declare() \
struct Scsi_Host *_instance
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:07.000000000 +1100
@@ -313,8 +313,6 @@ static int __init sun3scsi_detect(struct
instance->n_io_port = 32;
- ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0;
-
if (request_irq(instance->irq, scsi_sun3_intr,
0, "Sun3SCSI-5380", instance)) {
#ifndef REAL_DMA
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:07.000000000 +1100
@@ -78,8 +78,7 @@ static int sun3scsi_release (struct Scsi
#define SUN3_SCSI_NAME "Sun3 NCR5380 SCSI"
#endif
-#define NCR5380_implementation_fields \
- int port, ctrl
+#define NCR5380_implementation_fields /* none */
#define NCR5380_local_declare() \
struct Scsi_Host *_instance
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 03/36] ncr5380: Fix compiler warnings and __setup options
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
2014-10-27 5:26 ` [PATCH v2 01/36] ncr5380: Use printk() not pr_debug() Finn Thain
2014-10-27 5:26 ` [PATCH v2 02/36] ncr5380: Remove unused hostdata fields Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-27 5:26 ` [PATCH v2 04/36] ncr5380: Remove unused macros Finn Thain
` (33 subsequent siblings)
36 siblings, 0 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-fix-compiler-warnings-and-setup --]
[-- Type: text/plain, Size: 3614 bytes --]
Some __setup() options mentioned in Documentation/scsi don't work because
a few lines of code went missing sometime since Linux 2.4. Fix the options
and thus fix some compiler warnings for both the non-modular case,
CC drivers/scsi/dtc.o
drivers/scsi/dtc.c:176:20: warning: 'dtc_setup' defined but not used [-Wunused-function]
and the modular case,
CC [M] drivers/scsi/pas16.o
drivers/scsi/pas16.c:335:20: warning: 'pas16_setup' defined but not used [-Wunused-function]
CC [M] drivers/scsi/t128.o
drivers/scsi/t128.c:147:20: warning: 't128_setup' defined but not used [-Wunused-function]
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/dtc.c | 8 +++++++-
drivers/scsi/pas16.c | 10 +++++++++-
drivers/scsi/t128.c | 11 ++++++++++-
3 files changed, 26 insertions(+), 3 deletions(-)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:08.000000000 +1100
@@ -173,10 +173,13 @@ static const struct signature {
*
*/
-static void __init dtc_setup(char *str, int *ints)
+static int __init dtc_setup(char *str)
{
static int commandline_current = 0;
int i;
+ int ints[10];
+
+ get_options(str, ARRAY_SIZE(ints), ints);
if (ints[0] != 2)
printk("dtc_setup: usage dtc=address,irq\n");
else if (commandline_current < NO_OVERRIDES) {
@@ -189,7 +192,10 @@ static void __init dtc_setup(char *str,
}
++commandline_current;
}
+ return 1;
}
+
+__setup("dtc=", dtc_setup);
#endif
/*
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:08.000000000 +1100
@@ -337,6 +337,7 @@ static int __init
}
+#ifndef MODULE
/*
* Function : pas16_setup(char *str, int *ints)
*
@@ -347,10 +348,13 @@ static int __init
*
*/
-void __init pas16_setup(char *str, int *ints)
+static int __init pas16_setup(char *str)
{
static int commandline_current = 0;
int i;
+ int ints[10];
+
+ get_options(str, ARRAY_SIZE(ints), ints);
if (ints[0] != 2)
printk("pas16_setup : usage pas16=io_port,irq\n");
else
@@ -364,8 +368,12 @@ void __init pas16_setup(char *str, int *
}
++commandline_current;
}
+ return 1;
}
+__setup("pas16=", pas16_setup);
+#endif
+
/*
* Function : int pas16_detect(struct scsi_host_template * tpnt)
*
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:08.000000000 +1100
@@ -148,6 +148,7 @@ static struct signature {
#define NO_SIGNATURES ARRAY_SIZE(signatures)
+#ifndef MODULE
/*
* Function : t128_setup(char *str, int *ints)
*
@@ -158,9 +159,13 @@ static struct signature {
*
*/
-void __init t128_setup(char *str, int *ints){
+static int __init t128_setup(char *str)
+{
static int commandline_current = 0;
int i;
+ int ints[10];
+
+ get_options(str, ARRAY_SIZE(ints), ints);
if (ints[0] != 2)
printk("t128_setup : usage t128=address,irq\n");
else
@@ -174,8 +179,12 @@ void __init t128_setup(char *str, int *i
}
++commandline_current;
}
+ return 1;
}
+__setup("t128=", t128_setup);
+#endif
+
/*
* Function : int t128_detect(struct scsi_host_template * tpnt)
*
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 04/36] ncr5380: Remove unused macros
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (2 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 03/36] ncr5380: Fix compiler warnings and __setup options Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-27 5:26 ` [PATCH v2 05/36] ncr5380: Remove useless prototypes Finn Thain
` (32 subsequent siblings)
36 siblings, 0 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-remove-unused-macros --]
[-- Type: text/plain, Size: 8372 bytes --]
Some macros are never evaluated (i.e. FOO, USLEEP, SCSI2 and USE_WRAPPER;
and in some drivers, NCR5380_intr and NCR5380_proc_info). DRIVER_SETUP
serves no purpose anymore. Remove these macro definitions.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/NCR5380.c | 2 +-
drivers/scsi/arm/oak.c | 1 -
drivers/scsi/atari_scsi.h | 1 -
drivers/scsi/g_NCR5380.c | 5 -----
drivers/scsi/g_NCR5380.h | 1 -
drivers/scsi/mac_scsi.c | 3 ---
drivers/scsi/pas16.c | 5 -----
drivers/scsi/sun3_scsi.c | 15 ---------------
drivers/scsi/sun3_scsi.h | 1 -
drivers/scsi/t128.c | 5 -----
10 files changed, 1 insertion(+), 38 deletions(-)
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:07.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:09.000000000 +1100
@@ -55,7 +55,6 @@
#include "NCR5380.h"
#define RESET_BOOT
-#define DRIVER_SETUP
extern void via_scsi_clear(void);
@@ -113,7 +112,6 @@ static __inline__ void macscsi_write(str
*/
static int __init mac_scsi_setup(char *str) {
-#ifdef DRIVER_SETUP
int ints[7];
(void)get_options( str, ARRAY_SIZE(ints), ints);
@@ -166,7 +164,6 @@ static int __init mac_scsi_setup(char *s
}
#endif /* SUPPORT_TAGS */
-#endif /* DRIVER_SETUP */
return 1;
}
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:07.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:09.000000000 +1100
@@ -43,10 +43,6 @@
* Options :
*
* PARITY - enable parity checking. Not supported.
- *
- * SCSI2 - enable support for SCSI-II tagged queueing. Untested.
- *
- * USLEEP - enable support for devices that don't disconnect. Untested.
*/
#define AUTOSENSE
@@ -79,18 +75,7 @@
extern int sun3_map_test(unsigned long, char *);
-#define USE_WRAPPER
/*#define RESET_BOOT */
-#define DRIVER_SETUP
-
-/*
- * BUG can be used to trigger a strange code-size related hang on 2.1 kernels
- */
-#ifdef BUG
-#undef RESET_BOOT
-#undef DRIVER_SETUP
-#endif
-
/* #define SUPPORT_TAGS */
#ifdef SUN3_SCSI_VME
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:09.000000000 +1100
@@ -649,7 +649,7 @@ NCR5380_print_options(struct Scsi_Host *
" UNSAFE "
#endif
);
- printk(" USLEEP, USLEEP_POLL=%d USLEEP_SLEEP=%d", USLEEP_POLL, USLEEP_SLEEP);
+ printk(" USLEEP_POLL=%d USLEEP_SLEEP=%d", USLEEP_POLL, USLEEP_SLEEP);
printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400) {
printk(" ncr53c400 release=%d", NCR53C400_PUBLIC_RELEASE);
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:08.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:09.000000000 +1100
@@ -1,6 +1,5 @@
#define AUTOSENSE
#define PSEUDO_DMA
-#define FOO
#define UNSAFE /* Not unsafe for PAS16 -- use it */
#define PDEBUG 0
@@ -52,8 +51,6 @@
* increase compared to polled I/O.
*
* PARITY - enable parity checking. Not supported.
- *
- * SCSI2 - enable support for SCSI-II tagged queueing. Untested.
*
* UNSAFE - leave interrupts enabled during pseudo-DMA transfers. This
* parameter comes from the NCR5380 code. It is NOT unsafe with
@@ -63,8 +60,6 @@
* want to use UNSAFE you can try defining LIMIT_TRANSFERSIZE or
* twiddle with the transfer size in the high level code.
*
- * USLEEP - enable support for devices that don't disconnect. Untested.
- *
* The card is detected and initialized in one of several ways :
* 1. Autoprobe (default) - There are many different models of
* the Pro Audio Spectrum/Studio 16, and I only have one of
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:09.000000000 +1100
@@ -44,10 +44,6 @@
*
* PARITY - enable parity checking. Not supported.
*
- * SCSI2 - enable support for SCSI-II tagged queueing. Untested.
- *
- * USLEEP - enable support for devices that don't disconnect. Untested.
- *
* The card is detected and initialized in one of several ways :
* 1. With command line overrides - NCR5380=port,irq may be
* used on the LILO command line to override the defaults.
@@ -79,7 +75,6 @@
*/
/* settings for DTC3181E card with only Mustek scanner attached */
-#define USLEEP
#define USLEEP_POLL 1
#define USLEEP_SLEEP 20
#define USLEEP_WAITLONG 500
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:09.000000000 +1100
@@ -29,7 +29,6 @@
#define NCR5380_read(reg) readb(_base + ((reg) << 2))
#define NCR5380_write(reg, value) writeb(value, _base + ((reg) << 2))
-#define NCR5380_intr oakscsi_intr
#define NCR5380_queue_command oakscsi_queue_command
#define NCR5380_show_info oakscsi_show_info
#define NCR5380_write_info oakscsi_write_info
Index: linux/drivers/scsi/g_NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:09.000000000 +1100
@@ -118,7 +118,6 @@ static const char* generic_NCR5380_info(
#define NCR5380_bus_reset generic_NCR5380_bus_reset
#define NCR5380_pread generic_NCR5380_pread
#define NCR5380_pwrite generic_NCR5380_pwrite
-#define NCR5380_proc_info notyet_generic_proc_info
#define BOARD_NCR5380 0
#define BOARD_NCR53C400 1
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:08.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:09.000000000 +1100
@@ -47,17 +47,12 @@
* increase compared to polled I/O.
*
* PARITY - enable parity checking. Not supported.
- *
- * SCSI2 - enable support for SCSI-II tagged queueing. Untested.
- *
*
* UNSAFE - leave interrupts enabled during pseudo-DMA transfers. You
* only really want to use this if you're having a problem with
* dropped characters during high speed communications, and even
* then, you're going to be better off twiddling with transfersize.
*
- * USLEEP - enable support for devices that don't disconnect. Untested.
- *
* The card is detected and initialized in one of several ways :
* 1. Autoprobe (default) - since the board is memory mapped,
* a BIOS signature is scanned for to locate the registers.
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:07.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:09.000000000 +1100
@@ -89,7 +89,6 @@ static int sun3scsi_release (struct Scsi
#define NCR5380_read(reg) sun3scsi_read(reg)
#define NCR5380_write(reg, value) sun3scsi_write(reg, value)
-#define NCR5380_intr sun3scsi_intr
#define NCR5380_queue_command sun3scsi_queue_command
#define NCR5380_bus_reset sun3scsi_bus_reset
#define NCR5380_abort sun3scsi_abort
Index: linux/drivers/scsi/atari_scsi.h
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.h 2014-10-27 16:25:09.000000000 +1100
@@ -44,7 +44,6 @@
#define NCR5380_read(reg) atari_scsi_reg_read( reg )
#define NCR5380_write(reg, value) atari_scsi_reg_write( reg, value )
-#define NCR5380_intr atari_scsi_intr
#define NCR5380_queue_command atari_scsi_queue_command
#define NCR5380_abort atari_scsi_abort
#define NCR5380_show_info atari_scsi_show_info
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 05/36] ncr5380: Remove useless prototypes
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (3 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 04/36] ncr5380: Remove unused macros Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 14:41 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 06/36] ncr5380: Remove more " Finn Thain
` (31 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-useless-prototypes --]
[-- Type: text/plain, Size: 9296 bytes --]
Add missing static qualifiers and remove the now pointless prototypes. The
NCR5380_* prototypes are all declared in NCR5380.h and renamed using macros.
Further declarations are redundant (some are completely unused). Remove
them.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_scsi.c | 5 -----
drivers/scsi/dtc.h | 7 -------
drivers/scsi/g_NCR5380.c | 6 +++---
drivers/scsi/g_NCR5380.h | 6 ------
drivers/scsi/mac_scsi.c | 2 --
drivers/scsi/pas16.c | 6 +++---
drivers/scsi/pas16.h | 6 ------
drivers/scsi/sun3_scsi.c | 4 +---
drivers/scsi/sun3_scsi.h | 7 -------
drivers/scsi/t128.c | 7 ++++---
drivers/scsi/t128.h | 6 ------
11 files changed, 11 insertions(+), 51 deletions(-)
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:12.000000000 +1100
@@ -272,7 +272,7 @@ static int __init do_DTC3181E_setup(char
* Locks: none
*/
-int __init generic_NCR5380_detect(struct scsi_host_template * tpnt)
+static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
{
static int current_override = 0;
int count;
@@ -484,7 +484,7 @@ int __init generic_NCR5380_detect(struct
* Report driver information for the NCR5380
*/
-const char *generic_NCR5380_info(struct Scsi_Host *host)
+static const char *generic_NCR5380_info(struct Scsi_Host *host)
{
static const char string[] = "Generic NCR5380/53C400 Driver";
return string;
@@ -499,7 +499,7 @@ const char *generic_NCR5380_info(struct
* Locks: none
*/
-int generic_NCR5380_release_resources(struct Scsi_Host *instance)
+static int generic_NCR5380_release_resources(struct Scsi_Host *instance)
{
NCR5380_local_declare();
NCR5380_setup(instance);
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:12.000000000 +1100
@@ -382,7 +382,7 @@ __setup("pas16=", pas16_setup);
*
*/
-int __init pas16_detect(struct scsi_host_template * tpnt)
+static int __init pas16_detect(struct scsi_host_template *tpnt)
{
static int current_override = 0;
static unsigned short current_base = 0;
@@ -512,8 +512,8 @@ int __init pas16_detect(struct scsi_host
* and matching the H_C_S coordinates to what DOS uses.
*/
-int pas16_biosparam(struct scsi_device *sdev, struct block_device *dev,
- sector_t capacity, int * ip)
+static int pas16_biosparam(struct scsi_device *sdev, struct block_device *dev,
+ sector_t capacity, int *ip)
{
int size = capacity;
ip[0] = 64;
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:12.000000000 +1100
@@ -86,8 +86,6 @@ extern int sun3_map_test(unsigned long,
static irqreturn_t scsi_sun3_intr(int irq, void *dummy);
-static inline unsigned char sun3scsi_read(int reg);
-static inline void sun3scsi_write(int reg, int value);
static int setup_can_queue = -1;
module_param(setup_can_queue, int, 0);
@@ -348,7 +346,7 @@ static int __init sun3scsi_detect(struct
return 1;
}
-int sun3scsi_release (struct Scsi_Host *shpnt)
+static int sun3scsi_release(struct Scsi_Host *shpnt)
{
if (shpnt->irq != SCSI_IRQ_NONE)
free_irq(shpnt->irq, shpnt);
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:12.000000000 +1100
@@ -193,7 +193,8 @@ __setup("t128=", t128_setup);
*
*/
-int __init t128_detect(struct scsi_host_template * tpnt){
+static int __init t128_detect(struct scsi_host_template *tpnt)
+{
static int current_override = 0, current_base = 0;
struct Scsi_Host *instance;
unsigned long base;
@@ -325,8 +326,8 @@ static int t128_release(struct Scsi_Host
* and matching the H_C_S coordinates to what DOS uses.
*/
-int t128_biosparam(struct scsi_device *sdev, struct block_device *bdev,
- sector_t capacity, int * ip)
+static int t128_biosparam(struct scsi_device *sdev, struct block_device *bdev,
+ sector_t capacity, int *ip)
{
ip[0] = 64;
ip[1] = 32;
Index: linux/drivers/scsi/dtc.h
===================================================================
--- linux.orig/drivers/scsi/dtc.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/dtc.h 2014-10-27 16:25:12.000000000 +1100
@@ -32,13 +32,6 @@
#define DTCDEBUG_INIT 0x1
#define DTCDEBUG_TRANSFER 0x2
-static int dtc_abort(Scsi_Cmnd *);
-static int dtc_biosparam(struct scsi_device *, struct block_device *,
- sector_t, int*);
-static int dtc_detect(struct scsi_host_template *);
-static int dtc_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int dtc_bus_reset(Scsi_Cmnd *);
-
#ifndef CMD_PER_LUN
#define CMD_PER_LUN 2
#endif
Index: linux/drivers/scsi/g_NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:12.000000000 +1100
@@ -39,12 +39,6 @@
#endif
#ifndef ASM
-static int generic_NCR5380_abort(Scsi_Cmnd *);
-static int generic_NCR5380_detect(struct scsi_host_template *);
-static int generic_NCR5380_release_resources(struct Scsi_Host *);
-static int generic_NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int generic_NCR5380_bus_reset(Scsi_Cmnd *);
-static const char* generic_NCR5380_info(struct Scsi_Host *);
#ifndef CMD_PER_LUN
#define CMD_PER_LUN 2
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:12.000000000 +1100
@@ -56,8 +56,6 @@
#define RESET_BOOT
-extern void via_scsi_clear(void);
-
#ifdef RESET_BOOT
static void mac_scsi_reset_boot(struct Scsi_Host *instance);
#endif
Index: linux/drivers/scsi/pas16.h
===================================================================
--- linux.orig/drivers/scsi/pas16.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/pas16.h 2014-10-27 16:25:12.000000000 +1100
@@ -114,12 +114,6 @@
#ifndef ASM
-static int pas16_abort(Scsi_Cmnd *);
-static int pas16_biosparam(struct scsi_device *, struct block_device *,
- sector_t, int*);
-static int pas16_detect(struct scsi_host_template *);
-static int pas16_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int pas16_bus_reset(Scsi_Cmnd *);
#ifndef CMD_PER_LUN
#define CMD_PER_LUN 2
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:12.000000000 +1100
@@ -43,13 +43,6 @@
#define IOBASE_SUN3_VMESCSI 0xff200000
-static int sun3scsi_abort(struct scsi_cmnd *);
-static int sun3scsi_detect (struct scsi_host_template *);
-static const char *sun3scsi_info (struct Scsi_Host *);
-static int sun3scsi_bus_reset(struct scsi_cmnd *);
-static int sun3scsi_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int sun3scsi_release (struct Scsi_Host *);
-
#ifndef CMD_PER_LUN
#define CMD_PER_LUN 2
#endif
Index: linux/drivers/scsi/t128.h
===================================================================
--- linux.orig/drivers/scsi/t128.h 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/t128.h 2014-10-27 16:25:12.000000000 +1100
@@ -88,12 +88,6 @@
#define T_DATA_REG_OFFSET 0x1e00 /* rw 512 bytes long */
#ifndef ASM
-static int t128_abort(struct scsi_cmnd *);
-static int t128_biosparam(struct scsi_device *, struct block_device *,
- sector_t, int*);
-static int t128_detect(struct scsi_host_template *);
-static int t128_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int t128_bus_reset(struct scsi_cmnd *);
#ifndef CMD_PER_LUN
#define CMD_PER_LUN 2
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:12.000000000 +1100
@@ -181,12 +181,7 @@ static inline void DISABLE_IRQ(void)
/***************************** Prototypes *****************************/
#ifdef REAL_DMA
-static int scsi_dma_is_ignored_buserr(unsigned char dma_stat);
static void atari_scsi_fetch_restbytes(void);
-static long atari_scsi_dma_residual(struct Scsi_Host *instance);
-static int falcon_classify_cmd(Scsi_Cmnd *cmd);
-static unsigned long atari_dma_xfer_len(unsigned long wanted_len,
- Scsi_Cmnd *cmd, int write_flag);
#endif
static irqreturn_t scsi_tt_intr(int irq, void *dummy);
static irqreturn_t scsi_falcon_intr(int irq, void *dummy);
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 06/36] ncr5380: Remove more useless prototypes
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (4 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 05/36] ncr5380: Remove useless prototypes Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 14:44 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros Finn Thain
` (30 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-more-useless-prototypes --]
[-- Type: text/plain, Size: 8672 bytes --]
Make use of the host template static initializer instead of assigning
handlers at run-time. Move __maybe_unused qualifiers from declarations
to definitions. Move the atari_scsi_bus_reset() wrapper after the
definition of NCR5380_bus_reset(). All of the host template handler
prototypes are now redundant so remove them.
The write_info() handler is only relevant to drivers using PSEUDO_DMA so
this patch fixes the compiler warning in atari_NCR5380.c and sun3_NCR5380.c:
CC drivers/scsi/atari_scsi.o
drivers/scsi/NCR5380.h:329: warning: 'NCR5380_write_info' declared 'static' but never defined
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.h | 8 ----
drivers/scsi/atari_NCR5380.c | 3 +
drivers/scsi/atari_scsi.c | 76 ++++++++++++++++++++-----------------------
drivers/scsi/dtc.c | 7 +--
drivers/scsi/pas16.c | 7 +--
drivers/scsi/sun3_NCR5380.c | 3 +
drivers/scsi/t128.c | 7 +--
7 files changed, 50 insertions(+), 61 deletions(-)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:06.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:14.000000000 +1100
@@ -322,14 +322,6 @@ static irqreturn_t NCR5380_intr(int irq,
#endif
static void NCR5380_main(struct work_struct *work);
static void __maybe_unused NCR5380_print_options(struct Scsi_Host *instance);
-static int NCR5380_abort(Scsi_Cmnd * cmd);
-static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
-static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
-static int __maybe_unused NCR5380_show_info(struct seq_file *,
- struct Scsi_Host *);
-static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
- char *buffer, int length);
-
static void NCR5380_reselect(struct Scsi_Host *instance);
static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag);
#if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:08.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:14.000000000 +1100
@@ -219,10 +219,6 @@ static int __init dtc_detect(struct scsi
void __iomem *base;
int sig, count;
- tpnt->proc_name = "dtc3x80";
- tpnt->show_info = dtc_show_info;
- tpnt->write_info = dtc_write_info;
-
for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
addr = 0;
base = NULL;
@@ -477,6 +473,9 @@ static struct scsi_host_template driver_
.name = "DTC 3180/3280 ",
.detect = dtc_detect,
.release = dtc_release,
+ .proc_name = "dtc3x80",
+ .show_info = dtc_show_info,
+ .write_info = dtc_write_info,
.queuecommand = dtc_queue_command,
.eh_abort_handler = dtc_abort,
.eh_bus_reset_handler = dtc_bus_reset,
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:14.000000000 +1100
@@ -390,10 +390,6 @@ static int __init pas16_detect(struct sc
unsigned short io_port;
int count;
- tpnt->proc_name = "pas16";
- tpnt->show_info = pas16_show_info;
- tpnt->write_info = pas16_write_info;
-
if (pas16_addr != 0) {
overrides[0].io_port = pas16_addr;
/*
@@ -620,6 +616,9 @@ static struct scsi_host_template driver_
.name = "Pro Audio Spectrum-16 SCSI",
.detect = pas16_detect,
.release = pas16_release,
+ .proc_name = "pas16",
+ .show_info = pas16_show_info,
+ .write_info = pas16_write_info,
.queuecommand = pas16_queue_command,
.eh_abort_handler = pas16_abort,
.eh_bus_reset_handler = pas16_bus_reset,
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:14.000000000 +1100
@@ -201,10 +201,6 @@ static int __init t128_detect(struct scs
void __iomem *p;
int sig, count;
- tpnt->proc_name = "t128";
- tpnt->show_info = t128_show_info;
- tpnt->write_info = t128_write_info;
-
for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
base = 0;
p = NULL;
@@ -435,6 +431,9 @@ static struct scsi_host_template driver_
.name = "Trantor T128/T128F/T228",
.detect = t128_detect,
.release = t128_release,
+ .proc_name = "t128",
+ .show_info = t128_show_info,
+ .write_info = t128_write_info,
.queuecommand = t128_queue_command,
.eh_abort_handler = t128_abort,
.eh_bus_reset_handler = t128_bus_reset,
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:14.000000000 +1100
@@ -772,7 +772,8 @@ static void show_Scsi_Cmnd(Scsi_Cmnd *cm
seq_printf(m, "\n");
}
-static int NCR5380_show_info(struct seq_file *m, struct Scsi_Host *instance)
+static int __maybe_unused NCR5380_show_info(struct seq_file *m,
+ struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
Scsi_Cmnd *ptr;
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:14.000000000 +1100
@@ -718,7 +718,8 @@ static void show_Scsi_Cmnd(Scsi_Cmnd *cm
seq_printf(m, "\n");
}
-static int NCR5380_show_info(struct seq_file *m, struct Scsi_Host *instance)
+static int __maybe_unused NCR5380_show_info(struct seq_file *m,
+ struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
Scsi_Cmnd *ptr;
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:14.000000000 +1100
@@ -783,45 +783,6 @@ static int __init atari_scsi_setup(char
__setup("atascsi=", atari_scsi_setup);
#endif /* !MODULE */
-static int atari_scsi_bus_reset(Scsi_Cmnd *cmd)
-{
- int rv;
- struct NCR5380_hostdata *hostdata =
- (struct NCR5380_hostdata *)cmd->device->host->hostdata;
-
- /* For doing the reset, SCSI interrupts must be disabled first,
- * since the 5380 raises its IRQ line while _RST is active and we
- * can't disable interrupts completely, since we need the timer.
- */
- /* And abort a maybe active DMA transfer */
- if (IS_A_TT()) {
- atari_turnoff_irq(IRQ_TT_MFP_SCSI);
-#ifdef REAL_DMA
- tt_scsi_dma.dma_ctrl = 0;
-#endif /* REAL_DMA */
- } else {
- atari_turnoff_irq(IRQ_MFP_FSCSI);
-#ifdef REAL_DMA
- st_dma.dma_mode_status = 0x90;
- atari_dma_active = 0;
- atari_dma_orig_addr = NULL;
-#endif /* REAL_DMA */
- }
-
- rv = NCR5380_bus_reset(cmd);
-
- /* Re-enable ints */
- if (IS_A_TT()) {
- atari_turnon_irq(IRQ_TT_MFP_SCSI);
- } else {
- atari_turnon_irq(IRQ_MFP_FSCSI);
- }
- if (rv == SUCCESS)
- falcon_release_lock_if_possible(hostdata);
-
- return rv;
-}
-
#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
static void __init atari_scsi_reset_boot(void)
@@ -1094,6 +1055,43 @@ static void atari_scsi_falcon_reg_write(
#include "atari_NCR5380.c"
+static int atari_scsi_bus_reset(struct scsi_cmnd *cmd)
+{
+ int rv;
+ struct NCR5380_hostdata *hostdata = shost_priv(cmd->device->host);
+
+ /* For doing the reset, SCSI interrupts must be disabled first,
+ * since the 5380 raises its IRQ line while _RST is active and we
+ * can't disable interrupts completely, since we need the timer.
+ */
+ /* And abort a maybe active DMA transfer */
+ if (IS_A_TT()) {
+ atari_turnoff_irq(IRQ_TT_MFP_SCSI);
+#ifdef REAL_DMA
+ tt_scsi_dma.dma_ctrl = 0;
+#endif
+ } else {
+ atari_turnoff_irq(IRQ_MFP_FSCSI);
+#ifdef REAL_DMA
+ st_dma.dma_mode_status = 0x90;
+ atari_dma_active = 0;
+ atari_dma_orig_addr = NULL;
+#endif
+ }
+
+ rv = NCR5380_bus_reset(cmd);
+
+ if (IS_A_TT())
+ atari_turnon_irq(IRQ_TT_MFP_SCSI);
+ else
+ atari_turnon_irq(IRQ_MFP_FSCSI);
+
+ if (rv == SUCCESS)
+ falcon_release_lock_if_possible(hostdata);
+
+ return rv;
+}
+
static struct scsi_host_template driver_template = {
.show_info = atari_scsi_show_info,
.name = "Atari native SCSI",
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (5 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 06/36] ncr5380: Remove more " Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 14:45 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro Finn Thain
` (29 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-cleanup-TAG_NONE-and-TAG_NEXT --]
[-- Type: text/plain, Size: 10562 bytes --]
Both atari_NCR5380.c and sun3_NCR5380.c core drivers #undef TAG_NONE and
then redefine it. But the original definition is unused because NCR5380.c
lacks support for tagged queueing. So just define it once.
The TAG_NEXT macro only appears in the arguments to NCR5380_select() calls.
But that routine doesn't use its tag argument as the tag was already
assigned in NCR5380_main(). So remove the unused argument and the macro.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.c | 29 +++++++++++++----------------
drivers/scsi/NCR5380.h | 11 ++++-------
drivers/scsi/atari_NCR5380.c | 19 +++++--------------
drivers/scsi/sun3_NCR5380.c | 19 +++++--------------
4 files changed, 27 insertions(+), 51 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:16.000000000 +1100
@@ -316,10 +316,6 @@ static struct scsi_host_template *the_te
* important: the tag bit must be cleared before 'nr_allocated' is decreased.
*/
-/* -1 for TAG_NONE is not possible with unsigned char cmd->tag */
-#undef TAG_NONE
-#define TAG_NONE 0xff
-
typedef struct {
DECLARE_BITMAP(allocated, MAX_TAGS);
int nr_allocated;
@@ -1118,9 +1114,7 @@ static void NCR5380_main(struct work_str
#ifdef SUPPORT_TAGS
cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
#endif
- if (!NCR5380_select(instance, tmp,
- (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE :
- TAG_NEXT)) {
+ if (!NCR5380_select(instance, tmp)) {
falcon_dont_release--;
/* release if target did not response! */
falcon_release_lock_if_possible(hostdata);
@@ -1351,17 +1345,14 @@ static void collect_stats(struct NCR5380
#endif
/*
- * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd,
- * int tag);
+ * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
*
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
* including ARBITRATION, SELECTION, and initial message out for
* IDENTIFY and queue messages.
*
* Inputs : instance - instantiation of the 5380 driver on which this
- * target lives, cmd - SCSI command to execute, tag - set to TAG_NEXT for
- * new tag, TAG_NONE for untagged queueing, otherwise set to the tag for
- * the command that is presently connected.
+ * target lives, cmd - SCSI command to execute.
*
* Returns : -1 if selection could not execute for some reason,
* 0 if selection succeeded or failed because the target
@@ -1381,7 +1372,7 @@ static void collect_stats(struct NCR5380
* cmd->result host byte set to DID_BAD_TARGET.
*/
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag)
+static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd)
{
SETUP_HOSTDATA(instance);
unsigned char tmp[3], phase;
@@ -2758,7 +2749,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
local_irq_restore(flags);
dprintk(NDEBUG_ABORT, "scsi%d: aborting disconnected command.\n", HOSTNO);
- if (NCR5380_select(instance, cmd, (int)cmd->tag))
+ if (NCR5380_select(instance, cmd))
return FAILED;
dprintk(NDEBUG_ABORT, "scsi%d: nexus reestablished.\n", HOSTNO);
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:16.000000000 +1100
@@ -305,10 +305,6 @@ static struct scsi_host_template *the_te
* important: the tag bit must be cleared before 'nr_allocated' is decreased.
*/
-/* -1 for TAG_NONE is not possible with unsigned char cmd->tag */
-#undef TAG_NONE
-#define TAG_NONE 0xff
-
/* For the m68k, the number of bits in 'allocated' must be a multiple of 32! */
#if (MAX_TAGS % 32) != 0
#error "MAX_TAGS must be a multiple of 32!"
@@ -1057,9 +1053,7 @@ static void NCR5380_main (struct work_st
#ifdef SUPPORT_TAGS
cmd_get_tag( tmp, tmp->cmnd[0] != REQUEST_SENSE );
#endif
- if (!NCR5380_select(instance, tmp,
- (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE :
- TAG_NEXT)) {
+ if (!NCR5380_select(instance, tmp)) {
break;
} else {
local_irq_disable();
@@ -1292,16 +1286,14 @@ static void collect_stats(struct NCR5380
/*
* Function : int NCR5380_select(struct Scsi_Host *instance,
- * struct scsi_cmnd *cmd, int tag);
+ * struct scsi_cmnd *cmd)
*
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
* including ARBITRATION, SELECTION, and initial message out for
* IDENTIFY and queue messages.
*
* Inputs : instance - instantiation of the 5380 driver on which this
- * target lives, cmd - SCSI command to execute, tag - set to TAG_NEXT for
- * new tag, TAG_NONE for untagged queueing, otherwise set to the tag for
- * the command that is presently connected.
+ * target lives, cmd - SCSI command to execute.
*
* Returns : -1 if selection could not execute for some reason,
* 0 if selection succeeded or failed because the target
@@ -1321,8 +1313,7 @@ static void collect_stats(struct NCR5380
* cmd->result host byte set to DID_BAD_TARGET.
*/
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd,
- int tag)
+static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
{
SETUP_HOSTDATA(instance);
unsigned char tmp[3], phase;
@@ -2736,7 +2727,7 @@ static int NCR5380_abort(struct scsi_cmn
local_irq_restore(flags);
dprintk(NDEBUG_ABORT, "scsi%d: aborting disconnected command.\n", HOSTNO);
- if (NCR5380_select (instance, cmd, (int) cmd->tag))
+ if (NCR5380_select(instance, cmd))
return FAILED;
dprintk(NDEBUG_ABORT, "scsi%d: nexus reestablished.\n", HOSTNO);
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:16.000000000 +1100
@@ -1073,14 +1073,14 @@ static void NCR5380_main(struct work_str
hostdata->selecting = NULL;
/* RvC: have to preset this to indicate a new command is being performed */
- if (!NCR5380_select(instance, tmp,
- /*
- * REQUEST SENSE commands are issued without tagged
- * queueing, even on SCSI-II devices because the
- * contingent allegiance condition exists for the
- * entire unit.
- */
- (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) {
+ /*
+ * REQUEST SENSE commands are issued without tagged
+ * queueing, even on SCSI-II devices because the
+ * contingent allegiance condition exists for the
+ * entire unit.
+ */
+
+ if (!NCR5380_select(instance, tmp)) {
break;
} else {
LIST(tmp, hostdata->issue_queue);
@@ -1097,7 +1097,7 @@ static void NCR5380_main(struct work_str
if (hostdata->selecting) {
tmp = (Scsi_Cmnd *) hostdata->selecting;
/* Selection will drop and retake the lock */
- if (!NCR5380_select(instance, tmp, (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) {
+ if (!NCR5380_select(instance, tmp)) {
/* Ok ?? */
} else {
/* RvC: device failed, so we wait a long time
@@ -1246,17 +1246,14 @@ static void collect_stats(struct NCR5380
/*
- * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd,
- * int tag);
+ * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
*
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
* including ARBITRATION, SELECTION, and initial message out for
* IDENTIFY and queue messages.
*
* Inputs : instance - instantiation of the 5380 driver on which this
- * target lives, cmd - SCSI command to execute, tag - set to TAG_NEXT for
- * new tag, TAG_NONE for untagged queueing, otherwise set to the tag for
- * the command that is presently connected.
+ * target lives, cmd - SCSI command to execute.
*
* Returns : -1 if selection could not execute for some reason,
* 0 if selection succeeded or failed because the target
@@ -1278,7 +1275,7 @@ static void collect_stats(struct NCR5380
* Locks: caller holds hostdata lock in IRQ mode
*/
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag)
+static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd)
{
NCR5380_local_declare();
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
@@ -2774,7 +2771,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
if (cmd == tmp) {
dprintk(NDEBUG_ABORT, "scsi%d : aborting disconnected command.\n", instance->host_no);
- if (NCR5380_select(instance, cmd, (int) cmd->tag))
+ if (NCR5380_select(instance, cmd))
return FAILED;
dprintk(NDEBUG_ABORT, "scsi%d : nexus reestablished.\n", instance->host_no);
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:16.000000000 +1100
@@ -224,14 +224,11 @@
#define DISCONNECT_LONG 2
/*
- * These are "special" values for the tag parameter passed to NCR5380_select.
+ * "Special" value for the (unsigned char) command tag, to indicate
+ * I_T_L nexus instead of I_T_L_Q.
*/
-#define TAG_NEXT -1 /* Use next free tag */
-#define TAG_NONE -2 /*
- * Establish I_T_L nexus instead of I_T_L_Q
- * even on SCSI-II devices.
- */
+#define TAG_NONE 0xff
/*
* These are "special" values for the irq and dma_channel fields of the
@@ -323,7 +320,7 @@ static irqreturn_t NCR5380_intr(int irq,
static void NCR5380_main(struct work_struct *work);
static void __maybe_unused NCR5380_print_options(struct Scsi_Host *instance);
static void NCR5380_reselect(struct Scsi_Host *instance);
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag);
+static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd);
#if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
#endif
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (6 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 15:57 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 09/36] ncr5380: Remove duplicate comments Finn Thain
` (28 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-remove-AUTOSENSE-macro --]
[-- Type: text/plain, Size: 11874 bytes --]
Every NCR5380 driver sets AUTOSENSE so it need not be optional (and the
mid-layer expects it). Remove this redundant macro to improve readability.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.c | 14 +-------------
drivers/scsi/NCR5380.h | 5 -----
drivers/scsi/arm/cumana_1.c | 1 -
drivers/scsi/arm/oak.c | 1 -
drivers/scsi/atari_NCR5380.c | 15 +--------------
drivers/scsi/atari_scsi.c | 1 -
drivers/scsi/dmx3191d.c | 1 -
drivers/scsi/dtc.c | 4 ----
drivers/scsi/g_NCR5380.c | 2 --
drivers/scsi/mac_scsi.c | 2 --
drivers/scsi/pas16.c | 4 ----
drivers/scsi/sun3_NCR5380.c | 16 +---------------
drivers/scsi/sun3_scsi.c | 2 --
drivers/scsi/t128.c | 4 ----
14 files changed, 3 insertions(+), 69 deletions(-)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:16.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:17.000000000 +1100
@@ -627,9 +627,6 @@ NCR5380_print_options(struct Scsi_Host *
#ifdef AUTOPROBE_IRQ
" AUTOPROBE_IRQ"
#endif
-#ifdef AUTOSENSE
- " AUTOSENSE"
-#endif
#ifdef DIFFERENTIAL
" DIFFERENTIAL"
#endif
@@ -857,12 +854,6 @@ static int NCR5380_init(struct Scsi_Host
hostdata->host = instance;
hostdata->time_expires = 0;
-#ifndef AUTOSENSE
- if ((instance->cmd_per_lun > 1) || instance->can_queue > 1)
- printk(KERN_WARNING "scsi%d : WARNING : support for multiple outstanding commands enabled\n" " without AUTOSENSE option, contingent allegiance conditions may\n"
- " be incorrectly cleared.\n", instance->host_no);
-#endif /* def AUTOSENSE */
-
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
@@ -2260,7 +2251,6 @@ static void NCR5380_information_transfer
else if (status_byte(cmd->SCp.Status) != GOOD)
cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
-#ifdef AUTOSENSE
if ((cmd->cmnd[0] == REQUEST_SENSE) &&
hostdata->ses.cmd_len) {
scsi_eh_restore_cmnd(cmd, &hostdata->ses);
@@ -2277,9 +2267,7 @@ static void NCR5380_information_transfer
hostdata->issue_queue;
hostdata->issue_queue = (Scsi_Cmnd *) cmd;
dprintk(NDEBUG_QUEUES, "scsi%d : REQUEST SENSE added to head of issue queue\n", instance->host_no);
- } else
-#endif /* def AUTOSENSE */
- {
+ } else {
collect_stats(hostdata, cmd);
cmd->scsi_done(cmd);
}
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:16.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:17.000000000 +1100
@@ -25,10 +25,7 @@
#define NCR5380_H
#include <linux/interrupt.h>
-
-#ifdef AUTOSENSE
#include <scsi/scsi_eh.h>
-#endif
#define NCR5380_PUBLIC_RELEASE 7
#define NCR53C400_PUBLIC_RELEASE 2
@@ -281,9 +278,7 @@ struct NCR5380_hostdata {
unsigned pendingr;
unsigned pendingw;
#endif
-#ifdef AUTOSENSE
struct scsi_eh_save ses;
-#endif
};
#ifdef __KERNEL__
Index: linux/drivers/scsi/arm/cumana_1.c
===================================================================
--- linux.orig/drivers/scsi/arm/cumana_1.c 2014-10-27 16:18:00.000000000 +1100
+++ linux/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:17.000000000 +1100
@@ -18,7 +18,6 @@
#include <scsi/scsicam.h>
-#define AUTOSENSE
#define PSEUDO_DMA
#define CUMANASCSI_PUBLIC_RELEASE 1
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:17.000000000 +1100
@@ -17,7 +17,6 @@
#include "../scsi.h"
#include <scsi/scsi_host.h>
-#define AUTOSENSE
/*#define PSEUDO_DMA*/
#define OAKSCSI_PUBLIC_RELEASE 1
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:16.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
@@ -683,9 +683,6 @@ static inline void NCR5380_all_init(void
static void __init NCR5380_print_options(struct Scsi_Host *instance)
{
printk(" generic options"
-#ifdef AUTOSENSE
- " AUTOSENSE"
-#endif
#ifdef REAL_DMA
" REAL DMA"
#endif
@@ -842,13 +839,6 @@ static int __init NCR5380_init(struct Sc
first_instance = instance;
}
-#ifndef AUTOSENSE
- if ((instance->cmd_per_lun > 1) || (instance->can_queue > 1))
- printk("scsi%d: WARNING : support for multiple outstanding commands enabled\n"
- " without AUTOSENSE option, contingent allegiance conditions may\n"
- " be incorrectly cleared.\n", HOSTNO);
-#endif /* def AUTOSENSE */
-
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
@@ -2199,7 +2189,6 @@ static void NCR5380_information_transfer
else if (status_byte(cmd->SCp.Status) != GOOD)
cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
-#ifdef AUTOSENSE
if ((cmd->cmnd[0] == REQUEST_SENSE) &&
hostdata->ses.cmd_len) {
scsi_eh_restore_cmnd(cmd, &hostdata->ses);
@@ -2219,9 +2208,7 @@ static void NCR5380_information_transfer
local_irq_restore(flags);
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
- } else
-#endif /* def AUTOSENSE */
- {
+ } else {
#ifdef NCR5380_STATS
collect_stats(hostdata, cmd);
#endif
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:17.000000000 +1100
@@ -67,7 +67,6 @@
#include <linux/module.h>
-#define AUTOSENSE
/* For the Atari version, use only polled IO or REAL_DMA */
#define REAL_DMA
/* Support tagged queuing? (on devices that are able to... :-) */
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:25:07.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:17.000000000 +1100
@@ -33,7 +33,6 @@
/*
* Definitions for the generic 5380 driver.
*/
-#define AUTOSENSE
#define NCR5380_read(reg) inb(port + reg)
#define NCR5380_write(reg, value) outb(value, port + reg)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:17.000000000 +1100
@@ -1,5 +1,4 @@
-#define AUTOSENSE
#define PSEUDO_DMA
#define DONT_USE_INTR
#define UNSAFE /* Leave interrupts enabled during pseudo-dma I/O */
@@ -30,9 +29,6 @@
/*
* Options :
- * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
- * for commands that return with a CHECK CONDITION status.
- *
* PSEUDO_DMA - enables PSEUDO-DMA hardware, should give a 3-4X performance
* increase compared to polled I/O.
*
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
@@ -80,8 +80,6 @@
#define USLEEP_WAITLONG 500
#define AUTOPROBE_IRQ
-#define AUTOSENSE
-
#ifdef CONFIG_SCSI_GENERIC_NCR53C400
#define NCR53C400_PSEUDO_DMA 1
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:17.000000000 +1100
@@ -48,8 +48,6 @@
#include <scsi/scsi_host.h>
#include "mac_scsi.h"
-/* These control the behaviour of the generic 5380 core */
-#define AUTOSENSE
#define PSEUDO_DMA
#include "NCR5380.h"
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:17.000000000 +1100
@@ -1,4 +1,3 @@
-#define AUTOSENSE
#define PSEUDO_DMA
#define UNSAFE /* Not unsafe for PAS16 -- use it */
#define PDEBUG 0
@@ -39,9 +38,6 @@
/*
* Options :
- * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
- * for commands that return with a CHECK CONDITION status.
- *
* LIMIT_TRANSFERSIZE - if defined, limit the pseudo-dma transfers to 512
* bytes at a time. Since interrupts are disabled by default during
* these transfers, we might need this to give reasonable interrupt
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:16.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
@@ -629,9 +629,6 @@ static inline void NCR5380_all_init (voi
static void __init NCR5380_print_options (struct Scsi_Host *instance)
{
printk(" generic options"
-#ifdef AUTOSENSE
- " AUTOSENSE"
-#endif
#ifdef REAL_DMA
" REAL DMA"
#endif
@@ -788,14 +785,6 @@ static int __init NCR5380_init(struct Sc
first_instance = instance;
}
-
-#ifndef AUTOSENSE
- if ((instance->cmd_per_lun > 1) || (instance->can_queue > 1))
- printk("scsi%d: WARNING : support for multiple outstanding commands enabled\n"
- " without AUTOSENSE option, contingent allegiance conditions may\n"
- " be incorrectly cleared.\n", HOSTNO);
-#endif /* def AUTOSENSE */
-
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
@@ -2161,7 +2150,6 @@ static void NCR5380_information_transfer
else if (status_byte(cmd->SCp.Status) != GOOD)
cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
-#ifdef AUTOSENSE
if ((cmd->cmnd[0] == REQUEST_SENSE) &&
hostdata->ses.cmd_len) {
scsi_eh_restore_cmnd(cmd, &hostdata->ses);
@@ -2185,9 +2173,7 @@ static void NCR5380_information_transfer
local_irq_restore(flags);
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
- } else
-#endif /* def AUTOSENSE */
- {
+ } else {
#ifdef NCR5380_STATS
collect_stats(hostdata, cmd);
#endif
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:17.000000000 +1100
@@ -45,8 +45,6 @@
* PARITY - enable parity checking. Not supported.
*/
-#define AUTOSENSE
-
#include <linux/types.h>
#include <linux/stddef.h>
#include <linux/ctype.h>
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:14.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:17.000000000 +1100
@@ -1,4 +1,3 @@
-#define AUTOSENSE
#define PSEUDO_DMA
/*
@@ -40,9 +39,6 @@
/*
* Options :
- * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
- * for commands that return with a CHECK CONDITION status.
- *
* PSEUDO_DMA - enables PSEUDO-DMA hardware, should give a 3-4X performance
* increase compared to polled I/O.
*
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 09/36] ncr5380: Remove duplicate comments
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (7 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 15:59 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs Finn Thain
` (27 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-duplicate-comments --]
[-- Type: text/plain, Size: 10547 bytes --]
The LIMIT_TRANSFERSIZE, PSEUDO_DMA, PARITY and UNSAFE options are all
documented in the core drivers where they are used. The same goes for the
chip databook reference. Remove the duplicate comments.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/dtc.c | 17 +----------------
drivers/scsi/dtc.h | 16 ----------------
drivers/scsi/g_NCR5380.c | 16 ----------------
drivers/scsi/g_NCR5380.h | 12 ------------
drivers/scsi/mac_scsi.c | 12 ------------
drivers/scsi/mac_scsi.h | 12 ------------
drivers/scsi/pas16.c | 31 -------------------------------
drivers/scsi/pas16.h | 12 ------------
drivers/scsi/sun3_scsi.c | 21 ---------------------
drivers/scsi/sun3_scsi.h | 12 ------------
drivers/scsi/t128.c | 23 -----------------------
drivers/scsi/t128.h | 12 ------------
12 files changed, 1 insertion(+), 195 deletions(-)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:20.000000000 +1100
@@ -19,24 +19,9 @@
* +1 (303) 440-4894
*
* DISTRIBUTION RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
-*/
+ */
/*
- * Options :
- * PSEUDO_DMA - enables PSEUDO-DMA hardware, should give a 3-4X performance
- * increase compared to polled I/O.
- *
- * PARITY - enable parity checking. Not supported.
- *
- * UNSAFE - leave interrupts enabled during pseudo-DMA transfers.
- * You probably want this.
- *
* The card is detected and initialized in one of several ways :
* 1. Autoprobe (default) - since the board is memory mapped,
* a BIOS signature is scanned for to locate the registers.
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:20.000000000 +1100
@@ -20,18 +20,6 @@
* Thomas Sailer, sailer@ife.ee.ethz.ch
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
/*
@@ -40,10 +28,6 @@
*/
/*
- * Options :
- *
- * PARITY - enable parity checking. Not supported.
- *
* The card is detected and initialized in one of several ways :
* 1. With command line overrides - NCR5380=port,irq may be
* used on the LILO command line to override the defaults.
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:20.000000000 +1100
@@ -22,40 +22,9 @@
* Media Vision
* (510) 770-8600
* (800) 348-7116
- *
- * and
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
/*
- * Options :
- * LIMIT_TRANSFERSIZE - if defined, limit the pseudo-dma transfers to 512
- * bytes at a time. Since interrupts are disabled by default during
- * these transfers, we might need this to give reasonable interrupt
- * service time if the transfer size gets too large.
- *
- * PSEUDO_DMA - enables PSEUDO-DMA hardware, should give a 3-4X performance
- * increase compared to polled I/O.
- *
- * PARITY - enable parity checking. Not supported.
- *
- * UNSAFE - leave interrupts enabled during pseudo-DMA transfers. This
- * parameter comes from the NCR5380 code. It is NOT unsafe with
- * the PAS16 and you should use it. If you don't you will have
- * a problem with dropped characters during high speed
- * communications during SCSI transfers. If you really don't
- * want to use UNSAFE you can try defining LIMIT_TRANSFERSIZE or
- * twiddle with the transfer size in the high level code.
- *
* The card is detected and initialized in one of several ways :
* 1. Autoprobe (default) - There are many different models of
* the Pro Audio Spectrum/Studio 16, and I only have one of
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:20.000000000 +1100
@@ -22,27 +22,6 @@
* Copyright 1995, Russell King
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
- */
-
-
-/*
- * This is from mac_scsi.h, but hey, maybe this is useful for Sun3 too! :)
- *
- * Options :
- *
- * PARITY - enable parity checking. Not supported.
*/
#include <linux/types.h>
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:20.000000000 +1100
@@ -23,32 +23,9 @@
* 5415 Randall Place
* Fremont, CA 94538
* 1+ (415) 770-1400, FAX 1+ (415) 770-9910
- *
- * and
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
/*
- * Options :
- * PSEUDO_DMA - enables PSEUDO-DMA hardware, should give a 3-4X performance
- * increase compared to polled I/O.
- *
- * PARITY - enable parity checking. Not supported.
- *
- * UNSAFE - leave interrupts enabled during pseudo-DMA transfers. You
- * only really want to use this if you're having a problem with
- * dropped characters during high speed communications, and even
- * then, you're going to be better off twiddling with transfersize.
- *
* The card is detected and initialized in one of several ways :
* 1. Autoprobe (default) - since the board is memory mapped,
* a BIOS signature is scanned for to locate the registers.
Index: linux/drivers/scsi/dtc.h
===================================================================
--- linux.orig/drivers/scsi/dtc.h 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/dtc.h 2014-10-27 16:25:20.000000000 +1100
@@ -7,22 +7,6 @@
* +1 (303) 440-4894
*
* DISTRIBUTION RELEASE 2.
- *
- * For more information, please consult
- *
- *
- *
- * and
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#ifndef DTC3280_H
Index: linux/drivers/scsi/g_NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:20.000000000 +1100
@@ -11,18 +11,6 @@
* K.Lentin@cs.monash.edu.au
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#ifndef GENERIC_NCR5380_H
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:20.000000000 +1100
@@ -11,18 +11,6 @@
* Copyright 1995, Russell King
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#include <linux/types.h>
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:25:07.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.h 2014-10-27 16:25:20.000000000 +1100
@@ -8,18 +8,6 @@
* +1 (303) 440-4894
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#ifndef MAC_NCR5380_H
Index: linux/drivers/scsi/pas16.h
===================================================================
--- linux.orig/drivers/scsi/pas16.h 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/pas16.h 2014-10-27 16:25:20.000000000 +1100
@@ -18,18 +18,6 @@
* Media Vision
* (510) 770-8600
* (800) 348-7116
- *
- * and
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:20.000000000 +1100
@@ -15,18 +15,6 @@
* +1 (303) 440-4894
*
* ALPHA RELEASE 1.
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#ifndef SUN3_SCSI_H
Index: linux/drivers/scsi/t128.h
===================================================================
--- linux.orig/drivers/scsi/t128.h 2014-10-27 16:25:12.000000000 +1100
+++ linux/drivers/scsi/t128.h 2014-10-27 16:25:20.000000000 +1100
@@ -20,18 +20,6 @@
* 5415 Randall Place
* Fremont, CA 94538
* 1+ (415) 770-1400, FAX 1+ (415) 770-9910
- *
- * and
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
*/
#ifndef T128_H
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (8 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 09/36] ncr5380: Remove duplicate comments Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 16:07 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS Finn Thain
` (26 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-SCSI_IRQ_NONE-fixes --]
[-- Type: text/plain, Size: 17264 bytes --]
Oak scsi doesn't use any IRQ, but it sets irq = IRQ_NONE rather than
SCSI_IRQ_NONE. Problem is, the core NCR5380 driver expects SCSI_IRQ_NONE
if it is to issue IDENTIFY commands that prevent target disconnection.
And, as Geert points out, IRQ_NONE is part of enum irqreturn.
Other drivers, when they can't get an IRQ or can't use one, will set
host->irq = SCSI_IRQ_NONE (that is, 255). But when they exit they will
attempt to free IRQ 255 which was never requested.
Fix these bugs by using NO_IRQ in place of SCSI_IRQ_NONE and IRQ_NONE.
That means IRQ 0 is no longer probed by ISA drivers but I don't think
this matters.
Setting IRQ = 255 for these ISA drivers is understood to mean no IRQ.
This remains supported so as to avoid breaking existing ISA setups (which
can be difficult to get working) and because existing documentation
(SANE, TLDP etc) describes this usage for the ISA NCR5380 driver options.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Define NO_IRQ macro and use that instead of IRQ_NONE.
---
drivers/scsi/NCR5380.c | 12 ++++++------
drivers/scsi/NCR5380.h | 5 ++++-
drivers/scsi/arm/oak.c | 2 +-
drivers/scsi/dmx3191d.c | 7 ++++---
drivers/scsi/dtc.c | 22 +++++++++++++---------
drivers/scsi/g_NCR5380.c | 18 +++++++++++-------
drivers/scsi/mac_scsi.c | 8 ++++----
drivers/scsi/pas16.c | 20 +++++++++++---------
drivers/scsi/sun3_scsi.c | 6 +++---
drivers/scsi/t128.c | 14 +++++++++-----
10 files changed, 66 insertions(+), 48 deletions(-)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:22.000000000 +1100
@@ -254,31 +254,35 @@ found:
else
instance->irq = NCR5380_probe_irq(instance, DTC_IRQS);
+ /* Compatibility with documented NCR5380 kernel parameters */
+ if (instance->irq == 255)
+ instance->irq = NO_IRQ;
+
#ifndef DONT_USE_INTR
/* With interrupts enabled, it will sometimes hang when doing heavy
* reads. So better not enable them until I finger it out. */
- if (instance->irq != SCSI_IRQ_NONE)
+ if (instance->irq != NO_IRQ)
if (request_irq(instance->irq, dtc_intr, 0,
"dtc", instance)) {
printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
}
- if (instance->irq == SCSI_IRQ_NONE) {
+ if (instance->irq == NO_IRQ) {
printk(KERN_WARNING "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
printk(KERN_WARNING "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
}
#else
- if (instance->irq != SCSI_IRQ_NONE)
+ if (instance->irq != NO_IRQ)
printk(KERN_WARNING "scsi%d : interrupts not used. Might as well not jumper it.\n", instance->host_no);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
#endif
#if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT)
printk("scsi%d : irq = %d\n", instance->host_no, instance->irq);
#endif
printk(KERN_INFO "scsi%d : at 0x%05X", instance->host_no, (int) instance->base);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk(" interrupts disabled");
else
printk(" irq %d", instance->irq);
@@ -350,7 +354,7 @@ static inline int NCR5380_pread(struct S
i = 0;
NCR5380_read(RESET_PARITY_INTERRUPT_REG);
NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ);
else
NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE);
@@ -401,7 +405,7 @@ static inline int NCR5380_pwrite(struct
NCR5380_read(RESET_PARITY_INTERRUPT_REG);
NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE);
/* set direction (write) */
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
NCR5380_write(DTC_CONTROL_REG, 0);
else
NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR);
@@ -440,7 +444,7 @@ static int dtc_release(struct Scsi_Host
{
NCR5380_local_declare();
NCR5380_setup(shost);
- if (shost->irq)
+ if (shost->irq != NO_IRQ)
free_irq(shost->irq, shost);
NCR5380_exit(shost);
if (shost->io_port && shost->n_io_port)
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:22.000000000 +1100
@@ -62,13 +62,11 @@
* If you have problems with your card not being recognized, use
* the LILO command line override. Try to get it recognized without
* interrupts. Ie, for a board at the default 0x388 base port,
- * boot: linux pas16=0x388,255
+ * boot: linux pas16=0x388,0
*
- * SCSI_IRQ_NONE (255) should be specified for no interrupt,
+ * NO_IRQ (0) should be specified for no interrupt,
* IRQ_AUTO (254) to autoprobe for an IRQ line if overridden
* on the command line.
- *
- * (IRQ_AUTO == 254, SCSI_IRQ_NONE == 255 in NCR5380.h)
*/
#include <linux/module.h>
@@ -416,15 +414,19 @@ static int __init pas16_detect(struct sc
else
instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS);
- if (instance->irq != SCSI_IRQ_NONE)
+ /* Compatibility with documented NCR5380 kernel parameters */
+ if (instance->irq == 255)
+ instance->irq = NO_IRQ;
+
+ if (instance->irq != NO_IRQ)
if (request_irq(instance->irq, pas16_intr, 0,
"pas16", instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
}
- if (instance->irq == SCSI_IRQ_NONE) {
+ if (instance->irq == NO_IRQ) {
printk("scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
printk("scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
/* Disable 5380 interrupts, leave drive params the same */
@@ -438,7 +440,7 @@ static int __init pas16_detect(struct sc
printk("scsi%d : at 0x%04x", instance->host_no, (int)
instance->io_port);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk (" interrupts disabled");
else
printk (" irq %d", instance->irq);
@@ -568,7 +570,7 @@ static inline int NCR5380_pwrite (struct
static int pas16_release(struct Scsi_Host *shost)
{
- if (shost->irq)
+ if (shost->irq != NO_IRQ)
free_irq(shost->irq, shost);
NCR5380_exit(shost);
if (shost->io_port && shost->n_io_port)
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:22.000000000 +1100
@@ -228,15 +228,19 @@ found:
else
instance->irq = NCR5380_probe_irq(instance, T128_IRQS);
- if (instance->irq != SCSI_IRQ_NONE)
+ /* Compatibility with documented NCR5380 kernel parameters */
+ if (instance->irq == 255)
+ instance->irq = NO_IRQ;
+
+ if (instance->irq != NO_IRQ)
if (request_irq(instance->irq, t128_intr, 0, "t128",
instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
}
- if (instance->irq == SCSI_IRQ_NONE) {
+ if (instance->irq == NO_IRQ) {
printk("scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
printk("scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
}
@@ -246,7 +250,7 @@ found:
#endif
printk("scsi%d : at 0x%08lx", instance->host_no, instance->base);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk (" interrupts disabled");
else
printk (" irq %d", instance->irq);
@@ -265,7 +269,7 @@ static int t128_release(struct Scsi_Host
{
NCR5380_local_declare();
NCR5380_setup(shost);
- if (shost->irq)
+ if (shost->irq != NO_IRQ)
free_irq(shost->irq, shost);
NCR5380_exit(shost);
if (shost->io_port && shost->n_io_port)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:22.000000000 +1100
@@ -574,12 +574,12 @@ static int __init __maybe_unused NCR5380
int trying_irqs, i, mask;
NCR5380_setup(instance);
- for (trying_irqs = i = 0, mask = 1; i < 16; ++i, mask <<= 1)
+ for (trying_irqs = 0, i = 1, mask = 2; i < 16; ++i, mask <<= 1)
if ((mask & possible) && (request_irq(i, &probe_intr, 0, "NCR-probe", NULL) == 0))
trying_irqs |= mask;
timeout = jiffies + (250 * HZ / 1000);
- probe_irq = SCSI_IRQ_NONE;
+ probe_irq = NO_IRQ;
/*
* A interrupt is triggered whenever BSY = false, SEL = true
@@ -596,13 +596,13 @@ static int __init __maybe_unused NCR5380
NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask);
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA | ICR_ASSERT_SEL);
- while (probe_irq == SCSI_IRQ_NONE && time_before(jiffies, timeout))
+ while (probe_irq == NO_IRQ && time_before(jiffies, timeout))
schedule_timeout_uninterruptible(1);
NCR5380_write(SELECT_ENABLE_REG, 0);
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- for (i = 0, mask = 1; i < 16; ++i, mask <<= 1)
+ for (i = 1, mask = 2; i < 16; ++i, mask <<= 1)
if (trying_irqs & mask)
free_irq(i, NULL);
@@ -730,7 +730,7 @@ static int __maybe_unused NCR5380_show_i
SPRINTF("\nBase Addr: 0x%05lX ", (long) instance->base);
SPRINTF("io_port: %04x ", (int) instance->io_port);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
SPRINTF("IRQ: None.\n");
else
SPRINTF("IRQ: %d.\n", instance->irq);
@@ -1501,7 +1501,7 @@ part2:
}
dprintk(NDEBUG_SELECTION, "scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->device->id);
- tmp[0] = IDENTIFY(((instance->irq == SCSI_IRQ_NONE) ? 0 : 1), cmd->device->lun);
+ tmp[0] = IDENTIFY(((instance->irq == NO_IRQ) ? 0 : 1), cmd->device->lun);
len = 1;
cmd->tag = 0;
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:22.000000000 +1100
@@ -232,12 +232,15 @@
* Scsi_Host structure
*/
-#define SCSI_IRQ_NONE 255
#define DMA_NONE 255
#define IRQ_AUTO 254
#define DMA_AUTO 254
#define PORT_AUTO 0xffff /* autoprobe io port for 53c400a */
+#ifndef NO_IRQ
+#define NO_IRQ 0
+#endif
+
#define FLAG_HAS_LAST_BYTE_SENT 1 /* NCR53c81 or better */
#define FLAG_CHECK_LAST_BYTE_SENT 2 /* Only test once */
#define FLAG_NCR53C400 4 /* NCR53c400 */
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:22.000000000 +1100
@@ -100,7 +100,7 @@ static int dmx3191d_probe_one(struct pci
*/
printk(KERN_WARNING "dmx3191: IRQ %d not available - "
"switching to polled mode.\n", pdev->irq);
- shost->irq = SCSI_IRQ_NONE;
+ shost->irq = NO_IRQ;
}
pci_set_drvdata(pdev, shost);
@@ -113,7 +113,8 @@ static int dmx3191d_probe_one(struct pci
return 0;
out_free_irq:
- free_irq(shost->irq, shost);
+ if (shost->irq != NO_IRQ)
+ free_irq(shost->irq, shost);
out_release_region:
release_region(io, DMX3191D_REGION_LEN);
out_disable_device:
@@ -130,7 +131,7 @@ static void dmx3191d_remove_one(struct p
NCR5380_exit(shost);
- if (shost->irq != SCSI_IRQ_NONE)
+ if (shost->irq != NO_IRQ)
free_irq(shost->irq, shost);
release_region(shost->io_port, DMX3191D_REGION_LEN);
pci_disable_device(pdev);
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:22.000000000 +1100
@@ -312,7 +312,7 @@ static int __init generic_NCR5380_detect
if (pnp_irq_valid(dev, 0))
overrides[count].irq = pnp_irq(dev, 0);
else
- overrides[count].irq = SCSI_IRQ_NONE;
+ overrides[count].irq = NO_IRQ;
if (pnp_dma_valid(dev, 0))
overrides[count].dma = pnp_dma(dev, 0);
else
@@ -432,20 +432,24 @@ static int __init generic_NCR5380_detect
else
instance->irq = NCR5380_probe_irq(instance, 0xffff);
- if (instance->irq != SCSI_IRQ_NONE)
+ /* Compatibility with documented NCR5380 kernel parameters */
+ if (instance->irq == 255)
+ instance->irq = NO_IRQ;
+
+ if (instance->irq != NO_IRQ)
if (request_irq(instance->irq, generic_NCR5380_intr,
0, "NCR5380", instance)) {
printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
}
- if (instance->irq == SCSI_IRQ_NONE) {
+ if (instance->irq == NO_IRQ) {
printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no);
printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
}
printk(KERN_INFO "scsi%d : at " STRVAL(NCR5380_map_name) " 0x%x", instance->host_no, (unsigned int) instance->NCR5380_instance_name);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk(" interrupts disabled");
else
printk(" irq %d", instance->irq);
@@ -486,7 +490,7 @@ static int generic_NCR5380_release_resou
NCR5380_local_declare();
NCR5380_setup(instance);
- if (instance->irq != SCSI_IRQ_NONE)
+ if (instance->irq != NO_IRQ)
free_irq(instance->irq, instance);
NCR5380_exit(instance);
@@ -796,7 +800,7 @@ static int generic_NCR5380_show_info(str
PRINTP("NO NCR53C400 driver extensions\n");
#endif
PRINTP("Using %s mapping at %s 0x%lx, " ANDP STRVAL(NCR5380_map_config) ANDP STRVAL(NCR5380_map_name) ANDP scsi_ptr->NCR5380_instance_name);
- if (scsi_ptr->irq == SCSI_IRQ_NONE)
+ if (scsi_ptr->irq == NO_IRQ)
PRINTP("no interrupt\n");
else
PRINTP("on interrupt %d\n" ANDP scsi_ptr->irq);
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:22.000000000 +1100
@@ -229,15 +229,15 @@ int __init macscsi_detect(struct scsi_ho
instance->n_io_port = 255;
- if (instance->irq != SCSI_IRQ_NONE)
+ if (instance->irq != NO_IRQ)
if (request_irq(instance->irq, NCR5380_intr, 0, "ncr5380", instance)) {
printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
}
printk(KERN_INFO "scsi%d: generic 5380 at port %lX irq", instance->host_no, instance->io_port);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk (KERN_INFO "s disabled");
else
printk (KERN_INFO " %d", instance->irq);
@@ -252,7 +252,7 @@ int __init macscsi_detect(struct scsi_ho
int macscsi_release (struct Scsi_Host *shpnt)
{
- if (shpnt->irq != SCSI_IRQ_NONE)
+ if (shpnt->irq != NO_IRQ)
free_irq(shpnt->irq, shpnt);
NCR5380_exit(shpnt);
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:22.000000000 +1100
@@ -278,7 +278,7 @@ static int __init sun3scsi_detect(struct
#ifndef REAL_DMA
printk("scsi%d: IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq);
- instance->irq = SCSI_IRQ_NONE;
+ instance->irq = NO_IRQ;
#else
printk("scsi%d: IRQ%d not free, bailing out\n",
instance->host_no, instance->irq);
@@ -288,7 +288,7 @@ static int __init sun3scsi_detect(struct
pr_info("scsi%d: %s at port %lX irq", instance->host_no,
tpnt->proc_name, instance->io_port);
- if (instance->irq == SCSI_IRQ_NONE)
+ if (instance->irq == NO_IRQ)
printk ("s disabled");
else
printk (" %d", instance->irq);
@@ -325,7 +325,7 @@ static int __init sun3scsi_detect(struct
static int sun3scsi_release(struct Scsi_Host *shpnt)
{
- if (shpnt->irq != SCSI_IRQ_NONE)
+ if (shpnt->irq != NO_IRQ)
free_irq(shpnt->irq, shpnt);
iounmap((void *)sun3_scsi_regp);
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:22.000000000 +1100
@@ -148,7 +148,7 @@ static int oakscsi_probe(struct expansio
goto unreg;
}
- host->irq = IRQ_NONE;
+ host->irq = NO_IRQ;
host->n_io_port = 255;
NCR5380_init(host, 0);
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (9 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 16:11 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 12/36] ncr5380: Cleanup host info() methods Finn Thain
` (25 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-NCR5380_STATS --]
[-- Type: text/plain, Size: 14693 bytes --]
The NCR5380_STATS option is only enabled by g_NCR5380 yet it adds
clutter to all three core drivers. The atari_NCR5380.c and sun3_NCR5380.c
core drivers have a slightly different implementation of the
NCR5380_STATS option.
Out of all ten NCR5380 drivers, only one of them (g_NCR5380) actually
has the code to report on the collected stats. Aside from being unreadable,
that code seems to be broken because there's no initialization of timebase.
sun3_NCR5380.c and atari_NCR5380.c have the timebase initialization but
lack the code to report the stats.
Remove all of this code to improve readability and reduce divergence
between the three core drivers.
This patch and the next one completely eliminate the PRINTP and ANDP
pre-processor abuse.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.c | 64 ---------------------------------------
drivers/scsi/NCR5380.h | 9 -----
drivers/scsi/atari_NCR5380.c | 65 ----------------------------------------
drivers/scsi/g_NCR5380.c | 45 ----------------------------
drivers/scsi/sun3_NCR5380.c | 69 -------------------------------------------
5 files changed, 252 deletions(-)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:24.000000000 +1100
@@ -833,18 +833,6 @@ static int NCR5380_init(struct Scsi_Host
INIT_DELAYED_WORK(&hostdata->coroutine, NCR5380_main);
-#ifdef NCR5380_STATS
- for (i = 0; i < 8; ++i) {
- hostdata->time_read[i] = 0;
- hostdata->time_write[i] = 0;
- hostdata->bytes_read[i] = 0;
- hostdata->bytes_write[i] = 0;
- }
- hostdata->timebase = 0;
- hostdata->pendingw = 0;
- hostdata->pendingr = 0;
-#endif
-
/* The CHECK code seems to break the 53C400. Will check it later maybe */
if (flags & FLAG_NCR53C400)
hostdata->flags = FLAG_HAS_LAST_BYTE_SENT | flags;
@@ -943,25 +931,6 @@ static int NCR5380_queue_command_lck(Scs
}
#endif /* (NDEBUG & NDEBUG_NO_WRITE) */
-#ifdef NCR5380_STATS
- switch (cmd->cmnd[0]) {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_write[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingw++;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_read[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingr++;
- break;
- }
-#endif
-
/*
* We use the host_scribble field as a pointer to the next command
* in a queue
@@ -1207,35 +1176,6 @@ static irqreturn_t NCR5380_intr(int dumm
#endif
-/**
- * collect_stats - collect stats on a scsi command
- * @hostdata: adapter
- * @cmd: command being issued
- *
- * Update the statistical data by parsing the command in question
- */
-
-static void collect_stats(struct NCR5380_hostdata *hostdata, Scsi_Cmnd * cmd)
-{
-#ifdef NCR5380_STATS
- switch (cmd->cmnd[0]) {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[scmd_id(cmd)] += (jiffies - hostdata->timebase);
- hostdata->pendingw--;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[scmd_id(cmd)] += (jiffies - hostdata->timebase);
- hostdata->pendingr--;
- break;
- }
-#endif
-}
-
-
/*
* Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
*
@@ -1464,7 +1404,6 @@ part2:
return -1;
}
cmd->result = DID_BAD_TARGET << 16;
- collect_stats(hostdata, cmd);
cmd->scsi_done(cmd);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
dprintk(NDEBUG_SELECTION, "scsi%d : target did not respond within 250ms\n", instance->host_no);
@@ -2216,7 +2155,6 @@ static void NCR5380_information_transfer
cmd->next_link->tag = cmd->tag;
cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
dprintk(NDEBUG_LINKED, "scsi%d : target %d lun %llu linked request done, calling scsi_done().\n", instance->host_no, cmd->device->id, cmd->device->lun);
- collect_stats(hostdata, cmd);
cmd->scsi_done(cmd);
cmd = hostdata->connected;
break;
@@ -2268,7 +2206,6 @@ static void NCR5380_information_transfer
hostdata->issue_queue = (Scsi_Cmnd *) cmd;
dprintk(NDEBUG_QUEUES, "scsi%d : REQUEST SENSE added to head of issue queue\n", instance->host_no);
} else {
- collect_stats(hostdata, cmd);
cmd->scsi_done(cmd);
}
@@ -2415,7 +2352,6 @@ static void NCR5380_information_transfer
hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xFF));
hostdata->connected = NULL;
cmd->result = DID_ERROR << 16;
- collect_stats(hostdata, cmd);
cmd->scsi_done(cmd);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
return;
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:24.000000000 +1100
@@ -272,15 +272,6 @@ struct NCR5380_hostdata {
int select_time; /* timer in select for target response */
volatile Scsi_Cmnd *selecting;
struct delayed_work coroutine; /* our co-routine */
-#ifdef NCR5380_STATS
- unsigned timebase; /* Base for time calcs */
- long time_read[8]; /* time to do reads */
- long time_write[8]; /* time to do writes */
- unsigned long bytes_read[8]; /* bytes read */
- unsigned long bytes_write[8]; /* bytes written */
- unsigned pendingr;
- unsigned pendingw;
-#endif
struct scsi_eh_save ses;
};
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
@@ -888,34 +888,6 @@ static int NCR5380_queue_command_lck(Scs
}
#endif /* (NDEBUG & NDEBUG_NO_WRITE) */
-#ifdef NCR5380_STATS
-# if 0
- if (!hostdata->connected && !hostdata->issue_queue &&
- !hostdata->disconnected_queue) {
- hostdata->timebase = jiffies;
- }
-# endif
-# ifdef NCR5380_STAT_LIMIT
- if (scsi_bufflen(cmd) > NCR5380_STAT_LIMIT)
-# endif
- switch (cmd->cmnd[0]) {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_write[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingw++;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_read[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingr++;
- break;
- }
-#endif
-
/*
* We use the host_scribble field as a pointer to the next command
* in a queue
@@ -1309,31 +1281,6 @@ static irqreturn_t NCR5380_intr(int irq,
return IRQ_RETVAL(handled);
}
-#ifdef NCR5380_STATS
-static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd *cmd)
-{
-# ifdef NCR5380_STAT_LIMIT
- if (scsi_bufflen(cmd) > NCR5380_STAT_LIMIT)
-# endif
- switch (cmd->cmnd[0]) {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[cmd->device->id] += (jiffies - hostdata->timebase);
- /*hostdata->bytes_write[cmd->device->id] += scsi_bufflen(cmd);*/
- hostdata->pendingw--;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[cmd->device->id] += (jiffies - hostdata->timebase);
- /*hostdata->bytes_read[cmd->device->id] += scsi_bufflen(cmd);*/
- hostdata->pendingr--;
- break;
- }
-}
-#endif
-
/*
* Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
*
@@ -1598,9 +1545,6 @@ static int NCR5380_select(struct Scsi_Ho
return -1;
}
cmd->result = DID_BAD_TARGET << 16;
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
#ifdef SUPPORT_TAGS
cmd_free_tag(cmd);
#endif
@@ -2127,9 +2071,6 @@ static void NCR5380_information_transfer
dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %llu linked request "
"done, calling scsi_done().\n",
HOSTNO, cmd->device->id, cmd->device->lun);
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
cmd = hostdata->connected;
break;
@@ -2209,9 +2150,6 @@ static void NCR5380_information_transfer
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
} else {
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
}
@@ -2396,9 +2334,6 @@ static void NCR5380_information_transfer
#endif
hostdata->connected = NULL;
cmd->result = DID_ERROR << 16;
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
falcon_release_lock_if_possible(hostdata);
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
@@ -69,8 +69,6 @@
#define NCR53C400_PSEUDO_DMA 1
#define PSEUDO_DMA
#define NCR53C400
-#define NCR5380_STATS
-#undef NCR5380_STAT_LIMIT
#endif
#include <asm/io.h>
@@ -779,9 +777,6 @@ static int generic_NCR5380_show_info(str
int i;
Scsi_Cmnd *ptr;
struct NCR5380_hostdata *hostdata;
-#ifdef NCR5380_STATS
- struct scsi_device *dev;
-#endif
NCR5380_setup(scsi_ptr);
hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata;
@@ -805,46 +800,6 @@ static int generic_NCR5380_show_info(str
else
PRINTP("on interrupt %d\n" ANDP scsi_ptr->irq);
-#ifdef NCR5380_STATS
- if (hostdata->connected || hostdata->issue_queue || hostdata->disconnected_queue)
- PRINTP("There are commands pending, transfer rates may be crud\n");
- if (hostdata->pendingr)
- PRINTP(" %d pending reads" ANDP hostdata->pendingr);
- if (hostdata->pendingw)
- PRINTP(" %d pending writes" ANDP hostdata->pendingw);
- if (hostdata->pendingr || hostdata->pendingw)
- PRINTP("\n");
- shost_for_each_device(dev, scsi_ptr) {
- unsigned long br = hostdata->bytes_read[dev->id];
- unsigned long bw = hostdata->bytes_write[dev->id];
- long tr = hostdata->time_read[dev->id] / HZ;
- long tw = hostdata->time_write[dev->id] / HZ;
-
- PRINTP(" T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type));
- for (i = 0; i < 8; i++)
- if (dev->vendor[i] >= 0x20)
- seq_putc(m, dev->vendor[i]);
- seq_putc(m, ' ');
- for (i = 0; i < 16; i++)
- if (dev->model[i] >= 0x20)
- seq_putc(m, dev->model[i]);
- seq_putc(m, ' ');
- for (i = 0; i < 4; i++)
- if (dev->rev[i] >= 0x20)
- seq_putc(m, dev->rev[i]);
- seq_putc(m, ' ');
-
- PRINTP("\n%10ld kb read in %5ld secs" ANDP br / 1024 ANDP tr);
- if (tr)
- PRINTP(" @ %5ld bps" ANDP br / tr);
-
- PRINTP("\n%10ld kb written in %5ld secs" ANDP bw / 1024 ANDP tw);
- if (tw)
- PRINTP(" @ %5ld bps" ANDP bw / tw);
- PRINTP("\n");
- }
-#endif
-
status = NCR5380_read(STATUS_REG);
if (!(status & SR_REQ))
PRINTP("REQ not asserted, phase unknown.\n");
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
@@ -836,36 +836,6 @@ static int NCR5380_queue_command_lck(str
}
#endif /* (NDEBUG & NDEBUG_NO_WRITE) */
-
-#ifdef NCR5380_STATS
-# if 0
- if (!hostdata->connected && !hostdata->issue_queue &&
- !hostdata->disconnected_queue) {
- hostdata->timebase = jiffies;
- }
-# endif
-# ifdef NCR5380_STAT_LIMIT
- if (scsi_bufflen(cmd) > NCR5380_STAT_LIMIT)
-# endif
- switch (cmd->cmnd[0])
- {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_write[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingw++;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[cmd->device->id] -= (jiffies - hostdata->timebase);
- hostdata->bytes_read[cmd->device->id] += scsi_bufflen(cmd);
- hostdata->pendingr++;
- break;
- }
-#endif
-
/*
* We use the host_scribble field as a pointer to the next command
* in a queue
@@ -1246,33 +1216,6 @@ static irqreturn_t NCR5380_intr (int irq
return IRQ_RETVAL(handled);
}
-#ifdef NCR5380_STATS
-static void collect_stats(struct NCR5380_hostdata *hostdata,
- struct scsi_cmnd *cmd)
-{
-# ifdef NCR5380_STAT_LIMIT
- if (scsi_bufflen(cmd) > NCR5380_STAT_LIMIT)
-# endif
- switch (cmd->cmnd[0])
- {
- case WRITE:
- case WRITE_6:
- case WRITE_10:
- hostdata->time_write[cmd->device->id] += (jiffies - hostdata->timebase);
- /*hostdata->bytes_write[cmd->device->id] += scsi_bufflen(cmd);*/
- hostdata->pendingw--;
- break;
- case READ:
- case READ_6:
- case READ_10:
- hostdata->time_read[cmd->device->id] += (jiffies - hostdata->timebase);
- /*hostdata->bytes_read[cmd->device->id] += scsi_bufflen(cmd);*/
- hostdata->pendingr--;
- break;
- }
-}
-#endif
-
/*
* Function : int NCR5380_select(struct Scsi_Host *instance,
* struct scsi_cmnd *cmd)
@@ -1538,9 +1481,6 @@ static int NCR5380_select(struct Scsi_Ho
return -1;
}
cmd->result = DID_BAD_TARGET << 16;
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
#ifdef SUPPORT_TAGS
cmd_free_tag( cmd );
#endif
@@ -2090,9 +2030,6 @@ static void NCR5380_information_transfer
dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %llu linked request "
"done, calling scsi_done().\n",
HOSTNO, cmd->device->id, cmd->device->lun);
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
cmd = hostdata->connected;
break;
@@ -2174,9 +2111,6 @@ static void NCR5380_information_transfer
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
} else {
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
}
@@ -2359,9 +2293,6 @@ static void NCR5380_information_transfer
#endif
hostdata->connected = NULL;
cmd->result = DID_ERROR << 16;
-#ifdef NCR5380_STATS
- collect_stats(hostdata, cmd);
-#endif
cmd->scsi_done(cmd);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
return;
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 12/36] ncr5380: Cleanup host info() methods
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (10 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-29 16:17 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data Finn Thain
` (24 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-info-methods --]
[-- Type: text/plain, Size: 32165 bytes --]
If the host->info() method is not set, then host->name is used by default.
For atari_scsi, that is exactly the same text. So remove the redundant
info() method. Keep sun3_scsi.c in line with atari_scsi.
Some NCR5380 drivers return an empty string from the info() method
(arm/cumana_1.c arm/oak.c mac_scsi.c) while other drivers use the default
(dmx3191d dtc.c g_NCR5380.c pas16.c t128.c).
Implement a common info() method to replace a lot of duplicated code which
the various drivers use to announce the same information.
This replaces most of the (deprecated) show_info() output and all of the
NCR5380_print_info() output. This also eliminates a bunch of code in
g_NCR5380 which just duplicates functionality in the core driver.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Dropped explicit NULL termination of snprintf() buffers.
---
drivers/scsi/NCR5380.c | 74 ++++++++++++++---------
drivers/scsi/NCR5380.h | 3
drivers/scsi/arm/cumana_1.c | 14 ----
drivers/scsi/arm/oak.c | 14 ----
drivers/scsi/atari_NCR5380.c | 57 +++++++++++-------
drivers/scsi/atari_scsi.c | 24 -------
drivers/scsi/atari_scsi.h | 1
drivers/scsi/dmx3191d.c | 1
drivers/scsi/dtc.c | 10 ---
drivers/scsi/dtc.h | 1
drivers/scsi/g_NCR5380.c | 135 -------------------------------------------
drivers/scsi/g_NCR5380.h | 2
drivers/scsi/mac_scsi.c | 14 ----
drivers/scsi/mac_scsi.h | 1
drivers/scsi/pas16.c | 12 ---
drivers/scsi/pas16.h | 1
drivers/scsi/sun3_NCR5380.c | 59 +++++++++++-------
drivers/scsi/sun3_scsi.c | 18 -----
drivers/scsi/sun3_scsi.h | 1
drivers/scsi/t128.c | 11 ---
drivers/scsi/t128.h | 1
21 files changed, 134 insertions(+), 320 deletions(-)
Index: linux/drivers/scsi/arm/cumana_1.c
===================================================================
--- linux.orig/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:26.000000000 +1100
@@ -29,6 +29,7 @@
#define NCR5380_write(reg, value) cumanascsi_write(_instance, reg, value)
#define NCR5380_intr cumanascsi_intr
#define NCR5380_queue_command cumanascsi_queue_command
+#define NCR5380_info cumanascsi_info
#define NCR5380_implementation_fields \
unsigned ctrl; \
@@ -41,11 +42,6 @@ void cumanascsi_setup(char *str, int *in
{
}
-const char *cumanascsi_info(struct Scsi_Host *spnt)
-{
- return "";
-}
-
#define CTRL 0x16fc
#define STAT 0x2004
#define L(v) (((v)<<16)|((v) & 0x0000ffff))
@@ -266,14 +262,6 @@ static int cumanascsi1_probe(struct expa
goto out_unmap;
}
- printk("scsi%d: at port 0x%08lx irq %d",
- host->host_no, host->io_port, host->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- host->can_queue, host->cmd_per_lun, CUMANASCSI_PUBLIC_RELEASE);
- printk("\nscsi%d:", host->host_no);
- NCR5380_print_options(host);
- printk("\n");
-
ret = scsi_add_host(host, &ec->dev);
if (ret)
goto out_free_irq;
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:26.000000000 +1100
@@ -29,6 +29,7 @@
#define NCR5380_read(reg) readb(_base + ((reg) << 2))
#define NCR5380_write(reg, value) writeb(value, _base + ((reg) << 2))
#define NCR5380_queue_command oakscsi_queue_command
+#define NCR5380_info oakscsi_info
#define NCR5380_show_info oakscsi_show_info
#define NCR5380_write_info oakscsi_write_info
@@ -40,11 +41,6 @@
#undef START_DMA_INITIATOR_RECEIVE_REG
#define START_DMA_INITIATOR_RECEIVE_REG (128 + 7)
-const char * oakscsi_info (struct Scsi_Host *spnt)
-{
- return "";
-}
-
#define STAT ((128 + 16) << 2)
#define DATA ((128 + 8) << 2)
@@ -153,14 +149,6 @@ static int oakscsi_probe(struct expansio
NCR5380_init(host, 0);
- printk("scsi%d: at port 0x%08lx irqs disabled",
- host->host_no, host->io_port);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- host->can_queue, host->cmd_per_lun, OAKSCSI_PUBLIC_RELEASE);
- printk("\nscsi%d:", host->host_no);
- NCR5380_print_options(host);
- printk("\n");
-
ret = scsi_add_host(host, &ec->dev);
if (ret)
goto out_unmap;
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:17.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:26.000000000 +1100
@@ -699,21 +699,6 @@ static int __init atari_scsi_detect(stru
#endif
}
- printk(KERN_INFO "scsi%d: options CAN_QUEUE=%d CMD_PER_LUN=%d SCAT-GAT=%d "
-#ifdef SUPPORT_TAGS
- "TAGGED-QUEUING=%s "
-#endif
- "HOSTID=%d",
- instance->host_no, instance->hostt->can_queue,
- instance->hostt->cmd_per_lun,
- instance->hostt->sg_tablesize,
-#ifdef SUPPORT_TAGS
- setup_use_tagged_queuing ? "yes" : "no",
-#endif
- instance->hostt->this_id );
- NCR5380_print_options(instance);
- printk("\n");
-
called = 1;
return 1;
}
@@ -815,15 +800,6 @@ static void __init atari_scsi_reset_boot
}
#endif
-
-static const char *atari_scsi_info(struct Scsi_Host *host)
-{
- /* atari_scsi_detect() is verbose enough... */
- static const char string[] = "Atari native SCSI";
- return string;
-}
-
-
#if defined(REAL_DMA)
static unsigned long atari_scsi_dma_setup(struct Scsi_Host *instance,
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:26.000000000 +1100
@@ -236,16 +236,6 @@ int __init macscsi_detect(struct scsi_ho
instance->irq = NO_IRQ;
}
- printk(KERN_INFO "scsi%d: generic 5380 at port %lX irq", instance->host_no, instance->io_port);
- if (instance->irq == NO_IRQ)
- printk (KERN_INFO "s disabled");
- else
- printk (KERN_INFO " %d", instance->irq);
- printk(KERN_INFO " options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- instance->can_queue, instance->cmd_per_lun, MACSCSI_PUBLIC_RELEASE);
- printk(KERN_INFO "\nscsi%d:", instance->host_no);
- NCR5380_print_options(instance);
- printk("\n");
called = 1;
return 1;
}
@@ -297,10 +287,6 @@ static void mac_scsi_reset_boot(struct S
}
#endif
-const char * macscsi_info (struct Scsi_Host *spnt) {
- return "";
-}
-
/*
Pseudo-DMA: (Ove Edlund)
The code attempts to catch bus errors that occur if one for example
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:26.000000000 +1100
@@ -286,19 +286,6 @@ static int __init sun3scsi_detect(struct
#endif
}
- pr_info("scsi%d: %s at port %lX irq", instance->host_no,
- tpnt->proc_name, instance->io_port);
- if (instance->irq == NO_IRQ)
- printk ("s disabled");
- else
- printk (" %d", instance->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- instance->can_queue, instance->cmd_per_lun,
- SUN3SCSI_PUBLIC_RELEASE);
- printk("\nscsi%d:", instance->host_no);
- NCR5380_print_options(instance);
- printk("\n");
-
dregs->csr = 0;
udelay(SUN3_DMA_DELAY);
dregs->csr = CSR_SCSI | CSR_FIFO | CSR_INTR;
@@ -380,11 +367,6 @@ static void sun3_scsi_reset_boot(struct
}
#endif
-static const char *sun3scsi_info(struct Scsi_Host *spnt)
-{
- return "";
-}
-
// safe bits for the CSR
#define CSR_GOOD 0x060f
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:24.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:26.000000000 +1100
@@ -610,47 +610,70 @@ static int __init __maybe_unused NCR5380
}
/**
- * NCR58380_print_options - show options
- * @instance: unused for now
+ * NCR58380_info - report driver and host information
+ * @instance: relevant scsi host instance
*
- * Called by probe code indicating the NCR5380 driver options that
- * were selected. At some point this will switch to runtime options
- * read from the adapter in question
+ * For use as the host template info() handler.
*
* Locks: none
*/
-static void __init __maybe_unused
-NCR5380_print_options(struct Scsi_Host *instance)
+static const char *NCR5380_info(struct Scsi_Host *instance)
{
- printk(" generic options"
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ return hostdata->info;
+}
+
+static void prepare_info(struct Scsi_Host *instance)
+{
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ snprintf(hostdata->info, sizeof(hostdata->info),
+ "%s, io_port 0x%lx, n_io_port %d, "
+ "base 0x%lx, irq %d, "
+ "can_queue %d, cmd_per_lun %d, "
+ "sg_tablesize %d, this_id %d, "
+ "flags { %s%s%s}, "
+#if defined(USLEEP_POLL) && defined(USLEEP_WAITLONG)
+ "USLEEP_POLL %d, USLEEP_WAITLONG %d, "
+#endif
+ "options { %s} ",
+ instance->hostt->name, instance->io_port, instance->n_io_port,
+ instance->base, instance->irq,
+ instance->can_queue, instance->cmd_per_lun,
+ instance->sg_tablesize, instance->this_id,
+ hostdata->flags & FLAG_NCR53C400 ? "NCR53C400 " : "",
+ hostdata->flags & FLAG_DTC3181E ? "DTC3181E " : "",
+ hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "",
+#if defined(USLEEP_POLL) && defined(USLEEP_WAITLONG)
+ USLEEP_POLL, USLEEP_WAITLONG,
+#endif
#ifdef AUTOPROBE_IRQ
- " AUTOPROBE_IRQ"
+ "AUTOPROBE_IRQ "
#endif
#ifdef DIFFERENTIAL
- " DIFFERENTIAL"
+ "DIFFERENTIAL "
#endif
#ifdef REAL_DMA
- " REAL DMA"
+ "REAL_DMA "
#endif
#ifdef REAL_DMA_POLL
- " REAL DMA POLL"
+ "REAL_DMA_POLL "
#endif
#ifdef PARITY
- " PARITY"
+ "PARITY "
#endif
#ifdef PSEUDO_DMA
- " PSEUDO DMA"
+ "PSEUDO_DMA "
#endif
#ifdef UNSAFE
- " UNSAFE "
+ "UNSAFE "
#endif
- );
- printk(" USLEEP_POLL=%d USLEEP_SLEEP=%d", USLEEP_POLL, USLEEP_SLEEP);
- printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
- if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400) {
- printk(" ncr53c400 release=%d", NCR53C400_PUBLIC_RELEASE);
- }
+#ifdef NCR53C400
+ "NCR53C400 "
+#endif
+ "");
}
/**
@@ -728,13 +751,6 @@ static int __maybe_unused NCR5380_show_i
SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
#endif
- SPRINTF("\nBase Addr: 0x%05lX ", (long) instance->base);
- SPRINTF("io_port: %04x ", (int) instance->io_port);
- if (instance->irq == NO_IRQ)
- SPRINTF("IRQ: None.\n");
- else
- SPRINTF("IRQ: %d.\n", instance->irq);
-
#ifdef DTC_PUBLIC_RELEASE
SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", dtc_wmaxi, dtc_maxi);
#endif
@@ -842,6 +858,8 @@ static int NCR5380_init(struct Scsi_Host
hostdata->host = instance;
hostdata->time_expires = 0;
+ prepare_info(instance);
+
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:24.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:26.000000000 +1100
@@ -273,6 +273,7 @@ struct NCR5380_hostdata {
volatile Scsi_Cmnd *selecting;
struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses;
+ char info[256];
};
#ifdef __KERNEL__
@@ -307,7 +308,7 @@ static void NCR5380_information_transfer
static irqreturn_t NCR5380_intr(int irq, void *dev_id);
#endif
static void NCR5380_main(struct work_struct *work);
-static void __maybe_unused NCR5380_print_options(struct Scsi_Host *instance);
+static const char *NCR5380_info(struct Scsi_Host *instance);
static void NCR5380_reselect(struct Scsi_Host *instance);
static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd);
#if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:26.000000000 +1100
@@ -281,15 +281,6 @@ found:
printk("scsi%d : irq = %d\n", instance->host_no, instance->irq);
#endif
- printk(KERN_INFO "scsi%d : at 0x%05X", instance->host_no, (int) instance->base);
- if (instance->irq == NO_IRQ)
- printk(" interrupts disabled");
- else
- printk(" irq %d", instance->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", CAN_QUEUE, CMD_PER_LUN, DTC_PUBLIC_RELEASE);
- NCR5380_print_options(instance);
- printk("\n");
-
++current_override;
++count;
}
@@ -461,6 +452,7 @@ static struct scsi_host_template driver_
.proc_name = "dtc3x80",
.show_info = dtc_show_info,
.write_info = dtc_write_info,
+ .info = dtc_info,
.queuecommand = dtc_queue_command,
.eh_abort_handler = dtc_abort,
.eh_bus_reset_handler = dtc_bus_reset,
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
@@ -446,15 +446,6 @@ static int __init generic_NCR5380_detect
printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no);
}
- printk(KERN_INFO "scsi%d : at " STRVAL(NCR5380_map_name) " 0x%x", instance->host_no, (unsigned int) instance->NCR5380_instance_name);
- if (instance->irq == NO_IRQ)
- printk(" interrupts disabled");
- else
- printk(" irq %d", instance->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", CAN_QUEUE, CMD_PER_LUN, GENERIC_NCR5380_PUBLIC_RELEASE);
- NCR5380_print_options(instance);
- printk("\n");
-
++current_override;
++count;
}
@@ -462,19 +453,6 @@ static int __init generic_NCR5380_detect
}
/**
- * generic_NCR5380_info - reporting string
- * @host: NCR5380 to report on
- *
- * Report driver information for the NCR5380
- */
-
-static const char *generic_NCR5380_info(struct Scsi_Host *host)
-{
- static const char string[] = "Generic NCR5380/53C400 Driver";
- return string;
-}
-
-/**
* generic_NCR5380_release_resources - free resources
* @instance: host adapter to clean up
*
@@ -720,120 +698,9 @@ static inline int NCR5380_pwrite(struct
#include "NCR5380.c"
-#define PRINTP(x) seq_printf(m, x)
-#define ANDP ,
-
-static void sprint_opcode(struct seq_file *m, int opcode)
-{
- PRINTP("0x%02x " ANDP opcode);
-}
-
-static void sprint_command(struct seq_file *m, unsigned char *command)
-{
- int i, s;
- sprint_opcode(m, command[0]);
- for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
- PRINTP("%02x " ANDP command[i]);
- PRINTP("\n");
-}
-
-/**
- * sprintf_Scsi_Cmnd - print a scsi command
- * @m: seq_fil to print into
- * @cmd: SCSI command block
- *
- * Print out the target and command data in hex
- */
-
-static void sprint_Scsi_Cmnd(struct seq_file *m, Scsi_Cmnd * cmd)
-{
- PRINTP("host number %d destination target %d, lun %llu\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP cmd->device->lun);
- PRINTP(" command = ");
- sprint_command(m, cmd->cmnd);
-}
-
-/**
- * generic_NCR5380_proc_info - /proc for NCR5380 driver
- * @buffer: buffer to print into
- * @start: start position
- * @offset: offset into buffer
- * @len: length
- * @hostno: instance to affect
- * @inout: read/write
- *
- * Provide the procfs information for the 5380 controller. We fill
- * this with useful debugging information including the commands
- * being executed, disconnected command queue and the statistical
- * data
- *
- * Locks: global cli/lock for queue walk
- */
-
-static int generic_NCR5380_show_info(struct seq_file *m, struct Scsi_Host *scsi_ptr)
-{
- NCR5380_local_declare();
- unsigned long flags;
- unsigned char status;
- int i;
- Scsi_Cmnd *ptr;
- struct NCR5380_hostdata *hostdata;
-
- NCR5380_setup(scsi_ptr);
- hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata;
-
- spin_lock_irqsave(scsi_ptr->host_lock, flags);
- PRINTP("SCSI host number %d : %s\n" ANDP scsi_ptr->host_no ANDP scsi_ptr->hostt->name);
- PRINTP("Generic NCR5380 driver version %d\n" ANDP GENERIC_NCR5380_PUBLIC_RELEASE);
- PRINTP("NCR5380 core version %d\n" ANDP NCR5380_PUBLIC_RELEASE);
-#ifdef NCR53C400
- PRINTP("NCR53C400 extension version %d\n" ANDP NCR53C400_PUBLIC_RELEASE);
- PRINTP("NCR53C400 card%s detected\n" ANDP(((struct NCR5380_hostdata *) scsi_ptr->hostdata)->flags & FLAG_NCR53C400) ? "" : " not");
-# if NCR53C400_PSEUDO_DMA
- PRINTP("NCR53C400 pseudo DMA used\n");
-# endif
-#else
- PRINTP("NO NCR53C400 driver extensions\n");
-#endif
- PRINTP("Using %s mapping at %s 0x%lx, " ANDP STRVAL(NCR5380_map_config) ANDP STRVAL(NCR5380_map_name) ANDP scsi_ptr->NCR5380_instance_name);
- if (scsi_ptr->irq == NO_IRQ)
- PRINTP("no interrupt\n");
- else
- PRINTP("on interrupt %d\n" ANDP scsi_ptr->irq);
-
- status = NCR5380_read(STATUS_REG);
- if (!(status & SR_REQ))
- PRINTP("REQ not asserted, phase unknown.\n");
- else {
- for (i = 0; (phases[i].value != PHASE_UNKNOWN) && (phases[i].value != (status & PHASE_MASK)); ++i);
- PRINTP("Phase %s\n" ANDP phases[i].name);
- }
-
- if (!hostdata->connected) {
- PRINTP("No currently connected command\n");
- } else {
- sprint_Scsi_Cmnd(m, (Scsi_Cmnd *) hostdata->connected);
- }
-
- PRINTP("issue_queue\n");
-
- for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
- sprint_Scsi_Cmnd(m, ptr);
-
- PRINTP("disconnected_queue\n");
-
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
- sprint_Scsi_Cmnd(m, ptr);
-
- spin_unlock_irqrestore(scsi_ptr->host_lock, flags);
- return 0;
-}
-
-#undef PRINTP
-#undef ANDP
-
static struct scsi_host_template driver_template = {
.show_info = generic_NCR5380_show_info,
- .name = "Generic NCR5380/NCR53C400 Scsi Driver",
+ .name = "Generic NCR5380/NCR53C400 SCSI",
.detect = generic_NCR5380_detect,
.release = generic_NCR5380_release_resources,
.info = generic_NCR5380_info,
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:26.000000000 +1100
@@ -438,17 +438,6 @@ static int __init pas16_detect(struct sc
printk("scsi%d : irq = %d\n", instance->host_no, instance->irq);
#endif
- printk("scsi%d : at 0x%04x", instance->host_no, (int)
- instance->io_port);
- if (instance->irq == NO_IRQ)
- printk (" interrupts disabled");
- else
- printk (" irq %d", instance->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- CAN_QUEUE, CMD_PER_LUN, PAS16_PUBLIC_RELEASE);
- NCR5380_print_options(instance);
- printk("\n");
-
++current_override;
++count;
}
@@ -586,6 +575,7 @@ static struct scsi_host_template driver_
.proc_name = "pas16",
.show_info = pas16_show_info,
.write_info = pas16_write_info,
+ .info = pas16_info,
.queuecommand = pas16_queue_command,
.eh_abort_handler = pas16_abort,
.eh_bus_reset_handler = pas16_bus_reset,
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:26.000000000 +1100
@@ -249,16 +249,6 @@ found:
printk("scsi%d : irq = %d\n", instance->host_no, instance->irq);
#endif
- printk("scsi%d : at 0x%08lx", instance->host_no, instance->base);
- if (instance->irq == NO_IRQ)
- printk (" interrupts disabled");
- else
- printk (" irq %d", instance->irq);
- printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
- CAN_QUEUE, CMD_PER_LUN, T128_PUBLIC_RELEASE);
- NCR5380_print_options(instance);
- printk("\n");
-
++current_override;
++count;
}
@@ -411,6 +401,7 @@ static struct scsi_host_template driver_
.proc_name = "t128",
.show_info = t128_show_info,
.write_info = t128_write_info,
+ .info = t128_info,
.queuecommand = t128_queue_command,
.eh_abort_handler = t128_abort,
.eh_bus_reset_handler = t128_bus_reset,
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:25:22.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:26.000000000 +1100
@@ -57,6 +57,7 @@
static struct scsi_host_template dmx3191d_driver_template = {
.proc_name = DMX3191D_DRIVER_NAME,
.name = "Domex DMX3191D",
+ .info = NCR5380_info,
.queuecommand = NCR5380_queue_command,
.eh_abort_handler = NCR5380_abort,
.eh_bus_reset_handler = NCR5380_bus_reset,
Index: linux/drivers/scsi/g_NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:26.000000000 +1100
@@ -100,6 +100,8 @@
#define NCR5380_bus_reset generic_NCR5380_bus_reset
#define NCR5380_pread generic_NCR5380_pread
#define NCR5380_pwrite generic_NCR5380_pwrite
+#define NCR5380_info generic_NCR5380_info
+#define NCR5380_show_info generic_NCR5380_show_info
#define BOARD_NCR5380 0
#define BOARD_NCR53C400 1
Index: linux/drivers/scsi/dtc.h
===================================================================
--- linux.orig/drivers/scsi/dtc.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/dtc.h 2014-10-27 16:25:26.000000000 +1100
@@ -65,6 +65,7 @@
#define NCR5380_queue_command dtc_queue_command
#define NCR5380_abort dtc_abort
#define NCR5380_bus_reset dtc_bus_reset
+#define NCR5380_info dtc_info
#define NCR5380_show_info dtc_show_info
#define NCR5380_write_info dtc_write_info
Index: linux/drivers/scsi/pas16.h
===================================================================
--- linux.orig/drivers/scsi/pas16.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/pas16.h 2014-10-27 16:25:26.000000000 +1100
@@ -143,6 +143,7 @@
#define NCR5380_queue_command pas16_queue_command
#define NCR5380_abort pas16_abort
#define NCR5380_bus_reset pas16_bus_reset
+#define NCR5380_info pas16_info
#define NCR5380_show_info pas16_show_info
#define NCR5380_write_info pas16_write_info
Index: linux/drivers/scsi/t128.h
===================================================================
--- linux.orig/drivers/scsi/t128.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/t128.h 2014-10-27 16:25:26.000000000 +1100
@@ -116,6 +116,7 @@
#define NCR5380_queue_command t128_queue_command
#define NCR5380_abort t128_abort
#define NCR5380_bus_reset t128_bus_reset
+#define NCR5380_info t128_info
#define NCR5380_show_info t128_show_info
#define NCR5380_write_info t128_write_info
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.h 2014-10-27 16:25:26.000000000 +1100
@@ -53,6 +53,7 @@
#define NCR5380_queue_command macscsi_queue_command
#define NCR5380_abort macscsi_abort
#define NCR5380_bus_reset macscsi_bus_reset
+#define NCR5380_info macscsi_info
#define NCR5380_show_info macscsi_show_info
#define NCR5380_write_info macscsi_write_info
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
@@ -144,12 +144,6 @@
* be able to coexist with appropriate changes to the high level
* SCSI code.
*
- * A NCR5380_PUBLIC_REVISION macro is provided, with the release
- * number (updated for each public release) printed by the
- * NCR5380_print_options command, which should be called from the
- * wrapper detect function, so that I know what release of the driver
- * users are using.
- *
* Issues specific to the NCR5380 :
*
* When used in a PIO or pseudo-dma mode, the NCR5380 is a braindead
@@ -247,7 +241,6 @@
* NCR5380_queue_command
* NCR5380_reset
* NCR5380_abort
- * NCR5380_proc_info
*
* to be the global entry points into the specific driver, ie
* #define NCR5380_queue_command t128_queue_command.
@@ -259,8 +252,7 @@
* The generic driver is initialized by calling NCR5380_init(instance),
* after setting the appropriate host specific fields and ID. If the
* driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
- * possible) function may be used. Before the specific driver initialization
- * code finishes, NCR5380_print_options should be called.
+ * possible) function may be used.
*/
static struct Scsi_Host *first_instance = NULL;
@@ -670,30 +662,49 @@ static inline void NCR5380_all_init(void
}
}
-
-/*
- * Function : void NCR58380_print_options (struct Scsi_Host *instance)
+/**
+ * NCR58380_info - report driver and host information
+ * @instance: relevant scsi host instance
*
- * Purpose : called by probe code indicating the NCR5380 driver
- * options that were selected.
+ * For use as the host template info() handler.
*
- * Inputs : instance, pointer to this instance. Unused.
+ * Locks: none
*/
-static void __init NCR5380_print_options(struct Scsi_Host *instance)
+static const char *NCR5380_info(struct Scsi_Host *instance)
+{
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ return hostdata->info;
+}
+
+static void prepare_info(struct Scsi_Host *instance)
{
- printk(" generic options"
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ snprintf(hostdata->info, sizeof(hostdata->info),
+ "%s, io_port 0x%lx, n_io_port %d, "
+ "base 0x%lx, irq %d, "
+ "can_queue %d, cmd_per_lun %d, "
+ "sg_tablesize %d, this_id %d, "
+ "options { %s} ",
+ instance->hostt->name, instance->io_port, instance->n_io_port,
+ instance->base, instance->irq,
+ instance->can_queue, instance->cmd_per_lun,
+ instance->sg_tablesize, instance->this_id,
+#ifdef DIFFERENTIAL
+ "DIFFERENTIAL "
+#endif
#ifdef REAL_DMA
- " REAL DMA"
+ "REAL_DMA "
#endif
#ifdef PARITY
- " PARITY"
+ "PARITY "
#endif
#ifdef SUPPORT_TAGS
- " SCSI-2 TAGGED QUEUING"
+ "SUPPORT_TAGS "
#endif
- );
- printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
+ "");
}
/*
@@ -839,6 +850,8 @@ static int __init NCR5380_init(struct Sc
first_instance = instance;
}
+ prepare_info(instance);
+
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
Index: linux/drivers/scsi/atari_scsi.h
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.h 2014-10-27 16:25:09.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.h 2014-10-27 16:25:26.000000000 +1100
@@ -47,6 +47,7 @@
#define NCR5380_queue_command atari_scsi_queue_command
#define NCR5380_abort atari_scsi_abort
#define NCR5380_show_info atari_scsi_show_info
+#define NCR5380_info atari_scsi_info
#define NCR5380_dma_read_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 0)
#define NCR5380_dma_write_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 1)
#define NCR5380_dma_residual(inst) atari_scsi_dma_residual( inst )
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:24.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
@@ -131,12 +131,6 @@
* be able to coexist with appropriate changes to the high level
* SCSI code.
*
- * A NCR5380_PUBLIC_REVISION macro is provided, with the release
- * number (updated for each public release) printed by the
- * NCR5380_print_options command, which should be called from the
- * wrapper detect function, so that I know what release of the driver
- * users are using.
- *
* Issues specific to the NCR5380 :
*
* When used in a PIO or pseudo-dma mode, the NCR5380 is a braindead
@@ -234,7 +228,6 @@
* NCR5380_queue_command
* NCR5380_reset
* NCR5380_abort
- * NCR5380_proc_info
*
* to be the global entry points into the specific driver, ie
* #define NCR5380_queue_command t128_queue_command.
@@ -246,8 +239,7 @@
* The generic driver is initialized by calling NCR5380_init(instance),
* after setting the appropriate host specific fields and ID. If the
* driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
- * possible) function may be used. Before the specific driver initialization
- * code finishes, NCR5380_print_options should be called.
+ * possible) function may be used.
*/
static struct Scsi_Host *first_instance = NULL;
@@ -616,30 +608,49 @@ static inline void NCR5380_all_init (voi
}
}
-
-/*
- * Function : void NCR58380_print_options (struct Scsi_Host *instance)
+/**
+ * NCR58380_info - report driver and host information
+ * @instance: relevant scsi host instance
*
- * Purpose : called by probe code indicating the NCR5380 driver
- * options that were selected.
+ * For use as the host template info() handler.
*
- * Inputs : instance, pointer to this instance. Unused.
+ * Locks: none
*/
-static void __init NCR5380_print_options (struct Scsi_Host *instance)
+static const char *NCR5380_info(struct Scsi_Host *instance)
+{
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ return hostdata->info;
+}
+
+static void prepare_info(struct Scsi_Host *instance)
{
- printk(" generic options"
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ snprintf(hostdata->info, sizeof(hostdata->info),
+ "%s, io_port 0x%lx, n_io_port %d, "
+ "base 0x%lx, irq %d, "
+ "can_queue %d, cmd_per_lun %d, "
+ "sg_tablesize %d, this_id %d, "
+ "options { %s} ",
+ instance->hostt->name, instance->io_port, instance->n_io_port,
+ instance->base, instance->irq,
+ instance->can_queue, instance->cmd_per_lun,
+ instance->sg_tablesize, instance->this_id,
+#ifdef DIFFERENTIAL
+ "DIFFERENTIAL "
+#endif
#ifdef REAL_DMA
- " REAL DMA"
+ "REAL_DMA "
#endif
#ifdef PARITY
- " PARITY"
+ "PARITY "
#endif
#ifdef SUPPORT_TAGS
- " SCSI-2 TAGGED QUEUING"
+ "SUPPORT_TAGS "
#endif
- );
- printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
+ "");
}
/*
@@ -784,7 +795,9 @@ static int __init NCR5380_init(struct Sc
the_template = instance->hostt;
first_instance = instance;
}
-
+
+ prepare_info(instance);
+
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(TARGET_COMMAND_REG, 0);
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:20.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:26.000000000 +1100
@@ -74,6 +74,7 @@
#define NCR5380_bus_reset sun3scsi_bus_reset
#define NCR5380_abort sun3scsi_abort
#define NCR5380_show_info sun3scsi_show_info
+#define NCR5380_info sun3scsi_info
#define NCR5380_dma_xfer_len(i, cmd, phase) \
sun3scsi_dma_xfer_len(cmd->SCp.this_residual,cmd,((phase) & SR_IO) ? 0 : 1)
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (11 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 12/36] ncr5380: Cleanup host info() methods Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:31 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros Finn Thain
` (23 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-move-pdma-spin-counters --]
[-- Type: text/plain, Size: 6906 bytes --]
Static variables from dtc.c and pas16.c should not appear in the core
NCR5380.c driver. Aside from being a layering issue this worsens the
divergence between the three core driver variants (atari_NCR5380.c and
sun3_NCR5380.c don't support PSEUDO_DMA) and it can mean multiple hosts
share the same counters.
Fix this by making the pseudo DMA spin counters in the core more generic.
This also avoids the abuse of the {DTC,PAS16}_PUBLIC_RELEASE macros, so
they can be removed.
oak.c doesn't use PDMA and hence it doesn't use the counters and hence it
needs no write_info() method. Remove it.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.c | 22 ++++++++++------------
drivers/scsi/NCR5380.h | 4 ++++
drivers/scsi/arm/oak.c | 2 --
drivers/scsi/dtc.c | 13 ++++++-------
drivers/scsi/pas16.c | 12 ++++++------
5 files changed, 26 insertions(+), 27 deletions(-)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:30.000000000 +1100
@@ -692,6 +692,7 @@ static void NCR5380_print_status(struct
NCR5380_dprint_phase(NDEBUG_ANY, instance);
}
+#ifdef PSEUDO_DMA
/******************************************/
/*
* /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED]
@@ -709,14 +710,13 @@ static void NCR5380_print_status(struct
static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
char *buffer, int length)
{
-#ifdef DTC_PUBLIC_RELEASE
- dtc_wmaxi = dtc_maxi = 0;
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
- pas_wmaxi = pas_maxi = 0;
-#endif
- return (-ENOSYS); /* Currently this is a no-op */
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ hostdata->spin_max_r = 0;
+ hostdata->spin_max_w = 0;
+ return 0;
}
+#endif
#undef SPRINTF
#define SPRINTF(args...) seq_printf(m, ## args)
@@ -751,11 +751,9 @@ static int __maybe_unused NCR5380_show_i
SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
#endif
-#ifdef DTC_PUBLIC_RELEASE
- SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", dtc_wmaxi, dtc_maxi);
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
- SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", pas_wmaxi, pas_maxi);
+#ifdef PSEUDO_DMA
+ SPRINTF("Highwater I/O busy spin counts: write %d, read %d\n",
+ hostdata->spin_max_w, hostdata->spin_max_r);
#endif
spin_lock_irq(instance->host_lock);
if (!hostdata->connected)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:30.000000000 +1100
@@ -274,6 +274,10 @@ struct NCR5380_hostdata {
struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses;
char info[256];
+#ifdef PSEUDO_DMA
+ unsigned spin_max_r;
+ unsigned spin_max_w;
+#endif
};
#ifdef __KERNEL__
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:30.000000000 +1100
@@ -332,13 +332,11 @@ static int dtc_biosparam(struct scsi_dev
* timeout.
*/
-static int dtc_maxi = 0;
-static int dtc_wmaxi = 0;
-
static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, int len)
{
unsigned char *d = dst;
int i; /* For counting time spent in the poll-loop */
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
NCR5380_local_declare();
NCR5380_setup(instance);
@@ -369,8 +367,8 @@ static inline int NCR5380_pread(struct S
NCR5380_write(MODE_REG, 0); /* Clear the operating mode */
rtrc(0);
NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- if (i > dtc_maxi)
- dtc_maxi = i;
+ if (i > hostdata->spin_max_r)
+ hostdata->spin_max_r = i;
return (0);
}
@@ -390,6 +388,7 @@ static inline int NCR5380_pread(struct S
static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, int len)
{
int i;
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
NCR5380_local_declare();
NCR5380_setup(instance);
@@ -422,8 +421,8 @@ static inline int NCR5380_pwrite(struct
/* Check for parity error here. fixme. */
NCR5380_write(MODE_REG, 0); /* Clear the operating mode */
rtrc(0);
- if (i > dtc_wmaxi)
- dtc_wmaxi = i;
+ if (i > hostdata->spin_max_w)
+ hostdata->spin_max_w = i;
return (0);
}
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:30.000000000 +1100
@@ -88,8 +88,6 @@
#include "NCR5380.h"
-static int pas_maxi = 0;
-static int pas_wmaxi = 0;
static unsigned short pas16_addr = 0;
static int pas16_irq = 0;
@@ -502,6 +500,7 @@ static inline int NCR5380_pread (struct
P_DATA_REG_OFFSET);
register int i = len;
int ii = 0;
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
while ( !(inb(instance->io_port + P_STATUS_REG_OFFSET) & P_ST_RDY) )
++ii;
@@ -514,8 +513,8 @@ static inline int NCR5380_pread (struct
instance->host_no);
return -1;
}
- if (ii > pas_maxi)
- pas_maxi = ii;
+ if (ii > hostdata->spin_max_r)
+ hostdata->spin_max_r = ii;
return 0;
}
@@ -538,6 +537,7 @@ static inline int NCR5380_pwrite (struct
register unsigned short reg = (instance->io_port + P_DATA_REG_OFFSET);
register int i = len;
int ii = 0;
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
while ( !((inb(instance->io_port + P_STATUS_REG_OFFSET)) & P_ST_RDY) )
++ii;
@@ -550,8 +550,8 @@ static inline int NCR5380_pwrite (struct
instance->host_no);
return -1;
}
- if (ii > pas_maxi)
- pas_wmaxi = ii;
+ if (ii > hostdata->spin_max_w)
+ hostdata->spin_max_w = ii;
return 0;
}
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:30.000000000 +1100
@@ -31,7 +31,6 @@
#define NCR5380_queue_command oakscsi_queue_command
#define NCR5380_info oakscsi_info
#define NCR5380_show_info oakscsi_show_info
-#define NCR5380_write_info oakscsi_write_info
#define NCR5380_implementation_fields \
void __iomem *base
@@ -108,7 +107,6 @@ printk("reading %p len %d\n", addr, len)
static struct scsi_host_template oakscsi_template = {
.module = THIS_MODULE,
.show_info = oakscsi_show_info,
- .write_info = oakscsi_write_info,
.name = "Oak 16-bit SCSI",
.info = oakscsi_info,
.queuecommand = oakscsi_queue_command,
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (12 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:34 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros Finn Thain
` (22 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-compiler-invocation-macros --]
[-- Type: text/plain, Size: 6073 bytes --]
Compile-time override of scsi host defaults is pointless for drivers that
provide module parameters and __setup options for that. Too many macros make
the code hard to read so remove them.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_scsi.c | 2 +-
drivers/scsi/atari_scsi.h | 3 ---
drivers/scsi/mac_scsi.c | 19 +++++++++----------
drivers/scsi/mac_scsi.h | 16 ----------------
drivers/scsi/sun3_scsi.c | 20 ++++++++++----------
drivers/scsi/sun3_scsi.h | 18 ------------------
6 files changed, 20 insertions(+), 58 deletions(-)
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:32.000000000 +1100
@@ -177,13 +177,12 @@ int __init macscsi_detect(struct scsi_ho
if (macintosh_config->scsi_type != MAC_SCSI_OLD)
return( 0 );
- /* setup variables */
- tpnt->can_queue =
- (setup_can_queue > 0) ? setup_can_queue : CAN_QUEUE;
- tpnt->cmd_per_lun =
- (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : CMD_PER_LUN;
- tpnt->sg_tablesize =
- (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_TABLESIZE;
+ if (setup_can_queue > 0)
+ tpnt->can_queue = setup_can_queue;
+ if (setup_cmd_per_lun > 0)
+ tpnt->cmd_per_lun = setup_cmd_per_lun;
+ if (setup_sg_tablesize >= 0)
+ tpnt->sg_tablesize = setup_sg_tablesize;
if (setup_hostid >= 0)
tpnt->this_id = setup_hostid;
@@ -194,7 +193,7 @@ int __init macscsi_detect(struct scsi_ho
#ifdef SUPPORT_TAGS
if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = USE_TAGGED_QUEUING;
+ setup_use_tagged_queuing = 0;
#endif
/* Once we support multiple 5380s (e.g. DuoDock) we'll do
@@ -496,10 +495,10 @@ static struct scsi_host_template driver_
.queuecommand = macscsi_queue_command,
.eh_abort_handler = macscsi_abort,
.eh_bus_reset_handler = macscsi_bus_reset,
- .can_queue = CAN_QUEUE,
+ .can_queue = 16,
.this_id = 7,
.sg_tablesize = SG_ALL,
- .cmd_per_lun = CMD_PER_LUN,
+ .cmd_per_lun = 2,
.use_clustering = DISABLE_CLUSTERING
};
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.h 2014-10-27 16:25:32.000000000 +1100
@@ -17,22 +17,6 @@
#ifndef ASM
-#ifndef CMD_PER_LUN
-#define CMD_PER_LUN 2
-#endif
-
-#ifndef CAN_QUEUE
-#define CAN_QUEUE 16
-#endif
-
-#ifndef SG_TABLESIZE
-#define SG_TABLESIZE SG_NONE
-#endif
-
-#ifndef USE_TAGGED_QUEUING
-#define USE_TAGGED_QUEUING 0
-#endif
-
#include <scsi/scsicam.h>
#define NCR5380_implementation_fields /* none */
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:32.000000000 +1100
@@ -198,12 +198,12 @@ static int __init sun3scsi_detect(struct
#endif
/* setup variables */
- tpnt->can_queue =
- (setup_can_queue > 0) ? setup_can_queue : CAN_QUEUE;
- tpnt->cmd_per_lun =
- (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : CMD_PER_LUN;
- tpnt->sg_tablesize =
- (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_TABLESIZE;
+ if (setup_can_queue > 0)
+ tpnt->can_queue = setup_can_queue;
+ if (setup_cmd_per_lun > 0)
+ tpnt->cmd_per_lun = setup_cmd_per_lun;
+ if (setup_sg_tablesize >= 0)
+ tpnt->sg_tablesize = setup_sg_tablesize;
if (setup_hostid >= 0)
tpnt->this_id = setup_hostid;
@@ -257,7 +257,7 @@ static int __init sun3scsi_detect(struct
#endif
#ifdef SUPPORT_TAGS
if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = USE_TAGGED_QUEUING;
+ setup_use_tagged_queuing = 1;
#endif
instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
@@ -683,10 +683,10 @@ static struct scsi_host_template driver_
.queuecommand = sun3scsi_queue_command,
.eh_abort_handler = sun3scsi_abort,
.eh_bus_reset_handler = sun3scsi_bus_reset,
- .can_queue = CAN_QUEUE,
+ .can_queue = 16,
.this_id = 7,
- .sg_tablesize = SG_TABLESIZE,
- .cmd_per_lun = CMD_PER_LUN,
+ .sg_tablesize = SG_NONE,
+ .cmd_per_lun = 2,
.use_clustering = DISABLE_CLUSTERING
};
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:32.000000000 +1100
@@ -31,25 +31,7 @@
#define IOBASE_SUN3_VMESCSI 0xff200000
-#ifndef CMD_PER_LUN
-#define CMD_PER_LUN 2
-#endif
-
-#ifndef CAN_QUEUE
-#define CAN_QUEUE 16
-#endif
-
-#ifndef SG_TABLESIZE
-#define SG_TABLESIZE SG_NONE
-#endif
-
-#ifndef MAX_TAGS
#define MAX_TAGS 32
-#endif
-
-#ifndef USE_TAGGED_QUEUING
-#define USE_TAGGED_QUEUING 1
-#endif
#include <scsi/scsicam.h>
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:32.000000000 +1100
@@ -611,7 +611,7 @@ static int __init atari_scsi_detect(stru
#ifdef SUPPORT_TAGS
if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
+ setup_use_tagged_queuing = 0;
#endif
#ifdef REAL_DMA
/* If running on a Falcon and if there's TT-Ram (i.e., more than one
Index: linux/drivers/scsi/atari_scsi.h
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.h 2014-10-27 16:25:32.000000000 +1100
@@ -36,9 +36,6 @@
#define ATARI_FALCON_CMD_PER_LUN 1
#define ATARI_FALCON_SG_TABLESIZE SG_NONE
-#define DEFAULT_USE_TAGGED_QUEUING 0
-
-
#define NCR5380_implementation_fields /* none */
#define NCR5380_read(reg) atari_scsi_reg_read( reg )
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (13 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:36 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include Finn Thain
` (21 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-remove-RELEASE-macros --]
[-- Type: text/plain, Size: 11247 bytes --]
The *_RELEASE macros don't tell me anything. In some cases the version in
the macro contradicts the version in the comments. Anyway, the Linux kernel
version is sufficient information. Remove these macros to improve readability.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.c | 18 ------------------
drivers/scsi/NCR5380.h | 5 -----
drivers/scsi/arm/cumana_1.c | 2 --
drivers/scsi/arm/oak.c | 2 --
drivers/scsi/atari_NCR5380.c | 4 ----
drivers/scsi/dtc.c | 5 -----
drivers/scsi/dtc.h | 2 --
drivers/scsi/g_NCR5380.c | 2 --
drivers/scsi/g_NCR5380.h | 5 -----
drivers/scsi/mac_scsi.c | 2 --
drivers/scsi/mac_scsi.h | 4 ----
drivers/scsi/pas16.h | 2 --
drivers/scsi/sun3_NCR5380.c | 4 ----
drivers/scsi/sun3_scsi.c | 2 --
drivers/scsi/sun3_scsi.h | 4 ----
drivers/scsi/t128.c | 2 --
drivers/scsi/t128.h | 4 ----
17 files changed, 69 deletions(-)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:30.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:33.000000000 +1100
@@ -11,8 +11,6 @@
* drew@colorado.edu
* +1 (303) 666-5836
*
- * DISTRIBUTION RELEASE 6.
- *
* For more information, please consult
*
* NCR 5380 Family
@@ -735,22 +733,6 @@ static int __maybe_unused NCR5380_show_i
hostdata = (struct NCR5380_hostdata *) instance->hostdata;
- SPRINTF("NCR5380 core release=%d. ", NCR5380_PUBLIC_RELEASE);
- if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400)
- SPRINTF("ncr53c400 release=%d. ", NCR53C400_PUBLIC_RELEASE);
-#ifdef DTC_PUBLIC_RELEASE
- SPRINTF("DTC 3180/3280 release %d", DTC_PUBLIC_RELEASE);
-#endif
-#ifdef T128_PUBLIC_RELEASE
- SPRINTF("T128 release %d", T128_PUBLIC_RELEASE);
-#endif
-#ifdef GENERIC_NCR5380_PUBLIC_RELEASE
- SPRINTF("Generic5380 release %d", GENERIC_NCR5380_PUBLIC_RELEASE);
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
- SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
-#endif
-
#ifdef PSEUDO_DMA
SPRINTF("Highwater I/O busy spin counts: write %d, read %d\n",
hostdata->spin_max_w, hostdata->spin_max_r);
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
@@ -11,8 +11,6 @@
* drew@colorado.edu
* +1 (303) 666-5836
*
- * DISTRIBUTION RELEASE 6.
- *
* For more information, please consult
*
* NCR 5380 Family
@@ -741,7 +739,6 @@ static void NCR5380_print_status(struct
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
- printk("\nNCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
local_irq_save(flags);
printk("NCR5380: coroutine is%s running.\n",
main_running ? "" : "n't");
@@ -785,7 +782,6 @@ static int __maybe_unused NCR5380_show_i
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
- seq_printf(m, "NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
local_irq_save(flags);
seq_printf(m, "NCR5380: coroutine is%s running.\n",
main_running ? "" : "n't");
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
@@ -13,8 +13,6 @@
* drew@colorado.edu
* +1 (303) 666-5836
*
- * DISTRIBUTION RELEASE 6.
- *
* For more information, please consult
*
* NCR 5380 Family
@@ -687,7 +685,6 @@ static void NCR5380_print_status(struct
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
- printk("\nNCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
local_irq_save(flags);
printk("NCR5380: coroutine is%s running.\n",
main_running ? "" : "n't");
@@ -731,7 +728,6 @@ static int __maybe_unused NCR5380_show_i
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
- seq_printf(m, "NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
local_irq_save(flags);
seq_printf(m, "NCR5380: coroutine is%s running.\n",
main_running ? "" : "n't");
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:30.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:33.000000000 +1100
@@ -7,8 +7,6 @@
* drew@colorado.edu
* +1 (303) 666-5836
*
- * DISTRIBUTION RELEASE 7
- *
* For more information, please consult
*
* NCR 5380 Family
@@ -27,9 +25,6 @@
#include <linux/interrupt.h>
#include <scsi/scsi_eh.h>
-#define NCR5380_PUBLIC_RELEASE 7
-#define NCR53C400_PUBLIC_RELEASE 2
-
#define NDEBUG_ARBITRATION 0x1
#define NDEBUG_AUTOSENSE 0x2
#define NDEBUG_DMA 0x4
Index: linux/drivers/scsi/arm/cumana_1.c
===================================================================
--- linux.orig/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:33.000000000 +1100
@@ -20,8 +20,6 @@
#define PSEUDO_DMA
-#define CUMANASCSI_PUBLIC_RELEASE 1
-
#define priv(host) ((struct NCR5380_hostdata *)(host)->hostdata)
#define NCR5380_local_declare() struct Scsi_Host *_instance
#define NCR5380_setup(instance) _instance = instance
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:30.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:33.000000000 +1100
@@ -18,8 +18,6 @@
#include <scsi/scsi_host.h>
/*#define PSEUDO_DMA*/
-
-#define OAKSCSI_PUBLIC_RELEASE 1
#define DONT_USE_INTR
#define priv(host) ((struct NCR5380_hostdata *)(host)->hostdata)
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:30.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:33.000000000 +1100
@@ -17,8 +17,6 @@
* (Unix and Linux consulting and custom programming)
* drew@colorado.edu
* +1 (303) 440-4894
- *
- * DISTRIBUTION RELEASE 1.
*/
/*
@@ -66,9 +64,6 @@
#define AUTOPROBE_IRQ
#include "NCR5380.h"
-
-#define DTC_PUBLIC_RELEASE 2
-
/*
* The DTC3180 & 3280 boards are memory mapped.
*
Index: linux/drivers/scsi/g_NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.h 2014-10-27 16:25:33.000000000 +1100
@@ -9,16 +9,11 @@
*
* NCR53C400 extensions (c) 1994,1995,1996, Kevin Lentin
* K.Lentin@cs.monash.edu.au
- *
- * ALPHA RELEASE 1.
*/
#ifndef GENERIC_NCR5380_H
#define GENERIC_NCR5380_H
-
-#define GENERIC_NCR5380_PUBLIC_RELEASE 1
-
#ifdef NCR53C400
#define BIOSPARAM
#define NCR5380_BIOSPARAM generic_NCR5380_biosparam
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.h 2014-10-27 16:25:33.000000000 +1100
@@ -6,15 +6,11 @@
* (Unix and Linux consulting and custom programming)
* drew@colorado.edu
* +1 (303) 440-4894
- *
- * ALPHA RELEASE 1.
*/
#ifndef MAC_NCR5380_H
#define MAC_NCR5380_H
-#define MACSCSI_PUBLIC_RELEASE 2
-
#ifndef ASM
#include <scsi/scsicam.h>
Index: linux/drivers/scsi/pas16.h
===================================================================
--- linux.orig/drivers/scsi/pas16.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/pas16.h 2014-10-27 16:25:33.000000000 +1100
@@ -24,8 +24,6 @@
#ifndef PAS16_H
#define PAS16_H
-#define PAS16_PUBLIC_RELEASE 3
-
#define PDEBUG_INIT 0x1
#define PDEBUG_TRANSFER 0x2
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:33.000000000 +1100
@@ -13,15 +13,11 @@
* (Unix and Linux consulting and custom programming)
* drew@colorado.edu
* +1 (303) 440-4894
- *
- * ALPHA RELEASE 1.
*/
#ifndef SUN3_SCSI_H
#define SUN3_SCSI_H
-#define SUN3SCSI_PUBLIC_RELEASE 1
-
/*
* Int: level 2 autovector
* IO: type 1, base 0x00140000, 5 bits phys space: A<4..0>
Index: linux/drivers/scsi/t128.h
===================================================================
--- linux.orig/drivers/scsi/t128.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/t128.h 2014-10-27 16:25:33.000000000 +1100
@@ -8,8 +8,6 @@
* drew@colorado.edu
* +1 (303) 440-4894
*
- * DISTRIBUTION RELEASE 3.
- *
* For more information, please consult
*
* Trantor Systems, Ltd.
@@ -25,8 +23,6 @@
#ifndef T128_H
#define T128_H
-#define T128_PUBLIC_RELEASE 3
-
#define TDEBUG 0
#define TDEBUG_INIT 0x1
#define TDEBUG_TRANSFER 0x2
Index: linux/drivers/scsi/dtc.h
===================================================================
--- linux.orig/drivers/scsi/dtc.h 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/dtc.h 2014-10-27 16:25:33.000000000 +1100
@@ -5,8 +5,6 @@
* (Unix and Linux consulting and custom programming)
* drew@colorado.edu
* +1 (303) 440-4894
- *
- * DISTRIBUTION RELEASE 2.
*/
#ifndef DTC3280_H
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
@@ -18,8 +18,6 @@
*
* Added ISAPNP support for DTC436 adapters,
* Thomas Sailer, sailer@ife.ee.ethz.ch
- *
- * ALPHA RELEASE 1.
*/
/*
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:33.000000000 +1100
@@ -9,8 +9,6 @@
* Generic Generic NCR5380 driver
*
* Copyright 1995, Russell King
- *
- * ALPHA RELEASE 1.
*/
#include <linux/types.h>
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:33.000000000 +1100
@@ -20,8 +20,6 @@
* Generic Generic NCR5380 driver
*
* Copyright 1995, Russell King
- *
- * ALPHA RELEASE 1.
*/
#include <linux/types.h>
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:33.000000000 +1100
@@ -11,8 +11,6 @@
* drew@colorado.edu
* +1 (303) 440-4894
*
- * DISTRIBUTION RELEASE 3.
- *
* For more information, please consult
*
* Trantor Systems, Ltd.
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (14 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:37 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 17/36] dmx3191d: Use NO_IRQ Finn Thain
` (20 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
[-- Attachment #1: ncr5380-drop-legacy-scsi-h-include --]
[-- Type: text/plain, Size: 36217 bytes --]
Convert Scsi_Cmnd to struct scsi_cmnd and drop the #include "scsi.h".
The sun3_NCR5380.c core driver already uses struct scsi_cmnd so converting
the other core drivers reduces the diff which makes them easier to unify.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Line length issues have not been addressed here because comparison of the
three core drivers (NCR5380.c, atari_NCR5380.c and sun3_NCR5380.c) becomes
too messy. These lines get shorter once the type casting is fixed (work in
progress).
---
drivers/scsi/NCR5380.c | 70 +++++++++++++++--------------
drivers/scsi/NCR5380.h | 10 ++--
drivers/scsi/arm/cumana_1.c | 1
drivers/scsi/arm/oak.c | 1
drivers/scsi/atari_NCR5380.c | 102 +++++++++++++++++++++----------------------
drivers/scsi/atari_scsi.c | 5 --
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_NCR5380.c | 20 ++++----
drivers/scsi/sun3_scsi.c | 1
drivers/scsi/t128.c | 1
14 files changed, 105 insertions(+), 111 deletions(-)
Index: linux/drivers/scsi/NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/NCR5380.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/NCR5380.c 2014-10-27 16:25:36.000000000 +1100
@@ -277,7 +277,7 @@ static void do_reset(struct Scsi_Host *h
* Set up the internal fields in the SCSI command.
*/
-static __inline__ void initialize_SCp(Scsi_Cmnd * cmd)
+static inline void initialize_SCp(struct scsi_cmnd *cmd)
{
/*
* Initialize the Scsi Pointer field so that all of the commands in the
@@ -719,7 +719,7 @@ static int __maybe_unused NCR5380_write_
#undef SPRINTF
#define SPRINTF(args...) seq_printf(m, ## args)
static
-void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m);
+void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m);
static
void lprint_command(unsigned char *cmd, struct seq_file *m);
static
@@ -729,7 +729,7 @@ static int __maybe_unused NCR5380_show_i
struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
- Scsi_Cmnd *ptr;
+ struct scsi_cmnd *ptr;
hostdata = (struct NCR5380_hostdata *) instance->hostdata;
@@ -741,19 +741,19 @@ static int __maybe_unused NCR5380_show_i
if (!hostdata->connected)
SPRINTF("scsi%d: no currently connected command\n", instance->host_no);
else
- lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
+ lprint_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected, m);
SPRINTF("scsi%d: issue_queue\n", instance->host_no);
- for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
+ for (ptr = (struct scsi_cmnd *) hostdata->issue_queue; ptr; ptr = (struct scsi_cmnd *) ptr->host_scribble)
lprint_Scsi_Cmnd(ptr, m);
SPRINTF("scsi%d: disconnected_queue\n", instance->host_no);
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
+ for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr; ptr = (struct scsi_cmnd *) ptr->host_scribble)
lprint_Scsi_Cmnd(ptr, m);
spin_unlock_irq(instance->host_lock);
return 0;
}
-static void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m)
+static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m)
{
SPRINTF("scsi%d : destination target %d, lun %llu\n", cmd->device->host->host_no, cmd->device->id, cmd->device->lun);
SPRINTF(" command = ");
@@ -912,11 +912,11 @@ static void NCR5380_exit(struct Scsi_Hos
* Locks: host lock taken by caller
*/
-static int NCR5380_queue_command_lck(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
+static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd, void (*done) (struct scsi_cmnd *))
{
struct Scsi_Host *instance = cmd->device->host;
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
- Scsi_Cmnd *tmp;
+ struct scsi_cmnd *tmp;
#if (NDEBUG & NDEBUG_NO_WRITE)
switch (cmd->cmnd[0]) {
@@ -950,7 +950,7 @@ static int NCR5380_queue_command_lck(Scs
cmd->host_scribble = (unsigned char *) hostdata->issue_queue;
hostdata->issue_queue = cmd;
} else {
- for (tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (Scsi_Cmnd *) tmp->host_scribble);
+ for (tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (struct scsi_cmnd *) tmp->host_scribble);
LIST(cmd, tmp);
tmp->host_scribble = (unsigned char *) cmd;
}
@@ -981,7 +981,7 @@ static void NCR5380_main(struct work_str
struct NCR5380_hostdata *hostdata =
container_of(work, struct NCR5380_hostdata, coroutine.work);
struct Scsi_Host *instance = hostdata->host;
- Scsi_Cmnd *tmp, *prev;
+ struct scsi_cmnd *tmp, *prev;
int done;
spin_lock_irq(instance->host_lock);
@@ -994,7 +994,7 @@ 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 = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble)
+ for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble)
{
if (prev != tmp)
dprintk(NDEBUG_LISTS, "MAIN tmp=%p target=%d busy=%d lun=%llu\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], tmp->device->lun);
@@ -1006,7 +1006,7 @@ static void NCR5380_main(struct work_str
prev->host_scribble = tmp->host_scribble;
} else {
REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble);
- hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble;
+ hostdata->issue_queue = (struct scsi_cmnd *) tmp->host_scribble;
}
tmp->host_scribble = NULL;
@@ -1053,7 +1053,7 @@ static void NCR5380_main(struct work_str
/* exited locked */
} /* if (!hostdata->connected) */
if (hostdata->selecting) {
- tmp = (Scsi_Cmnd *) hostdata->selecting;
+ tmp = (struct scsi_cmnd *) hostdata->selecting;
/* Selection will drop and retake the lock */
if (!NCR5380_select(instance, tmp)) {
/* Ok ?? */
@@ -1175,7 +1175,8 @@ static irqreturn_t NCR5380_intr(int dumm
#endif
/*
- * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+ * Function : int NCR5380_select(struct Scsi_Host *instance,
+ * struct scsi_cmnd *cmd)
*
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
* including ARBITRATION, SELECTION, and initial message out for
@@ -1204,7 +1205,7 @@ static irqreturn_t NCR5380_intr(int dumm
* Locks: caller holds hostdata lock in IRQ mode
*/
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
{
NCR5380_local_declare();
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
@@ -2011,7 +2012,7 @@ static void NCR5380_information_transfer
#endif
unsigned char *data;
unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
- Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
+ 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;
@@ -2201,7 +2202,7 @@ static void NCR5380_information_transfer
LIST(cmd, hostdata->issue_queue);
cmd->host_scribble = (unsigned char *)
hostdata->issue_queue;
- hostdata->issue_queue = (Scsi_Cmnd *) cmd;
+ hostdata->issue_queue = (struct scsi_cmnd *) cmd;
dprintk(NDEBUG_QUEUES, "scsi%d : REQUEST SENSE added to head of issue queue\n", instance->host_no);
} else {
cmd->scsi_done(cmd);
@@ -2398,7 +2399,7 @@ static void NCR5380_information_transfer
* Function : void NCR5380_reselect (struct Scsi_Host *instance)
*
* Purpose : does reselection, initializing the instance->connected
- * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q
+ * field to point to the scsi_cmnd for which the I_T_L or I_T_L_Q
* nexus has been reestablished,
*
* Inputs : instance - this instance of the NCR5380.
@@ -2415,7 +2416,7 @@ static void NCR5380_reselect(struct Scsi
int len;
unsigned char msg[3];
unsigned char *data;
- Scsi_Cmnd *tmp = NULL, *prev;
+ struct scsi_cmnd *tmp = NULL, *prev;
int abort = 0;
NCR5380_setup(instance);
@@ -2481,7 +2482,7 @@ static void NCR5380_reselect(struct Scsi
*/
- for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble)
+ 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) {
@@ -2489,7 +2490,7 @@ static void NCR5380_reselect(struct Scsi
prev->host_scribble = tmp->host_scribble;
} else {
REMOVE(-1, hostdata->disconnected_queue, tmp, tmp->host_scribble);
- hostdata->disconnected_queue = (Scsi_Cmnd *) tmp->host_scribble;
+ hostdata->disconnected_queue = (struct scsi_cmnd *) tmp->host_scribble;
}
tmp->host_scribble = NULL;
break;
@@ -2520,7 +2521,7 @@ static void NCR5380_reselect(struct Scsi
*
* Inputs : instance - this instance of the NCR5380.
*
- * Returns : pointer to the Scsi_Cmnd structure for which the I_T_L
+ * Returns : pointer to the scsi_cmnd structure for which the I_T_L
* nexus has been reestablished, on failure NULL is returned.
*/
@@ -2562,11 +2563,11 @@ static void NCR5380_dma_complete(NCR5380
#endif /* def REAL_DMA */
/*
- * Function : int NCR5380_abort (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_abort (struct scsi_cmnd *cmd)
*
* Purpose : abort a command
*
- * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the
+ * Inputs : cmd - the scsi_cmnd to abort, code - code to set the
* host byte of the result field to, if zero DID_ABORTED is
* used.
*
@@ -2580,11 +2581,12 @@ static void NCR5380_dma_complete(NCR5380
* Locks: host lock taken by caller
*/
-static int NCR5380_abort(Scsi_Cmnd * cmd) {
+static int NCR5380_abort(struct scsi_cmnd *cmd)
+{
NCR5380_local_declare();
struct Scsi_Host *instance = cmd->device->host;
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
- Scsi_Cmnd *tmp, **prev;
+ struct scsi_cmnd *tmp, **prev;
printk(KERN_WARNING "scsi%d : aborting command\n", instance->host_no);
scsi_print_command(cmd);
@@ -2633,10 +2635,10 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
*/
dprintk(NDEBUG_ABORT, "scsi%d : abort going into loop.\n", instance->host_no);
- for (prev = (Scsi_Cmnd **) & (hostdata->issue_queue), tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp; prev = (Scsi_Cmnd **) & (tmp->host_scribble), tmp = (Scsi_Cmnd *) tmp->host_scribble)
+ 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) {
REMOVE(5, *prev, tmp, tmp->host_scribble);
- (*prev) = (Scsi_Cmnd *) tmp->host_scribble;
+ (*prev) = (struct scsi_cmnd *) tmp->host_scribble;
tmp->host_scribble = NULL;
tmp->result = DID_ABORT << 16;
dprintk(NDEBUG_ABORT, "scsi%d : abort removed command from issue queue.\n", instance->host_no);
@@ -2689,7 +2691,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
* it from the disconnected queue.
*/
- for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; tmp = (Scsi_Cmnd *) tmp->host_scribble)
+ 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);
@@ -2699,10 +2701,10 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
do_abort(instance);
- for (prev = (Scsi_Cmnd **) & (hostdata->disconnected_queue), tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; prev = (Scsi_Cmnd **) & (tmp->host_scribble), tmp = (Scsi_Cmnd *) tmp->host_scribble)
+ 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) {
REMOVE(5, *prev, tmp, tmp->host_scribble);
- *prev = (Scsi_Cmnd *) tmp->host_scribble;
+ *prev = (struct scsi_cmnd *) tmp->host_scribble;
tmp->host_scribble = NULL;
tmp->result = DID_ABORT << 16;
tmp->scsi_done(tmp);
@@ -2725,7 +2727,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
/*
- * Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_bus_reset (struct scsi_cmnd *cmd)
*
* Purpose : reset the SCSI bus.
*
@@ -2734,7 +2736,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd
* Locks: host lock taken by caller
*/
-static int NCR5380_bus_reset(Scsi_Cmnd * cmd)
+static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
{
struct Scsi_Host *instance = cmd->device->host;
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:36.000000000 +1100
@@ -255,9 +255,9 @@ struct NCR5380_hostdata {
volatile int dma_len; /* requested length of DMA */
#endif
volatile unsigned char last_message; /* last message OUT */
- volatile Scsi_Cmnd *connected; /* currently connected command */
- volatile Scsi_Cmnd *issue_queue; /* waiting to be issued */
- volatile Scsi_Cmnd *disconnected_queue; /* waiting for reconnect */
+ volatile struct scsi_cmnd *connected; /* currently connected command */
+ volatile struct scsi_cmnd *issue_queue; /* waiting to be issued */
+ volatile struct scsi_cmnd *disconnected_queue; /* waiting for reconnect */
volatile int restart_select; /* we have disconnected,
used to restart
NCR5380_select() */
@@ -265,7 +265,7 @@ struct NCR5380_hostdata {
int flags;
unsigned long time_expires; /* in jiffies, set prior to sleeping */
int select_time; /* timer in select for target response */
- volatile Scsi_Cmnd *selecting;
+ volatile struct scsi_cmnd *selecting;
struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses;
char info[256];
@@ -309,7 +309,7 @@ static irqreturn_t NCR5380_intr(int irq,
static void NCR5380_main(struct work_struct *work);
static const char *NCR5380_info(struct Scsi_Host *instance);
static void NCR5380_reselect(struct Scsi_Host *instance);
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd);
+static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd);
#if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
#endif
Index: linux/drivers/scsi/arm/cumana_1.c
===================================================================
--- linux.orig/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/arm/cumana_1.c 2014-10-27 16:25:36.000000000 +1100
@@ -13,7 +13,6 @@
#include <asm/ecard.h>
#include <asm/io.h>
-#include "../scsi.h"
#include <scsi/scsi_host.h>
#include <scsi/scsicam.h>
Index: linux/drivers/scsi/arm/oak.c
===================================================================
--- linux.orig/drivers/scsi/arm/oak.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/arm/oak.c 2014-10-27 16:25:36.000000000 +1100
@@ -14,7 +14,6 @@
#include <asm/ecard.h>
#include <asm/io.h>
-#include "../scsi.h"
#include <scsi/scsi_host.h>
/*#define PSEUDO_DMA*/
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
@@ -262,9 +262,9 @@ static struct scsi_host_template *the_te
(struct NCR5380_hostdata *)(in)->hostdata
#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata)
-#define NEXT(cmd) ((Scsi_Cmnd *)(cmd)->host_scribble)
+#define NEXT(cmd) ((struct scsi_cmnd *)(cmd)->host_scribble)
#define SET_NEXT(cmd,next) ((cmd)->host_scribble = (void *)(next))
-#define NEXTADDR(cmd) ((Scsi_Cmnd **)&(cmd)->host_scribble)
+#define NEXTADDR(cmd) ((struct scsi_cmnd **)&(cmd)->host_scribble)
#define HOSTNO instance->host_no
#define H_NO(cmd) (cmd)->device->host->host_no
@@ -345,7 +345,7 @@ static void __init init_tags(void)
* conditions.
*/
-static int is_lun_busy(Scsi_Cmnd *cmd, int should_be_tagged)
+static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged)
{
u8 lun = cmd->device->lun;
SETUP_HOSTDATA(cmd->device->host);
@@ -370,7 +370,7 @@ static int is_lun_busy(Scsi_Cmnd *cmd, i
* untagged.
*/
-static void cmd_get_tag(Scsi_Cmnd *cmd, int should_be_tagged)
+static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
{
u8 lun = cmd->device->lun;
SETUP_HOSTDATA(cmd->device->host);
@@ -402,7 +402,7 @@ static void cmd_get_tag(Scsi_Cmnd *cmd,
* unlock the LUN.
*/
-static void cmd_free_tag(Scsi_Cmnd *cmd)
+static void cmd_free_tag(struct scsi_cmnd *cmd)
{
u8 lun = cmd->device->lun;
SETUP_HOSTDATA(cmd->device->host);
@@ -445,18 +445,18 @@ static void free_all_tags(void)
/*
- * Function: void merge_contiguous_buffers( Scsi_Cmnd *cmd )
+ * Function: void merge_contiguous_buffers( struct scsi_cmnd *cmd )
*
* Purpose: Try to merge several scatter-gather requests into one DMA
* transfer. This is possible if the scatter buffers lie on
* physical contiguous addresses.
*
- * Parameters: Scsi_Cmnd *cmd
+ * Parameters: struct scsi_cmnd *cmd
* The command to work on. The first scatter buffer's data are
* assumed to be already transferred into ptr/this_residual.
*/
-static void merge_contiguous_buffers(Scsi_Cmnd *cmd)
+static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
{
unsigned long endaddr;
#if (NDEBUG & NDEBUG_MERGING)
@@ -485,15 +485,15 @@ static void merge_contiguous_buffers(Scs
}
/*
- * Function : void initialize_SCp(Scsi_Cmnd *cmd)
+ * Function : void initialize_SCp(struct scsi_cmnd *cmd)
*
* Purpose : initialize the saved data pointers for cmd to point to the
* start of the buffer.
*
- * Inputs : cmd - Scsi_Cmnd structure to have pointers reset.
+ * Inputs : cmd - scsi_cmnd structure to have pointers reset.
*/
-static inline void initialize_SCp(Scsi_Cmnd *cmd)
+static inline void initialize_SCp(struct scsi_cmnd *cmd)
{
/*
* Initialize the Scsi Pointer field so that all of the commands in the
@@ -714,7 +714,7 @@ static void prepare_info(struct Scsi_Hos
* Inputs : instance, pointer to this instance.
*/
-static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)
+static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd)
{
int i, s;
unsigned char *command;
@@ -731,7 +731,7 @@ static void lprint_Scsi_Cmnd(Scsi_Cmnd *
static void NCR5380_print_status(struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
- Scsi_Cmnd *ptr;
+ struct scsi_cmnd *ptr;
unsigned long flags;
NCR5380_dprint(NDEBUG_ANY, instance);
@@ -745,13 +745,13 @@ static void NCR5380_print_status(struct
if (!hostdata->connected)
printk("scsi%d: no currently connected command\n", HOSTNO);
else
- lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected);
+ lprint_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected);
printk("scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
+ for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
lprint_Scsi_Cmnd(ptr);
printk("scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
+ for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
ptr = NEXT(ptr))
lprint_Scsi_Cmnd(ptr);
@@ -759,7 +759,7 @@ static void NCR5380_print_status(struct
printk("\n");
}
-static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)
+static void show_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m)
{
int i, s;
unsigned char *command;
@@ -777,7 +777,7 @@ static int __maybe_unused NCR5380_show_i
struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
- Scsi_Cmnd *ptr;
+ struct scsi_cmnd *ptr;
unsigned long flags;
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
@@ -788,13 +788,13 @@ static int __maybe_unused NCR5380_show_i
if (!hostdata->connected)
seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
else
- show_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
+ show_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected, m);
seq_printf(m, "scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
+ for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
show_Scsi_Cmnd(ptr, m);
seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
+ for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
ptr = NEXT(ptr))
show_Scsi_Cmnd(ptr, m);
@@ -862,8 +862,8 @@ static void NCR5380_exit(struct Scsi_Hos
}
/*
- * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd,
- * void (*done)(Scsi_Cmnd *))
+ * Function : int NCR5380_queue_command (struct scsi_cmnd *cmd,
+ * void (*done)(struct scsi_cmnd *))
*
* Purpose : enqueues a SCSI command
*
@@ -879,10 +879,11 @@ static void NCR5380_exit(struct Scsi_Hos
*
*/
-static int NCR5380_queue_command_lck(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
+static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
+ void (*done)(struct scsi_cmnd *))
{
SETUP_HOSTDATA(cmd->device->host);
- Scsi_Cmnd *tmp;
+ struct scsi_cmnd *tmp;
unsigned long flags;
#if (NDEBUG & NDEBUG_NO_WRITE)
@@ -937,7 +938,7 @@ static int NCR5380_queue_command_lck(Scs
SET_NEXT(cmd, hostdata->issue_queue);
hostdata->issue_queue = cmd;
} else {
- for (tmp = (Scsi_Cmnd *)hostdata->issue_queue;
+ for (tmp = (struct scsi_cmnd *)hostdata->issue_queue;
NEXT(tmp); tmp = NEXT(tmp))
;
LIST(cmd, tmp);
@@ -978,7 +979,7 @@ static DEF_SCSI_QCMD(NCR5380_queue_comma
static void NCR5380_main(struct work_struct *work)
{
- Scsi_Cmnd *tmp, *prev;
+ struct scsi_cmnd *tmp, *prev;
struct Scsi_Host *instance = first_instance;
struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
int done;
@@ -1021,7 +1022,7 @@ static void NCR5380_main(struct work_str
* for a target that's not busy.
*/
#if (NDEBUG & NDEBUG_LISTS)
- for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL;
+ for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL;
tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp))
;
/*printk("%p ", tmp);*/
@@ -1029,7 +1030,7 @@ static void NCR5380_main(struct work_str
printk(" LOOP\n");
/* else printk("\n"); */
#endif
- for (tmp = (Scsi_Cmnd *) hostdata->issue_queue,
+ for (tmp = (struct scsi_cmnd *) hostdata->issue_queue,
prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
u8 lun = tmp->device->lun;
@@ -1291,7 +1292,8 @@ static irqreturn_t NCR5380_intr(int irq,
}
/*
- * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+ * Function : int NCR5380_select(struct Scsi_Host *instance,
+ * struct scsi_cmnd *cmd)
*
* Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
* including ARBITRATION, SELECTION, and initial message out for
@@ -1318,7 +1320,7 @@ static irqreturn_t NCR5380_intr(int irq,
* cmd->result host byte set to DID_BAD_TARGET.
*/
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
{
SETUP_HOSTDATA(instance);
unsigned char tmp[3], phase;
@@ -1917,7 +1919,7 @@ static void NCR5380_information_transfer
#endif
unsigned char *data;
unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
- Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
+ struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
while (1) {
tmp = NCR5380_read(STATUS_REG);
@@ -2154,7 +2156,7 @@ static void NCR5380_information_transfer
local_irq_save(flags);
LIST(cmd,hostdata->issue_queue);
SET_NEXT(cmd, hostdata->issue_queue);
- hostdata->issue_queue = (Scsi_Cmnd *) cmd;
+ hostdata->issue_queue = (struct scsi_cmnd *) cmd;
local_irq_restore(flags);
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
@@ -2378,7 +2380,7 @@ static void NCR5380_information_transfer
* Function : void NCR5380_reselect (struct Scsi_Host *instance)
*
* Purpose : does reselection, initializing the instance->connected
- * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q
+ * field to point to the scsi_cmnd for which the I_T_L or I_T_L_Q
* nexus has been reestablished,
*
* Inputs : instance - this instance of the NCR5380.
@@ -2397,7 +2399,7 @@ static void NCR5380_reselect(struct Scsi
#endif
unsigned char msg[3];
unsigned char *data;
- Scsi_Cmnd *tmp = NULL, *prev;
+ struct scsi_cmnd *tmp = NULL, *prev;
/* unsigned long flags; */
/*
@@ -2471,7 +2473,7 @@ static void NCR5380_reselect(struct Scsi
* just reestablished, and remove it from the disconnected queue.
*/
- for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL;
+ for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;
tmp; prev = tmp, tmp = NEXT(tmp)) {
if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun)
#ifdef SUPPORT_TAGS
@@ -2522,11 +2524,11 @@ static void NCR5380_reselect(struct Scsi
/*
- * Function : int NCR5380_abort (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_abort (struct scsi_cmnd *cmd)
*
* Purpose : abort a command
*
- * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the
+ * Inputs : cmd - the scsi_cmnd to abort, code - code to set the
* host byte of the result field to, if zero DID_ABORTED is
* used.
*
@@ -2539,11 +2541,11 @@ static void NCR5380_reselect(struct Scsi
*/
static
-int NCR5380_abort(Scsi_Cmnd *cmd)
+int NCR5380_abort(struct scsi_cmnd *cmd)
{
struct Scsi_Host *instance = cmd->device->host;
SETUP_HOSTDATA(instance);
- Scsi_Cmnd *tmp, **prev;
+ struct scsi_cmnd *tmp, **prev;
unsigned long flags;
printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO);
@@ -2613,8 +2615,8 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
* Case 2 : If the command hasn't been issued yet, we simply remove it
* from the issue queue.
*/
- for (prev = (Scsi_Cmnd **)&(hostdata->issue_queue),
- tmp = (Scsi_Cmnd *)hostdata->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) {
REMOVE(5, *prev, tmp, NEXT(tmp));
@@ -2674,7 +2676,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
* it from the disconnected queue.
*/
- for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp;
+ for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp;
tmp = NEXT(tmp)) {
if (cmd == tmp) {
local_irq_restore(flags);
@@ -2688,8 +2690,8 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
do_abort(instance);
local_irq_save(flags);
- for (prev = (Scsi_Cmnd **)&(hostdata->disconnected_queue),
- tmp = (Scsi_Cmnd *)hostdata->disconnected_queue;
+ 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) {
REMOVE(5, *prev, tmp, NEXT(tmp));
@@ -2738,7 +2740,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
/*
- * Function : int NCR5380_reset (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_reset (struct scsi_cmnd *cmd)
*
* Purpose : reset the SCSI bus.
*
@@ -2746,13 +2748,13 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
*
*/
-static int NCR5380_bus_reset(Scsi_Cmnd *cmd)
+static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
{
SETUP_HOSTDATA(cmd->device->host);
int i;
unsigned long flags;
#if defined(RESET_RUN_DONE)
- Scsi_Cmnd *connected, *disconnected_queue;
+ struct scsi_cmnd *connected, *disconnected_queue;
#endif
if (!IS_A_TT() && !falcon_got_lock)
@@ -2794,9 +2796,9 @@ static int NCR5380_bus_reset(Scsi_Cmnd *
* remembered in local variables first.
*/
local_irq_save(flags);
- connected = (Scsi_Cmnd *)hostdata->connected;
+ connected = (struct scsi_cmnd *)hostdata->connected;
hostdata->connected = NULL;
- disconnected_queue = (Scsi_Cmnd *)hostdata->disconnected_queue;
+ disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue;
hostdata->disconnected_queue = NULL;
#ifdef SUPPORT_TAGS
free_all_tags();
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:36.000000000 +1100
@@ -93,7 +93,6 @@
#include <asm/irq.h>
#include <asm/traps.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "atari_scsi.h"
#include "NCR5380.h"
@@ -880,7 +879,7 @@ static long atari_scsi_dma_residual(stru
#define CMD_SURELY_BYTE_MODE 1
#define CMD_MODE_UNKNOWN 2
-static int falcon_classify_cmd(Scsi_Cmnd *cmd)
+static int falcon_classify_cmd(struct scsi_cmnd *cmd)
{
unsigned char opcode = cmd->cmnd[0];
@@ -912,7 +911,7 @@ static int falcon_classify_cmd(Scsi_Cmnd
*/
static unsigned long atari_dma_xfer_len(unsigned long wanted_len,
- Scsi_Cmnd *cmd, int write_flag)
+ struct scsi_cmnd *cmd, int write_flag)
{
unsigned long possible_len, limit;
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:25:26.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:36.000000000 +1100
@@ -45,7 +45,6 @@
* Includes needed for NCR5380.[ch] (XXX: Move them to NCR5380.h)
*/
#include <linux/delay.h>
-#include "scsi.h"
#include "NCR5380.h"
#include "NCR5380.c"
Index: linux/drivers/scsi/dtc.c
===================================================================
--- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:36.000000000 +1100
@@ -58,7 +58,6 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/io.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "dtc.h"
#define AUTOPROBE_IRQ
Index: linux/drivers/scsi/g_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/g_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
@@ -72,7 +72,6 @@
#include <asm/io.h>
#include <linux/signal.h>
#include <linux/blkdev.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "g_NCR5380.h"
#include "NCR5380.h"
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:36.000000000 +1100
@@ -30,7 +30,6 @@
#include <asm/macints.h>
#include <asm/mac_via.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "mac_scsi.h"
Index: linux/drivers/scsi/pas16.c
===================================================================
--- linux.orig/drivers/scsi/pas16.c 2014-10-27 16:25:30.000000000 +1100
+++ linux/drivers/scsi/pas16.c 2014-10-27 16:25:36.000000000 +1100
@@ -81,7 +81,6 @@
#include <linux/stat.h>
#include <linux/init.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "pas16.h"
#define AUTOPROBE_IRQ
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
@@ -660,7 +660,7 @@ static void prepare_info(struct Scsi_Hos
* Inputs : instance, pointer to this instance.
*/
-static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)
+static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd)
{
int i, s;
unsigned char *command;
@@ -677,7 +677,7 @@ static void lprint_Scsi_Cmnd(Scsi_Cmnd *
static void NCR5380_print_status(struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
- Scsi_Cmnd *ptr;
+ struct scsi_cmnd *ptr;
unsigned long flags;
NCR5380_dprint(NDEBUG_ANY, instance);
@@ -691,13 +691,13 @@ static void NCR5380_print_status(struct
if (!hostdata->connected)
printk("scsi%d: no currently connected command\n", HOSTNO);
else
- lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected);
+ lprint_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected);
printk("scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
+ for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
lprint_Scsi_Cmnd(ptr);
printk("scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
+ for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
ptr = NEXT(ptr))
lprint_Scsi_Cmnd(ptr);
@@ -705,7 +705,7 @@ static void NCR5380_print_status(struct
printk("\n");
}
-static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)
+static void show_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m)
{
int i, s;
unsigned char *command;
@@ -723,7 +723,7 @@ static int __maybe_unused NCR5380_show_i
struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata;
- Scsi_Cmnd *ptr;
+ struct scsi_cmnd *ptr;
unsigned long flags;
hostdata = (struct NCR5380_hostdata *)instance->hostdata;
@@ -734,13 +734,13 @@ static int __maybe_unused NCR5380_show_i
if (!hostdata->connected)
seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
else
- show_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
+ show_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected, m);
seq_printf(m, "scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
+ for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
show_Scsi_Cmnd(ptr, m);
seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
+ for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
ptr = NEXT(ptr))
show_Scsi_Cmnd(ptr, m);
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:36.000000000 +1100
@@ -43,7 +43,6 @@
/* dma on! */
#define REAL_DMA
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "sun3_scsi.h"
#include "NCR5380.h"
Index: linux/drivers/scsi/t128.c
===================================================================
--- linux.orig/drivers/scsi/t128.c 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/t128.c 2014-10-27 16:25:36.000000000 +1100
@@ -77,7 +77,6 @@
#include <linux/module.h>
#include <linux/delay.h>
-#include "scsi.h"
#include <scsi/scsi_host.h>
#include "t128.h"
#define AUTOPROBE_IRQ
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 17/36] dmx3191d: Use NO_IRQ
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (15 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:38 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 18/36] mac_scsi: Remove header Finn Thain
` (19 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: dmx3191d-dont-request-irq --]
[-- Type: text/plain, Size: 2450 bytes --]
Testing shows that the Domex 3191D card never asserts its IRQ. Hence it is
non-functional with Linux (worse, the EH bugs in the core driver are fatal
but that's a problem for another patch). Perhaps the DT-536 chip needs
special setup? I can't find documentation for it. The NetBSD driver uses
polling apparently because of this issue.
Set host->irq = NO_IRQ so the core driver will prevent targets from
disconnecting. Don't request host->irq.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Use NO_IRQ instead of IRQ_NONE.
---
drivers/scsi/dmx3191d.c | 25 ++++++++-----------------
1 file changed, 8 insertions(+), 17 deletions(-)
Index: linux/drivers/scsi/dmx3191d.c
===================================================================
--- linux.orig/drivers/scsi/dmx3191d.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/dmx3191d.c 2014-10-27 16:25:40.000000000 +1100
@@ -34,6 +34,8 @@
* Definitions for the generic 5380 driver.
*/
+#define DONT_USE_INTR
+
#define NCR5380_read(reg) inb(port + reg)
#define NCR5380_write(reg, value) outb(value, port + reg)
@@ -89,32 +91,23 @@ static int dmx3191d_probe_one(struct pci
if (!shost)
goto out_release_region;
shost->io_port = io;
- shost->irq = pdev->irq;
- NCR5380_init(shost, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E);
+ /* This card does not seem to raise an interrupt on pdev->irq.
+ * Steam-powered SCSI controllers run without an IRQ anyway.
+ */
+ shost->irq = NO_IRQ;
- if (request_irq(pdev->irq, NCR5380_intr, IRQF_SHARED,
- DMX3191D_DRIVER_NAME, shost)) {
- /*
- * Steam powered scsi controllers run without an IRQ anyway
- */
- printk(KERN_WARNING "dmx3191: IRQ %d not available - "
- "switching to polled mode.\n", pdev->irq);
- shost->irq = NO_IRQ;
- }
+ NCR5380_init(shost, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E);
pci_set_drvdata(pdev, shost);
error = scsi_add_host(shost, &pdev->dev);
if (error)
- goto out_free_irq;
+ goto out_release_region;
scsi_scan_host(shost);
return 0;
- out_free_irq:
- if (shost->irq != NO_IRQ)
- free_irq(shost->irq, shost);
out_release_region:
release_region(io, DMX3191D_REGION_LEN);
out_disable_device:
@@ -131,8 +124,6 @@ static void dmx3191d_remove_one(struct p
NCR5380_exit(shost);
- if (shost->irq != NO_IRQ)
- free_irq(shost->irq, shost);
release_region(shost->io_port, DMX3191D_REGION_LEN);
pci_disable_device(pdev);
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 18/36] mac_scsi: Remove header
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (16 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 17/36] dmx3191d: Use NO_IRQ Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:39 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 19/36] mac_scsi: Add module option to Kconfig Finn Thain
` (18 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: mac_scsi-remove-header --]
[-- Type: text/plain, Size: 3106 bytes --]
The #defines in mac_scsi.h are intended to influence subsequent #includes in
mac_scsi.c. IMHO, that's too convoluted.
Remove mac_scsi.h by moving those macro definitions to mac_scsi.c,
consistent with other NCR5380 drivers.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/mac_scsi.c | 21 ++++++++++++++++++++-
drivers/scsi/mac_scsi.h | 42 ------------------------------------------
2 files changed, 20 insertions(+), 43 deletions(-)
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
@@ -31,10 +31,29 @@
#include <asm/mac_via.h>
#include <scsi/scsi_host.h>
-#include "mac_scsi.h"
+
+/* Definitions for the core NCR5380 driver. */
#define PSEUDO_DMA
+#define NCR5380_implementation_fields /* none */
+#define NCR5380_local_declare() struct Scsi_Host *_instance
+#define NCR5380_setup(instance) _instance = instance
+
+#define NCR5380_read(reg) macscsi_read(_instance, reg)
+#define NCR5380_write(reg, value) macscsi_write(_instance, reg, value)
+
+#define NCR5380_pread macscsi_pread
+#define NCR5380_pwrite macscsi_pwrite
+
+#define NCR5380_intr macscsi_intr
+#define NCR5380_queue_command macscsi_queue_command
+#define NCR5380_abort macscsi_abort
+#define NCR5380_bus_reset macscsi_bus_reset
+#define NCR5380_info macscsi_info
+#define NCR5380_show_info macscsi_show_info
+#define NCR5380_write_info macscsi_write_info
+
#include "NCR5380.h"
#define RESET_BOOT
Index: linux/drivers/scsi/mac_scsi.h
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.h 2014-10-27 16:25:33.000000000 +1100
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,42 +0,0 @@
-/*
- * Cumana Generic NCR5380 driver defines
- *
- * Copyright 1993, Drew Eckhardt
- * Visionary Computing
- * (Unix and Linux consulting and custom programming)
- * drew@colorado.edu
- * +1 (303) 440-4894
- */
-
-#ifndef MAC_NCR5380_H
-#define MAC_NCR5380_H
-
-#ifndef ASM
-
-#include <scsi/scsicam.h>
-
-#define NCR5380_implementation_fields /* none */
-
-#define NCR5380_local_declare() \
- struct Scsi_Host *_instance
-
-#define NCR5380_setup(instance) \
- _instance = instance
-
-#define NCR5380_read(reg) macscsi_read(_instance, reg)
-#define NCR5380_write(reg, value) macscsi_write(_instance, reg, value)
-
-#define NCR5380_pread macscsi_pread
-#define NCR5380_pwrite macscsi_pwrite
-
-#define NCR5380_intr macscsi_intr
-#define NCR5380_queue_command macscsi_queue_command
-#define NCR5380_abort macscsi_abort
-#define NCR5380_bus_reset macscsi_bus_reset
-#define NCR5380_info macscsi_info
-#define NCR5380_show_info macscsi_show_info
-#define NCR5380_write_info macscsi_write_info
-
-#endif /* ndef ASM */
-#endif /* MAC_NCR5380_H */
-
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (17 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 18/36] mac_scsi: Remove header Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:44 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 20/36] mac_scsi: Cleanup PDMA code Finn Thain
` (17 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: mac_scsi-module-option --]
[-- Type: text/plain, Size: 5622 bytes --]
Allow mac_scsi to be built as a module. Replace the old validation of
__setup options with code that validates both module and __setup options.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/Kconfig | 2
drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
2 files changed, 38 insertions(+), 76 deletions(-)
Index: linux/drivers/scsi/Kconfig
===================================================================
--- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
+++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
@@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
that leave the devices with SCSI operations partway completed.
config MAC_SCSI
- bool "Macintosh NCR5380 SCSI"
+ tristate "Macintosh NCR5380 SCSI"
depends on MAC && SCSI=y
select SCSI_SPI_ATTRS
help
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
@@ -62,15 +62,18 @@
static void mac_scsi_reset_boot(struct Scsi_Host *instance);
#endif
-static int setup_called = 0;
static int setup_can_queue = -1;
+module_param(setup_can_queue, int, 0);
static int setup_cmd_per_lun = -1;
+module_param(setup_cmd_per_lun, int, 0);
static int setup_sg_tablesize = -1;
+module_param(setup_sg_tablesize, int, 0);
static int setup_use_pdma = -1;
-#ifdef SUPPORT_TAGS
+module_param(setup_use_pdma, int, 0);
static int setup_use_tagged_queuing = -1;
-#endif
+module_param(setup_use_tagged_queuing, int, 0);
static int setup_hostid = -1;
+module_param(setup_hostid, int, 0);
/* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
* we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
@@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
out_8(instance->io_port + (reg<<4), value);
}
-/*
- * Function : mac_scsi_setup(char *str)
- *
- * Purpose : booter command line initialization of the overrides array,
- *
- * Inputs : str - comma delimited list of options
- *
- */
-
-static int __init mac_scsi_setup(char *str) {
+#ifndef MODULE
+static int __init mac_scsi_setup(char *str)
+{
int ints[7];
-
- (void)get_options( str, ARRAY_SIZE(ints), ints);
-
- if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
- printk(KERN_WARNING "scsi: <mac5380>"
- " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
- printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
- return 0;
- }
-
- if (ints[0] >= 1) {
- if (ints[1] > 0)
- /* no limits on this, just > 0 */
- setup_can_queue = ints[1];
- }
- if (ints[0] >= 2) {
- if (ints[2] > 0)
- setup_cmd_per_lun = ints[2];
- }
- if (ints[0] >= 3) {
- if (ints[3] >= 0) {
- setup_sg_tablesize = ints[3];
- /* Must be <= SG_ALL (255) */
- if (setup_sg_tablesize > SG_ALL)
- setup_sg_tablesize = SG_ALL;
- }
- }
- if (ints[0] >= 4) {
- /* Must be between 0 and 7 */
- if (ints[4] >= 0 && ints[4] <= 7)
- setup_hostid = ints[4];
- else if (ints[4] > 7)
- printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
- }
-#ifdef SUPPORT_TAGS
- if (ints[0] >= 5) {
- if (ints[5] >= 0)
- setup_use_tagged_queuing = !!ints[5];
+
+ (void)get_options(str, ARRAY_SIZE(ints), ints);
+
+ if (ints[0] < 1 || ints[0] > 6) {
+ pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
+ return 0;
}
-
- if (ints[0] == 6) {
- if (ints[6] >= 0)
+ if (ints[0] >= 1)
+ setup_can_queue = ints[1];
+ if (ints[0] >= 2)
+ setup_cmd_per_lun = ints[2];
+ if (ints[0] >= 3)
+ setup_sg_tablesize = ints[3];
+ if (ints[0] >= 4)
+ setup_hostid = ints[4];
+ if (ints[0] >= 5)
+ setup_use_tagged_queuing = ints[5];
+ if (ints[0] >= 6)
setup_use_pdma = ints[6];
- }
-#else
- if (ints[0] == 5) {
- if (ints[5] >= 0)
- setup_use_pdma = ints[5];
- }
-#endif /* SUPPORT_TAGS */
-
return 1;
}
__setup("mac5380=", mac_scsi_setup);
+#endif /* !MODULE */
/*
* Function : int macscsi_detect(struct scsi_host_template * tpnt)
@@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
tpnt->cmd_per_lun = setup_cmd_per_lun;
if (setup_sg_tablesize >= 0)
tpnt->sg_tablesize = setup_sg_tablesize;
-
- if (setup_hostid >= 0)
- tpnt->this_id = setup_hostid;
- else {
- /* use 7 as default */
- tpnt->this_id = 7;
- }
+ if (setup_hostid >= 0)
+ tpnt->this_id = setup_hostid & 7;
#ifdef SUPPORT_TAGS
if (setup_use_tagged_queuing < 0)
@@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
return 0;
if (macintosh_config->ident == MAC_MODEL_IIFX) {
- mac_scsi_regp = via1+0x8000;
- mac_scsi_drq = via1+0xE000;
- mac_scsi_nodrq = via1+0xC000;
+ mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
+ mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
+ mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
/* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
flags = FLAG_NO_PSEUDO_DMA;
} else {
- mac_scsi_regp = via1+0x10000;
- mac_scsi_drq = via1+0x6000;
- mac_scsi_nodrq = via1+0x12000;
+ mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
+ mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
+ mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
}
if (! setup_use_pdma)
@@ -520,3 +480,5 @@ static struct scsi_host_template driver_
#include "scsi_module.c"
+
+MODULE_LICENSE("GPL");
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 20/36] mac_scsi: Cleanup PDMA code
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (18 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 19/36] mac_scsi: Add module option to Kconfig Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:46 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 21/36] mac_scsi: Convert to platform device Finn Thain
` (16 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: mac_scsi-pdma-cleanup --]
[-- Type: text/plain, Size: 4435 bytes --]
Fix whitespace, remove pointless volatile qualifiers and improve code style
by use of INPUT_DATA_REG and OUTPUT_DATA_REG macros.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/mac_scsi.c | 122 ++++++++++++++++++++++++------------------------
1 file changed, 62 insertions(+), 60 deletions(-)
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:43.000000000 +1100
@@ -86,9 +86,9 @@ module_param(setup_hostid, int, 0);
#define AFTER_RESET_DELAY (HZ/2)
#endif
-static volatile unsigned char *mac_scsi_regp = NULL;
-static volatile unsigned char *mac_scsi_drq = NULL;
-static volatile unsigned char *mac_scsi_nodrq = NULL;
+static unsigned char *mac_scsi_regp;
+static unsigned char *mac_scsi_drq;
+static unsigned char *mac_scsi_nodrq;
/*
@@ -262,6 +262,7 @@ static void mac_scsi_reset_boot(struct S
}
#endif
+#ifdef PSEUDO_DMA
/*
Pseudo-DMA: (Ove Edlund)
The code attempts to catch bus errors that occur if one for example
@@ -331,38 +332,38 @@ __asm__ __volatile__ \
: "0"(s), "1"(d), "2"(len) \
: "d0")
-
-static int macscsi_pread (struct Scsi_Host *instance,
- unsigned char *dst, int len)
+static int macscsi_pread(struct Scsi_Host *instance,
+ unsigned char *dst, int len)
{
- unsigned char *d;
- volatile unsigned char *s;
+ unsigned char *d;
+ unsigned char *s;
+
+ NCR5380_local_declare();
+ NCR5380_setup(instance);
+
+ s = mac_scsi_drq + (INPUT_DATA_REG << 4);
+ d = dst;
- NCR5380_local_declare();
- NCR5380_setup(instance);
+ /* These conditions are derived from MacOS */
- s = mac_scsi_drq+0x60;
- d = dst;
+ while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
+ !(NCR5380_read(STATUS_REG) & SR_REQ))
+ ;
+
+ if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
+ (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
+ pr_err("Error in macscsi_pread\n");
+ return -1;
+ }
-/* These conditions are derived from MacOS */
-
- while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
- && !(NCR5380_read(STATUS_REG) & SR_REQ))
- ;
- if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
- && (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
- printk(KERN_ERR "Error in macscsi_pread\n");
- return -1;
- }
-
- CP_IO_TO_MEM(s, d, len);
-
- if (len != 0) {
- printk(KERN_NOTICE "Bus error in macscsi_pread\n");
- return -1;
- }
-
- return 0;
+ CP_IO_TO_MEM(s, d, len);
+
+ if (len != 0) {
+ pr_notice("Bus error in macscsi_pread\n");
+ return -1;
+ }
+
+ return 0;
}
@@ -424,39 +425,40 @@ __asm__ __volatile__ \
: "0"(s), "1"(d), "2"(len) \
: "d0")
-static int macscsi_pwrite (struct Scsi_Host *instance,
- unsigned char *src, int len)
+static int macscsi_pwrite(struct Scsi_Host *instance,
+ unsigned char *src, int len)
{
- unsigned char *s;
- volatile unsigned char *d;
+ unsigned char *s;
+ unsigned char *d;
+
+ NCR5380_local_declare();
+ NCR5380_setup(instance);
- NCR5380_local_declare();
- NCR5380_setup(instance);
+ s = src;
+ d = mac_scsi_drq + (OUTPUT_DATA_REG << 4);
- s = src;
- d = mac_scsi_drq;
-
-/* These conditions are derived from MacOS */
-
- while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
- && (!(NCR5380_read(STATUS_REG) & SR_REQ)
- || (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
- ;
- if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
- printk(KERN_ERR "Error in macscsi_pwrite\n");
- return -1;
- }
-
- CP_MEM_TO_IO(s, d, len);
-
- if (len != 0) {
- printk(KERN_NOTICE "Bus error in macscsi_pwrite\n");
- return -1;
- }
-
- return 0;
-}
+ /* These conditions are derived from MacOS */
+
+ while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
+ (!(NCR5380_read(STATUS_REG) & SR_REQ) ||
+ (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
+ ;
+
+ if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
+ pr_err("Error in macscsi_pwrite\n");
+ return -1;
+ }
+
+ CP_MEM_TO_IO(s, d, len);
+ if (len != 0) {
+ pr_notice("Bus error in macscsi_pwrite\n");
+ return -1;
+ }
+
+ return 0;
+}
+#endif
#include "NCR5380.c"
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 21/36] mac_scsi: Convert to platform device
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (19 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 20/36] mac_scsi: Cleanup PDMA code Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 7:55 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
` (15 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
[-- Attachment #1: mac_scsi-convert-to-platform-device --]
[-- Type: text/plain, Size: 19335 bytes --]
Convert mac_scsi to platform device and eliminate scsi_register().
Platform resources for chip registers now follow the documentation. This
should fix issues with the Mac IIci (and possibly other models too).
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
The new hwreg_present() call site is not protected by local_irq_save/restore.
This assumes Geert's patch, "Disable/restore interrupts in
hwreg_present()/hwreg_write()", which is commit e4dc601bf99ccd1c in 3.18-rc1.
Changes since v1:
- Use NO_IRQ instead of IRQ_NONE.
- Drop unnecessary MACH_IS_MAC() test.
- Remove static platform_device structs and call
platform_device_register_simple() instead of platform_device_register().
- Platform resources now const and __initconst.
- Add MAC_SCSI_LATE platform resources to avoid PDMA on certain models.
---
arch/m68k/include/asm/macintosh.h | 4
arch/m68k/mac/config.c | 146 ++++++++++++++++++++--
drivers/scsi/mac_scsi.c | 245 +++++++++++++++++++-------------------
3 files changed, 262 insertions(+), 133 deletions(-)
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:43.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:44.000000000 +1100
@@ -12,23 +12,18 @@
*/
#include <linux/types.h>
-#include <linux/stddef.h>
-#include <linux/ctype.h>
#include <linux/delay.h>
-
#include <linux/module.h>
-#include <linux/signal.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/hwtest.h>
#include <asm/io.h>
-#include <asm/irq.h>
-
-#include <asm/macintosh.h>
#include <asm/macints.h>
-#include <asm/mac_via.h>
+#include <asm/setup.h>
#include <scsi/scsi_host.h>
@@ -36,7 +31,7 @@
#define PSEUDO_DMA
-#define NCR5380_implementation_fields /* none */
+#define NCR5380_implementation_fields unsigned char *pdma_base
#define NCR5380_local_declare() struct Scsi_Host *_instance
#define NCR5380_setup(instance) _instance = instance
@@ -58,10 +53,6 @@
#define RESET_BOOT
-#ifdef RESET_BOOT
-static void mac_scsi_reset_boot(struct Scsi_Host *instance);
-#endif
-
static int setup_can_queue = -1;
module_param(setup_can_queue, int, 0);
static int setup_cmd_per_lun = -1;
@@ -86,23 +77,18 @@ module_param(setup_hostid, int, 0);
#define AFTER_RESET_DELAY (HZ/2)
#endif
-static unsigned char *mac_scsi_regp;
-static unsigned char *mac_scsi_drq;
-static unsigned char *mac_scsi_nodrq;
-
-
/*
* NCR 5380 register access functions
*/
-static __inline__ char macscsi_read(struct Scsi_Host *instance, int reg)
+static inline char macscsi_read(struct Scsi_Host *instance, int reg)
{
- return in_8(instance->io_port + (reg<<4));
+ return in_8(instance->base + (reg << 4));
}
-static __inline__ void macscsi_write(struct Scsi_Host *instance, int reg, int value)
+static inline void macscsi_write(struct Scsi_Host *instance, int reg, int value)
{
- out_8(instance->io_port + (reg<<4), value);
+ out_8(instance->base + (reg << 4), value);
}
#ifndef MODULE
@@ -134,96 +120,6 @@ static int __init mac_scsi_setup(char *s
__setup("mac5380=", mac_scsi_setup);
#endif /* !MODULE */
-/*
- * Function : int macscsi_detect(struct scsi_host_template * tpnt)
- *
- * Purpose : initializes mac NCR5380 driver based on the
- * command line / compile time port and irq definitions.
- *
- * Inputs : tpnt - template for this SCSI adapter.
- *
- * Returns : 1 if a host adapter was found, 0 if not.
- *
- */
-
-int __init macscsi_detect(struct scsi_host_template * tpnt)
-{
- static int called = 0;
- int flags = 0;
- struct Scsi_Host *instance;
-
- if (!MACH_IS_MAC || called)
- return( 0 );
-
- if (macintosh_config->scsi_type != MAC_SCSI_OLD)
- return( 0 );
-
- if (setup_can_queue > 0)
- tpnt->can_queue = setup_can_queue;
- if (setup_cmd_per_lun > 0)
- tpnt->cmd_per_lun = setup_cmd_per_lun;
- if (setup_sg_tablesize >= 0)
- tpnt->sg_tablesize = setup_sg_tablesize;
- if (setup_hostid >= 0)
- tpnt->this_id = setup_hostid & 7;
-
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 0;
-#endif
-
- /* Once we support multiple 5380s (e.g. DuoDock) we'll do
- something different here */
- instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
- if (instance == NULL)
- return 0;
-
- if (macintosh_config->ident == MAC_MODEL_IIFX) {
- mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
- mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
- mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
- /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
- flags = FLAG_NO_PSEUDO_DMA;
- } else {
- mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
- mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
- mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
- }
-
- if (! setup_use_pdma)
- flags = FLAG_NO_PSEUDO_DMA;
-
- instance->io_port = (unsigned long) mac_scsi_regp;
- instance->irq = IRQ_MAC_SCSI;
-
-#ifdef RESET_BOOT
- mac_scsi_reset_boot(instance);
-#endif
-
- NCR5380_init(instance, flags);
-
- instance->n_io_port = 255;
-
- if (instance->irq != NO_IRQ)
- if (request_irq(instance->irq, NCR5380_intr, 0, "ncr5380", instance)) {
- printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n",
- instance->host_no, instance->irq);
- instance->irq = NO_IRQ;
- }
-
- called = 1;
- return 1;
-}
-
-int macscsi_release (struct Scsi_Host *shpnt)
-{
- if (shpnt->irq != NO_IRQ)
- free_irq(shpnt->irq, shpnt);
- NCR5380_exit(shpnt);
-
- return 0;
-}
-
#ifdef RESET_BOOT
/*
* Our 'bus reset on boot' function
@@ -335,13 +231,14 @@ __asm__ __volatile__ \
static int macscsi_pread(struct Scsi_Host *instance,
unsigned char *dst, int len)
{
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
unsigned char *d;
unsigned char *s;
NCR5380_local_declare();
NCR5380_setup(instance);
- s = mac_scsi_drq + (INPUT_DATA_REG << 4);
+ s = hostdata->pdma_base + (INPUT_DATA_REG << 4);
d = dst;
/* These conditions are derived from MacOS */
@@ -428,6 +325,7 @@ __asm__ __volatile__ \
static int macscsi_pwrite(struct Scsi_Host *instance,
unsigned char *src, int len)
{
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
unsigned char *s;
unsigned char *d;
@@ -435,7 +333,7 @@ static int macscsi_pwrite(struct Scsi_Ho
NCR5380_setup(instance);
s = src;
- d = mac_scsi_drq + (OUTPUT_DATA_REG << 4);
+ d = hostdata->pdma_base + (OUTPUT_DATA_REG << 4);
/* These conditions are derived from MacOS */
@@ -462,13 +360,15 @@ static int macscsi_pwrite(struct Scsi_Ho
#include "NCR5380.c"
-static struct scsi_host_template driver_template = {
- .proc_name = "Mac5380",
+#define DRV_MODULE_NAME "mac_scsi"
+#define PFX DRV_MODULE_NAME ": "
+
+static struct scsi_host_template mac_scsi_template = {
+ .module = THIS_MODULE,
+ .proc_name = DRV_MODULE_NAME,
.show_info = macscsi_show_info,
.write_info = macscsi_write_info,
.name = "Macintosh NCR5380 SCSI",
- .detect = macscsi_detect,
- .release = macscsi_release,
.info = macscsi_info,
.queuecommand = macscsi_queue_command,
.eh_abort_handler = macscsi_abort,
@@ -480,7 +380,114 @@ static struct scsi_host_template driver_
.use_clustering = DISABLE_CLUSTERING
};
+static int __init mac_scsi_probe(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance;
+ int error;
+ int host_flags = 0;
+ struct resource *irq, *pio_mem, *pdma_mem = NULL;
+
+ pio_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!pio_mem)
+ return -ENODEV;
+
+#ifdef PSEUDO_DMA
+ pdma_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+#endif
+
+ irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+
+ if (!hwreg_present((unsigned char *)pio_mem->start +
+ (STATUS_REG << 4))) {
+ pr_info(PFX "no device detected at %pap\n", &pio_mem->start);
+ return -ENODEV;
+ }
+
+ if (setup_can_queue > 0)
+ mac_scsi_template.can_queue = setup_can_queue;
+ if (setup_cmd_per_lun > 0)
+ mac_scsi_template.cmd_per_lun = setup_cmd_per_lun;
+ if (setup_sg_tablesize >= 0)
+ mac_scsi_template.sg_tablesize = setup_sg_tablesize;
+ if (setup_hostid >= 0)
+ mac_scsi_template.this_id = setup_hostid & 7;
+#ifdef SUPPORT_TAGS
+ if (setup_use_tagged_queuing < 0)
+ setup_use_tagged_queuing = 0;
+#endif
+ if (setup_use_pdma < 0)
+ setup_use_pdma = 0;
+
+ instance = scsi_host_alloc(&mac_scsi_template,
+ sizeof(struct NCR5380_hostdata));
+ if (!instance)
+ return -ENOMEM;
+
+ instance->base = pio_mem->start;
+ if (irq)
+ instance->irq = irq->start;
+ else
+ instance->irq = NO_IRQ;
+
+ if (pdma_mem && setup_use_pdma) {
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ hostdata->pdma_base = (unsigned char *)pdma_mem->start;
+ } else
+ host_flags |= FLAG_NO_PSEUDO_DMA;
+
+#ifdef RESET_BOOT
+ mac_scsi_reset_boot(instance);
+#endif
+
+ NCR5380_init(instance, host_flags);
+
+ if (instance->irq != NO_IRQ) {
+ error = request_irq(instance->irq, macscsi_intr, IRQF_SHARED,
+ "NCR5380", instance);
+ if (error)
+ goto fail_irq;
+ }
+
+ error = scsi_add_host(instance, NULL);
+ if (error)
+ goto fail_host;
+
+ platform_set_drvdata(pdev, instance);
+
+ scsi_scan_host(instance);
+ return 0;
+
+fail_host:
+ if (instance->irq != NO_IRQ)
+ free_irq(instance->irq, instance);
+fail_irq:
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+ return error;
+}
+
+static int __exit mac_scsi_remove(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance = platform_get_drvdata(pdev);
+
+ scsi_remove_host(instance);
+ if (instance->irq != NO_IRQ)
+ free_irq(instance->irq, instance);
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+ return 0;
+}
+
+static struct platform_driver mac_scsi_driver = {
+ .remove = __exit_p(mac_scsi_remove),
+ .driver = {
+ .name = DRV_MODULE_NAME,
+ .owner = THIS_MODULE,
+ },
+};
-#include "scsi_module.c"
+module_platform_driver_probe(mac_scsi_driver, mac_scsi_probe);
+MODULE_ALIAS("platform:" DRV_MODULE_NAME);
MODULE_LICENSE("GPL");
Index: linux/arch/m68k/mac/config.c
===================================================================
--- linux.orig/arch/m68k/mac/config.c 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/mac/config.c 2014-10-27 16:25:44.000000000 +1100
@@ -278,7 +278,7 @@ static struct mac_model mac_data_table[]
.name = "IIfx",
.adb_type = MAC_ADB_IOP,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_IIFX,
.scc_type = MAC_SCC_IOP,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_IOP,
@@ -329,7 +329,7 @@ static struct mac_model mac_data_table[]
.name = "Color Classic",
.adb_type = MAC_ADB_CUDA,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_CCL,
.scc_type = MAC_SCC_II,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -338,7 +338,7 @@ static struct mac_model mac_data_table[]
.name = "Color Classic II",
.adb_type = MAC_ADB_CUDA,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_CCL,
.scc_type = MAC_SCC_II,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -526,7 +526,7 @@ static struct mac_model mac_data_table[]
.name = "Performa 520",
.adb_type = MAC_ADB_CUDA,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_CCL,
.scc_type = MAC_SCC_II,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -535,7 +535,7 @@ static struct mac_model mac_data_table[]
.name = "Performa 550",
.adb_type = MAC_ADB_CUDA,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_CCL,
.scc_type = MAC_SCC_II,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -567,7 +567,7 @@ static struct mac_model mac_data_table[]
.name = "TV",
.adb_type = MAC_ADB_CUDA,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_CCL,
.scc_type = MAC_SCC_II,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -712,7 +712,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook 190",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_QUADRA,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_LATE,
.ide_type = MAC_IDE_BABOON,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
@@ -722,7 +722,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook 520",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_QUADRA,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_LATE,
.scc_type = MAC_SCC_QUADRA,
.ether_type = MAC_ETHER_SONIC,
.nubus_type = MAC_NUBUS,
@@ -740,7 +740,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 210",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -749,7 +749,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 230",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -758,7 +758,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 250",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -767,7 +767,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 270c",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -776,7 +776,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 280",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -785,7 +785,7 @@ static struct mac_model mac_data_table[]
.name = "PowerBook Duo 280c",
.adb_type = MAC_ADB_PB2,
.via_type = MAC_VIA_IICI,
- .scsi_type = MAC_SCSI_OLD,
+ .scsi_type = MAC_SCSI_DUO,
.scc_type = MAC_SCC_QUADRA,
.nubus_type = MAC_NUBUS,
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
@@ -929,6 +929,70 @@ static struct platform_device swim_pdev
.resource = &swim_rsrc,
};
+static const struct resource mac_scsi_iifx_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_MAC_SCSI,
+ .end = IRQ_MAC_SCSI,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50008000,
+ .end = 0x50009FFF,
+ },
+};
+
+static const struct resource mac_scsi_duo_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_MEM,
+ .start = 0xFEE02000,
+ .end = 0xFEE03FFF,
+ },
+};
+
+static const struct resource mac_scsi_old_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_MAC_SCSI,
+ .end = IRQ_MAC_SCSI,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50010000,
+ .end = 0x50011FFF,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50006000,
+ .end = 0x50007FFF,
+ },
+};
+
+static const struct resource mac_scsi_late_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_MAC_SCSI,
+ .end = IRQ_MAC_SCSI,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50010000,
+ .end = 0x50011FFF,
+ },
+};
+
+static const struct resource mac_scsi_ccl_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_MAC_SCSI,
+ .end = IRQ_MAC_SCSI,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50F10000,
+ .end = 0x50F11FFF,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x50F06000,
+ .end = 0x50F07FFF,
+ },
+};
+
static struct platform_device esp_0_pdev = {
.name = "mac_esp",
.id = 0,
@@ -1000,6 +1064,60 @@ int __init mac_platform_init(void)
(macintosh_config->ident == MAC_MODEL_Q950))
platform_device_register(&esp_1_pdev);
break;
+ case MAC_SCSI_IIFX:
+ /* Addresses from The Guide to Mac Family Hardware.
+ * $5000 8000 - $5000 9FFF: SCSI DMA
+ * $5000 C000 - $5000 DFFF: Alternate SCSI (DMA)
+ * $5000 E000 - $5000 FFFF: Alternate SCSI (Hsk)
+ * The SCSI DMA custom IC embeds the 53C80 core. mac_scsi does
+ * not make use of its DMA or hardware handshaking logic.
+ */
+ platform_device_register_simple("mac_scsi", 0,
+ mac_scsi_iifx_rsrc, ARRAY_SIZE(mac_scsi_iifx_rsrc));
+ break;
+ case MAC_SCSI_DUO:
+ /* Addresses from the Duo Dock II Developer Note.
+ * $FEE0 2000 - $FEE0 3FFF: normal mode
+ * $FEE0 4000 - $FEE0 5FFF: pseudo DMA without /DRQ
+ * $FEE0 6000 - $FEE0 7FFF: pseudo DMA with /DRQ
+ * The NetBSD code indicates that both 5380 chips share
+ * an IRQ (?) which would need careful handling (see mac_esp).
+ */
+ platform_device_register_simple("mac_scsi", 1,
+ mac_scsi_duo_rsrc, ARRAY_SIZE(mac_scsi_duo_rsrc));
+ /* fall through */
+ case MAC_SCSI_OLD:
+ /* Addresses from Developer Notes for Duo System,
+ * PowerBook 180 & 160, 140 & 170, Macintosh IIsi
+ * and also from The Guide to Mac Family Hardware for
+ * SE/30, II, IIx, IIcx, IIci.
+ * $5000 6000 - $5000 7FFF: pseudo-DMA with /DRQ
+ * $5001 0000 - $5001 1FFF: normal mode
+ * $5001 2000 - $5001 3FFF: pseudo-DMA without /DRQ
+ * GMFH says that $5000 0000 - $50FF FFFF "wraps
+ * $5000 0000 - $5001 FFFF eight times" (!)
+ * mess.org says IIci and Color Classic do not alias
+ * I/O address space.
+ */
+ platform_device_register_simple("mac_scsi", 0,
+ mac_scsi_old_rsrc, ARRAY_SIZE(mac_scsi_old_rsrc));
+ break;
+ case MAC_SCSI_LATE:
+ /* PDMA logic in 68040 PowerBooks is somehow different to
+ * '030 models. It's probably more like Quadras (see mac_esp).
+ */
+ platform_device_register_simple("mac_scsi", 0,
+ mac_scsi_late_rsrc, ARRAY_SIZE(mac_scsi_late_rsrc));
+ break;
+ case MAC_SCSI_CCL:
+ /* Addresses from the Color Classic Developer Note.
+ * $50F0 6000 - $50F0 7FFF: SCSI handshake
+ * $50F1 0000 - $50F1 1FFF: SCSI
+ * $50F1 2000 - $50F1 3FFF: SCSI DMA
+ */
+ platform_device_register_simple("mac_scsi", 0,
+ mac_scsi_ccl_rsrc, ARRAY_SIZE(mac_scsi_ccl_rsrc));
+ break;
}
/*
Index: linux/arch/m68k/include/asm/macintosh.h
===================================================================
--- linux.orig/arch/m68k/include/asm/macintosh.h 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/include/asm/macintosh.h 2014-10-27 16:25:44.000000000 +1100
@@ -53,6 +53,10 @@ struct mac_model
#define MAC_SCSI_QUADRA 2
#define MAC_SCSI_QUADRA2 3
#define MAC_SCSI_QUADRA3 4
+#define MAC_SCSI_IIFX 5
+#define MAC_SCSI_DUO 6
+#define MAC_SCSI_CCL 7
+#define MAC_SCSI_LATE 8
#define MAC_IDE_NONE 0
#define MAC_IDE_QUADRA 1
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (20 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 21/36] mac_scsi: Convert to platform device Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:07 ` Hannes Reinecke
2014-11-07 18:08 ` Michael Schmitz
2014-10-27 5:26 ` [PATCH v2 23/36] atari_scsi: Convert to platform device Finn Thain
` (14 subsequent siblings)
36 siblings, 2 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
[-- Attachment #1: atari_scsi-stdma_try_lock --]
[-- Type: text/plain, Size: 11951 bytes --]
Don't disable irqs when waiting for the ST DMA "lock"; its release may
require an interrupt.
Introduce stdma_try_lock() for use in soft irq context. atari_scsi now tells
the SCSI mid-layer to defer queueing a command if the ST DMA lock is not
available, as per Michael's patch:
http://marc.info/?l=linux-m68k&m=139095335824863&w=2
The falcon_got_lock variable is race prone: we can't disable IRQs while
waiting to acquire the lock, so after acquiring it there must be some
interval during which falcon_got_lock remains false. Introduce
stdma_is_locked_by() to replace falcon_got_lock.
The falcon_got_lock tests in the EH handlers are incorrect these days. It
can happen that an EH handler is called after a command completes normally.
Remove these checks along with falcon_got_lock.
Also remove the complicated and racy fairness wait queues. If fairness is an
issue (when SCSI competes with IDE for the ST DMA interrupt), the solution
is likely to be a lower value for host->can_queue.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Use Geert's suggestion for simpler stdma_is_locked_by() implementation.
---
arch/m68k/atari/stdma.c | 61 ++++++++++++++++++----------
arch/m68k/include/asm/atari_stdma.h | 4 -
drivers/scsi/atari_NCR5380.c | 35 +++++-----------
drivers/scsi/atari_scsi.c | 76 +++++++-----------------------------
4 files changed, 69 insertions(+), 107 deletions(-)
Index: linux/arch/m68k/atari/stdma.c
===================================================================
--- linux.orig/arch/m68k/atari/stdma.c 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/atari/stdma.c 2014-10-27 16:25:45.000000000 +1100
@@ -59,6 +59,31 @@ static irqreturn_t stdma_int (int irq, v
/************************* End of Prototypes **************************/
+/**
+ * stdma_try_lock - attempt to acquire ST DMA interrupt "lock"
+ * @handler: interrupt handler to use after acquisition
+ *
+ * Returns !0 if lock was acquired; otherwise 0.
+ */
+
+int stdma_try_lock(irq_handler_t handler, void *data)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ if (stdma_locked) {
+ local_irq_restore(flags);
+ return 0;
+ }
+
+ stdma_locked = 1;
+ stdma_isr = handler;
+ stdma_isr_data = data;
+ local_irq_restore(flags);
+ return 1;
+}
+EXPORT_SYMBOL(stdma_try_lock);
+
/*
* Function: void stdma_lock( isrfunc isr, void *data )
@@ -78,19 +103,10 @@ static irqreturn_t stdma_int (int irq, v
void stdma_lock(irq_handler_t handler, void *data)
{
- unsigned long flags;
-
- local_irq_save(flags); /* protect lock */
-
/* Since the DMA is used for file system purposes, we
have to sleep uninterruptible (there may be locked
buffers) */
- wait_event(stdma_wait, !stdma_locked);
-
- stdma_locked = 1;
- stdma_isr = handler;
- stdma_isr_data = data;
- local_irq_restore(flags);
+ wait_event(stdma_wait, stdma_try_lock(handler, data));
}
EXPORT_SYMBOL(stdma_lock);
@@ -122,22 +138,25 @@ void stdma_release(void)
EXPORT_SYMBOL(stdma_release);
-/*
- * Function: int stdma_others_waiting( void )
- *
- * Purpose: Check if someone waits for the ST-DMA lock.
- *
- * Inputs: none
- *
- * Returns: 0 if no one is waiting, != 0 otherwise
+/**
+ * stdma_is_locked_by - allow lock holder to check whether it needs to release.
+ * @handler: interrupt handler previously used to acquire lock.
*
+ * Returns !0 if locked for the given handler; 0 otherwise.
*/
-int stdma_others_waiting(void)
+int stdma_is_locked_by(irq_handler_t handler)
{
- return waitqueue_active(&stdma_wait);
+ unsigned long flags;
+ int result;
+
+ local_irq_save(flags);
+ result = stdma_locked && (stdma_isr == handler);
+ local_irq_restore(flags);
+
+ return result;
}
-EXPORT_SYMBOL(stdma_others_waiting);
+EXPORT_SYMBOL(stdma_is_locked_by);
/*
Index: linux/arch/m68k/include/asm/atari_stdma.h
===================================================================
--- linux.orig/arch/m68k/include/asm/atari_stdma.h 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/include/asm/atari_stdma.h 2014-10-27 16:25:45.000000000 +1100
@@ -8,11 +8,11 @@
/***************************** Prototypes *****************************/
+int stdma_try_lock(irq_handler_t, void *);
void stdma_lock(irq_handler_t handler, void *data);
void stdma_release( void );
-int stdma_others_waiting( void );
int stdma_islocked( void );
-void *stdma_locked_by( void );
+int stdma_is_locked_by(irq_handler_t);
void stdma_init( void );
/************************* End of Prototypes **************************/
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:45.000000000 +1100
@@ -879,10 +879,10 @@ static void NCR5380_exit(struct Scsi_Hos
*
*/
-static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
- void (*done)(struct scsi_cmnd *))
+static int NCR5380_queue_command(struct Scsi_Host *instance,
+ struct scsi_cmnd *cmd)
{
- SETUP_HOSTDATA(cmd->device->host);
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
struct scsi_cmnd *tmp;
unsigned long flags;
@@ -893,7 +893,7 @@ static int NCR5380_queue_command_lck(str
printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag set\n",
H_NO(cmd));
cmd->result = (DID_ERROR << 16);
- done(cmd);
+ cmd->scsi_done(cmd);
return 0;
}
#endif /* (NDEBUG & NDEBUG_NO_WRITE) */
@@ -904,8 +904,6 @@ static int NCR5380_queue_command_lck(str
*/
SET_NEXT(cmd, NULL);
- cmd->scsi_done = done;
-
cmd->result = 0;
/*
@@ -915,7 +913,6 @@ static int NCR5380_queue_command_lck(str
* sense data is only guaranteed to be valid while the condition exists.
*/
- local_irq_save(flags);
/* ++guenther: now that the issue queue is being set up, we can lock ST-DMA.
* Otherwise a running NCR5380_main may steal the lock.
* Lock before actually inserting due to fairness reasons explained in
@@ -928,11 +925,13 @@ static int NCR5380_queue_command_lck(str
* because also a timer int can trigger an abort or reset, which would
* alter queues and touch the lock.
*/
- if (!IS_A_TT()) {
- /* perhaps stop command timer here */
- falcon_get_lock();
- /* perhaps restart command timer here */
- }
+ /* perhaps stop command timer here */
+ if (!falcon_get_lock())
+ return SCSI_MLQUEUE_HOST_BUSY;
+ /* perhaps restart command timer here */
+
+ local_irq_save(flags);
+
if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
LIST(cmd, hostdata->issue_queue);
SET_NEXT(cmd, hostdata->issue_queue);
@@ -956,15 +955,13 @@ static int NCR5380_queue_command_lck(str
* If we're not in an interrupt, we can call NCR5380_main()
* unconditionally, because it cannot be already running.
*/
- if (in_interrupt() || ((flags >> 8) & 7) >= 6)
+ if (in_interrupt() || irqs_disabled())
queue_main();
else
NCR5380_main(NULL);
return 0;
}
-static DEF_SCSI_QCMD(NCR5380_queue_command)
-
/*
* Function : NCR5380_main (void)
*
@@ -2555,10 +2552,6 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
local_irq_save(flags);
- if (!IS_A_TT() && !falcon_got_lock)
- printk(KERN_ERR "scsi%d: !!BINGO!! Falcon has no lock in NCR5380_abort\n",
- HOSTNO);
-
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));
@@ -2757,10 +2750,6 @@ static int NCR5380_bus_reset(struct scsi
struct scsi_cmnd *connected, *disconnected_queue;
#endif
- if (!IS_A_TT() && !falcon_got_lock)
- printk(KERN_ERR "scsi%d: !!BINGO!! Falcon has no lock in NCR5380_reset\n",
- H_NO(cmd));
-
NCR5380_print_status(cmd->device->host);
/* get in phase */
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:45.000000000 +1100
@@ -184,7 +184,7 @@ static void atari_scsi_fetch_restbytes(v
static irqreturn_t scsi_tt_intr(int irq, void *dummy);
static irqreturn_t scsi_falcon_intr(int irq, void *dummy);
static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata);
-static void falcon_get_lock(void);
+static int falcon_get_lock(void);
#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
static void atari_scsi_reset_boot(void);
#endif
@@ -473,17 +473,10 @@ static void atari_scsi_fetch_restbytes(v
#endif /* REAL_DMA */
-static int falcon_got_lock = 0;
-static DECLARE_WAIT_QUEUE_HEAD(falcon_fairness_wait);
-static int falcon_trying_lock = 0;
-static DECLARE_WAIT_QUEUE_HEAD(falcon_try_wait);
static int falcon_dont_release = 0;
/* This function releases the lock on the DMA chip if there is no
- * connected command and the disconnected queue is empty. On
- * releasing, instances of falcon_get_lock are awoken, that put
- * themselves to sleep for fairness. They can now try to get the lock
- * again (but others waiting longer more probably will win).
+ * connected command and the disconnected queue is empty.
*/
static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata)
@@ -495,20 +488,12 @@ static void falcon_release_lock_if_possi
local_irq_save(flags);
- if (falcon_got_lock && !hostdata->disconnected_queue &&
- !hostdata->issue_queue && !hostdata->connected) {
-
- if (falcon_dont_release) {
-#if 0
- printk("WARNING: Lock release not allowed. Ignored\n");
-#endif
- local_irq_restore(flags);
- return;
- }
- falcon_got_lock = 0;
+ if (!hostdata->disconnected_queue &&
+ !hostdata->issue_queue &&
+ !hostdata->connected &&
+ !falcon_dont_release &&
+ stdma_is_locked_by(scsi_falcon_intr))
stdma_release();
- wake_up(&falcon_fairness_wait);
- }
local_irq_restore(flags);
}
@@ -517,51 +502,20 @@ static void falcon_release_lock_if_possi
* If the DMA isn't locked already for SCSI, it tries to lock it by
* calling stdma_lock(). But if the DMA is locked by the SCSI code and
* there are other drivers waiting for the chip, we do not issue the
- * command immediately but wait on 'falcon_fairness_queue'. We will be
- * waked up when the DMA is unlocked by some SCSI interrupt. After that
- * we try to get the lock again.
- * But we must be prepared that more than one instance of
- * falcon_get_lock() is waiting on the fairness queue. They should not
- * try all at once to call stdma_lock(), one is enough! For that, the
- * first one sets 'falcon_trying_lock', others that see that variable
- * set wait on the queue 'falcon_try_wait'.
- * Complicated, complicated.... Sigh...
+ * command immediately but tell the SCSI mid-layer to defer.
*/
-static void falcon_get_lock(void)
+static int falcon_get_lock(void)
{
- unsigned long flags;
-
if (IS_A_TT())
- return;
+ return 1;
- local_irq_save(flags);
-
- wait_event_cmd(falcon_fairness_wait,
- in_interrupt() || !falcon_got_lock || !stdma_others_waiting(),
- local_irq_restore(flags),
- local_irq_save(flags));
-
- while (!falcon_got_lock) {
- if (in_irq())
- panic("Falcon SCSI hasn't ST-DMA lock in interrupt");
- if (!falcon_trying_lock) {
- falcon_trying_lock = 1;
- stdma_lock(scsi_falcon_intr, NULL);
- falcon_got_lock = 1;
- falcon_trying_lock = 0;
- wake_up(&falcon_try_wait);
- } else {
- wait_event_cmd(falcon_try_wait,
- falcon_got_lock && !falcon_trying_lock,
- local_irq_restore(flags),
- local_irq_save(flags));
- }
+ if (in_interrupt()) {
+ return stdma_try_lock(scsi_falcon_intr, NULL);
+ } else {
+ stdma_lock(scsi_falcon_intr, NULL);
+ return 1;
}
-
- local_irq_restore(flags);
- if (!falcon_got_lock)
- panic("Falcon SCSI: someone stole the lock :-(\n");
}
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 23/36] atari_scsi: Convert to platform device
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (21 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:17 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 24/36] atari_scsi: Remove header Finn Thain
` (13 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
[-- Attachment #1: atari_scsi-convert-to-platform-device --]
[-- Type: text/plain, Size: 17798 bytes --]
Convert atari_scsi to platform device and eliminate scsi_register().
Validate __setup options later on so that module options are checked as well.
Remove the comment about the scsi mid-layer disabling the host irq as it
is no longer true (AFAICT). Also remove the obsolete slow interrupt stuff
(IRQ_TYPE_SLOW == 0 anyway).
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Remove unnecessary return -ENODEV branch.
- Move IRQ constants to platform resources.
- Always assign instance->irq so that the atari_NCR5380.c core driver
can adopt the NCR5380.c interpretation of instance->irq.
---
arch/m68k/atari/config.c | 27 ++
drivers/scsi/atari_scsi.c | 424 ++++++++++++++++++++++------------------------
drivers/scsi/atari_scsi.h | 17 -
3 files changed, 237 insertions(+), 231 deletions(-)
Index: linux/arch/m68k/atari/config.c
===================================================================
--- linux.orig/arch/m68k/atari/config.c 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/atari/config.c 2014-10-27 16:25:47.000000000 +1100
@@ -858,6 +858,24 @@ static struct platform_device *atari_net
};
#endif /* CONFIG_ATARI_ETHERNEC */
+#ifdef CONFIG_ATARI_SCSI
+static const struct resource atari_scsi_st_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_MFP_FSCSI,
+ .end = IRQ_MFP_FSCSI,
+ },
+};
+
+static const struct resource atari_scsi_tt_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_TT_MFP_SCSI,
+ .end = IRQ_TT_MFP_SCSI,
+ },
+};
+#endif
+
int __init atari_platform_init(void)
{
int rv = 0;
@@ -892,6 +910,15 @@ int __init atari_platform_init(void)
}
#endif
+#ifdef CONFIG_ATARI_SCSI
+ if (ATARIHW_PRESENT(ST_SCSI))
+ platform_device_register_simple("atari_scsi", -1,
+ atari_scsi_st_rsrc, ARRAY_SIZE(atari_scsi_st_rsrc));
+ else if (ATARIHW_PRESENT(TT_SCSI))
+ platform_device_register_simple("atari_scsi", -1,
+ atari_scsi_tt_rsrc, ARRAY_SIZE(atari_scsi_tt_rsrc));
+#endif
+
return rv;
}
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:45.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:47.000000000 +1100
@@ -74,33 +74,26 @@
#define MAX_TAGS 32
#include <linux/types.h>
-#include <linux/stddef.h>
-#include <linux/ctype.h>
#include <linux/delay.h>
-#include <linux/mm.h>
#include <linux/blkdev.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/nvram.h>
#include <linux/bitops.h>
#include <linux/wait.h>
+#include <linux/platform_device.h>
#include <asm/setup.h>
#include <asm/atarihw.h>
#include <asm/atariints.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/irq.h>
-#include <asm/traps.h>
-
-#include <scsi/scsi_host.h>
-#include "atari_scsi.h"
-#include "NCR5380.h"
#include <asm/atari_stdma.h>
#include <asm/atari_stram.h>
#include <asm/io.h>
-#include <linux/stat.h>
+#include <scsi/scsi_host.h>
+
+#include "atari_scsi.h"
+#include "NCR5380.h"
#define IS_A_TT() ATARIHW_PRESENT(TT_SCSI)
@@ -176,25 +169,9 @@ static inline void DISABLE_IRQ(void)
#define AFTER_RESET_DELAY (5*HZ/2)
#endif
-/***************************** Prototypes *****************************/
-
#ifdef REAL_DMA
static void atari_scsi_fetch_restbytes(void);
#endif
-static irqreturn_t scsi_tt_intr(int irq, void *dummy);
-static irqreturn_t scsi_falcon_intr(int irq, void *dummy);
-static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata);
-static int falcon_get_lock(void);
-#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
-static void atari_scsi_reset_boot(void);
-#endif
-static unsigned char atari_scsi_tt_reg_read(unsigned char reg);
-static void atari_scsi_tt_reg_write(unsigned char reg, unsigned char value);
-static unsigned char atari_scsi_falcon_reg_read(unsigned char reg);
-static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value);
-
-/************************* End of Prototypes **************************/
-
static struct Scsi_Host *atari_scsi_host;
static unsigned char (*atari_scsi_reg_read)(unsigned char reg);
@@ -518,160 +495,12 @@ static int falcon_get_lock(void)
}
}
-
-static int __init atari_scsi_detect(struct scsi_host_template *host)
-{
- static int called = 0;
- struct Scsi_Host *instance;
-
- if (!MACH_IS_ATARI ||
- (!ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(TT_SCSI)) ||
- called)
- return 0;
-
- host->proc_name = "Atari";
-
- atari_scsi_reg_read = IS_A_TT() ? atari_scsi_tt_reg_read :
- atari_scsi_falcon_reg_read;
- atari_scsi_reg_write = IS_A_TT() ? atari_scsi_tt_reg_write :
- atari_scsi_falcon_reg_write;
-
- /* setup variables */
- host->can_queue =
- (setup_can_queue > 0) ? setup_can_queue :
- IS_A_TT() ? ATARI_TT_CAN_QUEUE : ATARI_FALCON_CAN_QUEUE;
- host->cmd_per_lun =
- (setup_cmd_per_lun > 0) ? setup_cmd_per_lun :
- IS_A_TT() ? ATARI_TT_CMD_PER_LUN : ATARI_FALCON_CMD_PER_LUN;
- /* Force sg_tablesize to 0 on a Falcon! */
- host->sg_tablesize =
- !IS_A_TT() ? ATARI_FALCON_SG_TABLESIZE :
- (setup_sg_tablesize >= 0) ? setup_sg_tablesize : ATARI_TT_SG_TABLESIZE;
-
- if (setup_hostid >= 0)
- host->this_id = setup_hostid;
- else {
- /* use 7 as default */
- host->this_id = 7;
- /* Test if a host id is set in the NVRam */
- if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
- unsigned char b = nvram_read_byte( 14 );
- /* Arbitration enabled? (for TOS) If yes, use configured host ID */
- if (b & 0x80)
- host->this_id = b & 7;
- }
- }
-
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 0;
-#endif
-#ifdef REAL_DMA
- /* If running on a Falcon and if there's TT-Ram (i.e., more than one
- * memory block, since there's always ST-Ram in a Falcon), then allocate a
- * STRAM_BUFFER_SIZE byte dribble buffer for transfers from/to alternative
- * Ram.
- */
- if (MACH_IS_ATARI && ATARIHW_PRESENT(ST_SCSI) &&
- !ATARIHW_PRESENT(EXTD_DMA) && m68k_num_memory > 1) {
- atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
- if (!atari_dma_buffer) {
- printk(KERN_ERR "atari_scsi_detect: can't allocate ST-RAM "
- "double buffer\n");
- return 0;
- }
- atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);
- atari_dma_orig_addr = 0;
- }
-#endif
- instance = scsi_register(host, sizeof(struct NCR5380_hostdata));
- if (instance == NULL) {
- atari_stram_free(atari_dma_buffer);
- atari_dma_buffer = 0;
- return 0;
- }
- atari_scsi_host = instance;
- /*
- * Set irq to 0, to avoid that the mid-level code disables our interrupt
- * during queue_command calls. This is completely unnecessary, and even
- * worse causes bad problems on the Falcon, where the int is shared with
- * IDE and floppy!
- */
- instance->irq = 0;
-
-#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
- atari_scsi_reset_boot();
-#endif
- NCR5380_init(instance, 0);
-
- if (IS_A_TT()) {
-
- /* This int is actually "pseudo-slow", i.e. it acts like a slow
- * interrupt after having cleared the pending flag for the DMA
- * interrupt. */
- if (request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW,
- "SCSI NCR5380", instance)) {
- printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting",IRQ_TT_MFP_SCSI);
- scsi_unregister(atari_scsi_host);
- atari_stram_free(atari_dma_buffer);
- atari_dma_buffer = 0;
- return 0;
- }
- tt_mfp.active_edge |= 0x80; /* SCSI int on L->H */
-#ifdef REAL_DMA
- tt_scsi_dma.dma_ctrl = 0;
- atari_dma_residual = 0;
-
- if (MACH_IS_MEDUSA) {
- /* While the read overruns (described by Drew Eckhardt in
- * NCR5380.c) never happened on TTs, they do in fact on the Medusa
- * (This was the cause why SCSI didn't work right for so long
- * there.) Since handling the overruns slows down a bit, I turned
- * the #ifdef's into a runtime condition.
- *
- * In principle it should be sufficient to do max. 1 byte with
- * PIO, but there is another problem on the Medusa with the DMA
- * rest data register. So 'atari_read_overruns' is currently set
- * to 4 to avoid having transfers that aren't a multiple of 4. If
- * the rest data bug is fixed, this can be lowered to 1.
- */
- atari_read_overruns = 4;
- }
-#endif /*REAL_DMA*/
- } else { /* ! IS_A_TT */
-
- /* Nothing to do for the interrupt: the ST-DMA is initialized
- * already by atari_init_INTS()
- */
-
-#ifdef REAL_DMA
- atari_dma_residual = 0;
- atari_dma_active = 0;
- atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
- : 0xff000000);
-#endif
- }
-
- called = 1;
- return 1;
-}
-
-static int atari_scsi_release(struct Scsi_Host *sh)
-{
- if (IS_A_TT())
- free_irq(IRQ_TT_MFP_SCSI, sh);
- if (atari_dma_buffer)
- atari_stram_free(atari_dma_buffer);
- NCR5380_exit(sh);
- return 1;
-}
-
#ifndef MODULE
static int __init atari_scsi_setup(char *str)
{
/* Format of atascsi parameter is:
* atascsi=<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
- * Defaults depend on TT or Falcon, hostid determined at run time.
+ * Defaults depend on TT or Falcon, determined at run time.
* Negative values mean don't change.
*/
int ints[6];
@@ -682,36 +511,17 @@ static int __init atari_scsi_setup(char
printk("atari_scsi_setup: no arguments!\n");
return 0;
}
-
- if (ints[0] >= 1) {
- if (ints[1] > 0)
- /* no limits on this, just > 0 */
- setup_can_queue = ints[1];
- }
- if (ints[0] >= 2) {
- if (ints[2] > 0)
- setup_cmd_per_lun = ints[2];
- }
- if (ints[0] >= 3) {
- if (ints[3] >= 0) {
- setup_sg_tablesize = ints[3];
- /* Must be <= SG_ALL (255) */
- if (setup_sg_tablesize > SG_ALL)
- setup_sg_tablesize = SG_ALL;
- }
- }
- if (ints[0] >= 4) {
- /* Must be between 0 and 7 */
- if (ints[4] >= 0 && ints[4] <= 7)
- setup_hostid = ints[4];
- else if (ints[4] > 7)
- printk("atari_scsi_setup: invalid host ID %d !\n", ints[4]);
- }
+ if (ints[0] >= 1)
+ setup_can_queue = ints[1];
+ if (ints[0] >= 2)
+ setup_cmd_per_lun = ints[2];
+ if (ints[0] >= 3)
+ setup_sg_tablesize = ints[3];
+ if (ints[0] >= 4)
+ setup_hostid = ints[4];
#ifdef SUPPORT_TAGS
- if (ints[0] >= 5) {
- if (ints[5] >= 0)
- setup_use_tagged_queuing = !!ints[5];
- }
+ if (ints[0] >= 5)
+ setup_use_tagged_queuing = ints[5];
#endif
return 1;
@@ -1020,23 +830,209 @@ static int atari_scsi_bus_reset(struct s
return rv;
}
-static struct scsi_host_template driver_template = {
+#define DRV_MODULE_NAME "atari_scsi"
+#define PFX DRV_MODULE_NAME ": "
+
+static struct scsi_host_template atari_scsi_template = {
+ .module = THIS_MODULE,
+ .proc_name = DRV_MODULE_NAME,
.show_info = atari_scsi_show_info,
.name = "Atari native SCSI",
- .detect = atari_scsi_detect,
- .release = atari_scsi_release,
.info = atari_scsi_info,
.queuecommand = atari_scsi_queue_command,
.eh_abort_handler = atari_scsi_abort,
.eh_bus_reset_handler = atari_scsi_bus_reset,
- .can_queue = 0, /* initialized at run-time */
- .this_id = 0, /* initialized at run-time */
- .sg_tablesize = 0, /* initialized at run-time */
- .cmd_per_lun = 0, /* initialized at run-time */
+ .this_id = 7,
.use_clustering = DISABLE_CLUSTERING
};
+static int __init atari_scsi_probe(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance;
+ int error;
+ struct resource *irq;
+
+ irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ if (!irq)
+ return -ENODEV;
+
+ if (ATARIHW_PRESENT(TT_SCSI)) {
+ atari_scsi_reg_read = atari_scsi_tt_reg_read;
+ atari_scsi_reg_write = atari_scsi_tt_reg_write;
+ } else {
+ atari_scsi_reg_read = atari_scsi_falcon_reg_read;
+ atari_scsi_reg_write = atari_scsi_falcon_reg_write;
+ }
+
+ /* The values for CMD_PER_LUN and CAN_QUEUE are somehow arbitrary.
+ * Higher values should work, too; try it!
+ * (But cmd_per_lun costs memory!)
+ *
+ * But there seems to be a bug somewhere that requires CAN_QUEUE to be
+ * 2*CMD_PER_LUN. At least on a TT, no spurious timeouts seen since
+ * changed CMD_PER_LUN...
+ *
+ * Note: The Falcon currently uses 8/1 setting due to unsolved problems
+ * with cmd_per_lun != 1
+ */
+ if (ATARIHW_PRESENT(TT_SCSI)) {
+ atari_scsi_template.can_queue = 16;
+ atari_scsi_template.cmd_per_lun = 8;
+ atari_scsi_template.sg_tablesize = SG_ALL;
+ } else {
+ atari_scsi_template.can_queue = 8;
+ atari_scsi_template.cmd_per_lun = 1;
+ atari_scsi_template.sg_tablesize = SG_NONE;
+ }
+
+ if (setup_can_queue > 0)
+ atari_scsi_template.can_queue = setup_can_queue;
+
+ if (setup_cmd_per_lun > 0)
+ atari_scsi_template.cmd_per_lun = setup_cmd_per_lun;
+
+ /* Leave sg_tablesize at 0 on a Falcon! */
+ if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize >= 0)
+ atari_scsi_template.sg_tablesize = setup_sg_tablesize;
+
+ if (setup_hostid >= 0) {
+ atari_scsi_template.this_id = setup_hostid & 7;
+ } else {
+ /* Test if a host id is set in the NVRam */
+ if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
+ unsigned char b = nvram_read_byte(14);
+
+ /* Arbitration enabled? (for TOS)
+ * If yes, use configured host ID
+ */
+ if (b & 0x80)
+ atari_scsi_template.this_id = b & 7;
+ }
+ }
+
+#ifdef SUPPORT_TAGS
+ if (setup_use_tagged_queuing < 0)
+ setup_use_tagged_queuing = 0;
+#endif
+
+#ifdef REAL_DMA
+ /* If running on a Falcon and if there's TT-Ram (i.e., more than one
+ * memory block, since there's always ST-Ram in a Falcon), then
+ * allocate a STRAM_BUFFER_SIZE byte dribble buffer for transfers
+ * from/to alternative Ram.
+ */
+ if (ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(EXTD_DMA) &&
+ m68k_num_memory > 1) {
+ atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
+ if (!atari_dma_buffer) {
+ pr_err(PFX "can't allocate ST-RAM double buffer\n");
+ return -ENOMEM;
+ }
+ atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);
+ atari_dma_orig_addr = 0;
+ }
+#endif
+
+ instance = scsi_host_alloc(&atari_scsi_template,
+ sizeof(struct NCR5380_hostdata));
+ if (!instance) {
+ error = -ENOMEM;
+ goto fail_alloc;
+ }
+ atari_scsi_host = instance;
+
+#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
+ atari_scsi_reset_boot();
+#endif
+
+ instance->irq = irq->start;
+
+ NCR5380_init(instance, 0);
+
+ if (IS_A_TT()) {
+ error = request_irq(instance->irq, scsi_tt_intr, 0,
+ "NCR5380", instance);
+ if (error) {
+ pr_err(PFX "request irq %d failed, aborting\n",
+ instance->irq);
+ goto fail_irq;
+ }
+ tt_mfp.active_edge |= 0x80; /* SCSI int on L->H */
+#ifdef REAL_DMA
+ tt_scsi_dma.dma_ctrl = 0;
+ atari_dma_residual = 0;
+
+ /* While the read overruns (described by Drew Eckhardt in
+ * NCR5380.c) never happened on TTs, they do in fact on the
+ * Medusa (This was the cause why SCSI didn't work right for
+ * so long there.) Since handling the overruns slows down
+ * a bit, I turned the #ifdef's into a runtime condition.
+ *
+ * In principle it should be sufficient to do max. 1 byte with
+ * PIO, but there is another problem on the Medusa with the DMA
+ * rest data register. So 'atari_read_overruns' is currently set
+ * to 4 to avoid having transfers that aren't a multiple of 4.
+ * If the rest data bug is fixed, this can be lowered to 1.
+ */
+ if (MACH_IS_MEDUSA)
+ atari_read_overruns = 4;
+#endif
+ } else {
+ /* Nothing to do for the interrupt: the ST-DMA is initialized
+ * already.
+ */
+#ifdef REAL_DMA
+ atari_dma_residual = 0;
+ atari_dma_active = 0;
+ atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
+ : 0xff000000);
+#endif
+ }
+
+ error = scsi_add_host(instance, NULL);
+ if (error)
+ goto fail_host;
+
+ platform_set_drvdata(pdev, instance);
+
+ scsi_scan_host(instance);
+ return 0;
+
+fail_host:
+ if (IS_A_TT())
+ free_irq(instance->irq, instance);
+fail_irq:
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+fail_alloc:
+ if (atari_dma_buffer)
+ atari_stram_free(atari_dma_buffer);
+ return error;
+}
+
+static int __exit atari_scsi_remove(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance = platform_get_drvdata(pdev);
+
+ scsi_remove_host(instance);
+ if (IS_A_TT())
+ free_irq(instance->irq, instance);
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+ if (atari_dma_buffer)
+ atari_stram_free(atari_dma_buffer);
+ return 0;
+}
+
+static struct platform_driver atari_scsi_driver = {
+ .remove = __exit_p(atari_scsi_remove),
+ .driver = {
+ .name = DRV_MODULE_NAME,
+ .owner = THIS_MODULE,
+ },
+};
-#include "scsi_module.c"
+module_platform_driver_probe(atari_scsi_driver, atari_scsi_probe);
+MODULE_ALIAS("platform:" DRV_MODULE_NAME);
MODULE_LICENSE("GPL");
Index: linux/drivers/scsi/atari_scsi.h
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.h 2014-10-27 16:25:32.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.h 2014-10-27 16:25:47.000000000 +1100
@@ -18,23 +18,6 @@
/* (I_HAVE_OVERRUNS stuff removed) */
#ifndef ASM
-/* The values for CMD_PER_LUN and CAN_QUEUE are somehow arbitrary. Higher
- * values should work, too; try it! (but cmd_per_lun costs memory!) */
-
-/* But there seems to be a bug somewhere that requires CAN_QUEUE to be
- * 2*CMD_PER_LUN. At least on a TT, no spurious timeouts seen since
- * changed CMD_PER_LUN... */
-
-/* Note: The Falcon currently uses 8/1 setting due to unsolved problems with
- * cmd_per_lun != 1 */
-
-#define ATARI_TT_CAN_QUEUE 16
-#define ATARI_TT_CMD_PER_LUN 8
-#define ATARI_TT_SG_TABLESIZE SG_ALL
-
-#define ATARI_FALCON_CAN_QUEUE 8
-#define ATARI_FALCON_CMD_PER_LUN 1
-#define ATARI_FALCON_SG_TABLESIZE SG_NONE
#define NCR5380_implementation_fields /* none */
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 24/36] atari_scsi: Remove header
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (22 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 23/36] atari_scsi: Convert to platform device Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:18 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
` (12 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_scsi-remove-header --]
[-- Type: text/plain, Size: 3879 bytes --]
The #defines in atari_scsi.h are intended to influence subsequent #includes
in atari_scsi.c. IMHO, that's too convoluted.
Remove atari_scsi.h by moving those macro definitions to atari_scsi.c,
consistent with other NCR5380 drivers.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_scsi.c | 35 ++++++++++++++++++++++++++---------
drivers/scsi/atari_scsi.h | 40 ----------------------------------------
2 files changed, 26 insertions(+), 49 deletions(-)
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:47.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:49.000000000 +1100
@@ -64,15 +64,7 @@
/**************************************************************************/
-
#include <linux/module.h>
-
-/* For the Atari version, use only polled IO or REAL_DMA */
-#define REAL_DMA
-/* Support tagged queuing? (on devices that are able to... :-) */
-#define SUPPORT_TAGS
-#define MAX_TAGS 32
-
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/blkdev.h>
@@ -92,9 +84,34 @@
#include <scsi/scsi_host.h>
-#include "atari_scsi.h"
+/* Definitions for the core NCR5380 driver. */
+
+#define REAL_DMA
+#define SUPPORT_TAGS
+#define MAX_TAGS 32
+
+#define NCR5380_implementation_fields /* none */
+
+#define NCR5380_read(reg) atari_scsi_reg_read(reg)
+#define NCR5380_write(reg, value) atari_scsi_reg_write(reg, value)
+
+#define NCR5380_queue_command atari_scsi_queue_command
+#define NCR5380_abort atari_scsi_abort
+#define NCR5380_show_info atari_scsi_show_info
+#define NCR5380_info atari_scsi_info
+
+#define NCR5380_dma_read_setup(instance, data, count) \
+ atari_scsi_dma_setup(instance, data, count, 0)
+#define NCR5380_dma_write_setup(instance, data, count) \
+ atari_scsi_dma_setup(instance, data, count, 1)
+#define NCR5380_dma_residual(instance) \
+ atari_scsi_dma_residual(instance)
+#define NCR5380_dma_xfer_len(instance, cmd, phase) \
+ atari_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
+
#include "NCR5380.h"
+
#define IS_A_TT() ATARIHW_PRESENT(TT_SCSI)
#define SCSI_DMA_WRITE_P(elt,val) \
Index: linux/drivers/scsi/atari_scsi.h
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.h 2014-10-27 16:25:47.000000000 +1100
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,40 +0,0 @@
-/*
- * atari_scsi.h -- Header file for the Atari native SCSI driver
- *
- * Copyright 1994 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
- *
- * (Loosely based on the work of Robert De Vries' team)
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file COPYING in the main directory of this archive
- * for more details.
- *
- */
-
-
-#ifndef ATARI_SCSI_H
-#define ATARI_SCSI_H
-
-/* (I_HAVE_OVERRUNS stuff removed) */
-
-#ifndef ASM
-
-#define NCR5380_implementation_fields /* none */
-
-#define NCR5380_read(reg) atari_scsi_reg_read( reg )
-#define NCR5380_write(reg, value) atari_scsi_reg_write( reg, value )
-
-#define NCR5380_queue_command atari_scsi_queue_command
-#define NCR5380_abort atari_scsi_abort
-#define NCR5380_show_info atari_scsi_show_info
-#define NCR5380_info atari_scsi_info
-#define NCR5380_dma_read_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 0)
-#define NCR5380_dma_write_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 1)
-#define NCR5380_dma_residual(inst) atari_scsi_dma_residual( inst )
-#define NCR5380_dma_xfer_len(i,cmd,phase) \
- atari_dma_xfer_len(cmd->SCp.this_residual,cmd,((phase) & SR_IO) ? 0 : 1)
-
-#endif /* ndef ASM */
-#endif /* ATARI_SCSI_H */
-
-
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 25/36] sun3_scsi: Convert to platform device
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (23 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 24/36] atari_scsi: Remove header Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:20 ` Hannes Reinecke
2014-11-09 10:25 ` Geert Uytterhoeven
2014-10-27 5:26 ` [PATCH v2 26/36] sun3_scsi: Move macro definitions Finn Thain
` (11 subsequent siblings)
36 siblings, 2 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
[-- Attachment #1: sun3_scsi-convert-to-platform-device --]
[-- Type: text/plain, Size: 14571 bytes --]
Convert sun3_scsi to platform device and eliminate scsi_register().
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
Changes since v1:
- Use NO_IRQ instead of IRQ_NONE.
- Move device IRQ and address constants to platform resources.
- Test idprom->id_machtype before registering platform device instead of
during platform driver probe.
- Omit pointless instance->n_io_port assignment.
---
arch/m68k/sun3/config.c | 60 +++++++
drivers/scsi/sun3_scsi.c | 390 ++++++++++++++++++++++-------------------------
drivers/scsi/sun3_scsi.h | 17 --
3 files changed, 245 insertions(+), 222 deletions(-)
Index: linux/arch/m68k/sun3/config.c
===================================================================
--- linux.orig/arch/m68k/sun3/config.c 2014-10-27 16:17:59.000000000 +1100
+++ linux/arch/m68k/sun3/config.c 2014-10-27 16:25:50.000000000 +1100
@@ -16,6 +16,7 @@
#include <linux/console.h>
#include <linux/init.h>
#include <linux/bootmem.h>
+#include <linux/platform_device.h>
#include <asm/oplib.h>
#include <asm/setup.h>
@@ -27,6 +28,7 @@
#include <asm/sun3mmu.h>
#include <asm/rtc.h>
#include <asm/machdep.h>
+#include <asm/machines.h>
#include <asm/idprom.h>
#include <asm/intersil.h>
#include <asm/irq.h>
@@ -169,3 +171,61 @@ static void __init sun3_sched_init(irq_h
intersil_clear();
}
+#ifdef CONFIG_SUN3_SCSI
+
+static const struct resource sun3_scsi_vme_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = SUN3_VEC_VMESCSI0,
+ .end = SUN3_VEC_VMESCSI0,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0xff200000,
+ .end = 0xff200000 + PAGE_SIZE - 1,
+ }, {
+ .flags = IORESOURCE_IRQ,
+ .start = SUN3_VEC_VMESCSI1,
+ .end = SUN3_VEC_VMESCSI1,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0xff204000,
+ .end = 0xff204000 + PAGE_SIZE - 1,
+ },
+};
+
+/*
+ * Int: level 2 autovector
+ * IO: type 1, base 0x00140000, 5 bits phys space: A<4..0>
+ */
+static const struct resource sun3_scsi_rsrc[] __initconst = {
+ {
+ .flags = IORESOURCE_IRQ,
+ .start = 2,
+ .end = 2,
+ }, {
+ .flags = IORESOURCE_MEM,
+ .start = 0x00140000,
+ .end = 0x00140000 + PAGE_SIZE - 1,
+ },
+};
+
+int __init sun3_platform_init(void)
+{
+ switch (idprom->id_machtype) {
+ case SM_SUN3 | SM_3_160:
+ case SM_SUN3 | SM_3_260:
+ platform_device_register_simple("sun3_scsi_vme", -1,
+ sun3_scsi_vme_rsrc, ARRAY_SIZE(sun3_scsi_vme_rsrc));
+ break;
+ case SM_SUN3 | SM_3_50:
+ case SM_SUN3 | SM_3_60:
+ platform_device_register_simple("sun3_scsi", -1,
+ sun3_scsi_rsrc, ARRAY_SIZE(sun3_scsi_rsrc));
+ break;
+ }
+ return 0;
+}
+
+arch_initcall(sun3_platform_init);
+
+#endif
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:50.000000000 +1100
@@ -23,22 +23,15 @@
*/
#include <linux/types.h>
-#include <linux/stddef.h>
-#include <linux/ctype.h>
#include <linux/delay.h>
-
#include <linux/module.h>
-#include <linux/signal.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/blkdev.h>
+#include <linux/platform_device.h>
#include <asm/io.h>
-
-#include <asm/sun3ints.h>
#include <asm/dvma.h>
-#include <asm/idprom.h>
-#include <asm/machines.h>
/* dma on! */
#define REAL_DMA
@@ -59,8 +52,6 @@ extern int sun3_map_test(unsigned long,
#endif
-static irqreturn_t scsi_sun3_intr(int irq, void *dummy);
-
static int setup_can_queue = -1;
module_param(setup_can_queue, int, 0);
static int setup_cmd_per_lun = -1;
@@ -89,15 +80,14 @@ static struct scsi_cmnd *sun3_dma_setup_
/* minimum number of bytes to do dma on */
#define SUN3_DMA_MINSIZE 128
-static volatile unsigned char *sun3_scsi_regp;
+static unsigned char *sun3_scsi_regp;
static volatile struct sun3_dma_regs *dregs;
-#ifndef SUN3_SCSI_VME
-static struct sun3_udc_regs *udc_regs = NULL;
-#endif
+static struct sun3_udc_regs *udc_regs;
static unsigned char *sun3_dma_orig_addr = NULL;
static unsigned long sun3_dma_orig_count = 0;
static int sun3_dma_active = 0;
static unsigned long last_residual = 0;
+static struct Scsi_Host *default_instance;
/*
* NCR 5380 register access functions
@@ -105,12 +95,12 @@ static unsigned long last_residual = 0;
static inline unsigned char sun3scsi_read(int reg)
{
- return( sun3_scsi_regp[reg] );
+ return in_8(sun3_scsi_regp + reg);
}
static inline void sun3scsi_write(int reg, int value)
{
- sun3_scsi_regp[reg] = value;
+ out_8(sun3_scsi_regp + reg, value);
}
#ifndef SUN3_SCSI_VME
@@ -137,192 +127,7 @@ static inline void sun3_udc_write(unsign
}
#endif
-/*
- * XXX: status debug
- */
-static struct Scsi_Host *default_instance;
-
-/*
- * Function : int sun3scsi_detect(struct scsi_host_template * tpnt)
- *
- * Purpose : initializes mac NCR5380 driver based on the
- * command line / compile time port and irq definitions.
- *
- * Inputs : tpnt - template for this SCSI adapter.
- *
- * Returns : 1 if a host adapter was found, 0 if not.
- *
- */
-
-static int __init sun3scsi_detect(struct scsi_host_template *tpnt)
-{
- unsigned long ioaddr, irq;
- static int called = 0;
- struct Scsi_Host *instance;
-#ifdef SUN3_SCSI_VME
- int i;
- unsigned long addrs[3] = { IOBASE_SUN3_VMESCSI,
- IOBASE_SUN3_VMESCSI + 0x4000,
- 0 };
- unsigned long vecs[3] = { SUN3_VEC_VMESCSI0,
- SUN3_VEC_VMESCSI1,
- 0 };
-#endif
-
- /* check that this machine has an onboard 5380 */
- switch(idprom->id_machtype) {
-#ifdef SUN3_SCSI_VME
- case SM_SUN3|SM_3_160:
- case SM_SUN3|SM_3_260:
- break;
-#else
- case SM_SUN3|SM_3_50:
- case SM_SUN3|SM_3_60:
- break;
-#endif
-
- default:
- return 0;
- }
-
- if(called)
- return 0;
-
-#ifdef SUN3_SCSI_VME
- tpnt->proc_name = "Sun3 5380 VME SCSI";
-#else
- tpnt->proc_name = "Sun3 5380 SCSI";
-#endif
-
- /* setup variables */
- if (setup_can_queue > 0)
- tpnt->can_queue = setup_can_queue;
- if (setup_cmd_per_lun > 0)
- tpnt->cmd_per_lun = setup_cmd_per_lun;
- if (setup_sg_tablesize >= 0)
- tpnt->sg_tablesize = setup_sg_tablesize;
-
- if (setup_hostid >= 0)
- tpnt->this_id = setup_hostid;
- else {
- /* use 7 as default */
- tpnt->this_id = 7;
- }
-
-#ifdef SUN3_SCSI_VME
- ioaddr = 0;
- for (i = 0; addrs[i] != 0; i++) {
- unsigned char x;
-
- ioaddr = (unsigned long)sun3_ioremap(addrs[i], PAGE_SIZE,
- SUN3_PAGE_TYPE_VME16);
- irq = vecs[i];
- sun3_scsi_regp = (unsigned char *)ioaddr;
-
- dregs = (struct sun3_dma_regs *)(((unsigned char *)ioaddr) + 8);
-
- if (sun3_map_test((unsigned long)dregs, &x)) {
- unsigned short oldcsr;
-
- oldcsr = dregs->csr;
- dregs->csr = 0;
- udelay(SUN3_DMA_DELAY);
- if (dregs->csr == 0x1400)
- break;
-
- dregs->csr = oldcsr;
- }
-
- iounmap((void *)ioaddr);
- ioaddr = 0;
- }
-
- if (!ioaddr)
- return 0;
-#else
- irq = IRQ_SUN3_SCSI;
- ioaddr = (unsigned long)ioremap(IOBASE_SUN3_SCSI, PAGE_SIZE);
- sun3_scsi_regp = (unsigned char *)ioaddr;
-
- dregs = (struct sun3_dma_regs *)(((unsigned char *)ioaddr) + 8);
-
- if((udc_regs = dvma_malloc(sizeof(struct sun3_udc_regs)))
- == NULL) {
- printk("SUN3 Scsi couldn't allocate DVMA memory!\n");
- return 0;
- }
-#endif
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 1;
-#endif
-
- instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
- if(instance == NULL)
- return 0;
-
- default_instance = instance;
-
- instance->io_port = (unsigned long) ioaddr;
- instance->irq = irq;
-
- NCR5380_init(instance, 0);
-
- instance->n_io_port = 32;
-
- if (request_irq(instance->irq, scsi_sun3_intr,
- 0, "Sun3SCSI-5380", instance)) {
-#ifndef REAL_DMA
- printk("scsi%d: IRQ%d not free, interrupts disabled\n",
- instance->host_no, instance->irq);
- instance->irq = NO_IRQ;
-#else
- printk("scsi%d: IRQ%d not free, bailing out\n",
- instance->host_no, instance->irq);
- return 0;
-#endif
- }
-
- dregs->csr = 0;
- udelay(SUN3_DMA_DELAY);
- dregs->csr = CSR_SCSI | CSR_FIFO | CSR_INTR;
- udelay(SUN3_DMA_DELAY);
- dregs->fifo_count = 0;
-#ifdef SUN3_SCSI_VME
- dregs->fifo_count_hi = 0;
- dregs->dma_addr_hi = 0;
- dregs->dma_addr_lo = 0;
- dregs->dma_count_hi = 0;
- dregs->dma_count_lo = 0;
-
- dregs->ivect = VME_DATA24 | (instance->irq & 0xff);
-#endif
-
- called = 1;
-
-#ifdef RESET_BOOT
- sun3_scsi_reset_boot(instance);
-#endif
-
- return 1;
-}
-
-static int sun3scsi_release(struct Scsi_Host *shpnt)
-{
- if (shpnt->irq != NO_IRQ)
- free_irq(shpnt->irq, shpnt);
-
- iounmap((void *)sun3_scsi_regp);
-
- NCR5380_exit(shpnt);
- return 0;
-}
-
#ifdef RESET_BOOT
-/*
- * Our 'bus reset on boot' function
- */
-
static void sun3_scsi_reset_boot(struct Scsi_Host *instance)
{
unsigned long end;
@@ -671,11 +476,21 @@ static int sun3scsi_dma_finish(int write
#include "sun3_NCR5380.c"
-static struct scsi_host_template driver_template = {
+#ifdef SUN3_SCSI_VME
+#define SUN3_SCSI_NAME "Sun3 NCR5380 VME SCSI"
+#define DRV_MODULE_NAME "sun3_scsi_vme"
+#else
+#define SUN3_SCSI_NAME "Sun3 NCR5380 SCSI"
+#define DRV_MODULE_NAME "sun3_scsi"
+#endif
+
+#define PFX DRV_MODULE_NAME ": "
+
+static struct scsi_host_template sun3_scsi_template = {
+ .module = THIS_MODULE,
+ .proc_name = DRV_MODULE_NAME,
.show_info = sun3scsi_show_info,
.name = SUN3_SCSI_NAME,
- .detect = sun3scsi_detect,
- .release = sun3scsi_release,
.info = sun3scsi_info,
.queuecommand = sun3scsi_queue_command,
.eh_abort_handler = sun3scsi_abort,
@@ -687,7 +502,172 @@ static struct scsi_host_template driver_
.use_clustering = DISABLE_CLUSTERING
};
+static int __init sun3_scsi_probe(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance;
+ int error;
+ struct resource *irq, *mem;
+ unsigned char *ioaddr;
+#ifdef SUN3_SCSI_VME
+ int i;
+#endif
+
+ if (setup_can_queue > 0)
+ sun3_scsi_template.can_queue = setup_can_queue;
+ if (setup_cmd_per_lun > 0)
+ sun3_scsi_template.cmd_per_lun = setup_cmd_per_lun;
+ if (setup_sg_tablesize >= 0)
+ sun3_scsi_template.sg_tablesize = setup_sg_tablesize;
+ if (setup_hostid >= 0)
+ sun3_scsi_template.this_id = setup_hostid & 7;
+
+#ifdef SUPPORT_TAGS
+ if (setup_use_tagged_queuing < 0)
+ setup_use_tagged_queuing = 1;
+#endif
+
+#ifdef SUN3_SCSI_VME
+ ioaddr = NULL;
+ for (i = 0; i < 2; i++) {
+ unsigned char x;
+
+ irq = platform_get_resource(pdev, IORESOURCE_IRQ, i);
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, i);
+ if (!irq || !mem)
+ break;
+
+ ioaddr = sun3_ioremap(mem->start, mem->end - mem->start + 1,
+ SUN3_PAGE_TYPE_VME16);
+ dregs = (struct sun3_dma_regs *)(ioaddr + 8);
+
+ if (sun3_map_test((unsigned long)dregs, &x)) {
+ unsigned short oldcsr;
+
+ oldcsr = dregs->csr;
+ dregs->csr = 0;
+ udelay(SUN3_DMA_DELAY);
+ if (dregs->csr == 0x1400)
+ break;
+
+ dregs->csr = oldcsr;
+ }
+
+ iounmap(ioaddr);
+ ioaddr = NULL;
+ }
+ if (!ioaddr)
+ return -ENODEV;
+#else
+ irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!irq || !mem)
+ return -ENODEV;
+
+ ioaddr = ioremap(mem->start, mem->end - mem->start + 1);
+ dregs = (struct sun3_dma_regs *)(ioaddr + 8);
+
+ udc_regs = dvma_malloc(sizeof(struct sun3_udc_regs));
+ if (!udc_regs) {
+ pr_err(PFX "couldn't allocate DVMA memory!\n");
+ iounmap(ioaddr);
+ return -ENOMEM;
+ }
+#endif
+
+ sun3_scsi_regp = ioaddr;
+
+ instance = scsi_host_alloc(&sun3_scsi_template,
+ sizeof(struct NCR5380_hostdata));
+ if (!instance) {
+ error = -ENOMEM;
+ goto fail_alloc;
+ }
+ default_instance = instance;
+
+ instance->io_port = (unsigned long)ioaddr;
+ instance->irq = irq->start;
+
+ NCR5380_init(instance, 0);
+
+ error = request_irq(instance->irq, scsi_sun3_intr, 0,
+ "NCR5380", instance);
+ if (error) {
+#ifdef REAL_DMA
+ pr_err(PFX "scsi%d: IRQ %d not free, bailing out\n",
+ instance->host_no, instance->irq);
+ goto fail_irq;
+#else
+ pr_warn(PFX "scsi%d: IRQ %d not free, interrupts disabled\n",
+ instance->host_no, instance->irq);
+ instance->irq = NO_IRQ;
+#endif
+ }
+
+ dregs->csr = 0;
+ udelay(SUN3_DMA_DELAY);
+ dregs->csr = CSR_SCSI | CSR_FIFO | CSR_INTR;
+ udelay(SUN3_DMA_DELAY);
+ dregs->fifo_count = 0;
+#ifdef SUN3_SCSI_VME
+ dregs->fifo_count_hi = 0;
+ dregs->dma_addr_hi = 0;
+ dregs->dma_addr_lo = 0;
+ dregs->dma_count_hi = 0;
+ dregs->dma_count_lo = 0;
+
+ dregs->ivect = VME_DATA24 | (instance->irq & 0xff);
+#endif
+
+#ifdef RESET_BOOT
+ sun3_scsi_reset_boot(instance);
+#endif
+
+ error = scsi_add_host(instance, NULL);
+ if (error)
+ goto fail_host;
+
+ platform_set_drvdata(pdev, instance);
+
+ scsi_scan_host(instance);
+ return 0;
+
+fail_host:
+ if (instance->irq != NO_IRQ)
+ free_irq(instance->irq, instance);
+fail_irq:
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+fail_alloc:
+ if (udc_regs)
+ dvma_free(udc_regs);
+ iounmap(sun3_scsi_regp);
+ return error;
+}
+
+static int __exit sun3_scsi_remove(struct platform_device *pdev)
+{
+ struct Scsi_Host *instance = platform_get_drvdata(pdev);
+
+ scsi_remove_host(instance);
+ if (instance->irq != NO_IRQ)
+ free_irq(instance->irq, instance);
+ NCR5380_exit(instance);
+ scsi_host_put(instance);
+ if (udc_regs)
+ dvma_free(udc_regs);
+ iounmap(sun3_scsi_regp);
+ return 0;
+}
+
+static struct platform_driver sun3_scsi_driver = {
+ .remove = __exit_p(sun3_scsi_remove),
+ .driver = {
+ .name = DRV_MODULE_NAME,
+ .owner = THIS_MODULE,
+ },
+};
-#include "scsi_module.c"
+module_platform_driver_probe(sun3_scsi_driver, sun3_scsi_probe);
+MODULE_ALIAS("platform:" DRV_MODULE_NAME);
MODULE_LICENSE("GPL");
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:33.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:50.000000000 +1100
@@ -18,25 +18,8 @@
#ifndef SUN3_SCSI_H
#define SUN3_SCSI_H
-/*
- * Int: level 2 autovector
- * IO: type 1, base 0x00140000, 5 bits phys space: A<4..0>
- */
-#define IRQ_SUN3_SCSI 2
-#define IOBASE_SUN3_SCSI 0x00140000
-
-#define IOBASE_SUN3_VMESCSI 0xff200000
-
#define MAX_TAGS 32
-#include <scsi/scsicam.h>
-
-#ifdef SUN3_SCSI_VME
-#define SUN3_SCSI_NAME "Sun3 NCR5380 VME SCSI"
-#else
-#define SUN3_SCSI_NAME "Sun3 NCR5380 SCSI"
-#endif
-
#define NCR5380_implementation_fields /* none */
#define NCR5380_local_declare() \
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 26/36] sun3_scsi: Move macro definitions
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (24 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:20 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros Finn Thain
` (10 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: sun3_scsi-move-macro-definitions --]
[-- Type: text/plain, Size: 4674 bytes --]
The #defines in sun3_scsi.h are intended to influence subsequent #includes
in sun3_scsi.c. IMHO, that's too convoluted.
Move sun3_scsi.h macro definitions to sun3_scsi.c, consistent with other
NCR5380 drivers.
Omit the unused NCR5380_local_declare() and NCR5380_setup() macros.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/sun3_scsi.c | 45 ++++++++++++++++++++++++++++++++-------------
drivers/scsi/sun3_scsi.h | 25 -------------------------
2 files changed, 32 insertions(+), 38 deletions(-)
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:50.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:51.000000000 +1100
@@ -33,18 +33,42 @@
#include <asm/io.h>
#include <asm/dvma.h>
-/* dma on! */
-#define REAL_DMA
-
#include <scsi/scsi_host.h>
#include "sun3_scsi.h"
-#include "NCR5380.h"
-extern int sun3_map_test(unsigned long, char *);
+/* Definitions for the core NCR5380 driver. */
-/*#define RESET_BOOT */
+#define REAL_DMA
+#define RESET_RUN_DONE
/* #define SUPPORT_TAGS */
+/* #define MAX_TAGS 32 */
+
+#define NCR5380_implementation_fields /* none */
+
+#define NCR5380_read(reg) sun3scsi_read(reg)
+#define NCR5380_write(reg, value) sun3scsi_write(reg, value)
+
+#define NCR5380_queue_command sun3scsi_queue_command
+#define NCR5380_bus_reset sun3scsi_bus_reset
+#define NCR5380_abort sun3scsi_abort
+#define NCR5380_show_info sun3scsi_show_info
+#define NCR5380_info sun3scsi_info
+
+#define NCR5380_dma_read_setup(instance, data, count) \
+ sun3scsi_dma_setup(data, count, 0)
+#define NCR5380_dma_write_setup(instance, data, count) \
+ sun3scsi_dma_setup(data, count, 1)
+#define NCR5380_dma_residual(instance) \
+ sun3scsi_dma_residual(instance)
+#define NCR5380_dma_xfer_len(instance, cmd, phase) \
+ sun3scsi_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
+
+#include "NCR5380.h"
+
+
+extern int sun3_map_test(unsigned long, char *);
+
#ifdef SUN3_SCSI_VME
#define ENABLE_IRQ()
#else
@@ -65,9 +89,7 @@ module_param(setup_use_tagged_queuing, i
static int setup_hostid = -1;
module_param(setup_hostid, int, 0);
-static struct scsi_cmnd *sun3_dma_setup_done = NULL;
-
-#define RESET_RUN_DONE
+/* #define RESET_BOOT */
#define AFTER_RESET_DELAY (HZ/2)
@@ -80,6 +102,7 @@ static struct scsi_cmnd *sun3_dma_setup_
/* minimum number of bytes to do dma on */
#define SUN3_DMA_MINSIZE 128
+static struct scsi_cmnd *sun3_dma_setup_done;
static unsigned char *sun3_scsi_regp;
static volatile struct sun3_dma_regs *dregs;
static struct sun3_udc_regs *udc_regs;
@@ -131,9 +154,6 @@ static inline void sun3_udc_write(unsign
static void sun3_scsi_reset_boot(struct Scsi_Host *instance)
{
unsigned long end;
-
- NCR5380_local_declare();
- NCR5380_setup(instance);
/*
* Do a SCSI reset to clean up the bus during initialization. No
@@ -210,7 +230,6 @@ static irqreturn_t scsi_sun3_intr(int ir
void sun3_sun3_debug (void)
{
unsigned long flags;
- NCR5380_local_declare();
if (default_instance) {
local_irq_save(flags);
Index: linux/drivers/scsi/sun3_scsi.h
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:50.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.h 2014-10-27 16:25:51.000000000 +1100
@@ -18,31 +18,6 @@
#ifndef SUN3_SCSI_H
#define SUN3_SCSI_H
-#define MAX_TAGS 32
-
-#define NCR5380_implementation_fields /* none */
-
-#define NCR5380_local_declare() \
- struct Scsi_Host *_instance
-
-#define NCR5380_setup(instance) \
- _instance = instance
-
-#define NCR5380_read(reg) sun3scsi_read(reg)
-#define NCR5380_write(reg, value) sun3scsi_write(reg, value)
-
-#define NCR5380_queue_command sun3scsi_queue_command
-#define NCR5380_bus_reset sun3scsi_bus_reset
-#define NCR5380_abort sun3scsi_abort
-#define NCR5380_show_info sun3scsi_show_info
-#define NCR5380_info sun3scsi_info
-#define NCR5380_dma_xfer_len(i, cmd, phase) \
- sun3scsi_dma_xfer_len(cmd->SCp.this_residual,cmd,((phase) & SR_IO) ? 0 : 1)
-
-#define NCR5380_dma_write_setup(instance, data, count) sun3scsi_dma_setup(data, count, 1)
-#define NCR5380_dma_read_setup(instance, data, count) sun3scsi_dma_setup(data, count, 0)
-#define NCR5380_dma_residual sun3scsi_dma_residual
-
/* additional registers - mainly DMA control regs */
/* these start at regbase + 8 -- directly after the NCR regs */
struct sun3_dma_regs {
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (25 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 26/36] sun3_scsi: Move macro definitions Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:21 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases Finn Thain
` (9 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: ncr5380-remove-ENABLE_IRQ-DISABLE_IRQ --]
[-- Type: text/plain, Size: 3647 bytes --]
atari_NCR5380.c enables its IRQ when it is already enabled. Sun3 doesn't
use the ENABLE_IRQ/DISABLE_IRQ cruft. Remove it.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_NCR5380.c | 2 --
drivers/scsi/atari_scsi.c | 21 ---------------------
drivers/scsi/sun3_NCR5380.c | 2 --
drivers/scsi/sun3_scsi.c | 7 -------
4 files changed, 32 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:45.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:52.000000000 +1100
@@ -1229,7 +1229,6 @@ static irqreturn_t NCR5380_intr(int irq,
NCR5380_dprint(NDEBUG_INTR, instance);
if ((NCR5380_read(STATUS_REG) & (SR_SEL|SR_IO)) == (SR_SEL|SR_IO)) {
done = 0;
- ENABLE_IRQ();
dprintk(NDEBUG_INTR, "scsi%d: SEL interrupt\n", HOSTNO);
NCR5380_reselect(instance);
(void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
@@ -1259,7 +1258,6 @@ static irqreturn_t NCR5380_intr(int irq,
dprintk(NDEBUG_INTR, "scsi%d: PHASE MISM or EOP interrupt\n", HOSTNO);
NCR5380_dma_complete( instance );
done = 0;
- ENABLE_IRQ();
} else
#endif /* REAL_DMA */
{
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:49.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:52.000000000 +1100
@@ -157,23 +157,6 @@ static inline unsigned long SCSI_DMA_GET
return adr;
}
-static inline void ENABLE_IRQ(void)
-{
- if (IS_A_TT())
- atari_enable_irq(IRQ_TT_MFP_SCSI);
- else
- atari_enable_irq(IRQ_MFP_FSCSI);
-}
-
-static inline void DISABLE_IRQ(void)
-{
- if (IS_A_TT())
- atari_disable_irq(IRQ_TT_MFP_SCSI);
- else
- atari_disable_irq(IRQ_MFP_FSCSI);
-}
-
-
#define HOSTDATA_DMALEN (((struct NCR5380_hostdata *) \
(atari_scsi_host->hostdata))->dma_len)
@@ -373,10 +356,6 @@ static irqreturn_t scsi_tt_intr(int irq,
NCR5380_intr(irq, dummy);
-#if 0
- /* To be sure the int is not masked */
- atari_enable_irq(IRQ_TT_MFP_SCSI);
-#endif
return IRQ_HANDLED;
}
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:52.000000000 +1100
@@ -1155,7 +1155,6 @@ static irqreturn_t NCR5380_intr (int irq
NCR5380_dprint(NDEBUG_INTR, instance);
if ((NCR5380_read(STATUS_REG) & (SR_SEL|SR_IO)) == (SR_SEL|SR_IO)) {
done = 0;
-// ENABLE_IRQ();
dprintk(NDEBUG_INTR, "scsi%d: SEL interrupt\n", HOSTNO);
NCR5380_reselect(instance);
(void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
@@ -1188,7 +1187,6 @@ static irqreturn_t NCR5380_intr (int irq
dprintk(NDEBUG_INTR, "scsi%d: PHASE MISM or EOP interrupt\n", HOSTNO);
NCR5380_dma_complete( instance );
done = 0;
-// ENABLE_IRQ();
} else
#endif /* REAL_DMA */
{
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:51.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:52.000000000 +1100
@@ -69,13 +69,6 @@
extern int sun3_map_test(unsigned long, char *);
-#ifdef SUN3_SCSI_VME
-#define ENABLE_IRQ()
-#else
-#define ENABLE_IRQ() enable_irq( IRQ_SUN3_SCSI );
-#endif
-
-
static int setup_can_queue = -1;
module_param(setup_can_queue, int, 0);
static int setup_cmd_per_lun = -1;
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (26 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:23 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking Finn Thain
` (8 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-refactor-falcon-special-case --]
[-- Type: text/plain, Size: 8584 bytes --]
Make the atari_NCR5380.c core driver usable by sun3_scsi, mac_scsi and
others by moving some of the Falcon-specific code out of the core driver:
!IS_A_TT, atari_read_overruns and falcon_dont_release. Replace these with
hostdata variables and flags. FLAG_CHECK_LAST_BYTE_SENT is unused in
atari_NCR5380.c so don't set it.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.h | 4 ++++
drivers/scsi/atari_NCR5380.c | 30 +++++++++++++++---------------
drivers/scsi/atari_scsi.c | 21 ++++++++++++---------
3 files changed, 31 insertions(+), 24 deletions(-)
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:52.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:54.000000000 +1100
@@ -196,8 +196,6 @@ static char *atari_dma_orig_addr;
/* mask for address bits that can't be used with the ST-DMA */
static unsigned long atari_dma_stram_mask;
#define STRAM_ADDR(a) (((a) & atari_dma_stram_mask) == 0)
-/* number of bytes to cut from a transfer to handle NCR overruns */
-static int atari_read_overruns;
#endif
static int setup_can_queue = -1;
@@ -446,8 +444,6 @@ static void atari_scsi_fetch_restbytes(v
#endif /* REAL_DMA */
-static int falcon_dont_release = 0;
-
/* This function releases the lock on the DMA chip if there is no
* connected command and the disconnected queue is empty.
*/
@@ -464,7 +460,7 @@ static void falcon_release_lock_if_possi
if (!hostdata->disconnected_queue &&
!hostdata->issue_queue &&
!hostdata->connected &&
- !falcon_dont_release &&
+ !hostdata->retain_dma_intr &&
stdma_is_locked_by(scsi_falcon_intr))
stdma_release();
@@ -847,6 +843,7 @@ static int __init atari_scsi_probe(struc
struct Scsi_Host *instance;
int error;
struct resource *irq;
+ int host_flags = 0;
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!irq)
@@ -943,7 +940,9 @@ static int __init atari_scsi_probe(struc
instance->irq = irq->start;
- NCR5380_init(instance, 0);
+ host_flags |= IS_A_TT() ? 0 : FLAG_LATE_DMA_SETUP;
+
+ NCR5380_init(instance, host_flags);
if (IS_A_TT()) {
error = request_irq(instance->irq, scsi_tt_intr, 0,
@@ -966,12 +965,16 @@ static int __init atari_scsi_probe(struc
*
* In principle it should be sufficient to do max. 1 byte with
* PIO, but there is another problem on the Medusa with the DMA
- * rest data register. So 'atari_read_overruns' is currently set
+ * rest data register. So read_overruns is currently set
* to 4 to avoid having transfers that aren't a multiple of 4.
* If the rest data bug is fixed, this can be lowered to 1.
*/
- if (MACH_IS_MEDUSA)
- atari_read_overruns = 4;
+ if (MACH_IS_MEDUSA) {
+ struct NCR5380_hostdata *hostdata =
+ shost_priv(instance);
+
+ hostdata->read_overruns = 4;
+ }
#endif
} else {
/* Nothing to do for the interrupt: the ST-DMA is initialized
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:36.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:54.000000000 +1100
@@ -241,6 +241,7 @@
#define FLAG_NCR53C400 4 /* NCR53c400 */
#define FLAG_NO_PSEUDO_DMA 8 /* Inhibit DMA */
#define FLAG_DTC3181E 16 /* DTC3181E */
+#define FLAG_LATE_DMA_SETUP 32 /* Setup NCR before DMA H/W */
#ifndef ASM
struct NCR5380_hostdata {
@@ -269,6 +270,9 @@ struct NCR5380_hostdata {
struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses;
char info[256];
+ int read_overruns; /* number of bytes to cut from a
+ * transfer to handle chip overruns */
+ int retain_dma_intr;
#ifdef PSEUDO_DMA
unsigned spin_max_r;
unsigned spin_max_w;
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:52.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
@@ -839,7 +839,7 @@ static int __init NCR5380_init(struct Sc
hostdata->connected = NULL;
hostdata->issue_queue = NULL;
hostdata->disconnected_queue = NULL;
- hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT;
+ hostdata->flags = flags;
if (!the_template) {
the_template = instance->hostt;
@@ -1056,7 +1056,7 @@ static void NCR5380_main(struct work_str
hostdata->issue_queue = NEXT(tmp);
}
SET_NEXT(tmp, NULL);
- falcon_dont_release++;
+ hostdata->retain_dma_intr++;
/* reenable interrupts after finding one */
local_irq_restore(flags);
@@ -1084,7 +1084,7 @@ static void NCR5380_main(struct work_str
cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
#endif
if (!NCR5380_select(instance, tmp)) {
- falcon_dont_release--;
+ hostdata->retain_dma_intr--;
/* release if target did not response! */
falcon_release_lock_if_possible(hostdata);
break;
@@ -1096,7 +1096,7 @@ static void NCR5380_main(struct work_str
#ifdef SUPPORT_TAGS
cmd_free_tag(tmp);
#endif
- falcon_dont_release--;
+ hostdata->retain_dma_intr--;
local_irq_restore(flags);
dprintk(NDEBUG_MAIN, "scsi%d: main(): select() failed, "
"returned to issue_queue\n", HOSTNO);
@@ -1153,7 +1153,7 @@ static void NCR5380_dma_complete(struct
return;
}
- if (atari_read_overruns) {
+ if (hostdata->read_overruns) {
p = hostdata->connected->SCp.phase;
if (p & SR_IO) {
udelay(10);
@@ -1183,9 +1183,9 @@ static void NCR5380_dma_complete(struct
*data += transfered;
*count -= transfered;
- if (atari_read_overruns) {
+ if (hostdata->read_overruns) {
if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) {
- cnt = toPIO = atari_read_overruns;
+ cnt = toPIO = hostdata->read_overruns;
if (overrun) {
dprintk(NDEBUG_DMA, "Got an input overrun, using saved byte\n");
*(*data)++ = saved_data;
@@ -1840,8 +1840,8 @@ static int NCR5380_transfer_dma(struct S
return -1;
}
- if (atari_read_overruns && (p & SR_IO))
- c -= atari_read_overruns;
+ if (hostdata->read_overruns && (p & SR_IO))
+ c -= hostdata->read_overruns;
dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
HOSTNO, (p & SR_IO) ? "reading" : "writing",
@@ -1853,7 +1853,7 @@ static int NCR5380_transfer_dma(struct S
NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_ENABLE_EOP_INTR | MR_MONITOR_BSY);
#endif /* def REAL_DMA */
- if (IS_A_TT()) {
+ if (!(hostdata->flags & FLAG_LATE_DMA_SETUP)) {
/* On the Medusa, it is a must to initialize the DMA before
* starting the NCR. This is also the cleaner way for the TT.
*/
@@ -1871,7 +1871,7 @@ static int NCR5380_transfer_dma(struct S
NCR5380_write(START_DMA_SEND_REG, 0);
}
- if (!IS_A_TT()) {
+ if (hostdata->flags & FLAG_LATE_DMA_SETUP) {
/* On the Falcon, the DMA setup must be done after the last */
/* NCR access, else the DMA setup gets trashed!
*/
@@ -2086,7 +2086,7 @@ static void NCR5380_information_transfer
/* Accept message by clearing ACK */
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
/* ++guenther: possible race with Falcon locking */
- falcon_dont_release++;
+ hostdata->retain_dma_intr++;
hostdata->connected = NULL;
dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
"completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
@@ -2169,7 +2169,7 @@ static void NCR5380_information_transfer
while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
barrier();
- falcon_dont_release--;
+ hostdata->retain_dma_intr--;
/* ++roman: For Falcon SCSI, release the lock on the
* ST-DMA here if no other commands are waiting on the
* disconnected queue.
@@ -2476,7 +2476,7 @@ static void NCR5380_reselect(struct Scsi
#endif
) {
/* ++guenther: prevent race with falcon_release_lock */
- falcon_dont_release++;
+ hostdata->retain_dma_intr++;
if (prev) {
REMOVE(prev, NEXT(prev), tmp, NEXT(tmp));
SET_NEXT(prev, NEXT(tmp));
@@ -2514,7 +2514,7 @@ static void NCR5380_reselect(struct Scsi
hostdata->connected = tmp;
dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
- falcon_dont_release--;
+ hostdata->retain_dma_intr--;
}
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (27 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:27 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c Finn Thain
` (7 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-refactor-falcon-locking --]
[-- Type: text/plain, Size: 11690 bytes --]
Simplify falcon_release_lock_if_possible() by making callers responsible for
disabling local IRQ's, which they must do anyway to correctly synchronize
the ST DMA "lock" with core driver data structures. Move this
synchronization logic to the core driver with which it is tightly coupled.
Other LLD's like sun3_scsi and mac_scsi that can make use of this core
driver can just stub out the NCR5380_acquire_dma_irq() and
NCR5380_release_dma_irq() calls so the compiler will eliminate the
ST DMA code.
Remove a redundant local_irq_save/restore pair (irq's are disabled for
interrupt handlers these days). Revise the locking for
atari_scsi_bus_reset(): use local_irq_save/restore() instead of
atari_turnoff/turnon_irq(). There is no guarantee that atari_scsi still
holds the ST DMA lock during EH, so atari_turnoff/turnon_irq() could
end up dropping an IDE or floppy interrupt.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_NCR5380.c | 72 ++++++++++++++++++++++++++-----------------
drivers/scsi/atari_scsi.c | 47 ++++++++++------------------
2 files changed, 62 insertions(+), 57 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
@@ -926,7 +926,7 @@ static int NCR5380_queue_command(struct
* alter queues and touch the lock.
*/
/* perhaps stop command timer here */
- if (!falcon_get_lock())
+ if (!NCR5380_acquire_dma_irq(instance))
return SCSI_MLQUEUE_HOST_BUSY;
/* perhaps restart command timer here */
@@ -962,6 +962,18 @@ static int NCR5380_queue_command(struct
return 0;
}
+static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
+{
+ 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 &&
+ !hostdata->connected &&
+ !hostdata->retain_dma_intr)
+ NCR5380_release_dma_irq(instance);
+}
+
/*
* Function : NCR5380_main (void)
*
@@ -1084,9 +1096,11 @@ static void NCR5380_main(struct work_str
cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
#endif
if (!NCR5380_select(instance, tmp)) {
+ local_irq_disable();
hostdata->retain_dma_intr--;
/* release if target did not response! */
- falcon_release_lock_if_possible(hostdata);
+ maybe_release_dma_irq(instance);
+ local_irq_restore(flags);
break;
} else {
local_irq_disable();
@@ -2085,11 +2099,12 @@ static void NCR5380_information_transfer
case COMMAND_COMPLETE:
/* Accept message by clearing ACK */
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- /* ++guenther: possible race with Falcon locking */
- hostdata->retain_dma_intr++;
- hostdata->connected = NULL;
dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
"completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
+
+ local_irq_save(flags);
+ hostdata->retain_dma_intr++;
+ hostdata->connected = NULL;
#ifdef SUPPORT_TAGS
cmd_free_tag(cmd);
if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
@@ -2148,17 +2163,17 @@ static void NCR5380_information_transfer
dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n", HOSTNO);
- local_irq_save(flags);
LIST(cmd,hostdata->issue_queue);
SET_NEXT(cmd, hostdata->issue_queue);
hostdata->issue_queue = (struct scsi_cmnd *) cmd;
- local_irq_restore(flags);
dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
"issue queue\n", H_NO(cmd));
} else {
cmd->scsi_done(cmd);
}
+ local_irq_restore(flags);
+
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
/*
* Restore phase bits to 0 so an interrupted selection,
@@ -2169,12 +2184,14 @@ static void NCR5380_information_transfer
while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
barrier();
+ local_irq_save(flags);
hostdata->retain_dma_intr--;
/* ++roman: For Falcon SCSI, release the lock on the
* ST-DMA here if no other commands are waiting on the
* disconnected queue.
*/
- falcon_release_lock_if_possible(hostdata);
+ maybe_release_dma_irq(instance);
+ local_irq_restore(flags);
return;
case MESSAGE_REJECT:
/* Accept message by clearing ACK */
@@ -2333,6 +2350,7 @@ static void NCR5380_information_transfer
hostdata->last_message = msgout;
NCR5380_transfer_pio(instance, &phase, &len, &data);
if (msgout == ABORT) {
+ local_irq_save(flags);
#ifdef SUPPORT_TAGS
cmd_free_tag(cmd);
#else
@@ -2340,9 +2358,10 @@ static void NCR5380_information_transfer
#endif
hostdata->connected = NULL;
cmd->result = DID_ERROR << 16;
- cmd->scsi_done(cmd);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- falcon_release_lock_if_possible(hostdata);
+ maybe_release_dma_irq(instance);
+ local_irq_restore(flags);
+ cmd->scsi_done(cmd);
return;
}
msgout = NOP;
@@ -2395,7 +2414,6 @@ static void NCR5380_reselect(struct Scsi
unsigned char msg[3];
unsigned char *data;
struct scsi_cmnd *tmp = NULL, *prev;
-/* unsigned long flags; */
/*
* Disable arbitration, etc. since the host adapter obviously
@@ -2475,8 +2493,6 @@ static void NCR5380_reselect(struct Scsi
&& (tag == tmp->tag)
#endif
) {
- /* ++guenther: prevent race with falcon_release_lock */
- hostdata->retain_dma_intr++;
if (prev) {
REMOVE(prev, NEXT(prev), tmp, NEXT(tmp));
SET_NEXT(prev, NEXT(tmp));
@@ -2514,7 +2530,6 @@ static void NCR5380_reselect(struct Scsi
hostdata->connected = tmp;
dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
- hostdata->retain_dma_intr--;
}
@@ -2590,12 +2605,12 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
#else
hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
#endif
+ maybe_release_dma_irq(instance);
local_irq_restore(flags);
cmd->scsi_done(cmd);
- falcon_release_lock_if_possible(hostdata);
return SUCCESS;
} else {
-/* local_irq_restore(flags); */
+ local_irq_restore(flags);
printk("scsi%d: abort of connected command failed!\n", HOSTNO);
return FAILED;
}
@@ -2614,13 +2629,13 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
(*prev) = NEXT(tmp);
SET_NEXT(tmp, NULL);
tmp->result = DID_ABORT << 16;
+ maybe_release_dma_irq(instance);
local_irq_restore(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);
- falcon_release_lock_if_possible(hostdata);
return SUCCESS;
}
}
@@ -2698,15 +2713,22 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
#else
hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
#endif
+ maybe_release_dma_irq(instance);
local_irq_restore(flags);
tmp->scsi_done(tmp);
- falcon_release_lock_if_possible(hostdata);
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);
+ local_irq_restore(flags);
+
/*
* Case 5 : If we reached this point, the command was not found in any of
* the queues.
@@ -2717,15 +2739,8 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
* broke.
*/
- local_irq_restore(flags);
printk(KERN_INFO "scsi%d: warning : SCSI command probably completed successfully before abortion\n", HOSTNO);
- /* 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.
- */
- falcon_release_lock_if_possible(hostdata);
-
return FAILED;
}
@@ -2741,14 +2756,15 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
{
- SETUP_HOSTDATA(cmd->device->host);
+ struct Scsi_Host *instance = cmd->device->host;
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
int i;
unsigned long flags;
#if defined(RESET_RUN_DONE)
struct scsi_cmnd *connected, *disconnected_queue;
#endif
- NCR5380_print_status(cmd->device->host);
+ NCR5380_print_status(instance);
/* get in phase */
NCR5380_write(TARGET_COMMAND_REG,
@@ -2873,6 +2889,8 @@ static int NCR5380_bus_reset(struct scsi
#ifdef REAL_DMA
hostdata->dma_len = 0;
#endif
+
+ maybe_release_dma_irq(instance);
local_irq_restore(flags);
/* we did no complete reset of all commands, so a wakeup is required */
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:54.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:55.000000000 +1100
@@ -109,6 +109,9 @@
#define NCR5380_dma_xfer_len(instance, cmd, phase) \
atari_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
+#define NCR5380_acquire_dma_irq(instance) falcon_get_lock()
+#define NCR5380_release_dma_irq(instance) falcon_release_lock()
+
#include "NCR5380.h"
@@ -448,23 +451,13 @@ static void atari_scsi_fetch_restbytes(v
* connected command and the disconnected queue is empty.
*/
-static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata)
+static void falcon_release_lock(void)
{
- unsigned long flags;
-
if (IS_A_TT())
return;
- local_irq_save(flags);
-
- if (!hostdata->disconnected_queue &&
- !hostdata->issue_queue &&
- !hostdata->connected &&
- !hostdata->retain_dma_intr &&
- stdma_is_locked_by(scsi_falcon_intr))
+ if (stdma_is_locked_by(scsi_falcon_intr))
stdma_release();
-
- local_irq_restore(flags);
}
/* This function manages the locking of the ST-DMA.
@@ -788,36 +781,30 @@ static void atari_scsi_falcon_reg_write(
static int atari_scsi_bus_reset(struct scsi_cmnd *cmd)
{
int rv;
- struct NCR5380_hostdata *hostdata = shost_priv(cmd->device->host);
+ unsigned long flags;
+
+ local_irq_save(flags);
- /* For doing the reset, SCSI interrupts must be disabled first,
- * since the 5380 raises its IRQ line while _RST is active and we
- * can't disable interrupts completely, since we need the timer.
- */
- /* And abort a maybe active DMA transfer */
- if (IS_A_TT()) {
- atari_turnoff_irq(IRQ_TT_MFP_SCSI);
#ifdef REAL_DMA
+ /* Abort a maybe active DMA transfer */
+ if (IS_A_TT()) {
tt_scsi_dma.dma_ctrl = 0;
-#endif
} else {
- atari_turnoff_irq(IRQ_MFP_FSCSI);
-#ifdef REAL_DMA
st_dma.dma_mode_status = 0x90;
atari_dma_active = 0;
atari_dma_orig_addr = NULL;
-#endif
}
+#endif
rv = NCR5380_bus_reset(cmd);
- if (IS_A_TT())
- atari_turnon_irq(IRQ_TT_MFP_SCSI);
- else
- atari_turnon_irq(IRQ_MFP_FSCSI);
+ /* The 5380 raises its IRQ line while _RST is active but the ST DMA
+ * "lock" has been released so this interrupt may end up handled by
+ * floppy or IDE driver (if one of them holds the lock). The NCR5380
+ * interrupt flag has been cleared already.
+ */
- if (rv == SUCCESS)
- falcon_release_lock_if_possible(hostdata);
+ local_irq_restore(flags);
return rv;
}
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (28 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:33 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c Finn Thain
` (6 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-merge-from-sun3_NCR5380 --]
[-- Type: text/plain, Size: 14938 bytes --]
There is very little difference between the sun3_NCR5380.c core driver
and atari_NCR5380.c. The former is a fork of the latter.
Merge the sun3_NCR5380.c core driver into atari_NCR5380.c so that
sun3_scsi.c can adopt the latter and the former can be deleted.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
This patch brings some undesirable #ifdef's to atari_NCR5380. It's a small
price to pay for the elimination of so much duplication. Eventually, with
some testing, it should be possible to remove many of these.
Elimination of the SUN3_SCSI_VME macro is necessary to reach the goal of a
single platform driver to replace the {atari,mac,sun3,sun3_vme}_scsi modules.
Elimination of the #ifdef CONFIG_SUN3 tests is not necessary. But some of
these would go away if the sun3 driver followed the atari logic more
closely, such as use of PIO vs DMA for certain phases and transfer sizes.
After applying this patch it is easy to compare the new atari_NCR5380.c
with sun3_NCR5380.c, to check that they are equivalent. E.g.
$ cp drivers/scsi/{sun3,atari}_NCR5380.c /tmp
$ sed -i -e 's/ *$//' /tmp/{sun3,atari}_NCR5380.c
$ scripts/Lindent -l96 -hnl /tmp/{sun3,atari}_NCR5380.c
$ meld /tmp/{sun3,atari}_NCR5380.c
One can see that the two implementations of tagged command queueing have
diverged since the fork. The atari version has been updated and the sun3
implementation is unused as sun3_scsi.c does not define SUPPORT_TAGS.
The remaining differences are merge_contiguous_buffers() and the falcon
locking code. The falcon code disappears when suitable macro definitions are
provided in sun3_scsi.c. merge_contiguous_buffers() could be a problem
for sun3 (due to a DMA setup in an odd place) so it is #ifdef'd for sun3
until the DMA setup discrepancies can be reconciled or moved out of
the core driver.
---
drivers/scsi/atari_NCR5380.c | 210 +++++++++++++++++++++++++++++++++++++++----
drivers/scsi/atari_scsi.c | 1
2 files changed, 195 insertions(+), 16 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:56.000000000 +1100
@@ -71,6 +71,9 @@
* 1. Test linked command handling code after Eric is ready with
* the high level code.
*/
+
+/* Adapted for the sun3 by Sam Creasey. */
+
#include <scsi/scsi_dbg.h>
#include <scsi/scsi_transport_spi.h>
@@ -458,6 +461,7 @@ static void free_all_tags(void)
static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
{
+#if !defined(CONFIG_SUN3)
unsigned long endaddr;
#if (NDEBUG & NDEBUG_MERGING)
unsigned long oldlen = cmd->SCp.this_residual;
@@ -482,6 +486,7 @@ static void merge_contiguous_buffers(str
dprintk(NDEBUG_MERGING, "merged %d buffers from %p, new length %08x\n",
cnt, cmd->SCp.ptr, cmd->SCp.this_residual);
#endif
+#endif /* !defined(CONFIG_SUN3) */
}
/*
@@ -1043,12 +1048,10 @@ static void NCR5380_main(struct work_str
prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
u8 lun = tmp->device->lun;
-#if (NDEBUG & NDEBUG_LISTS)
- if (prev != tmp)
- printk("MAIN tmp=%p target=%d busy=%d lun=%llu\n",
- tmp, tmp->device->id, hostdata->busy[tmp->device->id],
- lun);
-#endif
+ dprintk(NDEBUG_LISTS,
+ "MAIN tmp=%p target=%d busy=%d lun=%d\n",
+ tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],
+ lun);
/* When we find one, remove it from the issue queue. */
/* ++guenther: possible race with Falcon locking */
if (
@@ -1157,9 +1160,11 @@ static void NCR5380_main(struct work_str
static void NCR5380_dma_complete(struct Scsi_Host *instance)
{
SETUP_HOSTDATA(instance);
- int transfered, saved_data = 0, overrun = 0, cnt, toPIO;
- unsigned char **data, p;
+ int transfered;
+ unsigned char **data;
volatile int *count;
+ int saved_data = 0, overrun = 0;
+ unsigned char p;
if (!hostdata->connected) {
printk(KERN_WARNING "scsi%d: received end of DMA interrupt with "
@@ -1185,6 +1190,26 @@ static void NCR5380_dma_complete(struct
HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
NCR5380_read(STATUS_REG));
+#if defined(CONFIG_SUN3)
+ if ((sun3scsi_dma_finish(rq_data_dir(hostdata->connected->request)))) {
+ pr_err("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n",
+ instance->host_no);
+ pr_err("please e-mail sammy@sammy.net with a description of how this error was produced.\n");
+ BUG();
+ }
+
+ /* make sure we're not stuck in a data phase */
+ if ((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH | BASR_ACK)) ==
+ (BASR_PHASE_MATCH | BASR_ACK)) {
+ pr_err("scsi%d: BASR %02x\n", instance->host_no,
+ NCR5380_read(BUS_AND_STATUS_REG));
+ pr_err("scsi%d: bus stuck in data phase -- probably a single byte overrun!\n",
+ instance->host_no);
+ pr_err("not prepared for this error! please e-mail sammy@sammy.net with a description of how this error was produced.\n");
+ BUG();
+ }
+#endif
+
(void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
NCR5380_write(MODE_REG, MR_BASE);
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
@@ -1198,6 +1223,8 @@ static void NCR5380_dma_complete(struct
*count -= transfered;
if (hostdata->read_overruns) {
+ int cnt, toPIO;
+
if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) {
cnt = toPIO = hostdata->read_overruns;
if (overrun) {
@@ -1277,11 +1304,14 @@ static irqreturn_t NCR5380_intr(int irq,
{
/* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */
if (basr & BASR_PHASE_MATCH)
- printk(KERN_NOTICE "scsi%d: unknown interrupt, "
+ dprintk(NDEBUG_INTR, "scsi%d: unknown interrupt, "
"BASR 0x%x, MR 0x%x, SR 0x%x\n",
HOSTNO, basr, NCR5380_read(MODE_REG),
NCR5380_read(STATUS_REG));
(void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_DMA_ENABLE;
+#endif
}
} /* if !(SELECTION || PARITY) */
handled = 1;
@@ -1290,6 +1320,9 @@ static irqreturn_t NCR5380_intr(int irq,
"BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr,
NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
(void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_DMA_ENABLE;
+#endif
}
if (!done) {
@@ -1622,6 +1655,9 @@ static int NCR5380_select(struct Scsi_Ho
#ifndef SUPPORT_TAGS
hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
#endif
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_INTR;
+#endif
initialize_SCp(cmd);
@@ -1845,9 +1881,54 @@ static int NCR5380_transfer_dma(struct S
SETUP_HOSTDATA(instance);
register int c = *count;
register unsigned char p = *phase;
+ unsigned long flags;
+
+#if defined(CONFIG_SUN3)
+ /* sanity check */
+ if (!sun3_dma_setup_done) {
+ pr_err("scsi%d: transfer_dma without setup!\n",
+ instance->host_no);
+ BUG();
+ }
+ hostdata->dma_len = c;
+
+ dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
+ instance->host_no, (p & SR_IO) ? "reading" : "writing",
+ c, (p & SR_IO) ? "to" : "from", *data);
+
+ /* netbsd turns off ints here, why not be safe and do it too */
+ local_irq_save(flags);
+
+ /* send start chain */
+ sun3scsi_dma_start(c, *data);
+
+ if (p & SR_IO) {
+ NCR5380_write(TARGET_COMMAND_REG, 1);
+ NCR5380_read(RESET_PARITY_INTERRUPT_REG);
+ NCR5380_write(INITIATOR_COMMAND_REG, 0);
+ NCR5380_write(MODE_REG,
+ (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
+ NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
+ } else {
+ NCR5380_write(TARGET_COMMAND_REG, 0);
+ NCR5380_read(RESET_PARITY_INTERRUPT_REG);
+ NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_DATA);
+ NCR5380_write(MODE_REG,
+ (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
+ NCR5380_write(START_DMA_SEND_REG, 0);
+ }
+
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_DMA_ENABLE;
+#endif
+
+ local_irq_restore(flags);
+
+ sun3_dma_active = 1;
+
+#else /* !defined(CONFIG_SUN3) */
register unsigned char *d = *data;
unsigned char tmp;
- unsigned long flags;
if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) {
*phase = tmp;
@@ -1895,6 +1976,8 @@ static int NCR5380_transfer_dma(struct S
NCR5380_dma_write_setup(instance, d, c);
local_irq_restore(flags);
}
+#endif /* !defined(CONFIG_SUN3) */
+
return 0;
}
#endif /* defined(REAL_DMA) */
@@ -1930,6 +2013,10 @@ static void NCR5380_information_transfer
unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_INTR;
+#endif
+
while (1) {
tmp = NCR5380_read(STATUS_REG);
/* We only have a valid SCSI phase when REQ is asserted */
@@ -1939,6 +2026,33 @@ static void NCR5380_information_transfer
old_phase = phase;
NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
}
+#if defined(CONFIG_SUN3)
+ if (phase == PHASE_CMDOUT) {
+#if defined(REAL_DMA)
+ void *d;
+ unsigned long count;
+
+ if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
+ count = cmd->SCp.buffer->length;
+ d = sg_virt(cmd->SCp.buffer);
+ } else {
+ count = cmd->SCp.this_residual;
+ d = cmd->SCp.ptr;
+ }
+ /* this command setup for dma yet? */
+ if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != cmd)) {
+ if (cmd->request->cmd_type == REQ_TYPE_FS) {
+ sun3scsi_dma_setup(d, count,
+ rq_data_dir(cmd->request));
+ sun3_dma_setup_done = cmd;
+ }
+ }
+#endif
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_INTR;
+#endif
+ }
+#endif /* CONFIG_SUN3 */
if (sink && (phase != PHASE_MSGOUT)) {
NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
@@ -2000,8 +2114,11 @@ static void NCR5380_information_transfer
*/
#if defined(REAL_DMA)
- if (!cmd->device->borken &&
- (transfersize = NCR5380_dma_xfer_len(instance,cmd,phase)) > 31) {
+ if (
+#if !defined(CONFIG_SUN3)
+ !cmd->device->borken &&
+#endif
+ (transfersize = NCR5380_dma_xfer_len(instance, cmd, phase)) >= DMA_MIN_SIZE) {
len = transfersize;
cmd->SCp.phase = phase;
if (NCR5380_transfer_dma(instance, &phase,
@@ -2038,6 +2155,11 @@ static void NCR5380_information_transfer
NCR5380_transfer_pio(instance, &phase,
(int *)&cmd->SCp.this_residual,
(unsigned char **)&cmd->SCp.ptr);
+#if defined(CONFIG_SUN3) && defined(REAL_DMA)
+ /* if we had intended to dma that command clear it */
+ if (sun3_dma_setup_done == cmd)
+ sun3_dma_setup_done = NULL;
+#endif
break;
case PHASE_MSGIN:
len = 1;
@@ -2243,6 +2365,9 @@ static void NCR5380_information_transfer
/* Wait for bus free to avoid nasty timeouts */
while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
barrier();
+#ifdef SUN3_SCSI_VME
+ dregs->csr |= CSR_DMA_ENABLE;
+#endif
return;
/*
* The SCSI data pointer is *IMPLICITLY* saved on a disconnect
@@ -2402,17 +2527,20 @@ static void NCR5380_information_transfer
*/
+/* it might eventually prove necessary to do a dma setup on
+ reselection, but it doesn't seem to be needed now -- sam */
+
static void NCR5380_reselect(struct Scsi_Host *instance)
{
SETUP_HOSTDATA(instance);
unsigned char target_mask;
- unsigned char lun, phase;
- int len;
+ unsigned char lun;
#ifdef SUPPORT_TAGS
unsigned char tag;
#endif
unsigned char msg[3];
- unsigned char *data;
+ int __maybe_unused len;
+ unsigned char __maybe_unused *data, __maybe_unused phase;
struct scsi_cmnd *tmp = NULL, *prev;
/*
@@ -2449,10 +2577,18 @@ static void NCR5380_reselect(struct Scsi
while (!(NCR5380_read(STATUS_REG) & SR_REQ))
;
+#if defined(CONFIG_SUN3) && defined(REAL_DMA)
+ /* acknowledge toggle to MSGIN */
+ NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(PHASE_MSGIN));
+
+ /* peek at the byte without really hitting the bus */
+ msg[0] = NCR5380_read(CURRENT_SCSI_DATA_REG);
+#else
len = 1;
data = msg;
phase = PHASE_MSGIN;
NCR5380_transfer_pio(instance, &phase, &len, &data);
+#endif
if (!(msg[0] & 0x80)) {
printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
@@ -2462,7 +2598,7 @@ static void NCR5380_reselect(struct Scsi
}
lun = (msg[0] & 0x07);
-#ifdef SUPPORT_TAGS
+#if defined(SUPPORT_TAGS) && !defined(CONFIG_SUN3)
/* If the phase is still MSGIN, the target wants to send some more
* messages. In case it supports tagged queuing, this is probably a
* SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
@@ -2524,9 +2660,51 @@ static void NCR5380_reselect(struct Scsi
return;
}
+#if defined(CONFIG_SUN3) && defined(REAL_DMA)
+ /* engage dma setup for the command we just saw */
+ {
+ void *d;
+ unsigned long count;
+
+ if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
+ count = tmp->SCp.buffer->length;
+ d = sg_virt(tmp->SCp.buffer);
+ } else {
+ count = tmp->SCp.this_residual;
+ d = tmp->SCp.ptr;
+ }
+ /* setup this command for dma if not already */
+ if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != tmp)) {
+ sun3scsi_dma_setup(d, count, rq_data_dir(tmp->request));
+ sun3_dma_setup_done = tmp;
+ }
+ }
+
+ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
+#endif
+
/* Accept message by clearing ACK */
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+#if defined(SUPPORT_TAGS) && defined(CONFIG_SUN3)
+ /* If the phase is still MSGIN, the target wants to send some more
+ * messages. In case it supports tagged queuing, this is probably a
+ * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
+ */
+ tag = TAG_NONE;
+ if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
+ /* Accept previous IDENTIFY message by clearing ACK */
+ NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
+ len = 2;
+ data = msg + 1;
+ if (!NCR5380_transfer_pio(instance, &phase, &len, &data) &&
+ msg[1] == SIMPLE_QUEUE_TAG)
+ tag = msg[2];
+ dprintk(NDEBUG_TAGS, "scsi%d: target mask %02x, lun %d sent tag %d at reselection\n"
+ HOSTNO, target_mask, lun, tag);
+ }
+#endif
+
hostdata->connected = tmp;
dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:55.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:56.000000000 +1100
@@ -89,6 +89,7 @@
#define REAL_DMA
#define SUPPORT_TAGS
#define MAX_TAGS 32
+#define DMA_MIN_SIZE 32
#define NCR5380_implementation_fields /* none */
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (29 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:35 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c Finn Thain
` (5 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: sun3_scsi-adopt-atari_NCR5380 --]
[-- Type: TEXT/PLAIN, Size: 99617 bytes --]
Given the preceding changes to atari_NCR5380.c, this patch should not change
behaviour of the sun3_scsi and sun3_scsi_vme modules.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
MAINTAINERS | 1
drivers/scsi/sun3_NCR5380.c | 2849 --------------------------------------------
drivers/scsi/sun3_scsi.c | 10
3 files changed, 6 insertions(+), 2854 deletions(-)
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:52.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:58.000000000 +1100
@@ -41,6 +41,8 @@
#define REAL_DMA
#define RESET_RUN_DONE
/* #define SUPPORT_TAGS */
+/* minimum number of bytes to do dma on */
+#define DMA_MIN_SIZE 129
/* #define MAX_TAGS 32 */
@@ -64,6 +66,9 @@
#define NCR5380_dma_xfer_len(instance, cmd, phase) \
sun3scsi_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
+#define NCR5380_acquire_dma_irq(instance) (1)
+#define NCR5380_release_dma_irq(instance)
+
#include "NCR5380.h"
@@ -92,9 +97,6 @@ module_param(setup_hostid, int, 0);
/* dvma buffer to allocate -- 32k should hopefully be more than sufficient */
#define SUN3_DVMA_BUFSIZE 0xe000
-/* minimum number of bytes to do dma on */
-#define SUN3_DMA_MINSIZE 128
-
static struct scsi_cmnd *sun3_dma_setup_done;
static unsigned char *sun3_scsi_regp;
static volatile struct sun3_dma_regs *dregs;
@@ -486,7 +488,7 @@ static int sun3scsi_dma_finish(int write
}
-#include "sun3_NCR5380.c"
+#include "atari_NCR5380.c"
#ifdef SUN3_SCSI_VME
#define SUN3_SCSI_NAME "Sun3 NCR5380 VME SCSI"
Index: linux/MAINTAINERS
===================================================================
--- linux.orig/MAINTAINERS 2014-10-27 16:17:59.000000000 +1100
+++ linux/MAINTAINERS 2014-10-27 16:25:58.000000000 +1100
@@ -6171,7 +6171,6 @@ F: drivers/scsi/g_NCR5380.*
F: drivers/scsi/g_NCR5380_mmio.c
F: drivers/scsi/mac_scsi.*
F: drivers/scsi/pas16.*
-F: drivers/scsi/sun3_NCR5380.c
F: drivers/scsi/sun3_scsi.*
F: drivers/scsi/sun3_scsi_vme.c
F: drivers/scsi/t128.*
Index: linux/drivers/scsi/sun3_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/sun3_NCR5380.c 2014-10-27 16:25:52.000000000 +1100
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,2849 +0,0 @@
-/* sun3_NCR5380.c -- adapted from atari_NCR5380.c for the sun3 by
- Sam Creasey. */
-/*
- * NCR 5380 generic driver routines. These should make it *trivial*
- * to implement 5380 SCSI drivers under Linux with a non-trantor
- * architecture.
- *
- * Note that these routines also work with NR53c400 family chips.
- *
- * Copyright 1993, Drew Eckhardt
- * Visionary Computing
- * (Unix and Linux consulting and custom programming)
- * drew@colorado.edu
- * +1 (303) 666-5836
- *
- * For more information, please consult
- *
- * NCR 5380 Family
- * SCSI Protocol Controller
- * Databook
- *
- * NCR Microelectronics
- * 1635 Aeroplaza Drive
- * Colorado Springs, CO 80916
- * 1+ (719) 578-3400
- * 1+ (800) 334-5454
- */
-
-/*
- * ++roman: To port the 5380 driver to the Atari, I had to do some changes in
- * this file, too:
- *
- * - Some of the debug statements were incorrect (undefined variables and the
- * like). I fixed that.
- *
- * - In information_transfer(), I think a #ifdef was wrong. Looking at the
- * possible DMA transfer size should also happen for REAL_DMA. I added this
- * in the #if statement.
- *
- * - When using real DMA, information_transfer() should return in a DATAOUT
- * phase after starting the DMA. It has nothing more to do.
- *
- * - The interrupt service routine should run main after end of DMA, too (not
- * only after RESELECTION interrupts). Additionally, it should _not_ test
- * for more interrupts after running main, since a DMA process may have
- * been started and interrupts are turned on now. The new int could happen
- * inside the execution of NCR5380_intr(), leading to recursive
- * calls.
- *
- * - I've deleted all the stuff for AUTOPROBE_IRQ, REAL_DMA_POLL, PSEUDO_DMA
- * and USLEEP, because these were messing up readability and will never be
- * needed for Atari SCSI.
- *
- * - I've revised the NCR5380_main() calling scheme (relax the 'main_running'
- * stuff), and 'main' is executed in a bottom half if awoken by an
- * interrupt.
- *
- * - The code was quite cluttered up by "#if (NDEBUG & NDEBUG_*) printk..."
- * constructs. In my eyes, this made the source rather unreadable, so I
- * finally replaced that by the *_PRINTK() macros.
- *
- */
-#include <scsi/scsi_dbg.h>
-#include <scsi/scsi_transport_spi.h>
-
-/*
- * Further development / testing that should be done :
- * 1. Test linked command handling code after Eric is ready with
- * the high level code.
- */
-
-#if (NDEBUG & NDEBUG_LISTS)
-#define LIST(x,y) \
- { printk("LINE:%d Adding %p to %p\n", __LINE__, (void*)(x), (void*)(y)); \
- if ((x)==(y)) udelay(5); }
-#define REMOVE(w,x,y,z) \
- { printk("LINE:%d Removing: %p->%p %p->%p \n", __LINE__, \
- (void*)(w), (void*)(x), (void*)(y), (void*)(z)); \
- if ((x)==(y)) udelay(5); }
-#else
-#define LIST(x,y)
-#define REMOVE(w,x,y,z)
-#endif
-
-#ifndef notyet
-#undef LINKED
-#endif
-
-/*
- * Design
- * Issues :
- *
- * The other Linux SCSI drivers were written when Linux was Intel PC-only,
- * and specifically for each board rather than each chip. This makes their
- * adaptation to platforms like the Mac (Some of which use NCR5380's)
- * more difficult than it has to be.
- *
- * Also, many of the SCSI drivers were written before the command queuing
- * routines were implemented, meaning their implementations of queued
- * commands were hacked on rather than designed in from the start.
- *
- * When I designed the Linux SCSI drivers I figured that
- * while having two different SCSI boards in a system might be useful
- * for debugging things, two of the same type wouldn't be used.
- * Well, I was wrong and a number of users have mailed me about running
- * multiple high-performance SCSI boards in a server.
- *
- * Finally, when I get questions from users, I have no idea what
- * revision of my driver they are running.
- *
- * This driver attempts to address these problems :
- * This is a generic 5380 driver. To use it on a different platform,
- * one simply writes appropriate system specific macros (ie, data
- * transfer - some PC's will use the I/O bus, 68K's must use
- * memory mapped) and drops this file in their 'C' wrapper.
- *
- * As far as command queueing, two queues are maintained for
- * each 5380 in the system - commands that haven't been issued yet,
- * and commands that are currently executing. This means that an
- * unlimited number of commands may be queued, letting
- * more commands propagate from the higher driver levels giving higher
- * throughput. Note that both I_T_L and I_T_L_Q nexuses are supported,
- * allowing multiple commands to propagate all the way to a SCSI-II device
- * while a command is already executing.
- *
- * To solve the multiple-boards-in-the-same-system problem,
- * there is a separate instance structure for each instance
- * of a 5380 in the system. So, multiple NCR5380 drivers will
- * be able to coexist with appropriate changes to the high level
- * SCSI code.
- *
- * Issues specific to the NCR5380 :
- *
- * When used in a PIO or pseudo-dma mode, the NCR5380 is a braindead
- * 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
- * broken devices are the exception rather than the rule and I'd rather
- * spend my time optimizing for the normal case.
- *
- * Architecture :
- *
- * At the heart of the design is a coroutine, NCR5380_main,
- * which is started when not running by the interrupt handler,
- * timer, and queue command function. It attempts to establish
- * I_T_L or I_T_L_Q nexuses by removing the commands from the
- * issue queue and calling NCR5380_select() if a nexus
- * is not established.
- *
- * Once a nexus is established, the NCR5380_information_transfer()
- * phase goes through the various phases as instructed by the target.
- * if the target goes into MSG IN and sends a DISCONNECT message,
- * the command structure is placed into the per instance disconnected
- * queue, and NCR5380_main tries to find more work. If USLEEP
- * was defined, and the target is idle for too long, the system
- * will try to sleep.
- *
- * If a command has disconnected, eventually an interrupt will trigger,
- * calling NCR5380_intr() which will in turn call NCR5380_reselect
- * to reestablish a nexus. This will run main if necessary.
- *
- * On command termination, the done function will be called as
- * appropriate.
- *
- * SCSI pointers are maintained in the SCp field of SCSI command
- * structures, being initialized after the command is connected
- * in NCR5380_select, and set as appropriate in NCR5380_information_transfer.
- * Note that in violation of the standard, an implicit SAVE POINTERS operation
- * is done, since some BROKEN disks fail to issue an explicit SAVE POINTERS.
- */
-
-/*
- * Using this file :
- * This file a skeleton Linux SCSI driver for the NCR 5380 series
- * of chips. To use it, you write an architecture specific functions
- * and macros and include this file in your driver.
- *
- * These macros control options :
- * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
- * for commands that return with a CHECK CONDITION status.
- *
- * LINKED - if defined, linked commands are supported.
- *
- * REAL_DMA - if defined, REAL DMA is used during the data transfer phases.
- *
- * SUPPORT_TAGS - if defined, SCSI-2 tagged queuing is used where possible
- *
- * These macros MUST be defined :
- *
- * NCR5380_read(register) - read from the specified register
- *
- * NCR5380_write(register, value) - write to the specific register
- *
- * Either real DMA *or* pseudo DMA may be implemented
- * REAL functions :
- * NCR5380_REAL_DMA should be defined if real DMA is to be used.
- * Note that the DMA setup functions should return the number of bytes
- * that they were able to program the controller for.
- *
- * Also note that generic i386/PC versions of these macros are
- * available as NCR5380_i386_dma_write_setup,
- * NCR5380_i386_dma_read_setup, and NCR5380_i386_dma_residual.
- *
- * NCR5380_dma_write_setup(instance, src, count) - initialize
- * NCR5380_dma_read_setup(instance, dst, count) - initialize
- * NCR5380_dma_residual(instance); - residual count
- *
- * PSEUDO functions :
- * NCR5380_pwrite(instance, src, count)
- * NCR5380_pread(instance, dst, count);
- *
- * If nothing specific to this implementation needs doing (ie, with external
- * hardware), you must also define
- *
- * NCR5380_queue_command
- * NCR5380_reset
- * NCR5380_abort
- *
- * to be the global entry points into the specific driver, ie
- * #define NCR5380_queue_command t128_queue_command.
- *
- * If this is not done, the routines will be defined as static functions
- * with the NCR5380* names and the user must provide a globally
- * accessible wrapper function.
- *
- * The generic driver is initialized by calling NCR5380_init(instance),
- * after setting the appropriate host specific fields and ID. If the
- * driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
- * possible) function may be used.
- */
-
-static struct Scsi_Host *first_instance = NULL;
-static struct scsi_host_template *the_template = NULL;
-
-/* Macros ease life... :-) */
-#define SETUP_HOSTDATA(in) \
- struct NCR5380_hostdata *hostdata = \
- (struct NCR5380_hostdata *)(in)->hostdata
-#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata)
-
-#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
-#define H_NO(cmd) (cmd)->device->host->host_no
-
-#define SGADDR(buffer) (void *)(((unsigned long)sg_virt(((buffer)))))
-
-#ifdef SUPPORT_TAGS
-
-/*
- * Functions for handling tagged queuing
- * =====================================
- *
- * ++roman (01/96): Now I've implemented SCSI-2 tagged queuing. Some notes:
- *
- * Using consecutive numbers for the tags is no good idea in my eyes. There
- * could be wrong re-usings if the counter (8 bit!) wraps and some early
- * command has been preempted for a long time. My solution: a bitfield for
- * remembering used tags.
- *
- * There's also the problem that each target has a certain queue size, but we
- * cannot know it in advance :-( We just see a QUEUE_FULL status being
- * returned. So, in this case, the driver internal queue size assumption is
- * reduced to the number of active tags if QUEUE_FULL is returned by the
- * target. The command is returned to the mid-level, but with status changed
- * to BUSY, since --as I've seen-- the mid-level can't handle QUEUE_FULL
- * correctly.
- *
- * We're also not allowed running tagged commands as long as an untagged
- * command is active. And REQUEST SENSE commands after a contingent allegiance
- * condition _must_ be untagged. To keep track whether an untagged command has
- * been issued, the host->busy array is still employed, as it is without
- * support for tagged queuing.
- *
- * One could suspect that there are possible race conditions between
- * is_lun_busy(), cmd_get_tag() and cmd_free_tag(). But I think this isn't the
- * case: is_lun_busy() and cmd_get_tag() are both called from NCR5380_main(),
- * which already guaranteed to be running at most once. It is also the only
- * place where tags/LUNs are allocated. So no other allocation can slip
- * between that pair, there could only happen a reselection, which can free a
- * tag, but that doesn't hurt. Only the sequence in cmd_free_tag() becomes
- * important: the tag bit must be cleared before 'nr_allocated' is decreased.
- */
-
-/* For the m68k, the number of bits in 'allocated' must be a multiple of 32! */
-#if (MAX_TAGS % 32) != 0
-#error "MAX_TAGS must be a multiple of 32!"
-#endif
-
-typedef struct {
- char allocated[MAX_TAGS/8];
- int nr_allocated;
- int queue_size;
-} TAG_ALLOC;
-
-static TAG_ALLOC TagAlloc[8][8]; /* 8 targets and 8 LUNs */
-
-
-static void __init init_tags( void )
-{
- int target, lun;
- TAG_ALLOC *ta;
-
- if (!setup_use_tagged_queuing)
- return;
-
- for( target = 0; target < 8; ++target ) {
- for( lun = 0; lun < 8; ++lun ) {
- ta = &TagAlloc[target][lun];
- memset( &ta->allocated, 0, MAX_TAGS/8 );
- ta->nr_allocated = 0;
- /* At the beginning, assume the maximum queue size we could
- * support (MAX_TAGS). This value will be decreased if the target
- * returns QUEUE_FULL status.
- */
- ta->queue_size = MAX_TAGS;
- }
- }
-}
-
-
-/* Check if we can issue a command to this LUN: First see if the LUN is marked
- * busy by an untagged command. If the command should use tagged queuing, also
- * check that there is a free tag and the target's queue won't overflow. This
- * function should be called with interrupts disabled to avoid race
- * conditions.
- */
-
-static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged)
-{
- u8 lun = cmd->device->lun;
- SETUP_HOSTDATA(cmd->device->host);
-
- if (hostdata->busy[cmd->device->id] & (1 << lun))
- return( 1 );
- if (!should_be_tagged ||
- !setup_use_tagged_queuing || !cmd->device->tagged_supported)
- return( 0 );
- if (TagAlloc[cmd->device->id][lun].nr_allocated >=
- TagAlloc[cmd->device->id][lun].queue_size ) {
- dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d: no free tags\n",
- H_NO(cmd), cmd->device->id, lun );
- return( 1 );
- }
- return( 0 );
-}
-
-
-/* Allocate a tag for a command (there are no checks anymore, check_lun_busy()
- * must be called before!), or reserve the LUN in 'busy' if the command is
- * untagged.
- */
-
-static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
-{
- u8 lun = cmd->device->lun;
- SETUP_HOSTDATA(cmd->device->host);
-
- /* If we or the target don't support tagged queuing, allocate the LUN for
- * an untagged command.
- */
- if (!should_be_tagged ||
- !setup_use_tagged_queuing || !cmd->device->tagged_supported) {
- cmd->tag = TAG_NONE;
- hostdata->busy[cmd->device->id] |= (1 << lun);
- dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d now allocated by untagged "
- "command\n", H_NO(cmd), cmd->device->id, lun );
- }
- else {
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
-
- cmd->tag = find_first_zero_bit( &ta->allocated, MAX_TAGS );
- set_bit( cmd->tag, &ta->allocated );
- ta->nr_allocated++;
- dprintk(NDEBUG_TAGS, "scsi%d: using tag %d for target %d lun %d "
- "(now %d tags in use)\n",
- H_NO(cmd), cmd->tag, cmd->device->id, lun,
- ta->nr_allocated );
- }
-}
-
-
-/* Mark the tag of command 'cmd' as free, or in case of an untagged command,
- * unlock the LUN.
- */
-
-static void cmd_free_tag(struct scsi_cmnd *cmd)
-{
- u8 lun = cmd->device->lun;
- SETUP_HOSTDATA(cmd->device->host);
-
- if (cmd->tag == TAG_NONE) {
- hostdata->busy[cmd->device->id] &= ~(1 << lun);
- dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d untagged cmd finished\n",
- H_NO(cmd), cmd->device->id, lun );
- }
- else if (cmd->tag >= MAX_TAGS) {
- printk(KERN_NOTICE "scsi%d: trying to free bad tag %d!\n",
- H_NO(cmd), cmd->tag );
- }
- else {
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
- clear_bit( cmd->tag, &ta->allocated );
- ta->nr_allocated--;
- dprintk(NDEBUG_TAGS, "scsi%d: freed tag %d for target %d lun %d\n",
- H_NO(cmd), cmd->tag, cmd->device->id, lun );
- }
-}
-
-
-static void free_all_tags( void )
-{
- int target, lun;
- TAG_ALLOC *ta;
-
- if (!setup_use_tagged_queuing)
- return;
-
- for( target = 0; target < 8; ++target ) {
- for( lun = 0; lun < 8; ++lun ) {
- ta = &TagAlloc[target][lun];
- memset( &ta->allocated, 0, MAX_TAGS/8 );
- ta->nr_allocated = 0;
- }
- }
-}
-
-#endif /* SUPPORT_TAGS */
-
-
-/*
- * Function : void initialize_SCp(struct scsi_cmnd *cmd)
- *
- * Purpose : initialize the saved data pointers for cmd to point to the
- * start of the buffer.
- *
- * Inputs : cmd - struct scsi_cmnd structure to have pointers reset.
- */
-
-static __inline__ void initialize_SCp(struct scsi_cmnd *cmd)
-{
- /*
- * Initialize the Scsi Pointer field so that all of the commands in the
- * various queues are valid.
- */
-
- if (scsi_bufflen(cmd)) {
- cmd->SCp.buffer = scsi_sglist(cmd);
- cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1;
- cmd->SCp.ptr = (char *) SGADDR(cmd->SCp.buffer);
- cmd->SCp.this_residual = cmd->SCp.buffer->length;
- } else {
- cmd->SCp.buffer = NULL;
- cmd->SCp.buffers_residual = 0;
- cmd->SCp.ptr = NULL;
- cmd->SCp.this_residual = 0;
- }
-
-}
-
-#include <linux/delay.h>
-
-#if NDEBUG
-static struct {
- unsigned char mask;
- const char * name;}
-signals[] = {{ SR_DBP, "PARITY"}, { SR_RST, "RST" }, { SR_BSY, "BSY" },
- { SR_REQ, "REQ" }, { SR_MSG, "MSG" }, { SR_CD, "CD" }, { SR_IO, "IO" },
- { SR_SEL, "SEL" }, {0, NULL}},
-basrs[] = {{BASR_ATN, "ATN"}, {BASR_ACK, "ACK"}, {0, NULL}},
-icrs[] = {{ICR_ASSERT_RST, "ASSERT RST"},{ICR_ASSERT_ACK, "ASSERT ACK"},
- {ICR_ASSERT_BSY, "ASSERT BSY"}, {ICR_ASSERT_SEL, "ASSERT SEL"},
- {ICR_ASSERT_ATN, "ASSERT ATN"}, {ICR_ASSERT_DATA, "ASSERT DATA"},
- {0, NULL}},
-mrs[] = {{MR_BLOCK_DMA_MODE, "MODE BLOCK DMA"}, {MR_TARGET, "MODE TARGET"},
- {MR_ENABLE_PAR_CHECK, "MODE PARITY CHECK"}, {MR_ENABLE_PAR_INTR,
- "MODE PARITY INTR"}, {MR_ENABLE_EOP_INTR,"MODE EOP INTR"},
- {MR_MONITOR_BSY, "MODE MONITOR BSY"},
- {MR_DMA_MODE, "MODE DMA"}, {MR_ARBITRATE, "MODE ARBITRATION"},
- {0, NULL}};
-
-/*
- * Function : void NCR5380_print(struct Scsi_Host *instance)
- *
- * Purpose : print the SCSI bus signals for debugging purposes
- *
- * Input : instance - which NCR5380
- */
-
-static void NCR5380_print(struct Scsi_Host *instance) {
- unsigned char status, data, basr, mr, icr, i;
- unsigned long flags;
-
- local_irq_save(flags);
- data = NCR5380_read(CURRENT_SCSI_DATA_REG);
- status = NCR5380_read(STATUS_REG);
- mr = NCR5380_read(MODE_REG);
- icr = NCR5380_read(INITIATOR_COMMAND_REG);
- basr = NCR5380_read(BUS_AND_STATUS_REG);
- local_irq_restore(flags);
- printk("STATUS_REG: %02x ", status);
- for (i = 0; signals[i].mask ; ++i)
- if (status & signals[i].mask)
- printk(",%s", signals[i].name);
- printk("\nBASR: %02x ", basr);
- for (i = 0; basrs[i].mask ; ++i)
- if (basr & basrs[i].mask)
- printk(",%s", basrs[i].name);
- printk("\nICR: %02x ", icr);
- for (i = 0; icrs[i].mask; ++i)
- if (icr & icrs[i].mask)
- printk(",%s", icrs[i].name);
- printk("\nMODE: %02x ", mr);
- for (i = 0; mrs[i].mask; ++i)
- if (mr & mrs[i].mask)
- printk(",%s", mrs[i].name);
- printk("\n");
-}
-
-static struct {
- unsigned char value;
- const char *name;
-} phases[] = {
- {PHASE_DATAOUT, "DATAOUT"}, {PHASE_DATAIN, "DATAIN"}, {PHASE_CMDOUT, "CMDOUT"},
- {PHASE_STATIN, "STATIN"}, {PHASE_MSGOUT, "MSGOUT"}, {PHASE_MSGIN, "MSGIN"},
- {PHASE_UNKNOWN, "UNKNOWN"}};
-
-/*
- * Function : void NCR5380_print_phase(struct Scsi_Host *instance)
- *
- * Purpose : print the current SCSI phase for debugging purposes
- *
- * Input : instance - which NCR5380
- */
-
-static void NCR5380_print_phase(struct Scsi_Host *instance)
-{
- unsigned char status;
- int i;
-
- status = NCR5380_read(STATUS_REG);
- if (!(status & SR_REQ))
- printk(KERN_DEBUG "scsi%d: REQ not asserted, phase unknown.\n", HOSTNO);
- else {
- for (i = 0; (phases[i].value != PHASE_UNKNOWN) &&
- (phases[i].value != (status & PHASE_MASK)); ++i);
- printk(KERN_DEBUG "scsi%d: phase %s\n", HOSTNO, phases[i].name);
- }
-}
-
-#endif
-
-/*
- * ++roman: New scheme of calling NCR5380_main()
- *
- * If we're not in an interrupt, we can call our main directly, it cannot be
- * already running. Else, we queue it on a task queue, if not 'main_running'
- * tells us that a lower level is already executing it. This way,
- * 'main_running' needs not be protected in a special way.
- *
- * queue_main() is a utility function for putting our main onto the task
- * queue, if main_running is false. It should be called only from a
- * interrupt or bottom half.
- */
-
-#include <linux/gfp.h>
-#include <linux/workqueue.h>
-#include <linux/interrupt.h>
-
-static volatile int main_running = 0;
-static DECLARE_WORK(NCR5380_tqueue, NCR5380_main);
-
-static __inline__ void queue_main(void)
-{
- if (!main_running) {
- /* If in interrupt and NCR5380_main() not already running,
- queue it on the 'immediate' task queue, to be processed
- immediately after the current interrupt processing has
- finished. */
- schedule_work(&NCR5380_tqueue);
- }
- /* else: nothing to do: the running NCR5380_main() will pick up
- any newly queued command. */
-}
-
-
-static inline void NCR5380_all_init (void)
-{
- static int done = 0;
- if (!done) {
- dprintk(NDEBUG_INIT, "scsi : NCR5380_all_init()\n");
- done = 1;
- }
-}
-
-/**
- * NCR58380_info - report driver and host information
- * @instance: relevant scsi host instance
- *
- * For use as the host template info() handler.
- *
- * Locks: none
- */
-
-static const char *NCR5380_info(struct Scsi_Host *instance)
-{
- struct NCR5380_hostdata *hostdata = shost_priv(instance);
-
- return hostdata->info;
-}
-
-static void prepare_info(struct Scsi_Host *instance)
-{
- struct NCR5380_hostdata *hostdata = shost_priv(instance);
-
- snprintf(hostdata->info, sizeof(hostdata->info),
- "%s, io_port 0x%lx, n_io_port %d, "
- "base 0x%lx, irq %d, "
- "can_queue %d, cmd_per_lun %d, "
- "sg_tablesize %d, this_id %d, "
- "options { %s} ",
- instance->hostt->name, instance->io_port, instance->n_io_port,
- instance->base, instance->irq,
- instance->can_queue, instance->cmd_per_lun,
- instance->sg_tablesize, instance->this_id,
-#ifdef DIFFERENTIAL
- "DIFFERENTIAL "
-#endif
-#ifdef REAL_DMA
- "REAL_DMA "
-#endif
-#ifdef PARITY
- "PARITY "
-#endif
-#ifdef SUPPORT_TAGS
- "SUPPORT_TAGS "
-#endif
- "");
-}
-
-/*
- * Function : void NCR5380_print_status (struct Scsi_Host *instance)
- *
- * Purpose : print commands in the various queues, called from
- * NCR5380_abort and NCR5380_debug to aid debugging.
- *
- * Inputs : instance, pointer to this instance.
- */
-
-static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd)
-{
- int i, s;
- unsigned char *command;
- printk("scsi%d: destination target %d, lun %llu\n",
- H_NO(cmd), cmd->device->id, cmd->device->lun);
- printk(KERN_CONT " command = ");
- command = cmd->cmnd;
- printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]);
- for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
- printk(KERN_CONT " %02x", command[i]);
- printk("\n");
-}
-
-static void NCR5380_print_status(struct Scsi_Host *instance)
-{
- struct NCR5380_hostdata *hostdata;
- struct scsi_cmnd *ptr;
- unsigned long flags;
-
- NCR5380_dprint(NDEBUG_ANY, instance);
- NCR5380_dprint_phase(NDEBUG_ANY, instance);
-
- hostdata = (struct NCR5380_hostdata *)instance->hostdata;
-
- local_irq_save(flags);
- printk("NCR5380: coroutine is%s running.\n",
- main_running ? "" : "n't");
- if (!hostdata->connected)
- printk("scsi%d: no currently connected command\n", HOSTNO);
- else
- lprint_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected);
- printk("scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
- lprint_Scsi_Cmnd(ptr);
-
- printk("scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
- ptr = NEXT(ptr))
- lprint_Scsi_Cmnd(ptr);
-
- local_irq_restore(flags);
- printk("\n");
-}
-
-static void show_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m)
-{
- int i, s;
- unsigned char *command;
- seq_printf(m, "scsi%d: destination target %d, lun %llu\n",
- H_NO(cmd), cmd->device->id, cmd->device->lun);
- seq_printf(m, " command = ");
- command = cmd->cmnd;
- seq_printf(m, "%2d (0x%02x)", command[0], command[0]);
- for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
- seq_printf(m, " %02x", command[i]);
- seq_printf(m, "\n");
-}
-
-static int __maybe_unused NCR5380_show_info(struct seq_file *m,
- struct Scsi_Host *instance)
-{
- struct NCR5380_hostdata *hostdata;
- struct scsi_cmnd *ptr;
- unsigned long flags;
-
- hostdata = (struct NCR5380_hostdata *)instance->hostdata;
-
- local_irq_save(flags);
- seq_printf(m, "NCR5380: coroutine is%s running.\n",
- main_running ? "" : "n't");
- if (!hostdata->connected)
- seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
- else
- show_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected, m);
- seq_printf(m, "scsi%d: issue_queue\n", HOSTNO);
- for (ptr = (struct scsi_cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
- show_Scsi_Cmnd(ptr, m);
-
- seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO);
- for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr;
- ptr = NEXT(ptr))
- show_Scsi_Cmnd(ptr, m);
-
- local_irq_restore(flags);
- return 0;
-}
-
-/*
- * Function : void NCR5380_init (struct Scsi_Host *instance)
- *
- * Purpose : initializes *instance and corresponding 5380 chip.
- *
- * Inputs : instance - instantiation of the 5380 driver.
- *
- * Notes : I assume that the host, hostno, and id bits have been
- * set correctly. I don't care about the irq and other fields.
- *
- */
-
-static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
-{
- int i;
- SETUP_HOSTDATA(instance);
-
- NCR5380_all_init();
-
- hostdata->aborted = 0;
- hostdata->id_mask = 1 << instance->this_id;
- hostdata->id_higher_mask = 0;
- for (i = hostdata->id_mask; i <= 0x80; i <<= 1)
- if (i > hostdata->id_mask)
- hostdata->id_higher_mask |= i;
- for (i = 0; i < 8; ++i)
- hostdata->busy[i] = 0;
-#ifdef SUPPORT_TAGS
- init_tags();
-#endif
-#if defined (REAL_DMA)
- hostdata->dma_len = 0;
-#endif
- hostdata->targets_present = 0;
- hostdata->connected = NULL;
- hostdata->issue_queue = NULL;
- hostdata->disconnected_queue = NULL;
- hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT;
-
- if (!the_template) {
- the_template = instance->hostt;
- first_instance = instance;
- }
-
- prepare_info(instance);
-
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- NCR5380_write(MODE_REG, MR_BASE);
- NCR5380_write(TARGET_COMMAND_REG, 0);
- NCR5380_write(SELECT_ENABLE_REG, 0);
-
- return 0;
-}
-
-static void NCR5380_exit(struct Scsi_Host *instance)
-{
- /* Empty, as we didn't schedule any delayed work */
-}
-
-/*
- * Function : int NCR5380_queue_command (struct scsi_cmnd *cmd,
- * void (*done)(struct scsi_cmnd *))
- *
- * Purpose : enqueues a SCSI command
- *
- * Inputs : cmd - SCSI command, done - function called on completion, with
- * a pointer to the command descriptor.
- *
- * Returns : 0
- *
- * Side effects :
- * cmd is added to the per instance issue_queue, with minor
- * twiddling done to the host specific fields of cmd. If the
- * main coroutine is not running, it is restarted.
- *
- */
-
-/* Only make static if a wrapper function is used */
-static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
- void (*done)(struct scsi_cmnd *))
-{
- SETUP_HOSTDATA(cmd->device->host);
- struct scsi_cmnd *tmp;
- unsigned long flags;
-
-#if (NDEBUG & NDEBUG_NO_WRITE)
- switch (cmd->cmnd[0]) {
- case WRITE_6:
- case WRITE_10:
- printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag set\n",
- H_NO(cmd));
- cmd->result = (DID_ERROR << 16);
- done(cmd);
- return 0;
- }
-#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->scsi_done = done;
-
- cmd->result = 0;
-
-
- /*
- * Insert the cmd into the issue queue. Note that REQUEST SENSE
- * commands are added to the head of the queue since any command will
- * clear the contingent allegiance condition that exists and the
- * sense data is only guaranteed to be valid while the condition exists.
- */
-
- local_irq_save(flags);
- /* ++guenther: now that the issue queue is being set up, we can lock ST-DMA.
- * Otherwise a running NCR5380_main may steal the lock.
- * Lock before actually inserting due to fairness reasons explained in
- * atari_scsi.c. If we insert first, then it's impossible for this driver
- * to release the lock.
- * Stop timer for this command while waiting for the lock, or timeouts
- * may happen (and they really do), and it's no good if the command doesn't
- * appear in any of the queues.
- * ++roman: Just disabling the NCR interrupt isn't sufficient here,
- * because also a timer int can trigger an abort or reset, which would
- * alter queues and touch the lock.
- */
- if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
- LIST(cmd, hostdata->issue_queue);
- SET_NEXT(cmd, hostdata->issue_queue);
- hostdata->issue_queue = cmd;
- } else {
- for (tmp = (struct scsi_cmnd *)hostdata->issue_queue;
- NEXT(tmp); tmp = NEXT(tmp))
- ;
- LIST(cmd, tmp);
- SET_NEXT(tmp, cmd);
- }
-
- local_irq_restore(flags);
-
- dprintk(NDEBUG_QUEUES, "scsi%d: command added to %s of queue\n", H_NO(cmd),
- (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail");
-
- /* If queue_command() is called from an interrupt (real one or bottom
- * half), we let queue_main() do the job of taking care about main. If it
- * is already running, this is a no-op, else main will be queued.
- *
- * If we're not in an interrupt, we can call NCR5380_main()
- * unconditionally, because it cannot be already running.
- */
- if (in_interrupt() || ((flags >> 8) & 7) >= 6)
- queue_main();
- else
- NCR5380_main(NULL);
- return 0;
-}
-
-static DEF_SCSI_QCMD(NCR5380_queue_command)
-
-/*
- * Function : NCR5380_main (void)
- *
- * Purpose : NCR5380_main is a coroutine that runs as long as more work can
- * be done on the NCR5380 host adapters in a system. Both
- * NCR5380_queue_command() and NCR5380_intr() will try to start it
- * in case it is not running.
- *
- * NOTE : NCR5380_main exits with interrupts *disabled*, the caller should
- * reenable them. This prevents reentrancy and kernel stack overflow.
- */
-
-static void NCR5380_main (struct work_struct *bl)
-{
- struct scsi_cmnd *tmp, *prev;
- struct Scsi_Host *instance = first_instance;
- struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
- int done;
- unsigned long flags;
-
- /*
- * We run (with interrupts disabled) until we're sure that none of
- * the host adapters have anything that can be done, at which point
- * we set main_running to 0 and exit.
- *
- * Interrupts are enabled before doing various other internal
- * instructions, after we've decided that we need to run through
- * the loop again.
- *
- * this should prevent any race conditions.
- *
- * ++roman: Just disabling the NCR interrupt isn't sufficient here,
- * because also a timer int can trigger an abort or reset, which can
- * alter queues and touch the Falcon lock.
- */
-
- /* Tell int handlers main() is now already executing. Note that
- no races are possible here. If an int comes in before
- 'main_running' is set here, and queues/executes main via the
- task queue, it doesn't do any harm, just this instance of main
- won't find any work left to do. */
- if (main_running)
- return;
- main_running = 1;
-
- local_save_flags(flags);
- do {
- local_irq_disable(); /* Freeze request queues */
- done = 1;
-
- if (!hostdata->connected) {
- dprintk(NDEBUG_MAIN, "scsi%d: not connected\n", HOSTNO );
- /*
- * 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))
- ;
- 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) ) {
-
- if (prev != tmp)
- dprintk(NDEBUG_LISTS, "MAIN tmp=%p target=%d busy=%d lun=%llu\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], tmp->device->lun);
- /* When we find one, remove it from the issue queue. */
- /* ++guenther: possible race with Falcon locking */
- if (
-#ifdef SUPPORT_TAGS
- !is_lun_busy( tmp, tmp->cmnd[0] != REQUEST_SENSE)
-#else
- !(hostdata->busy[tmp->device->id] & (1 << tmp->device->lun))
-#endif
- ) {
- /* ++guenther: just to be sure, this must be atomic */
- local_irq_disable();
- if (prev) {
- REMOVE(prev, NEXT(prev), tmp, NEXT(tmp));
- SET_NEXT(prev, NEXT(tmp));
- } else {
- REMOVE(-1, hostdata->issue_queue, tmp, NEXT(tmp));
- hostdata->issue_queue = NEXT(tmp);
- }
- SET_NEXT(tmp, NULL);
-
- /* reenable interrupts after finding one */
- local_irq_restore(flags);
-
- /*
- * Attempt to establish an I_T_L nexus here.
- * On success, instance->hostdata->connected is set.
- * On failure, we must add the command back to the
- * issue queue so we can keep trying.
- */
- dprintk(NDEBUG_MAIN, "scsi%d: main(): command for target %d "
- "lun %llu removed from issue_queue\n",
- HOSTNO, tmp->device->id, tmp->device->lun);
- /*
- * REQUEST SENSE commands are issued without tagged
- * queueing, even on SCSI-II devices because the
- * contingent allegiance condition exists for the
- * entire unit.
- */
- /* ++roman: ...and the standard also requires that
- * REQUEST SENSE command are untagged.
- */
-
-#ifdef SUPPORT_TAGS
- cmd_get_tag( tmp, tmp->cmnd[0] != REQUEST_SENSE );
-#endif
- if (!NCR5380_select(instance, tmp)) {
- break;
- } else {
- local_irq_disable();
- LIST(tmp, hostdata->issue_queue);
- SET_NEXT(tmp, hostdata->issue_queue);
- hostdata->issue_queue = tmp;
-#ifdef SUPPORT_TAGS
- cmd_free_tag( tmp );
-#endif
- local_irq_restore(flags);
- dprintk(NDEBUG_MAIN, "scsi%d: main(): select() failed, "
- "returned to issue_queue\n", HOSTNO);
- if (hostdata->connected)
- break;
- }
- } /* if target/lun/target queue is not busy */
- } /* for issue_queue */
- } /* if (!hostdata->connected) */
- if (hostdata->connected
-#ifdef REAL_DMA
- && !hostdata->dma_len
-#endif
- ) {
- local_irq_restore(flags);
- dprintk(NDEBUG_MAIN, "scsi%d: main: performing information transfer\n",
- HOSTNO);
- NCR5380_information_transfer(instance);
- dprintk(NDEBUG_MAIN, "scsi%d: main: done set false\n", HOSTNO);
- done = 0;
- }
- } while (!done);
-
- /* Better allow ints _after_ 'main_running' has been cleared, else
- an interrupt could believe we'll pick up the work it left for
- us, but we won't see it anymore here... */
- main_running = 0;
- local_irq_restore(flags);
-}
-
-
-#ifdef REAL_DMA
-/*
- * Function : void NCR5380_dma_complete (struct Scsi_Host *instance)
- *
- * Purpose : Called by interrupt handler when DMA finishes or a phase
- * mismatch occurs (which would finish the DMA transfer).
- *
- * Inputs : instance - this instance of the NCR5380.
- *
- */
-
-static void NCR5380_dma_complete( struct Scsi_Host *instance )
-{
- SETUP_HOSTDATA(instance);
- int transfered;
- unsigned char **data;
- volatile int *count;
-
- if (!hostdata->connected) {
- printk(KERN_WARNING "scsi%d: received end of DMA interrupt with "
- "no connected cmd\n", HOSTNO);
- return;
- }
-
- dprintk(NDEBUG_DMA, "scsi%d: real DMA transfer complete, basr 0x%X, sr 0x%X\n",
- HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
- NCR5380_read(STATUS_REG));
-
- if((sun3scsi_dma_finish(rq_data_dir(hostdata->connected->request)))) {
- printk("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n", HOSTNO);
- printk("please e-mail sammy@sammy.net with a description of how this\n");
- printk("error was produced.\n");
- BUG();
- }
-
- /* make sure we're not stuck in a data phase */
- if((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH |
- BASR_ACK)) ==
- (BASR_PHASE_MATCH | BASR_ACK)) {
- printk("scsi%d: BASR %02x\n", HOSTNO, NCR5380_read(BUS_AND_STATUS_REG));
- printk("scsi%d: bus stuck in data phase -- probably a single byte "
- "overrun!\n", HOSTNO);
- printk("not prepared for this error!\n");
- printk("please e-mail sammy@sammy.net with a description of how this\n");
- printk("error was produced.\n");
- BUG();
- }
-
-
-
- (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- NCR5380_write(MODE_REG, MR_BASE);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-
- transfered = hostdata->dma_len - NCR5380_dma_residual(instance);
- hostdata->dma_len = 0;
-
- data = (unsigned char **) &(hostdata->connected->SCp.ptr);
- count = &(hostdata->connected->SCp.this_residual);
- *data += transfered;
- *count -= transfered;
-
-}
-#endif /* REAL_DMA */
-
-
-/*
- * Function : void NCR5380_intr (int irq)
- *
- * Purpose : handle interrupts, reestablishing I_T_L or I_T_L_Q nexuses
- * from the disconnected queue, and restarting NCR5380_main()
- * as required.
- *
- * Inputs : int irq, irq that caused this interrupt.
- *
- */
-
-static irqreturn_t NCR5380_intr (int irq, void *dev_id)
-{
- struct Scsi_Host *instance = first_instance;
- int done = 1, handled = 0;
- unsigned char basr;
-
- dprintk(NDEBUG_INTR, "scsi%d: NCR5380 irq triggered\n", HOSTNO);
-
- /* Look for pending interrupts */
- basr = NCR5380_read(BUS_AND_STATUS_REG);
- dprintk(NDEBUG_INTR, "scsi%d: BASR=%02x\n", HOSTNO, basr);
- /* dispatch to appropriate routine if found and done=0 */
- if (basr & BASR_IRQ) {
- NCR5380_dprint(NDEBUG_INTR, instance);
- if ((NCR5380_read(STATUS_REG) & (SR_SEL|SR_IO)) == (SR_SEL|SR_IO)) {
- done = 0;
- dprintk(NDEBUG_INTR, "scsi%d: SEL interrupt\n", HOSTNO);
- NCR5380_reselect(instance);
- (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- }
- else if (basr & BASR_PARITY_ERROR) {
- dprintk(NDEBUG_INTR, "scsi%d: PARITY interrupt\n", HOSTNO);
- (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- }
- else if ((NCR5380_read(STATUS_REG) & SR_RST) == SR_RST) {
- dprintk(NDEBUG_INTR, "scsi%d: RESET interrupt\n", HOSTNO);
- (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- }
- else {
- /*
- * The rest of the interrupt conditions can occur only during a
- * DMA transfer
- */
-
-#if defined(REAL_DMA)
- /*
- * We should only get PHASE MISMATCH and EOP interrupts if we have
- * DMA enabled, so do a sanity check based on the current setting
- * of the MODE register.
- */
-
- if ((NCR5380_read(MODE_REG) & MR_DMA_MODE) &&
- ((basr & BASR_END_DMA_TRANSFER) ||
- !(basr & BASR_PHASE_MATCH))) {
-
- dprintk(NDEBUG_INTR, "scsi%d: PHASE MISM or EOP interrupt\n", HOSTNO);
- NCR5380_dma_complete( instance );
- done = 0;
- } else
-#endif /* REAL_DMA */
- {
-/* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */
- if (basr & BASR_PHASE_MATCH)
- dprintk(NDEBUG_INTR, "scsi%d: unknown interrupt, "
- "BASR 0x%x, MR 0x%x, SR 0x%x\n",
- HOSTNO, basr, NCR5380_read(MODE_REG),
- NCR5380_read(STATUS_REG));
- (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_DMA_ENABLE;
-#endif
- }
- } /* if !(SELECTION || PARITY) */
- handled = 1;
- } /* BASR & IRQ */
- else {
-
- printk(KERN_NOTICE "scsi%d: interrupt without IRQ bit set in BASR, "
- "BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr,
- NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
- (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_DMA_ENABLE;
-#endif
- }
-
- if (!done) {
- dprintk(NDEBUG_INTR, "scsi%d: in int routine, calling main\n", HOSTNO);
- /* Put a call to NCR5380_main() on the queue... */
- queue_main();
- }
- return IRQ_RETVAL(handled);
-}
-
-/*
- * Function : int NCR5380_select(struct Scsi_Host *instance,
- * struct scsi_cmnd *cmd)
- *
- * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
- * including ARBITRATION, SELECTION, and initial message out for
- * IDENTIFY and queue messages.
- *
- * Inputs : instance - instantiation of the 5380 driver on which this
- * target lives, cmd - SCSI command to execute.
- *
- * Returns : -1 if selection could not execute for some reason,
- * 0 if selection succeeded or failed because the target
- * did not respond.
- *
- * Side effects :
- * If bus busy, arbitration failed, etc, NCR5380_select() will exit
- * with registers as they should have been on entry - ie
- * SELECT_ENABLE will be set appropriately, the NCR5380
- * will cease to drive any SCSI bus signals.
- *
- * If successful : I_T_L or I_T_L_Q nexus will be established,
- * instance->connected will be set to cmd.
- * SELECT interrupt will be disabled.
- *
- * If failed (no target) : cmd->scsi_done() will be called, and the
- * cmd->result host byte set to DID_BAD_TARGET.
- */
-
-static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
-{
- SETUP_HOSTDATA(instance);
- unsigned char tmp[3], phase;
- unsigned char *data;
- int len;
- unsigned long timeout;
- unsigned long flags;
-
- hostdata->restart_select = 0;
- NCR5380_dprint(NDEBUG_ARBITRATION, instance);
- dprintk(NDEBUG_ARBITRATION, "scsi%d: starting arbitration, id = %d\n", HOSTNO,
- instance->this_id);
-
- /*
- * Set the phase bits to 0, otherwise the NCR5380 won't drive the
- * data bus during SELECTION.
- */
-
- local_irq_save(flags);
- if (hostdata->connected) {
- local_irq_restore(flags);
- return -1;
- }
- NCR5380_write(TARGET_COMMAND_REG, 0);
-
-
- /*
- * Start arbitration.
- */
-
- NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask);
- NCR5380_write(MODE_REG, MR_ARBITRATE);
-
- local_irq_restore(flags);
-
- /* Wait for arbitration logic to complete */
-#ifdef NCR_TIMEOUT
- {
- unsigned long timeout = jiffies + 2*NCR_TIMEOUT;
-
- while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS)
- && time_before(jiffies, timeout) && !hostdata->connected)
- ;
- if (time_after_eq(jiffies, timeout))
- {
- printk("scsi : arbitration timeout at %d\n", __LINE__);
- NCR5380_write(MODE_REG, MR_BASE);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- return -1;
- }
- }
-#else /* NCR_TIMEOUT */
- while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS)
- && !hostdata->connected);
-#endif
-
- dprintk(NDEBUG_ARBITRATION, "scsi%d: arbitration complete\n", HOSTNO);
-
- if (hostdata->connected) {
- NCR5380_write(MODE_REG, MR_BASE);
- return -1;
- }
- /*
- * The arbitration delay is 2.2us, but this is a minimum and there is
- * no maximum so we can safely sleep for ceil(2.2) usecs to accommodate
- * the integral nature of udelay().
- *
- */
-
- udelay(3);
-
- /* Check for lost arbitration */
- if ((NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) ||
- (NCR5380_read(CURRENT_SCSI_DATA_REG) & hostdata->id_higher_mask) ||
- (NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) ||
- hostdata->connected) {
- NCR5380_write(MODE_REG, MR_BASE);
- dprintk(NDEBUG_ARBITRATION, "scsi%d: lost arbitration, deasserting MR_ARBITRATE\n",
- HOSTNO);
- return -1;
- }
-
- /* after/during arbitration, BSY should be asserted.
- IBM DPES-31080 Version S31Q works now */
- /* Tnx to Thomas_Roesch@m2.maus.de for finding this! (Roman) */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_SEL |
- ICR_ASSERT_BSY ) ;
-
- if ((NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) ||
- hostdata->connected) {
- NCR5380_write(MODE_REG, MR_BASE);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- dprintk(NDEBUG_ARBITRATION, "scsi%d: lost arbitration, deasserting ICR_ASSERT_SEL\n",
- HOSTNO);
- return -1;
- }
-
- /*
- * Again, bus clear + bus settle time is 1.2us, however, this is
- * a minimum so we'll udelay ceil(1.2)
- */
-
-#ifdef CONFIG_ATARI_SCSI_TOSHIBA_DELAY
- /* ++roman: But some targets (see above :-) seem to need a bit more... */
- udelay(15);
-#else
- udelay(2);
-#endif
-
- if (hostdata->connected) {
- NCR5380_write(MODE_REG, MR_BASE);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- return -1;
- }
-
- dprintk(NDEBUG_ARBITRATION, "scsi%d: won arbitration\n", HOSTNO);
-
- /*
- * Now that we have won arbitration, start Selection process, asserting
- * the host and target ID's on the SCSI bus.
- */
-
- NCR5380_write(OUTPUT_DATA_REG, (hostdata->id_mask | (1 << cmd->device->id)));
-
- /*
- * Raise ATN while SEL is true before BSY goes false from arbitration,
- * since this is the only way to guarantee that we'll get a MESSAGE OUT
- * phase immediately after selection.
- */
-
- NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_BSY |
- ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_SEL ));
- NCR5380_write(MODE_REG, MR_BASE);
-
- /*
- * Reselect interrupts must be turned off prior to the dropping of BSY,
- * otherwise we will trigger an interrupt.
- */
-
- if (hostdata->connected) {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- return -1;
- }
-
- NCR5380_write(SELECT_ENABLE_REG, 0);
-
- /*
- * The initiator shall then wait at least two deskew delays and release
- * the BSY signal.
- */
- udelay(1); /* wingel -- wait two bus deskew delay >2*45ns */
-
- /* Reset BSY */
- NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_DATA |
- ICR_ASSERT_ATN | ICR_ASSERT_SEL));
-
- /*
- * Something weird happens when we cease to drive BSY - looks
- * like the board/chip is letting us do another read before the
- * appropriate propagation delay has expired, and we're confusing
- * a BSY signal from ourselves as the target's response to SELECTION.
- *
- * A small delay (the 'C++' frontend breaks the pipeline with an
- * unnecessary jump, making it work on my 386-33/Trantor T128, the
- * tighter 'C' code breaks and requires this) solves the problem -
- * the 1 us delay is arbitrary, and only used because this delay will
- * be the same on other platforms and since it works here, it should
- * work there.
- *
- * wingel suggests that this could be due to failing to wait
- * one deskew delay.
- */
-
- udelay(1);
-
- dprintk(NDEBUG_SELECTION, "scsi%d: selecting target %d\n", HOSTNO, cmd->device->id);
-
- /*
- * The SCSI specification calls for a 250 ms timeout for the actual
- * selection.
- */
-
- timeout = jiffies + 25;
-
- /*
- * XXX very interesting - we're seeing a bounce where the BSY we
- * asserted is being reflected / still asserted (propagation delay?)
- * and it's detecting as true. Sigh.
- */
-
-#if 0
- /* ++roman: If a target conformed to the SCSI standard, it wouldn't assert
- * IO while SEL is true. But again, there are some disks out the in the
- * world that do that nevertheless. (Somebody claimed that this announces
- * reselection capability of the target.) So we better skip that test and
- * only wait for BSY... (Famous german words: Der Klügere gibt nach :-)
- */
-
- while (time_before(jiffies, timeout) && !(NCR5380_read(STATUS_REG) &
- (SR_BSY | SR_IO)));
-
- if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) ==
- (SR_SEL | SR_IO)) {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- NCR5380_reselect(instance);
- printk (KERN_ERR "scsi%d: reselection after won arbitration?\n",
- HOSTNO);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- return -1;
- }
-#else
- while (time_before(jiffies, timeout) && !(NCR5380_read(STATUS_REG) & SR_BSY));
-#endif
-
- /*
- * No less than two deskew delays after the initiator detects the
- * BSY signal is true, it shall release the SEL signal and may
- * change the DATA BUS. -wingel
- */
-
- udelay(1);
-
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
-
- if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- if (hostdata->targets_present & (1 << cmd->device->id)) {
- printk(KERN_ERR "scsi%d: weirdness\n", HOSTNO);
- if (hostdata->restart_select)
- printk(KERN_NOTICE "\trestart select\n");
- NCR5380_dprint(NDEBUG_ANY, instance);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- return -1;
- }
- cmd->result = DID_BAD_TARGET << 16;
-#ifdef SUPPORT_TAGS
- cmd_free_tag( cmd );
-#endif
- cmd->scsi_done(cmd);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- dprintk(NDEBUG_SELECTION, "scsi%d: target did not respond within 250ms\n", HOSTNO);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- return 0;
- }
-
- hostdata->targets_present |= (1 << cmd->device->id);
-
- /*
- * Since we followed the SCSI spec, and raised ATN while SEL
- * was true but before BSY was false during selection, the information
- * transfer phase should be a MESSAGE OUT phase so that we can send the
- * IDENTIFY message.
- *
- * If SCSI-II tagged queuing is enabled, we also send a SIMPLE_QUEUE_TAG
- * message (2 bytes) with a tag ID that we increment with every command
- * until it wraps back to 0.
- *
- * XXX - it turns out that there are some broken SCSI-II devices,
- * which claim to support tagged queuing but fail when more than
- * some number of commands are issued at once.
- */
-
- /* Wait for start of REQ/ACK handshake */
- while (!(NCR5380_read(STATUS_REG) & SR_REQ));
-
- dprintk(NDEBUG_SELECTION, "scsi%d: target %d selected, going into MESSAGE OUT phase.\n",
- HOSTNO, cmd->device->id);
- tmp[0] = IDENTIFY(1, cmd->device->lun);
-
-#ifdef SUPPORT_TAGS
- if (cmd->tag != TAG_NONE) {
- tmp[1] = hostdata->last_message = SIMPLE_QUEUE_TAG;
- tmp[2] = cmd->tag;
- len = 3;
- } else
- len = 1;
-#else
- len = 1;
- cmd->tag=0;
-#endif /* SUPPORT_TAGS */
-
- /* Send message(s) */
- data = tmp;
- phase = PHASE_MSGOUT;
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- dprintk(NDEBUG_SELECTION, "scsi%d: nexus established.\n", HOSTNO);
- /* XXX need to handle errors here */
- hostdata->connected = cmd;
-#ifndef SUPPORT_TAGS
- hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
-#endif
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_INTR;
-#endif
- initialize_SCp(cmd);
-
-
- return 0;
-}
-
-/*
- * Function : int NCR5380_transfer_pio (struct Scsi_Host *instance,
- * unsigned char *phase, int *count, unsigned char **data)
- *
- * Purpose : transfers data in given phase using polled I/O
- *
- * Inputs : instance - instance of driver, *phase - pointer to
- * what phase is expected, *count - pointer to number of
- * bytes to transfer, **data - pointer to data pointer.
- *
- * Returns : -1 when different phase is entered without transferring
- * maximum number of bytes, 0 if all bytes are transferred or exit
- * is in same phase.
- *
- * Also, *phase, *count, *data are modified in place.
- *
- * XXX Note : handling for bus free may be useful.
- */
-
-/*
- * Note : this code is not as quick as it could be, however it
- * IS 100% reliable, and for the actual data transfer where speed
- * counts, we will always do a pseudo DMA or DMA transfer.
- */
-
-static int NCR5380_transfer_pio( struct Scsi_Host *instance,
- unsigned char *phase, int *count,
- unsigned char **data)
-{
- register unsigned char p = *phase, tmp;
- register int c = *count;
- register unsigned char *d = *data;
-
- /*
- * The NCR5380 chip will only drive the SCSI bus when the
- * phase specified in the appropriate bits of the TARGET COMMAND
- * REGISTER match the STATUS REGISTER
- */
-
- NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p));
-
- do {
- /*
- * Wait for assertion of REQ, after which the phase bits will be
- * valid
- */
- while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ));
-
- dprintk(NDEBUG_HANDSHAKE, "scsi%d: REQ detected\n", HOSTNO);
-
- /* Check for phase mismatch */
- if ((tmp & PHASE_MASK) != p) {
- dprintk(NDEBUG_PIO, "scsi%d: phase mismatch\n", HOSTNO);
- NCR5380_dprint_phase(NDEBUG_PIO, instance);
- break;
- }
-
- /* Do actual transfer from SCSI bus to / from memory */
- if (!(p & SR_IO))
- NCR5380_write(OUTPUT_DATA_REG, *d);
- else
- *d = NCR5380_read(CURRENT_SCSI_DATA_REG);
-
- ++d;
-
- /*
- * The SCSI standard suggests that in MSGOUT phase, the initiator
- * should drop ATN on the last byte of the message phase
- * after REQ has been asserted for the handshake but before
- * the initiator raises ACK.
- */
-
- if (!(p & SR_IO)) {
- if (!((p & SR_MSG) && c > 1)) {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_DATA);
- NCR5380_dprint(NDEBUG_PIO, instance);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_DATA | ICR_ASSERT_ACK);
- } else {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_DATA | ICR_ASSERT_ATN);
- NCR5380_dprint(NDEBUG_PIO, instance);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
- }
- } else {
- NCR5380_dprint(NDEBUG_PIO, instance);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
- }
-
- while (NCR5380_read(STATUS_REG) & SR_REQ);
-
- dprintk(NDEBUG_HANDSHAKE, "scsi%d: req false, handshake complete\n", HOSTNO);
-
-/*
- * We have several special cases to consider during REQ/ACK handshaking :
- * 1. We were in MSGOUT phase, and we are on the last byte of the
- * message. ATN must be dropped as ACK is dropped.
- *
- * 2. We are in a MSGIN phase, and we are on the last byte of the
- * message. We must exit with ACK asserted, so that the calling
- * code may raise ATN before dropping ACK to reject the message.
- *
- * 3. ACK and ATN are clear and the target may proceed as normal.
- */
- if (!(p == PHASE_MSGIN && c == 1)) {
- if (p == PHASE_MSGOUT && c > 1)
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
- else
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- }
- } while (--c);
-
- dprintk(NDEBUG_PIO, "scsi%d: residual %d\n", HOSTNO, c);
-
- *count = c;
- *data = d;
- tmp = NCR5380_read(STATUS_REG);
- /* The phase read from the bus is valid if either REQ is (already)
- * asserted or if ACK hasn't been released yet. The latter is the case if
- * we're in MSGIN and all wanted bytes have been received. */
- if ((tmp & SR_REQ) || (p == PHASE_MSGIN && c == 0))
- *phase = tmp & PHASE_MASK;
- else
- *phase = PHASE_UNKNOWN;
-
- if (!c || (*phase == p))
- return 0;
- else
- return -1;
-}
-
-/*
- * Function : do_abort (Scsi_Host *host)
- *
- * Purpose : abort the currently established nexus. Should only be
- * called from a routine which can drop into a
- *
- * Returns : 0 on success, -1 on failure.
- */
-
-static int do_abort (struct Scsi_Host *host)
-{
- unsigned char tmp, *msgptr, phase;
- int len;
-
- /* Request message out phase */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
-
- /*
- * Wait for the target to indicate a valid phase by asserting
- * REQ. Once this happens, we'll have either a MSGOUT phase
- * and can immediately send the ABORT message, or we'll have some
- * other phase and will have to source/sink data.
- *
- * We really don't care what value was on the bus or what value
- * the target sees, so we just handshake.
- */
-
- while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ));
-
- NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
-
- if ((tmp & PHASE_MASK) != PHASE_MSGOUT) {
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN |
- ICR_ASSERT_ACK);
- while (NCR5380_read(STATUS_REG) & SR_REQ);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
- }
-
- tmp = ABORT;
- msgptr = &tmp;
- len = 1;
- phase = PHASE_MSGOUT;
- NCR5380_transfer_pio (host, &phase, &len, &msgptr);
-
- /*
- * If we got here, and the command completed successfully,
- * we're about to go into bus free state.
- */
-
- return len ? -1 : 0;
-}
-
-#if defined(REAL_DMA)
-/*
- * Function : int NCR5380_transfer_dma (struct Scsi_Host *instance,
- * unsigned char *phase, int *count, unsigned char **data)
- *
- * Purpose : transfers data in given phase using either real
- * or pseudo DMA.
- *
- * Inputs : instance - instance of driver, *phase - pointer to
- * what phase is expected, *count - pointer to number of
- * bytes to transfer, **data - pointer to data pointer.
- *
- * Returns : -1 when different phase is entered without transferring
- * maximum number of bytes, 0 if all bytes or transferred or exit
- * is in same phase.
- *
- * Also, *phase, *count, *data are modified in place.
- *
- */
-
-
-static int NCR5380_transfer_dma( struct Scsi_Host *instance,
- unsigned char *phase, int *count,
- unsigned char **data)
-{
- SETUP_HOSTDATA(instance);
- register int c = *count;
- register unsigned char p = *phase;
- unsigned long flags;
-
- /* sanity check */
- if(!sun3_dma_setup_done) {
- printk("scsi%d: transfer_dma without setup!\n", HOSTNO);
- BUG();
- }
- hostdata->dma_len = c;
-
- dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
- HOSTNO, (p & SR_IO) ? "reading" : "writing",
- c, (p & SR_IO) ? "to" : "from", *data);
-
- /* netbsd turns off ints here, why not be safe and do it too */
- local_irq_save(flags);
-
- /* send start chain */
- sun3scsi_dma_start(c, *data);
-
- if (p & SR_IO) {
- NCR5380_write(TARGET_COMMAND_REG, 1);
- NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- NCR5380_write(INITIATOR_COMMAND_REG, 0);
- NCR5380_write(MODE_REG, (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
- NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
- } else {
- NCR5380_write(TARGET_COMMAND_REG, 0);
- NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_DATA);
- NCR5380_write(MODE_REG, (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
- NCR5380_write(START_DMA_SEND_REG, 0);
- }
-
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_DMA_ENABLE;
-#endif
-
- local_irq_restore(flags);
-
- sun3_dma_active = 1;
- return 0;
-}
-#endif /* defined(REAL_DMA) */
-
-/*
- * Function : NCR5380_information_transfer (struct Scsi_Host *instance)
- *
- * Purpose : run through the various SCSI phases and do as the target
- * directs us to. Operates on the currently connected command,
- * instance->connected.
- *
- * Inputs : instance, instance for which we are doing commands
- *
- * Side effects : SCSI things happen, the disconnected queue will be
- * modified if a command disconnects, *instance->connected will
- * change.
- *
- * XXX Note : we need to watch for bus free or a reset condition here
- * to recover from an unexpected bus free condition.
- */
-
-static void NCR5380_information_transfer (struct Scsi_Host *instance)
-{
- SETUP_HOSTDATA(instance);
- unsigned long flags;
- unsigned char msgout = NOP;
- int sink = 0;
- int len;
-#if defined(REAL_DMA)
- int transfersize;
-#endif
- unsigned char *data;
- unsigned char phase, tmp, extended_msg[10], old_phase=0xff;
- struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
-
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_INTR;
-#endif
-
- while (1) {
- tmp = NCR5380_read(STATUS_REG);
- /* We only have a valid SCSI phase when REQ is asserted */
- if (tmp & SR_REQ) {
- phase = (tmp & PHASE_MASK);
- if (phase != old_phase) {
- old_phase = phase;
- NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
- }
-
- if(phase == PHASE_CMDOUT) {
- void *d;
- unsigned long count;
-
- if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
- count = cmd->SCp.buffer->length;
- d = SGADDR(cmd->SCp.buffer);
- } else {
- count = cmd->SCp.this_residual;
- d = cmd->SCp.ptr;
- }
-#ifdef REAL_DMA
- /* this command setup for dma yet? */
- if((count > SUN3_DMA_MINSIZE) && (sun3_dma_setup_done
- != cmd))
- {
- if (cmd->request->cmd_type == REQ_TYPE_FS) {
- sun3scsi_dma_setup(d, count,
- rq_data_dir(cmd->request));
- sun3_dma_setup_done = cmd;
- }
- }
-#endif
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_INTR;
-#endif
- }
-
-
- if (sink && (phase != PHASE_MSGOUT)) {
- NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
-
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN |
- ICR_ASSERT_ACK);
- while (NCR5380_read(STATUS_REG) & SR_REQ);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_ATN);
- sink = 0;
- continue;
- }
-
- switch (phase) {
- case PHASE_DATAOUT:
-#if (NDEBUG & NDEBUG_NO_DATAOUT)
- printk("scsi%d: NDEBUG_NO_DATAOUT set, attempted DATAOUT "
- "aborted\n", HOSTNO);
- sink = 1;
- do_abort(instance);
- cmd->result = DID_ERROR << 16;
- cmd->scsi_done(cmd);
- return;
-#endif
- case PHASE_DATAIN:
- /*
- * If there is no room left in the current buffer in the
- * scatter-gather list, move onto the next one.
- */
- if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
- ++cmd->SCp.buffer;
- --cmd->SCp.buffers_residual;
- cmd->SCp.this_residual = cmd->SCp.buffer->length;
- cmd->SCp.ptr = SGADDR(cmd->SCp.buffer);
- dprintk(NDEBUG_INFORMATION, "scsi%d: %d bytes and %d buffers left\n",
- HOSTNO, cmd->SCp.this_residual,
- cmd->SCp.buffers_residual);
- }
-
- /*
- * The preferred transfer method is going to be
- * PSEUDO-DMA for systems that are strictly PIO,
- * since we can let the hardware do the handshaking.
- *
- * For this to work, we need to know the transfersize
- * ahead of time, since the pseudo-DMA code will sit
- * in an unconditional loop.
- */
-
-/* ++roman: I suggest, this should be
- * #if def(REAL_DMA)
- * instead of leaving REAL_DMA out.
- */
-
-#if defined(REAL_DMA)
-// if (!cmd->device->borken &&
- if((transfersize =
- NCR5380_dma_xfer_len(instance,cmd,phase)) > SUN3_DMA_MINSIZE) {
- len = transfersize;
- cmd->SCp.phase = phase;
-
- if (NCR5380_transfer_dma(instance, &phase,
- &len, (unsigned char **) &cmd->SCp.ptr)) {
- /*
- * If the watchdog timer fires, all future
- * accesses to this device will use the
- * polled-IO. */
- printk(KERN_NOTICE "scsi%d: switching target %d "
- "lun %llu to slow handshake\n", HOSTNO,
- cmd->device->id, cmd->device->lun);
- cmd->device->borken = 1;
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_ATN);
- sink = 1;
- do_abort(instance);
- cmd->result = DID_ERROR << 16;
- cmd->scsi_done(cmd);
- /* XXX - need to source or sink data here, as appropriate */
- } else {
-#ifdef REAL_DMA
- /* ++roman: When using real DMA,
- * information_transfer() should return after
- * starting DMA since it has nothing more to
- * do.
- */
- return;
-#else
- cmd->SCp.this_residual -= transfersize - len;
-#endif
- }
- } else
-#endif /* defined(REAL_DMA) */
- NCR5380_transfer_pio(instance, &phase,
- (int *) &cmd->SCp.this_residual, (unsigned char **)
- &cmd->SCp.ptr);
-#ifdef REAL_DMA
- /* if we had intended to dma that command clear it */
- if(sun3_dma_setup_done == cmd)
- sun3_dma_setup_done = NULL;
-#endif
-
- break;
- case PHASE_MSGIN:
- len = 1;
- data = &tmp;
- NCR5380_write(SELECT_ENABLE_REG, 0); /* disable reselects */
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- cmd->SCp.Message = tmp;
-
- switch (tmp) {
- /*
- * Linking lets us reduce the time required to get the
- * next command out to the device, hopefully this will
- * mean we don't waste another revolution due to the delays
- * required by ARBITRATION and another SELECTION.
- *
- * In the current implementation proposal, low level drivers
- * merely have to start the next command, pointed to by
- * next_link, done() is called as with unlinked commands.
- */
-#ifdef LINKED
- case LINKED_CMD_COMPLETE:
- case LINKED_FLG_CMD_COMPLETE:
- /* Accept message by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-
- dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %llu linked command "
- "complete.\n", HOSTNO, cmd->device->id, cmd->device->lun);
-
- /* Enable reselect interrupts */
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- /*
- * Sanity check : A linked command should only terminate
- * with one of these messages if there are more linked
- * commands available.
- */
-
- if (!cmd->next_link) {
- printk(KERN_NOTICE "scsi%d: target %d lun %llu "
- "linked command complete, no next_link\n",
- HOSTNO, cmd->device->id, cmd->device->lun);
- sink = 1;
- do_abort (instance);
- return;
- }
-
- initialize_SCp(cmd->next_link);
- /* The next command is still part of this process; copy it
- * and don't free it! */
- cmd->next_link->tag = cmd->tag;
- cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
- dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %llu linked request "
- "done, calling scsi_done().\n",
- HOSTNO, cmd->device->id, cmd->device->lun);
- cmd->scsi_done(cmd);
- cmd = hostdata->connected;
- break;
-#endif /* def LINKED */
- case ABORT:
- case COMMAND_COMPLETE:
- /* Accept message by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- hostdata->connected = NULL;
- dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
- "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
-#ifdef SUPPORT_TAGS
- cmd_free_tag( cmd );
- if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
- /* Turn a QUEUE FULL status into BUSY, I think the
- * mid level cannot handle QUEUE FULL :-( (The
- * command is retried after BUSY). Also update our
- * queue size to the number of currently issued
- * commands now.
- */
- /* ++Andreas: the mid level code knows about
- QUEUE_FULL now. */
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
- dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %llu returned "
- "QUEUE_FULL after %d commands\n",
- HOSTNO, cmd->device->id, cmd->device->lun,
- ta->nr_allocated);
- if (ta->queue_size > ta->nr_allocated)
- ta->nr_allocated = ta->queue_size;
- }
-#else
- hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
-#endif
- /* Enable reselect interrupts */
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
-
- /*
- * I'm not sure what the correct thing to do here is :
- *
- * If the command that just executed is NOT a request
- * sense, the obvious thing to do is to set the result
- * code to the values of the stored parameters.
- *
- * If it was a REQUEST SENSE command, we need some way to
- * differentiate between the failure code of the original
- * and the failure code of the REQUEST sense - the obvious
- * case is success, where we fall through and leave the
- * result code unchanged.
- *
- * The non-obvious place is where the REQUEST SENSE failed
- */
-
- if (cmd->cmnd[0] != REQUEST_SENSE)
- cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
- else if (status_byte(cmd->SCp.Status) != GOOD)
- cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
-
- if ((cmd->cmnd[0] == REQUEST_SENSE) &&
- hostdata->ses.cmd_len) {
- scsi_eh_restore_cmnd(cmd, &hostdata->ses);
- hostdata->ses.cmd_len = 0 ;
- }
-
- if ((cmd->cmnd[0] != REQUEST_SENSE) &&
- (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) {
- scsi_eh_prep_cmnd(cmd, &hostdata->ses, NULL, 0, ~0);
- dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n",
- HOSTNO);
- /* this is initialized from initialize_SCp
- cmd->SCp.buffer = NULL;
- cmd->SCp.buffers_residual = 0;
- */
-
- local_irq_save(flags);
- LIST(cmd,hostdata->issue_queue);
- SET_NEXT(cmd, hostdata->issue_queue);
- hostdata->issue_queue = (struct scsi_cmnd *) cmd;
- local_irq_restore(flags);
- dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
- "issue queue\n", H_NO(cmd));
- } else {
- cmd->scsi_done(cmd);
- }
-
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- /*
- * Restore phase bits to 0 so an interrupted selection,
- * arbitration can resume.
- */
- NCR5380_write(TARGET_COMMAND_REG, 0);
-
- while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
- barrier();
-
- return;
- case MESSAGE_REJECT:
- /* Accept message by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- /* Enable reselect interrupts */
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- switch (hostdata->last_message) {
- case HEAD_OF_QUEUE_TAG:
- case ORDERED_QUEUE_TAG:
- case SIMPLE_QUEUE_TAG:
- /* The target obviously doesn't support tagged
- * queuing, even though it announced this ability in
- * its INQUIRY data ?!? (maybe only this LUN?) Ok,
- * clear 'tagged_supported' and lock the LUN, since
- * the command is treated as untagged further on.
- */
- cmd->device->tagged_supported = 0;
- hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
- cmd->tag = TAG_NONE;
- dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %llu rejected "
- "QUEUE_TAG message; tagged queuing "
- "disabled\n",
- HOSTNO, cmd->device->id, cmd->device->lun);
- break;
- }
- break;
- case DISCONNECT:
- /* 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;
- hostdata->disconnected_queue = cmd;
- local_irq_restore(flags);
- dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d lun %llu was "
- "moved from connected to the "
- "disconnected_queue\n", HOSTNO,
- cmd->device->id, cmd->device->lun);
- /*
- * Restore phase bits to 0 so an interrupted selection,
- * arbitration can resume.
- */
- NCR5380_write(TARGET_COMMAND_REG, 0);
-
- /* Enable reselect interrupts */
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- /* Wait for bus free to avoid nasty timeouts */
- while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
- barrier();
-#ifdef SUN3_SCSI_VME
- dregs->csr |= CSR_DMA_ENABLE;
-#endif
- return;
- /*
- * The SCSI data pointer is *IMPLICITLY* saved on a disconnect
- * operation, in violation of the SCSI spec so we can safely
- * ignore SAVE/RESTORE pointers calls.
- *
- * Unfortunately, some disks violate the SCSI spec and
- * don't issue the required SAVE_POINTERS message before
- * disconnecting, and we have to break spec to remain
- * compatible.
- */
- case SAVE_POINTERS:
- case RESTORE_POINTERS:
- /* Accept message by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- /* Enable reselect interrupts */
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- break;
- case EXTENDED_MESSAGE:
-/*
- * Extended messages are sent in the following format :
- * Byte
- * 0 EXTENDED_MESSAGE == 1
- * 1 length (includes one byte for code, doesn't
- * include first two bytes)
- * 2 code
- * 3..length+1 arguments
- *
- * Start the extended message buffer with the EXTENDED_MESSAGE
- * byte, since spi_print_msg() wants the whole thing.
- */
- extended_msg[0] = EXTENDED_MESSAGE;
- /* Accept first byte by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-
- dprintk(NDEBUG_EXTENDED, "scsi%d: receiving extended message\n", HOSTNO);
-
- len = 2;
- data = extended_msg + 1;
- phase = PHASE_MSGIN;
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- dprintk(NDEBUG_EXTENDED, "scsi%d: length=%d, code=0x%02x\n", HOSTNO,
- (int)extended_msg[1], (int)extended_msg[2]);
-
- if (!len && extended_msg[1] <=
- (sizeof (extended_msg) - 1)) {
- /* Accept third byte by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
- len = extended_msg[1] - 1;
- data = extended_msg + 3;
- phase = PHASE_MSGIN;
-
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- dprintk(NDEBUG_EXTENDED, "scsi%d: message received, residual %d\n",
- HOSTNO, len);
-
- switch (extended_msg[2]) {
- case EXTENDED_SDTR:
- case EXTENDED_WDTR:
- case EXTENDED_MODIFY_DATA_POINTER:
- case EXTENDED_EXTENDED_IDENTIFY:
- tmp = 0;
- }
- } else if (len) {
- printk(KERN_NOTICE "scsi%d: error receiving "
- "extended message\n", HOSTNO);
- tmp = 0;
- } else {
- printk(KERN_NOTICE "scsi%d: extended message "
- "code %02x length %d is too long\n",
- HOSTNO, extended_msg[2], extended_msg[1]);
- tmp = 0;
- }
- /* Fall through to reject message */
-
- /*
- * If we get something weird that we aren't expecting,
- * reject it.
- */
- default:
- if (!tmp) {
- printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO);
- spi_print_msg(extended_msg);
- printk("\n");
- } else if (tmp != EXTENDED_MESSAGE)
- printk(KERN_DEBUG "scsi%d: rejecting unknown "
- "message %02x from target %d, lun %llu\n",
- HOSTNO, tmp, cmd->device->id, cmd->device->lun);
- else
- printk(KERN_DEBUG "scsi%d: rejecting unknown "
- "extended message "
- "code %02x, length %d from target %d, lun %llu\n",
- HOSTNO, extended_msg[1], extended_msg[0],
- cmd->device->id, cmd->device->lun);
-
-
- msgout = MESSAGE_REJECT;
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
- ICR_ASSERT_ATN);
- break;
- } /* switch (tmp) */
- break;
- case PHASE_MSGOUT:
- len = 1;
- data = &msgout;
- hostdata->last_message = msgout;
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- if (msgout == ABORT) {
-#ifdef SUPPORT_TAGS
- cmd_free_tag( cmd );
-#else
- hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
-#endif
- hostdata->connected = NULL;
- cmd->result = DID_ERROR << 16;
- cmd->scsi_done(cmd);
- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
- return;
- }
- msgout = NOP;
- break;
- case PHASE_CMDOUT:
- len = cmd->cmd_len;
- data = cmd->cmnd;
- /*
- * XXX for performance reasons, on machines with a
- * PSEUDO-DMA architecture we should probably
- * use the dma transfer function.
- */
- NCR5380_transfer_pio(instance, &phase, &len,
- &data);
- break;
- case PHASE_STATIN:
- len = 1;
- data = &tmp;
- NCR5380_transfer_pio(instance, &phase, &len, &data);
- cmd->SCp.Status = tmp;
- break;
- default:
- printk("scsi%d: unknown phase\n", HOSTNO);
- NCR5380_dprint(NDEBUG_ANY, instance);
- } /* switch(phase) */
- } /* if (tmp * SR_REQ) */
- } /* while (1) */
-}
-
-/*
- * Function : void NCR5380_reselect (struct Scsi_Host *instance)
- *
- * Purpose : does reselection, initializing the instance->connected
- * field to point to the struct scsi_cmnd for which the I_T_L or I_T_L_Q
- * nexus has been reestablished,
- *
- * Inputs : instance - this instance of the NCR5380.
- *
- */
-
-/* it might eventually prove necessary to do a dma setup on
- reselection, but it doesn't seem to be needed now -- sam */
-
-static void NCR5380_reselect (struct Scsi_Host *instance)
-{
- SETUP_HOSTDATA(instance);
- unsigned char target_mask;
- unsigned char lun;
-#ifdef SUPPORT_TAGS
- unsigned char tag;
-#endif
- unsigned char msg[3];
- struct scsi_cmnd *tmp = NULL, *prev;
-/* unsigned long flags; */
-
- /*
- * Disable arbitration, etc. since the host adapter obviously
- * lost, and tell an interrupted NCR5380_select() to restart.
- */
-
- NCR5380_write(MODE_REG, MR_BASE);
- hostdata->restart_select = 1;
-
- target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);
-
- dprintk(NDEBUG_RESELECTION, "scsi%d: reselect\n", HOSTNO);
-
- /*
- * At this point, we have detected that our SCSI ID is on the bus,
- * SEL is true and BSY was false for at least one bus settle delay
- * (400 ns).
- *
- * We must assert BSY ourselves, until the target drops the SEL
- * signal.
- */
-
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_BSY);
-
- while (NCR5380_read(STATUS_REG) & SR_SEL);
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-
- /*
- * Wait for target to go into MSGIN.
- */
-
- while (!(NCR5380_read(STATUS_REG) & SR_REQ));
-
-#if 1
- // acknowledge toggle to MSGIN
- NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(PHASE_MSGIN));
-
- // peek at the byte without really hitting the bus
- msg[0] = NCR5380_read(CURRENT_SCSI_DATA_REG);
-#endif
-
- if (!(msg[0] & 0x80)) {
- printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
- spi_print_msg(msg);
- do_abort(instance);
- return;
- }
- lun = (msg[0] & 0x07);
-
- /*
- * Find the command corresponding to the I_T_L or I_T_L_Q nexus we
- * 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 == tmp->device->lun)
-#ifdef SUPPORT_TAGS
- && (tag == tmp->tag)
-#endif
- ) {
- if (prev) {
- REMOVE(prev, NEXT(prev), tmp, NEXT(tmp));
- SET_NEXT(prev, NEXT(tmp));
- } else {
- REMOVE(-1, hostdata->disconnected_queue, tmp, NEXT(tmp));
- hostdata->disconnected_queue = NEXT(tmp);
- }
- SET_NEXT(tmp, NULL);
- break;
- }
- }
-
- if (!tmp) {
- printk(KERN_WARNING "scsi%d: warning: target bitmask %02x lun %d "
-#ifdef SUPPORT_TAGS
- "tag %d "
-#endif
- "not in disconnected_queue.\n",
- HOSTNO, target_mask, lun
-#ifdef SUPPORT_TAGS
- , tag
-#endif
- );
- /*
- * Since we have an established nexus that we can't do anything
- * with, we must abort it.
- */
- do_abort(instance);
- return;
- }
-#if 1
- /* engage dma setup for the command we just saw */
- {
- void *d;
- unsigned long count;
-
- if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
- count = tmp->SCp.buffer->length;
- d = SGADDR(tmp->SCp.buffer);
- } else {
- count = tmp->SCp.this_residual;
- d = tmp->SCp.ptr;
- }
-#ifdef REAL_DMA
- /* setup this command for dma if not already */
- if((count > SUN3_DMA_MINSIZE) && (sun3_dma_setup_done != tmp))
- {
- sun3scsi_dma_setup(d, count, rq_data_dir(tmp->request));
- sun3_dma_setup_done = tmp;
- }
-#endif
- }
-#endif
-
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
- /* Accept message by clearing ACK */
- NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-
-#ifdef SUPPORT_TAGS
- /* If the phase is still MSGIN, the target wants to send some more
- * messages. In case it supports tagged queuing, this is probably a
- * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
- */
- tag = TAG_NONE;
- if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
- /* Accept previous IDENTIFY message by clearing ACK */
- NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE );
- len = 2;
- data = msg+1;
- if (!NCR5380_transfer_pio(instance, &phase, &len, &data) &&
- msg[1] == SIMPLE_QUEUE_TAG)
- tag = msg[2];
- dprintk(NDEBUG_TAGS, "scsi%d: target mask %02x, lun %d sent tag %d at "
- "reselection\n", HOSTNO, target_mask, lun, tag);
- }
-#endif
-
- hostdata->connected = tmp;
- dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
- HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
-}
-
-
-/*
- * Function : int NCR5380_abort(struct scsi_cmnd *cmd)
- *
- * Purpose : abort a command
- *
- * Inputs : cmd - the struct scsi_cmnd to abort, code - code to set the
- * host byte of the result field to, if zero DID_ABORTED is
- * used.
- *
- * Returns : 0 - success, -1 on failure.
- *
- * XXX - there is no way to abort the command that is currently
- * connected, you have to wait for it to complete. If this is
- * a problem, we could implement longjmp() / setjmp(), setjmp()
- * called where the loop started in NCR5380_main().
- */
-
-static int NCR5380_abort(struct scsi_cmnd *cmd)
-{
- struct Scsi_Host *instance = cmd->device->host;
- SETUP_HOSTDATA(instance);
- struct scsi_cmnd *tmp, **prev;
- unsigned long flags;
-
- printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO);
- scsi_print_command(cmd);
-
- NCR5380_print_status (instance);
-
- local_irq_save(flags);
-
- 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->aborted = 1;
- 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
- local_irq_restore(flags);
- cmd->scsi_done(cmd);
- return SUCCESS;
- } else {
-/* local_irq_restore(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) {
- REMOVE(5, *prev, tmp, NEXT(tmp));
- (*prev) = NEXT(tmp);
- SET_NEXT(tmp, NULL);
- tmp->result = DID_ABORT << 16;
- local_irq_restore(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) {
- local_irq_restore(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) {
- local_irq_restore(flags);
- dprintk(NDEBUG_ABORT, "scsi%d: aborting disconnected command.\n", HOSTNO);
-
- if (NCR5380_select(instance, cmd))
- return FAILED;
-
- dprintk(NDEBUG_ABORT, "scsi%d: nexus reestablished.\n", HOSTNO);
-
- do_abort (instance);
-
- local_irq_save(flags);
- 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) {
- REMOVE(5, *prev, tmp, NEXT(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
- local_irq_restore(flags);
- 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.
- */
-
- local_irq_restore(flags);
- printk(KERN_INFO "scsi%d: warning : SCSI command probably completed successfully before abortion\n", HOSTNO);
-
- return FAILED;
-}
-
-
-/*
- * Function : int NCR5380_bus_reset(struct scsi_cmnd *cmd)
- *
- * Purpose : reset the SCSI bus.
- *
- * Returns : SUCCESS or FAILURE
- *
- */
-
-static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
-{
- SETUP_HOSTDATA(cmd->device->host);
- int i;
- unsigned long flags;
-#if defined(RESET_RUN_DONE)
- struct scsi_cmnd *connected, *disconnected_queue;
-#endif
-
-
- NCR5380_print_status (cmd->device->host);
-
- /* get in phase */
- NCR5380_write( TARGET_COMMAND_REG,
- PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) ));
- /* assert RST */
- NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST );
- udelay (40);
- /* reset NCR registers */
- NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE );
- NCR5380_write( MODE_REG, MR_BASE );
- NCR5380_write( TARGET_COMMAND_REG, 0 );
- NCR5380_write( SELECT_ENABLE_REG, 0 );
- /* ++roman: reset interrupt condition! otherwise no interrupts don't get
- * through anymore ... */
- (void)NCR5380_read( RESET_PARITY_INTERRUPT_REG );
-
- /* MSch 20140115 - looking at the generic NCR5380 driver, all of this
- * should go.
- * Catch-22: if we don't clear all queues, the SCSI driver lock will
- * not be released by atari_scsi_reset()!
- */
-
-#if defined(RESET_RUN_DONE)
- /* XXX Should now be done by midlevel code, but it's broken XXX */
- /* XXX see below XXX */
-
- /* MSch: old-style reset: actually abort all command processing here */
-
- /* After the reset, there are no more connected or disconnected commands
- * and no busy units; to avoid problems with re-inserting the commands
- * into the issue_queue (via scsi_done()), the aborted commands are
- * remembered in local variables first.
- */
- local_irq_save(flags);
- connected = (struct scsi_cmnd *)hostdata->connected;
- hostdata->connected = NULL;
- disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue;
- hostdata->disconnected_queue = NULL;
-#ifdef SUPPORT_TAGS
- free_all_tags();
-#endif
- for( i = 0; i < 8; ++i )
- hostdata->busy[i] = 0;
-#ifdef REAL_DMA
- hostdata->dma_len = 0;
-#endif
- local_irq_restore(flags);
-
- /* In order to tell the mid-level code which commands were aborted,
- * set the command status to DID_RESET and call scsi_done() !!!
- * This ultimately aborts processing of these commands in the mid-level.
- */
-
- if ((cmd = connected)) {
- dprintk(NDEBUG_ABORT, "scsi%d: reset aborted a connected command\n", H_NO(cmd));
- cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
- cmd->scsi_done( cmd );
- }
-
- for (i = 0; (cmd = disconnected_queue); ++i) {
- disconnected_queue = NEXT(cmd);
- SET_NEXT(cmd, NULL);
- cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
- cmd->scsi_done( cmd );
- }
- if (i > 0)
- dprintk(NDEBUG_ABORT, "scsi: reset aborted %d disconnected command(s)\n", i);
-
-
- /* since all commands have been explicitly terminated, we need to tell
- * the midlevel code that the reset was SUCCESSFUL, and there is no
- * need to 'wake up' the commands by a request_sense
- */
- return SUCCESS;
-#else /* 1 */
-
- /* MSch: new-style reset handling: let the mid-level do what it can */
-
- /* ++guenther: MID-LEVEL IS STILL BROKEN.
- * Mid-level is supposed to requeue all commands that were active on the
- * various low-level queues. In fact it does this, but that's not enough
- * because all these commands are subject to timeout. And if a timeout
- * happens for any removed command, *_abort() is called but all queues
- * are now empty. Abort then gives up the falcon lock, which is fatal,
- * since the mid-level will queue more commands and must have the lock
- * (it's all happening inside timer interrupt handler!!).
- * Even worse, abort will return NOT_RUNNING for all those commands not
- * on any queue, so they won't be retried ...
- *
- * Conclusion: either scsi.c disables timeout for all resetted commands
- * immediately, or we lose! As of linux-2.0.20 it doesn't.
- */
-
- /* After the reset, there are no more connected or disconnected commands
- * and no busy units; so clear the low-level status here to avoid
- * conflicts when the mid-level code tries to wake up the affected
- * commands!
- */
-
- if (hostdata->issue_queue)
- dprintk(NDEBUG_ABORT, "scsi%d: reset aborted issued command(s)\n", H_NO(cmd));
- if (hostdata->connected)
- dprintk(NDEBUG_ABORT, "scsi%d: reset aborted a connected command\n", H_NO(cmd));
- if (hostdata->disconnected_queue)
- dprintk(NDEBUG_ABORT, "scsi%d: reset aborted disconnected command(s)\n", H_NO(cmd));
-
- local_irq_save(flags);
- hostdata->issue_queue = NULL;
- hostdata->connected = NULL;
- hostdata->disconnected_queue = NULL;
-#ifdef SUPPORT_TAGS
- free_all_tags();
-#endif
- for( i = 0; i < 8; ++i )
- hostdata->busy[i] = 0;
-#ifdef REAL_DMA
- hostdata->dma_len = 0;
-#endif
- local_irq_restore(flags);
-
- /* we did no complete reset of all commands, so a wakeup is required */
- return SUCCESS;
-#endif /* 1 */
-}
-
-/* Local Variables: */
-/* tab-width: 8 */
-/* End: */
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (30 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:37 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING Finn Thain
` (4 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-merge-from-NCR5380-comments-printk-etc --]
[-- Type: text/plain, Size: 13332 bytes --]
The NCR5380.c core driver has moved on since atari_NCR5380.c was forked.
Some of those changes are also relevant to atari_NCR5380.c so apply them
there as well.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_NCR5380.c | 209 +++++++++++++++++--------------------------
1 file changed, 87 insertions(+), 122 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:56.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:59.000000000 +1100
@@ -104,27 +104,7 @@
/*
* Design
- * Issues :
*
- * The other Linux SCSI drivers were written when Linux was Intel PC-only,
- * and specifically for each board rather than each chip. This makes their
- * adaptation to platforms like the Mac (Some of which use NCR5380's)
- * more difficult than it has to be.
- *
- * Also, many of the SCSI drivers were written before the command queuing
- * routines were implemented, meaning their implementations of queued
- * commands were hacked on rather than designed in from the start.
- *
- * When I designed the Linux SCSI drivers I figured that
- * while having two different SCSI boards in a system might be useful
- * for debugging things, two of the same type wouldn't be used.
- * Well, I was wrong and a number of users have mailed me about running
- * multiple high-performance SCSI boards in a server.
- *
- * Finally, when I get questions from users, I have no idea what
- * revision of my driver they are running.
- *
- * This driver attempts to address these problems :
* This is a generic 5380 driver. To use it on a different platform,
* one simply writes appropriate system specific macros (ie, data
* transfer - some PC's will use the I/O bus, 68K's must use
@@ -139,11 +119,6 @@
* allowing multiple commands to propagate all the way to a SCSI-II device
* while a command is already executing.
*
- * To solve the multiple-boards-in-the-same-system problem,
- * there is a separate instance structure for each instance
- * of a 5380 in the system. So, multiple NCR5380 drivers will
- * be able to coexist with appropriate changes to the high level
- * SCSI code.
*
* Issues specific to the NCR5380 :
*
@@ -168,19 +143,17 @@
* Architecture :
*
* At the heart of the design is a coroutine, NCR5380_main,
- * which is started when not running by the interrupt handler,
- * timer, and queue command function. It attempts to establish
- * I_T_L or I_T_L_Q nexuses by removing the commands from the
- * issue queue and calling NCR5380_select() if a nexus
- * is not established.
+ * which is started from a workqueue for each NCR5380 host in the
+ * system. It attempts to establish I_T_L or I_T_L_Q nexuses by
+ * removing the commands from the issue queue and calling
+ * NCR5380_select() if a nexus is not established.
*
* Once a nexus is established, the NCR5380_information_transfer()
* phase goes through the various phases as instructed by the target.
* if the target goes into MSG IN and sends a DISCONNECT message,
* the command structure is placed into the per instance disconnected
- * queue, and NCR5380_main tries to find more work. If USLEEP
- * was defined, and the target is idle for too long, the system
- * will try to sleep.
+ * queue, and NCR5380_main tries to find more work. If the target is
+ * idle for too long, the system will try to sleep.
*
* If a command has disconnected, eventually an interrupt will trigger,
* calling NCR5380_intr() which will in turn call NCR5380_reselect
@@ -206,6 +179,9 @@
* AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
* for commands that return with a CHECK CONDITION status.
*
+ * DIFFERENTIAL - if defined, NCR53c81 chips will use external differential
+ * transceivers.
+ *
* LINKED - if defined, linked commands are supported.
*
* REAL_DMA - if defined, REAL DMA is used during the data transfer phases.
@@ -218,6 +194,9 @@
*
* NCR5380_write(register, value) - write to the specific register
*
+ * NCR5380_implementation_fields - additional fields needed for this
+ * specific implementation of the NCR5380
+ *
* Either real DMA *or* pseudo DMA may be implemented
* REAL functions :
* NCR5380_REAL_DMA should be defined if real DMA is to be used.
@@ -236,20 +215,6 @@
* NCR5380_pwrite(instance, src, count)
* NCR5380_pread(instance, dst, count);
*
- * If nothing specific to this implementation needs doing (ie, with external
- * hardware), you must also define
- *
- * NCR5380_queue_command
- * NCR5380_reset
- * NCR5380_abort
- *
- * to be the global entry points into the specific driver, ie
- * #define NCR5380_queue_command t128_queue_command.
- *
- * If this is not done, the routines will be defined as static functions
- * with the NCR5380* names and the user must provide a globally
- * accessible wrapper function.
- *
* The generic driver is initialized by calling NCR5380_init(instance),
* after setting the appropriate host specific fields and ID. If the
* driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
@@ -489,13 +454,11 @@ static void merge_contiguous_buffers(str
#endif /* !defined(CONFIG_SUN3) */
}
-/*
- * Function : void initialize_SCp(struct scsi_cmnd *cmd)
- *
- * Purpose : initialize the saved data pointers for cmd to point to the
- * start of the buffer.
+/**
+ * initialize_SCp - init the scsi pointer field
+ * @cmd: command block to set up
*
- * Inputs : cmd - scsi_cmnd structure to have pointers reset.
+ * Set up the internal fields in the SCSI command.
*/
static inline void initialize_SCp(struct scsi_cmnd *cmd)
@@ -548,12 +511,11 @@ static struct {
{0, NULL}
};
-/*
- * Function : void NCR5380_print(struct Scsi_Host *instance)
- *
- * Purpose : print the SCSI bus signals for debugging purposes
+/**
+ * NCR5380_print - print scsi bus signals
+ * @instance: adapter state to dump
*
- * Input : instance - which NCR5380
+ * Print the SCSI bus signals for debugging purposes
*/
static void NCR5380_print(struct Scsi_Host *instance)
@@ -596,12 +558,13 @@ static struct {
{PHASE_UNKNOWN, "UNKNOWN"}
};
-/*
- * Function : void NCR5380_print_phase(struct Scsi_Host *instance)
+/**
+ * NCR5380_print_phase - show SCSI phase
+ * @instance: adapter to dump
*
- * Purpose : print the current SCSI phase for debugging purposes
+ * Print the current SCSI phase for debugging purposes
*
- * Input : instance - which NCR5380
+ * Locks: none
*/
static void NCR5380_print_phase(struct Scsi_Host *instance)
@@ -710,13 +673,12 @@ static void prepare_info(struct Scsi_Hos
"");
}
-/*
- * Function : void NCR5380_print_status (struct Scsi_Host *instance)
- *
- * Purpose : print commands in the various queues, called from
- * NCR5380_abort and NCR5380_debug to aid debugging.
+/**
+ * NCR5380_print_status - dump controller info
+ * @instance: controller to dump
*
- * Inputs : instance, pointer to this instance.
+ * Print commands in the various queues, called from NCR5380_abort
+ * to aid debugging.
*/
static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd)
@@ -807,16 +769,18 @@ static int __maybe_unused NCR5380_show_i
return 0;
}
-/*
- * Function : void NCR5380_init (struct Scsi_Host *instance)
- *
- * Purpose : initializes *instance and corresponding 5380 chip.
+/**
+ * NCR5380_init - initialise an NCR5380
+ * @instance: adapter to configure
+ * @flags: control flags
*
- * Inputs : instance - instantiation of the 5380 driver.
+ * Initializes *instance and corresponding 5380 chip,
+ * with flags OR'd into the initial flags value.
*
* Notes : I assume that the host, hostno, and id bits have been
- * set correctly. I don't care about the irq and other fields.
+ * set correctly. I don't care about the irq and other fields.
*
+ * Returns 0 for success
*/
static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
@@ -861,27 +825,26 @@ static int __init NCR5380_init(struct Sc
return 0;
}
+/**
+ * NCR5380_exit - remove an NCR5380
+ * @instance: adapter to remove
+ *
+ * Assumes that no more work can be queued (e.g. by NCR5380_intr).
+ */
+
static void NCR5380_exit(struct Scsi_Host *instance)
{
- /* Empty, as we didn't schedule any delayed work */
+ cancel_work_sync(&NCR5380_tqueue);
}
-/*
- * Function : int NCR5380_queue_command (struct scsi_cmnd *cmd,
- * void (*done)(struct scsi_cmnd *))
- *
- * Purpose : enqueues a SCSI command
- *
- * Inputs : cmd - SCSI command, done - function called on completion, with
- * a pointer to the command descriptor.
- *
- * Returns : 0
- *
- * Side effects :
- * cmd is added to the per instance issue_queue, with minor
- * twiddling done to the host specific fields of cmd. If the
- * main coroutine is not running, it is restarted.
- *
+/**
+ * NCR5380_queue_command - queue a command
+ * @instance: the relevant SCSI adapter
+ * @cmd: SCSI command
+ *
+ * cmd is added to the per instance issue_queue, with minor
+ * twiddling done to the host specific fields of cmd. If the
+ * main coroutine is not running, it is restarted.
*/
static int NCR5380_queue_command(struct Scsi_Host *instance,
@@ -937,6 +900,13 @@ static int NCR5380_queue_command(struct
local_irq_save(flags);
+ /*
+ * Insert the cmd into the issue queue. Note that REQUEST SENSE
+ * commands are added to the head of the queue since any command will
+ * clear the contingent allegiance condition that exists and the
+ * sense data is only guaranteed to be valid while the condition exists.
+ */
+
if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
LIST(cmd, hostdata->issue_queue);
SET_NEXT(cmd, hostdata->issue_queue);
@@ -979,16 +949,15 @@ static inline void maybe_release_dma_irq
NCR5380_release_dma_irq(instance);
}
-/*
- * Function : NCR5380_main (void)
+/**
+ * NCR5380_main - NCR state machines
*
- * Purpose : NCR5380_main is a coroutine that runs as long as more work can
- * be done on the NCR5380 host adapters in a system. Both
- * NCR5380_queue_command() and NCR5380_intr() will try to start it
- * in case it is not running.
+ * NCR5380_main is a coroutine that runs as long as more work can
+ * be done on the NCR5380 host adapters in a system. Both
+ * NCR5380_queue_command() and NCR5380_intr() will try to start it
+ * in case it is not running.
*
- * NOTE : NCR5380_main exits with interrupts *disabled*, the caller should
- * reenable them. This prevents reentrancy and kernel stack overflow.
+ * Locks: called as its own thread with no locks held.
*/
static void NCR5380_main(struct work_struct *work)
@@ -1243,15 +1212,14 @@ static void NCR5380_dma_complete(struct
#endif /* REAL_DMA */
-/*
- * Function : void NCR5380_intr (int irq)
- *
- * Purpose : handle interrupts, reestablishing I_T_L or I_T_L_Q nexuses
- * from the disconnected queue, and restarting NCR5380_main()
- * as required.
- *
- * Inputs : int irq, irq that caused this interrupt.
- *
+/**
+ * NCR5380_intr - generic NCR5380 irq handler
+ * @irq: interrupt number
+ * @dev_id: device info
+ *
+ * Handle interrupts, reestablishing I_T_L or I_T_L_Q nexuses
+ * from the disconnected queue, and restarting NCR5380_main()
+ * as required.
*/
static irqreturn_t NCR5380_intr(int irq, void *dev_id)
@@ -1544,7 +1512,7 @@ static int NCR5380_select(struct Scsi_Ho
* selection.
*/
- timeout = jiffies + 25;
+ timeout = jiffies + (250 * HZ / 1000);
/*
* XXX very interesting - we're seeing a bounce where the BSY we
@@ -2127,9 +2095,8 @@ static void NCR5380_information_transfer
* If the watchdog timer fires, all future
* accesses to this device will use the
* polled-IO. */
- printk(KERN_NOTICE "scsi%d: switching target %d "
- "lun %llu to slow handshake\n", HOSTNO,
- cmd->device->id, cmd->device->lun);
+ scmd_printk(KERN_INFO, cmd,
+ "switching to slow handshake\n");
cmd->device->borken = 1;
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
ICR_ASSERT_ATN);
@@ -2449,20 +2416,18 @@ static void NCR5380_information_transfer
*/
default:
if (!tmp) {
- printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO);
+ printk(KERN_INFO "scsi%d: rejecting message ",
+ instance->host_no);
spi_print_msg(extended_msg);
printk("\n");
} else if (tmp != EXTENDED_MESSAGE)
- printk(KERN_DEBUG "scsi%d: rejecting unknown "
- "message %02x from target %d, lun %llu\n",
- HOSTNO, tmp, cmd->device->id, cmd->device->lun);
+ scmd_printk(KERN_INFO, cmd,
+ "rejecting unknown message %02x\n",
+ tmp);
else
- printk(KERN_DEBUG "scsi%d: rejecting unknown "
- "extended message "
- "code %02x, length %d from target %d, lun %llu\n",
- HOSTNO, extended_msg[1], extended_msg[0],
- cmd->device->id, cmd->device->lun);
-
+ scmd_printk(KERN_INFO, cmd,
+ "rejecting unknown extended message code %02x, length %d\n",
+ extended_msg[1], extended_msg[0]);
msgout = MESSAGE_REJECT;
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (31 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:39 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data Finn Thain
` (3 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-introduce-FLAG_TAGGED_QUEUING --]
[-- Type: text/plain, Size: 7471 bytes --]
The static variable setup_use_tagged_queuing is declared in mac_scsi.c,
sun3_scsi.c and atari_scsi.c and doesn't belong in the core driver.
None of the other NCR5380 drivers suffer from this layering issue which
makes merging the core drivers more difficult and will likely hinder plans
for future use of platform data to configure the driver.
Replace the static variable with a host flag. This way it can be reported
along with the other flags.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.h | 1 +
drivers/scsi/atari_NCR5380.c | 22 +++++++++++++---------
drivers/scsi/atari_scsi.c | 8 ++++----
drivers/scsi/mac_scsi.c | 8 ++++----
drivers/scsi/sun3_scsi.c | 12 ++++++------
5 files changed, 28 insertions(+), 23 deletions(-)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:54.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:26:00.000000000 +1100
@@ -242,6 +242,7 @@
#define FLAG_NO_PSEUDO_DMA 8 /* Inhibit DMA */
#define FLAG_DTC3181E 16 /* DTC3181E */
#define FLAG_LATE_DMA_SETUP 32 /* Setup NCR before DMA H/W */
+#define FLAG_TAGGED_QUEUING 64 /* as X3T9.2 spelled it */
#ifndef ASM
struct NCR5380_hostdata {
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:59.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:00.000000000 +1100
@@ -283,12 +283,12 @@ typedef struct {
static TAG_ALLOC TagAlloc[8][8]; /* 8 targets and 8 LUNs */
-static void __init init_tags(void)
+static void __init init_tags(struct NCR5380_hostdata *hostdata)
{
int target, lun;
TAG_ALLOC *ta;
- if (!setup_use_tagged_queuing)
+ if (!(hostdata->flags & FLAG_TAGGED_QUEUING))
return;
for (target = 0; target < 8; ++target) {
@@ -321,7 +321,8 @@ static int is_lun_busy(struct scsi_cmnd
if (hostdata->busy[cmd->device->id] & (1 << lun))
return 1;
if (!should_be_tagged ||
- !setup_use_tagged_queuing || !cmd->device->tagged_supported)
+ !(hostdata->flags & FLAG_TAGGED_QUEUING) ||
+ !cmd->device->tagged_supported)
return 0;
if (TagAlloc[cmd->device->id][lun].nr_allocated >=
TagAlloc[cmd->device->id][lun].queue_size) {
@@ -347,7 +348,8 @@ static void cmd_get_tag(struct scsi_cmnd
* an untagged command.
*/
if (!should_be_tagged ||
- !setup_use_tagged_queuing || !cmd->device->tagged_supported) {
+ !(hostdata->flags & FLAG_TAGGED_QUEUING) ||
+ !cmd->device->tagged_supported) {
cmd->tag = TAG_NONE;
hostdata->busy[cmd->device->id] |= (1 << lun);
dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d now allocated by untagged "
@@ -392,12 +394,12 @@ static void cmd_free_tag(struct scsi_cmn
}
-static void free_all_tags(void)
+static void free_all_tags(struct NCR5380_hostdata *hostdata)
{
int target, lun;
TAG_ALLOC *ta;
- if (!setup_use_tagged_queuing)
+ if (!(hostdata->flags & FLAG_TAGGED_QUEUING))
return;
for (target = 0; target < 8; ++target) {
@@ -653,11 +655,13 @@ static void prepare_info(struct Scsi_Hos
"base 0x%lx, irq %d, "
"can_queue %d, cmd_per_lun %d, "
"sg_tablesize %d, this_id %d, "
+ "flags { %s}, "
"options { %s} ",
instance->hostt->name, instance->io_port, instance->n_io_port,
instance->base, instance->irq,
instance->can_queue, instance->cmd_per_lun,
instance->sg_tablesize, instance->this_id,
+ hostdata->flags & FLAG_TAGGED_QUEUING ? "TAGGED_QUEUING " : "",
#ifdef DIFFERENTIAL
"DIFFERENTIAL "
#endif
@@ -799,7 +803,7 @@ static int __init NCR5380_init(struct Sc
for (i = 0; i < 8; ++i)
hostdata->busy[i] = 0;
#ifdef SUPPORT_TAGS
- init_tags();
+ init_tags(hostdata);
#endif
#if defined (REAL_DMA)
hostdata->dma_len = 0;
@@ -2569,7 +2573,7 @@ static void NCR5380_reselect(struct Scsi
* SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
*/
tag = TAG_NONE;
- if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
+ if (phase == PHASE_MSGIN && (hostdata->flags & FLAG_TAGGED_QUEUING)) {
/* Accept previous IDENTIFY message by clearing ACK */
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
len = 2;
@@ -3025,7 +3029,7 @@ static int NCR5380_bus_reset(struct scsi
hostdata->connected = NULL;
hostdata->disconnected_queue = NULL;
#ifdef SUPPORT_TAGS
- free_all_tags();
+ free_all_tags(hostdata);
#endif
for (i = 0; i < 8; ++i)
hostdata->busy[i] = 0;
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:56.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:26:00.000000000 +1100
@@ -891,10 +891,6 @@ static int __init atari_scsi_probe(struc
}
}
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 0;
-#endif
#ifdef REAL_DMA
/* If running on a Falcon and if there's TT-Ram (i.e., more than one
@@ -930,6 +926,10 @@ static int __init atari_scsi_probe(struc
host_flags |= IS_A_TT() ? 0 : FLAG_LATE_DMA_SETUP;
+#ifdef SUPPORT_TAGS
+ host_flags |= setup_use_tagged_queuing > 0 ? FLAG_TAGGED_QUEUING : 0;
+#endif
+
NCR5380_init(instance, host_flags);
if (IS_A_TT()) {
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:25:58.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:26:00.000000000 +1100
@@ -522,6 +522,7 @@ static int __init sun3_scsi_probe(struct
int error;
struct resource *irq, *mem;
unsigned char *ioaddr;
+ int host_flags = 0;
#ifdef SUN3_SCSI_VME
int i;
#endif
@@ -535,11 +536,6 @@ static int __init sun3_scsi_probe(struct
if (setup_hostid >= 0)
sun3_scsi_template.this_id = setup_hostid & 7;
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 1;
-#endif
-
#ifdef SUN3_SCSI_VME
ioaddr = NULL;
for (i = 0; i < 2; i++) {
@@ -601,7 +597,11 @@ static int __init sun3_scsi_probe(struct
instance->io_port = (unsigned long)ioaddr;
instance->irq = irq->start;
- NCR5380_init(instance, 0);
+#ifdef SUPPORT_TAGS
+ host_flags |= setup_use_tagged_queuing > 0 ? FLAG_TAGGED_QUEUING : 0;
+#endif
+
+ NCR5380_init(instance, host_flags);
error = request_irq(instance->irq, scsi_sun3_intr, 0,
"NCR5380", instance);
Index: linux/drivers/scsi/mac_scsi.c
===================================================================
--- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:44.000000000 +1100
+++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:26:00.000000000 +1100
@@ -411,10 +411,6 @@ static int __init mac_scsi_probe(struct
mac_scsi_template.sg_tablesize = setup_sg_tablesize;
if (setup_hostid >= 0)
mac_scsi_template.this_id = setup_hostid & 7;
-#ifdef SUPPORT_TAGS
- if (setup_use_tagged_queuing < 0)
- setup_use_tagged_queuing = 0;
-#endif
if (setup_use_pdma < 0)
setup_use_pdma = 0;
@@ -440,6 +436,10 @@ static int __init mac_scsi_probe(struct
mac_scsi_reset_boot(instance);
#endif
+#ifdef SUPPORT_TAGS
+ host_flags |= setup_use_tagged_queuing > 0 ? FLAG_TAGGED_QUEUING : 0;
+#endif
+
NCR5380_init(instance, host_flags);
if (instance->irq != NO_IRQ) {
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (32 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:41 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables " Finn Thain
` (2 subsequent siblings)
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-move-TagAlloc-array --]
[-- Type: text/plain, Size: 4754 bytes --]
The atari_NCR5380.c core driver keeps some per-host data in a static
variable which limits the driver to a single instance. Fix this by moving
TagAlloc to the hostdata struct.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.h | 12 ++++++++++++
drivers/scsi/atari_NCR5380.c | 27 +++++++++------------------
2 files changed, 21 insertions(+), 18 deletions(-)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:26:00.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:26:02.000000000 +1100
@@ -245,6 +245,15 @@
#define FLAG_TAGGED_QUEUING 64 /* as X3T9.2 spelled it */
#ifndef ASM
+
+#ifdef SUPPORT_TAGS
+struct tag_alloc {
+ DECLARE_BITMAP(allocated, MAX_TAGS);
+ int nr_allocated;
+ int queue_size;
+};
+#endif
+
struct NCR5380_hostdata {
NCR5380_implementation_fields; /* implementation specific */
struct Scsi_Host *host; /* Host backpointer */
@@ -274,6 +283,9 @@ struct NCR5380_hostdata {
int read_overruns; /* number of bytes to cut from a
* transfer to handle chip overruns */
int retain_dma_intr;
+#ifdef SUPPORT_TAGS
+ struct tag_alloc TagAlloc[8][8]; /* 8 targets and 8 LUNs */
+#endif
#ifdef PSEUDO_DMA
unsigned spin_max_r;
unsigned spin_max_w;
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:00.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:02.000000000 +1100
@@ -274,26 +274,17 @@ static struct scsi_host_template *the_te
* important: the tag bit must be cleared before 'nr_allocated' is decreased.
*/
-typedef struct {
- DECLARE_BITMAP(allocated, MAX_TAGS);
- int nr_allocated;
- int queue_size;
-} TAG_ALLOC;
-
-static TAG_ALLOC TagAlloc[8][8]; /* 8 targets and 8 LUNs */
-
-
static void __init init_tags(struct NCR5380_hostdata *hostdata)
{
int target, lun;
- TAG_ALLOC *ta;
+ struct tag_alloc *ta;
if (!(hostdata->flags & FLAG_TAGGED_QUEUING))
return;
for (target = 0; target < 8; ++target) {
for (lun = 0; lun < 8; ++lun) {
- ta = &TagAlloc[target][lun];
+ ta = &hostdata->TagAlloc[target][lun];
bitmap_zero(ta->allocated, MAX_TAGS);
ta->nr_allocated = 0;
/* At the beginning, assume the maximum queue size we could
@@ -324,8 +315,8 @@ static int is_lun_busy(struct scsi_cmnd
!(hostdata->flags & FLAG_TAGGED_QUEUING) ||
!cmd->device->tagged_supported)
return 0;
- if (TagAlloc[cmd->device->id][lun].nr_allocated >=
- TagAlloc[cmd->device->id][lun].queue_size) {
+ if (hostdata->TagAlloc[scmd_id(cmd)][lun].nr_allocated >=
+ hostdata->TagAlloc[scmd_id(cmd)][lun].queue_size) {
dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d: no free tags\n",
H_NO(cmd), cmd->device->id, lun);
return 1;
@@ -355,7 +346,7 @@ static void cmd_get_tag(struct scsi_cmnd
dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d now allocated by untagged "
"command\n", H_NO(cmd), cmd->device->id, lun);
} else {
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
+ struct tag_alloc *ta = &hostdata->TagAlloc[scmd_id(cmd)][lun];
cmd->tag = find_first_zero_bit(ta->allocated, MAX_TAGS);
set_bit(cmd->tag, ta->allocated);
@@ -385,7 +376,7 @@ static void cmd_free_tag(struct scsi_cmn
printk(KERN_NOTICE "scsi%d: trying to free bad tag %d!\n",
H_NO(cmd), cmd->tag);
} else {
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
+ struct tag_alloc *ta = &hostdata->TagAlloc[scmd_id(cmd)][lun];
clear_bit(cmd->tag, ta->allocated);
ta->nr_allocated--;
dprintk(NDEBUG_TAGS, "scsi%d: freed tag %d for target %d lun %d\n",
@@ -397,14 +388,14 @@ static void cmd_free_tag(struct scsi_cmn
static void free_all_tags(struct NCR5380_hostdata *hostdata)
{
int target, lun;
- TAG_ALLOC *ta;
+ struct tag_alloc *ta;
if (!(hostdata->flags & FLAG_TAGGED_QUEUING))
return;
for (target = 0; target < 8; ++target) {
for (lun = 0; lun < 8; ++lun) {
- ta = &TagAlloc[target][lun];
+ ta = &hostdata->TagAlloc[target][lun];
bitmap_zero(ta->allocated, MAX_TAGS);
ta->nr_allocated = 0;
}
@@ -2209,7 +2200,7 @@ static void NCR5380_information_transfer
*/
/* ++Andreas: the mid level code knows about
QUEUE_FULL now. */
- TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+ struct tag_alloc *ta = &hostdata->TagAlloc[scmd_id(cmd)][cmd->device->lun];
dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %llu returned "
"QUEUE_FULL after %d commands\n",
HOSTNO, cmd->device->id, cmd->device->lun,
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables to host data
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (33 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:42 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro Finn Thain
2014-11-02 5:28 ` [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Michael Schmitz
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-move-coroutine-variables --]
[-- Type: text/plain, Size: 7930 bytes --]
Unlike NCR5380.c, the atari_NCR5380.c core driver is limited to a single
instance because co-routine state is stored globally.
Fix this by removing the static scsi host pointer. For the co-routine,
obtain this pointer from the work_struct pointer instead. For the interrupt
handler, obtain it from the dev_id argument.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/NCR5380.h | 2 +
drivers/scsi/atari_NCR5380.c | 61 +++++++++++++++----------------------------
drivers/scsi/atari_scsi.c | 8 ++---
3 files changed, 28 insertions(+), 43 deletions(-)
Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:26:02.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:26:03.000000000 +1100
@@ -283,6 +283,8 @@ struct NCR5380_hostdata {
int read_overruns; /* number of bytes to cut from a
* transfer to handle chip overruns */
int retain_dma_intr;
+ struct work_struct main_task;
+ volatile int main_running;
#ifdef SUPPORT_TAGS
struct tag_alloc TagAlloc[8][8]; /* 8 targets and 8 LUNs */
#endif
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:02.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:03.000000000 +1100
@@ -221,9 +221,6 @@
* possible) function may be used.
*/
-static struct Scsi_Host *first_instance = NULL;
-static struct scsi_host_template *the_template = NULL;
-
/* Macros ease life... :-) */
#define SETUP_HOSTDATA(in) \
struct NCR5380_hostdata *hostdata = \
@@ -595,32 +592,19 @@ static void NCR5380_print_phase(struct S
#include <linux/workqueue.h>
#include <linux/interrupt.h>
-static volatile int main_running;
-static DECLARE_WORK(NCR5380_tqueue, NCR5380_main);
-
-static inline void queue_main(void)
+static inline void queue_main(struct NCR5380_hostdata *hostdata)
{
- if (!main_running) {
+ if (!hostdata->main_running) {
/* If in interrupt and NCR5380_main() not already running,
queue it on the 'immediate' task queue, to be processed
immediately after the current interrupt processing has
finished. */
- schedule_work(&NCR5380_tqueue);
+ schedule_work(&hostdata->main_task);
}
/* else: nothing to do: the running NCR5380_main() will pick up
any newly queued command. */
}
-
-static inline void NCR5380_all_init(void)
-{
- static int done = 0;
- if (!done) {
- dprintk(NDEBUG_INIT, "scsi : NCR5380_all_init()\n");
- done = 1;
- }
-}
-
/**
* NCR58380_info - report driver and host information
* @instance: relevant scsi host instance
@@ -703,7 +687,7 @@ static void NCR5380_print_status(struct
local_irq_save(flags);
printk("NCR5380: coroutine is%s running.\n",
- main_running ? "" : "n't");
+ hostdata->main_running ? "" : "n't");
if (!hostdata->connected)
printk("scsi%d: no currently connected command\n", HOSTNO);
else
@@ -746,7 +730,7 @@ static int __maybe_unused NCR5380_show_i
local_irq_save(flags);
seq_printf(m, "NCR5380: coroutine is%s running.\n",
- main_running ? "" : "n't");
+ hostdata->main_running ? "" : "n't");
if (!hostdata->connected)
seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
else
@@ -783,8 +767,7 @@ static int __init NCR5380_init(struct Sc
int i;
SETUP_HOSTDATA(instance);
- NCR5380_all_init();
-
+ hostdata->host = instance;
hostdata->aborted = 0;
hostdata->id_mask = 1 << instance->this_id;
hostdata->id_higher_mask = 0;
@@ -805,10 +788,7 @@ static int __init NCR5380_init(struct Sc
hostdata->disconnected_queue = NULL;
hostdata->flags = flags;
- if (!the_template) {
- the_template = instance->hostt;
- first_instance = instance;
- }
+ INIT_WORK(&hostdata->main_task, NCR5380_main);
prepare_info(instance);
@@ -829,7 +809,9 @@ static int __init NCR5380_init(struct Sc
static void NCR5380_exit(struct Scsi_Host *instance)
{
- cancel_work_sync(&NCR5380_tqueue);
+ struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+ cancel_work_sync(&hostdata->main_task);
}
/**
@@ -926,9 +908,9 @@ static int NCR5380_queue_command(struct
* unconditionally, because it cannot be already running.
*/
if (in_interrupt() || irqs_disabled())
- queue_main();
+ queue_main(hostdata);
else
- NCR5380_main(NULL);
+ NCR5380_main(&hostdata->main_task);
return 0;
}
@@ -957,9 +939,10 @@ static inline void maybe_release_dma_irq
static void NCR5380_main(struct work_struct *work)
{
+ struct NCR5380_hostdata *hostdata =
+ container_of(work, struct NCR5380_hostdata, main_task);
+ struct Scsi_Host *instance = hostdata->host;
struct scsi_cmnd *tmp, *prev;
- struct Scsi_Host *instance = first_instance;
- struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
int done;
unsigned long flags;
@@ -984,9 +967,9 @@ static void NCR5380_main(struct work_str
'main_running' is set here, and queues/executes main via the
task queue, it doesn't do any harm, just this instance of main
won't find any work left to do. */
- if (main_running)
+ if (hostdata->main_running)
return;
- main_running = 1;
+ hostdata->main_running = 1;
local_save_flags(flags);
do {
@@ -1105,7 +1088,7 @@ static void NCR5380_main(struct work_str
/* Better allow ints _after_ 'main_running' has been cleared, else
an interrupt could believe we'll pick up the work it left for
us, but we won't see it anymore here... */
- main_running = 0;
+ hostdata->main_running = 0;
local_irq_restore(flags);
}
@@ -1219,7 +1202,7 @@ static void NCR5380_dma_complete(struct
static irqreturn_t NCR5380_intr(int irq, void *dev_id)
{
- struct Scsi_Host *instance = first_instance;
+ struct Scsi_Host *instance = dev_id;
int done = 1, handled = 0;
unsigned char basr;
@@ -1291,7 +1274,7 @@ static irqreturn_t NCR5380_intr(int irq,
if (!done) {
dprintk(NDEBUG_INTR, "scsi%d: in int routine, calling main\n", HOSTNO);
/* Put a call to NCR5380_main() on the queue... */
- queue_main();
+ queue_main(shost_priv(instance));
}
return IRQ_RETVAL(handled);
}
@@ -1771,7 +1754,7 @@ static int NCR5380_transfer_pio(struct S
* Returns : 0 on success, -1 on failure.
*/
-static int do_abort(struct Scsi_Host *host)
+static int do_abort(struct Scsi_Host *instance)
{
unsigned char tmp, *msgptr, phase;
int len;
@@ -1806,7 +1789,7 @@ static int do_abort(struct Scsi_Host *ho
msgptr = &tmp;
len = 1;
phase = PHASE_MSGOUT;
- NCR5380_transfer_pio(host, &phase, &len, &msgptr);
+ NCR5380_transfer_pio(instance, &phase, &len, &msgptr);
/*
* If we got here, and the command completed successfully,
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:26:00.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:26:03.000000000 +1100
@@ -110,7 +110,7 @@
#define NCR5380_dma_xfer_len(instance, cmd, phase) \
atari_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
-#define NCR5380_acquire_dma_irq(instance) falcon_get_lock()
+#define NCR5380_acquire_dma_irq(instance) falcon_get_lock(instance)
#define NCR5380_release_dma_irq(instance) falcon_release_lock()
#include "NCR5380.h"
@@ -468,15 +468,15 @@ static void falcon_release_lock(void)
* command immediately but tell the SCSI mid-layer to defer.
*/
-static int falcon_get_lock(void)
+static int falcon_get_lock(struct Scsi_Host *instance)
{
if (IS_A_TT())
return 1;
if (in_interrupt()) {
- return stdma_try_lock(scsi_falcon_intr, NULL);
+ return stdma_try_lock(scsi_falcon_intr, instance);
} else {
- stdma_lock(scsi_falcon_intr, NULL);
+ stdma_lock(scsi_falcon_intr, instance);
return 1;
}
}
^ permalink raw reply [flat|nested] 100+ messages in thread
* [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (34 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables " Finn Thain
@ 2014-10-27 5:26 ` Finn Thain
2014-10-30 8:44 ` Hannes Reinecke
2014-11-02 5:28 ` [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Michael Schmitz
36 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-27 5:26 UTC (permalink / raw)
To: James E.J. Bottomley; +Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
[-- Attachment #1: atari_NCR5380-remove-RESET_RUN_DONE --]
[-- Type: text/plain, Size: 5163 bytes --]
There's no need to run the cmd->done callback for aborted commands. Remove
the old EH code and the RESET_RUN_DONE macro.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/scsi/atari_NCR5380.c | 88 -------------------------------------------
drivers/scsi/sun3_scsi.c | 1
2 files changed, 89 deletions(-)
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:03.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:26:04.000000000 +1100
@@ -2881,9 +2881,6 @@ static int NCR5380_bus_reset(struct scsi
struct NCR5380_hostdata *hostdata = shost_priv(instance);
int i;
unsigned long flags;
-#if defined(RESET_RUN_DONE)
- struct scsi_cmnd *connected, *disconnected_queue;
-#endif
NCR5380_print_status(instance);
@@ -2902,89 +2899,6 @@ static int NCR5380_bus_reset(struct scsi
* through anymore ... */
(void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
- /* MSch 20140115 - looking at the generic NCR5380 driver, all of this
- * should go.
- * Catch-22: if we don't clear all queues, the SCSI driver lock will
- * not be reset by atari_scsi_reset()!
- */
-
-#if defined(RESET_RUN_DONE)
- /* XXX Should now be done by midlevel code, but it's broken XXX */
- /* XXX see below XXX */
-
- /* MSch: old-style reset: actually abort all command processing here */
-
- /* After the reset, there are no more connected or disconnected commands
- * and no busy units; to avoid problems with re-inserting the commands
- * into the issue_queue (via scsi_done()), the aborted commands are
- * remembered in local variables first.
- */
- local_irq_save(flags);
- connected = (struct scsi_cmnd *)hostdata->connected;
- hostdata->connected = NULL;
- disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue;
- hostdata->disconnected_queue = NULL;
-#ifdef SUPPORT_TAGS
- free_all_tags();
-#endif
- for (i = 0; i < 8; ++i)
- hostdata->busy[i] = 0;
-#ifdef REAL_DMA
- hostdata->dma_len = 0;
-#endif
- local_irq_restore(flags);
-
- /* In order to tell the mid-level code which commands were aborted,
- * set the command status to DID_RESET and call scsi_done() !!!
- * This ultimately aborts processing of these commands in the mid-level.
- */
-
- if ((cmd = connected)) {
- dprintk(NDEBUG_ABORT, "scsi%d: reset aborted a connected command\n", H_NO(cmd));
- cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
- cmd->scsi_done(cmd);
- }
-
- for (i = 0; (cmd = disconnected_queue); ++i) {
- disconnected_queue = NEXT(cmd);
- SET_NEXT(cmd, NULL);
- cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
- cmd->scsi_done(cmd);
- }
- if (i > 0)
- dprintk(NDEBUG_ABORT, "scsi: reset aborted %d disconnected command(s)\n", i);
-
- /* The Falcon lock should be released after a reset...
- */
- /* ++guenther: moved to atari_scsi_reset(), to prevent a race between
- * unlocking and enabling dma interrupt.
- */
-/* falcon_release_lock_if_possible( hostdata );*/
-
- /* since all commands have been explicitly terminated, we need to tell
- * the midlevel code that the reset was SUCCESSFUL, and there is no
- * need to 'wake up' the commands by a request_sense
- */
- return SUCCESS;
-#else /* 1 */
-
- /* MSch: new-style reset handling: let the mid-level do what it can */
-
- /* ++guenther: MID-LEVEL IS STILL BROKEN.
- * Mid-level is supposed to requeue all commands that were active on the
- * various low-level queues. In fact it does this, but that's not enough
- * because all these commands are subject to timeout. And if a timeout
- * happens for any removed command, *_abort() is called but all queues
- * are now empty. Abort then gives up the falcon lock, which is fatal,
- * since the mid-level will queue more commands and must have the lock
- * (it's all happening inside timer interrupt handler!!).
- * Even worse, abort will return NOT_RUNNING for all those commands not
- * on any queue, so they won't be retried ...
- *
- * Conclusion: either scsi.c disables timeout for all resetted commands
- * immediately, or we lose! As of linux-2.0.20 it doesn't.
- */
-
/* After the reset, there are no more connected or disconnected commands
* and no busy units; so clear the low-level status here to avoid
* conflicts when the mid-level code tries to wake up the affected
@@ -3014,7 +2928,5 @@ static int NCR5380_bus_reset(struct scsi
maybe_release_dma_irq(instance);
local_irq_restore(flags);
- /* we did no complete reset of all commands, so a wakeup is required */
return SUCCESS;
-#endif /* 1 */
}
Index: linux/drivers/scsi/sun3_scsi.c
===================================================================
--- linux.orig/drivers/scsi/sun3_scsi.c 2014-10-27 16:26:00.000000000 +1100
+++ linux/drivers/scsi/sun3_scsi.c 2014-10-27 16:26:04.000000000 +1100
@@ -39,7 +39,6 @@
/* Definitions for the core NCR5380 driver. */
#define REAL_DMA
-#define RESET_RUN_DONE
/* #define SUPPORT_TAGS */
/* minimum number of bytes to do dma on */
#define DMA_MIN_SIZE 129
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 05/36] ncr5380: Remove useless prototypes
2014-10-27 5:26 ` [PATCH v2 05/36] ncr5380: Remove useless prototypes Finn Thain
@ 2014-10-29 14:41 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 14:41 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Add missing static qualifiers and remove the now pointless prototypes. The
> NCR5380_* prototypes are all declared in NCR5380.h and renamed using macros.
> Further declarations are redundant (some are completely unused). Remove
> them.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 06/36] ncr5380: Remove more useless prototypes
2014-10-27 5:26 ` [PATCH v2 06/36] ncr5380: Remove more " Finn Thain
@ 2014-10-29 14:44 ` Hannes Reinecke
2014-11-09 12:19 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 14:44 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Make use of the host template static initializer instead of assigning
> handlers at run-time. Move __maybe_unused qualifiers from declarations
> to definitions. Move the atari_scsi_bus_reset() wrapper after the
> definition of NCR5380_bus_reset(). All of the host template handler
> prototypes are now redundant so remove them.
>
> The write_info() handler is only relevant to drivers using PSEUDO_DMA so
> this patch fixes the compiler warning in atari_NCR5380.c and sun3_NCR5380.c:
>
> CC drivers/scsi/atari_scsi.o
> drivers/scsi/NCR5380.h:329: warning: 'NCR5380_write_info' declared 'static' but never defined
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> drivers/scsi/NCR5380.h | 8 ----
> drivers/scsi/atari_NCR5380.c | 3 +
> drivers/scsi/atari_scsi.c | 76 ++++++++++++++++++++-----------------------
> drivers/scsi/dtc.c | 7 +--
> drivers/scsi/pas16.c | 7 +--
> drivers/scsi/sun3_NCR5380.c | 3 +
> drivers/scsi/t128.c | 7 +--
> 7 files changed, 50 insertions(+), 61 deletions(-)
>
> Index: linux/drivers/scsi/NCR5380.h
> ===================================================================
> --- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:06.000000000 +1100
> +++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:14.000000000 +1100
> @@ -322,14 +322,6 @@ static irqreturn_t NCR5380_intr(int irq,
> #endif
> static void NCR5380_main(struct work_struct *work);
> static void __maybe_unused NCR5380_print_options(struct Scsi_Host *instance);
> -static int NCR5380_abort(Scsi_Cmnd * cmd);
> -static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
> -static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
> -static int __maybe_unused NCR5380_show_info(struct seq_file *,
> - struct Scsi_Host *);
> -static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
> - char *buffer, int length);
> -
> static void NCR5380_reselect(struct Scsi_Host *instance);
> static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag);
> #if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
> Index: linux/drivers/scsi/dtc.c
> ===================================================================
> --- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:08.000000000 +1100
> +++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:14.000000000 +1100
> @@ -219,10 +219,6 @@ static int __init dtc_detect(struct scsi
> void __iomem *base;
> int sig, count;
>
> - tpnt->proc_name = "dtc3x80";
> - tpnt->show_info = dtc_show_info;
> - tpnt->write_info = dtc_write_info;
> -
> for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
> addr = 0;
> base = NULL;
> @@ -477,6 +473,9 @@ static struct scsi_host_template driver_
> .name = "DTC 3180/3280 ",
> .detect = dtc_detect,
> .release = dtc_release,
> + .proc_name = "dtc3x80",
> + .show_info = dtc_show_info,
> + .write_info = dtc_write_info,
> .queuecommand = dtc_queue_command,
> .eh_abort_handler = dtc_abort,
> .eh_bus_reset_handler = dtc_bus_reset,
What is the current consensus on using '.proc_name' ?
At one point is was claimed to be deprecated, yet the only driver
actually following this seems to be lpfc.
(_And_ we have a patch in our tree to hook that back in).
Can't we just get it back for the time being and decide upon a
proper solution later?
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros
2014-10-27 5:26 ` [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros Finn Thain
@ 2014-10-29 14:45 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 14:45 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Both atari_NCR5380.c and sun3_NCR5380.c core drivers #undef TAG_NONE and
> then redefine it. But the original definition is unused because NCR5380.c
> lacks support for tagged queueing. So just define it once.
>
> The TAG_NEXT macro only appears in the arguments to NCR5380_select() calls.
> But that routine doesn't use its tag argument as the tag was already
> assigned in NCR5380_main(). So remove the unused argument and the macro.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro
2014-10-27 5:26 ` [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro Finn Thain
@ 2014-10-29 15:57 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 15:57 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Every NCR5380 driver sets AUTOSENSE so it need not be optional (and the
> mid-layer expects it). Remove this redundant macro to improve readability.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 09/36] ncr5380: Remove duplicate comments
2014-10-27 5:26 ` [PATCH v2 09/36] ncr5380: Remove duplicate comments Finn Thain
@ 2014-10-29 15:59 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 15:59 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The LIMIT_TRANSFERSIZE, PSEUDO_DMA, PARITY and UNSAFE options are all
> documented in the core drivers where they are used. The same goes for the
> chip databook reference. Remove the duplicate comments.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs
2014-10-27 5:26 ` [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs Finn Thain
@ 2014-10-29 16:07 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 16:07 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Oak scsi doesn't use any IRQ, but it sets irq = IRQ_NONE rather than
> SCSI_IRQ_NONE. Problem is, the core NCR5380 driver expects SCSI_IRQ_NONE
> if it is to issue IDENTIFY commands that prevent target disconnection.
> And, as Geert points out, IRQ_NONE is part of enum irqreturn.
>
> Other drivers, when they can't get an IRQ or can't use one, will set
> host->irq = SCSI_IRQ_NONE (that is, 255). But when they exit they will
> attempt to free IRQ 255 which was never requested.
>
> Fix these bugs by using NO_IRQ in place of SCSI_IRQ_NONE and IRQ_NONE.
> That means IRQ 0 is no longer probed by ISA drivers but I don't think
> this matters.
>
> Setting IRQ = 255 for these ISA drivers is understood to mean no IRQ.
> This remains supported so as to avoid breaking existing ISA setups (which
> can be difficult to get working) and because existing documentation
> (SANE, TLDP etc) describes this usage for the ISA NCR5380 driver options.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS
2014-10-27 5:26 ` [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS Finn Thain
@ 2014-10-29 16:11 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 16:11 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The NCR5380_STATS option is only enabled by g_NCR5380 yet it adds
> clutter to all three core drivers. The atari_NCR5380.c and sun3_NCR5380.c
> core drivers have a slightly different implementation of the
> NCR5380_STATS option.
>
> Out of all ten NCR5380 drivers, only one of them (g_NCR5380) actually
> has the code to report on the collected stats. Aside from being unreadable,
> that code seems to be broken because there's no initialization of timebase.
> sun3_NCR5380.c and atari_NCR5380.c have the timebase initialization but
> lack the code to report the stats.
>
> Remove all of this code to improve readability and reduce divergence
> between the three core drivers.
>
> This patch and the next one completely eliminate the PRINTP and ANDP
> pre-processor abuse.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 12/36] ncr5380: Cleanup host info() methods
2014-10-27 5:26 ` [PATCH v2 12/36] ncr5380: Cleanup host info() methods Finn Thain
@ 2014-10-29 16:17 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-29 16:17 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> If the host->info() method is not set, then host->name is used by default.
> For atari_scsi, that is exactly the same text. So remove the redundant
> info() method. Keep sun3_scsi.c in line with atari_scsi.
>
> Some NCR5380 drivers return an empty string from the info() method
> (arm/cumana_1.c arm/oak.c mac_scsi.c) while other drivers use the default
> (dmx3191d dtc.c g_NCR5380.c pas16.c t128.c).
>
> Implement a common info() method to replace a lot of duplicated code which
> the various drivers use to announce the same information.
>
> This replaces most of the (deprecated) show_info() output and all of the
> NCR5380_print_info() output. This also eliminates a bunch of code in
> g_NCR5380 which just duplicates functionality in the core driver.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data
2014-10-27 5:26 ` [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data Finn Thain
@ 2014-10-30 7:31 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:31 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Static variables from dtc.c and pas16.c should not appear in the core
> NCR5380.c driver. Aside from being a layering issue this worsens the
> divergence between the three core driver variants (atari_NCR5380.c and
> sun3_NCR5380.c don't support PSEUDO_DMA) and it can mean multiple hosts
> share the same counters.
>
> Fix this by making the pseudo DMA spin counters in the core more generic.
> This also avoids the abuse of the {DTC,PAS16}_PUBLIC_RELEASE macros, so
> they can be removed.
>
> oak.c doesn't use PDMA and hence it doesn't use the counters and hence it
> needs no write_info() method. Remove it.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros
2014-10-27 5:26 ` [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros Finn Thain
@ 2014-10-30 7:34 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:34 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Compile-time override of scsi host defaults is pointless for drivers that
> provide module parameters and __setup options for that. Too many macros make
> the code hard to read so remove them.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> drivers/scsi/atari_scsi.c | 2 +-
> drivers/scsi/atari_scsi.h | 3 ---
> drivers/scsi/mac_scsi.c | 19 +++++++++----------
> drivers/scsi/mac_scsi.h | 16 ----------------
> drivers/scsi/sun3_scsi.c | 20 ++++++++++----------
> drivers/scsi/sun3_scsi.h | 18 ------------------
> 6 files changed, 20 insertions(+), 58 deletions(-)
>
> Index: linux/drivers/scsi/mac_scsi.c
> ===================================================================
> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:26.000000000 +1100
> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:32.000000000 +1100
> @@ -177,13 +177,12 @@ int __init macscsi_detect(struct scsi_ho
> if (macintosh_config->scsi_type != MAC_SCSI_OLD)
> return( 0 );
>
> - /* setup variables */
> - tpnt->can_queue =
> - (setup_can_queue > 0) ? setup_can_queue : CAN_QUEUE;
> - tpnt->cmd_per_lun =
> - (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : CMD_PER_LUN;
> - tpnt->sg_tablesize =
> - (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_TABLESIZE;
> + if (setup_can_queue > 0)
> + tpnt->can_queue = setup_can_queue;
> + if (setup_cmd_per_lun > 0)
> + tpnt->cmd_per_lun = setup_cmd_per_lun;
> + if (setup_sg_tablesize >= 0)
> + tpnt->sg_tablesize = setup_sg_tablesize;
>
> if (setup_hostid >= 0)
> tpnt->this_id = setup_hostid;
Sigh. Blasted indentation.
Can I convince you to cleanup mac_scsi.c to conform to current
coding style after the cleanup is done?
The remainder is okay.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros
2014-10-27 5:26 ` [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros Finn Thain
@ 2014-10-30 7:36 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:36 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The *_RELEASE macros don't tell me anything. In some cases the version in
> the macro contradicts the version in the comments. Anyway, the Linux kernel
> version is sufficient information. Remove these macros to improve readability.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include
2014-10-27 5:26 ` [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include Finn Thain
@ 2014-10-30 7:37 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:37 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Russell King, linux-arm-kernel
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Convert Scsi_Cmnd to struct scsi_cmnd and drop the #include "scsi.h".
> The sun3_NCR5380.c core driver already uses struct scsi_cmnd so converting
> the other core drivers reduces the diff which makes them easier to unify.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Yippie! I was waiting for that to happen.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 17/36] dmx3191d: Use NO_IRQ
2014-10-27 5:26 ` [PATCH v2 17/36] dmx3191d: Use NO_IRQ Finn Thain
@ 2014-10-30 7:38 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:38 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Testing shows that the Domex 3191D card never asserts its IRQ. Hence it is
> non-functional with Linux (worse, the EH bugs in the core driver are fatal
> but that's a problem for another patch). Perhaps the DT-536 chip needs
> special setup? I can't find documentation for it. The NetBSD driver uses
> polling apparently because of this issue.
>
> Set host->irq = NO_IRQ so the core driver will prevent targets from
> disconnecting. Don't request host->irq.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 18/36] mac_scsi: Remove header
2014-10-27 5:26 ` [PATCH v2 18/36] mac_scsi: Remove header Finn Thain
@ 2014-10-30 7:39 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:39 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The #defines in mac_scsi.h are intended to influence subsequent #includes in
> mac_scsi.c. IMHO, that's too convoluted.
>
> Remove mac_scsi.h by moving those macro definitions to mac_scsi.c,
> consistent with other NCR5380 drivers.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-10-27 5:26 ` [PATCH v2 19/36] mac_scsi: Add module option to Kconfig Finn Thain
@ 2014-10-30 7:44 ` Hannes Reinecke
2014-10-31 7:17 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:44 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Allow mac_scsi to be built as a module. Replace the old validation of
> __setup options with code that validates both module and __setup options.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> drivers/scsi/Kconfig | 2
> drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
> 2 files changed, 38 insertions(+), 76 deletions(-)
>
> Index: linux/drivers/scsi/Kconfig
> ===================================================================
> --- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
> +++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
> @@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
> that leave the devices with SCSI operations partway completed.
>
> config MAC_SCSI
> - bool "Macintosh NCR5380 SCSI"
> + tristate "Macintosh NCR5380 SCSI"
> depends on MAC && SCSI=y
> select SCSI_SPI_ATTRS
> help
> Index: linux/drivers/scsi/mac_scsi.c
> ===================================================================
> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
> @@ -62,15 +62,18 @@
> static void mac_scsi_reset_boot(struct Scsi_Host *instance);
> #endif
>
> -static int setup_called = 0;
> static int setup_can_queue = -1;
> +module_param(setup_can_queue, int, 0);
> static int setup_cmd_per_lun = -1;
> +module_param(setup_cmd_per_lun, int, 0);
> static int setup_sg_tablesize = -1;
> +module_param(setup_sg_tablesize, int, 0);
> static int setup_use_pdma = -1;
> -#ifdef SUPPORT_TAGS
> +module_param(setup_use_pdma, int, 0);
> static int setup_use_tagged_queuing = -1;
> -#endif
> +module_param(setup_use_tagged_queuing, int, 0);
> static int setup_hostid = -1;
> +module_param(setup_hostid, int, 0);
>
> /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
> * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
> @@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
> out_8(instance->io_port + (reg<<4), value);
> }
>
> -/*
> - * Function : mac_scsi_setup(char *str)
> - *
> - * Purpose : booter command line initialization of the overrides array,
> - *
> - * Inputs : str - comma delimited list of options
> - *
> - */
> -
> -static int __init mac_scsi_setup(char *str) {
> +#ifndef MODULE
> +static int __init mac_scsi_setup(char *str)
> +{
> int ints[7];
> -
> - (void)get_options( str, ARRAY_SIZE(ints), ints);
> -
> - if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
> - printk(KERN_WARNING "scsi: <mac5380>"
> - " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
> - printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
> - return 0;
> - }
> -
> - if (ints[0] >= 1) {
> - if (ints[1] > 0)
> - /* no limits on this, just > 0 */
> - setup_can_queue = ints[1];
> - }
> - if (ints[0] >= 2) {
> - if (ints[2] > 0)
> - setup_cmd_per_lun = ints[2];
> - }
> - if (ints[0] >= 3) {
> - if (ints[3] >= 0) {
> - setup_sg_tablesize = ints[3];
> - /* Must be <= SG_ALL (255) */
> - if (setup_sg_tablesize > SG_ALL)
> - setup_sg_tablesize = SG_ALL;
> - }
> - }
> - if (ints[0] >= 4) {
> - /* Must be between 0 and 7 */
> - if (ints[4] >= 0 && ints[4] <= 7)
> - setup_hostid = ints[4];
> - else if (ints[4] > 7)
> - printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
> - }
> -#ifdef SUPPORT_TAGS
> - if (ints[0] >= 5) {
> - if (ints[5] >= 0)
> - setup_use_tagged_queuing = !!ints[5];
> +
> + (void)get_options(str, ARRAY_SIZE(ints), ints);
> +
> + if (ints[0] < 1 || ints[0] > 6) {
> + pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
> + return 0;
> }
> -
> - if (ints[0] == 6) {
> - if (ints[6] >= 0)
> + if (ints[0] >= 1)
> + setup_can_queue = ints[1];
> + if (ints[0] >= 2)
> + setup_cmd_per_lun = ints[2];
> + if (ints[0] >= 3)
> + setup_sg_tablesize = ints[3];
> + if (ints[0] >= 4)
> + setup_hostid = ints[4];
> + if (ints[0] >= 5)
> + setup_use_tagged_queuing = ints[5];
> + if (ints[0] >= 6)
> setup_use_pdma = ints[6];
> - }
> -#else
> - if (ints[0] == 5) {
> - if (ints[5] >= 0)
> - setup_use_pdma = ints[5];
> - }
> -#endif /* SUPPORT_TAGS */
> -
> return 1;
> }
>
> __setup("mac5380=", mac_scsi_setup);
> +#endif /* !MODULE */
>
> /*
> * Function : int macscsi_detect(struct scsi_host_template * tpnt)
> @@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
> tpnt->cmd_per_lun = setup_cmd_per_lun;
> if (setup_sg_tablesize >= 0)
> tpnt->sg_tablesize = setup_sg_tablesize;
> -
> - if (setup_hostid >= 0)
> - tpnt->this_id = setup_hostid;
> - else {
> - /* use 7 as default */
> - tpnt->this_id = 7;
> - }
> + if (setup_hostid >= 0)
> + tpnt->this_id = setup_hostid & 7;
>
> #ifdef SUPPORT_TAGS
> if (setup_use_tagged_queuing < 0)
> @@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
> return 0;
>
> if (macintosh_config->ident == MAC_MODEL_IIFX) {
> - mac_scsi_regp = via1+0x8000;
> - mac_scsi_drq = via1+0xE000;
> - mac_scsi_nodrq = via1+0xC000;
> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
> /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
> flags = FLAG_NO_PSEUDO_DMA;
> } else {
> - mac_scsi_regp = via1+0x10000;
> - mac_scsi_drq = via1+0x6000;
> - mac_scsi_nodrq = via1+0x12000;
> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
> }
>
> if (! setup_use_pdma)
Hmm. mac_via.h has this:
/*
* Base addresses for the VIAs. There are two in every machine,
* although on some machines the second is an RBV or an OSS.
* The OSS is different enough that it's handled separately.
*
* Do not use these values directly; use the via1 and via2 variables
* instead (and don't forget to check rbv_present when using via2!)
*/
#define VIA1_BASE (0x50F00000)
#define VIA2_BASE (0x50F02000)
#define RBV_BASE (0x50F26000)
So either that comment is obsolete or you should revert the above
bit ...
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 20/36] mac_scsi: Cleanup PDMA code
2014-10-27 5:26 ` [PATCH v2 20/36] mac_scsi: Cleanup PDMA code Finn Thain
@ 2014-10-30 7:46 ` Hannes Reinecke
2014-10-30 8:45 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:46 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Fix whitespace, remove pointless volatile qualifiers and improve code style
> by use of INPUT_DATA_REG and OUTPUT_DATA_REG macros.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> drivers/scsi/mac_scsi.c | 122 ++++++++++++++++++++++++------------------------
> 1 file changed, 62 insertions(+), 60 deletions(-)
>
> Index: linux/drivers/scsi/mac_scsi.c
> ===================================================================
> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:43.000000000 +1100
> @@ -86,9 +86,9 @@ module_param(setup_hostid, int, 0);
> #define AFTER_RESET_DELAY (HZ/2)
> #endif
>
> -static volatile unsigned char *mac_scsi_regp = NULL;
> -static volatile unsigned char *mac_scsi_drq = NULL;
> -static volatile unsigned char *mac_scsi_nodrq = NULL;
> +static unsigned char *mac_scsi_regp;
> +static unsigned char *mac_scsi_drq;
> +static unsigned char *mac_scsi_nodrq;
>
>
> /*
> @@ -262,6 +262,7 @@ static void mac_scsi_reset_boot(struct S
> }
> #endif
>
> +#ifdef PSEUDO_DMA
> /*
> Pseudo-DMA: (Ove Edlund)
> The code attempts to catch bus errors that occur if one for example
> @@ -331,38 +332,38 @@ __asm__ __volatile__ \
> : "0"(s), "1"(d), "2"(len) \
> : "d0")
>
> -
> -static int macscsi_pread (struct Scsi_Host *instance,
> - unsigned char *dst, int len)
> +static int macscsi_pread(struct Scsi_Host *instance,
> + unsigned char *dst, int len)
> {
> - unsigned char *d;
> - volatile unsigned char *s;
> + unsigned char *d;
> + unsigned char *s;
> +
> + NCR5380_local_declare();
> + NCR5380_setup(instance);
> +
> + s = mac_scsi_drq + (INPUT_DATA_REG << 4);
> + d = dst;
>
> - NCR5380_local_declare();
> - NCR5380_setup(instance);
> + /* These conditions are derived from MacOS */
>
> - s = mac_scsi_drq+0x60;
> - d = dst;
> + while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
> + !(NCR5380_read(STATUS_REG) & SR_REQ))
> + ;
> +
> + if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
> + (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
> + pr_err("Error in macscsi_pread\n");
> + return -1;
> + }
>
> -/* These conditions are derived from MacOS */
> -
> - while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
> - && !(NCR5380_read(STATUS_REG) & SR_REQ))
> - ;
> - if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
> - && (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
> - printk(KERN_ERR "Error in macscsi_pread\n");
> - return -1;
> - }
> -
> - CP_IO_TO_MEM(s, d, len);
> -
> - if (len != 0) {
> - printk(KERN_NOTICE "Bus error in macscsi_pread\n");
> - return -1;
> - }
> -
> - return 0;
> + CP_IO_TO_MEM(s, d, len);
> +
> + if (len != 0) {
> + pr_notice("Bus error in macscsi_pread\n");
> + return -1;
> + }
> +
> + return 0;
> }
>
>
> @@ -424,39 +425,40 @@ __asm__ __volatile__ \
> : "0"(s), "1"(d), "2"(len) \
> : "d0")
>
> -static int macscsi_pwrite (struct Scsi_Host *instance,
> - unsigned char *src, int len)
> +static int macscsi_pwrite(struct Scsi_Host *instance,
> + unsigned char *src, int len)
> {
> - unsigned char *s;
> - volatile unsigned char *d;
> + unsigned char *s;
> + unsigned char *d;
> +
> + NCR5380_local_declare();
> + NCR5380_setup(instance);
>
> - NCR5380_local_declare();
> - NCR5380_setup(instance);
> + s = src;
> + d = mac_scsi_drq + (OUTPUT_DATA_REG << 4);
>
> - s = src;
> - d = mac_scsi_drq;
> -
> -/* These conditions are derived from MacOS */
> -
> - while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
> - && (!(NCR5380_read(STATUS_REG) & SR_REQ)
> - || (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
> - ;
> - if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
> - printk(KERN_ERR "Error in macscsi_pwrite\n");
> - return -1;
> - }
> -
> - CP_MEM_TO_IO(s, d, len);
> -
> - if (len != 0) {
> - printk(KERN_NOTICE "Bus error in macscsi_pwrite\n");
> - return -1;
> - }
> -
> - return 0;
> -}
> + /* These conditions are derived from MacOS */
> +
> + while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
> + (!(NCR5380_read(STATUS_REG) & SR_REQ) ||
> + (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
> + ;
> +
> + if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
> + pr_err("Error in macscsi_pwrite\n");
> + return -1;
> + }
> +
> + CP_MEM_TO_IO(s, d, len);
>
> + if (len != 0) {
> + pr_notice("Bus error in macscsi_pwrite\n");
> + return -1;
> + }
> +
> + return 0;
> +}
> +#endif
>
> #include "NCR5380.c"
>
>
>
Any reason why you didn't re-indent macscsi_indent?
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 21/36] mac_scsi: Convert to platform device
2014-10-27 5:26 ` [PATCH v2 21/36] mac_scsi: Convert to platform device Finn Thain
@ 2014-10-30 7:55 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 7:55 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Convert mac_scsi to platform device and eliminate scsi_register().
>
> Platform resources for chip registers now follow the documentation. This
> should fix issues with the Mac IIci (and possibly other models too).
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon
2014-10-27 5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
@ 2014-10-30 8:07 ` Hannes Reinecke
2014-11-07 18:08 ` Michael Schmitz
1 sibling, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:07 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Don't disable irqs when waiting for the ST DMA "lock"; its release may
> require an interrupt.
>
> Introduce stdma_try_lock() for use in soft irq context. atari_scsi now tells
> the SCSI mid-layer to defer queueing a command if the ST DMA lock is not
> available, as per Michael's patch:
> http://marc.info/?l=linux-m68k&m=139095335824863&w=2
>
> The falcon_got_lock variable is race prone: we can't disable IRQs while
> waiting to acquire the lock, so after acquiring it there must be some
> interval during which falcon_got_lock remains false. Introduce
> stdma_is_locked_by() to replace falcon_got_lock.
>
> The falcon_got_lock tests in the EH handlers are incorrect these days. It
> can happen that an EH handler is called after a command completes normally.
> Remove these checks along with falcon_got_lock.
>
> Also remove the complicated and racy fairness wait queues. If fairness is an
> issue (when SCSI competes with IDE for the ST DMA interrupt), the solution
> is likely to be a lower value for host->can_queue.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 23/36] atari_scsi: Convert to platform device
2014-10-27 5:26 ` [PATCH v2 23/36] atari_scsi: Convert to platform device Finn Thain
@ 2014-10-30 8:17 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:17 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Convert atari_scsi to platform device and eliminate scsi_register().
>
> Validate __setup options later on so that module options are checked as well.
>
> Remove the comment about the scsi mid-layer disabling the host irq as it
> is no longer true (AFAICT). Also remove the obsolete slow interrupt stuff
> (IRQ_TYPE_SLOW == 0 anyway).
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 24/36] atari_scsi: Remove header
2014-10-27 5:26 ` [PATCH v2 24/36] atari_scsi: Remove header Finn Thain
@ 2014-10-30 8:18 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:18 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The #defines in atari_scsi.h are intended to influence subsequent #includes
> in atari_scsi.c. IMHO, that's too convoluted.
>
> Remove atari_scsi.h by moving those macro definitions to atari_scsi.c,
> consistent with other NCR5380 drivers.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 25/36] sun3_scsi: Convert to platform device
2014-10-27 5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
@ 2014-10-30 8:20 ` Hannes Reinecke
2014-11-09 10:25 ` Geert Uytterhoeven
1 sibling, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:20 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Convert sun3_scsi to platform device and eliminate scsi_register().
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 26/36] sun3_scsi: Move macro definitions
2014-10-27 5:26 ` [PATCH v2 26/36] sun3_scsi: Move macro definitions Finn Thain
@ 2014-10-30 8:20 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:20 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The #defines in sun3_scsi.h are intended to influence subsequent #includes
> in sun3_scsi.c. IMHO, that's too convoluted.
>
> Move sun3_scsi.h macro definitions to sun3_scsi.c, consistent with other
> NCR5380 drivers.
>
> Omit the unused NCR5380_local_declare() and NCR5380_setup() macros.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros
2014-10-27 5:26 ` [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros Finn Thain
@ 2014-10-30 8:21 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:21 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> atari_NCR5380.c enables its IRQ when it is already enabled. Sun3 doesn't
> use the ENABLE_IRQ/DISABLE_IRQ cruft. Remove it.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases
2014-10-27 5:26 ` [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases Finn Thain
@ 2014-10-30 8:23 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:23 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Make the atari_NCR5380.c core driver usable by sun3_scsi, mac_scsi and
> others by moving some of the Falcon-specific code out of the core driver:
> !IS_A_TT, atari_read_overruns and falcon_dont_release. Replace these with
> hostdata variables and flags. FLAG_CHECK_LAST_BYTE_SENT is unused in
> atari_NCR5380.c so don't set it.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking
2014-10-27 5:26 ` [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking Finn Thain
@ 2014-10-30 8:27 ` Hannes Reinecke
2014-10-31 7:20 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:27 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Simplify falcon_release_lock_if_possible() by making callers responsible for
> disabling local IRQ's, which they must do anyway to correctly synchronize
> the ST DMA "lock" with core driver data structures. Move this
> synchronization logic to the core driver with which it is tightly coupled.
>
> Other LLD's like sun3_scsi and mac_scsi that can make use of this core
> driver can just stub out the NCR5380_acquire_dma_irq() and
> NCR5380_release_dma_irq() calls so the compiler will eliminate the
> ST DMA code.
>
> Remove a redundant local_irq_save/restore pair (irq's are disabled for
> interrupt handlers these days). Revise the locking for
> atari_scsi_bus_reset(): use local_irq_save/restore() instead of
> atari_turnoff/turnon_irq(). There is no guarantee that atari_scsi still
> holds the ST DMA lock during EH, so atari_turnoff/turnon_irq() could
> end up dropping an IDE or floppy interrupt.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
> drivers/scsi/atari_NCR5380.c | 72 ++++++++++++++++++++++++++-----------------
> drivers/scsi/atari_scsi.c | 47 ++++++++++------------------
> 2 files changed, 62 insertions(+), 57 deletions(-)
>
> Index: linux/drivers/scsi/atari_NCR5380.c
> ===================================================================
> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
> @@ -926,7 +926,7 @@ static int NCR5380_queue_command(struct
> * alter queues and touch the lock.
> */
> /* perhaps stop command timer here */
> - if (!falcon_get_lock())
> + if (!NCR5380_acquire_dma_irq(instance))
> return SCSI_MLQUEUE_HOST_BUSY;
> /* perhaps restart command timer here */
>
> @@ -962,6 +962,18 @@ static int NCR5380_queue_command(struct
> return 0;
> }
>
> +static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
> +{
> + 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 &&
> + !hostdata->connected &&
> + !hostdata->retain_dma_intr)
> + NCR5380_release_dma_irq(instance);
> +}
> +
> /*
> * Function : NCR5380_main (void)
> *
> @@ -1084,9 +1096,11 @@ static void NCR5380_main(struct work_str
> cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
> #endif
> if (!NCR5380_select(instance, tmp)) {
> + local_irq_disable();
> hostdata->retain_dma_intr--;
> /* release if target did not response! */
> - falcon_release_lock_if_possible(hostdata);
> + maybe_release_dma_irq(instance);
> + local_irq_restore(flags);
> break;
> } else {
> local_irq_disable();
> @@ -2085,11 +2099,12 @@ static void NCR5380_information_transfer
> case COMMAND_COMPLETE:
> /* Accept message by clearing ACK */
> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> - /* ++guenther: possible race with Falcon locking */
> - hostdata->retain_dma_intr++;
> - hostdata->connected = NULL;
> dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
> "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
> +
> + local_irq_save(flags);
> + hostdata->retain_dma_intr++;
> + hostdata->connected = NULL;
> #ifdef SUPPORT_TAGS
> cmd_free_tag(cmd);
> if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
> @@ -2148,17 +2163,17 @@ static void NCR5380_information_transfer
>
> dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n", HOSTNO);
>
> - local_irq_save(flags);
> LIST(cmd,hostdata->issue_queue);
> SET_NEXT(cmd, hostdata->issue_queue);
> hostdata->issue_queue = (struct scsi_cmnd *) cmd;
> - local_irq_restore(flags);
> dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
> "issue queue\n", H_NO(cmd));
> } else {
> cmd->scsi_done(cmd);
> }
>
> + local_irq_restore(flags);
> +
> NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
> /*
> * Restore phase bits to 0 so an interrupted selection,
Probably a stupid question, but you're disabling local interrupts.
scsi_done() OTOH is triggering a soft irq. Does this work?
Shouldn't we enable interrupts before calling scsi_done() ?
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c
2014-10-27 5:26 ` [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c Finn Thain
@ 2014-10-30 8:33 ` Hannes Reinecke
2014-10-31 7:21 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:33 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> There is very little difference between the sun3_NCR5380.c core driver
> and atari_NCR5380.c. The former is a fork of the latter.
>
> Merge the sun3_NCR5380.c core driver into atari_NCR5380.c so that
> sun3_scsi.c can adopt the latter and the former can be deleted.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
> ---
>
> This patch brings some undesirable #ifdef's to atari_NCR5380. It's a small
> price to pay for the elimination of so much duplication. Eventually, with
> some testing, it should be possible to remove many of these.
>
> Elimination of the SUN3_SCSI_VME macro is necessary to reach the goal of a
> single platform driver to replace the {atari,mac,sun3,sun3_vme}_scsi modules.
>
> Elimination of the #ifdef CONFIG_SUN3 tests is not necessary. But some of
> these would go away if the sun3 driver followed the atari logic more
> closely, such as use of PIO vs DMA for certain phases and transfer sizes.
>
> After applying this patch it is easy to compare the new atari_NCR5380.c
> with sun3_NCR5380.c, to check that they are equivalent. E.g.
>
> $ cp drivers/scsi/{sun3,atari}_NCR5380.c /tmp
> $ sed -i -e 's/ *$//' /tmp/{sun3,atari}_NCR5380.c
> $ scripts/Lindent -l96 -hnl /tmp/{sun3,atari}_NCR5380.c
> $ meld /tmp/{sun3,atari}_NCR5380.c
>
> One can see that the two implementations of tagged command queueing have
> diverged since the fork. The atari version has been updated and the sun3
> implementation is unused as sun3_scsi.c does not define SUPPORT_TAGS.
>
> The remaining differences are merge_contiguous_buffers() and the falcon
> locking code. The falcon code disappears when suitable macro definitions are
> provided in sun3_scsi.c. merge_contiguous_buffers() could be a problem
> for sun3 (due to a DMA setup in an odd place) so it is #ifdef'd for sun3
> until the DMA setup discrepancies can be reconciled or moved out of
> the core driver.
>
> ---
> drivers/scsi/atari_NCR5380.c | 210 +++++++++++++++++++++++++++++++++++++++----
> drivers/scsi/atari_scsi.c | 1
> 2 files changed, 195 insertions(+), 16 deletions(-)
>
> Index: linux/drivers/scsi/atari_NCR5380.c
> ===================================================================
> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:56.000000000 +1100
> @@ -71,6 +71,9 @@
> * 1. Test linked command handling code after Eric is ready with
> * the high level code.
> */
> +
> +/* Adapted for the sun3 by Sam Creasey. */
> +
> #include <scsi/scsi_dbg.h>
> #include <scsi/scsi_transport_spi.h>
>
> @@ -458,6 +461,7 @@ static void free_all_tags(void)
>
> static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
> {
> +#if !defined(CONFIG_SUN3)
> unsigned long endaddr;
> #if (NDEBUG & NDEBUG_MERGING)
> unsigned long oldlen = cmd->SCp.this_residual;
> @@ -482,6 +486,7 @@ static void merge_contiguous_buffers(str
> dprintk(NDEBUG_MERGING, "merged %d buffers from %p, new length %08x\n",
> cnt, cmd->SCp.ptr, cmd->SCp.this_residual);
> #endif
> +#endif /* !defined(CONFIG_SUN3) */
> }
>
> /*
> @@ -1043,12 +1048,10 @@ static void NCR5380_main(struct work_str
> prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
> u8 lun = tmp->device->lun;
>
> -#if (NDEBUG & NDEBUG_LISTS)
> - if (prev != tmp)
> - printk("MAIN tmp=%p target=%d busy=%d lun=%llu\n",
> - tmp, tmp->device->id, hostdata->busy[tmp->device->id],
> - lun);
> -#endif
> + dprintk(NDEBUG_LISTS,
> + "MAIN tmp=%p target=%d busy=%d lun=%d\n",
> + tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],
> + lun);
> /* When we find one, remove it from the issue queue. */
> /* ++guenther: possible race with Falcon locking */
> if (
> @@ -1157,9 +1160,11 @@ static void NCR5380_main(struct work_str
> static void NCR5380_dma_complete(struct Scsi_Host *instance)
> {
> SETUP_HOSTDATA(instance);
> - int transfered, saved_data = 0, overrun = 0, cnt, toPIO;
> - unsigned char **data, p;
> + int transfered;
> + unsigned char **data;
> volatile int *count;
> + int saved_data = 0, overrun = 0;
> + unsigned char p;
>
> if (!hostdata->connected) {
> printk(KERN_WARNING "scsi%d: received end of DMA interrupt with "
nitpick: shouldn't that be 'transferred' ?
> @@ -1185,6 +1190,26 @@ static void NCR5380_dma_complete(struct
> HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
> NCR5380_read(STATUS_REG));
>
> +#if defined(CONFIG_SUN3)
> + if ((sun3scsi_dma_finish(rq_data_dir(hostdata->connected->request)))) {
> + pr_err("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n",
> + instance->host_no);
> + pr_err("please e-mail sammy@sammy.net with a description of how this error was produced.\n");
> + BUG();
> + }
> +
> + /* make sure we're not stuck in a data phase */
> + if ((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH | BASR_ACK)) ==
> + (BASR_PHASE_MATCH | BASR_ACK)) {
> + pr_err("scsi%d: BASR %02x\n", instance->host_no,
> + NCR5380_read(BUS_AND_STATUS_REG));
> + pr_err("scsi%d: bus stuck in data phase -- probably a single byte overrun!\n",
> + instance->host_no);
> + pr_err("not prepared for this error! please e-mail sammy@sammy.net with a description of how this error was produced.\n");
> + BUG();
> + }
> +#endif
> +
> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> NCR5380_write(MODE_REG, MR_BASE);
> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> @@ -1198,6 +1223,8 @@ static void NCR5380_dma_complete(struct
> *count -= transfered;
>
> if (hostdata->read_overruns) {
> + int cnt, toPIO;
> +
> if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) {
> cnt = toPIO = hostdata->read_overruns;
> if (overrun) {
> @@ -1277,11 +1304,14 @@ static irqreturn_t NCR5380_intr(int irq,
> {
> /* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */
> if (basr & BASR_PHASE_MATCH)
> - printk(KERN_NOTICE "scsi%d: unknown interrupt, "
> + dprintk(NDEBUG_INTR, "scsi%d: unknown interrupt, "
> "BASR 0x%x, MR 0x%x, SR 0x%x\n",
> HOSTNO, basr, NCR5380_read(MODE_REG),
> NCR5380_read(STATUS_REG));
> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_DMA_ENABLE;
> +#endif
> }
> } /* if !(SELECTION || PARITY) */
> handled = 1;
> @@ -1290,6 +1320,9 @@ static irqreturn_t NCR5380_intr(int irq,
> "BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr,
> NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_DMA_ENABLE;
> +#endif
> }
>
> if (!done) {
> @@ -1622,6 +1655,9 @@ static int NCR5380_select(struct Scsi_Ho
> #ifndef SUPPORT_TAGS
> hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
> #endif
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_INTR;
> +#endif
>
> initialize_SCp(cmd);
>
> @@ -1845,9 +1881,54 @@ static int NCR5380_transfer_dma(struct S
> SETUP_HOSTDATA(instance);
> register int c = *count;
> register unsigned char p = *phase;
> + unsigned long flags;
> +
> +#if defined(CONFIG_SUN3)
> + /* sanity check */
> + if (!sun3_dma_setup_done) {
> + pr_err("scsi%d: transfer_dma without setup!\n",
> + instance->host_no);
> + BUG();
> + }
> + hostdata->dma_len = c;
> +
> + dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
> + instance->host_no, (p & SR_IO) ? "reading" : "writing",
> + c, (p & SR_IO) ? "to" : "from", *data);
> +
> + /* netbsd turns off ints here, why not be safe and do it too */
> + local_irq_save(flags);
> +
> + /* send start chain */
> + sun3scsi_dma_start(c, *data);
> +
> + if (p & SR_IO) {
> + NCR5380_write(TARGET_COMMAND_REG, 1);
> + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> + NCR5380_write(INITIATOR_COMMAND_REG, 0);
> + NCR5380_write(MODE_REG,
> + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
> + NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
> + } else {
> + NCR5380_write(TARGET_COMMAND_REG, 0);
> + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_DATA);
> + NCR5380_write(MODE_REG,
> + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
> + NCR5380_write(START_DMA_SEND_REG, 0);
> + }
> +
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_DMA_ENABLE;
> +#endif
> +
> + local_irq_restore(flags);
> +
> + sun3_dma_active = 1;
> +
> +#else /* !defined(CONFIG_SUN3) */
> register unsigned char *d = *data;
> unsigned char tmp;
> - unsigned long flags;
>
> if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) {
> *phase = tmp;
> @@ -1895,6 +1976,8 @@ static int NCR5380_transfer_dma(struct S
> NCR5380_dma_write_setup(instance, d, c);
> local_irq_restore(flags);
> }
> +#endif /* !defined(CONFIG_SUN3) */
> +
> return 0;
> }
> #endif /* defined(REAL_DMA) */
> @@ -1930,6 +2013,10 @@ static void NCR5380_information_transfer
> unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
> struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
>
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_INTR;
> +#endif
> +
> while (1) {
> tmp = NCR5380_read(STATUS_REG);
> /* We only have a valid SCSI phase when REQ is asserted */
> @@ -1939,6 +2026,33 @@ static void NCR5380_information_transfer
> old_phase = phase;
> NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
> }
> +#if defined(CONFIG_SUN3)
> + if (phase == PHASE_CMDOUT) {
> +#if defined(REAL_DMA)
> + void *d;
> + unsigned long count;
> +
> + if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
> + count = cmd->SCp.buffer->length;
> + d = sg_virt(cmd->SCp.buffer);
> + } else {
> + count = cmd->SCp.this_residual;
> + d = cmd->SCp.ptr;
> + }
> + /* this command setup for dma yet? */
> + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != cmd)) {
> + if (cmd->request->cmd_type == REQ_TYPE_FS) {
> + sun3scsi_dma_setup(d, count,
> + rq_data_dir(cmd->request));
> + sun3_dma_setup_done = cmd;
> + }
> + }
> +#endif
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_INTR;
> +#endif
> + }
> +#endif /* CONFIG_SUN3 */
>
> if (sink && (phase != PHASE_MSGOUT)) {
> NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
> @@ -2000,8 +2114,11 @@ static void NCR5380_information_transfer
> */
>
> #if defined(REAL_DMA)
> - if (!cmd->device->borken &&
> - (transfersize = NCR5380_dma_xfer_len(instance,cmd,phase)) > 31) {
> + if (
> +#if !defined(CONFIG_SUN3)
> + !cmd->device->borken &&
> +#endif
> + (transfersize = NCR5380_dma_xfer_len(instance, cmd, phase)) >= DMA_MIN_SIZE) {
> len = transfersize;
> cmd->SCp.phase = phase;
> if (NCR5380_transfer_dma(instance, &phase,
> @@ -2038,6 +2155,11 @@ static void NCR5380_information_transfer
> NCR5380_transfer_pio(instance, &phase,
> (int *)&cmd->SCp.this_residual,
> (unsigned char **)&cmd->SCp.ptr);
> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> + /* if we had intended to dma that command clear it */
> + if (sun3_dma_setup_done == cmd)
> + sun3_dma_setup_done = NULL;
> +#endif
> break;
> case PHASE_MSGIN:
> len = 1;
> @@ -2243,6 +2365,9 @@ static void NCR5380_information_transfer
> /* Wait for bus free to avoid nasty timeouts */
> while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
> barrier();
> +#ifdef SUN3_SCSI_VME
> + dregs->csr |= CSR_DMA_ENABLE;
> +#endif
> return;
> /*
> * The SCSI data pointer is *IMPLICITLY* saved on a disconnect
> @@ -2402,17 +2527,20 @@ static void NCR5380_information_transfer
> */
>
>
> +/* it might eventually prove necessary to do a dma setup on
> + reselection, but it doesn't seem to be needed now -- sam */
> +
> static void NCR5380_reselect(struct Scsi_Host *instance)
> {
> SETUP_HOSTDATA(instance);
> unsigned char target_mask;
> - unsigned char lun, phase;
> - int len;
> + unsigned char lun;
> #ifdef SUPPORT_TAGS
> unsigned char tag;
> #endif
> unsigned char msg[3];
> - unsigned char *data;
> + int __maybe_unused len;
> + unsigned char __maybe_unused *data, __maybe_unused phase;
> struct scsi_cmnd *tmp = NULL, *prev;
>
> /*
> @@ -2449,10 +2577,18 @@ static void NCR5380_reselect(struct Scsi
> while (!(NCR5380_read(STATUS_REG) & SR_REQ))
> ;
>
> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> + /* acknowledge toggle to MSGIN */
> + NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(PHASE_MSGIN));
> +
> + /* peek at the byte without really hitting the bus */
> + msg[0] = NCR5380_read(CURRENT_SCSI_DATA_REG);
> +#else
> len = 1;
> data = msg;
> phase = PHASE_MSGIN;
> NCR5380_transfer_pio(instance, &phase, &len, &data);
> +#endif
>
> if (!(msg[0] & 0x80)) {
> printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
> @@ -2462,7 +2598,7 @@ static void NCR5380_reselect(struct Scsi
> }
> lun = (msg[0] & 0x07);
>
> -#ifdef SUPPORT_TAGS
> +#if defined(SUPPORT_TAGS) && !defined(CONFIG_SUN3)
> /* If the phase is still MSGIN, the target wants to send some more
> * messages. In case it supports tagged queuing, this is probably a
> * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
> @@ -2524,9 +2660,51 @@ static void NCR5380_reselect(struct Scsi
> return;
> }
>
> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> + /* engage dma setup for the command we just saw */
> + {
> + void *d;
> + unsigned long count;
> +
> + if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
> + count = tmp->SCp.buffer->length;
> + d = sg_virt(tmp->SCp.buffer);
> + } else {
> + count = tmp->SCp.this_residual;
> + d = tmp->SCp.ptr;
> + }
> + /* setup this command for dma if not already */
> + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != tmp)) {
> + sun3scsi_dma_setup(d, count, rq_data_dir(tmp->request));
> + sun3_dma_setup_done = tmp;
> + }
> + }
> +
> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
> +#endif
> +
> /* Accept message by clearing ACK */
> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
>
> +#if defined(SUPPORT_TAGS) && defined(CONFIG_SUN3)
> + /* If the phase is still MSGIN, the target wants to send some more
> + * messages. In case it supports tagged queuing, this is probably a
> + * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
> + */
> + tag = TAG_NONE;
> + if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
> + /* Accept previous IDENTIFY message by clearing ACK */
> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> + len = 2;
> + data = msg + 1;
> + if (!NCR5380_transfer_pio(instance, &phase, &len, &data) &&
> + msg[1] == SIMPLE_QUEUE_TAG)
> + tag = msg[2];
> + dprintk(NDEBUG_TAGS, "scsi%d: target mask %02x, lun %d sent tag %d at reselection\n"
> + HOSTNO, target_mask, lun, tag);
> + }
> +#endif
> +
> hostdata->connected = tmp;
> dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
> HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
> Index: linux/drivers/scsi/atari_scsi.c
> ===================================================================
> --- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:55.000000000 +1100
> +++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:56.000000000 +1100
> @@ -89,6 +89,7 @@
> #define REAL_DMA
> #define SUPPORT_TAGS
> #define MAX_TAGS 32
> +#define DMA_MIN_SIZE 32
>
> #define NCR5380_implementation_fields /* none */
>
>
>
You reference a certain Sam Creasey in the code (and there is even
his email in it). Has he contributed to this patch?
If so, shouldn't he be added somewhere in the patch description,
either with 'From;' (if the patch was originally by him)
or with a 'Signed-off-by' tag?
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c
2014-10-27 5:26 ` [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c Finn Thain
@ 2014-10-30 8:35 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:35 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Given the preceding changes to atari_NCR5380.c, this patch should not change
> behaviour of the sun3_scsi and sun3_scsi_vme modules.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
One down. Good work.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c
2014-10-27 5:26 ` [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c Finn Thain
@ 2014-10-30 8:37 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:37 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The NCR5380.c core driver has moved on since atari_NCR5380.c was forked.
> Some of those changes are also relevant to atari_NCR5380.c so apply them
> there as well.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING
2014-10-27 5:26 ` [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING Finn Thain
@ 2014-10-30 8:39 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:39 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The static variable setup_use_tagged_queuing is declared in mac_scsi.c,
> sun3_scsi.c and atari_scsi.c and doesn't belong in the core driver.
> None of the other NCR5380 drivers suffer from this layering issue which
> makes merging the core drivers more difficult and will likely hinder plans
> for future use of platform data to configure the driver.
>
> Replace the static variable with a host flag. This way it can be reported
> along with the other flags.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data
2014-10-27 5:26 ` [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data Finn Thain
@ 2014-10-30 8:41 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:41 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> The atari_NCR5380.c core driver keeps some per-host data in a static
> variable which limits the driver to a single instance. Fix this by moving
> TagAlloc to the hostdata struct.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Hmm. This really cries to be converted to the generic blk-tag code.
But it'll do for now.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables to host data
2014-10-27 5:26 ` [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables " Finn Thain
@ 2014-10-30 8:42 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:42 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> Unlike NCR5380.c, the atari_NCR5380.c core driver is limited to a single
> instance because co-routine state is stored globally.
>
> Fix this by removing the static scsi host pointer. For the co-routine,
> obtain this pointer from the work_struct pointer instead. For the interrupt
> handler, obtain it from the dev_id argument.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro
2014-10-27 5:26 ` [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro Finn Thain
@ 2014-10-30 8:44 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:44 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/27/2014 06:26 AM, Finn Thain wrote:
> There's no need to run the cmd->done callback for aborted commands. Remove
> the old EH code and the RESET_RUN_DONE macro.
>
> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 20/36] mac_scsi: Cleanup PDMA code
2014-10-30 7:46 ` Hannes Reinecke
@ 2014-10-30 8:45 ` Hannes Reinecke
2014-10-31 7:18 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-30 8:45 UTC (permalink / raw)
To: Finn Thain, James E.J. Bottomley
Cc: Michael Schmitz, Sam Creasey, linux-scsi, linux-m68k
On 10/30/2014 08:46 AM, Hannes Reinecke wrote:
> On 10/27/2014 06:26 AM, Finn Thain wrote:
>> Fix whitespace, remove pointless volatile qualifiers and improve code style
>> by use of INPUT_DATA_REG and OUTPUT_DATA_REG macros.
>>
>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>>
>> ---
>> drivers/scsi/mac_scsi.c | 122 ++++++++++++++++++++++++------------------------
>> 1 file changed, 62 insertions(+), 60 deletions(-)
>>
>> Index: linux/drivers/scsi/mac_scsi.c
>> ===================================================================
>> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
>> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:43.000000000 +1100
>> @@ -86,9 +86,9 @@ module_param(setup_hostid, int, 0);
>> #define AFTER_RESET_DELAY (HZ/2)
>> #endif
>>
>> -static volatile unsigned char *mac_scsi_regp = NULL;
>> -static volatile unsigned char *mac_scsi_drq = NULL;
>> -static volatile unsigned char *mac_scsi_nodrq = NULL;
>> +static unsigned char *mac_scsi_regp;
>> +static unsigned char *mac_scsi_drq;
>> +static unsigned char *mac_scsi_nodrq;
>>
>>
>> /*
>> @@ -262,6 +262,7 @@ static void mac_scsi_reset_boot(struct S
>> }
>> #endif
>>
>> +#ifdef PSEUDO_DMA
>> /*
>> Pseudo-DMA: (Ove Edlund)
>> The code attempts to catch bus errors that occur if one for example
>> @@ -331,38 +332,38 @@ __asm__ __volatile__ \
>> : "0"(s), "1"(d), "2"(len) \
>> : "d0")
>>
>> -
>> -static int macscsi_pread (struct Scsi_Host *instance,
>> - unsigned char *dst, int len)
>> +static int macscsi_pread(struct Scsi_Host *instance,
>> + unsigned char *dst, int len)
>> {
>> - unsigned char *d;
>> - volatile unsigned char *s;
>> + unsigned char *d;
>> + unsigned char *s;
>> +
>> + NCR5380_local_declare();
>> + NCR5380_setup(instance);
>> +
>> + s = mac_scsi_drq + (INPUT_DATA_REG << 4);
>> + d = dst;
>>
>> - NCR5380_local_declare();
>> - NCR5380_setup(instance);
>> + /* These conditions are derived from MacOS */
>>
>> - s = mac_scsi_drq+0x60;
>> - d = dst;
>> + while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
>> + !(NCR5380_read(STATUS_REG) & SR_REQ))
>> + ;
>> +
>> + if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
>> + (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
>> + pr_err("Error in macscsi_pread\n");
>> + return -1;
>> + }
>>
>> -/* These conditions are derived from MacOS */
>> -
>> - while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
>> - && !(NCR5380_read(STATUS_REG) & SR_REQ))
>> - ;
>> - if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
>> - && (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) {
>> - printk(KERN_ERR "Error in macscsi_pread\n");
>> - return -1;
>> - }
>> -
>> - CP_IO_TO_MEM(s, d, len);
>> -
>> - if (len != 0) {
>> - printk(KERN_NOTICE "Bus error in macscsi_pread\n");
>> - return -1;
>> - }
>> -
>> - return 0;
>> + CP_IO_TO_MEM(s, d, len);
>> +
>> + if (len != 0) {
>> + pr_notice("Bus error in macscsi_pread\n");
>> + return -1;
>> + }
>> +
>> + return 0;
>> }
>>
>>
>> @@ -424,39 +425,40 @@ __asm__ __volatile__ \
>> : "0"(s), "1"(d), "2"(len) \
>> : "d0")
>>
>> -static int macscsi_pwrite (struct Scsi_Host *instance,
>> - unsigned char *src, int len)
>> +static int macscsi_pwrite(struct Scsi_Host *instance,
>> + unsigned char *src, int len)
>> {
>> - unsigned char *s;
>> - volatile unsigned char *d;
>> + unsigned char *s;
>> + unsigned char *d;
>> +
>> + NCR5380_local_declare();
>> + NCR5380_setup(instance);
>>
>> - NCR5380_local_declare();
>> - NCR5380_setup(instance);
>> + s = src;
>> + d = mac_scsi_drq + (OUTPUT_DATA_REG << 4);
>>
>> - s = src;
>> - d = mac_scsi_drq;
>> -
>> -/* These conditions are derived from MacOS */
>> -
>> - while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)
>> - && (!(NCR5380_read(STATUS_REG) & SR_REQ)
>> - || (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
>> - ;
>> - if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
>> - printk(KERN_ERR "Error in macscsi_pwrite\n");
>> - return -1;
>> - }
>> -
>> - CP_MEM_TO_IO(s, d, len);
>> -
>> - if (len != 0) {
>> - printk(KERN_NOTICE "Bus error in macscsi_pwrite\n");
>> - return -1;
>> - }
>> -
>> - return 0;
>> -}
>> + /* These conditions are derived from MacOS */
>> +
>> + while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) &&
>> + (!(NCR5380_read(STATUS_REG) & SR_REQ) ||
>> + (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)))
>> + ;
>> +
>> + if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)) {
>> + pr_err("Error in macscsi_pwrite\n");
>> + return -1;
>> + }
>> +
>> + CP_MEM_TO_IO(s, d, len);
>>
>> + if (len != 0) {
>> + pr_notice("Bus error in macscsi_pwrite\n");
>> + return -1;
>> + }
>> +
>> + return 0;
>> +}
>> +#endif
>>
>> #include "NCR5380.c"
>>
>>
>>
> Any reason why you didn't re-indent macscsi_indent?
>
Ahh, forget it.
Addressed with the next patch.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-10-30 7:44 ` Hannes Reinecke
@ 2014-10-31 7:17 ` Finn Thain
2014-10-31 8:33 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-31 7:17 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On Thu, 30 Oct 2014, Hannes Reinecke wrote:
> On 10/27/2014 06:26 AM, Finn Thain wrote:
> > Allow mac_scsi to be built as a module. Replace the old validation of
> > __setup options with code that validates both module and __setup
> > options.
> >
> > Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> >
> > ---
> > drivers/scsi/Kconfig | 2
> > drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
> > 2 files changed, 38 insertions(+), 76 deletions(-)
> >
> > Index: linux/drivers/scsi/Kconfig
> > ===================================================================
> > --- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
> > +++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
> > @@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
> > that leave the devices with SCSI operations partway completed.
> >
> > config MAC_SCSI
> > - bool "Macintosh NCR5380 SCSI"
> > + tristate "Macintosh NCR5380 SCSI"
> > depends on MAC && SCSI=y
> > select SCSI_SPI_ATTRS
> > help
> > Index: linux/drivers/scsi/mac_scsi.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
> > +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
> > @@ -62,15 +62,18 @@
> > static void mac_scsi_reset_boot(struct Scsi_Host *instance);
> > #endif
> >
> > -static int setup_called = 0;
> > static int setup_can_queue = -1;
> > +module_param(setup_can_queue, int, 0);
> > static int setup_cmd_per_lun = -1;
> > +module_param(setup_cmd_per_lun, int, 0);
> > static int setup_sg_tablesize = -1;
> > +module_param(setup_sg_tablesize, int, 0);
> > static int setup_use_pdma = -1;
> > -#ifdef SUPPORT_TAGS
> > +module_param(setup_use_pdma, int, 0);
> > static int setup_use_tagged_queuing = -1;
> > -#endif
> > +module_param(setup_use_tagged_queuing, int, 0);
> > static int setup_hostid = -1;
> > +module_param(setup_hostid, int, 0);
> >
> > /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
> > * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
> > @@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
> > out_8(instance->io_port + (reg<<4), value);
> > }
> >
> > -/*
> > - * Function : mac_scsi_setup(char *str)
> > - *
> > - * Purpose : booter command line initialization of the overrides array,
> > - *
> > - * Inputs : str - comma delimited list of options
> > - *
> > - */
> > -
> > -static int __init mac_scsi_setup(char *str) {
> > +#ifndef MODULE
> > +static int __init mac_scsi_setup(char *str)
> > +{
> > int ints[7];
> > -
> > - (void)get_options( str, ARRAY_SIZE(ints), ints);
> > -
> > - if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
> > - printk(KERN_WARNING "scsi: <mac5380>"
> > - " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
> > - printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
> > - return 0;
> > - }
> > -
> > - if (ints[0] >= 1) {
> > - if (ints[1] > 0)
> > - /* no limits on this, just > 0 */
> > - setup_can_queue = ints[1];
> > - }
> > - if (ints[0] >= 2) {
> > - if (ints[2] > 0)
> > - setup_cmd_per_lun = ints[2];
> > - }
> > - if (ints[0] >= 3) {
> > - if (ints[3] >= 0) {
> > - setup_sg_tablesize = ints[3];
> > - /* Must be <= SG_ALL (255) */
> > - if (setup_sg_tablesize > SG_ALL)
> > - setup_sg_tablesize = SG_ALL;
> > - }
> > - }
> > - if (ints[0] >= 4) {
> > - /* Must be between 0 and 7 */
> > - if (ints[4] >= 0 && ints[4] <= 7)
> > - setup_hostid = ints[4];
> > - else if (ints[4] > 7)
> > - printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
> > - }
> > -#ifdef SUPPORT_TAGS
> > - if (ints[0] >= 5) {
> > - if (ints[5] >= 0)
> > - setup_use_tagged_queuing = !!ints[5];
> > +
> > + (void)get_options(str, ARRAY_SIZE(ints), ints);
> > +
> > + if (ints[0] < 1 || ints[0] > 6) {
> > + pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
> > + return 0;
> > }
> > -
> > - if (ints[0] == 6) {
> > - if (ints[6] >= 0)
> > + if (ints[0] >= 1)
> > + setup_can_queue = ints[1];
> > + if (ints[0] >= 2)
> > + setup_cmd_per_lun = ints[2];
> > + if (ints[0] >= 3)
> > + setup_sg_tablesize = ints[3];
> > + if (ints[0] >= 4)
> > + setup_hostid = ints[4];
> > + if (ints[0] >= 5)
> > + setup_use_tagged_queuing = ints[5];
> > + if (ints[0] >= 6)
> > setup_use_pdma = ints[6];
> > - }
> > -#else
> > - if (ints[0] == 5) {
> > - if (ints[5] >= 0)
> > - setup_use_pdma = ints[5];
> > - }
> > -#endif /* SUPPORT_TAGS */
> > -
> > return 1;
> > }
> >
> > __setup("mac5380=", mac_scsi_setup);
> > +#endif /* !MODULE */
> >
> > /*
> > * Function : int macscsi_detect(struct scsi_host_template * tpnt)
> > @@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
> > tpnt->cmd_per_lun = setup_cmd_per_lun;
> > if (setup_sg_tablesize >= 0)
> > tpnt->sg_tablesize = setup_sg_tablesize;
> > -
> > - if (setup_hostid >= 0)
> > - tpnt->this_id = setup_hostid;
> > - else {
> > - /* use 7 as default */
> > - tpnt->this_id = 7;
> > - }
> > + if (setup_hostid >= 0)
> > + tpnt->this_id = setup_hostid & 7;
> >
> > #ifdef SUPPORT_TAGS
> > if (setup_use_tagged_queuing < 0)
> > @@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
> > return 0;
> >
> > if (macintosh_config->ident == MAC_MODEL_IIFX) {
> > - mac_scsi_regp = via1+0x8000;
> > - mac_scsi_drq = via1+0xE000;
> > - mac_scsi_nodrq = via1+0xC000;
> > + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
> > + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
> > + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
> > /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
> > flags = FLAG_NO_PSEUDO_DMA;
> > } else {
> > - mac_scsi_regp = via1+0x10000;
> > - mac_scsi_drq = via1+0x6000;
> > - mac_scsi_nodrq = via1+0x12000;
> > + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
> > + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
> > + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
> > }
> >
> > if (! setup_use_pdma)
> Hmm. mac_via.h has this:
>
> /*
> * Base addresses for the VIAs. There are two in every machine,
> * although on some machines the second is an RBV or an OSS.
> * The OSS is different enough that it's handled separately.
> *
> * Do not use these values directly; use the via1 and via2 variables
> * instead (and don't forget to check rbv_present when using via2!)
> */
>
> #define VIA1_BASE (0x50F00000)
> #define VIA2_BASE (0x50F02000)
> #define RBV_BASE (0x50F26000)
>
> So either that comment is obsolete or you should revert the above
> bit ...
Use of via1 had to be changed because that symbol is not exported.
The comment you quoted is probably not wrong; it relates to programming
the VIA chip itself (see ADB drivers for example). But in this driver we
aren't interested in the VIA1 chip so I'd say niether via1 or VIA1_BASE is
good style. Hence my use of bare addresses in the platform resource
initializers in patch 21.
This example of VIA1_BASE + offset disappears in patch 21 (you can find an
unrelated example in arch/m68k/mac/config.c but that was not my doing).
This patch is not meant to change the actual addresses used by mac_scsi;
it just makes the driver modular. Use of VIA1_BASE seemed like a good way
to express the fact that the addresses are not changed yet (some models
use new addresses after patch 21).
Basically, I just wanted a modular driver for debugging and bisection and
I wanted it early in the patch series. A modular mac_scsi.c aligns better
with atari_scsi.c and sun3_scsi.c as they are already modular. That means
that the three subsequent patches which convert {atari,mac,sun3}_scsi.c to
platform drivers also align nicely (so I could cross check them).
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 20/36] mac_scsi: Cleanup PDMA code
2014-10-30 8:45 ` Hannes Reinecke
@ 2014-10-31 7:18 ` Finn Thain
2014-10-31 8:34 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-31 7:18 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On Thu, 30 Oct 2014, Hannes Reinecke wrote:
> On 10/30/2014 08:46 AM, Hannes Reinecke wrote:
> > Any reason why you didn't re-indent [...]
> Ahh, forget it.
>
> Addressed with the next patch.
>
So, does it get your reviewed-by tag? (Thanks for reviewing all this,
BTW.)
You also questioned mac_scsi.c whitespace in your review of, "[PATCH v2
14/36] ncr5380: Remove pointless compiler command line override macros."
By the end of this patch series, I thought that mac_scsi.c was in pretty
good shape (?)
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking
2014-10-30 8:27 ` Hannes Reinecke
@ 2014-10-31 7:20 ` Finn Thain
2014-11-09 12:18 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-31 7:20 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On Thu, 30 Oct 2014, Hannes Reinecke wrote:
> On 10/27/2014 06:26 AM, Finn Thain wrote:
> > Simplify falcon_release_lock_if_possible() by making callers
> > responsible for disabling local IRQ's, which they must do anyway to
> > correctly synchronize the ST DMA "lock" with core driver data
> > structures. Move this synchronization logic to the core driver with
> > which it is tightly coupled.
> >
> > Other LLD's like sun3_scsi and mac_scsi that can make use of this core
> > driver can just stub out the NCR5380_acquire_dma_irq() and
> > NCR5380_release_dma_irq() calls so the compiler will eliminate the ST
> > DMA code.
> >
> > Remove a redundant local_irq_save/restore pair (irq's are disabled for
> > interrupt handlers these days). Revise the locking for
> > atari_scsi_bus_reset(): use local_irq_save/restore() instead of
> > atari_turnoff/turnon_irq(). There is no guarantee that atari_scsi
> > still holds the ST DMA lock during EH, so atari_turnoff/turnon_irq()
> > could end up dropping an IDE or floppy interrupt.
> >
> > Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> >
> > ---
> > drivers/scsi/atari_NCR5380.c | 72 ++++++++++++++++++++++++++-----------------
> > drivers/scsi/atari_scsi.c | 47 ++++++++++------------------
> > 2 files changed, 62 insertions(+), 57 deletions(-)
> >
> > Index: linux/drivers/scsi/atari_NCR5380.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
> > +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
> > @@ -926,7 +926,7 @@ static int NCR5380_queue_command(struct
> > * alter queues and touch the lock.
> > */
> > /* perhaps stop command timer here */
> > - if (!falcon_get_lock())
> > + if (!NCR5380_acquire_dma_irq(instance))
> > return SCSI_MLQUEUE_HOST_BUSY;
> > /* perhaps restart command timer here */
> >
> > @@ -962,6 +962,18 @@ static int NCR5380_queue_command(struct
> > return 0;
> > }
> >
> > +static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
> > +{
> > + 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 &&
> > + !hostdata->connected &&
> > + !hostdata->retain_dma_intr)
> > + NCR5380_release_dma_irq(instance);
> > +}
> > +
> > /*
> > * Function : NCR5380_main (void)
> > *
> > @@ -1084,9 +1096,11 @@ static void NCR5380_main(struct work_str
> > cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
> > #endif
> > if (!NCR5380_select(instance, tmp)) {
> > + local_irq_disable();
> > hostdata->retain_dma_intr--;
> > /* release if target did not response! */
> > - falcon_release_lock_if_possible(hostdata);
> > + maybe_release_dma_irq(instance);
> > + local_irq_restore(flags);
> > break;
> > } else {
> > local_irq_disable();
> > @@ -2085,11 +2099,12 @@ static void NCR5380_information_transfer
> > case COMMAND_COMPLETE:
> > /* Accept message by clearing ACK */
> > NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> > - /* ++guenther: possible race with Falcon locking */
> > - hostdata->retain_dma_intr++;
> > - hostdata->connected = NULL;
> > dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
> > "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
> > +
> > + local_irq_save(flags);
> > + hostdata->retain_dma_intr++;
> > + hostdata->connected = NULL;
> > #ifdef SUPPORT_TAGS
> > cmd_free_tag(cmd);
> > if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
> > @@ -2148,17 +2163,17 @@ static void NCR5380_information_transfer
> >
> > dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n", HOSTNO);
> >
> > - local_irq_save(flags);
> > LIST(cmd,hostdata->issue_queue);
> > SET_NEXT(cmd, hostdata->issue_queue);
> > hostdata->issue_queue = (struct scsi_cmnd *) cmd;
> > - local_irq_restore(flags);
> > dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
> > "issue queue\n", H_NO(cmd));
> > } else {
> > cmd->scsi_done(cmd);
> > }
> >
> > + local_irq_restore(flags);
> > +
> > NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
> > /*
> > * Restore phase bits to 0 so an interrupted selection,
> Probably a stupid question, but you're disabling local interrupts.
> scsi_done() OTOH is triggering a soft irq.
Isn't that how all bottom halves work?
> Does this work?
Yes, I've tested that particular code. I'm pretty sure Michael has too.
A quick search turned up another example of this in
zfcp_fsf_fcp_cmnd_handler().
> Shouldn't we enable interrupts before calling scsi_done() ?
I don't see anything in the scsi_done() implementation in scsi_lib.c that
would be problematic. The description says "This function is interrupt
context safe". The same would have to apply to scsi_eh_done().
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c
2014-10-30 8:33 ` Hannes Reinecke
@ 2014-10-31 7:21 ` Finn Thain
2014-10-31 8:40 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-10-31 7:21 UTC (permalink / raw)
To: Hannes Reinecke, Sam Creasey
Cc: James E.J. Bottomley, Michael Schmitz, linux-scsi, linux-m68k
On Thu, 30 Oct 2014, Hannes Reinecke wrote:
> On 10/27/2014 06:26 AM, Finn Thain wrote:
> > There is very little difference between the sun3_NCR5380.c core driver
> > and atari_NCR5380.c. The former is a fork of the latter.
> >
> > Merge the sun3_NCR5380.c core driver into atari_NCR5380.c so that
> > sun3_scsi.c can adopt the latter and the former can be deleted.
> >
> > Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> >
> > ---
> >
> > This patch brings some undesirable #ifdef's to atari_NCR5380. It's a
> > small price to pay for the elimination of so much duplication.
> > Eventually, with some testing, it should be possible to remove many of
> > these.
> >
> > Elimination of the SUN3_SCSI_VME macro is necessary to reach the goal
> > of a single platform driver to replace the
> > {atari,mac,sun3,sun3_vme}_scsi modules.
> >
> > Elimination of the #ifdef CONFIG_SUN3 tests is not necessary. But some
> > of these would go away if the sun3 driver followed the atari logic
> > more closely, such as use of PIO vs DMA for certain phases and
> > transfer sizes.
> >
> > After applying this patch it is easy to compare the new
> > atari_NCR5380.c with sun3_NCR5380.c, to check that they are
> > equivalent. E.g.
> >
> > $ cp drivers/scsi/{sun3,atari}_NCR5380.c /tmp
> > $ sed -i -e 's/ *$//' /tmp/{sun3,atari}_NCR5380.c
> > $ scripts/Lindent -l96 -hnl /tmp/{sun3,atari}_NCR5380.c
> > $ meld /tmp/{sun3,atari}_NCR5380.c
> >
> > One can see that the two implementations of tagged command queueing
> > have diverged since the fork. The atari version has been updated and
> > the sun3 implementation is unused as sun3_scsi.c does not define
> > SUPPORT_TAGS.
> >
> > The remaining differences are merge_contiguous_buffers() and the
> > falcon locking code. The falcon code disappears when suitable macro
> > definitions are provided in sun3_scsi.c. merge_contiguous_buffers()
> > could be a problem for sun3 (due to a DMA setup in an odd place) so it
> > is #ifdef'd for sun3 until the DMA setup discrepancies can be
> > reconciled or moved out of the core driver.
> >
> > ---
> > drivers/scsi/atari_NCR5380.c | 210 +++++++++++++++++++++++++++++++++++++++----
> > drivers/scsi/atari_scsi.c | 1
> > 2 files changed, 195 insertions(+), 16 deletions(-)
> >
> > Index: linux/drivers/scsi/atari_NCR5380.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
> > +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:56.000000000 +1100
> > @@ -71,6 +71,9 @@
> > * 1. Test linked command handling code after Eric is ready with
> > * the high level code.
> > */
> > +
> > +/* Adapted for the sun3 by Sam Creasey. */
> > +
> > #include <scsi/scsi_dbg.h>
> > #include <scsi/scsi_transport_spi.h>
> >
> > @@ -458,6 +461,7 @@ static void free_all_tags(void)
> >
> > static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
> > {
> > +#if !defined(CONFIG_SUN3)
> > unsigned long endaddr;
> > #if (NDEBUG & NDEBUG_MERGING)
> > unsigned long oldlen = cmd->SCp.this_residual;
> > @@ -482,6 +486,7 @@ static void merge_contiguous_buffers(str
> > dprintk(NDEBUG_MERGING, "merged %d buffers from %p, new length %08x\n",
> > cnt, cmd->SCp.ptr, cmd->SCp.this_residual);
> > #endif
> > +#endif /* !defined(CONFIG_SUN3) */
> > }
> >
> > /*
> > @@ -1043,12 +1048,10 @@ static void NCR5380_main(struct work_str
> > prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
> > u8 lun = tmp->device->lun;
> >
> > -#if (NDEBUG & NDEBUG_LISTS)
> > - if (prev != tmp)
> > - printk("MAIN tmp=%p target=%d busy=%d lun=%llu\n",
> > - tmp, tmp->device->id, hostdata->busy[tmp->device->id],
> > - lun);
> > -#endif
> > + dprintk(NDEBUG_LISTS,
> > + "MAIN tmp=%p target=%d busy=%d lun=%d\n",
> > + tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],
> > + lun);
> > /* When we find one, remove it from the issue queue. */
> > /* ++guenther: possible race with Falcon locking */
> > if (
> > @@ -1157,9 +1160,11 @@ static void NCR5380_main(struct work_str
> > static void NCR5380_dma_complete(struct Scsi_Host *instance)
> > {
> > SETUP_HOSTDATA(instance);
> > - int transfered, saved_data = 0, overrun = 0, cnt, toPIO;
> > - unsigned char **data, p;
> > + int transfered;
> > + unsigned char **data;
> > volatile int *count;
> > + int saved_data = 0, overrun = 0;
> > + unsigned char p;
> >
> > if (!hostdata->connected) {
> > printk(KERN_WARNING "scsi%d: received end of DMA interrupt with "
>
> nitpick: shouldn't that be 'transferred' ?
The intention of this patch was to merge two files into one file, in such
a way that the result could be easily compared with the originals.
With that in mind, fixing this typo could be done pre-merger by patching
both files, or post-merger by patching just one.
If this patch series ends up iterating again as v3, I'll add a new patch
to the end to fix this (long standing) typo.
If there's no need for a re-spin, I'll send a separate patch with Cc to
trivial@kernel.org.
>
> > @@ -1185,6 +1190,26 @@ static void NCR5380_dma_complete(struct
> > HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
> > NCR5380_read(STATUS_REG));
> >
> > +#if defined(CONFIG_SUN3)
> > + if ((sun3scsi_dma_finish(rq_data_dir(hostdata->connected->request)))) {
> > + pr_err("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n",
> > + instance->host_no);
> > + pr_err("please e-mail sammy@sammy.net with a description of how this error was produced.\n");
> > + BUG();
> > + }
> > +
> > + /* make sure we're not stuck in a data phase */
> > + if ((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH | BASR_ACK)) ==
> > + (BASR_PHASE_MATCH | BASR_ACK)) {
> > + pr_err("scsi%d: BASR %02x\n", instance->host_no,
> > + NCR5380_read(BUS_AND_STATUS_REG));
> > + pr_err("scsi%d: bus stuck in data phase -- probably a single byte overrun!\n",
> > + instance->host_no);
> > + pr_err("not prepared for this error! please e-mail sammy@sammy.net with a description of how this error was produced.\n");
> > + BUG();
> > + }
> > +#endif
> > +
> > (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> > NCR5380_write(MODE_REG, MR_BASE);
> > NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> > @@ -1198,6 +1223,8 @@ static void NCR5380_dma_complete(struct
> > *count -= transfered;
> >
> > if (hostdata->read_overruns) {
> > + int cnt, toPIO;
> > +
> > if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) {
> > cnt = toPIO = hostdata->read_overruns;
> > if (overrun) {
> > @@ -1277,11 +1304,14 @@ static irqreturn_t NCR5380_intr(int irq,
> > {
> > /* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */
> > if (basr & BASR_PHASE_MATCH)
> > - printk(KERN_NOTICE "scsi%d: unknown interrupt, "
> > + dprintk(NDEBUG_INTR, "scsi%d: unknown interrupt, "
> > "BASR 0x%x, MR 0x%x, SR 0x%x\n",
> > HOSTNO, basr, NCR5380_read(MODE_REG),
> > NCR5380_read(STATUS_REG));
> > (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_DMA_ENABLE;
> > +#endif
> > }
> > } /* if !(SELECTION || PARITY) */
> > handled = 1;
> > @@ -1290,6 +1320,9 @@ static irqreturn_t NCR5380_intr(int irq,
> > "BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr,
> > NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
> > (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_DMA_ENABLE;
> > +#endif
> > }
> >
> > if (!done) {
> > @@ -1622,6 +1655,9 @@ static int NCR5380_select(struct Scsi_Ho
> > #ifndef SUPPORT_TAGS
> > hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
> > #endif
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_INTR;
> > +#endif
> >
> > initialize_SCp(cmd);
> >
> > @@ -1845,9 +1881,54 @@ static int NCR5380_transfer_dma(struct S
> > SETUP_HOSTDATA(instance);
> > register int c = *count;
> > register unsigned char p = *phase;
> > + unsigned long flags;
> > +
> > +#if defined(CONFIG_SUN3)
> > + /* sanity check */
> > + if (!sun3_dma_setup_done) {
> > + pr_err("scsi%d: transfer_dma without setup!\n",
> > + instance->host_no);
> > + BUG();
> > + }
> > + hostdata->dma_len = c;
> > +
> > + dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
> > + instance->host_no, (p & SR_IO) ? "reading" : "writing",
> > + c, (p & SR_IO) ? "to" : "from", *data);
> > +
> > + /* netbsd turns off ints here, why not be safe and do it too */
> > + local_irq_save(flags);
> > +
> > + /* send start chain */
> > + sun3scsi_dma_start(c, *data);
> > +
> > + if (p & SR_IO) {
> > + NCR5380_write(TARGET_COMMAND_REG, 1);
> > + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> > + NCR5380_write(INITIATOR_COMMAND_REG, 0);
> > + NCR5380_write(MODE_REG,
> > + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
> > + NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
> > + } else {
> > + NCR5380_write(TARGET_COMMAND_REG, 0);
> > + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
> > + NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_DATA);
> > + NCR5380_write(MODE_REG,
> > + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
> > + NCR5380_write(START_DMA_SEND_REG, 0);
> > + }
> > +
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_DMA_ENABLE;
> > +#endif
> > +
> > + local_irq_restore(flags);
> > +
> > + sun3_dma_active = 1;
> > +
> > +#else /* !defined(CONFIG_SUN3) */
> > register unsigned char *d = *data;
> > unsigned char tmp;
> > - unsigned long flags;
> >
> > if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) {
> > *phase = tmp;
> > @@ -1895,6 +1976,8 @@ static int NCR5380_transfer_dma(struct S
> > NCR5380_dma_write_setup(instance, d, c);
> > local_irq_restore(flags);
> > }
> > +#endif /* !defined(CONFIG_SUN3) */
> > +
> > return 0;
> > }
> > #endif /* defined(REAL_DMA) */
> > @@ -1930,6 +2013,10 @@ static void NCR5380_information_transfer
> > unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
> > struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
> >
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_INTR;
> > +#endif
> > +
> > while (1) {
> > tmp = NCR5380_read(STATUS_REG);
> > /* We only have a valid SCSI phase when REQ is asserted */
> > @@ -1939,6 +2026,33 @@ static void NCR5380_information_transfer
> > old_phase = phase;
> > NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
> > }
> > +#if defined(CONFIG_SUN3)
> > + if (phase == PHASE_CMDOUT) {
> > +#if defined(REAL_DMA)
> > + void *d;
> > + unsigned long count;
> > +
> > + if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
> > + count = cmd->SCp.buffer->length;
> > + d = sg_virt(cmd->SCp.buffer);
> > + } else {
> > + count = cmd->SCp.this_residual;
> > + d = cmd->SCp.ptr;
> > + }
> > + /* this command setup for dma yet? */
> > + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != cmd)) {
> > + if (cmd->request->cmd_type == REQ_TYPE_FS) {
> > + sun3scsi_dma_setup(d, count,
> > + rq_data_dir(cmd->request));
> > + sun3_dma_setup_done = cmd;
> > + }
> > + }
> > +#endif
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_INTR;
> > +#endif
> > + }
> > +#endif /* CONFIG_SUN3 */
> >
> > if (sink && (phase != PHASE_MSGOUT)) {
> > NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
> > @@ -2000,8 +2114,11 @@ static void NCR5380_information_transfer
> > */
> >
> > #if defined(REAL_DMA)
> > - if (!cmd->device->borken &&
> > - (transfersize = NCR5380_dma_xfer_len(instance,cmd,phase)) > 31) {
> > + if (
> > +#if !defined(CONFIG_SUN3)
> > + !cmd->device->borken &&
> > +#endif
> > + (transfersize = NCR5380_dma_xfer_len(instance, cmd, phase)) >= DMA_MIN_SIZE) {
> > len = transfersize;
> > cmd->SCp.phase = phase;
> > if (NCR5380_transfer_dma(instance, &phase,
> > @@ -2038,6 +2155,11 @@ static void NCR5380_information_transfer
> > NCR5380_transfer_pio(instance, &phase,
> > (int *)&cmd->SCp.this_residual,
> > (unsigned char **)&cmd->SCp.ptr);
> > +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> > + /* if we had intended to dma that command clear it */
> > + if (sun3_dma_setup_done == cmd)
> > + sun3_dma_setup_done = NULL;
> > +#endif
> > break;
> > case PHASE_MSGIN:
> > len = 1;
> > @@ -2243,6 +2365,9 @@ static void NCR5380_information_transfer
> > /* Wait for bus free to avoid nasty timeouts */
> > while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
> > barrier();
> > +#ifdef SUN3_SCSI_VME
> > + dregs->csr |= CSR_DMA_ENABLE;
> > +#endif
> > return;
> > /*
> > * The SCSI data pointer is *IMPLICITLY* saved on a disconnect
> > @@ -2402,17 +2527,20 @@ static void NCR5380_information_transfer
> > */
> >
> >
> > +/* it might eventually prove necessary to do a dma setup on
> > + reselection, but it doesn't seem to be needed now -- sam */
> > +
> > static void NCR5380_reselect(struct Scsi_Host *instance)
> > {
> > SETUP_HOSTDATA(instance);
> > unsigned char target_mask;
> > - unsigned char lun, phase;
> > - int len;
> > + unsigned char lun;
> > #ifdef SUPPORT_TAGS
> > unsigned char tag;
> > #endif
> > unsigned char msg[3];
> > - unsigned char *data;
> > + int __maybe_unused len;
> > + unsigned char __maybe_unused *data, __maybe_unused phase;
> > struct scsi_cmnd *tmp = NULL, *prev;
> >
> > /*
> > @@ -2449,10 +2577,18 @@ static void NCR5380_reselect(struct Scsi
> > while (!(NCR5380_read(STATUS_REG) & SR_REQ))
> > ;
> >
> > +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> > + /* acknowledge toggle to MSGIN */
> > + NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(PHASE_MSGIN));
> > +
> > + /* peek at the byte without really hitting the bus */
> > + msg[0] = NCR5380_read(CURRENT_SCSI_DATA_REG);
> > +#else
> > len = 1;
> > data = msg;
> > phase = PHASE_MSGIN;
> > NCR5380_transfer_pio(instance, &phase, &len, &data);
> > +#endif
> >
> > if (!(msg[0] & 0x80)) {
> > printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
> > @@ -2462,7 +2598,7 @@ static void NCR5380_reselect(struct Scsi
> > }
> > lun = (msg[0] & 0x07);
> >
> > -#ifdef SUPPORT_TAGS
> > +#if defined(SUPPORT_TAGS) && !defined(CONFIG_SUN3)
> > /* If the phase is still MSGIN, the target wants to send some more
> > * messages. In case it supports tagged queuing, this is probably a
> > * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
> > @@ -2524,9 +2660,51 @@ static void NCR5380_reselect(struct Scsi
> > return;
> > }
> >
> > +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
> > + /* engage dma setup for the command we just saw */
> > + {
> > + void *d;
> > + unsigned long count;
> > +
> > + if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
> > + count = tmp->SCp.buffer->length;
> > + d = sg_virt(tmp->SCp.buffer);
> > + } else {
> > + count = tmp->SCp.this_residual;
> > + d = tmp->SCp.ptr;
> > + }
> > + /* setup this command for dma if not already */
> > + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != tmp)) {
> > + sun3scsi_dma_setup(d, count, rq_data_dir(tmp->request));
> > + sun3_dma_setup_done = tmp;
> > + }
> > + }
> > +
> > + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
> > +#endif
> > +
> > /* Accept message by clearing ACK */
> > NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> >
> > +#if defined(SUPPORT_TAGS) && defined(CONFIG_SUN3)
> > + /* If the phase is still MSGIN, the target wants to send some more
> > + * messages. In case it supports tagged queuing, this is probably a
> > + * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
> > + */
> > + tag = TAG_NONE;
> > + if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
> > + /* Accept previous IDENTIFY message by clearing ACK */
> > + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> > + len = 2;
> > + data = msg + 1;
> > + if (!NCR5380_transfer_pio(instance, &phase, &len, &data) &&
> > + msg[1] == SIMPLE_QUEUE_TAG)
> > + tag = msg[2];
> > + dprintk(NDEBUG_TAGS, "scsi%d: target mask %02x, lun %d sent tag %d at reselection\n"
> > + HOSTNO, target_mask, lun, tag);
> > + }
> > +#endif
> > +
> > hostdata->connected = tmp;
> > dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
> > HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
> > Index: linux/drivers/scsi/atari_scsi.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:55.000000000 +1100
> > +++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:56.000000000 +1100
> > @@ -89,6 +89,7 @@
> > #define REAL_DMA
> > #define SUPPORT_TAGS
> > #define MAX_TAGS 32
> > +#define DMA_MIN_SIZE 32
> >
> > #define NCR5380_implementation_fields /* none */
> >
> >
> >
> You reference a certain Sam Creasey in the code (and there is even
> his email in it). Has he contributed to this patch?
No, the patch is my work.
As I understand it, sun3_NCR5380.c was originally Sam's (derived) work.
> If so, shouldn't he be added somewhere in the patch description,
> either with 'From;' (if the patch was originally by him)
> or with a 'Signed-off-by' tag?
I did Cc these patches to Sam, for comment/testing; perhaps a Cc tag might
have been appropriate but I gather they are optional.
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-10-31 7:17 ` Finn Thain
@ 2014-10-31 8:33 ` Hannes Reinecke
2014-11-09 12:17 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-31 8:33 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On 10/31/2014 08:17 AM, Finn Thain wrote:
>
> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>
>> On 10/27/2014 06:26 AM, Finn Thain wrote:
>>> Allow mac_scsi to be built as a module. Replace the old validation of
>>> __setup options with code that validates both module and __setup
>>> options.
>>>
>>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>>>
>>> ---
>>> drivers/scsi/Kconfig | 2
>>> drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
>>> 2 files changed, 38 insertions(+), 76 deletions(-)
>>>
>>> Index: linux/drivers/scsi/Kconfig
>>> ===================================================================
>>> --- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
>>> +++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
>>> @@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
>>> that leave the devices with SCSI operations partway completed.
>>>
>>> config MAC_SCSI
>>> - bool "Macintosh NCR5380 SCSI"
>>> + tristate "Macintosh NCR5380 SCSI"
>>> depends on MAC && SCSI=y
>>> select SCSI_SPI_ATTRS
>>> help
>>> Index: linux/drivers/scsi/mac_scsi.c
>>> ===================================================================
>>> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
>>> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
>>> @@ -62,15 +62,18 @@
>>> static void mac_scsi_reset_boot(struct Scsi_Host *instance);
>>> #endif
>>>
>>> -static int setup_called = 0;
>>> static int setup_can_queue = -1;
>>> +module_param(setup_can_queue, int, 0);
>>> static int setup_cmd_per_lun = -1;
>>> +module_param(setup_cmd_per_lun, int, 0);
>>> static int setup_sg_tablesize = -1;
>>> +module_param(setup_sg_tablesize, int, 0);
>>> static int setup_use_pdma = -1;
>>> -#ifdef SUPPORT_TAGS
>>> +module_param(setup_use_pdma, int, 0);
>>> static int setup_use_tagged_queuing = -1;
>>> -#endif
>>> +module_param(setup_use_tagged_queuing, int, 0);
>>> static int setup_hostid = -1;
>>> +module_param(setup_hostid, int, 0);
>>>
>>> /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
>>> * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
>>> @@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
>>> out_8(instance->io_port + (reg<<4), value);
>>> }
>>>
>>> -/*
>>> - * Function : mac_scsi_setup(char *str)
>>> - *
>>> - * Purpose : booter command line initialization of the overrides array,
>>> - *
>>> - * Inputs : str - comma delimited list of options
>>> - *
>>> - */
>>> -
>>> -static int __init mac_scsi_setup(char *str) {
>>> +#ifndef MODULE
>>> +static int __init mac_scsi_setup(char *str)
>>> +{
>>> int ints[7];
>>> -
>>> - (void)get_options( str, ARRAY_SIZE(ints), ints);
>>> -
>>> - if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
>>> - printk(KERN_WARNING "scsi: <mac5380>"
>>> - " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
>>> - printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
>>> - return 0;
>>> - }
>>> -
>>> - if (ints[0] >= 1) {
>>> - if (ints[1] > 0)
>>> - /* no limits on this, just > 0 */
>>> - setup_can_queue = ints[1];
>>> - }
>>> - if (ints[0] >= 2) {
>>> - if (ints[2] > 0)
>>> - setup_cmd_per_lun = ints[2];
>>> - }
>>> - if (ints[0] >= 3) {
>>> - if (ints[3] >= 0) {
>>> - setup_sg_tablesize = ints[3];
>>> - /* Must be <= SG_ALL (255) */
>>> - if (setup_sg_tablesize > SG_ALL)
>>> - setup_sg_tablesize = SG_ALL;
>>> - }
>>> - }
>>> - if (ints[0] >= 4) {
>>> - /* Must be between 0 and 7 */
>>> - if (ints[4] >= 0 && ints[4] <= 7)
>>> - setup_hostid = ints[4];
>>> - else if (ints[4] > 7)
>>> - printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
>>> - }
>>> -#ifdef SUPPORT_TAGS
>>> - if (ints[0] >= 5) {
>>> - if (ints[5] >= 0)
>>> - setup_use_tagged_queuing = !!ints[5];
>>> +
>>> + (void)get_options(str, ARRAY_SIZE(ints), ints);
>>> +
>>> + if (ints[0] < 1 || ints[0] > 6) {
>>> + pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
>>> + return 0;
>>> }
>>> -
>>> - if (ints[0] == 6) {
>>> - if (ints[6] >= 0)
>>> + if (ints[0] >= 1)
>>> + setup_can_queue = ints[1];
>>> + if (ints[0] >= 2)
>>> + setup_cmd_per_lun = ints[2];
>>> + if (ints[0] >= 3)
>>> + setup_sg_tablesize = ints[3];
>>> + if (ints[0] >= 4)
>>> + setup_hostid = ints[4];
>>> + if (ints[0] >= 5)
>>> + setup_use_tagged_queuing = ints[5];
>>> + if (ints[0] >= 6)
>>> setup_use_pdma = ints[6];
>>> - }
>>> -#else
>>> - if (ints[0] == 5) {
>>> - if (ints[5] >= 0)
>>> - setup_use_pdma = ints[5];
>>> - }
>>> -#endif /* SUPPORT_TAGS */
>>> -
>>> return 1;
>>> }
>>>
>>> __setup("mac5380=", mac_scsi_setup);
>>> +#endif /* !MODULE */
>>>
>>> /*
>>> * Function : int macscsi_detect(struct scsi_host_template * tpnt)
>>> @@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
>>> tpnt->cmd_per_lun = setup_cmd_per_lun;
>>> if (setup_sg_tablesize >= 0)
>>> tpnt->sg_tablesize = setup_sg_tablesize;
>>> -
>>> - if (setup_hostid >= 0)
>>> - tpnt->this_id = setup_hostid;
>>> - else {
>>> - /* use 7 as default */
>>> - tpnt->this_id = 7;
>>> - }
>>> + if (setup_hostid >= 0)
>>> + tpnt->this_id = setup_hostid & 7;
>>>
>>> #ifdef SUPPORT_TAGS
>>> if (setup_use_tagged_queuing < 0)
>>> @@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
>>> return 0;
>>>
>>> if (macintosh_config->ident == MAC_MODEL_IIFX) {
>>> - mac_scsi_regp = via1+0x8000;
>>> - mac_scsi_drq = via1+0xE000;
>>> - mac_scsi_nodrq = via1+0xC000;
>>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
>>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
>>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
>>> /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
>>> flags = FLAG_NO_PSEUDO_DMA;
>>> } else {
>>> - mac_scsi_regp = via1+0x10000;
>>> - mac_scsi_drq = via1+0x6000;
>>> - mac_scsi_nodrq = via1+0x12000;
>>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
>>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
>>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
>>> }
>>>
>>> if (! setup_use_pdma)
>> Hmm. mac_via.h has this:
>>
>> /*
>> * Base addresses for the VIAs. There are two in every machine,
>> * although on some machines the second is an RBV or an OSS.
>> * The OSS is different enough that it's handled separately.
>> *
>> * Do not use these values directly; use the via1 and via2 variables
>> * instead (and don't forget to check rbv_present when using via2!)
>> */
>>
>> #define VIA1_BASE (0x50F00000)
>> #define VIA2_BASE (0x50F02000)
>> #define RBV_BASE (0x50F26000)
>>
>> So either that comment is obsolete or you should revert the above
>> bit ...
>
> Use of via1 had to be changed because that symbol is not exported.
>
> The comment you quoted is probably not wrong; it relates to programming
> the VIA chip itself (see ADB drivers for example). But in this driver we
> aren't interested in the VIA1 chip so I'd say niether via1 or VIA1_BASE is
> good style. Hence my use of bare addresses in the platform resource
> initializers in patch 21.
>
> This example of VIA1_BASE + offset disappears in patch 21 (you can find an
> unrelated example in arch/m68k/mac/config.c but that was not my doing).
>
> This patch is not meant to change the actual addresses used by mac_scsi;
> it just makes the driver modular. Use of VIA1_BASE seemed like a good way
> to express the fact that the addresses are not changed yet (some models
> use new addresses after patch 21).
>
> Basically, I just wanted a modular driver for debugging and bisection and
> I wanted it early in the patch series. A modular mac_scsi.c aligns better
> with atari_scsi.c and sun3_scsi.c as they are already modular. That means
> that the three subsequent patches which convert {atari,mac,sun3}_scsi.c to
> platform drivers also align nicely (so I could cross check them).
>
Fair enough.
Just needed some clarification here. My Mac experience ceased with a
IIcx :-)
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 20/36] mac_scsi: Cleanup PDMA code
2014-10-31 7:18 ` Finn Thain
@ 2014-10-31 8:34 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-31 8:34 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On 10/31/2014 08:18 AM, Finn Thain wrote:
>
> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>
>> On 10/30/2014 08:46 AM, Hannes Reinecke wrote:
>>> Any reason why you didn't re-indent [...]
>> Ahh, forget it.
>>
>> Addressed with the next patch.
>>
>
> So, does it get your reviewed-by tag? (Thanks for reviewing all this,
> BTW.)
>
Yes. You can add the reviewed-by tag to this.
> You also questioned mac_scsi.c whitespace in your review of, "[PATCH v2
> 14/36] ncr5380: Remove pointless compiler command line override macros."
> By the end of this patch series, I thought that mac_scsi.c was in pretty
> good shape (?)
>
I only later figured that you've fixed up mac_scsi.c eventually.
So that's all in good shape.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c
2014-10-31 7:21 ` Finn Thain
@ 2014-10-31 8:40 ` Hannes Reinecke
2014-10-31 12:48 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Hannes Reinecke @ 2014-10-31 8:40 UTC (permalink / raw)
To: Finn Thain, Sam Creasey
Cc: James E.J. Bottomley, Michael Schmitz, linux-scsi, linux-m68k
On 10/31/2014 08:21 AM, Finn Thain wrote:
>
> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>
>> On 10/27/2014 06:26 AM, Finn Thain wrote:
>>> There is very little difference between the sun3_NCR5380.c core driver
>>> and atari_NCR5380.c. The former is a fork of the latter.
>>>
>>> Merge the sun3_NCR5380.c core driver into atari_NCR5380.c so that
>>> sun3_scsi.c can adopt the latter and the former can be deleted.
>>>
>>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>>>
>>> ---
>>>
>>> This patch brings some undesirable #ifdef's to atari_NCR5380. It's a
>>> small price to pay for the elimination of so much duplication.
>>> Eventually, with some testing, it should be possible to remove many of
>>> these.
>>>
>>> Elimination of the SUN3_SCSI_VME macro is necessary to reach the goal
>>> of a single platform driver to replace the
>>> {atari,mac,sun3,sun3_vme}_scsi modules.
>>>
>>> Elimination of the #ifdef CONFIG_SUN3 tests is not necessary. But some
>>> of these would go away if the sun3 driver followed the atari logic
>>> more closely, such as use of PIO vs DMA for certain phases and
>>> transfer sizes.
>>>
>>> After applying this patch it is easy to compare the new
>>> atari_NCR5380.c with sun3_NCR5380.c, to check that they are
>>> equivalent. E.g.
>>>
>>> $ cp drivers/scsi/{sun3,atari}_NCR5380.c /tmp
>>> $ sed -i -e 's/ *$//' /tmp/{sun3,atari}_NCR5380.c
>>> $ scripts/Lindent -l96 -hnl /tmp/{sun3,atari}_NCR5380.c
>>> $ meld /tmp/{sun3,atari}_NCR5380.c
>>>
>>> One can see that the two implementations of tagged command queueing
>>> have diverged since the fork. The atari version has been updated and
>>> the sun3 implementation is unused as sun3_scsi.c does not define
>>> SUPPORT_TAGS.
>>>
>>> The remaining differences are merge_contiguous_buffers() and the
>>> falcon locking code. The falcon code disappears when suitable macro
>>> definitions are provided in sun3_scsi.c. merge_contiguous_buffers()
>>> could be a problem for sun3 (due to a DMA setup in an odd place) so it
>>> is #ifdef'd for sun3 until the DMA setup discrepancies can be
>>> reconciled or moved out of the core driver.
>>>
>>> ---
>>> drivers/scsi/atari_NCR5380.c | 210 +++++++++++++++++++++++++++++++++++++++----
>>> drivers/scsi/atari_scsi.c | 1
>>> 2 files changed, 195 insertions(+), 16 deletions(-)
>>>
>>> Index: linux/drivers/scsi/atari_NCR5380.c
>>> ===================================================================
>>> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
>>> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:56.000000000 +1100
>>> @@ -71,6 +71,9 @@
>>> * 1. Test linked command handling code after Eric is ready with
>>> * the high level code.
>>> */
>>> +
>>> +/* Adapted for the sun3 by Sam Creasey. */
>>> +
>>> #include <scsi/scsi_dbg.h>
>>> #include <scsi/scsi_transport_spi.h>
>>>
>>> @@ -458,6 +461,7 @@ static void free_all_tags(void)
>>>
>>> static void merge_contiguous_buffers(struct scsi_cmnd *cmd)
>>> {
>>> +#if !defined(CONFIG_SUN3)
>>> unsigned long endaddr;
>>> #if (NDEBUG & NDEBUG_MERGING)
>>> unsigned long oldlen = cmd->SCp.this_residual;
>>> @@ -482,6 +486,7 @@ static void merge_contiguous_buffers(str
>>> dprintk(NDEBUG_MERGING, "merged %d buffers from %p, new length %08x\n",
>>> cnt, cmd->SCp.ptr, cmd->SCp.this_residual);
>>> #endif
>>> +#endif /* !defined(CONFIG_SUN3) */
>>> }
>>>
>>> /*
>>> @@ -1043,12 +1048,10 @@ static void NCR5380_main(struct work_str
>>> prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp)) {
>>> u8 lun = tmp->device->lun;
>>>
>>> -#if (NDEBUG & NDEBUG_LISTS)
>>> - if (prev != tmp)
>>> - printk("MAIN tmp=%p target=%d busy=%d lun=%llu\n",
>>> - tmp, tmp->device->id, hostdata->busy[tmp->device->id],
>>> - lun);
>>> -#endif
>>> + dprintk(NDEBUG_LISTS,
>>> + "MAIN tmp=%p target=%d busy=%d lun=%d\n",
>>> + tmp, scmd_id(tmp), hostdata->busy[scmd_id(tmp)],
>>> + lun);
>>> /* When we find one, remove it from the issue queue. */
>>> /* ++guenther: possible race with Falcon locking */
>>> if (
>>> @@ -1157,9 +1160,11 @@ static void NCR5380_main(struct work_str
>>> static void NCR5380_dma_complete(struct Scsi_Host *instance)
>>> {
>>> SETUP_HOSTDATA(instance);
>>> - int transfered, saved_data = 0, overrun = 0, cnt, toPIO;
>>> - unsigned char **data, p;
>>> + int transfered;
>>> + unsigned char **data;
>>> volatile int *count;
>>> + int saved_data = 0, overrun = 0;
>>> + unsigned char p;
>>>
>>> if (!hostdata->connected) {
>>> printk(KERN_WARNING "scsi%d: received end of DMA interrupt with "
>>
>> nitpick: shouldn't that be 'transferred' ?
>
>
> The intention of this patch was to merge two files into one file, in such
> a way that the result could be easily compared with the originals.
>
> With that in mind, fixing this typo could be done pre-merger by patching
> both files, or post-merger by patching just one.
>
> If this patch series ends up iterating again as v3, I'll add a new patch
> to the end to fix this (long standing) typo.
>
> If there's no need for a re-spin, I'll send a separate patch with Cc to
> trivial@kernel.org.
>
Okay, fair enough.
No need to clean it up now.
>
>>
>>> @@ -1185,6 +1190,26 @@ static void NCR5380_dma_complete(struct
>>> HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
>>> NCR5380_read(STATUS_REG));
>>>
>>> +#if defined(CONFIG_SUN3)
>>> + if ((sun3scsi_dma_finish(rq_data_dir(hostdata->connected->request)))) {
>>> + pr_err("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n",
>>> + instance->host_no);
>>> + pr_err("please e-mail sammy@sammy.net with a description of how this error was produced.\n");
>>> + BUG();
>>> + }
>>> +
>>> + /* make sure we're not stuck in a data phase */
>>> + if ((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH | BASR_ACK)) ==
>>> + (BASR_PHASE_MATCH | BASR_ACK)) {
>>> + pr_err("scsi%d: BASR %02x\n", instance->host_no,
>>> + NCR5380_read(BUS_AND_STATUS_REG));
>>> + pr_err("scsi%d: bus stuck in data phase -- probably a single byte overrun!\n",
>>> + instance->host_no);
>>> + pr_err("not prepared for this error! please e-mail sammy@sammy.net with a description of how this error was produced.\n");
>>> + BUG();
>>> + }
>>> +#endif
>>> +
>>> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
>>> NCR5380_write(MODE_REG, MR_BASE);
>>> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
>>> @@ -1198,6 +1223,8 @@ static void NCR5380_dma_complete(struct
>>> *count -= transfered;
>>>
>>> if (hostdata->read_overruns) {
>>> + int cnt, toPIO;
>>> +
>>> if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) {
>>> cnt = toPIO = hostdata->read_overruns;
>>> if (overrun) {
>>> @@ -1277,11 +1304,14 @@ static irqreturn_t NCR5380_intr(int irq,
>>> {
>>> /* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */
>>> if (basr & BASR_PHASE_MATCH)
>>> - printk(KERN_NOTICE "scsi%d: unknown interrupt, "
>>> + dprintk(NDEBUG_INTR, "scsi%d: unknown interrupt, "
>>> "BASR 0x%x, MR 0x%x, SR 0x%x\n",
>>> HOSTNO, basr, NCR5380_read(MODE_REG),
>>> NCR5380_read(STATUS_REG));
>>> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_DMA_ENABLE;
>>> +#endif
>>> }
>>> } /* if !(SELECTION || PARITY) */
>>> handled = 1;
>>> @@ -1290,6 +1320,9 @@ static irqreturn_t NCR5380_intr(int irq,
>>> "BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr,
>>> NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
>>> (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_DMA_ENABLE;
>>> +#endif
>>> }
>>>
>>> if (!done) {
>>> @@ -1622,6 +1655,9 @@ static int NCR5380_select(struct Scsi_Ho
>>> #ifndef SUPPORT_TAGS
>>> hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
>>> #endif
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_INTR;
>>> +#endif
>>>
>>> initialize_SCp(cmd);
>>>
>>> @@ -1845,9 +1881,54 @@ static int NCR5380_transfer_dma(struct S
>>> SETUP_HOSTDATA(instance);
>>> register int c = *count;
>>> register unsigned char p = *phase;
>>> + unsigned long flags;
>>> +
>>> +#if defined(CONFIG_SUN3)
>>> + /* sanity check */
>>> + if (!sun3_dma_setup_done) {
>>> + pr_err("scsi%d: transfer_dma without setup!\n",
>>> + instance->host_no);
>>> + BUG();
>>> + }
>>> + hostdata->dma_len = c;
>>> +
>>> + dprintk(NDEBUG_DMA, "scsi%d: initializing DMA for %s, %d bytes %s %p\n",
>>> + instance->host_no, (p & SR_IO) ? "reading" : "writing",
>>> + c, (p & SR_IO) ? "to" : "from", *data);
>>> +
>>> + /* netbsd turns off ints here, why not be safe and do it too */
>>> + local_irq_save(flags);
>>> +
>>> + /* send start chain */
>>> + sun3scsi_dma_start(c, *data);
>>> +
>>> + if (p & SR_IO) {
>>> + NCR5380_write(TARGET_COMMAND_REG, 1);
>>> + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
>>> + NCR5380_write(INITIATOR_COMMAND_REG, 0);
>>> + NCR5380_write(MODE_REG,
>>> + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
>>> + NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
>>> + } else {
>>> + NCR5380_write(TARGET_COMMAND_REG, 0);
>>> + NCR5380_read(RESET_PARITY_INTERRUPT_REG);
>>> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_DATA);
>>> + NCR5380_write(MODE_REG,
>>> + (NCR5380_read(MODE_REG) | MR_DMA_MODE | MR_ENABLE_EOP_INTR));
>>> + NCR5380_write(START_DMA_SEND_REG, 0);
>>> + }
>>> +
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_DMA_ENABLE;
>>> +#endif
>>> +
>>> + local_irq_restore(flags);
>>> +
>>> + sun3_dma_active = 1;
>>> +
>>> +#else /* !defined(CONFIG_SUN3) */
>>> register unsigned char *d = *data;
>>> unsigned char tmp;
>>> - unsigned long flags;
>>>
>>> if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) {
>>> *phase = tmp;
>>> @@ -1895,6 +1976,8 @@ static int NCR5380_transfer_dma(struct S
>>> NCR5380_dma_write_setup(instance, d, c);
>>> local_irq_restore(flags);
>>> }
>>> +#endif /* !defined(CONFIG_SUN3) */
>>> +
>>> return 0;
>>> }
>>> #endif /* defined(REAL_DMA) */
>>> @@ -1930,6 +2013,10 @@ static void NCR5380_information_transfer
>>> unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
>>> struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
>>>
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_INTR;
>>> +#endif
>>> +
>>> while (1) {
>>> tmp = NCR5380_read(STATUS_REG);
>>> /* We only have a valid SCSI phase when REQ is asserted */
>>> @@ -1939,6 +2026,33 @@ static void NCR5380_information_transfer
>>> old_phase = phase;
>>> NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
>>> }
>>> +#if defined(CONFIG_SUN3)
>>> + if (phase == PHASE_CMDOUT) {
>>> +#if defined(REAL_DMA)
>>> + void *d;
>>> + unsigned long count;
>>> +
>>> + if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
>>> + count = cmd->SCp.buffer->length;
>>> + d = sg_virt(cmd->SCp.buffer);
>>> + } else {
>>> + count = cmd->SCp.this_residual;
>>> + d = cmd->SCp.ptr;
>>> + }
>>> + /* this command setup for dma yet? */
>>> + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != cmd)) {
>>> + if (cmd->request->cmd_type == REQ_TYPE_FS) {
>>> + sun3scsi_dma_setup(d, count,
>>> + rq_data_dir(cmd->request));
>>> + sun3_dma_setup_done = cmd;
>>> + }
>>> + }
>>> +#endif
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_INTR;
>>> +#endif
>>> + }
>>> +#endif /* CONFIG_SUN3 */
>>>
>>> if (sink && (phase != PHASE_MSGOUT)) {
>>> NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
>>> @@ -2000,8 +2114,11 @@ static void NCR5380_information_transfer
>>> */
>>>
>>> #if defined(REAL_DMA)
>>> - if (!cmd->device->borken &&
>>> - (transfersize = NCR5380_dma_xfer_len(instance,cmd,phase)) > 31) {
>>> + if (
>>> +#if !defined(CONFIG_SUN3)
>>> + !cmd->device->borken &&
>>> +#endif
>>> + (transfersize = NCR5380_dma_xfer_len(instance, cmd, phase)) >= DMA_MIN_SIZE) {
>>> len = transfersize;
>>> cmd->SCp.phase = phase;
>>> if (NCR5380_transfer_dma(instance, &phase,
>>> @@ -2038,6 +2155,11 @@ static void NCR5380_information_transfer
>>> NCR5380_transfer_pio(instance, &phase,
>>> (int *)&cmd->SCp.this_residual,
>>> (unsigned char **)&cmd->SCp.ptr);
>>> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
>>> + /* if we had intended to dma that command clear it */
>>> + if (sun3_dma_setup_done == cmd)
>>> + sun3_dma_setup_done = NULL;
>>> +#endif
>>> break;
>>> case PHASE_MSGIN:
>>> len = 1;
>>> @@ -2243,6 +2365,9 @@ static void NCR5380_information_transfer
>>> /* Wait for bus free to avoid nasty timeouts */
>>> while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
>>> barrier();
>>> +#ifdef SUN3_SCSI_VME
>>> + dregs->csr |= CSR_DMA_ENABLE;
>>> +#endif
>>> return;
>>> /*
>>> * The SCSI data pointer is *IMPLICITLY* saved on a disconnect
>>> @@ -2402,17 +2527,20 @@ static void NCR5380_information_transfer
>>> */
>>>
>>>
>>> +/* it might eventually prove necessary to do a dma setup on
>>> + reselection, but it doesn't seem to be needed now -- sam */
>>> +
>>> static void NCR5380_reselect(struct Scsi_Host *instance)
>>> {
>>> SETUP_HOSTDATA(instance);
>>> unsigned char target_mask;
>>> - unsigned char lun, phase;
>>> - int len;
>>> + unsigned char lun;
>>> #ifdef SUPPORT_TAGS
>>> unsigned char tag;
>>> #endif
>>> unsigned char msg[3];
>>> - unsigned char *data;
>>> + int __maybe_unused len;
>>> + unsigned char __maybe_unused *data, __maybe_unused phase;
>>> struct scsi_cmnd *tmp = NULL, *prev;
>>>
>>> /*
>>> @@ -2449,10 +2577,18 @@ static void NCR5380_reselect(struct Scsi
>>> while (!(NCR5380_read(STATUS_REG) & SR_REQ))
>>> ;
>>>
>>> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
>>> + /* acknowledge toggle to MSGIN */
>>> + NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(PHASE_MSGIN));
>>> +
>>> + /* peek at the byte without really hitting the bus */
>>> + msg[0] = NCR5380_read(CURRENT_SCSI_DATA_REG);
>>> +#else
>>> len = 1;
>>> data = msg;
>>> phase = PHASE_MSGIN;
>>> NCR5380_transfer_pio(instance, &phase, &len, &data);
>>> +#endif
>>>
>>> if (!(msg[0] & 0x80)) {
>>> printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
>>> @@ -2462,7 +2598,7 @@ static void NCR5380_reselect(struct Scsi
>>> }
>>> lun = (msg[0] & 0x07);
>>>
>>> -#ifdef SUPPORT_TAGS
>>> +#if defined(SUPPORT_TAGS) && !defined(CONFIG_SUN3)
>>> /* If the phase is still MSGIN, the target wants to send some more
>>> * messages. In case it supports tagged queuing, this is probably a
>>> * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
>>> @@ -2524,9 +2660,51 @@ static void NCR5380_reselect(struct Scsi
>>> return;
>>> }
>>>
>>> +#if defined(CONFIG_SUN3) && defined(REAL_DMA)
>>> + /* engage dma setup for the command we just saw */
>>> + {
>>> + void *d;
>>> + unsigned long count;
>>> +
>>> + if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
>>> + count = tmp->SCp.buffer->length;
>>> + d = sg_virt(tmp->SCp.buffer);
>>> + } else {
>>> + count = tmp->SCp.this_residual;
>>> + d = tmp->SCp.ptr;
>>> + }
>>> + /* setup this command for dma if not already */
>>> + if ((count >= DMA_MIN_SIZE) && (sun3_dma_setup_done != tmp)) {
>>> + sun3scsi_dma_setup(d, count, rq_data_dir(tmp->request));
>>> + sun3_dma_setup_done = tmp;
>>> + }
>>> + }
>>> +
>>> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
>>> +#endif
>>> +
>>> /* Accept message by clearing ACK */
>>> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
>>>
>>> +#if defined(SUPPORT_TAGS) && defined(CONFIG_SUN3)
>>> + /* If the phase is still MSGIN, the target wants to send some more
>>> + * messages. In case it supports tagged queuing, this is probably a
>>> + * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus.
>>> + */
>>> + tag = TAG_NONE;
>>> + if (phase == PHASE_MSGIN && setup_use_tagged_queuing) {
>>> + /* Accept previous IDENTIFY message by clearing ACK */
>>> + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
>>> + len = 2;
>>> + data = msg + 1;
>>> + if (!NCR5380_transfer_pio(instance, &phase, &len, &data) &&
>>> + msg[1] == SIMPLE_QUEUE_TAG)
>>> + tag = msg[2];
>>> + dprintk(NDEBUG_TAGS, "scsi%d: target mask %02x, lun %d sent tag %d at reselection\n"
>>> + HOSTNO, target_mask, lun, tag);
>>> + }
>>> +#endif
>>> +
>>> hostdata->connected = tmp;
>>> dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %llu, tag = %d\n",
>>> HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
>>> Index: linux/drivers/scsi/atari_scsi.c
>>> ===================================================================
>>> --- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:55.000000000 +1100
>>> +++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:56.000000000 +1100
>>> @@ -89,6 +89,7 @@
>>> #define REAL_DMA
>>> #define SUPPORT_TAGS
>>> #define MAX_TAGS 32
>>> +#define DMA_MIN_SIZE 32
>>>
>>> #define NCR5380_implementation_fields /* none */
>>>
>>>
>>>
>> You reference a certain Sam Creasey in the code (and there is even
>> his email in it). Has he contributed to this patch?
>
> No, the patch is my work.
>
> As I understand it, sun3_NCR5380.c was originally Sam's (derived) work.
>
>
>> If so, shouldn't he be added somewhere in the patch description,
>> either with 'From;' (if the patch was originally by him)
>> or with a 'Signed-off-by' tag?
>
> I did Cc these patches to Sam, for comment/testing; perhaps a Cc tag might
> have been appropriate but I gather they are optional.
>
Hmm. I always feel a bit awkward by using personal names in the code.
It's not good practice nowadays. Plus one can never be sure if that
address is still valid. Or remains so for the foreseeable future.
But hey, these are just my personal opinions.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c
2014-10-31 8:40 ` Hannes Reinecke
@ 2014-10-31 12:48 ` Finn Thain
0 siblings, 0 replies; 100+ messages in thread
From: Finn Thain @ 2014-10-31 12:48 UTC (permalink / raw)
To: Sam Creasey, Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, linux-scsi, linux-m68k
On Fri, 31 Oct 2014, Hannes Reinecke wrote:
> Hmm. I always feel a bit awkward by using personal names in the code.
> It's not good practice nowadays. Plus one can never be sure if that
> address is still valid. Or remains so for the foreseeable future.
It was valid as of a couple of months ago.
>
> But hey, these are just my personal opinions.
I agree with your opinions and I'm not entirely happy with this patch
either. But I don't know what to do about it.
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
` (35 preceding siblings ...)
2014-10-27 5:26 ` [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro Finn Thain
@ 2014-11-02 5:28 ` Michael Schmitz
2014-11-02 6:12 ` Finn Thain
36 siblings, 1 reply; 100+ messages in thread
From: Michael Schmitz @ 2014-11-02 5:28 UTC (permalink / raw)
To: Finn Thain; +Cc: James E.J. Bottomley, Sam Creasey, linux-scsi, linux-m68k
Finn,
> This patch series has fixes for bugs and compiler warnings as well as code
> cleanup and modernization. It covers all ten NCR5380 drivers and the three
> core NCR5380 drivers so it's fairly large.
>
> These patches remove a lot of duplicated code and C pre-processor abuse.
> There are also patches for scsi_add_host() conversion for atari_scsi,
> mac_scsi and sun3_scsi.
>
> Some steps are taken toward re-unification of the NCR5380 core driver forks
> by reducing divergence between them. Also, the atari_NCR5380.c core driver
> is generalized so it can be used by sun3_scsi.c (and others).
>
> I have compile-tested all of the NCR5380 drivers (x86, ARM and m68k) and
> executed mac_scsi and dmx3191d on suitable hardware. I found no regressions
> but the core NCR5380 drivers have bugs unrelated to these patches.
>
> Testing mac_scsi and dmx3191d provides only limited code coverage for these
> patches. Some testing on Sun 3, Atari ST and/or Atari TT would be nice
> (I don't have the hardware).
>
Tested atari_scsi on Falcon / CT60 hardware - no regressions over v1
that I've seen.
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
> There are old bugs relating to exception handling and autosense in the
> core NCR5380 drivers that can make testing difficult. I'm working on a
> series of patches to address these bugs. Those patches are not yet ready
> for submission but they were helpful for the testing I did and may be
> helpful to other testers. Let me know if so.
>
> Changes since v1:
> - Re-based to v3.17.
> - Addressed issues raised in code review (see relevant patches for details).
> - Added patches 30 to 36, to remove sun3_NCR5380.c entirely and remove more
> static variables from atari_NCR5380.c.
>
> This patch set stops short of parameterizing the drivers with platform_data
> and/or ops struct. IMHO, it would be premature to do such refactoring before
> drivers have been purged of static variables and certain #ifdefs. After
> that is done, entire modules could be replaced with platform devices.
>
> Several patches in this set address issues with the tagged command queueing
> code (see patches 7, 33 and 34). I've since learned from recent discussions
> on the linux-scsi list that use of the tag member in struct scsi_cmnd is
> deprecated. If removal of the tag member is imminent then it may be better
> to remove TCQ support from all of the NCR5380 drivers instead of this
> cleanup. Or it could be done separately.
>
> Removal of TCQ code might make re-unification easier, by bringing
> atari_NCR5380.c closer to NCR5380.c and eliminating some #ifdefs.
> Changes to the TCQ code would affect atari_scsi, being the only driver to
> #define SUPPORT_TAGS.
>
> ---
> MAINTAINERS | 1
> arch/m68k/atari/config.c | 27
> arch/m68k/atari/stdma.c | 61
> arch/m68k/include/asm/atari_stdma.h | 4
> arch/m68k/include/asm/macintosh.h | 4
> arch/m68k/mac/config.c | 146 +
> arch/m68k/sun3/config.c | 60
> drivers/scsi/Kconfig | 2
> drivers/scsi/NCR5380.c | 295 +--
> drivers/scsi/NCR5380.h | 78
> drivers/scsi/arm/cumana_1.c | 18
> drivers/scsi/arm/oak.c | 23
> drivers/scsi/atari_NCR5380.c | 981 +++++-------
> drivers/scsi/atari_scsi.c | 676 +++-----
> drivers/scsi/atari_scsi.h | 60
> drivers/scsi/dmx3191d.c | 31
> drivers/scsi/dtc.c | 85 -
> drivers/scsi/dtc.h | 26
> drivers/scsi/g_NCR5380.c | 224 --
> drivers/scsi/g_NCR5380.h | 26
> drivers/scsi/mac_scsi.c | 542 ++----
> drivers/scsi/mac_scsi.h | 74
> drivers/scsi/pas16.c | 106 -
> drivers/scsi/pas16.h | 21
> drivers/scsi/sun3_NCR5380.c | 2933 ------------------------------------
> drivers/scsi/sun3_scsi.c | 512 ++----
> drivers/scsi/sun3_scsi.h | 84 -
> drivers/scsi/t128.c | 83 -
> drivers/scsi/t128.h | 23
> 29 files changed, 1745 insertions(+), 5461 deletions(-)
>
>
>
>
>
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-02 5:28 ` [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Michael Schmitz
@ 2014-11-02 6:12 ` Finn Thain
[not found] ` <5455E340.7080305@gmail.com>
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-02 6:12 UTC (permalink / raw)
To: Michael Schmitz; +Cc: James E.J. Bottomley, Sam Creasey, linux-scsi, linux-m68k
On Sun, 2 Nov 2014, Michael Schmitz wrote:
> Tested atari_scsi on Falcon / CT60 hardware - no regressions over v1
> that I've seen.
>
> Tested-by: Michael Schmitz <schmitzmic@gmail.com>
>
Thanks for testing.
"No regressions over v1" means "no regressions", right?
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
[not found] ` <5455E340.7080305@gmail.com>
@ 2014-11-04 23:36 ` Michael Schmitz
2014-11-05 7:56 ` David Gálvez
0 siblings, 1 reply; 100+ messages in thread
From: Michael Schmitz @ 2014-11-04 23:36 UTC (permalink / raw)
To: Finn Thain; +Cc: James E.J. Bottomley, Sam Creasey, scsi, Linux/m68k
Hi Finn,
> Thanks for testing.
>
> "No regressions over v1" means "no regressions", right?
>
>
>
> Well, what would I compare the driver performance to? With your patches to
> sort out locking races, the driver is more stable than I've ever seen it in
> years. That's a definite win. Big improvement over the driver in its current
> state in m68k and mainstream (which locks up quite reliably with even
> moderate concurrent IDE and SCSI I/O for me). No regression over v1 or
> patches that you sent for me to test off-list.
>
> On the other hand, I've seen warnings about lost bytes (stuck in the DMA
> fifo) for the first time _ever_ with the new driver - we've discussed that
> at length, and it is still unclear why these happen. This is a known NCR5380
> issue, and pretty much anything could have precipitated that. Must have
> happened for other Falcon users before in the past, because the interrupt
> handler explicitly checks for this condition.
I went back and checked test logs from driver tests before any of your
patches - no regressions over vanilla 3.17 or 3.16.
The 'lost bytes' error is rare enough that it would not have shown in
those tests. Vanilla kernels run into the ST-DMA locking race at about
7% of the total test set.
The last kernel that performed with a similar stability as with your
patches was 2.4.30 or thereabouts.
Cheers,
Michael
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-04 23:36 ` Michael Schmitz
@ 2014-11-05 7:56 ` David Gálvez
2014-11-05 8:10 ` Geert Uytterhoeven
0 siblings, 1 reply; 100+ messages in thread
From: David Gálvez @ 2014-11-05 7:56 UTC (permalink / raw)
To: Michael Schmitz
Cc: Finn Thain, James E.J. Bottomley, Sam Creasey, scsi, Linux/m68k
2014-11-05 0:36 GMT+01:00 Michael Schmitz <schmitzmic@gmail.com>:
> Hi Finn,
>
>
>> Thanks for testing.
>>
>> "No regressions over v1" means "no regressions", right?
>>
>>
>>
>> Well, what would I compare the driver performance to? With your patches to
>> sort out locking races, the driver is more stable than I've ever seen it in
>> years. That's a definite win. Big improvement over the driver in its current
>> state in m68k and mainstream (which locks up quite reliably with even
>> moderate concurrent IDE and SCSI I/O for me). No regression over v1 or
>> patches that you sent for me to test off-list.
>>
>> On the other hand, I've seen warnings about lost bytes (stuck in the DMA
>> fifo) for the first time _ever_ with the new driver - we've discussed that
>> at length, and it is still unclear why these happen. This is a known NCR5380
>> issue, and pretty much anything could have precipitated that. Must have
>> happened for other Falcon users before in the past, because the interrupt
>> handler explicitly checks for this condition.
>
Do you know about the Falcon's disturbance in the SDMA clock signal
hardware problem?
Most Falcons, specially those used in music studios, have a hardware
patch to fix this, it's normally called SCSI patch.
Some more info:
http://didierm.pagesperso-orange.fr/doc/eng/c_0a.htm
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-05 7:56 ` David Gálvez
@ 2014-11-05 8:10 ` Geert Uytterhoeven
2014-11-06 2:09 ` Michael Schmitz
0 siblings, 1 reply; 100+ messages in thread
From: Geert Uytterhoeven @ 2014-11-05 8:10 UTC (permalink / raw)
To: David Gálvez
Cc: Michael Schmitz, Finn Thain, James E.J. Bottomley, Sam Creasey,
scsi, Linux/m68k, aniplay
On Wed, Nov 5, 2014 at 8:56 AM, David Gálvez <dgalvez75@gmail.com> wrote:
> Do you know about the Falcon's disturbance in the SDMA clock signal
> hardware problem?
> Most Falcons, specially those used in music studios, have a hardware
> patch to fix this, it's normally called SCSI patch.
>
> Some more info:
>
> http://didierm.pagesperso-orange.fr/doc/eng/c_0a.htm
So this adds additional buffering to the clock.
Note that input pins 3 and 5 of the 74HC04 are left floating!
I recommend tying them to either GND (pin 7) or VCC (pin 14), to avoid
them picking up high-frequency signals and consuming power.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-05 8:10 ` Geert Uytterhoeven
@ 2014-11-06 2:09 ` Michael Schmitz
2014-11-06 4:50 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Michael Schmitz @ 2014-11-06 2:09 UTC (permalink / raw)
To: Geert Uytterhoeven
Cc: David Gálvez, Finn Thain, James E.J. Bottomley, Sam Creasey,
scsi, Linux/m68k, aniplay
David, Geert,
my Falcon has some variant of this clock patch installed - it may not
be precisely the one described but reasonably close. It also has one
of the old 030 accelerator tricks (clock doubling of the 030 if the
CPU does not do bus cycles - named Skunk) fitted; the clock patch was
installed at the same time.
The Falcon ran stable with just SCSI disks in use (so no locking
races) until a few years ago when I started to use it for kernel
hacking. There were the occasional SCSI lockups which I attributed to
the SCSI clock problem, for want of a better explanation. IIRC when
the clock signal to the 5380 becomes unstable, the chip locks up and
needs to be reset. With the old 2.4 kernels, recovery from reset
worked OK and I've not seen disk corruption or hard read errors.
2.6 kernels changed a lot of things around SCSI midlevel and error
handling. I could never make error recovery from these SCSI lockups
work in 2.6 or 3.x until Arnd's locking fixes (and my patch to defer
command queueing if the lock had been taken by IDE). The lockups did
not stop happening until Finn's patches - and I probably need to
emphasize again that they are gone entirely now. It does seem 2.4
suffered from similar race problems, the driver just managed to
recover from those.
Leaves the current instability - I did some work on the CT60
accelerator (reflashed the firmware so I can use the CTPCI board).
This might have caused the system to become more unstable. Needs more
investigation.
Cheers,
Michael
On Wed, Nov 5, 2014 at 9:10 PM, Geert Uytterhoeven <geert@linux-m68k.org> wrote:
> On Wed, Nov 5, 2014 at 8:56 AM, David Gálvez <dgalvez75@gmail.com> wrote:
>> Do you know about the Falcon's disturbance in the SDMA clock signal
>> hardware problem?
>> Most Falcons, specially those used in music studios, have a hardware
>> patch to fix this, it's normally called SCSI patch.
>>
>> Some more info:
>>
>> http://didierm.pagesperso-orange.fr/doc/eng/c_0a.htm
>
> So this adds additional buffering to the clock.
>
> Note that input pins 3 and 5 of the 74HC04 are left floating!
> I recommend tying them to either GND (pin 7) or VCC (pin 14), to avoid
> them picking up high-frequency signals and consuming power.
>
> Gr{oetje,eeting}s,
>
> Geert
>
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
> -- Linus Torvalds
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-06 2:09 ` Michael Schmitz
@ 2014-11-06 4:50 ` Finn Thain
2014-11-06 18:54 ` Michael Schmitz
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-06 4:50 UTC (permalink / raw)
To: Michael Schmitz
Cc: Geert Uytterhoeven, David Gálvez, James E.J. Bottomley,
Sam Creasey, scsi, Linux/m68k, aniplay
On Thu, 6 Nov 2014, Michael Schmitz wrote:
> Leaves the current instability - I did some work on the CT60 accelerator
> (reflashed the firmware so I can use the CTPCI board). This might have
> caused the system to become more unstable. Needs more investigation.
I gather from the emails we've exchanged that the "current" instability
(data corruption) dates back to March or thereabouts, so it is unrelated
to this patch series.
The lockups have been resolved, which leaves only the ST DMA FIFO issue,
which seems to be an old problem. From the comments in atari_scsi, it
doesn't look like this was ever resolved.
/* If the DMA was active, but now bit 1 is not clear, it is some
* other 5380 interrupt that finishes the DMA transfer. We have to
* calculate the number of residual bytes and give a warning if
* bytes are stuck in the ST-DMA fifo (there's no way to reach them!)
*/
if (atari_dma_active && (dma_stat & 0x02)) {
unsigned long transferred;
transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
/* The ST-DMA address is incremented in 2-byte steps, but the
* data are written only in 16-byte chunks. If the number of
* transferred bytes is not divisible by 16, the remainder is
* lost somewhere in outer space.
*/
if (transferred & 15)
printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
"ST-DMA fifo\n", transferred & 15);
Presuming that this is an old issue (apparently timing sensitive), we can
conclude that no regressions were observed in your tests. I'm content with
this presumption. I gather that you are too, or you would not have sent a
"tested-by" tag. Which seems to put the ball in Geert's court?
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-06 4:50 ` Finn Thain
@ 2014-11-06 18:54 ` Michael Schmitz
2014-11-07 2:34 ` Finn Thain
0 siblings, 1 reply; 100+ messages in thread
From: Michael Schmitz @ 2014-11-06 18:54 UTC (permalink / raw)
To: Finn Thain
Cc: Geert Uytterhoeven, David Gálvez, James E.J. Bottomley,
Sam Creasey, scsi, Linux/m68k, aniplay
Hi Finn,
>> Leaves the current instability - I did some work on the CT60 accelerator
>> (reflashed the firmware so I can use the CTPCI board). This might have
>> caused the system to become more unstable. Needs more investigation.
>
> I gather from the emails we've exchanged that the "current" instability
> (data corruption) dates back to March or thereabouts, so it is unrelated
> to this patch series.
Absolutely right - meant to add that but got interrupted in that train
of thought :-(
> The lockups have been resolved, which leaves only the ST DMA FIFO issue,
> which seems to be an old problem. From the comments in atari_scsi, it
> doesn't look like this was ever resolved.
>
> /* If the DMA was active, but now bit 1 is not clear, it is some
> * other 5380 interrupt that finishes the DMA transfer. We have to
> * calculate the number of residual bytes and give a warning if
> * bytes are stuck in the ST-DMA fifo (there's no way to reach them!)
> */
> if (atari_dma_active && (dma_stat & 0x02)) {
> unsigned long transferred;
>
> transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
> /* The ST-DMA address is incremented in 2-byte steps, but the
> * data are written only in 16-byte chunks. If the number of
> * transferred bytes is not divisible by 16, the remainder is
> * lost somewhere in outer space.
> */
> if (transferred & 15)
> printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
> "ST-DMA fifo\n", transferred & 15);
>
> Presuming that this is an old issue (apparently timing sensitive), we can
> conclude that no regressions were observed in your tests. I'm content with
> this presumption. I gather that you are too, or you would not have sent a
> "tested-by" tag. Which seems to put the ball in Geert's court?
Right again - though it's probably not Geert but James who needs to
give the go-ahead.
Cheers,
Michael
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-06 18:54 ` Michael Schmitz
@ 2014-11-07 2:34 ` Finn Thain
2014-11-09 10:33 ` Geert Uytterhoeven
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-07 2:34 UTC (permalink / raw)
To: Michael Schmitz
Cc: Geert Uytterhoeven, David Gálvez, James E.J. Bottomley,
Sam Creasey, scsi, Linux/m68k, aniplay
On Fri, 7 Nov 2014, Michael Schmitz wrote:
> it's probably not Geert but James who needs to give the go-ahead.
Given Geert's objections to the changes under arch/m68k in v1, I'm hoping
for an acked-by from Geert for v2...
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon
2014-10-27 5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
2014-10-30 8:07 ` Hannes Reinecke
@ 2014-11-07 18:08 ` Michael Schmitz
2014-11-08 0:37 ` Finn Thain
1 sibling, 1 reply; 100+ messages in thread
From: Michael Schmitz @ 2014-11-07 18:08 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
Hi Finn
> Changes since v1:
> - Use Geert's suggestion for simpler stdma_is_locked_by() implementation.
>
> ---
> arch/m68k/atari/stdma.c | 61 ++++++++++++++++++----------
> arch/m68k/include/asm/atari_stdma.h | 4 -
> drivers/scsi/atari_NCR5380.c | 35 +++++-----------
> drivers/scsi/atari_scsi.c | 76 +++++++-----------------------------
> 4 files changed, 69 insertions(+), 107 deletions(-)
>
> Index: linux/arch/m68k/atari/stdma.c
> ===================================================================
> --- linux.orig/arch/m68k/atari/stdma.c 2014-10-27 16:17:59.000000000 +1100
> +++ linux/arch/m68k/atari/stdma.c 2014-10-27 16:25:45.000000000 +1100
> @@ -59,6 +59,31 @@ static irqreturn_t stdma_int (int irq, v
> /************************* End of Prototypes **************************/
>
>
> +/**
> + * stdma_try_lock - attempt to acquire ST DMA interrupt "lock"
> + * @handler: interrupt handler to use after acquisition
> + *
> + * Returns !0 if lock was acquired; otherwise 0.
> + */
> +
> +int stdma_try_lock(irq_handler_t handler, void *data)
> +{
> + unsigned long flags;
> +
> + local_irq_save(flags);
> + if (stdma_locked) {
> + local_irq_restore(flags);
> + return 0;
> + }
> +
> + stdma_locked = 1;
> + stdma_isr = handler;
> + stdma_isr_data = data;
> + local_irq_restore(flags);
> + return 1;
> +}
> +EXPORT_SYMBOL(stdma_try_lock);
> +
>
> /*
> * Function: void stdma_lock( isrfunc isr, void *data )
> @@ -78,19 +103,10 @@ static irqreturn_t stdma_int (int irq, v
>
> void stdma_lock(irq_handler_t handler, void *data)
> {
> - unsigned long flags;
> -
> - local_irq_save(flags); /* protect lock */
> -
> /* Since the DMA is used for file system purposes, we
> have to sleep uninterruptible (there may be locked
> buffers) */
> - wait_event(stdma_wait, !stdma_locked);
> -
> - stdma_locked = 1;
> - stdma_isr = handler;
> - stdma_isr_data = data;
> - local_irq_restore(flags);
> + wait_event(stdma_wait, stdma_try_lock(handler, data));
> }
> EXPORT_SYMBOL(stdma_lock);
>
> @@ -122,22 +138,25 @@ void stdma_release(void)
> EXPORT_SYMBOL(stdma_release);
>
>
> -/*
> - * Function: int stdma_others_waiting( void )
> - *
> - * Purpose: Check if someone waits for the ST-DMA lock.
> - *
> - * Inputs: none
> - *
> - * Returns: 0 if no one is waiting, != 0 otherwise
> +/**
> + * stdma_is_locked_by - allow lock holder to check whether it needs to release.
> + * @handler: interrupt handler previously used to acquire lock.
> *
> + * Returns !0 if locked for the given handler; 0 otherwise.
> */
>
> -int stdma_others_waiting(void)
> +int stdma_is_locked_by(irq_handler_t handler)
> {
> - return waitqueue_active(&stdma_wait);
> + unsigned long flags;
> + int result;
> +
> + local_irq_save(flags);
> + result = stdma_locked && (stdma_isr == handler);
> + local_irq_restore(flags);
> +
> + return result;
> }
> -EXPORT_SYMBOL(stdma_others_waiting);
> +EXPORT_SYMBOL(stdma_is_locked_by);
>
>
> /*
> Index: linux/arch/m68k/include/asm/atari_stdma.h
> ===================================================================
> --- linux.orig/arch/m68k/include/asm/atari_stdma.h 2014-10-27 16:17:59.000000000 +1100
> +++ linux/arch/m68k/include/asm/atari_stdma.h 2014-10-27 16:25:45.000000000 +1100
> @@ -8,11 +8,11 @@
>
> /***************************** Prototypes *****************************/
>
> +int stdma_try_lock(irq_handler_t, void *);
> void stdma_lock(irq_handler_t handler, void *data);
> void stdma_release( void );
> -int stdma_others_waiting( void );
> int stdma_islocked( void );
> -void *stdma_locked_by( void );
> +int stdma_is_locked_by(irq_handler_t);
> void stdma_init( void );
>
> /************************* End of Prototypes **************************/
Acked-by: Michael Schmitz <schmitz@debian.org>
> Index: linux/drivers/scsi/atari_NCR5380.c
> ===================================================================
> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:36.000000000 +1100
> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:45.000000000 +1100
> @@ -879,10 +879,10 @@ static void NCR5380_exit(struct Scsi_Hos
> *
> */
>
> -static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
> - void (*done)(struct scsi_cmnd *))
> +static int NCR5380_queue_command(struct Scsi_Host *instance,
> + struct scsi_cmnd *cmd)
> {
> - SETUP_HOSTDATA(cmd->device->host);
> + struct NCR5380_hostdata *hostdata = shost_priv(instance);
> struct scsi_cmnd *tmp;
> unsigned long flags;
Nitpick - why did this change set go into this particular patch? Because
you are converting from NCR5380_queue_command_lck to NCR5380_queue_command?
>
> @@ -893,7 +893,7 @@ static int NCR5380_queue_command_lck(str
> printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag set\n",
> H_NO(cmd));
> cmd->result = (DID_ERROR << 16);
> - done(cmd);
> + cmd->scsi_done(cmd);
> return 0;
> }
> #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
> @@ -904,8 +904,6 @@ static int NCR5380_queue_command_lck(str
> */
>
> SET_NEXT(cmd, NULL);
> - cmd->scsi_done = done;
> -
> cmd->result = 0;
>
> /*
Ditto for these two.
> @@ -915,7 +913,6 @@ static int NCR5380_queue_command_lck(str
> * sense data is only guaranteed to be valid while the condition exists.
> */
>
> - local_irq_save(flags);
> /* ++guenther: now that the issue queue is being set up, we can lock ST-DMA.
> * Otherwise a running NCR5380_main may steal the lock.
> * Lock before actually inserting due to fairness reasons explained in
> @@ -928,11 +925,13 @@ static int NCR5380_queue_command_lck(str
> * because also a timer int can trigger an abort or reset, which would
> * alter queues and touch the lock.
> */
> - if (!IS_A_TT()) {
> - /* perhaps stop command timer here */
> - falcon_get_lock();
> - /* perhaps restart command timer here */
> - }
> + /* perhaps stop command timer here */
> + if (!falcon_get_lock())
> + return SCSI_MLQUEUE_HOST_BUSY;
> + /* perhaps restart command timer here */
> +
The comments about stopping and restarting the command timer can be
removed. In 2.4 kernels, the driver would tweak the timers and wait on
the lock unconditionally, Can't ne done anymore, for so many reasons.
> + local_irq_save(flags);
> +
> if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
> LIST(cmd, hostdata->issue_queue);
> SET_NEXT(cmd, hostdata->issue_queue);
> @@ -956,15 +955,13 @@ static int NCR5380_queue_command_lck(str
> * If we're not in an interrupt, we can call NCR5380_main()
> * unconditionally, because it cannot be already running.
> */
> - if (in_interrupt() || ((flags >> 8) & 7) >= 6)
> + if (in_interrupt() || irqs_disabled())
> queue_main();
> else
> NCR5380_main(NULL);
> return 0;
> }
>
> -static DEF_SCSI_QCMD(NCR5380_queue_command)
> -
> /*
> * Function : NCR5380_main (void)
> *
> @@ -2555,10 +2552,6 @@ int NCR5380_abort(struct scsi_cmnd *cmd)
>
> local_irq_save(flags);
>
> - if (!IS_A_TT() && !falcon_got_lock)
> - printk(KERN_ERR "scsi%d: !!BINGO!! Falcon has no lock in NCR5380_abort\n",
> - HOSTNO);
> -
> 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));
> @@ -2757,10 +2750,6 @@ static int NCR5380_bus_reset(struct scsi
> struct scsi_cmnd *connected, *disconnected_queue;
> #endif
>
> - if (!IS_A_TT() && !falcon_got_lock)
> - printk(KERN_ERR "scsi%d: !!BINGO!! Falcon has no lock in NCR5380_reset\n",
> - H_NO(cmd));
> -
> NCR5380_print_status(cmd->device->host);
>
> /* get in phase */
> Index: linux/drivers/scsi/atari_scsi.c
> ===================================================================
> --- linux.orig/drivers/scsi/atari_scsi.c 2014-10-27 16:25:36.000000000 +1100
> +++ linux/drivers/scsi/atari_scsi.c 2014-10-27 16:25:45.000000000 +1100
> @@ -184,7 +184,7 @@ static void atari_scsi_fetch_restbytes(v
> static irqreturn_t scsi_tt_intr(int irq, void *dummy);
> static irqreturn_t scsi_falcon_intr(int irq, void *dummy);
> static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata);
> -static void falcon_get_lock(void);
> +static int falcon_get_lock(void);
> #ifdef CONFIG_ATARI_SCSI_RESET_BOOT
> static void atari_scsi_reset_boot(void);
> #endif
> @@ -473,17 +473,10 @@ static void atari_scsi_fetch_restbytes(v
> #endif /* REAL_DMA */
>
>
> -static int falcon_got_lock = 0;
> -static DECLARE_WAIT_QUEUE_HEAD(falcon_fairness_wait);
> -static int falcon_trying_lock = 0;
> -static DECLARE_WAIT_QUEUE_HEAD(falcon_try_wait);
> static int falcon_dont_release = 0;
>
> /* This function releases the lock on the DMA chip if there is no
> - * connected command and the disconnected queue is empty. On
> - * releasing, instances of falcon_get_lock are awoken, that put
> - * themselves to sleep for fairness. They can now try to get the lock
> - * again (but others waiting longer more probably will win).
> + * connected command and the disconnected queue is empty.
> */
>
> static void falcon_release_lock_if_possible(struct NCR5380_hostdata *hostdata)
> @@ -495,20 +488,12 @@ static void falcon_release_lock_if_possi
>
> local_irq_save(flags);
>
> - if (falcon_got_lock && !hostdata->disconnected_queue &&
> - !hostdata->issue_queue && !hostdata->connected) {
> -
> - if (falcon_dont_release) {
> -#if 0
> - printk("WARNING: Lock release not allowed. Ignored\n");
> -#endif
> - local_irq_restore(flags);
> - return;
> - }
> - falcon_got_lock = 0;
> + if (!hostdata->disconnected_queue &&
> + !hostdata->issue_queue &&
> + !hostdata->connected &&
> + !falcon_dont_release &&
> + stdma_is_locked_by(scsi_falcon_intr))
> stdma_release();
> - wake_up(&falcon_fairness_wait);
> - }
>
> local_irq_restore(flags);
> }
> @@ -517,51 +502,20 @@ static void falcon_release_lock_if_possi
> * If the DMA isn't locked already for SCSI, it tries to lock it by
> * calling stdma_lock(). But if the DMA is locked by the SCSI code and
> * there are other drivers waiting for the chip, we do not issue the
> - * command immediately but wait on 'falcon_fairness_queue'. We will be
> - * waked up when the DMA is unlocked by some SCSI interrupt. After that
> - * we try to get the lock again.
> - * But we must be prepared that more than one instance of
> - * falcon_get_lock() is waiting on the fairness queue. They should not
> - * try all at once to call stdma_lock(), one is enough! For that, the
> - * first one sets 'falcon_trying_lock', others that see that variable
> - * set wait on the queue 'falcon_try_wait'.
> - * Complicated, complicated.... Sigh...
> + * command immediately but tell the SCSI mid-layer to defer.
> */
>
> -static void falcon_get_lock(void)
> +static int falcon_get_lock(void)
> {
> - unsigned long flags;
> -
> if (IS_A_TT())
> - return;
> + return 1;
>
> - local_irq_save(flags);
> -
> - wait_event_cmd(falcon_fairness_wait,
> - in_interrupt() || !falcon_got_lock || !stdma_others_waiting(),
> - local_irq_restore(flags),
> - local_irq_save(flags));
> -
> - while (!falcon_got_lock) {
> - if (in_irq())
> - panic("Falcon SCSI hasn't ST-DMA lock in interrupt");
> - if (!falcon_trying_lock) {
> - falcon_trying_lock = 1;
> - stdma_lock(scsi_falcon_intr, NULL);
> - falcon_got_lock = 1;
> - falcon_trying_lock = 0;
> - wake_up(&falcon_try_wait);
> - } else {
> - wait_event_cmd(falcon_try_wait,
> - falcon_got_lock && !falcon_trying_lock,
> - local_irq_restore(flags),
> - local_irq_save(flags));
> - }
> + if (in_interrupt()) {
> + return stdma_try_lock(scsi_falcon_intr, NULL);
> + } else {
> + stdma_lock(scsi_falcon_intr, NULL);
> + return 1;
> }
> -
> - local_irq_restore(flags);
> - if (!falcon_got_lock)
> - panic("Falcon SCSI: someone stole the lock :-(\n");
> }
>
>
>
>
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon
2014-11-07 18:08 ` Michael Schmitz
@ 2014-11-08 0:37 ` Finn Thain
2014-11-08 7:22 ` Michael Schmitz
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-08 0:37 UTC (permalink / raw)
To: Michael Schmitz
Cc: James E.J. Bottomley, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
On Sat, 8 Nov 2014, Michael Schmitz wrote:
> > Index: linux/drivers/scsi/atari_NCR5380.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:36.000000000
> > +1100
> > +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:45.000000000
> > +1100
> > @@ -879,10 +879,10 @@ static void NCR5380_exit(struct Scsi_Hos
> > *
> > */
> > -static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
> > - void (*done)(struct scsi_cmnd *))
> > +static int NCR5380_queue_command(struct Scsi_Host *instance,
> > + struct scsi_cmnd *cmd)
> > {
> > - SETUP_HOSTDATA(cmd->device->host);
> > + struct NCR5380_hostdata *hostdata = shost_priv(instance);
> > struct scsi_cmnd *tmp;
> > unsigned long flags;
>
> Nitpick - why did this change set go into this particular patch? Because you
> are converting from NCR5380_queue_command_lck to NCR5380_queue_command?
That's right.
The SETUP_HOSTDATA macro does not appear in NCR5380.c, it is peculiar to
atari_NCR5380.c. Like so much pre-processor abuse in these drivers, this
example is undesirable as it harms readability, whereas the shost_priv()
convention is common and readily understood.
So the uniform adoption of,
struct NCR5380_hostdata *hostdata = shost_priv(instance);
is the purpose of a different patch (unsent). I have more unsent patches
to fix up other weird macros in atari_NCR5380.c like HOSTDATA, H_NO, etc.
It's instructive to compare this change with the use of the
NCR5380_local_declare() macro in NCR5380.c, which was long ago dropped
from atari_NCR5380.c (and quite rightly so).
>
> > @@ -893,7 +893,7 @@ static int NCR5380_queue_command_lck(str
> > printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag
> > set\n",
> > H_NO(cmd));
> > cmd->result = (DID_ERROR << 16);
> > - done(cmd);
> > + cmd->scsi_done(cmd);
> > return 0;
> > }
> > #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
> > @@ -904,8 +904,6 @@ static int NCR5380_queue_command_lck(str
> > */
> >
> > SET_NEXT(cmd, NULL);
> > - cmd->scsi_done = done;
> > -
> > cmd->result = 0;
> >
> > /*
>
> Ditto for these two.
Again, it follows from the differences in the formal parameters between
NCR5380_queue_command_lck() and NCR5380_queue_command().
>
> > @@ -915,7 +913,6 @@ static int NCR5380_queue_command_lck(str
> > * sense data is only guaranteed to be valid while the condition exists.
> > */
> > - local_irq_save(flags);
> > /* ++guenther: now that the issue queue is being set up, we can lock
> > ST-DMA.
> > * Otherwise a running NCR5380_main may steal the lock.
> > * Lock before actually inserting due to fairness reasons explained in
> > @@ -928,11 +925,13 @@ static int NCR5380_queue_command_lck(str
> > * because also a timer int can trigger an abort or reset, which would
> > * alter queues and touch the lock.
> > */
> > - if (!IS_A_TT()) {
> > - /* perhaps stop command timer here */
> > - falcon_get_lock();
> > - /* perhaps restart command timer here */
> > - }
> > + /* perhaps stop command timer here */
> > + if (!falcon_get_lock())
> > + return SCSI_MLQUEUE_HOST_BUSY;
> > + /* perhaps restart command timer here */
> > +
>
> The comments about stopping and restarting the command timer can be
> removed. In 2.4 kernels, the driver would tweak the timers and wait on
> the lock unconditionally, Can't ne done anymore, for so many reasons.
Well, you sent an acked-by for this patch, so I'm a bit confused. Do you
want me to re-spin it?
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon
2014-11-08 0:37 ` Finn Thain
@ 2014-11-08 7:22 ` Michael Schmitz
0 siblings, 0 replies; 100+ messages in thread
From: Michael Schmitz @ 2014-11-08 7:22 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Sam Creasey, linux-scsi, linux-m68k,
Geert Uytterhoeven
Finn,
>
>>> Index: linux/drivers/scsi/atari_NCR5380.c
>>> ===================================================================
>>> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:36.000000000
>>> +1100
>>> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:45.000000000
>>> +1100
>>> @@ -879,10 +879,10 @@ static void NCR5380_exit(struct Scsi_Hos
>>> *
>>> */
>>> -static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd,
>>> - void (*done)(struct scsi_cmnd *))
>>> +static int NCR5380_queue_command(struct Scsi_Host *instance,
>>> + struct scsi_cmnd *cmd)
>>> {
>>> - SETUP_HOSTDATA(cmd->device->host);
>>> + struct NCR5380_hostdata *hostdata = shost_priv(instance);
>>> struct scsi_cmnd *tmp;
>>> unsigned long flags;
>>>
>> Nitpick - why did this change set go into this particular patch? Because you
>> are converting from NCR5380_queue_command_lck to NCR5380_queue_command?
>>
>
> That's right.
>
OK, I just wanted to understand why it's being combined with the stram.c
patch (and the directly resulting changes in the SCSI driver).
The change to NCR5380_queue_command() can only now be done, as a result
of the deadlock fixes in this patch, so it follows logically. Makes
perfectly good sense to me now, thanks.
>>> @@ -893,7 +893,7 @@ static int NCR5380_queue_command_lck(str
>>> printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag
>>> set\n",
>>> H_NO(cmd));
>>> cmd->result = (DID_ERROR << 16);
>>> - done(cmd);
>>> + cmd->scsi_done(cmd);
>>> return 0;
>>> }
>>> #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
>>> @@ -904,8 +904,6 @@ static int NCR5380_queue_command_lck(str
>>> */
>>>
>>> SET_NEXT(cmd, NULL);
>>> - cmd->scsi_done = done;
>>> -
>>> cmd->result = 0;
>>>
>>> /*
>>>
>> Ditto for these two.
>>
>
> Again, it follows from the differences in the formal parameters between
> NCR5380_queue_command_lck() and NCR5380_queue_command().
>
Yep, I got that bit. Thanks for the explanation, and apologies for the
noise.
>
>>> @@ -915,7 +913,6 @@ static int NCR5380_queue_command_lck(str
>>> * sense data is only guaranteed to be valid while the condition exists.
>>> */
>>> - local_irq_save(flags);
>>> /* ++guenther: now that the issue queue is being set up, we can lock
>>> ST-DMA.
>>> * Otherwise a running NCR5380_main may steal the lock.
>>> * Lock before actually inserting due to fairness reasons explained in
>>> @@ -928,11 +925,13 @@ static int NCR5380_queue_command_lck(str
>>> * because also a timer int can trigger an abort or reset, which would
>>> * alter queues and touch the lock.
>>> */
>>> - if (!IS_A_TT()) {
>>> - /* perhaps stop command timer here */
>>> - falcon_get_lock();
>>> - /* perhaps restart command timer here */
>>> - }
>>> + /* perhaps stop command timer here */
>>> + if (!falcon_get_lock())
>>> + return SCSI_MLQUEUE_HOST_BUSY;
>>> + /* perhaps restart command timer here */
>>> +
>>>
>> The comments about stopping and restarting the command timer can be
>> removed. In 2.4 kernels, the driver would tweak the timers and wait on
>> the lock unconditionally, Can't ne done anymore, for so many reasons.
>>
>
> Well, you sent an acked-by for this patch, so I'm a bit confused. Do you
> want me to re-spin it?
>
Not at all - this was just something I wanted to raise for future
patches, before it slips my mind, again. Sorry I did not make that clear
at all.
I expect we will have an opportunity to address this when we embark on a
wider cleanup of comments throughout the driver - most of these comments
were for the 0.9 kernel series and might still be somewhat germane up to
2.4. Might be totally misleading now.
Not a priority at all - I know you have bigger fish to fry. I should not
have brought it up in this context.
No problems at all with this patch (or indeed with the rest of the series).
Cheers,
Michael
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 25/36] sun3_scsi: Convert to platform device
2014-10-27 5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
2014-10-30 8:20 ` Hannes Reinecke
@ 2014-11-09 10:25 ` Geert Uytterhoeven
2014-11-09 12:12 ` Finn Thain
1 sibling, 1 reply; 100+ messages in thread
From: Geert Uytterhoeven @ 2014-11-09 10:25 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, scsi,
Linux/m68k
On Mon, Oct 27, 2014 at 6:26 AM, Finn Thain <fthain@telegraphics.com.au> wrote:
> --- linux.orig/arch/m68k/sun3/config.c 2014-10-27 16:17:59.000000000 +1100
> +++ linux/arch/m68k/sun3/config.c 2014-10-27 16:25:50.000000000 +1100
> @@ -169,3 +171,61 @@ static void __init sun3_sched_init(irq_h
> intersil_clear();
> }
>
> +#ifdef CONFIG_SUN3_SCSI
> +
> +static const struct resource sun3_scsi_vme_rsrc[] __initconst = {
> + {
> + .flags = IORESOURCE_IRQ,
> + .start = SUN3_VEC_VMESCSI0,
> + .end = SUN3_VEC_VMESCSI0,
> + }, {
> + .flags = IORESOURCE_MEM,
> + .start = 0xff200000,
> + .end = 0xff200000 + PAGE_SIZE - 1,
PAGE_SIZE is a software kernel configuration option, not a hardware
property. It makes sense to use it in an ioremap() call, but not in a
platform device's resource, which describes the hardware.
> + }, {
> + .flags = IORESOURCE_IRQ,
> + .start = SUN3_VEC_VMESCSI1,
> + .end = SUN3_VEC_VMESCSI1,
> + }, {
> + .flags = IORESOURCE_MEM,
> + .start = 0xff204000,
> + .end = 0xff204000 + PAGE_SIZE - 1,
Likewise
> + },
> +};
> +
> +/*
> + * Int: level 2 autovector
> + * IO: type 1, base 0x00140000, 5 bits phys space: A<4..0>
> + */
> +static const struct resource sun3_scsi_rsrc[] __initconst = {
> + {
> + .flags = IORESOURCE_IRQ,
> + .start = 2,
> + .end = 2,
> + }, {
> + .flags = IORESOURCE_MEM,
> + .start = 0x00140000,
> + .end = 0x00140000 + PAGE_SIZE - 1,
Likewise
According to the Sun-3 Architecture Manual v2.0 (May 1985), end should
be 0x0014001f.
I guess the resource length is 0x20 for VME SCSI, too?
> + },
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers
2014-11-07 2:34 ` Finn Thain
@ 2014-11-09 10:33 ` Geert Uytterhoeven
0 siblings, 0 replies; 100+ messages in thread
From: Geert Uytterhoeven @ 2014-11-09 10:33 UTC (permalink / raw)
To: Finn Thain
Cc: Michael Schmitz, David Gálvez, James E.J. Bottomley,
Sam Creasey, scsi, Linux/m68k
Hi Finn,
On Fri, Nov 7, 2014 at 3:34 AM, Finn Thain <fthain@telegraphics.com.au> wrote:
>> it's probably not Geert but James who needs to give the go-ahead.
>
> Given Geert's objections to the changes under arch/m68k in v1, I'm hoping
> for an acked-by from Geert for v2...
I'm happy with the arch/m68k changes in v2 (modulo the PAGE_SIZE
comment on Sun-3), so please add my
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
after fixing that one.
As I'm not afraid of merge conflicts, I think this can go in through the SCSI
tree? James?
Note that there's still room for improvement in the individual drivers, using
more modern infrastructure (e.g. using devm_*() calls, and getting rid of the
multiple ATARIHW_PRESENT() checks using e.g. platform_data or regmap).
But this is already a giant step forward.
Thanks a lot for doing this cleanup!
Removing ca. 3700 LoC deserves you a spot in the LoC removal Hall of Fame!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 25/36] sun3_scsi: Convert to platform device
2014-11-09 10:25 ` Geert Uytterhoeven
@ 2014-11-09 12:12 ` Finn Thain
2014-11-09 12:18 ` Geert Uytterhoeven
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-09 12:12 UTC (permalink / raw)
To: Geert Uytterhoeven
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, scsi,
Linux/m68k
On Sun, 9 Nov 2014, Geert Uytterhoeven wrote:
> On Mon, Oct 27, 2014 at 6:26 AM, Finn Thain <fthain@telegraphics.com.au> wrote:
> > --- linux.orig/arch/m68k/sun3/config.c 2014-10-27 16:17:59.000000000 +1100
> > +++ linux/arch/m68k/sun3/config.c 2014-10-27 16:25:50.000000000 +1100
>
> > @@ -169,3 +171,61 @@ static void __init sun3_sched_init(irq_h
> > intersil_clear();
> > }
> >
> > +#ifdef CONFIG_SUN3_SCSI
> > +
> > +static const struct resource sun3_scsi_vme_rsrc[] __initconst = {
> > + {
> > + .flags = IORESOURCE_IRQ,
> > + .start = SUN3_VEC_VMESCSI0,
> > + .end = SUN3_VEC_VMESCSI0,
> > + }, {
> > + .flags = IORESOURCE_MEM,
> > + .start = 0xff200000,
> > + .end = 0xff200000 + PAGE_SIZE - 1,
>
> PAGE_SIZE is a software kernel configuration option, not a hardware
> property. It makes sense to use it in an ioremap() call, but not in a
> platform device's resource, which describes the hardware.
>
> > + }, {
> > + .flags = IORESOURCE_IRQ,
> > + .start = SUN3_VEC_VMESCSI1,
> > + .end = SUN3_VEC_VMESCSI1,
> > + }, {
> > + .flags = IORESOURCE_MEM,
> > + .start = 0xff204000,
> > + .end = 0xff204000 + PAGE_SIZE - 1,
>
> Likewise
>
> > + },
> > +};
> > +
> > +/*
> > + * Int: level 2 autovector
> > + * IO: type 1, base 0x00140000, 5 bits phys space: A<4..0>
> > + */
> > +static const struct resource sun3_scsi_rsrc[] __initconst = {
> > + {
> > + .flags = IORESOURCE_IRQ,
> > + .start = 2,
> > + .end = 2,
> > + }, {
> > + .flags = IORESOURCE_MEM,
> > + .start = 0x00140000,
> > + .end = 0x00140000 + PAGE_SIZE - 1,
>
> Likewise
>
> According to the Sun-3 Architecture Manual v2.0 (May 1985), end should
> be 0x0014001f.
OK. Where did you find that, BTW?
>
> I guess the resource length is 0x20 for VME SCSI, too?
For VME SCSI it would need to be 8 + sizeof(struct sun3_dma_regs) which I
think equals 0x22:
struct sun3_dma_regs {
unsigned short dma_addr_hi; /* vme only */
unsigned short dma_addr_lo; /* vme only */
unsigned short dma_count_hi; /* vme only */
unsigned short dma_count_lo; /* vme only */
unsigned short udc_data; /* udc dma data reg (obio only) */
unsigned short udc_addr; /* uda dma addr reg (obio only) */
unsigned short fifo_data; /* fifo data reg, holds extra byte on
odd dma reads */
unsigned short fifo_count;
unsigned short csr; /* control/status reg */
unsigned short bpack_hi; /* vme only */
unsigned short bpack_lo; /* vme only */
unsigned short ivect; /* vme only */
unsigned short fifo_count_hi; /* vme only */
};
I'll make these changes and re-spin the patch series once Hannes'
questions have been resolved. Thanks for reviewing.
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-10-31 8:33 ` Hannes Reinecke
@ 2014-11-09 12:17 ` Finn Thain
2014-11-10 7:02 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-09 12:17 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On Fri, 31 Oct 2014, Hannes Reinecke wrote:
> On 10/31/2014 08:17 AM, Finn Thain wrote:
> >
> > On Thu, 30 Oct 2014, Hannes Reinecke wrote:
> >
> >> On 10/27/2014 06:26 AM, Finn Thain wrote:
> >>> Allow mac_scsi to be built as a module. Replace the old validation of
> >>> __setup options with code that validates both module and __setup
> >>> options.
> >>>
> >>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> >>>
> >>> ---
> >>> drivers/scsi/Kconfig | 2
> >>> drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
> >>> 2 files changed, 38 insertions(+), 76 deletions(-)
> >>>
> >>> Index: linux/drivers/scsi/Kconfig
> >>> ===================================================================
> >>> --- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
> >>> +++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
> >>> @@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
> >>> that leave the devices with SCSI operations partway completed.
> >>>
> >>> config MAC_SCSI
> >>> - bool "Macintosh NCR5380 SCSI"
> >>> + tristate "Macintosh NCR5380 SCSI"
> >>> depends on MAC && SCSI=y
> >>> select SCSI_SPI_ATTRS
> >>> help
> >>> Index: linux/drivers/scsi/mac_scsi.c
> >>> ===================================================================
> >>> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
> >>> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
> >>> @@ -62,15 +62,18 @@
> >>> static void mac_scsi_reset_boot(struct Scsi_Host *instance);
> >>> #endif
> >>>
> >>> -static int setup_called = 0;
> >>> static int setup_can_queue = -1;
> >>> +module_param(setup_can_queue, int, 0);
> >>> static int setup_cmd_per_lun = -1;
> >>> +module_param(setup_cmd_per_lun, int, 0);
> >>> static int setup_sg_tablesize = -1;
> >>> +module_param(setup_sg_tablesize, int, 0);
> >>> static int setup_use_pdma = -1;
> >>> -#ifdef SUPPORT_TAGS
> >>> +module_param(setup_use_pdma, int, 0);
> >>> static int setup_use_tagged_queuing = -1;
> >>> -#endif
> >>> +module_param(setup_use_tagged_queuing, int, 0);
> >>> static int setup_hostid = -1;
> >>> +module_param(setup_hostid, int, 0);
> >>>
> >>> /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
> >>> * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
> >>> @@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
> >>> out_8(instance->io_port + (reg<<4), value);
> >>> }
> >>>
> >>> -/*
> >>> - * Function : mac_scsi_setup(char *str)
> >>> - *
> >>> - * Purpose : booter command line initialization of the overrides array,
> >>> - *
> >>> - * Inputs : str - comma delimited list of options
> >>> - *
> >>> - */
> >>> -
> >>> -static int __init mac_scsi_setup(char *str) {
> >>> +#ifndef MODULE
> >>> +static int __init mac_scsi_setup(char *str)
> >>> +{
> >>> int ints[7];
> >>> -
> >>> - (void)get_options( str, ARRAY_SIZE(ints), ints);
> >>> -
> >>> - if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
> >>> - printk(KERN_WARNING "scsi: <mac5380>"
> >>> - " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
> >>> - printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
> >>> - return 0;
> >>> - }
> >>> -
> >>> - if (ints[0] >= 1) {
> >>> - if (ints[1] > 0)
> >>> - /* no limits on this, just > 0 */
> >>> - setup_can_queue = ints[1];
> >>> - }
> >>> - if (ints[0] >= 2) {
> >>> - if (ints[2] > 0)
> >>> - setup_cmd_per_lun = ints[2];
> >>> - }
> >>> - if (ints[0] >= 3) {
> >>> - if (ints[3] >= 0) {
> >>> - setup_sg_tablesize = ints[3];
> >>> - /* Must be <= SG_ALL (255) */
> >>> - if (setup_sg_tablesize > SG_ALL)
> >>> - setup_sg_tablesize = SG_ALL;
> >>> - }
> >>> - }
> >>> - if (ints[0] >= 4) {
> >>> - /* Must be between 0 and 7 */
> >>> - if (ints[4] >= 0 && ints[4] <= 7)
> >>> - setup_hostid = ints[4];
> >>> - else if (ints[4] > 7)
> >>> - printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
> >>> - }
> >>> -#ifdef SUPPORT_TAGS
> >>> - if (ints[0] >= 5) {
> >>> - if (ints[5] >= 0)
> >>> - setup_use_tagged_queuing = !!ints[5];
> >>> +
> >>> + (void)get_options(str, ARRAY_SIZE(ints), ints);
> >>> +
> >>> + if (ints[0] < 1 || ints[0] > 6) {
> >>> + pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
> >>> + return 0;
> >>> }
> >>> -
> >>> - if (ints[0] == 6) {
> >>> - if (ints[6] >= 0)
> >>> + if (ints[0] >= 1)
> >>> + setup_can_queue = ints[1];
> >>> + if (ints[0] >= 2)
> >>> + setup_cmd_per_lun = ints[2];
> >>> + if (ints[0] >= 3)
> >>> + setup_sg_tablesize = ints[3];
> >>> + if (ints[0] >= 4)
> >>> + setup_hostid = ints[4];
> >>> + if (ints[0] >= 5)
> >>> + setup_use_tagged_queuing = ints[5];
> >>> + if (ints[0] >= 6)
> >>> setup_use_pdma = ints[6];
> >>> - }
> >>> -#else
> >>> - if (ints[0] == 5) {
> >>> - if (ints[5] >= 0)
> >>> - setup_use_pdma = ints[5];
> >>> - }
> >>> -#endif /* SUPPORT_TAGS */
> >>> -
> >>> return 1;
> >>> }
> >>>
> >>> __setup("mac5380=", mac_scsi_setup);
> >>> +#endif /* !MODULE */
> >>>
> >>> /*
> >>> * Function : int macscsi_detect(struct scsi_host_template * tpnt)
> >>> @@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
> >>> tpnt->cmd_per_lun = setup_cmd_per_lun;
> >>> if (setup_sg_tablesize >= 0)
> >>> tpnt->sg_tablesize = setup_sg_tablesize;
> >>> -
> >>> - if (setup_hostid >= 0)
> >>> - tpnt->this_id = setup_hostid;
> >>> - else {
> >>> - /* use 7 as default */
> >>> - tpnt->this_id = 7;
> >>> - }
> >>> + if (setup_hostid >= 0)
> >>> + tpnt->this_id = setup_hostid & 7;
> >>>
> >>> #ifdef SUPPORT_TAGS
> >>> if (setup_use_tagged_queuing < 0)
> >>> @@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
> >>> return 0;
> >>>
> >>> if (macintosh_config->ident == MAC_MODEL_IIFX) {
> >>> - mac_scsi_regp = via1+0x8000;
> >>> - mac_scsi_drq = via1+0xE000;
> >>> - mac_scsi_nodrq = via1+0xC000;
> >>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
> >>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
> >>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
> >>> /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
> >>> flags = FLAG_NO_PSEUDO_DMA;
> >>> } else {
> >>> - mac_scsi_regp = via1+0x10000;
> >>> - mac_scsi_drq = via1+0x6000;
> >>> - mac_scsi_nodrq = via1+0x12000;
> >>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
> >>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
> >>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
> >>> }
> >>>
> >>> if (! setup_use_pdma)
> >> Hmm. mac_via.h has this:
> >>
> >> /*
> >> * Base addresses for the VIAs. There are two in every machine,
> >> * although on some machines the second is an RBV or an OSS.
> >> * The OSS is different enough that it's handled separately.
> >> *
> >> * Do not use these values directly; use the via1 and via2 variables
> >> * instead (and don't forget to check rbv_present when using via2!)
> >> */
> >>
> >> #define VIA1_BASE (0x50F00000)
> >> #define VIA2_BASE (0x50F02000)
> >> #define RBV_BASE (0x50F26000)
> >>
> >> So either that comment is obsolete or you should revert the above
> >> bit ...
> >
> > Use of via1 had to be changed because that symbol is not exported.
> >
> > The comment you quoted is probably not wrong; it relates to programming
> > the VIA chip itself (see ADB drivers for example). But in this driver we
> > aren't interested in the VIA1 chip so I'd say niether via1 or VIA1_BASE is
> > good style. Hence my use of bare addresses in the platform resource
> > initializers in patch 21.
> >
> > This example of VIA1_BASE + offset disappears in patch 21 (you can find an
> > unrelated example in arch/m68k/mac/config.c but that was not my doing).
> >
> > This patch is not meant to change the actual addresses used by mac_scsi;
> > it just makes the driver modular. Use of VIA1_BASE seemed like a good way
> > to express the fact that the addresses are not changed yet (some models
> > use new addresses after patch 21).
> >
> > Basically, I just wanted a modular driver for debugging and bisection and
> > I wanted it early in the patch series. A modular mac_scsi.c aligns better
> > with atari_scsi.c and sun3_scsi.c as they are already modular. That means
> > that the three subsequent patches which convert {atari,mac,sun3}_scsi.c to
> > platform drivers also align nicely (so I could cross check them).
> >
> Fair enough.
>
> Just needed some clarification here. My Mac experience ceased with a
> IIcx :-)
Hannes, can I get a reviewed-by tag for this patch please?
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking
2014-10-31 7:20 ` Finn Thain
@ 2014-11-09 12:18 ` Finn Thain
2014-11-10 7:03 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-09 12:18 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
Ping...
On Fri, 31 Oct 2014, Finn Thain wrote:
>
> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>
> > On 10/27/2014 06:26 AM, Finn Thain wrote:
> > > Simplify falcon_release_lock_if_possible() by making callers
> > > responsible for disabling local IRQ's, which they must do anyway to
> > > correctly synchronize the ST DMA "lock" with core driver data
> > > structures. Move this synchronization logic to the core driver with
> > > which it is tightly coupled.
> > >
> > > Other LLD's like sun3_scsi and mac_scsi that can make use of this core
> > > driver can just stub out the NCR5380_acquire_dma_irq() and
> > > NCR5380_release_dma_irq() calls so the compiler will eliminate the ST
> > > DMA code.
> > >
> > > Remove a redundant local_irq_save/restore pair (irq's are disabled for
> > > interrupt handlers these days). Revise the locking for
> > > atari_scsi_bus_reset(): use local_irq_save/restore() instead of
> > > atari_turnoff/turnon_irq(). There is no guarantee that atari_scsi
> > > still holds the ST DMA lock during EH, so atari_turnoff/turnon_irq()
> > > could end up dropping an IDE or floppy interrupt.
> > >
> > > Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> > >
> > > ---
> > > drivers/scsi/atari_NCR5380.c | 72 ++++++++++++++++++++++++++-----------------
> > > drivers/scsi/atari_scsi.c | 47 ++++++++++------------------
> > > 2 files changed, 62 insertions(+), 57 deletions(-)
> > >
> > > Index: linux/drivers/scsi/atari_NCR5380.c
> > > ===================================================================
> > > --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
> > > +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
> > > @@ -926,7 +926,7 @@ static int NCR5380_queue_command(struct
> > > * alter queues and touch the lock.
> > > */
> > > /* perhaps stop command timer here */
> > > - if (!falcon_get_lock())
> > > + if (!NCR5380_acquire_dma_irq(instance))
> > > return SCSI_MLQUEUE_HOST_BUSY;
> > > /* perhaps restart command timer here */
> > >
> > > @@ -962,6 +962,18 @@ static int NCR5380_queue_command(struct
> > > return 0;
> > > }
> > >
> > > +static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
> > > +{
> > > + 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 &&
> > > + !hostdata->connected &&
> > > + !hostdata->retain_dma_intr)
> > > + NCR5380_release_dma_irq(instance);
> > > +}
> > > +
> > > /*
> > > * Function : NCR5380_main (void)
> > > *
> > > @@ -1084,9 +1096,11 @@ static void NCR5380_main(struct work_str
> > > cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
> > > #endif
> > > if (!NCR5380_select(instance, tmp)) {
> > > + local_irq_disable();
> > > hostdata->retain_dma_intr--;
> > > /* release if target did not response! */
> > > - falcon_release_lock_if_possible(hostdata);
> > > + maybe_release_dma_irq(instance);
> > > + local_irq_restore(flags);
> > > break;
> > > } else {
> > > local_irq_disable();
> > > @@ -2085,11 +2099,12 @@ static void NCR5380_information_transfer
> > > case COMMAND_COMPLETE:
> > > /* Accept message by clearing ACK */
> > > NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
> > > - /* ++guenther: possible race with Falcon locking */
> > > - hostdata->retain_dma_intr++;
> > > - hostdata->connected = NULL;
> > > dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
> > > "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
> > > +
> > > + local_irq_save(flags);
> > > + hostdata->retain_dma_intr++;
> > > + hostdata->connected = NULL;
> > > #ifdef SUPPORT_TAGS
> > > cmd_free_tag(cmd);
> > > if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
> > > @@ -2148,17 +2163,17 @@ static void NCR5380_information_transfer
> > >
> > > dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n", HOSTNO);
> > >
> > > - local_irq_save(flags);
> > > LIST(cmd,hostdata->issue_queue);
> > > SET_NEXT(cmd, hostdata->issue_queue);
> > > hostdata->issue_queue = (struct scsi_cmnd *) cmd;
> > > - local_irq_restore(flags);
> > > dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
> > > "issue queue\n", H_NO(cmd));
> > > } else {
> > > cmd->scsi_done(cmd);
> > > }
> > >
> > > + local_irq_restore(flags);
> > > +
> > > NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
> > > /*
> > > * Restore phase bits to 0 so an interrupted selection,
> > Probably a stupid question, but you're disabling local interrupts.
> > scsi_done() OTOH is triggering a soft irq.
>
> Isn't that how all bottom halves work?
>
> > Does this work?
>
> Yes, I've tested that particular code. I'm pretty sure Michael has too.
>
> A quick search turned up another example of this in
> zfcp_fsf_fcp_cmnd_handler().
>
> > Shouldn't we enable interrupts before calling scsi_done() ?
>
> I don't see anything in the scsi_done() implementation in scsi_lib.c that
> would be problematic. The description says "This function is interrupt
> context safe". The same would have to apply to scsi_eh_done().
>
>
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 25/36] sun3_scsi: Convert to platform device
2014-11-09 12:12 ` Finn Thain
@ 2014-11-09 12:18 ` Geert Uytterhoeven
0 siblings, 0 replies; 100+ messages in thread
From: Geert Uytterhoeven @ 2014-11-09 12:18 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, scsi,
Linux/m68k
On Sun, Nov 9, 2014 at 1:12 PM, Finn Thain <fthain@telegraphics.com.au> wrote:
>> According to the Sun-3 Architecture Manual v2.0 (May 1985), end should
>> be 0x0014001f.
>
> OK. Where did you find that, BTW?
In my local collection of hardware docs I downloaded eons ago ;-)
Fortunately it hasn't disappeared from the Internet, unlike many others docs
I've collected over the years:
https://www.google.be/search?q=Sun-3_Architecture_Manual_Ver_2.0_May85.pdf
>> I guess the resource length is 0x20 for VME SCSI, too?
>
> For VME SCSI it would need to be 8 + sizeof(struct sun3_dma_regs) which I
> think equals 0x22:
IC.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 06/36] ncr5380: Remove more useless prototypes
2014-10-29 14:44 ` Hannes Reinecke
@ 2014-11-09 12:19 ` Finn Thain
2014-11-11 12:47 ` Hannes Reinecke
0 siblings, 1 reply; 100+ messages in thread
From: Finn Thain @ 2014-11-09 12:19 UTC (permalink / raw)
To: Hannes Reinecke
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
Ping...
On Wed, 29 Oct 2014, Hannes Reinecke wrote:
> On 10/27/2014 06:26 AM, Finn Thain wrote:
> > Make use of the host template static initializer instead of assigning
> > handlers at run-time. Move __maybe_unused qualifiers from declarations
> > to definitions. Move the atari_scsi_bus_reset() wrapper after the
> > definition of NCR5380_bus_reset(). All of the host template handler
> > prototypes are now redundant so remove them.
> >
> > The write_info() handler is only relevant to drivers using PSEUDO_DMA so
> > this patch fixes the compiler warning in atari_NCR5380.c and sun3_NCR5380.c:
> >
> > CC drivers/scsi/atari_scsi.o
> > drivers/scsi/NCR5380.h:329: warning: 'NCR5380_write_info' declared 'static' but never defined
> >
> > Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
> >
> > ---
> > drivers/scsi/NCR5380.h | 8 ----
> > drivers/scsi/atari_NCR5380.c | 3 +
> > drivers/scsi/atari_scsi.c | 76 ++++++++++++++++++++-----------------------
> > drivers/scsi/dtc.c | 7 +--
> > drivers/scsi/pas16.c | 7 +--
> > drivers/scsi/sun3_NCR5380.c | 3 +
> > drivers/scsi/t128.c | 7 +--
> > 7 files changed, 50 insertions(+), 61 deletions(-)
> >
> > Index: linux/drivers/scsi/NCR5380.h
> > ===================================================================
> > --- linux.orig/drivers/scsi/NCR5380.h 2014-10-27 16:25:06.000000000 +1100
> > +++ linux/drivers/scsi/NCR5380.h 2014-10-27 16:25:14.000000000 +1100
> > @@ -322,14 +322,6 @@ static irqreturn_t NCR5380_intr(int irq,
> > #endif
> > static void NCR5380_main(struct work_struct *work);
> > static void __maybe_unused NCR5380_print_options(struct Scsi_Host *instance);
> > -static int NCR5380_abort(Scsi_Cmnd * cmd);
> > -static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
> > -static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
> > -static int __maybe_unused NCR5380_show_info(struct seq_file *,
> > - struct Scsi_Host *);
> > -static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
> > - char *buffer, int length);
> > -
> > static void NCR5380_reselect(struct Scsi_Host *instance);
> > static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag);
> > #if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
> > Index: linux/drivers/scsi/dtc.c
> > ===================================================================
> > --- linux.orig/drivers/scsi/dtc.c 2014-10-27 16:25:08.000000000 +1100
> > +++ linux/drivers/scsi/dtc.c 2014-10-27 16:25:14.000000000 +1100
> > @@ -219,10 +219,6 @@ static int __init dtc_detect(struct scsi
> > void __iomem *base;
> > int sig, count;
> >
> > - tpnt->proc_name = "dtc3x80";
> > - tpnt->show_info = dtc_show_info;
> > - tpnt->write_info = dtc_write_info;
> > -
> > for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
> > addr = 0;
> > base = NULL;
> > @@ -477,6 +473,9 @@ static struct scsi_host_template driver_
> > .name = "DTC 3180/3280 ",
> > .detect = dtc_detect,
> > .release = dtc_release,
> > + .proc_name = "dtc3x80",
> > + .show_info = dtc_show_info,
> > + .write_info = dtc_write_info,
> > .queuecommand = dtc_queue_command,
> > .eh_abort_handler = dtc_abort,
> > .eh_bus_reset_handler = dtc_bus_reset,
>
> What is the current consensus on using '.proc_name' ?
> At one point is was claimed to be deprecated, yet the only driver
> actually following this seems to be lpfc.
> (_And_ we have a patch in our tree to hook that back in).
>
> Can't we just get it back for the time being and decide upon a
> proper solution later?
>
> Cheers,
>
> Hannes
>
--
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 19/36] mac_scsi: Add module option to Kconfig
2014-11-09 12:17 ` Finn Thain
@ 2014-11-10 7:02 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-11-10 7:02 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On 11/09/2014 01:17 PM, Finn Thain wrote:
>
> On Fri, 31 Oct 2014, Hannes Reinecke wrote:
>
>> On 10/31/2014 08:17 AM, Finn Thain wrote:
>>>
>>> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>>>
>>>> On 10/27/2014 06:26 AM, Finn Thain wrote:
>>>>> Allow mac_scsi to be built as a module. Replace the old validation of
>>>>> __setup options with code that validates both module and __setup
>>>>> options.
>>>>>
>>>>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>>>>>
>>>>> ---
>>>>> drivers/scsi/Kconfig | 2
>>>>> drivers/scsi/mac_scsi.c | 112 +++++++++++++++---------------------------------
>>>>> 2 files changed, 38 insertions(+), 76 deletions(-)
>>>>>
>>>>> Index: linux/drivers/scsi/Kconfig
>>>>> ===================================================================
>>>>> --- linux.orig/drivers/scsi/Kconfig 2014-10-27 16:17:59.000000000 +1100
>>>>> +++ linux/drivers/scsi/Kconfig 2014-10-27 16:25:42.000000000 +1100
>>>>> @@ -1595,7 +1595,7 @@ config ATARI_SCSI_RESET_BOOT
>>>>> that leave the devices with SCSI operations partway completed.
>>>>>
>>>>> config MAC_SCSI
>>>>> - bool "Macintosh NCR5380 SCSI"
>>>>> + tristate "Macintosh NCR5380 SCSI"
>>>>> depends on MAC && SCSI=y
>>>>> select SCSI_SPI_ATTRS
>>>>> help
>>>>> Index: linux/drivers/scsi/mac_scsi.c
>>>>> ===================================================================
>>>>> --- linux.orig/drivers/scsi/mac_scsi.c 2014-10-27 16:25:40.000000000 +1100
>>>>> +++ linux/drivers/scsi/mac_scsi.c 2014-10-27 16:25:42.000000000 +1100
>>>>> @@ -62,15 +62,18 @@
>>>>> static void mac_scsi_reset_boot(struct Scsi_Host *instance);
>>>>> #endif
>>>>>
>>>>> -static int setup_called = 0;
>>>>> static int setup_can_queue = -1;
>>>>> +module_param(setup_can_queue, int, 0);
>>>>> static int setup_cmd_per_lun = -1;
>>>>> +module_param(setup_cmd_per_lun, int, 0);
>>>>> static int setup_sg_tablesize = -1;
>>>>> +module_param(setup_sg_tablesize, int, 0);
>>>>> static int setup_use_pdma = -1;
>>>>> -#ifdef SUPPORT_TAGS
>>>>> +module_param(setup_use_pdma, int, 0);
>>>>> static int setup_use_tagged_queuing = -1;
>>>>> -#endif
>>>>> +module_param(setup_use_tagged_queuing, int, 0);
>>>>> static int setup_hostid = -1;
>>>>> +module_param(setup_hostid, int, 0);
>>>>>
>>>>> /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
>>>>> * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
>>>>> @@ -102,72 +105,34 @@ static __inline__ void macscsi_write(str
>>>>> out_8(instance->io_port + (reg<<4), value);
>>>>> }
>>>>>
>>>>> -/*
>>>>> - * Function : mac_scsi_setup(char *str)
>>>>> - *
>>>>> - * Purpose : booter command line initialization of the overrides array,
>>>>> - *
>>>>> - * Inputs : str - comma delimited list of options
>>>>> - *
>>>>> - */
>>>>> -
>>>>> -static int __init mac_scsi_setup(char *str) {
>>>>> +#ifndef MODULE
>>>>> +static int __init mac_scsi_setup(char *str)
>>>>> +{
>>>>> int ints[7];
>>>>> -
>>>>> - (void)get_options( str, ARRAY_SIZE(ints), ints);
>>>>> -
>>>>> - if (setup_called++ || ints[0] < 1 || ints[0] > 6) {
>>>>> - printk(KERN_WARNING "scsi: <mac5380>"
>>>>> - " Usage: mac5380=<can_queue>[,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>,<use_pdma>]\n");
>>>>> - printk(KERN_ALERT "scsi: <mac5380> Bad Penguin parameters?\n");
>>>>> - return 0;
>>>>> - }
>>>>> -
>>>>> - if (ints[0] >= 1) {
>>>>> - if (ints[1] > 0)
>>>>> - /* no limits on this, just > 0 */
>>>>> - setup_can_queue = ints[1];
>>>>> - }
>>>>> - if (ints[0] >= 2) {
>>>>> - if (ints[2] > 0)
>>>>> - setup_cmd_per_lun = ints[2];
>>>>> - }
>>>>> - if (ints[0] >= 3) {
>>>>> - if (ints[3] >= 0) {
>>>>> - setup_sg_tablesize = ints[3];
>>>>> - /* Must be <= SG_ALL (255) */
>>>>> - if (setup_sg_tablesize > SG_ALL)
>>>>> - setup_sg_tablesize = SG_ALL;
>>>>> - }
>>>>> - }
>>>>> - if (ints[0] >= 4) {
>>>>> - /* Must be between 0 and 7 */
>>>>> - if (ints[4] >= 0 && ints[4] <= 7)
>>>>> - setup_hostid = ints[4];
>>>>> - else if (ints[4] > 7)
>>>>> - printk(KERN_WARNING "mac_scsi_setup: invalid host ID %d !\n", ints[4] );
>>>>> - }
>>>>> -#ifdef SUPPORT_TAGS
>>>>> - if (ints[0] >= 5) {
>>>>> - if (ints[5] >= 0)
>>>>> - setup_use_tagged_queuing = !!ints[5];
>>>>> +
>>>>> + (void)get_options(str, ARRAY_SIZE(ints), ints);
>>>>> +
>>>>> + if (ints[0] < 1 || ints[0] > 6) {
>>>>> + pr_err("Usage: mac5380=<can_queue>[,<cmd_per_lun>[,<sg_tablesize>[,<hostid>[,<use_tags>[,<use_pdma>]]]]]\n");
>>>>> + return 0;
>>>>> }
>>>>> -
>>>>> - if (ints[0] == 6) {
>>>>> - if (ints[6] >= 0)
>>>>> + if (ints[0] >= 1)
>>>>> + setup_can_queue = ints[1];
>>>>> + if (ints[0] >= 2)
>>>>> + setup_cmd_per_lun = ints[2];
>>>>> + if (ints[0] >= 3)
>>>>> + setup_sg_tablesize = ints[3];
>>>>> + if (ints[0] >= 4)
>>>>> + setup_hostid = ints[4];
>>>>> + if (ints[0] >= 5)
>>>>> + setup_use_tagged_queuing = ints[5];
>>>>> + if (ints[0] >= 6)
>>>>> setup_use_pdma = ints[6];
>>>>> - }
>>>>> -#else
>>>>> - if (ints[0] == 5) {
>>>>> - if (ints[5] >= 0)
>>>>> - setup_use_pdma = ints[5];
>>>>> - }
>>>>> -#endif /* SUPPORT_TAGS */
>>>>> -
>>>>> return 1;
>>>>> }
>>>>>
>>>>> __setup("mac5380=", mac_scsi_setup);
>>>>> +#endif /* !MODULE */
>>>>>
>>>>> /*
>>>>> * Function : int macscsi_detect(struct scsi_host_template * tpnt)
>>>>> @@ -199,13 +164,8 @@ int __init macscsi_detect(struct scsi_ho
>>>>> tpnt->cmd_per_lun = setup_cmd_per_lun;
>>>>> if (setup_sg_tablesize >= 0)
>>>>> tpnt->sg_tablesize = setup_sg_tablesize;
>>>>> -
>>>>> - if (setup_hostid >= 0)
>>>>> - tpnt->this_id = setup_hostid;
>>>>> - else {
>>>>> - /* use 7 as default */
>>>>> - tpnt->this_id = 7;
>>>>> - }
>>>>> + if (setup_hostid >= 0)
>>>>> + tpnt->this_id = setup_hostid & 7;
>>>>>
>>>>> #ifdef SUPPORT_TAGS
>>>>> if (setup_use_tagged_queuing < 0)
>>>>> @@ -219,15 +179,15 @@ int __init macscsi_detect(struct scsi_ho
>>>>> return 0;
>>>>>
>>>>> if (macintosh_config->ident == MAC_MODEL_IIFX) {
>>>>> - mac_scsi_regp = via1+0x8000;
>>>>> - mac_scsi_drq = via1+0xE000;
>>>>> - mac_scsi_nodrq = via1+0xC000;
>>>>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x8000;
>>>>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0xE000;
>>>>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0xC000;
>>>>> /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */
>>>>> flags = FLAG_NO_PSEUDO_DMA;
>>>>> } else {
>>>>> - mac_scsi_regp = via1+0x10000;
>>>>> - mac_scsi_drq = via1+0x6000;
>>>>> - mac_scsi_nodrq = via1+0x12000;
>>>>> + mac_scsi_regp = (unsigned char *) VIA1_BASE + 0x10000;
>>>>> + mac_scsi_drq = (unsigned char *) VIA1_BASE + 0x6000;
>>>>> + mac_scsi_nodrq = (unsigned char *) VIA1_BASE + 0x12000;
>>>>> }
>>>>>
>>>>> if (! setup_use_pdma)
>>>> Hmm. mac_via.h has this:
>>>>
>>>> /*
>>>> * Base addresses for the VIAs. There are two in every machine,
>>>> * although on some machines the second is an RBV or an OSS.
>>>> * The OSS is different enough that it's handled separately.
>>>> *
>>>> * Do not use these values directly; use the via1 and via2 variables
>>>> * instead (and don't forget to check rbv_present when using via2!)
>>>> */
>>>>
>>>> #define VIA1_BASE (0x50F00000)
>>>> #define VIA2_BASE (0x50F02000)
>>>> #define RBV_BASE (0x50F26000)
>>>>
>>>> So either that comment is obsolete or you should revert the above
>>>> bit ...
>>>
>>> Use of via1 had to be changed because that symbol is not exported.
>>>
>>> The comment you quoted is probably not wrong; it relates to programming
>>> the VIA chip itself (see ADB drivers for example). But in this driver we
>>> aren't interested in the VIA1 chip so I'd say niether via1 or VIA1_BASE is
>>> good style. Hence my use of bare addresses in the platform resource
>>> initializers in patch 21.
>>>
>>> This example of VIA1_BASE + offset disappears in patch 21 (you can find an
>>> unrelated example in arch/m68k/mac/config.c but that was not my doing).
>>>
>>> This patch is not meant to change the actual addresses used by mac_scsi;
>>> it just makes the driver modular. Use of VIA1_BASE seemed like a good way
>>> to express the fact that the addresses are not changed yet (some models
>>> use new addresses after patch 21).
>>>
>>> Basically, I just wanted a modular driver for debugging and bisection and
>>> I wanted it early in the patch series. A modular mac_scsi.c aligns better
>>> with atari_scsi.c and sun3_scsi.c as they are already modular. That means
>>> that the three subsequent patches which convert {atari,mac,sun3}_scsi.c to
>>> platform drivers also align nicely (so I could cross check them).
>>>
>> Fair enough.
>>
>> Just needed some clarification here. My Mac experience ceased with a
>> IIcx :-)
>
> Hannes, can I get a reviewed-by tag for this patch please?
>
Sure.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking
2014-11-09 12:18 ` Finn Thain
@ 2014-11-10 7:03 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-11-10 7:03 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On 11/09/2014 01:18 PM, Finn Thain wrote:
>
> Ping...
>
> On Fri, 31 Oct 2014, Finn Thain wrote:
>
>>
>> On Thu, 30 Oct 2014, Hannes Reinecke wrote:
>>
>>> On 10/27/2014 06:26 AM, Finn Thain wrote:
>>>> Simplify falcon_release_lock_if_possible() by making callers
>>>> responsible for disabling local IRQ's, which they must do anyway to
>>>> correctly synchronize the ST DMA "lock" with core driver data
>>>> structures. Move this synchronization logic to the core driver with
>>>> which it is tightly coupled.
>>>>
>>>> Other LLD's like sun3_scsi and mac_scsi that can make use of this core
>>>> driver can just stub out the NCR5380_acquire_dma_irq() and
>>>> NCR5380_release_dma_irq() calls so the compiler will eliminate the ST
>>>> DMA code.
>>>>
>>>> Remove a redundant local_irq_save/restore pair (irq's are disabled for
>>>> interrupt handlers these days). Revise the locking for
>>>> atari_scsi_bus_reset(): use local_irq_save/restore() instead of
>>>> atari_turnoff/turnon_irq(). There is no guarantee that atari_scsi
>>>> still holds the ST DMA lock during EH, so atari_turnoff/turnon_irq()
>>>> could end up dropping an IDE or floppy interrupt.
>>>>
>>>> Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
>>>>
>>>> ---
>>>> drivers/scsi/atari_NCR5380.c | 72 ++++++++++++++++++++++++++-----------------
>>>> drivers/scsi/atari_scsi.c | 47 ++++++++++------------------
>>>> 2 files changed, 62 insertions(+), 57 deletions(-)
>>>>
>>>> Index: linux/drivers/scsi/atari_NCR5380.c
>>>> ===================================================================
>>>> --- linux.orig/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:54.000000000 +1100
>>>> +++ linux/drivers/scsi/atari_NCR5380.c 2014-10-27 16:25:55.000000000 +1100
>>>> @@ -926,7 +926,7 @@ static int NCR5380_queue_command(struct
>>>> * alter queues and touch the lock.
>>>> */
>>>> /* perhaps stop command timer here */
>>>> - if (!falcon_get_lock())
>>>> + if (!NCR5380_acquire_dma_irq(instance))
>>>> return SCSI_MLQUEUE_HOST_BUSY;
>>>> /* perhaps restart command timer here */
>>>>
>>>> @@ -962,6 +962,18 @@ static int NCR5380_queue_command(struct
>>>> return 0;
>>>> }
>>>>
>>>> +static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
>>>> +{
>>>> + 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 &&
>>>> + !hostdata->connected &&
>>>> + !hostdata->retain_dma_intr)
>>>> + NCR5380_release_dma_irq(instance);
>>>> +}
>>>> +
>>>> /*
>>>> * Function : NCR5380_main (void)
>>>> *
>>>> @@ -1084,9 +1096,11 @@ static void NCR5380_main(struct work_str
>>>> cmd_get_tag(tmp, tmp->cmnd[0] != REQUEST_SENSE);
>>>> #endif
>>>> if (!NCR5380_select(instance, tmp)) {
>>>> + local_irq_disable();
>>>> hostdata->retain_dma_intr--;
>>>> /* release if target did not response! */
>>>> - falcon_release_lock_if_possible(hostdata);
>>>> + maybe_release_dma_irq(instance);
>>>> + local_irq_restore(flags);
>>>> break;
>>>> } else {
>>>> local_irq_disable();
>>>> @@ -2085,11 +2099,12 @@ static void NCR5380_information_transfer
>>>> case COMMAND_COMPLETE:
>>>> /* Accept message by clearing ACK */
>>>> NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
>>>> - /* ++guenther: possible race with Falcon locking */
>>>> - hostdata->retain_dma_intr++;
>>>> - hostdata->connected = NULL;
>>>> dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %llu "
>>>> "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
>>>> +
>>>> + local_irq_save(flags);
>>>> + hostdata->retain_dma_intr++;
>>>> + hostdata->connected = NULL;
>>>> #ifdef SUPPORT_TAGS
>>>> cmd_free_tag(cmd);
>>>> if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
>>>> @@ -2148,17 +2163,17 @@ static void NCR5380_information_transfer
>>>>
>>>> dprintk(NDEBUG_AUTOSENSE, "scsi%d: performing request sense\n", HOSTNO);
>>>>
>>>> - local_irq_save(flags);
>>>> LIST(cmd,hostdata->issue_queue);
>>>> SET_NEXT(cmd, hostdata->issue_queue);
>>>> hostdata->issue_queue = (struct scsi_cmnd *) cmd;
>>>> - local_irq_restore(flags);
>>>> dprintk(NDEBUG_QUEUES, "scsi%d: REQUEST SENSE added to head of "
>>>> "issue queue\n", H_NO(cmd));
>>>> } else {
>>>> cmd->scsi_done(cmd);
>>>> }
>>>>
>>>> + local_irq_restore(flags);
>>>> +
>>>> NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
>>>> /*
>>>> * Restore phase bits to 0 so an interrupted selection,
>>> Probably a stupid question, but you're disabling local interrupts.
>>> scsi_done() OTOH is triggering a soft irq.
>>
>> Isn't that how all bottom halves work?
>>
>>> Does this work?
>>
>> Yes, I've tested that particular code. I'm pretty sure Michael has too.
>>
>> A quick search turned up another example of this in
>> zfcp_fsf_fcp_cmnd_handler().
>>
>>> Shouldn't we enable interrupts before calling scsi_done() ?
>>
>> I don't see anything in the scsi_done() implementation in scsi_lib.c that
>> would be problematic. The description says "This function is interrupt
>> context safe". The same would have to apply to scsi_eh_done().
>>
>>
Ah. I thought I've had it answered, but apparently I ran into one of
our network hickups.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 100+ messages in thread
* Re: [PATCH v2 06/36] ncr5380: Remove more useless prototypes
2014-11-09 12:19 ` Finn Thain
@ 2014-11-11 12:47 ` Hannes Reinecke
0 siblings, 0 replies; 100+ messages in thread
From: Hannes Reinecke @ 2014-11-11 12:47 UTC (permalink / raw)
To: Finn Thain
Cc: James E.J. Bottomley, Michael Schmitz, Sam Creasey, linux-scsi,
linux-m68k
On 11/09/2014 01:19 PM, Finn Thain wrote:
>
> Ping...
>
Ok, disregard the .proc_name issue for now.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 100+ messages in thread
end of thread, other threads:[~2014-11-11 12:47 UTC | newest]
Thread overview: 100+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-27 5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
2014-10-27 5:26 ` [PATCH v2 01/36] ncr5380: Use printk() not pr_debug() Finn Thain
2014-10-27 5:26 ` [PATCH v2 02/36] ncr5380: Remove unused hostdata fields Finn Thain
2014-10-27 5:26 ` [PATCH v2 03/36] ncr5380: Fix compiler warnings and __setup options Finn Thain
2014-10-27 5:26 ` [PATCH v2 04/36] ncr5380: Remove unused macros Finn Thain
2014-10-27 5:26 ` [PATCH v2 05/36] ncr5380: Remove useless prototypes Finn Thain
2014-10-29 14:41 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 06/36] ncr5380: Remove more " Finn Thain
2014-10-29 14:44 ` Hannes Reinecke
2014-11-09 12:19 ` Finn Thain
2014-11-11 12:47 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros Finn Thain
2014-10-29 14:45 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro Finn Thain
2014-10-29 15:57 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 09/36] ncr5380: Remove duplicate comments Finn Thain
2014-10-29 15:59 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs Finn Thain
2014-10-29 16:07 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS Finn Thain
2014-10-29 16:11 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 12/36] ncr5380: Cleanup host info() methods Finn Thain
2014-10-29 16:17 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data Finn Thain
2014-10-30 7:31 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros Finn Thain
2014-10-30 7:34 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros Finn Thain
2014-10-30 7:36 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include Finn Thain
2014-10-30 7:37 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 17/36] dmx3191d: Use NO_IRQ Finn Thain
2014-10-30 7:38 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 18/36] mac_scsi: Remove header Finn Thain
2014-10-30 7:39 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 19/36] mac_scsi: Add module option to Kconfig Finn Thain
2014-10-30 7:44 ` Hannes Reinecke
2014-10-31 7:17 ` Finn Thain
2014-10-31 8:33 ` Hannes Reinecke
2014-11-09 12:17 ` Finn Thain
2014-11-10 7:02 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 20/36] mac_scsi: Cleanup PDMA code Finn Thain
2014-10-30 7:46 ` Hannes Reinecke
2014-10-30 8:45 ` Hannes Reinecke
2014-10-31 7:18 ` Finn Thain
2014-10-31 8:34 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 21/36] mac_scsi: Convert to platform device Finn Thain
2014-10-30 7:55 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
2014-10-30 8:07 ` Hannes Reinecke
2014-11-07 18:08 ` Michael Schmitz
2014-11-08 0:37 ` Finn Thain
2014-11-08 7:22 ` Michael Schmitz
2014-10-27 5:26 ` [PATCH v2 23/36] atari_scsi: Convert to platform device Finn Thain
2014-10-30 8:17 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 24/36] atari_scsi: Remove header Finn Thain
2014-10-30 8:18 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
2014-10-30 8:20 ` Hannes Reinecke
2014-11-09 10:25 ` Geert Uytterhoeven
2014-11-09 12:12 ` Finn Thain
2014-11-09 12:18 ` Geert Uytterhoeven
2014-10-27 5:26 ` [PATCH v2 26/36] sun3_scsi: Move macro definitions Finn Thain
2014-10-30 8:20 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros Finn Thain
2014-10-30 8:21 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases Finn Thain
2014-10-30 8:23 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking Finn Thain
2014-10-30 8:27 ` Hannes Reinecke
2014-10-31 7:20 ` Finn Thain
2014-11-09 12:18 ` Finn Thain
2014-11-10 7:03 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c Finn Thain
2014-10-30 8:33 ` Hannes Reinecke
2014-10-31 7:21 ` Finn Thain
2014-10-31 8:40 ` Hannes Reinecke
2014-10-31 12:48 ` Finn Thain
2014-10-27 5:26 ` [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c Finn Thain
2014-10-30 8:35 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c Finn Thain
2014-10-30 8:37 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING Finn Thain
2014-10-30 8:39 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data Finn Thain
2014-10-30 8:41 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables " Finn Thain
2014-10-30 8:42 ` Hannes Reinecke
2014-10-27 5:26 ` [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro Finn Thain
2014-10-30 8:44 ` Hannes Reinecke
2014-11-02 5:28 ` [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Michael Schmitz
2014-11-02 6:12 ` Finn Thain
[not found] ` <5455E340.7080305@gmail.com>
2014-11-04 23:36 ` Michael Schmitz
2014-11-05 7:56 ` David Gálvez
2014-11-05 8:10 ` Geert Uytterhoeven
2014-11-06 2:09 ` Michael Schmitz
2014-11-06 4:50 ` Finn Thain
2014-11-06 18:54 ` Michael Schmitz
2014-11-07 2:34 ` Finn Thain
2014-11-09 10:33 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).