Commit 4249e4ba authored by Linus Torvalds's avatar Linus Torvalds

Merge http://linux-scsi.bkbits.net/scsi-for-linus-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 3cf172fe 755b8d21
...@@ -1346,6 +1346,7 @@ int ata_attach(ide_drive_t *drive) ...@@ -1346,6 +1346,7 @@ int ata_attach(ide_drive_t *drive)
spin_unlock(&drivers_lock); spin_unlock(&drivers_lock);
spin_lock(&drives_lock); spin_lock(&drives_lock);
list_add_tail(&drive->list, &ata_unused); list_add_tail(&drive->list, &ata_unused);
drive->gendev.driver = NULL;
spin_unlock(&drives_lock); spin_unlock(&drives_lock);
return 1; return 1;
} }
...@@ -2308,6 +2309,8 @@ void ide_unregister_driver(ide_driver_t *driver) ...@@ -2308,6 +2309,8 @@ void ide_unregister_driver(ide_driver_t *driver)
list_del(&driver->drivers); list_del(&driver->drivers);
spin_unlock(&drivers_lock); spin_unlock(&drivers_lock);
driver_unregister(&driver->gen_driver);
while(!list_empty(&driver->drives)) { while(!list_empty(&driver->drives)) {
drive = list_entry(driver->drives.next, ide_drive_t, list); drive = list_entry(driver->drives.next, ide_drive_t, list);
if (driver->cleanup(drive)) { if (driver->cleanup(drive)) {
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#ifndef _53C700_H #ifndef _53C700_H
#define _53C700_H #define _53C700_H
#include <asm/io.h>
/* Turn on for general debugging---too verbose for normal use */ /* Turn on for general debugging---too verbose for normal use */
#undef NCR_700_DEBUG #undef NCR_700_DEBUG
/* Debug the tag queues, checking hash queue allocation and deallocation /* Debug the tag queues, checking hash queue allocation and deallocation
......
...@@ -964,6 +964,16 @@ config SCSI_SYM53C8XX_2 ...@@ -964,6 +964,16 @@ config SCSI_SYM53C8XX_2
Please read <file:drivers/scsi/sym53c8xx_2/Documentation.txt> for more Please read <file:drivers/scsi/sym53c8xx_2/Documentation.txt> for more
information. information.
config SCSI_ZALON
tristate "Zalon SCSI support"
depends on GSC && SCSI
help
The Zalon is a GSC/HSC bus interface chip that sits between the
PA-RISC processor and the NCR 53c720 SCSI controller on C100,
C110, J200, J210 and some D, K & R-class machines. It's also
used on the add-in Bluefish, Barracuda & Shrike SCSI cards.
Say Y here if you have one of these machines or cards.
config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE
int "DMA addressing mode" int "DMA addressing mode"
depends on SCSI_SYM53C8XX_2 depends on SCSI_SYM53C8XX_2
...@@ -1068,7 +1078,7 @@ config SCSI_SYM53C8XX ...@@ -1068,7 +1078,7 @@ config SCSI_SYM53C8XX
config SCSI_NCR53C8XX_DEFAULT_TAGS config SCSI_NCR53C8XX_DEFAULT_TAGS
int "default tagged command queue depth" int "default tagged command queue depth"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON)
default "8" default "8"
---help--- ---help---
"Tagged command queuing" is a feature of SCSI-2 which improves "Tagged command queuing" is a feature of SCSI-2 which improves
...@@ -1094,7 +1104,7 @@ config SCSI_NCR53C8XX_DEFAULT_TAGS ...@@ -1094,7 +1104,7 @@ config SCSI_NCR53C8XX_DEFAULT_TAGS
config SCSI_NCR53C8XX_MAX_TAGS config SCSI_NCR53C8XX_MAX_TAGS
int "maximum number of queued commands" int "maximum number of queued commands"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON)
default "32" default "32"
---help--- ---help---
This option allows you to specify the maximum number of commands This option allows you to specify the maximum number of commands
...@@ -1111,7 +1121,7 @@ config SCSI_NCR53C8XX_MAX_TAGS ...@@ -1111,7 +1121,7 @@ config SCSI_NCR53C8XX_MAX_TAGS
config SCSI_NCR53C8XX_SYNC config SCSI_NCR53C8XX_SYNC
int "synchronous transfers frequency in MHz" int "synchronous transfers frequency in MHz"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON)
default "20" default "20"
---help--- ---help---
The SCSI Parallel Interface-2 Standard defines 5 classes of transfer The SCSI Parallel Interface-2 Standard defines 5 classes of transfer
...@@ -1145,7 +1155,7 @@ config SCSI_NCR53C8XX_SYNC ...@@ -1145,7 +1155,7 @@ config SCSI_NCR53C8XX_SYNC
config SCSI_NCR53C8XX_PROFILE config SCSI_NCR53C8XX_PROFILE
bool "enable profiling" bool "enable profiling"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON)
help help
This option allows you to enable profiling information gathering. This option allows you to enable profiling information gathering.
These statistics are not very accurate due to the low frequency These statistics are not very accurate due to the low frequency
...@@ -1156,7 +1166,7 @@ config SCSI_NCR53C8XX_PROFILE ...@@ -1156,7 +1166,7 @@ config SCSI_NCR53C8XX_PROFILE
config SCSI_NCR53C8XX_IOMAPPED config SCSI_NCR53C8XX_IOMAPPED
bool "use normal IO" bool "use normal IO"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) && !SCSI_ZALON
help help
If you say Y here, the driver will use normal IO, as opposed to If you say Y here, the driver will use normal IO, as opposed to
memory mapped IO. Memory mapped IO has less latency than normal IO memory mapped IO. Memory mapped IO has less latency than normal IO
...@@ -1181,7 +1191,7 @@ config SCSI_NCR53C8XX_PQS_PDS ...@@ -1181,7 +1191,7 @@ config SCSI_NCR53C8XX_PQS_PDS
config SCSI_NCR53C8XX_NO_DISCONNECT config SCSI_NCR53C8XX_NO_DISCONNECT
bool "not allow targets to disconnect" bool "not allow targets to disconnect"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) && SCSI_NCR53C8XX_DEFAULT_TAGS=0 depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON) && SCSI_NCR53C8XX_DEFAULT_TAGS=0
help help
This option is only provided for safety if you suspect some SCSI This option is only provided for safety if you suspect some SCSI
device of yours to not support properly the target-disconnect device of yours to not support properly the target-disconnect
...@@ -1191,7 +1201,7 @@ config SCSI_NCR53C8XX_NO_DISCONNECT ...@@ -1191,7 +1201,7 @@ config SCSI_NCR53C8XX_NO_DISCONNECT
config SCSI_NCR53C8XX_SYMBIOS_COMPAT config SCSI_NCR53C8XX_SYMBIOS_COMPAT
bool "assume boards are SYMBIOS compatible (EXPERIMENTAL)" bool "assume boards are SYMBIOS compatible (EXPERIMENTAL)"
depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX) && EXPERIMENTAL depends on PCI && SCSI_SYM53C8XX_2!=y && (SCSI_NCR53C8XX || SCSI_SYM53C8XX || SCSI_ZALON) && EXPERIMENTAL
---help--- ---help---
This option allows you to enable some features depending on GPIO This option allows you to enable some features depending on GPIO
wiring. These General Purpose Input/Output pins can be used for wiring. These General Purpose Input/Output pins can be used for
......
...@@ -84,6 +84,7 @@ obj-$(CONFIG_SCSI_NCR53C7xx) += 53c7,8xx.o ...@@ -84,6 +84,7 @@ obj-$(CONFIG_SCSI_NCR53C7xx) += 53c7,8xx.o
obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/ obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/
obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o
obj-$(CONFIG_SCSI_NCR53C8XX) += ncr53c8xx.o obj-$(CONFIG_SCSI_NCR53C8XX) += ncr53c8xx.o
obj-$(CONFIG_SCSI_ZALON) += zalon7xx.o
obj-$(CONFIG_SCSI_EATA_DMA) += eata_dma.o obj-$(CONFIG_SCSI_EATA_DMA) += eata_dma.o
obj-$(CONFIG_SCSI_EATA_PIO) += eata_pio.o obj-$(CONFIG_SCSI_EATA_PIO) += eata_pio.o
obj-$(CONFIG_SCSI_7000FASST) += wd7000.o obj-$(CONFIG_SCSI_7000FASST) += wd7000.o
...@@ -135,6 +136,7 @@ sd_mod-objs := sd.o ...@@ -135,6 +136,7 @@ sd_mod-objs := sd.o
sr_mod-objs := sr.o sr_ioctl.o sr_vendor.o sr_mod-objs := sr.o sr_ioctl.o sr_vendor.o
initio-objs := ini9100u.o i91uscsi.o initio-objs := ini9100u.o i91uscsi.o
a100u2w-objs := inia100.o i60uscsi.o a100u2w-objs := inia100.o i60uscsi.o
zalon7xx-objs := zalon.o ncr53c8xx.o
cpqfc-objs := cpqfcTSinit.o cpqfcTScontrol.o cpqfcTSi2c.o \ cpqfc-objs := cpqfcTSinit.o cpqfcTScontrol.o cpqfcTSi2c.o \
cpqfcTSworker.o cpqfcTStrigger.o cpqfcTSworker.o cpqfcTStrigger.o
......
...@@ -289,6 +289,7 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co ...@@ -289,6 +289,7 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co
pc->timeout = jiffies + WAIT_READY; pc->timeout = jiffies + WAIT_READY;
/* NOTE! Save the failed packet command in "rq->buffer" */ /* NOTE! Save the failed packet command in "rq->buffer" */
rq->buffer = (void *) failed_command->special; rq->buffer = (void *) failed_command->special;
pc->scsi_cmd = ((idescsi_pc_t *) failed_command->special)->scsi_cmd;
if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) { if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) {
printk ("ide-scsi: %s: queue cmd = ", drive->name); printk ("ide-scsi: %s: queue cmd = ", drive->name);
hexdump(pc->c, 6); hexdump(pc->c, 6);
...@@ -590,6 +591,7 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi, int id) ...@@ -590,6 +591,7 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi, int id)
set_bit(IDESCSI_LOG_CMD, &scsi->log); set_bit(IDESCSI_LOG_CMD, &scsi->log);
#endif /* IDESCSI_DEBUG_LOG */ #endif /* IDESCSI_DEBUG_LOG */
idescsi_add_settings(drive); idescsi_add_settings(drive);
DRIVER(drive)->busy--;
} }
static int idescsi_cleanup (ide_drive_t *drive) static int idescsi_cleanup (ide_drive_t *drive)
...@@ -876,7 +878,8 @@ int idescsi_abort (Scsi_Cmnd *cmd) ...@@ -876,7 +878,8 @@ int idescsi_abort (Scsi_Cmnd *cmd)
/* is cmd active? /* is cmd active?
* need to lock so this stuff doesn't change under us */ * need to lock so this stuff doesn't change under us */
spin_lock_irqsave(&ide_lock, flags); spin_lock_irqsave(&ide_lock, flags);
if (scsi->pc && scsi->pc->scsi_cmd->serial_number == cmd->serial_number) { if (scsi->pc && scsi->pc->scsi_cmd &&
scsi->pc->scsi_cmd->serial_number == cmd->serial_number) {
/* yep - let's give it some more time - /* yep - let's give it some more time -
* we can do that, we're in _our_ error kernel thread */ * we can do that, we're in _our_ error kernel thread */
spin_unlock_irqrestore(&ide_lock, flags); spin_unlock_irqrestore(&ide_lock, flags);
...@@ -995,7 +998,7 @@ static void __exit exit_idescsi_module(void) ...@@ -995,7 +998,7 @@ static void __exit exit_idescsi_module(void)
for (id = 0; id < MAX_HWIFS * MAX_DRIVES; id++) { for (id = 0; id < MAX_HWIFS * MAX_DRIVES; id++) {
drive = idescsi_drives[id]; drive = idescsi_drives[id];
if (drive) if (drive)
DRIVER(drive)->busy--; DRIVER(drive)->busy = 0;
} }
scsi_unregister (idescsi_host); scsi_unregister (idescsi_host);
device_unregister(&idescsi_primary); device_unregister(&idescsi_primary);
......
This diff is collapsed.
...@@ -349,28 +349,9 @@ ...@@ -349,28 +349,9 @@
#define IPS_SCSI_MP3_Removeable 0x04 #define IPS_SCSI_MP3_Removeable 0x04
#define IPS_SCSI_MP3_AllocateSurface 0x08 #define IPS_SCSI_MP3_AllocateSurface 0x08
/*
* Configuration Structure Flags
*/
#define IPS_CFG_USEROPT_UPDATECOUNT(cfg) (((cfg)->UserOpt & 0xffff000) >> 16)
#define IPS_CFG_USEROPT_CONCURSTART(cfg) (((cfg)->UserOpt & 0xf000) >> 12)
#define IPS_CFG_USEROPT_STARTUPDELAY(cfg) (((cfg)->UserOpt & 0xf00) >> 8)
#define IPS_CFG_USEROPT_REARRANGE(cfg) ((cfg)->UserOpt & 0x80)
#define IPS_CFG_USEROPT_CDBOOT(cfg) ((cfg)->UserOpt & 0x40)
#define IPS_CFG_USEROPT_CLUSTER(cfg) ((cfg)->UserOpt & 0x20)
/*
* Host adapter Flags (bit numbers)
*/
#define IPS_IN_INTR 0
#define IPS_IN_ABORT 1
#define IPS_IN_RESET 2
/* /*
* SCB Flags * SCB Flags
*/ */
#define IPS_SCB_ACTIVE 0x00001
#define IPS_SCB_WAITING 0x00002
#define IPS_SCB_MAP_SG 0x00008 #define IPS_SCB_MAP_SG 0x00008
#define IPS_SCB_MAP_SINGLE 0X00010 #define IPS_SCB_MAP_SINGLE 0X00010
...@@ -381,7 +362,6 @@ ...@@ -381,7 +362,6 @@
#define IPS_COPPIOCCMD (('C'<<8) | 66) #define IPS_COPPIOCCMD (('C'<<8) | 66)
#define IPS_NUMCTRLS (('C'<<8) | 68) #define IPS_NUMCTRLS (('C'<<8) | 68)
#define IPS_CTRLINFO (('C'<<8) | 69) #define IPS_CTRLINFO (('C'<<8) | 69)
#define IPS_FLASHBIOS (('C'<<8) | 70)
/* flashing defines */ /* flashing defines */
#define IPS_FW_IMAGE 0x00 #define IPS_FW_IMAGE 0x00
...@@ -406,36 +386,7 @@ ...@@ -406,36 +386,7 @@
/* /*
* Scsi_Host Template * Scsi_Host Template
*/ */
#if LINUX_VERSION_CODE < LinuxVersionCode(2,4,0) #if LINUX_VERSION_CODE < LinuxVersionCode(2,5,0)
#define IPS { \
.module = NULL, \
.proc_info = NULL, \
.proc_dir = NULL, \
.name = NULL, \
.detect = ips_detect, \
.release = ips_release, \
.info = ips_info, \
.command = NULL, \
.queuecommand = ips_queue, \
.eh_strategy_handler = NULL, \
.eh_abort_handler = ips_eh_abort, \
.eh_device_reset_handler = NULL, \
.eh_bus_reset_handler = NULL, \
.eh_host_reset_handler = ips_eh_reset, \
.abort = NULL, \
.reset = NULL, \
.slave_attach = NULL, \
.bios_param = ips_biosparam,\
.can_queue = 0, \
.this_id = -1, \
.sg_tablesize = IPS_MAX_SG, \
.cmd_per_lun = 3, \
.present = 0, \
.unchecked_isa_dma = 0, \
.use_clustering = ENABLE_CLUSTERING, \
.use_new_eh_code = 1 \
}
#elif LINUX_VERSION_CODE < LinuxVersionCode(2,5,0)
#define IPS{ \ #define IPS{ \
.module = NULL, \ .module = NULL, \
.proc_info = NULL, \ .proc_info = NULL, \
...@@ -1005,19 +956,6 @@ typedef struct { ...@@ -1005,19 +956,6 @@ typedef struct {
int option_value; int option_value;
} IPS_OPTION; } IPS_OPTION;
typedef struct {
void *userbuffer;
uint32_t usersize;
void *kernbuffer;
uint32_t kernsize;
void *ha;
void *SC;
void *pt;
struct semaphore *sem;
uint32_t offset;
uint32_t retcode;
} IPS_FLASH_DATA;
/* /*
* Status Info * Status Info
*/ */
......
...@@ -50,8 +50,8 @@ ...@@ -50,8 +50,8 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/parisc-device.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <asm/gsc.h>
#include <linux/module.h> #include <linux/module.h>
......
This diff is collapsed.
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/blk.h> #include <linux/blk.h>
#include <linux/blkpg.h> #include <linux/blkpg.h>
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h>
#include "scsi.h" #include "scsi.h"
#include "hosts.h" #include "hosts.h"
......
...@@ -265,6 +265,7 @@ static inline struct xpt_quehead *xpt_remque_tail(struct xpt_quehead *head) ...@@ -265,6 +265,7 @@ static inline struct xpt_quehead *xpt_remque_tail(struct xpt_quehead *head)
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0) #if LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0)
typedef struct pci_dev *pcidev_t; typedef struct pci_dev *pcidev_t;
typedef struct device *device_t;
#define PCIDEV_NULL (0) #define PCIDEV_NULL (0)
#define PciBusNumber(d) (d)->bus->number #define PciBusNumber(d) (d)->bus->number
#define PciDeviceFn(d) (d)->devfn #define PciDeviceFn(d) (d)->devfn
...@@ -312,6 +313,7 @@ pci_get_base_address(struct pci_dev *pdev, int index, u_long *base) ...@@ -312,6 +313,7 @@ pci_get_base_address(struct pci_dev *pdev, int index, u_long *base)
#else /* Incomplete emulation of current PCI code for pre-2.2 kernels */ #else /* Incomplete emulation of current PCI code for pre-2.2 kernels */
typedef unsigned int pcidev_t; typedef unsigned int pcidev_t;
typedef unsinged int device_t;
#define PCIDEV_NULL (~0u) #define PCIDEV_NULL (~0u)
#define PciBusNumber(d) ((d)>>8) #define PciBusNumber(d) ((d)>>8)
#define PciDeviceFn(d) ((d)&0xff) #define PciDeviceFn(d) ((d)&0xff)
...@@ -564,7 +566,7 @@ static void MDELAY(long ms) { while (ms--) UDELAY(1000); } ...@@ -564,7 +566,7 @@ static void MDELAY(long ms) { while (ms--) UDELAY(1000); }
#define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1) #define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1)
typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */ typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */
typedef pcidev_t m_bush_t; /* Something that addresses DMAable */ typedef struct device *m_bush_t; /* Something that addresses DMAable */
typedef struct m_link { /* Link between free memory chunks */ typedef struct m_link { /* Link between free memory chunks */
struct m_link *next; struct m_link *next;
...@@ -793,7 +795,7 @@ static m_addr_t ___dma_getp(m_pool_s *mp) ...@@ -793,7 +795,7 @@ static m_addr_t ___dma_getp(m_pool_s *mp)
vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB"); vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB");
if (vbp) { if (vbp) {
dma_addr_t daddr; dma_addr_t daddr;
vp = (m_addr_t) pci_alloc_consistent(mp->bush, vp = (m_addr_t) dma_alloc_coherent(mp->bush,
PAGE_SIZE<<MEMO_PAGE_ORDER, PAGE_SIZE<<MEMO_PAGE_ORDER,
&daddr); &daddr);
if (vp) { if (vp) {
...@@ -822,7 +824,7 @@ static void ___dma_freep(m_pool_s *mp, m_addr_t m) ...@@ -822,7 +824,7 @@ static void ___dma_freep(m_pool_s *mp, m_addr_t m)
if (*vbpp) { if (*vbpp) {
vbp = *vbpp; vbp = *vbpp;
*vbpp = (*vbpp)->next; *vbpp = (*vbpp)->next;
pci_free_consistent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER, dma_free_coherent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,
(void *)vbp->vaddr, (dma_addr_t)vbp->baddr); (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
__m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
--mp->nump; --mp->nump;
...@@ -917,11 +919,11 @@ static m_addr_t __vtobus(m_bush_t bush, void *m) ...@@ -917,11 +919,11 @@ static m_addr_t __vtobus(m_bush_t bush, void *m)
#endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
#define _m_calloc_dma(np, s, n) __m_calloc_dma(np->pdev, s, n) #define _m_calloc_dma(np, s, n) __m_calloc_dma(np->dev, s, n)
#define _m_free_dma(np, p, s, n) __m_free_dma(np->pdev, p, s, n) #define _m_free_dma(np, p, s, n) __m_free_dma(np->dev, p, s, n)
#define m_calloc_dma(s, n) _m_calloc_dma(np, s, n) #define m_calloc_dma(s, n) _m_calloc_dma(np, s, n)
#define m_free_dma(p, s, n) _m_free_dma(np, p, s, n) #define m_free_dma(p, s, n) _m_free_dma(np, p, s, n)
#define _vtobus(np, p) __vtobus(np->pdev, p) #define _vtobus(np, p) __vtobus(np->dev, p)
#define vtobus(p) _vtobus(np, p) #define vtobus(p) _vtobus(np, p)
/* /*
...@@ -932,10 +934,10 @@ static m_addr_t __vtobus(m_bush_t bush, void *m) ...@@ -932,10 +934,10 @@ static m_addr_t __vtobus(m_bush_t bush, void *m)
/* Linux versions prior to pci bus iommu kernel interface */ /* Linux versions prior to pci bus iommu kernel interface */
#define __unmap_scsi_data(pdev, cmd) do {; } while (0) #define __unmap_scsi_data(dev, cmd) do {; } while (0)
#define __map_scsi_single_data(pdev, cmd) (__vtobus(pdev,(cmd)->request_buffer)) #define __map_scsi_single_data(dev, cmd) (__vtobus(dev,(cmd)->request_buffer))
#define __map_scsi_sg_data(pdev, cmd) ((cmd)->use_sg) #define __map_scsi_sg_data(dev, cmd) ((cmd)->use_sg)
#define __sync_scsi_data(pdev, cmd) do {; } while (0) #define __sync_scsi_data(dev, cmd) do {; } while (0)
#define scsi_sg_dma_address(sc) vtobus((sc)->address) #define scsi_sg_dma_address(sc) vtobus((sc)->address)
#define scsi_sg_dma_len(sc) ((sc)->length) #define scsi_sg_dma_len(sc) ((sc)->length)
...@@ -948,31 +950,34 @@ static m_addr_t __vtobus(m_bush_t bush, void *m) ...@@ -948,31 +950,34 @@ static m_addr_t __vtobus(m_bush_t bush, void *m)
#define __data_mapped SCp.phase #define __data_mapped SCp.phase
#define __data_mapping SCp.have_data_in #define __data_mapping SCp.have_data_in
static void __unmap_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd) static void __unmap_scsi_data(device_t dev, Scsi_Cmnd *cmd)
{ {
int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); enum dma_data_direction dma_dir =
(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);
switch(cmd->__data_mapped) { switch(cmd->__data_mapped) {
case 2: case 2:
pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); dma_unmap_sg(dev, cmd->buffer, cmd->use_sg, dma_dir);
break; break;
case 1: case 1:
pci_unmap_single(pdev, cmd->__data_mapping, dma_unmap_single(dev, cmd->__data_mapping,
cmd->request_bufflen, dma_dir); cmd->request_bufflen, dma_dir);
break; break;
} }
cmd->__data_mapped = 0; cmd->__data_mapped = 0;
} }
static u_long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd) static u_long __map_scsi_single_data(device_t dev, Scsi_Cmnd *cmd)
{ {
dma_addr_t mapping; dma_addr_t mapping;
int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); enum dma_data_direction dma_dir =
(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);
if (cmd->request_bufflen == 0) if (cmd->request_bufflen == 0)
return 0; return 0;
mapping = pci_map_single(pdev, cmd->request_buffer, mapping = dma_map_single(dev, cmd->request_buffer,
cmd->request_bufflen, dma_dir); cmd->request_bufflen, dma_dir);
cmd->__data_mapped = 1; cmd->__data_mapped = 1;
cmd->__data_mapping = mapping; cmd->__data_mapping = mapping;
...@@ -980,31 +985,33 @@ static u_long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd) ...@@ -980,31 +985,33 @@ static u_long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd)
return mapping; return mapping;
} }
static int __map_scsi_sg_data(pcidev_t pdev, Scsi_Cmnd *cmd) static int __map_scsi_sg_data(device_t dev, Scsi_Cmnd *cmd)
{ {
int use_sg; int use_sg;
int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); enum dma_data_direction dma_dir =
(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);
if (cmd->use_sg == 0) if (cmd->use_sg == 0)
return 0; return 0;
use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, dma_dir);
cmd->__data_mapped = 2; cmd->__data_mapped = 2;
cmd->__data_mapping = use_sg; cmd->__data_mapping = use_sg;
return use_sg; return use_sg;
} }
static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd) static void __sync_scsi_data(device_t dev, Scsi_Cmnd *cmd)
{ {
int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); enum dma_data_direction dma_dir =
(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);
switch(cmd->__data_mapped) { switch(cmd->__data_mapped) {
case 2: case 2:
pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); dma_sync_sg(dev, cmd->buffer, cmd->use_sg, dma_dir);
break; break;
case 1: case 1:
pci_dma_sync_single(pdev, cmd->__data_mapping, dma_sync_single(dev, cmd->__data_mapping,
cmd->request_bufflen, dma_dir); cmd->request_bufflen, dma_dir);
break; break;
} }
...@@ -1015,10 +1022,10 @@ static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd) ...@@ -1015,10 +1022,10 @@ static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)
#endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
#define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->pdev, cmd) #define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd)
#define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->pdev, cmd) #define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->dev, cmd)
#define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->pdev, cmd) #define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd)
#define sync_scsi_data(np, cmd) __sync_scsi_data(np->pdev, cmd) #define sync_scsi_data(np, cmd) __sync_scsi_data(np->dev, cmd)
/*========================================================== /*==========================================================
** **
...@@ -1140,7 +1147,7 @@ typedef struct { ...@@ -1140,7 +1147,7 @@ typedef struct {
**========================================================== **==========================================================
*/ */
typedef struct { typedef struct {
pcidev_t pdev; device_t dev;
ncr_slot slot; ncr_slot slot;
ncr_chip chip; ncr_chip chip;
ncr_nvram *nvram; ncr_nvram *nvram;
...@@ -2486,7 +2493,7 @@ sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device) ...@@ -2486,7 +2493,7 @@ sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device)
/* /*
** Initialise ncr_device structure with items required by ncr_attach. ** Initialise ncr_device structure with items required by ncr_attach.
*/ */
device->pdev = pdev; device->dev = &pdev->dev;
device->slot.bus = PciBusNumber(pdev); device->slot.bus = PciBusNumber(pdev);
device->slot.device_fn = PciDeviceFn(pdev); device->slot.device_fn = PciDeviceFn(pdev);
device->slot.base = base; device->slot.base = base;
......
...@@ -51,6 +51,13 @@ ...@@ -51,6 +51,13 @@
** NVRAM detection and reading. ** NVRAM detection and reading.
** Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk> ** Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
** **
** Added support for MIPS big endian systems.
** Carsten Langgaard, carstenl@mips.com
** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
**
** Added support for HP PARISC big endian systems.
** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
**
******************************************************************************* *******************************************************************************
*/ */
...@@ -78,8 +85,10 @@ ...@@ -78,8 +85,10 @@
/* /*
* No more an option, enabled by default. * No more an option, enabled by default.
*/ */
#ifndef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT #ifndef ENABLE_SCSI_ZALON
#define CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT # ifndef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
# define CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
# endif
#endif #endif
/* /*
...@@ -181,6 +190,8 @@ ...@@ -181,6 +190,8 @@
#endif #endif
#elif defined(__sparc__) #elif defined(__sparc__)
#undef SCSI_NCR_IOMAPPED #undef SCSI_NCR_IOMAPPED
#elif defined(__hppa__) && defined(ENABLE_SCSI_ZALON)
#undef SCSI_NCR_IOMAPPED
#endif #endif
/* /*
...@@ -379,16 +390,24 @@ ...@@ -379,16 +390,24 @@
#define readb_raw readb #define readb_raw readb
#define writeb_raw writeb #define writeb_raw writeb
#if defined(__hppa__) #if defined(SCSI_NCR_BIG_ENDIAN)
#define readw_l2b(a) le16_to_cpu(readw(a)) #define readw_l2b __raw_readw
#define readl_l2b(a) le32_to_cpu(readl(a)) #define readl_l2b __raw_readl
#define writew_b2l(v,a) writew(cpu_to_le16(v),a) #define writew_b2l __raw_writew
#define writel_b2l(v,a) writel(cpu_to_le32(v),a) #define writel_b2l __raw_writel
#else /* Other bid-endian */ #define readw_raw __raw_readw
#define readl_raw(a) __raw_readl((unsigned long)(a))
#define writew_raw __raw_writew
#define writel_raw(v,a) __raw_writel(v,(unsigned long)(a))
#else /* Other big-endian */
#define readw_l2b readw #define readw_l2b readw
#define readl_l2b readl #define readl_l2b readl
#define writew_b2l writew #define writew_b2l writew
#define writel_b2l writel #define writel_b2l writel
#define readw_raw readw
#define readl_raw readl
#define writew_raw writew
#define writel_raw writel
#endif #endif
#else /* little endian */ #else /* little endian */
...@@ -417,9 +436,11 @@ ...@@ -417,9 +436,11 @@
#endif #endif
#endif #endif
#if !defined(__hppa__) && !defined(__mips__)
#ifdef SCSI_NCR_BIG_ENDIAN #ifdef SCSI_NCR_BIG_ENDIAN
#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported" #error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
#endif #endif
#endif
/* /*
...@@ -572,10 +593,20 @@ ...@@ -572,10 +593,20 @@
#else #else
#ifdef ENABLE_SCSI_ZALON
/* Only 8 or 32 bit transfers allowed */
#define INW_OFF(o) (readb((char *)np->reg + ncr_offw(o)) << 8 | readb((char *)np->reg + ncr_offw(o) + 1))
#else
#define INW_OFF(o) readw_raw((char *)np->reg + ncr_offw(o)) #define INW_OFF(o) readw_raw((char *)np->reg + ncr_offw(o))
#endif
#define INL_OFF(o) readl_raw((char *)np->reg + (o)) #define INL_OFF(o) readl_raw((char *)np->reg + (o))
#ifdef ENABLE_SCSI_ZALON
/* Only 8 or 32 bit transfers allowed */
#define OUTW_OFF(o, val) do { writeb((char)((val) >> 8), (char *)np->reg + ncr_offw(o)); writeb((char)(val), (char *)np->reg + ncr_offw(o) + 1); } while (0)
#else
#define OUTW_OFF(o, val) writew_raw((val), (char *)np->reg + ncr_offw(o)) #define OUTW_OFF(o, val) writew_raw((val), (char *)np->reg + ncr_offw(o))
#endif
#define OUTL_OFF(o, val) writel_raw((val), (char *)np->reg + (o)) #define OUTL_OFF(o, val) writel_raw((val), (char *)np->reg + (o))
#endif #endif
...@@ -623,6 +654,10 @@ ...@@ -623,6 +654,10 @@
** NCR53C8XX Device Ids ** NCR53C8XX Device Ids
*/ */
#ifndef PSEUDO_ZALON_720_ID
#define PSEUDO_ZALON_720_ID 0x5a00
#endif
#ifndef PCI_DEVICE_ID_NCR_53C810 #ifndef PCI_DEVICE_ID_NCR_53C810
#define PCI_DEVICE_ID_NCR_53C810 1 #define PCI_DEVICE_ID_NCR_53C810 1
#endif #endif
...@@ -726,6 +761,9 @@ typedef struct { ...@@ -726,6 +761,9 @@ typedef struct {
#define FE_DAC (1<<24) /* Support DAC cycles (64 bit addressing) */ #define FE_DAC (1<<24) /* Support DAC cycles (64 bit addressing) */
#define FE_ISTAT1 (1<<25) /* Have ISTAT1, MBOX0, MBOX1 registers */ #define FE_ISTAT1 (1<<25) /* Have ISTAT1, MBOX0, MBOX1 registers */
#define FE_DAC_IN_USE (1<<26) /* Platform does DAC cycles */ #define FE_DAC_IN_USE (1<<26) /* Platform does DAC cycles */
#define FE_EHP (1<<27) /* 720: Even host parity */
#define FE_MUX (1<<28) /* 720: Multiplexed bus */
#define FE_EA (1<<29) /* 720: Enable Ack */
#define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP) #define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
#define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_ULTRA2|FE_DBLR|FE_QUAD|F_CLK80) #define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_ULTRA2|FE_DBLR|FE_QUAD|F_CLK80)
...@@ -747,6 +785,9 @@ typedef struct { ...@@ -747,6 +785,9 @@ typedef struct {
#define SCSI_NCR_CHIP_TABLE \ #define SCSI_NCR_CHIP_TABLE \
{ \ { \
{PSEUDO_ZALON_720_ID, 0x0f, "720", 3, 8, 4, \
FE_WIDE|FE_DIFF|FE_EHP|FE_MUX|FE_EA} \
, \
{PCI_DEVICE_ID_NCR_53C810, 0x0f, "810", 4, 8, 4, \ {PCI_DEVICE_ID_NCR_53C810, 0x0f, "810", 4, 8, 4, \
FE_ERL} \ FE_ERL} \
, \ , \
...@@ -819,6 +860,7 @@ typedef struct { ...@@ -819,6 +860,7 @@ typedef struct {
*/ */
#define SCSI_NCR_CHIP_IDS \ #define SCSI_NCR_CHIP_IDS \
{ \ { \
PSEUDO_ZALON_720_ID, \
PCI_DEVICE_ID_NCR_53C810, \ PCI_DEVICE_ID_NCR_53C810, \
PCI_DEVICE_ID_NCR_53C815, \ PCI_DEVICE_ID_NCR_53C815, \
PCI_DEVICE_ID_NCR_53C820, \ PCI_DEVICE_ID_NCR_53C820, \
...@@ -1170,6 +1212,7 @@ struct ncr_reg { ...@@ -1170,6 +1212,7 @@ struct ncr_reg {
/*17*/ u_char nc_mbox1; /* 896 and later cores only */ /*17*/ u_char nc_mbox1; /* 896 and later cores only */
/*18*/ u_char nc_ctest0; /*18*/ u_char nc_ctest0;
#define EHP 0x04 /* 720 even host parity */
/*19*/ u_char nc_ctest1; /*19*/ u_char nc_ctest1;
/*1a*/ u_char nc_ctest2; /*1a*/ u_char nc_ctest2;
...@@ -1187,6 +1230,7 @@ struct ncr_reg { ...@@ -1187,6 +1230,7 @@ struct ncr_reg {
/*20*/ u_char nc_dfifo; /*20*/ u_char nc_dfifo;
/*21*/ u_char nc_ctest4; /*21*/ u_char nc_ctest4;
#define MUX 0x80 /* 720 host bus multiplex mode */
#define BDIS 0x80 /* mod: burst disable */ #define BDIS 0x80 /* mod: burst disable */
#define MPEE 0x08 /* mod: master parity error enable */ #define MPEE 0x08 /* mod: master parity error enable */
...@@ -1219,6 +1263,7 @@ struct ncr_reg { ...@@ -1219,6 +1263,7 @@ struct ncr_reg {
#define CLSE 0x80 /* mod: cache line size enable */ #define CLSE 0x80 /* mod: cache line size enable */
#define PFF 0x40 /* cmd: pre-fetch flush */ #define PFF 0x40 /* cmd: pre-fetch flush */
#define PFEN 0x20 /* mod: pre-fetch enable */ #define PFEN 0x20 /* mod: pre-fetch enable */
#define EA 0x20 /* mod: 720 enable-ack */
#define SSM 0x10 /* mod: single step mode */ #define SSM 0x10 /* mod: single step mode */
#define IRQM 0x08 /* mod: irq mode (1 = totem pole !) */ #define IRQM 0x08 /* mod: irq mode (1 = totem pole !) */
#define STD 0x04 /* cmd: start dma mode */ #define STD 0x04 /* cmd: start dma mode */
...@@ -1261,6 +1306,7 @@ struct ncr_reg { ...@@ -1261,6 +1306,7 @@ struct ncr_reg {
/*4e*/ u_char nc_stest2; /*4e*/ u_char nc_stest2;
#define ROF 0x40 /* reset scsi offset (after gross error!) */ #define ROF 0x40 /* reset scsi offset (after gross error!) */
#define DIF 0x20 /* 720 SCSI differential mode */
#define EXT 0x02 /* extended filtering */ #define EXT 0x02 /* extended filtering */
/*4f*/ u_char nc_stest3; /*4f*/ u_char nc_stest3;
...@@ -1439,12 +1485,22 @@ struct scr_tblmove { ...@@ -1439,12 +1485,22 @@ struct scr_tblmove {
#define SCR_SEL_TBL 0x42000000 #define SCR_SEL_TBL 0x42000000
#define SCR_SEL_TBL_ATN 0x43000000 #define SCR_SEL_TBL_ATN 0x43000000
#ifdef SCSI_NCR_BIG_ENDIAN
struct scr_tblsel {
u_char sel_scntl3;
u_char sel_id;
u_char sel_sxfer;
u_char sel_scntl4;
};
#else
struct scr_tblsel { struct scr_tblsel {
u_char sel_scntl4; u_char sel_scntl4;
u_char sel_sxfer; u_char sel_sxfer;
u_char sel_id; u_char sel_id;
u_char sel_scntl3; u_char sel_scntl3;
}; };
#endif
#define SCR_JMP_REL 0x04000000 #define SCR_JMP_REL 0x04000000
#define SCR_ID(id) (((u_int32)(id)) << 16) #define SCR_ID(id) (((u_int32)(id)) << 16)
......
/*
* Zalon 53c7xx device driver.
* By Richard Hirst (rhirst@linuxcare.com)
*/
#include <linux/init.h>
#include <linux/types.h>
#include <linux/stat.h>
#include <linux/mm.h>
#include <linux/blk.h>
#include <linux/sched.h>
#include <linux/version.h>
#include <linux/config.h>
#include <linux/module.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/irq.h>
#include <asm/hardware.h>
#include <asm/delay.h>
#include <asm/io.h>
#include "../parisc/gsc.h"
#include "scsi.h"
#include "hosts.h"
/*
* ** Define the BSD style u_int32 and u_int64 type.
* ** Are in fact u_int32_t and u_int64_t :-)
* */
typedef u32 u_int32;
typedef u64 u_int64;
typedef u_long vm_offset_t;
#include "zalon.h"
/* hosts_* are kluges to pass info between the zalon7xx_detected()
** and the register_parisc_driver() callbacks.
*/
static Scsi_Host_Template *hosts_tptr;
static int hosts_used=0;
static int zalon_id = 0;
extern int zalon_attach(Scsi_Host_Template *tpnt,
unsigned long base_addr,
struct parisc_device *dev,
int irq_vector,
int unit
);
#if 0
/* FIXME:
* Is this function dead code? or is someone planning on using it in the
* future. The clock = (int) pdc_result[16] does not look correct to
* me ... I think it should be iodc_data[16]. Since this cause a compile
* error with the new encapsulated PDC, I'm not compiling in this function.
* - RB
*/
/* poke SCSI clock out of iodc data */
static u8 iodc_data[32] __attribute__ ((aligned (64)));
static unsigned long pdc_result[32] __attribute__ ((aligned (16))) ={0,0,0,0};
static int
lasi_scsi_clock(void * hpa, int defaultclock)
{
int clock, status;
status = pdc_iodc_read(&pdc_result, hpa, 0, &iodc_data, 32 );
if (status == PDC_RET_OK) {
clock = (int) pdc_result[16];
} else {
printk(KERN_WARNING "%s: pdc_iodc_read returned %d\n", __FUNCTION__, status);
clock = defaultclock;
}
printk(KERN_DEBUG "%s: SCSI clock %d\n", __FUNCTION__, clock);
return clock;
}
#endif
static int __init
zalon_scsi_callback(struct parisc_device *dev)
{
struct gsc_irq gsc_irq;
u32 zalon_vers;
int irq;
unsigned long zalon = dev->hpa;
__raw_writel(CMD_RESET, zalon + IO_MODULE_IO_COMMAND);
while (!(__raw_readl(zalon + IO_MODULE_IO_STATUS) & IOSTATUS_RY))
;
__raw_writel(IOIIDATA_MINT5EN | IOIIDATA_PACKEN | IOIIDATA_PREFETCHEN,
zalon + IO_MODULE_II_CDATA);
/* XXX: Save the Zalon version for bug workarounds? */
zalon_vers = __raw_readl(dev->hpa + IO_MODULE_II_CDATA) & 0x07000000;
zalon_vers >>= 24;
/* Setup the interrupts first.
** Later on request_irq() will register the handler.
*/
irq = gsc_alloc_irq(&gsc_irq);
printk("%s: Zalon vers field is 0x%x, IRQ %d\n", __FUNCTION__,
zalon_vers, irq);
__raw_writel(gsc_irq.txn_addr | gsc_irq.txn_data, dev->hpa + IO_MODULE_EIM);
if ( zalon_vers == 0)
printk(KERN_WARNING "%s: Zalon 1.1 or earlier\n", __FUNCTION__);
/*
** zalon_attach: returns -1 on failure, 0 on success
*/
hosts_used = zalon_attach(hosts_tptr, dev->hpa + GSC_SCSI_ZALON_OFFSET,
dev, irq, zalon_id);
if (hosts_used == 0)
zalon_id++;
hosts_used = (hosts_used == 0);
return (hosts_used == 0);
}
static struct parisc_device_id zalon_tbl[] = {
{ HPHW_A_DMA, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00089 },
{ 0, }
};
MODULE_DEVICE_TABLE(parisc, zalon_tbl);
static struct parisc_driver zalon_driver = {
.name = "GSC SCSI (Zalon)",
.id_table = zalon_tbl,
.probe = zalon_scsi_callback,
};
int zalon7xx_detect(Scsi_Host_Template *tpnt)
{
/* "pass" the parameter to the callback functions */
hosts_tptr = tpnt;
hosts_used = 0;
/* claim all zalon cards. */
register_parisc_driver(&zalon_driver);
/* Check if any callbacks actually found/claimed anything. */
return (hosts_used != 0);
}
#ifdef MODULE
extern int ncr53c8xx_release(struct Scsi_Host *host);
int zalon7xx_release(struct Scsi_Host *host)
{
ncr53c8xx_release(host);
unregister_parisc_driver(&zalon_driver);
return 1;
}
#endif
#ifndef ZALON7XX_H
#define ZALON7XX_H
#include <linux/types.h>
#include "sym53c8xx_defs.h"
extern int zalon7xx_detect(Scsi_Host_Template *);
#include <scsi/scsicam.h>
extern struct proc_dir_entry proc_scsi_zalon7xx;
/* borrowed from drivers/scsi/ncr53c8xx.h */
int zalon7xx_detect(Scsi_Host_Template *tpnt);
const char *ncr53c8xx_info(struct Scsi_Host *host);
int ncr53c8xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
#ifdef MODULE
int zalon7xx_release(struct Scsi_Host *);
#else
#define zalon7xx_release NULL
#endif
#define GSC_SCSI_ZALON_OFFSET 0x800
#define IO_MODULE_EIM (1*4)
#define IO_MODULE_DC_ADATA (2*4)
#define IO_MODULE_II_CDATA (3*4)
#define IO_MODULE_IO_COMMAND (12*4)
#define IO_MODULE_IO_STATUS (13*4)
#define IOSTATUS_RY 0x40
#define IOSTATUS_FE 0x80
#define IOIIDATA_SMINT5L 0x40000000
#define IOIIDATA_MINT5EN 0x20000000
#define IOIIDATA_PACKEN 0x10000000
#define IOIIDATA_PREFETCHEN 0x08000000
#define IOIIDATA_IOII 0x00000020
#define CMD_RESET 5
#endif /* ZALON7XX_H */
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