AIC7xxx Driver for Linux Introduction ---------------------------- The AIC7xxx SCSI driver adds support for Adaptec (http://www.adaptec.com) SCSI controllers and chipsets. Major portions of the driver and driver development are shared between both Linux and FreeBSD. Support for the AIC-7xxx chipsets have been in the default Linux kernel since approximately linux-1.1.x and fairly stable since linux-1.2.x, and are also in FreeBSD 2.1.0 or later. Supported cards/chipsets ---------------------------- Adaptec Cards ---------------------------- AHA-274x AHA-274xT AHA-2842 AHA-2910B AHA-2940 AHA-2940W AHA-2940U AHA-2940UW AHA-2940AU AHA-2944D AHA-2944WD AHA-2944UD AHA-2944UWD AHA-3940 AHA-3940U AHA-3940W AHA-3940UW AHA-3985 AHA-3985U AHA-3985W AHA-3985UW Motherboard Chipsets ---------------------------- AIC-777x AIC-785x AIC-786x AIC-787x AIC-788x AIC-7895 Bus Types ---------------------------- W - Wide SCSI, SCSI-3, 16bit bus, 68pin connector, will also support SCSI-1/SCSI-2 50pin devices, transfer rates up to 20MB/s. U - Ultra SCSI, transfer rates up to 40MB/s. D - Differential SCSI. T - Twin Channel SCSI. Up to 14 SCSI devices. AHA-274x - EISA SCSI controller AHA-284x - VLB SCSI controller AHA-29xx - PCI SCSI controller AHA-394x - PCI controllers with two separate SCSI controllers on-board. AHA-398x - PCI RAID controllers with three separate SCSI controllers on-board. NOTE: The AHA-2920 is NOT an AIC-7xxx based controller, and is not handled by this driver. People ------------------------------ Justin T Gibbs gibbs@plutotech.com (BSD Driver Author) Dan Eischen deischen@iworks.InterWorks.org (Original Linux Driver Co-maintainer) Dean Gehnert deang@teleport.com (Original Linux FTP/patch maintainer) Jess Johnson jester@frenzy.com (AIC7xxx FAQ author) Doug Ledford dledford@dialnet.net (Current Linux aic7xxx-5.x.x Driver/Patch/FTP/FAQ maintainer) Special thanks go to John Aycock (aycock@cpsc.ucalgary.ca), the original author of the driver. John has since retired from the project. Thanks again for all his work! Mailing list ------------------------------ There is a mailing list available for users who want to track development and converse with other users and developers. This list is for both FreeBSD and Linux support of the AIC7xxx chipsets. To subscribe to the AIC7xxx mailing list send mail to the list server, with "subscribe AIC7xxx" in the body (no Subject: required): To: majordomo@FreeBSD.ORG --- subscribe AIC7xxx To unsubscribe from the list, send mail to the list server with: To: majordomo@FreeBSD.ORG --- unsubscribe AIC7xxx Send regular messages and replies to: AIC7xxx@FreeBSD.ORG Boot Command line options ------------------------------ "aic7xxx=no_reset" - Eliminate the SCSI bus reset during startup. Some SCSI devices need the initial reset that this option disables in order to work. If you have problems at bootup, please make sure you aren't using this option. "aic7xxx=reverse_scan" - Have the driver register the SCSI cards in the reverse of the normal order. This may help those people who have more than one PCI Adaptec controller force the correct controller to be scsi0 under linux so that their boot hard drive is also sda under linux "aic7xxx=extended" - Force the driver to detect extended drive translation on your controller. This helps those people who have cards without a SEEPROM make sure that linux and all other operating systems think the same way about your hard drives. "aic7xxx=irq_trigger:x" - Replace x with either 0 or 1 to force the kernel to use the correct IRQ type for your card. This only applies to EISA based controllers. On these controllers, 0 is for Edge triggered interrupts, and 1 is for Level triggered interrupts. If you aren't sure or don't know which IRQ trigger type your EISA card uses, then let the kernel autodetect the trigger type. "aic7xxx=verbose" - This option can be used in one of two ways. If you simply specify aic7xxx=verbose, then the kernel will automatically pick the default set of verbose messages for you to see. Alternatively, you can specify the command as "aic7xxx=verbose:0xXXXX" where the X entries are replaced with hexadecimal digits. This option is a bit field type option. For a full listing of the available options, search for the #define VERBOSE_xxxxxx lines in the aic7xxx.c file. If you want verbose messages, then it is recommended that you simply use the aic7xxx=verbose variant of this command. "aic7xxx=7895_irq_hack:x" - This option enables some work around code to fix a bug in the Tyan Thunder II motherboard BIOS. The BIOS incorrectly sets the IRQs on the two channels of the 7895 to two different values even though the motherboard hardware doesn't support this mode of operation. The valid values for x are: 0 to force both channels to use the IRQ assigned to Channel A, 1 to force both channels to use the IRQ assigned to Channel B, and -1 will disable this horrible abomination of a hack. The default is disabled (-1). "aic7xxx=pci_parity:x" - This option controls whether or not the driver enables PCI parity error checking on the PCI bus. By default, this checking is disabled. To enable the checks, simply specify pci_parity with no value afterwords. To reverse the parity from even to odd, supply any number other than 0 or 255. In short: pci_parity - Even parity checking (even is the normal PCI parity) pci_parity:x - Where x > 0, Odd parity checking pci_parity:0 - No check (default) NOTE: In order to get Even PCI parity checking, you must use the version of the option that does not include the : and a number at the end (unless you want to enter exactly 2^32 - 1 as the number). "aic7xxx=tag_info:{{8,8..},{8,8..},..}" - This option is used to enable tagged queueing on specific devices. As of driver version 5.0.6, we now globally enable tagged queueing by default, but we also disable tagged queueing on all individual devices by default. In order to enable tagged queueing for certian devices at boot time, a user may use this boot param. The driver will then parse this message out and enable the specific device entries that are present based upon the value given. The param line is parsed in the following manner: { - first instance indicates the start of this parameter values second instance is the start of entries for a particular device entry } - end the entries for a particular host adapter, or end the entire set of parameter entries , - move to next entry. Inside of a set of device entries, this moves us to the next device on the list. Outside of device entries, this moves us to the next host adapter . - Same effect as , but is safe to use with insmod. x - the number to enter into the array at this position. 0 = Enable tagged queueing on this device and use the default queue depth 1-254 = Enable tagged queueing on this device and use this number as the queue depth 255 = Disable tagged queueing on this device. Note: anything above 32 for an actual queue depth is wasteful and not recommended. A few examples of how this can be used: tag_info:{{8,12,,0,,255,4}} This line will only effect the first aic7xxx card registered. It will set scsi id 0 to a queue depth of 8, id 1 to 12, leave id 2 at the default, set id 3 to tagged queueing enabled and use the default queue depth, id 4 default, id 5 disabled, and id 6 to 4. Any not specified entries stay at the default value, repeated commas with no value specified will simply increment to the next id without changing anything for the missing values. tag_info:{{8,8},,{8,8}} First adapter, scsi id 0 to 8, id 1 to 8, remainder stay at their default. Second adapter stays entirely at default. Third adapter, id 0 to 8, id 1 to 8, remainder at default (identical to first adapter). tag_info:{,,,{,,,64}} First, second, and third adapters at default values. Fourth adapter, id 3 to 64. Notice that leading commas simply increment what the first number effects, and there are no need for trailing commas. When you close out an adapter, or the entire entry, anything not explicitly set stays at the default value. A final note on this option. The scanner I used for this isn't perfect or highly robust. If you mess the line up, the worst that should happen is that the line will get ignored. If you don't close out the entire entry with the final bracket, then any other aic7xxx options after this will get ignored. So, in general, be sure of what you are entering, and after you have it right, just add it to the lilo.conf file so there won't be any mistakes. As a means of checking this parser, the entire tag_info array for each card is now printed out in the /proc/scsi/aic7xxx/x file. You can use that to verify that your options were parsed correctly. Boot command line options may be combined to form the proper set of options a user might need. For example, the following is valid: aic7xxx=verbose,extended,irq_trigger:1 The only requirement is that individual options be separated by a comma on the command line. Module Loading command options ------------------------------ When loading the aic7xxx driver as a module, the exact same options are available to the user. However, the syntax to specify the options changes slightly. For insmod, you need to wrap the aic7xxx= argument in quotes and replace all ',' with '.'. So, for example, a valid insmod line would be: insmod aic7xxx aic7xxx='verbose.irq_trigger:1.extended' This line should result in the *exact* same behaviour as if you typed it in at the lilo prompt and the driver was compiled into the kernel instead of being a module. The reason for the single quote is so that the shell won't try to interpret anything in the line, such as {. Insmod assumes any options starting with a letter instead of a number is a character string (which is what we want) and by switching all of the commas to periods, insmod won't interpret this as more than one string and write junk into our binary image. I consider it a bug in the insmod program that even if you wrap your string in quotes (quotes that pass the shell mind you and that insmod sees) it still treates a comma inside of those quotes as starting a new variable, resulting in memory scribbles if you don't switch the commas to periods. Kernel Compile options ------------------------------ The various kernel compile time options for this driver are now fairly well documented in the file Documentation/Configure.help. In order to see this documentation, you need to use one of the advanced configuration programs (menuconfig and xconfig). If you are using the "make menuconfig" method of configuring your kernel, then you would simply highlight the option in question and hit the F1 key. If you are using the "make xconfig" method of configuring your kernel, then simply click on the help button next to the option you have questions about. The help information from the Configure.help file will then get automatically displayed. /proc support ------------------------------ The /proc support for the AIC7xxx can be found in the /proc/scsi/aic7xxx/ directory. That directory contains a file for each SCSI controller in the system. Each file presents the current configuration and transfer statistics (enabled with #define in aic7xxx.c) for each controller. Thanks to Michael Neuffer for for his upper-level SCSI help, and Matthew Jacob for statistics support. FTP sites ------------------------------ ftp://ftp.dialnet.net/pub/linux/aic7xxx/ - Primary site for Doug Ledford developed driver releases - US Linux mirror of Teleport site ftp://ftp.pcnet.com/users/eischen/Linux/ - Dan Eischen's driver distribution area ftp://ekf2.vsb.cz/pub/linux/kernel/aic7xxx/ftp.teleport.com/ - European Linux mirror of Teleport site Dean W. Gehnert deang@teleport.com $Revision: 3.0 $ Modified by Doug Ledford 1998