This section gives specific information about the various host adapters that are supported in some way or another under Linux.
Drivers in the distribution kernel :
Adaptec 152x, Adaptec 154x (including clones from Bustek and DTC 329x boards), Adaptec 174x, Adaptec 274x/284x/2940, EATA-DMA protocol compilant boards (all DPT PMXXXXX/XX and SKXXXXX/XX except the PM2001, some boards from NEC and ATT), Future Domain 850, 885, 950, and other boards in that series (but not the 840, 841, 880, and 881 boards unless you make the appropriate patch), Future Domain 16x0 with TMC-1800, TMC-18C30, or TMC-18C50 chips, NCR53c8xx,PAS16 SCSI ports, Seagate ST0x, Trantor T128/T130/T228 boards, Ultrastor 14F, 24F, and 34F, and Western Digital 7000.
Alpha drivers: Richoh GSI-8
Many of the ALPHA drivers are available via anonymous FTP from ftp://tsx-11.mit.edu:/pub/Linux/ALPHA/scsi
Drivers that are being developed, but aren't publically available yet, and modifications needed to make existing drivers compatible with other boards: DPT PM2001
Announcements WILL be made when drivers are available for public alpha testing. Until then, please don't use up the developers' valuable time with mail asking for release dates, etc.
SCSI hosts that will not work :
SCSI hosts that will NEVER work:
If you want to run Linux on an unsupported piece of hardware, your options are to either write a driver yourself (Eric Youngdale and I are usually willing to answer technical questions concerning the Linux SCSI drivers) or to commision a driver.
With some host adapters (see buyers guide : Buyers' Guide : Feature Comparison), you can use multiple host adapters of the same type in the same system. With multiple adapters of the same type in the same system, generally the one at the lowest address will be scsi0, the one at the next address scsi1, etc.
In all cases, it is possible to use multiple host adapters of different types, provided that none of their addresses conflict. SCSI controllers are scanned in the order specified in the builtin_scsi_hosts[ ]array in drivers/scsi/hosts.c, with the order currently being
In most cases (ie, you aren't trying to use both Buslogic and Adaptec drivers), this can be changed to suit your needs (ie, keeping the same devices when new SCSI devices are added to the system on a new controller) by moving the individual entries.
Make sure interrupts are enabled correctly, and there are no IRQ, DMA, or address conflicts with other boards.
BIOS for autoprobe.
If your SCSI adapter is one of the following :
and it is not detected on bootup, ie you get a
scsi : 0 hosts
message or a
scsi%d : type
message is not printed for each supported SCSI adapter installed in the system, you may have a problem with the autoprobe routine not knowing about your board.
Autodetection will fail for drivers using the BIOS for autodetection if the BIOS is disabled. Double check that your BIOS is enabled, and not conflicting with any other peripherial BIOSes.
Autodetection will also fail if the board's ``signature'' and/or BIOS address don't match known ones.
If the BIOS is installed, please use DOS and DEBUG to find a signature that will detect your board -
Ie, if your board lives at 0xc8000, under DOS do
debug
d c800:0
q
and send a message to the SCSI channel of the mailing list with the ASCII message, with the length and offset from the base address (ie, 0xc8000). Note that the exact text is required, and you should provide both the hex and ASCII portions of the text.
If no BIOS is installed, and you are using an Adaptec 152x, Trantor T128, or Seagate driver, you can use command line or compile time overrides to force detection.
Please consult the appropriate subsection for your SCSI board as well as general flaky .
(This include the Trantor T128 and Seagate boards, but not the Adaptec, Generic NCR5380, PAS16, and Ultrastor drivers)
This is often caused when the memory mapped I/O ports are incorrectly cached. You should have the board's address space marked as uncachable in the XCMOS settings.
If this is not possible, you will have to disable cache entirely.
If you have manually specified the address of the board, remember that Linux needs the actual address of the board, and not the 16 byte segment the documentation may refer to. Ie, 0xc8000 would be correct, 0xc800 would not work and could cause memory corruption.
an ALPHA driver boot floppy
You'll need to edit the binary image of the kernel (before or after writing it out to disk), and modify a few two byte fields (little endian) to guarantee that it will work on your system.
3.5" : 0xA0 0x05
5.25" : 0xB0 0x04
dd or rawrite the file to a disk. Insert the disk in the first floppy drive, wait until it prompts you to insert the root disk, and insert the root floppy from your distribution.
You need to start with the version of the kernel used by the driver author. This revision may be alluded to in the documentation included with the driver.
Various recent kernel revisions can be found at ftp://nic.funet.fi/pub/OS/Linux/PEOPLE/Linus
as linux-version.tar.gz
They are also mirrored at tsx-11.mit.edu and various other sites.
cd to /usr/src.
Remove your old Linux sources, if you want to keep a backup copy of them
mv linux linux-old
Untar the archive
gunzip <linux-0.99.12.tar.gz | tar xvfp -
Apply the patches. The patches will be relative to some directory in the filesystem. By examining the output file lines in the patch file (grep for ˆ---), you can tell where this is - ie patches with these lines
--- ./kernel/blk_drv/scsi/Makefile
--- ./config.in Wed Sep 1 16:19:33 1993
would have the files relative to /usr/src/linux.
Untar the driver sources at an appropriate place - you can type
tar tfv patches.tar
to get a listing, and move files as necessary (The SCSI driver files should live in /usr/src/linux/kernel/drivers/scsi).
Either cd to the directory they are relative to and type
patch -p0 <patch_file
or tell patch to strip off leading path components. Ie, if the files started with
--- linux-new/kernel/blk_drv/scsi/Makefile
and you wanted to apply them while in /usr/src/linux, you could cd to /usr/src/linux and type
patch -p1 < patches
to strip off the ``linux-new'' component.
After you have applied the patches, look for any patch rejects, which will be the name of the rejected file with a # suffix appended.
find /usr/src/linux/ -name ``*#'' -print
If any of these exist, look at them. In some cases, the differences will be in RCS identifiers and will be harmless, in other cases, you'll have to manually apply important parts. Documentation on diffs files and patch is beyond the scope of this document.
See also canb kernel : Configuring and building the kernel
In some cases, a driver author may not offer patches with the .c and .h files which comprise his driver, or the patches may be against an older revision of the kernel and not go in cleanly.
* SCSI low-level drivers
section, add a boolean configuration variable for your
driver. Ie,
bool 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 y
ifdef CONFIG_SCSI_IN2000 SCSI_OBS := $(SCSI_OBJS) in2000.o SCSI_SRCS := $(SCSI_SRCS) in2000.c endif
scsi.a: $(SCSI_OBJS)
#ifdef CONFIG_SCSI_GENERIC_NCR5380 #include ``g_NCR5380.h'' #endif
#ifdef CONFIG_SCSI_IN2000 #include ``in2000.h'' #endif
#define IN2000 {``Always IN2000'', in2000_detect, \ in2000_info, in2000_command, \ in2000_queuecommand, \ in2000_abort, \ in2000_reset, \ NULL, \ in2000_biosparam, \ 1, 7, IN2000_SG, 1, 0, 0}
#ifdef CONFIG_SCSI_GENERIC_NCR5380 GENERIC_NCR5380, #endif
#ifdef CONFIG_SCSI_IN2000 IN2000, #endif
0xd8000, 0xdc000, 0xd0000, 0xd4000, 0xc8000, 0xcc000, 0xe0000, 0xe4000.
0x140, 0x340
9, 10, 11, 12
is not used.
port mapped
Works with many boards with an installed BIOS. All other boards, including the Adaptec 1510, and Sound Blaster16 SCSI must use a kernel command line or compile time override.
None
Define PORTBASE, IRQ, SCSI_ID, RECONNECT as appropriate, see Defines
aha152x=< PORTBASE> ,< IRQ> ,< SCSI-ID> ,< RECONNECT> Usually, SCSI-ID will be 7 and RECONNECT non-zero. To force detection at 0x340, IRQ 11, at SCSI-ID 7, allowing disconnect/reconnect, you would use the following command line option :
aha152x=0x340,11,7,1
The driver fails with VLB boards. There was a timing problem in kernels older than revision 1.0.5.
use configuration the controller reports (only 152x)
override interrupt channel (9,10,11 or 12) (default 11)
override scsiid of AIC-6260 (0-7) (default 7)
override target dis-/reconnection/multiple
set to non-zero to enable, zero to disable.
Don't register ports (pl12 and below)
Don't test for BIOS signature (AHA-1510 or disabled BIOS)
Force port base. Don't try to probe
0x330 and 0x334
9, 10, 11, 12, 14, 15
5, 6, 7
port mapped, bus master
works with all supported configurations, does not require an installed BIOS.
none
No suffix boards, and early 'A' suffix boards do not support scatter/gather, and thus don't work. However, they can be made to work for some definition of the word works if AHA1542_SCATTER is changed to 0 in drivers/scsi/aha1542.h.
Buslogic makes a series of boards that are software compatible with the Adaptec 1542, and these come in ISA, VLB and EISA flavors.
1-8
EISA board, not applicable
9, 10, 11, 12, 14, 15
EISA board, not applicable
port mapped, bus master
works with all supported configurations
none
This board has been discontinued by Adaptec.
Newer revisions may be available at ftp://ftp.cpsc.ucalgary.ca/pub/systems/linux/aha274x/aha274x-pre-alpha.tar.gz
Supported Configurations:
1-12
ALL
port mapped, bus master
All
All
All
PCI
BIOS MUST be enabled
The B channel on 2742AT boards is ignored.
ALPHA driver available at ftp://tsx-11.mit.edu/pub/linux/ALPHA/SCSI/in2000 The driver is in2000.tar.z, bootable kernel zImage
0x100, 0x110, 0x200, 0x220
10, 11, 14, 15
not used
port mapped
BIOS not required
none
all, that support the EATA-DMA protocol (no PM2001).
PM2011 PM2012A PM2012B
PM2021 PM2022 PM2024 PM2122 PM2124 PM2322
PM3021 PM3222 PM3224 many of those boards are also available as SKXXXX versions, which are supported as well.
ALL
ALL
ALL level & edge triggered
ISA ALL, EISA/PCI not applicable
port mapped, bus master
ALL
works with all supported configurations
diskgeometry in eata_dma.h for unusual disk geometries which came from the usage of the old DPTFMT utility. The latest version of the EATA-DMA driver and a Slackware bootdisk should be available on: ftp://ftp.uni-mainz.de/pub/Linux/arch/i386/system/EATA/
hd.c: ST-506 interface disk with more than 16 heads detected,
probably due to non-standard sector translation. Giving up.
(disk % d: cyl=% d, sect=63, head=64)
hdc: probing with STATUS instead of ALTSTATUS
hdc: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdc: cannot handle disk with 0 physical heads
hdd: probing with STATUS instead of ALTSTATUS
hdd: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdd: cannot handle disk with 0 physical heads
If the IDE driver gets into trouble because of this, ie. you can't
access your (real) IDE hardware, change the IO Port and/or the IRQ of
the EATA board.
2.0, 3.0, 3.2, 3.4, 3.5
0xc8000, 0xca000, 0xce000, 0xde000
0x140, 0x150, 0x160, 0x170
3, 5, 10, 11, 12, 14, 15
not used
port mapped
works with all supported configurations, requires installed BIOS
none
all
all
not used
port mapped
none
Define GENERIC_NCR5380_OVERRIDE to be an array of tupples with port, irq, dma, board type - ie
#define GENERIC_NCR5380_OVERRIDE {{0x330, 5, DMA_NONE, BOARD_NCR5380}}
for a NCR5380 board at port 330, IRQ 5.
#define GENERIC_NCR5380_OVERRIDE {{0x350, 5, DMA_NONE, BOARD_NCR53C400}}
for a T130B at port 0x350.
Older versions of the code eliminate the BOARD_* entry.
The symbolic IRQs IRQ_NONE and IRQ_AUTO may be used.
ncr53480=0x358,254
on the kernel command line.
the generic driver doesn't support DMA yet, and pseudo-DMA isn't supported in the generic driver.
ALL
ALL
PCI, not applicable
port mapped, busmastering
requires PCI BIOS, uses PCI BIOS routines to search for devices and read configuration space
The driver uses the pre-programmed values in some registers for initialization, so a BIOS must be installed.
0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000
3, 5
not used
memory mapped
probes for address only, IRQ is assumed to be 5, requires installed BIOS.
Define OVERRIDE to be the base address, CONTROLLER to FD or SEAGATE as appropriate, and IRQ to the IRQ.
st0x=address,irq or tmc8xx=address,irq
(only works for .99.13b and newer)
There are command timeouts when Linux attempts to read the partition table or do other disk access.
The board ships with the defaults set up for MSDOS, ie interrupts are disabled. To jumper the board for interrupts, on the Seagate use jumper W3 (ST01) or JP3 (ST02) and short pins F-G to select IRQ 5.
The driver can't handle some devices, particularly cheap SCSI tapes and CDROMs.
The Seagate ties the SCSI bus REQ/ACK handshaking into the PC bus IO CHANNEL READY and (optionally) 0WS signals. Unfortunately, it doesn't tell you when the watchdog timer runs out, and you have no way of knowing for certain that REQ went low, and may end up seeing one REQ pulse as multiple REQ pulses.
Dealing with this means using a tight loop to look for REQ to go low, with a timeout incase you don't catch the transition due to an interrupt, etc. This results in a performance decrease, so it would be undesireable to apply this to all SCSI devices. Instead, it is selected on a per-device basis with the ``borken'' field for the given SCSI device in the SCSI_devices array. If you run into problems, you should try adding your device to the list of devices for which borken is not reset to zero (currently, only the TENEX CDROM drives).
A future domain board (specific examples include the 840,841, 880, and 881) doesn't work.
A few of the Future domain boards use the Seagate register mapping, and have the MSG and CD bits of the status register flipped.
You should edit seagate.h, swapping the definitions for STAT_MSG and STAT_CD, and recompile the kernel with CONTROLLER defined to SEAGATE and an appropriate IRQ and OVERRIDE specified.
When attempting to fdisk your drive, you get error messages indicating that the HDIO_REQ or HDIO_GETGEO ioctl failed, or
You must set heads sectors and cylinders. You can do this from the extra functions menu.
See Section partitioning : Partitioning
After manually specifying the drive geometry, subsequent attempts to read the partition table result in partition boundary not on a cylinder boundary, physical and logical boundaries don't match, etc. error messages.
See Section partitioning : Partitioning
Some systems which worked prior to .99.13 fail with newer versions of Linux. Older versions of Linux assigned the CONTROL and DATA registers in an order different than that outlined in the Seagate documentation, which broke on some systems. Newer versions make the assignment in the correct way, but this breaks other systems.
The code in seagate.c looks like this now :
cli(); DATA = (unsigned char) ((1 <<target) | \ (controller_type == SEAGATE ? 0x80 : 0x40)); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); sti();
Changing this to
cli(); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); DATA = (unsigned char) ((1 <<target) | (controller_type == SEAGATE ? 0x80 : 0x40)); sti()
FAST or FAST32 will use blind transfers where possible
ARBITRATE will cause the host adapter to arbitrate for the bus for better SCSI-II compatability, rather than just waiting for BUS FREE and then doing its thing. Should let us do one command per Lun when I integrate my reorganization changes into the distribution sources.
SLOW_HANDSHAKE will allow compatability with broken devices that don't handshake fast enough (ie, some CD ROM's) for the Seagate code.
SLOW_RATE=x, x some number will let you specify a default transfer rate if handshaking isn't working correctly.
0x388, 0x384, 0x38x, 0x288
10, 12, 14, 15
IRQ MUST be different from the IRQ used for the sound portion of the board.
not used for the SCSI portion of the board
port mapped
does not require BIOS
Define PAS16_OVERRIDE to be an array of port, irq tupples. Ie
#define PAS16_OVERRIDE {{0x388, 10}}
for a board at port 0x388, IRQ 10.
pas16=port,irq
0xcc000, 00xc8000, 0xdc000, 0xd8000
not used.
memory mapped
works for all supported configurations, requires installed BIOS.
Define T128_OVERRIDE to be an array of address, irq tupples. Ie
#define T128_OVERRIDE {{0xcc000, 5}}
for a board at address 0xcc000, IRQ 5.
The symbolic IRQs IRQ_NONE and IRQ_AUTO may be used.
t128=address,irq
-1 may be used for no irq, -2 for irq autoprobe.
if defined, REQUEST SENSE will be performed automatically for commands that return with a CHECK CONDITION status.
enables PSEUDO-DMA hardware, should give a 3-4X performance increase compared to polled I/O.
enable parity checking. Not supported
enable support for SCSI-II tagged queueing. Untested
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.
enable support for devices that don't disconnect. Untested.
0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340
10, 11, 14, 15
5, 6, 7
port mapped, bus master
does not work for boards at port 0x310, BIOS not required.
compile time only, define PORT_OVERRIDE
hd=cylinders,heads,sectors
to override the default setting to bootstrap yourself,
keeping number of cylinders < = 2048, number of heads < = 16,
and number of sectors < = 255 such that cylinders * heads * sectors
is the same for both mappings.
You'll also have to manually specify the disk geometry when running
fdisk under Linux. Failure to do so will result in incorrect
partition entries being written, which will work correctly with Linux
but fail under MSDOS which looks at the cylinder/head/sector entries
in the table.
Once Linux is up, you can avoid the inconvenience of having
to boot by hand by recompiling the kernel with an appropriately
defined HD_TYPE macro in include/linux/config.h.
0xce000
0x350
15
6
port mapped, bus master
requires installed BIOS
Next Chapter, Previous Chapter
Table of contents of this chapter, General table of contents
Top of the document, Beginning of this Chapter