Commit 491447e1 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] next NCR5380 updates

Fix more locking, do a major rethink on the bh handling (now workqueue)
parent 00a442fa
...@@ -92,12 +92,10 @@ if [ "$CONFIG_MCA" = "y" ]; then ...@@ -92,12 +92,10 @@ if [ "$CONFIG_MCA" = "y" ]; then
dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI
fi fi
dep_tristate 'Intel/ICP (former GDT SCSI Disk Array) RAID Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI dep_tristate 'Intel/ICP (former GDT SCSI Disk Array) RAID Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI
dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI dep_tristate 'Generic NCR5380/53c400 SCSI PIO support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI
dep_tristate 'Generic NCR5380/53c400 SCSI MMIO support' CONFIG_SCSI_GENERIC_NCR5380_MMIO $CONFIG_SCSI
if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then
bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400 bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
"Port CONFIG_SCSI_G_NCR5380_PORT \
Memory CONFIG_SCSI_G_NCR5380_MEM" Port
fi fi
if [ "$CONFIG_MCA" = "y" ]; then if [ "$CONFIG_MCA" = "y" ]; then
dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI
......
...@@ -65,6 +65,7 @@ obj-$(CONFIG_SCSI_FD_MCS) += fd_mcs.o ...@@ -65,6 +65,7 @@ obj-$(CONFIG_SCSI_FD_MCS) += fd_mcs.o
obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o
obj-$(CONFIG_SCSI_IN2000) += in2000.o obj-$(CONFIG_SCSI_IN2000) += in2000.o
obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o
obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o
obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o
obj-$(CONFIG_SCSI_NCR_D700) += NCR_D700.o 53c700.o obj-$(CONFIG_SCSI_NCR_D700) += NCR_D700.o 53c700.o
obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o
......
This diff is collapsed.
...@@ -248,6 +248,8 @@ ...@@ -248,6 +248,8 @@
#ifndef ASM #ifndef ASM
struct NCR5380_hostdata { struct NCR5380_hostdata {
NCR5380_implementation_fields; /* implementation specific */ NCR5380_implementation_fields; /* implementation specific */
struct Scsi_Host *host; /* Host backpointer */
struct NCR5380_hostdata *next; /* Next in our hot chain */
unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */ unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */
unsigned char targets_present; /* targets we have connected unsigned char targets_present; /* targets we have connected
to, so we can call a select to, so we can call a select
...@@ -269,6 +271,7 @@ struct NCR5380_hostdata { ...@@ -269,6 +271,7 @@ struct NCR5380_hostdata {
struct Scsi_Host *next_timer; struct Scsi_Host *next_timer;
int select_time; /* timer in select for target response */ int select_time; /* timer in select for target response */
volatile Scsi_Cmnd *selecting; volatile Scsi_Cmnd *selecting;
struct work_struct coroutine; /* our co-routine */
#ifdef NCR5380_STATS #ifdef NCR5380_STATS
unsigned timebase; /* Base for time calcs */ unsigned timebase; /* Base for time calcs */
long time_read[8]; /* time to do reads */ long time_read[8]; /* time to do reads */
...@@ -281,7 +284,6 @@ struct NCR5380_hostdata { ...@@ -281,7 +284,6 @@ struct NCR5380_hostdata {
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
static struct Scsi_Host *first_instance; /* linked list of 5380's */
#define dprintk(a,b) do {} while(0) #define dprintk(a,b) do {} while(0)
#define NCR5380_dprint(a,b) do {} while(0) #define NCR5380_dprint(a,b) do {} while(0)
...@@ -290,36 +292,22 @@ static struct Scsi_Host *first_instance; /* linked list of 5380's */ ...@@ -290,36 +292,22 @@ static struct Scsi_Host *first_instance; /* linked list of 5380's */
#if defined(AUTOPROBE_IRQ) #if defined(AUTOPROBE_IRQ)
static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible); static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible);
#endif #endif
static void NCR5380_init(struct Scsi_Host *instance, int flags); static int NCR5380_init(struct Scsi_Host *instance, int flags);
static void NCR5380_information_transfer(struct Scsi_Host *instance); static void NCR5380_information_transfer(struct Scsi_Host *instance);
#ifndef DONT_USE_INTR #ifndef DONT_USE_INTR
static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs); static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs);
static void do_NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs);
#endif #endif
static void NCR5380_main(void); static void NCR5380_main(void *ptr);
static void NCR5380_print_options(struct Scsi_Host *instance); static void NCR5380_print_options(struct Scsi_Host *instance);
#ifdef NDEBUG
static void NCR5380_print_phase(struct Scsi_Host *instance); static void NCR5380_print_phase(struct Scsi_Host *instance);
static void NCR5380_print(struct Scsi_Host *instance); static void NCR5380_print(struct Scsi_Host *instance);
#ifndef NCR5380_abort
static
#endif #endif
int NCR5380_abort(Scsi_Cmnd * cmd); static int NCR5380_abort(Scsi_Cmnd * cmd);
#ifndef NCR5380_bus_reset static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
static static int NCR5380_host_reset(Scsi_Cmnd * cmd);
#endif static int NCR5380_device_reset(Scsi_Cmnd * cmd);
int NCR5380_bus_reset(Scsi_Cmnd * cmd); static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
#ifndef NCR5380_host_reset
static
#endif
int NCR5380_host_reset(Scsi_Cmnd * cmd);
#ifndef NCR5380_device_reset
static
#endif
int NCR5380_device_reset(Scsi_Cmnd * cmd);
#ifndef NCR5380_queue_command
static
#endif
int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
static void NCR5380_reselect(struct Scsi_Host *instance); static void NCR5380_reselect(struct Scsi_Host *instance);
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/delay.h>
#include "scsi.h" #include "scsi.h"
#include "hosts.h" #include "hosts.h"
...@@ -52,7 +53,7 @@ ...@@ -52,7 +53,7 @@
#include "NCR5380.c" #include "NCR5380.c"
int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { static int __init dmx3191d_detect(Scsi_Host_Template *tmpl) {
int boards = 0; int boards = 0;
struct Scsi_Host *instance = NULL; struct Scsi_Host *instance = NULL;
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
...@@ -90,7 +91,7 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { ...@@ -90,7 +91,7 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) {
instance->irq = pdev->irq; instance->irq = pdev->irq;
NCR5380_init(instance, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E); NCR5380_init(instance, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E);
if (request_irq(pdev->irq, dmx3191d_do_intr, SA_SHIRQ, if (request_irq(pdev->irq, dmx3191d_intr, SA_SHIRQ,
DMX3191D_DRIVER_NAME, instance)) { DMX3191D_DRIVER_NAME, instance)) {
printk(KERN_WARNING "dmx3191: IRQ %d not available - switching to polled mode.\n", pdev->irq); printk(KERN_WARNING "dmx3191: IRQ %d not available - switching to polled mode.\n", pdev->irq);
/* Steam powered scsi controllers run without an IRQ /* Steam powered scsi controllers run without an IRQ
...@@ -103,13 +104,13 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { ...@@ -103,13 +104,13 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) {
return boards; return boards;
} }
const char * dmx3191d_info(struct Scsi_Host *host) { static const char * dmx3191d_info(struct Scsi_Host *host) {
static const char *info ="Domex DMX3191D"; static const char *info ="Domex DMX3191D";
return info; return info;
} }
int dmx3191d_release_resources(struct Scsi_Host *instance) static int dmx3191d_release_resources(struct Scsi_Host *instance)
{ {
release_region(instance->io_port, DMX3191D_REGION); release_region(instance->io_port, DMX3191D_REGION);
if(instance->irq!=IRQ_NONE) if(instance->irq!=IRQ_NONE)
......
...@@ -20,16 +20,15 @@ ...@@ -20,16 +20,15 @@
#define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001 #define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001
#endif #endif
#ifndef ASM static int dmx3191d_abort(Scsi_Cmnd *);
int dmx3191d_abort(Scsi_Cmnd *); static int dmx3191d_detect(Scsi_Host_Template *);
int dmx3191d_detect(Scsi_Host_Template *); static const char* dmx3191d_info(struct Scsi_Host *);
const char* dmx3191d_info(struct Scsi_Host *); static int dmx3191d_proc_info(char *, char **, off_t, int, int, int);
int dmx3191d_proc_info(char *, char **, off_t, int, int, int); static int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int dmx3191d_release_resources(struct Scsi_Host *);
int dmx3191d_release_resources(struct Scsi_Host *); static int dmx3191d_bus_reset(Scsi_Cmnd *);
int dmx3191d_bus_reset(Scsi_Cmnd *); static int dmx3191d_host_reset(Scsi_Cmnd *);
int dmx3191d_host_reset(Scsi_Cmnd *); static int dmx3191d_device_reset(Scsi_Cmnd *);
int dmx3191d_device_reset(Scsi_Cmnd *);
#define DMX3191D { \ #define DMX3191D { \
...@@ -64,9 +63,9 @@ int dmx3191d_device_reset(Scsi_Cmnd *); ...@@ -64,9 +63,9 @@ int dmx3191d_device_reset(Scsi_Cmnd *);
#define NCR5380_intr dmx3191d_intr #define NCR5380_intr dmx3191d_intr
#define NCR5380_proc_info dmx3191d_proc_info #define NCR5380_proc_info dmx3191d_proc_info
#define NCR5380_queue_command dmx3191d_queue_command #define NCR5380_queue_command dmx3191d_queue_command
#define NCR5380_reset dmx3191d_reset #define NCR5380_host_reset dmx3191d_host_reset
#define NCR5380_bus_reset dmx3191d_bus_reset
#endif /* ASM */ #define NCR5380_device_reset dmx3191d_device_reset
#endif /* __DMX3191D_H */ #endif /* __DMX3191D_H */
This diff is collapsed.
...@@ -28,19 +28,16 @@ ...@@ -28,19 +28,16 @@
#ifndef DTC3280_H #ifndef DTC3280_H
#define DTC3280_H #define DTC3280_H
#ifndef ASM static int dtc_abort(Scsi_Cmnd *);
int dtc_abort(Scsi_Cmnd *); static int dtc_biosparam(Disk *, struct block_device *, int*);
int dtc_biosparam(Disk *, struct block_device *, int*); static int dtc_detect(Scsi_Host_Template *);
int dtc_detect(Scsi_Host_Template *); static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int dtc_bus_reset(Scsi_Cmnd *);
int dtc_reset(Scsi_Cmnd *, unsigned int reset_flags); static int dtc_device_reset(Scsi_Cmnd *);
int dtc_proc_info (char *buffer, char **start, off_t offset, static int dtc_host_reset(Scsi_Cmnd *);
static int dtc_proc_info (char *buffer, char **start, off_t offset,
int length, int hostno, int inout); int length, int hostno, int inout);
#ifndef NULL
#define NULL 0
#endif
#ifndef CMD_PER_LUN #ifndef CMD_PER_LUN
#define CMD_PER_LUN 2 #define CMD_PER_LUN 2
#endif #endif
...@@ -55,24 +52,26 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, ...@@ -55,24 +52,26 @@ int dtc_proc_info (char *buffer, char **start, off_t offset,
* macros when this is being used solely for the host stub. * macros when this is being used solely for the host stub.
*/ */
#define DTC3x80 { \ #define DTC3x80 { \
name: "DTC 3180/3280 ", \ name: "DTC 3180/3280 ", \
detect: dtc_detect, \ detect: dtc_detect, \
queuecommand: dtc_queue_command, \ queuecommand: dtc_queue_command, \
abort: dtc_abort, \ eh_abort_handler: dtc_abort, \
reset: dtc_reset, \ eh_bus_reset_handler: dtc_bus_reset, \
bios_param: dtc_biosparam, \ eh_device_reset_handler: dtc_device_reset, \
can_queue: CAN_QUEUE, \ eh_host_reset_handler: dtc_host_reset, \
this_id: 7, \ bios_param: dtc_biosparam, \
sg_tablesize: SG_ALL, \ can_queue: CAN_QUEUE, \
cmd_per_lun: CMD_PER_LUN , \ this_id: 7, \
sg_tablesize: SG_ALL, \
cmd_per_lun: CMD_PER_LUN , \
use_clustering: DISABLE_CLUSTERING} use_clustering: DISABLE_CLUSTERING}
#define NCR5380_implementation_fields \ #define NCR5380_implementation_fields \
volatile unsigned int base unsigned int base
#define NCR5380_local_declare() \ #define NCR5380_local_declare() \
volatile unsigned int base unsigned int base
#define NCR5380_setup(instance) \ #define NCR5380_setup(instance) \
base = (unsigned int)(instance)->base base = (unsigned int)(instance)->base
...@@ -105,12 +104,13 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, ...@@ -105,12 +104,13 @@ int dtc_proc_info (char *buffer, char **start, off_t offset,
isa_writeb(value, DTC_address(reg));} while(0) isa_writeb(value, DTC_address(reg));} while(0)
#endif #endif
#define NCR5380_intr dtc_intr #define NCR5380_intr dtc_intr
#define do_NCR5380_intr do_dtc_intr #define NCR5380_queue_command dtc_queue_command
#define NCR5380_queue_command dtc_queue_command #define NCR5380_abort dtc_abort
#define NCR5380_abort dtc_abort #define NCR5380_bus_reset dtc_bus_reset
#define NCR5380_reset dtc_reset #define NCR5380_device_reset dtc_device_reset
#define NCR5380_proc_info dtc_proc_info #define NCR5380_host_reset dtc_host_reset
#define NCR5380_proc_info dtc_proc_info
/* 15 12 11 10 /* 15 12 11 10
1001 1100 0000 0000 */ 1001 1100 0000 0000 */
...@@ -118,5 +118,4 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, ...@@ -118,5 +118,4 @@ int dtc_proc_info (char *buffer, char **start, off_t offset,
#define DTC_IRQS 0x9c00 #define DTC_IRQS 0x9c00
#endif /* ndef ASM */
#endif /* DTC3280_H */ #endif /* DTC3280_H */
...@@ -100,12 +100,6 @@ ...@@ -100,12 +100,6 @@
#define NCR5380_STATS #define NCR5380_STATS
#undef NCR5380_STAT_LIMIT #undef NCR5380_STAT_LIMIT
#endif #endif
#if defined(CONFIG_SCSI_G_NCR5380_PORT) && defined(CONFIG_SCSI_G_NCR5380_MEM)
#error You can not configure the Generic NCR 5380 SCSI Driver for memory mapped I/O and port mapped I/O at the same time (yet)
#endif
#if !defined(CONFIG_SCSI_G_NCR5380_PORT) && !defined(CONFIG_SCSI_G_NCR5380_MEM)
#error You must configure the Generic NCR 5380 SCSI Driver for one of memory mapped I/O and port mapped I/O.
#endif
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -121,6 +115,7 @@ ...@@ -121,6 +115,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/isapnp.h> #include <linux/isapnp.h>
#include <linux/delay.h>
#define NCR_NOT_SET 0 #define NCR_NOT_SET 0
static int ncr_irq = NCR_NOT_SET; static int ncr_irq = NCR_NOT_SET;
...@@ -143,8 +138,11 @@ static struct override { ...@@ -143,8 +138,11 @@ static struct override {
[1] __initdata = { { 0,},}; [1] __initdata = { { 0,},};
#endif #endif
#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) #define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override))
#ifndef MODULE
/** /**
* internal_setup - handle lilo command string override * internal_setup - handle lilo command string override
* @board: BOARD_* identifier for the board * @board: BOARD_* identifier for the board
...@@ -199,6 +197,7 @@ static void __init internal_setup(int board, char *str, int *ints) ...@@ -199,6 +197,7 @@ static void __init internal_setup(int board, char *str, int *ints)
} }
} }
/** /**
* do_NCR53C80_setup - set up entry point * do_NCR53C80_setup - set up entry point
* @str: unused * @str: unused
...@@ -270,6 +269,8 @@ static int __init do_DTC3181E_setup(char *str) ...@@ -270,6 +269,8 @@ static int __init do_DTC3181E_setup(char *str)
return 1; return 1;
} }
#endif
/** /**
* generic_NCR5380_detect - look for NCR5380 controllers * generic_NCR5380_detect - look for NCR5380 controllers
* @tpnt: the scsi template * @tpnt: the scsi template
...@@ -367,7 +368,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) ...@@ -367,7 +368,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
break; break;
} }
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
if (ports) { if (ports) {
/* wakeup sequence for the NCR53C400A and DTC3181E */ /* wakeup sequence for the NCR53C400A and DTC3181E */
...@@ -412,7 +413,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) ...@@ -412,7 +413,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
#endif #endif
instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
if (instance == NULL) { if (instance == NULL) {
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
release_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); release_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size);
#else #else
release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size);
...@@ -430,7 +431,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) ...@@ -430,7 +431,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
instance->irq = NCR5380_probe_irq(instance, 0xffff); instance->irq = NCR5380_probe_irq(instance, 0xffff);
if (instance->irq != IRQ_NONE) if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, do_generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) {
printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
instance->irq = IRQ_NONE; instance->irq = IRQ_NONE;
} }
...@@ -482,7 +483,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance) ...@@ -482,7 +483,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance)
NCR5380_local_declare(); NCR5380_local_declare();
NCR5380_setup(instance); NCR5380_setup(instance);
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
release_region(instance->NCR5380_instance_name, NCR5380_region_size); release_region(instance->NCR5380_instance_name, NCR5380_region_size);
#else #else
release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size); release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size);
...@@ -555,7 +556,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, ...@@ -555,7 +556,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
} }
while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY); while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY);
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
{ {
int i; int i;
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
...@@ -575,7 +576,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, ...@@ -575,7 +576,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
// FIXME - no timeout // FIXME - no timeout
} }
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
{ {
int i; int i;
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
...@@ -641,7 +642,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, ...@@ -641,7 +642,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
} }
while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)
; // FIXME - timeout ; // FIXME - timeout
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
{ {
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
NCR5380_write(C400_HOST_BUFFER, src[start + i]); NCR5380_write(C400_HOST_BUFFER, src[start + i]);
...@@ -657,7 +658,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, ...@@ -657,7 +658,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)
; // FIXME - no timeout ; // FIXME - no timeout
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
{ {
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
NCR5380_write(C400_HOST_BUFFER, src[start + i]); NCR5380_write(C400_HOST_BUFFER, src[start + i]);
...@@ -781,9 +782,8 @@ int generic_NCR5380_proc_info(char *buffer, char **start, off_t offset, int leng ...@@ -781,9 +782,8 @@ int generic_NCR5380_proc_info(char *buffer, char **start, off_t offset, int leng
#endif #endif
/* For now this is constant so we may walk it */ /* For now this is constant so we may walk it */
for (scsi_ptr = first_instance; scsi_ptr; scsi_ptr = scsi_ptr->next) scsi_ptr = scsi_host_hn_get(hostno);
if (scsi_ptr->host_no == hostno)
break;
NCR5380_setup(scsi_ptr); NCR5380_setup(scsi_ptr);
hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata; hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata;
......
...@@ -44,25 +44,19 @@ ...@@ -44,25 +44,19 @@
#endif #endif
#ifndef ASM #ifndef ASM
int generic_NCR5380_abort(Scsi_Cmnd *); static int generic_NCR5380_abort(Scsi_Cmnd *);
int generic_NCR5380_detect(Scsi_Host_Template *); static int generic_NCR5380_detect(Scsi_Host_Template *);
int generic_NCR5380_release_resources(struct Scsi_Host *); static int generic_NCR5380_release_resources(struct Scsi_Host *);
int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int generic_NCR5380_bus_reset(Scsi_Cmnd *); static int generic_NCR5380_bus_reset(Scsi_Cmnd *);
int generic_NCR5380_host_reset(Scsi_Cmnd *); static int generic_NCR5380_host_reset(Scsi_Cmnd *);
int generic_NCR5380_device_reset(Scsi_Cmnd *); static int generic_NCR5380_device_reset(Scsi_Cmnd *);
int notyet_generic_proc_info (char *buffer ,char **start, off_t offset, static int notyet_generic_proc_info (char *buffer ,char **start, off_t offset,
int length, int hostno, int inout); int length, int hostno, int inout);
const char* generic_NCR5380_info(struct Scsi_Host *); static const char* generic_NCR5380_info(struct Scsi_Host *);
#ifdef BIOSPARAM static int generic_NCR5380_biosparam(Disk *, struct block_device *, int *);
int generic_NCR5380_biosparam(Disk *, struct block_device *, int *);
#endif
int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout);
#ifndef NULL static int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout);
#define NULL 0
#endif
#ifndef CMD_PER_LUN #ifndef CMD_PER_LUN
#define CMD_PER_LUN 2 #define CMD_PER_LUN 2
...@@ -95,18 +89,13 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng ...@@ -95,18 +89,13 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng
#define __STRVAL(x) #x #define __STRVAL(x) #x
#define STRVAL(x) __STRVAL(x) #define STRVAL(x) __STRVAL(x)
#ifdef CONFIG_SCSI_G_NCR5380_PORT #ifndef CONFIG_SCSI_G_NCR5380_MEM
#define NCR5380_map_config port #define NCR5380_map_config port
#define NCR5380_map_type int #define NCR5380_map_type int
#define NCR5380_map_name port #define NCR5380_map_name port
#define NCR5380_instance_name io_port #define NCR5380_instance_name io_port
#define NCR53C400_register_offset 0 #define NCR53C400_register_offset 0
#define NCR53C400_address_adjust 8 #define NCR53C400_address_adjust 8
#ifdef NCR53C400 #ifdef NCR53C400
...@@ -122,27 +111,17 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng ...@@ -122,27 +111,17 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng
/* therefore CONFIG_SCSI_G_NCR5380_MEM */ /* therefore CONFIG_SCSI_G_NCR5380_MEM */
#define NCR5380_map_config memory #define NCR5380_map_config memory
#define NCR5380_map_type unsigned long #define NCR5380_map_type unsigned long
#define NCR5380_map_name base #define NCR5380_map_name base
#define NCR5380_instance_name base #define NCR5380_instance_name base
#define NCR53C400_register_offset 0x108 #define NCR53C400_register_offset 0x108
#define NCR53C400_address_adjust 0 #define NCR53C400_address_adjust 0
#define NCR53C400_mem_base 0x3880 #define NCR53C400_mem_base 0x3880
#define NCR53C400_host_buffer 0x3900 #define NCR53C400_host_buffer 0x3900
#define NCR5380_region_size 0x3a00 #define NCR5380_region_size 0x3a00
#define NCR5380_read(reg) isa_readb(NCR5380_map_name + NCR53C400_mem_base + (reg)) #define NCR5380_read(reg) isa_readb(NCR5380_map_name + NCR53C400_mem_base + (reg))
#define NCR5380_write(reg, value) isa_writeb(NCR5380_map_name + NCR53C400_mem_base + (reg), value) #define NCR5380_write(reg, value) isa_writeb(NCR5380_map_name + NCR53C400_mem_base + (reg), value)
#endif #endif
#define NCR5380_implementation_fields \ #define NCR5380_implementation_fields \
...@@ -155,7 +134,6 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng ...@@ -155,7 +134,6 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng
NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name) NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name)
#define NCR5380_intr generic_NCR5380_intr #define NCR5380_intr generic_NCR5380_intr
#define do_NCR5380_intr do_generic_NCR5380_intr
#define NCR5380_queue_command generic_NCR5380_queue_command #define NCR5380_queue_command generic_NCR5380_queue_command
#define NCR5380_abort generic_NCR5380_abort #define NCR5380_abort generic_NCR5380_abort
#define NCR5380_bus_reset generic_NCR5380_bus_reset #define NCR5380_bus_reset generic_NCR5380_bus_reset
......
/*
* There is probably a nicer way to do this but this one makes
* pretty obvious what is happening. We rebuild the same file with
* different options for mmio versus pio.
*/
#define SCSI_G_NCR5380_MEM
#include "g_NCR5380.c"
...@@ -118,6 +118,7 @@ ...@@ -118,6 +118,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/blk.h> #include <linux/blk.h>
#include <linux/delay.h>
#include "scsi.h" #include "scsi.h"
#include "hosts.h" #include "hosts.h"
#include "pas16.h" #include "pas16.h"
...@@ -450,7 +451,7 @@ int __init pas16_detect(Scsi_Host_Template * tpnt) ...@@ -450,7 +451,7 @@ int __init pas16_detect(Scsi_Host_Template * tpnt)
instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS);
if (instance->irq != IRQ_NONE) if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, do_pas16_intr, SA_INTERRUPT, "pas16", instance)) { if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "pas16", instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n", printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
instance->irq = IRQ_NONE; instance->irq = IRQ_NONE;
......
...@@ -114,14 +114,14 @@ ...@@ -114,14 +114,14 @@
#ifndef ASM #ifndef ASM
int pas16_abort(Scsi_Cmnd *); static int pas16_abort(Scsi_Cmnd *);
int pas16_biosparam(Disk *, struct block_device *, int*); static int pas16_biosparam(Disk *, struct block_device *, int*);
int pas16_detect(Scsi_Host_Template *); static int pas16_detect(Scsi_Host_Template *);
int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int pas16_bus_reset(Scsi_Cmnd *); static int pas16_bus_reset(Scsi_Cmnd *);
int pas16_host_reset(Scsi_Cmnd *); static int pas16_host_reset(Scsi_Cmnd *);
int pas16_device_reset(Scsi_Cmnd *); static int pas16_device_reset(Scsi_Cmnd *);
int pas16_proc_info (char *buffer ,char **start, off_t offset, static int pas16_proc_info (char *buffer ,char **start, off_t offset,
int length, int hostno, int inout); int length, int hostno, int inout);
#ifndef NULL #ifndef NULL
......
...@@ -120,6 +120,7 @@ ...@@ -120,6 +120,7 @@
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h>
static struct override { static struct override {
unsigned long address; unsigned long address;
...@@ -247,7 +248,7 @@ int __init t128_detect(Scsi_Host_Template * tpnt){ ...@@ -247,7 +248,7 @@ int __init t128_detect(Scsi_Host_Template * tpnt){
instance->irq = NCR5380_probe_irq(instance, T128_IRQS); instance->irq = NCR5380_probe_irq(instance, T128_IRQS);
if (instance->irq != IRQ_NONE) if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, do_t128_intr, SA_INTERRUPT, "t128", instance)) { if (request_irq(instance->irq, t128_intr, SA_INTERRUPT, "t128", instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n", printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
instance->irq = IRQ_NONE; instance->irq = IRQ_NONE;
......
...@@ -91,14 +91,14 @@ ...@@ -91,14 +91,14 @@
#define T_DATA_REG_OFFSET 0x1e00 /* rw 512 bytes long */ #define T_DATA_REG_OFFSET 0x1e00 /* rw 512 bytes long */
#ifndef ASM #ifndef ASM
int t128_abort(Scsi_Cmnd *); static int t128_abort(Scsi_Cmnd *);
int t128_biosparam(Disk *, struct block_device *, int*); static int t128_biosparam(Disk *, struct block_device *, int*);
int t128_detect(Scsi_Host_Template *); static int t128_detect(Scsi_Host_Template *);
int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int t128_host_reset(Scsi_Cmnd *); static int t128_host_reset(Scsi_Cmnd *);
int t128_bus_reset(Scsi_Cmnd *); static int t128_bus_reset(Scsi_Cmnd *);
int t128_device_reset(Scsi_Cmnd *); static int t128_device_reset(Scsi_Cmnd *);
int t128_proc_info (char *buffer, char **start, off_t offset, static int t128_proc_info (char *buffer, char **start, off_t offset,
int length, int hostno, int inout); int length, int hostno, int inout);
#ifndef NULL #ifndef NULL
...@@ -166,7 +166,7 @@ int t128_proc_info (char *buffer, char **start, off_t offset, ...@@ -166,7 +166,7 @@ int t128_proc_info (char *buffer, char **start, off_t offset,
#define do_NCR5380_intr do_t128_intr #define do_NCR5380_intr do_t128_intr
#define NCR5380_queue_command t128_queue_command #define NCR5380_queue_command t128_queue_command
#define NCR5380_abort t128_abort #define NCR5380_abort t128_abort
#define NCR5380_host_reset t128_hostreset #define NCR5380_host_reset t128_host_reset
#define NCR5380_device_reset t128_device_reset #define NCR5380_device_reset t128_device_reset
#define NCR5380_bus_reset t128_bus_reset #define NCR5380_bus_reset t128_bus_reset
#define NCR5380_proc_info t128_proc_info #define NCR5380_proc_info t128_proc_info
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment