The 53c700 Driver Notes

General Description

This driver supports the 53c700 and 53c700-66 chips. It also supportsthe 53c710 but only in 53c700 emulation mode. It is full featured anddoes sync (-66 and 710 only), disconnects and tag command queueing.

Since the 53c700 must be interfaced to a bus, you need to wrapper thecard detector around this driver. For an example, see theNCR_D700.[ch] or lasi700.[ch] files.

The comments in the 53c700.[ch] files tell you which parts you need tofill in to get the driver working.

Compile Time Flags

A compile time flag is:

CONFIG_53C700_LE_ON_BE

define if the chipset must be supported in little endian mode on a bigendian architecture (used for the 700 on parisc).

Using the Chip Core Driver

In order to plumb the 53c700 chip core driver into a working SCSIdriver, you need to know three things about the way the chip is wiredinto your system (or expansion card).

  1. The clock speed of the SCSI core
  2. The interrupt line used
  3. The memory (or io space) location of the 53c700 registers.

Optionally, you may also need to know other things, like how to readthe SCSI Id from the card bios or whether the chip is wired fordifferential operation.

Usually you can find items 2. and 3. from general spec. documents oreven by examining the configuration of a working driver under anotheroperating system.

The clock speed is usually buried deep in the technical literature.It is required because it is used to set up both the synchronous andasynchronous dividers for the chip. As a general rule of thumb,manufacturers set the clock speed at the lowest possible settingconsistent with the best operation of the chip (although some chooseto drive it off the CPU or bus clock rather than going to the expenseof an extra clock chip). The best operation clock speeds are:

53c70025MHz
53c700-6650MHz
53c71040Mhz

Writing Your Glue Driver

This will be a standard SCSI driver (I don’t know of a good documentdescribing this, just copy from some other driver) with at least adetect and release entry.

In the detect routine, you need to allocate a structNCR_700_Host_Parameters sized memory area and clear it (so that thedefault values for everything are 0). Then you must fill in theparameters that matter to you (see below), plumb the NCR_700_intrroutine into the interrupt line and call NCR_700_detect with the hosttemplate and the new parameters as arguments. You should also callthe relevant request_*_region function and place the register baseaddress into the ‘base’ pointer of the host parameters.

In the release routine, you must free the NCR_700_Host_Parameters thatyou allocated, call the corresponding release_*_region and free theinterrupt.

Handling Interrupts

In general, you should just plumb the card’s interrupt line in with

request_irq(irq, NCR_700_intr, <irq flags>, <driver name>, host);

where host is the return from the relevant NCR_700_detect() routine.

You may also write your own interrupt handling routine which callsNCR_700_intr() directly. However, you should only really do this ifyou have a card with more than one chip on it and you can read aregister to tell which set of chips wants the interrupt.

Settable NCR_700_Host_Parameters

The following are a list of the user settable parameters:

clock: (MANDATORY)
Set to the clock speed of the chip in MHz.
base: (MANDATORY)
Set to the base of the io or mem region for the register set. On 64bit architectures this is only 32 bits wide, so the registers must bemapped into the low 32 bits of memory.
pci_dev: (OPTIONAL)
Set to the PCI board device. Leave NULL for a non-pci board. This isused for the pci_alloc_consistent() and pci_map_*() functions.
dmode_extra: (OPTIONAL, 53c710 only)
Extra flags for the DMODE register. These are used to control busoutput pins on the 710. The settings should be a combination ofDMODE_FC1 and DMODE_FC2. What these pins actually do is entirely upto the board designer. Usually it is safe to ignore this setting.
differential: (OPTIONAL)
Set to 1 if the chip drives a differential bus.
force_le_on_be: (OPTIONAL, only if CONFIG_53C700_LE_ON_BE is set)
Set to 1 if the chip is operating in little endian mode on a bigendian architecture.
chip710: (OPTIONAL)
Set to 1 if the chip is a 53c710.
burst_disable: (OPTIONAL, 53c710 only)
Disable 8 byte bursting for DMA transfers.