eata.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,842 行 · 第 1/5 页

C
1,842
字号
/* *      eata.c - Low-level driver for EATA/DMA SCSI host adapters. * *      03 Jun 2003 Rev. 8.10 for linux-2.5.70 *        + Update for new IRQ API. *        + Use "goto" when appropriate. *        + Drop eata.h. *        + Update for new module_param API. *        + Module parameters  can now be specified only in the *          same format as the kernel boot options. * *             boot option    old module param  *             -----------    ------------------ *             addr,...       io_port=addr,... *             lc:[y|n]       linked_comm=[1|0] *             mq:xx          max_queue_depth=xx *             tm:[0|1|2]     tag_mode=[0|1|2] *             et:[y|n]       ext_tran=[1|0] *             rs:[y|n]       rev_scan=[1|0] *             ip:[y|n]       isa_probe=[1|0] *             ep:[y|n]       eisa_probe=[1|0] *             pp:[y|n]       pci_probe=[1|0] * *          A valid example using the new parameter format is: *          modprobe eata "eata=0x7410,0x230,lc:y,tm:0,mq:4,ep:n" * *          which is equivalent to the old format: *          modprobe eata io_port=0x7410,0x230 linked_comm=1 tag_mode=0 \ *                        max_queue_depth=4 eisa_probe=0 * *      12 Feb 2003 Rev. 8.04 for linux 2.5.60 *        + Release irq before calling scsi_register. * *      12 Nov 2002 Rev. 8.02 for linux 2.5.47 *        + Release driver_lock before calling scsi_register. * *      11 Nov 2002 Rev. 8.01 for linux 2.5.47 *        + Fixed bios_param and scsicam_bios_param calling parameters. * *      28 Oct 2002 Rev. 8.00 for linux 2.5.44-ac4 *        + Use new tcq and adjust_queue_depth api. *        + New command line option (tm:[0-2]) to choose the type of tags: *          0 -> disable tagging ; 1 -> simple tags  ; 2 -> ordered tags. *          Default is tm:0 (tagged commands disabled). *          For compatibility the "tc:" option is an alias of the "tm:" *          option; tc:n is equivalent to tm:0 and tc:y is equivalent to *          tm:1. *        + The tagged_comm module parameter has been removed, use tag_mode *          instead, equivalent to the "tm:" boot option. * *      10 Oct 2002 Rev. 7.70 for linux 2.5.42 *        + Foreport from revision 6.70. * *      25 Jun 2002 Rev. 6.70 for linux 2.4.19 *        + This release is the first one tested on a Big Endian platform: *          fixed endian-ness problem due to bitfields; *          fixed endian-ness problem in read_pio. *        + Added new options for selectively probing ISA, EISA and PCI bus: * *          Boot option   Parameter name    Default according to * *          ip:[y|n]      isa_probe=[1|0]   CONFIG_ISA  defined *          ep:[y|n]      eisa_probe=[1|0]  CONFIG_EISA defined *          pp:[y|n]      pci_probe=[1|0]   CONFIG_PCI  defined * *          The default action is to perform probing if the corrisponding *          bus is configured and to skip probing otherwise. * *        + If pci_probe is in effect and a list of I/O  ports is specified *          as parameter or boot option, pci_enable_device() is performed *          on all pci devices matching PCI_CLASS_STORAGE_SCSI. * *      21 Feb 2002 Rev. 6.52 for linux 2.4.18 *        + Backport from rev. 7.22 (use io_request_lock). * *      20 Feb 2002 Rev. 7.22 for linux 2.5.5 *        + Remove any reference to virt_to_bus(). *        + Fix pio hang while detecting multiple HBAs. *        + Fixed a board detection bug: in a system with *          multiple ISA/EISA boards, all but the first one *          were erroneously detected as PCI. * *      01 Jan 2002 Rev. 7.20 for linux 2.5.1 *        + Use the dynamic DMA mapping API. * *      19 Dec 2001 Rev. 7.02 for linux 2.5.1 *        + Use SCpnt->sc_data_direction if set. *        + Use sglist.page instead of sglist.address. * *      11 Dec 2001 Rev. 7.00 for linux 2.5.1 *        + Use host->host_lock instead of io_request_lock. * *       1 May 2001 Rev. 6.05 for linux 2.4.4 *        + Clean up all pci related routines. *        + Fix data transfer direction for opcode SEND_CUE_SHEET (0x5d) * *      30 Jan 2001 Rev. 6.04 for linux 2.4.1 *        + Call pci_resource_start after pci_enable_device. * *      25 Jan 2001 Rev. 6.03 for linux 2.4.0 *        + "check_region" call replaced by "request_region". * *      22 Nov 2000 Rev. 6.02 for linux 2.4.0-test11 *        + Return code checked when calling pci_enable_device. *        + Removed old scsi error handling support. *        + The obsolete boot option flag eh:n is silently ignored. *        + Removed error messages while a disk drive is powered up at *          boot time. *        + Improved boot messages: all tagged capable device are *          indicated as "tagged" or "soft-tagged" : *          - "soft-tagged"  means that the driver is trying to do its *            own tagging (i.e. the tc:y option is in effect); *          - "tagged" means that the device supports tagged commands, *            but the driver lets the HBA be responsible for tagging *            support. * *      16 Sep 1999 Rev. 5.11 for linux 2.2.12 and 2.3.18 *        + Updated to the new __setup interface for boot command line options. *        + When loaded as a module, accepts the new parameter boot_options *          which value is a string with the same format of the kernel boot *          command line options. A valid example is: *          modprobe eata 'boot_options="0x7410,0x230,lc:y,tc:n,mq:4"' * *       9 Sep 1999 Rev. 5.10 for linux 2.2.12 and 2.3.17 *        + 64bit cleanup for Linux/Alpha platform support *          (contribution from H.J. Lu). * *      22 Jul 1999 Rev. 5.00 for linux 2.2.10 and 2.3.11 *        + Removed pre-2.2 source code compatibility. *        + Added call to pci_set_master. * *      26 Jul 1998 Rev. 4.33 for linux 2.0.35 and 2.1.111 *        + Added command line option (rs:[y|n]) to reverse the scan order *          of PCI boards. The default is rs:y, which reverses the BIOS order *          while registering PCI boards. The default value rs:y generates *          the same order of all previous revisions of this driver. *          Pls. note that "BIOS order" might have been reversed itself *          after the 2.1.9x PCI modifications in the linux kernel. *          The rs value is ignored when the explicit list of addresses *          is used by the "eata=port0,port1,..." command line option. *        + Added command line option (et:[y|n]) to force use of extended *          translation (255 heads, 63 sectors) as disk geometry. *          The default is et:n, which uses the disk geometry returned *          by scsicam_bios_param. The default value et:n is compatible with *          all previous revisions of this driver. * *      28 May 1998 Rev. 4.32 for linux 2.0.33 and 2.1.104 *          Increased busy timeout from 10 msec. to 200 msec. while *          processing interrupts. * *      16 May 1998 Rev. 4.31 for linux 2.0.33 and 2.1.102 *          Improved abort handling during the eh recovery process. * *      13 May 1998 Rev. 4.30 for linux 2.0.33 and 2.1.101 *          The driver is now fully SMP safe, including the *          abort and reset routines. *          Added command line options (eh:[y|n]) to choose between *          new_eh_code and the old scsi code. *          If linux version >= 2.1.101 the default is eh:y, while the eh *          option is ignored for previous releases and the old scsi code *          is used. * *      18 Apr 1998 Rev. 4.20 for linux 2.0.33 and 2.1.97 *          Reworked interrupt handler. * *      11 Apr 1998 rev. 4.05 for linux 2.0.33 and 2.1.95 *          Major reliability improvement: when a batch with overlapping *          requests is detected, requests are queued one at a time *          eliminating any possible board or drive reordering. * *      10 Apr 1998 rev. 4.04 for linux 2.0.33 and 2.1.95 *          Improved SMP support (if linux version >= 2.1.95). * *       9 Apr 1998 rev. 4.03 for linux 2.0.33 and 2.1.94 *          Added support for new PCI code and IO-APIC remapping of irqs. *          Performance improvement: when sequential i/o is detected, *          always use direct sort instead of reverse sort. * *       4 Apr 1998 rev. 4.02 for linux 2.0.33 and 2.1.92 *          io_port is now unsigned long. * *      17 Mar 1998 rev. 4.01 for linux 2.0.33 and 2.1.88 *          Use new scsi error handling code (if linux version >= 2.1.88). *          Use new interrupt code. * *      12 Sep 1997 rev. 3.11 for linux 2.0.30 and 2.1.55 *          Use of udelay inside the wait loops to avoid timeout *          problems with fast cpus. *          Removed check about useless calls to the interrupt service *          routine (reported on SMP systems only). *          At initialization time "sorted/unsorted" is displayed instead *          of "linked/unlinked" to reinforce the fact that "linking" is *          nothing but "elevator sorting" in the actual implementation. * *      17 May 1997 rev. 3.10 for linux 2.0.30 and 2.1.38 *          Use of serial_number_at_timeout in abort and reset processing. *          Use of the __initfunc and __initdata macro in setup code. *          Minor cleanups in the list_statistics code. *          Increased controller busy timeout in order to better support *          slow SCSI devices. * *      24 Feb 1997 rev. 3.00 for linux 2.0.29 and 2.1.26 *          When loading as a module, parameter passing is now supported *          both in 2.0 and in 2.1 style. *          Fixed data transfer direction for some SCSI opcodes. *          Immediate acknowledge to request sense commands. *          Linked commands to each disk device are now reordered by elevator *          sorting. Rare cases in which reordering of write requests could *          cause wrong results are managed. *          Fixed spurious timeouts caused by long simple queue tag sequences. *          New command line option (tm:[0-3]) to choose the type of tags: *          0 -> mixed (default); 1 -> simple; 2 -> head; 3 -> ordered. * *      18 Jan 1997 rev. 2.60 for linux 2.1.21 and 2.0.28 *          Added command line options to enable/disable linked commands *          (lc:[y|n]), tagged commands (tc:[y|n]) and to set the max queue *          depth (mq:xx). Default is "eata=lc:n,tc:n,mq:16". *          Improved command linking. *          Documented how to setup RAID-0 with DPT SmartRAID boards. * *       8 Jan 1997 rev. 2.50 for linux 2.1.20 and 2.0.27 *          Added linked command support. *          Improved detection of PCI boards using ISA base addresses. * *       3 Dec 1996 rev. 2.40 for linux 2.1.14 and 2.0.27 *          Added support for tagged commands and queue depth adjustment. * *      22 Nov 1996 rev. 2.30 for linux 2.1.12 and 2.0.26 *          When CONFIG_PCI is defined, BIOS32 is used to include in the *          list of i/o ports to be probed all the PCI SCSI controllers. *          The list of i/o ports to be probed can be overwritten by the *          "eata=port0,port1,...." boot command line option. *          Scatter/gather lists are now allocated by a number of kmalloc *          calls, in order to avoid the previous size limit of 64Kb. * *      16 Nov 1996 rev. 2.20 for linux 2.1.10 and 2.0.25 *          Added support for EATA 2.0C, PCI, multichannel and wide SCSI. * *      27 Sep 1996 rev. 2.12 for linux 2.1.0 *          Portability cleanups (virtual/bus addressing, little/big endian *          support). * *      09 Jul 1996 rev. 2.11 for linux 2.0.4 *          Number of internal retries is now limited. * *      16 Apr 1996 rev. 2.10 for linux 1.3.90 *          New argument "reset_flags" to the reset routine. * *       6 Jul 1995 rev. 2.01 for linux 1.3.7 *          Update required by the new /proc/scsi support. * *      11 Mar 1995 rev. 2.00 for linux 1.2.0 *          Fixed a bug which prevented media change detection for removable *          disk drives. * *      23 Feb 1995 rev. 1.18 for linux 1.1.94 *          Added a check for scsi_register returning NULL. * *      11 Feb 1995 rev. 1.17 for linux 1.1.91 *          Now DEBUG_RESET is disabled by default. *          Register a board even if it does not assert DMA protocol support *          (DPT SK2011B does not report correctly the dmasup bit). * *       9 Feb 1995 rev. 1.16 for linux 1.1.90 *          Use host->wish_block instead of host->block. *          New list of Data Out SCSI commands. * *       8 Feb 1995 rev. 1.15 for linux 1.1.89 *          Cleared target_time_out counter while performing a reset. *          All external symbols renamed to avoid possible name conflicts. * *      28 Jan 1995 rev. 1.14 for linux 1.1.86 *          Added module support. *          Log and do a retry when a disk drive returns a target status *          different from zero on a recovered error. * *      24 Jan 1995 rev. 1.13 for linux 1.1.85 *          Use optimized board configuration, with a measured performance *          increase in the range 10%-20% on i/o throughput. * *      16 Jan 1995 rev. 1.12 for linux 1.1.81 *          Fix mscp structure comments (no functional change). *          Display a message if check_region detects a port address *          already in use. * *      17 Dec 1994 rev. 1.11 for linux 1.1.74 *          Use the scsicam_bios_param routine. This allows an easy *          migration path from disk partition tables created using *          different SCSI drivers and non optimal disk geometry. * *      15 Dec 1994 rev. 1.10 for linux 1.1.74 *          Added support for ISA EATA boards (DPT PM2011, DPT PM2021). *          The host->block flag is set for all the detected ISA boards. *          The detect routine no longer enforces LEVEL triggering *          for EISA boards, it just prints a warning message. * *      30 Nov 1994 rev. 1.09 for linux 1.1.68 *          Redo i/o on target status CHECK_CONDITION for TYPE_DISK only. *          Added optional support for using a single board at a time. * *      18 Nov 1994 rev. 1.08 for linux 1.1.64 *          Forces sg_tablesize = 64 and can_queue = 64 if these *          values are not correctly detected (DPT PM2012). * *      14 Nov 1994 rev. 1.07 for linux 1.1.63  Final BETA release. *      04 Aug 1994 rev. 1.00 for linux 1.1.39  First BETA release. * * *          This driver is based on the CAM (Common Access Method Committee) *          EATA (Enhanced AT Bus Attachment) rev. 2.0A, using DMA protocol. * *  Copyright (C) 1994-2003 Dario Ballabio (ballabio_dario@emc.com) * *  Alternate email: dario.ballabio@inwind.it, dario.ballabio@tiscalinet.it * *  Redistribution and use in source and binary forms, with or without *  modification, are permitted provided that redistributions of source *  code retain the above copyright notice and this comment without *  modification. * *//* * *  Here is a brief description of the DPT SCSI host adapters. *  All these boards provide an EATA/DMA compatible programming interface *  and are fully supported by this driver in any configuration, including *  multiple SCSI channels: * *  PM2011B/9X -  Entry Level ISA *  PM2021A/9X -  High Performance ISA *  PM2012A       Old EISA *  PM2012B       Old EISA *  PM2022A/9X -  Entry Level EISA *  PM2122A/9X -  High Performance EISA *  PM2322A/9X -  Extra High Performance EISA *  PM3021     -  SmartRAID Adapter for ISA *  PM3222     -  SmartRAID Adapter for EISA (PM3222W is 16-bit wide SCSI) *  PM3224     -  SmartRAID Adapter for PCI  (PM3224W is 16-bit wide SCSI) *  PM33340UW  -  SmartRAID Adapter for PCI  ultra wide multichannel * *  The above list is just an indication: as a matter of fact all DPT *  boards using the EATA/DMA protocol are supported by this driver, *  since they use exactely the same programming interface. * *  The DPT PM2001 provides only the EATA/PIO interface and hence is not *  supported by this driver. * *  This code has been tested with up to 3 Distributed Processing Technology *  PM2122A/9X (DPT SCSI BIOS v002.D1, firmware v05E.0) EISA controllers, *  in any combination of private and shared IRQ. *  PCI support has been tested using up to 2 DPT PM3224W (DPT SCSI BIOS *  v003.D0, firmware v07G.0). * *  DPT SmartRAID boards support "Hardware Array" - a group of disk drives *  which are all members of the same RAID-0, RAID-1 or RAID-5 array implemented *  in host adapter hardware. Hardware Arrays are fully compatible with this *  driver, since they look to it as a single disk drive. * *  WARNING: to create a RAID-0 "Hardware Array" you must select "Other Unix" *  as the current OS in the DPTMGR "Initial System Installation" menu. *  Otherwise RAID-0 is generated as an "Array Group" (i.e. software RAID-0), *  which is not supported by the actual SCSI subsystem. *  To get the "Array Group" functionality, the Linux MD driver must be used *  instead of the DPT "Array Group" feature. * *  Multiple ISA, EISA and PCI boards can be configured in the same system. *  It is suggested to put all the EISA boards on the same IRQ level, all *  the PCI  boards on another IRQ level, while ISA boards cannot share

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?