ips.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:44k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /* ips.h -- driver for the IBM ServeRAID controller                          */
  3. /*                                                                           */
  4. /* Written By: Keith Mitchell, IBM Corporation                               */
  5. /*             Jack Hammer, Adaptec, Inc.                                    */
  6. /*             David Jeffery, Adaptec, Inc.                                  */
  7. /*                                                                           */
  8. /* Copyright (C) 1999 IBM Corporation                                        */
  9. /*                                                                           */
  10. /* This program is free software; you can redistribute it and/or modify      */
  11. /* it under the terms of the GNU General Public License as published by      */
  12. /* the Free Software Foundation; either version 2 of the License, or         */
  13. /* (at your option) any later version.                                       */
  14. /*                                                                           */
  15. /* This program is distributed in the hope that it will be useful,           */
  16. /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
  17. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
  18. /* GNU General Public License for more details.                              */
  19. /*                                                                           */
  20. /* NO WARRANTY                                                               */
  21. /* THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        */
  22. /* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      */
  23. /* LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      */
  24. /* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    */
  25. /* solely responsible for determining the appropriateness of using and       */
  26. /* distributing the Program and assumes all risks associated with its        */
  27. /* exercise of rights under this Agreement, including but not limited to     */
  28. /* the risks and costs of program errors, damage to or loss of data,         */
  29. /* programs or equipment, and unavailability or interruption of operations.  */
  30. /*                                                                           */
  31. /* DISCLAIMER OF LIABILITY                                                   */
  32. /* NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   */
  33. /* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        */
  34. /* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   */
  35. /* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     */
  36. /* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    */
  37. /* USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  */
  38. /* HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             */
  39. /*                                                                           */
  40. /* You should have received a copy of the GNU General Public License         */
  41. /* along with this program; if not, write to the Free Software               */
  42. /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  43. /*                                                                           */
  44. /* Bugs/Comments/Suggestions should be mailed to:                            */
  45. /*      ipslinux@adaptec.com                                               */
  46. /*                                                                           */
  47. /*****************************************************************************/
  48. #ifndef _IPS_H_
  49.    #define _IPS_H_
  50.    #include <asm/uaccess.h>
  51.    #include <asm/io.h>
  52.    /* Prototypes */
  53.    extern int ips_detect(Scsi_Host_Template *);
  54.    extern int ips_release(struct Scsi_Host *);
  55.    extern int ips_eh_abort(Scsi_Cmnd *);
  56.    extern int ips_eh_reset(Scsi_Cmnd *);
  57.    extern int ips_queue(Scsi_Cmnd *, void (*) (Scsi_Cmnd *));
  58.    extern int ips_biosparam(Disk *, kdev_t, int *);
  59.    extern const char * ips_info(struct Scsi_Host *);
  60.    extern void do_ips(int, void *, struct pt_regs *);
  61.    /*
  62.     * Some handy macros
  63.     */
  64.    #ifndef LinuxVersionCode
  65.       #define LinuxVersionCode(x,y,z)  (((x)<<16)+((y)<<8)+(z))
  66.    #endif
  67.    #define IPS_HA(x)                   ((ips_ha_t *) x->hostdata)
  68.    #define IPS_COMMAND_ID(ha, scb)     (int) (scb - ha->scbs)
  69.    #define IPS_IS_TROMBONE(ha)         (((ha->device_id == IPS_DEVICEID_COPPERHEAD) && 
  70.                                          (ha->revision_id >= IPS_REVID_TROMBONE32) && 
  71.                                          (ha->revision_id <= IPS_REVID_TROMBONE64)) ? 1 : 0)
  72.    #define IPS_IS_CLARINET(ha)         (((ha->device_id == IPS_DEVICEID_COPPERHEAD) && 
  73.                                          (ha->revision_id >= IPS_REVID_CLARINETP1) && 
  74.                                          (ha->revision_id <= IPS_REVID_CLARINETP3)) ? 1 : 0)
  75.    #define IPS_IS_MORPHEUS(ha)         (ha->device_id == IPS_DEVICEID_MORPHEUS)
  76.    #define IPS_USE_I2O_DELIVER(ha)     ((IPS_IS_MORPHEUS(ha) || 
  77.                                          (IPS_IS_TROMBONE(ha) && 
  78.                                           (ips_force_i2o))) ? 1 : 0)
  79.    #define IPS_USE_I2O_STATUS(ha)      (IPS_IS_MORPHEUS(ha))
  80.    #define IPS_USE_MEMIO(ha)           ((IPS_IS_MORPHEUS(ha) || 
  81.                                          ((IPS_IS_TROMBONE(ha) || IPS_IS_CLARINET(ha)) && 
  82.                                           (ips_force_memio))) ? 1 : 0)
  83.    #ifndef VIRT_TO_BUS
  84.       #define VIRT_TO_BUS(x)           (uint32_t) virt_to_bus((void *) x)
  85.    #endif
  86.    #ifndef MDELAY
  87.       #define MDELAY mdelay
  88.    #endif
  89.    #ifndef verify_area_20
  90.       #define verify_area_20(t,a,sz)   (0) /* success */
  91.    #endif
  92.    #ifndef DECLARE_MUTEX_LOCKED
  93.       #define DECLARE_MUTEX_LOCKED(sem) struct semaphore sem = MUTEX_LOCKED;
  94.    #endif
  95.    
  96.    /*
  97.     * Lock macros
  98.     */
  99.    #define IPS_SCB_LOCK(cpu_flags)      spin_lock_irqsave(&ha->scb_lock, cpu_flags)
  100.    #define IPS_SCB_UNLOCK(cpu_flags)    spin_unlock_irqrestore(&ha->scb_lock, cpu_flags)
  101.    #define IPS_QUEUE_LOCK(queue)        spin_lock_irqsave(&(queue)->lock, (queue)->cpu_flags)
  102.    #define IPS_QUEUE_UNLOCK(queue)      spin_unlock_irqrestore(&(queue)->lock, (queue)->cpu_flags)
  103.    #define IPS_HA_LOCK(cpu_flags)       spin_lock_irqsave(&ha->ips_lock, cpu_flags)
  104.    #define IPS_HA_UNLOCK(cpu_flags)     spin_unlock_irqrestore(&ha->ips_lock, cpu_flags)
  105.    /*
  106.     * Adapter address map equates
  107.     */
  108.    #define IPS_REG_HISR                 0x08    /* Host Interrupt Status Reg   */
  109.    #define IPS_REG_CCSAR                0x10    /* Cmd Channel System Addr Reg */
  110.    #define IPS_REG_CCCR                 0x14    /* Cmd Channel Control Reg     */
  111.    #define IPS_REG_SQHR                 0x20    /* Status Q Head Reg           */
  112.    #define IPS_REG_SQTR                 0x24    /* Status Q Tail Reg           */
  113.    #define IPS_REG_SQER                 0x28    /* Status Q End Reg            */
  114.    #define IPS_REG_SQSR                 0x2C    /* Status Q Start Reg          */
  115.    #define IPS_REG_SCPR                 0x05    /* Subsystem control port reg  */
  116.    #define IPS_REG_ISPR                 0x06    /* interrupt status port reg   */
  117.    #define IPS_REG_CBSP                 0x07    /* CBSP register               */
  118.    #define IPS_REG_FLAP                 0x18    /* Flash address port          */
  119.    #define IPS_REG_FLDP                 0x1C    /* Flash data port             */
  120.    #define IPS_REG_NDAE                 0x38    /* Anaconda 64 NDAE Register   */
  121.    #define IPS_REG_I2O_INMSGQ           0x40    /* I2O Inbound Message Queue   */
  122.    #define IPS_REG_I2O_OUTMSGQ          0x44    /* I2O Outbound Message Queue  */
  123.    #define IPS_REG_I2O_HIR              0x30    /* I2O Interrupt Status        */
  124.    #define IPS_REG_I960_IDR             0x20    /* i960 Inbound Doorbell       */
  125.    #define IPS_REG_I960_MSG0            0x18    /* i960 Outbound Reg 0         */
  126.    #define IPS_REG_I960_MSG1            0x1C    /* i960 Outbound Reg 1         */
  127.    #define IPS_REG_I960_OIMR            0x34    /* i960 Oubound Int Mask Reg   */
  128.    /*
  129.     * Adapter register bit equates
  130.     */
  131.    #define IPS_BIT_GHI                  0x04    /* HISR General Host Interrupt */
  132.    #define IPS_BIT_SQO                  0x02    /* HISR Status Q Overflow      */
  133.    #define IPS_BIT_SCE                  0x01    /* HISR Status Channel Enqueue */
  134.    #define IPS_BIT_SEM                  0x08    /* CCCR Semaphore Bit          */
  135.    #define IPS_BIT_ILE                  0x10    /* CCCR ILE Bit                */
  136.    #define IPS_BIT_START_CMD            0x101A  /* CCCR Start Command Channel  */
  137.    #define IPS_BIT_START_STOP           0x0002  /* CCCR Start/Stop Bit         */
  138.    #define IPS_BIT_RST                  0x80    /* SCPR Reset Bit              */
  139.    #define IPS_BIT_EBM                  0x02    /* SCPR Enable Bus Master      */
  140.    #define IPS_BIT_EI                   0x80    /* HISR Enable Interrupts      */
  141.    #define IPS_BIT_OP                   0x01    /* OP bit in CBSP              */
  142.    #define IPS_BIT_I2O_OPQI             0x08    /* General Host Interrupt      */
  143.    #define IPS_BIT_I960_MSG0I           0x01    /* Message Register 0 Interrupt*/
  144.    #define IPS_BIT_I960_MSG1I           0x02    /* Message Register 1 Interrupt*/
  145.    /*
  146.     * Adapter Command ID Equates
  147.     */
  148.    #define IPS_CMD_GET_LD_INFO          0x19
  149.    #define IPS_CMD_GET_SUBSYS           0x40
  150.    #define IPS_CMD_READ_CONF            0x38
  151.    #define IPS_CMD_RW_NVRAM_PAGE        0xBC
  152.    #define IPS_CMD_READ                 0x02
  153.    #define IPS_CMD_WRITE                0x03
  154.    #define IPS_CMD_FFDC                 0xD7
  155.    #define IPS_CMD_ENQUIRY              0x05
  156.    #define IPS_CMD_FLUSH                0x0A
  157.    #define IPS_CMD_READ_SG              0x82
  158.    #define IPS_CMD_WRITE_SG             0x83
  159.    #define IPS_CMD_DCDB                 0x04
  160.    #define IPS_CMD_DCDB_SG              0x84
  161.    #define IPS_CMD_EXTENDED_DCDB      0x95
  162. #define IPS_CMD_EXTENDED_DCDB_SG  0x96
  163.    #define IPS_CMD_CONFIG_SYNC          0x58
  164.    #define IPS_CMD_ERROR_TABLE          0x17
  165.    #define IPS_CMD_DOWNLOAD             0x20
  166.    #define IPS_CMD_RW_BIOSFW            0x22
  167.    #define IPS_CMD_GET_VERSION_INFO     0xC6
  168.    #define IPS_CMD_RESET_CHANNEL        0x1A  
  169.    /*
  170.     * Adapter Equates
  171.     */
  172.    #define IPS_CSL                      0xFF
  173.    #define IPS_POCL                     0x30
  174.    #define IPS_NORM_STATE               0x00
  175.    #define IPS_MAX_ADAPTERS             16
  176.    #define IPS_MAX_IOCTL                1
  177.    #define IPS_MAX_IOCTL_QUEUE          8
  178.    #define IPS_MAX_QUEUE                128
  179.    #define IPS_BLKSIZE                  512
  180.    #define IPS_MAX_SG                   17
  181.    #define IPS_MAX_LD                   8
  182.    #define IPS_MAX_CHANNELS             4
  183.    #define IPS_MAX_TARGETS              15
  184.    #define IPS_MAX_CHUNKS               16
  185.    #define IPS_MAX_CMDS                 128
  186.    #define IPS_MAX_XFER                 0x10000
  187.    #define IPS_NVRAM_P5_SIG             0xFFDDBB99
  188.    #define IPS_MAX_POST_BYTES           0x02
  189.    #define IPS_MAX_CONFIG_BYTES         0x02
  190.    #define IPS_GOOD_POST_STATUS         0x80
  191.    #define IPS_SEM_TIMEOUT              2000
  192.    #define IPS_IOCTL_COMMAND            0x0D
  193.    #define IPS_INTR_ON                  0
  194.    #define IPS_INTR_IORL                1
  195.    #define IPS_FFDC                     99
  196.    #define IPS_ADAPTER_ID               0xF
  197.    #define IPS_VENDORID                 0x1014
  198.    #define IPS_DEVICEID_COPPERHEAD      0x002E
  199.    #define IPS_DEVICEID_MORPHEUS        0x01BD
  200.    #define IPS_SUBDEVICEID_4M           0x01BE
  201.    #define IPS_SUBDEVICEID_4L           0x01BF
  202.    #define IPS_SUBDEVICEID_4MX          0x0208
  203.    #define IPS_SUBDEVICEID_4LX          0x020E
  204.    #define IPS_SUBDEVICEID_5I2          0x0259
  205.    #define IPS_SUBDEVICEID_5I1          0x0258
  206.    #define IPS_IOCTL_SIZE               8192
  207.    #define IPS_STATUS_SIZE              4
  208.    #define IPS_STATUS_Q_SIZE            (IPS_MAX_CMDS+1) * IPS_STATUS_SIZE
  209.    #define IPS_IMAGE_SIZE               500 * 1024
  210.    #define IPS_MEMMAP_SIZE              128
  211.    #define IPS_ONE_MSEC                 1
  212.    #define IPS_ONE_SEC                  1000
  213.    /*
  214.     * Geometry Settings
  215.     */
  216.    #define IPS_COMP_HEADS               128
  217.    #define IPS_COMP_SECTORS             32
  218.    #define IPS_NORM_HEADS               254
  219.    #define IPS_NORM_SECTORS             63
  220.    /*
  221.     * Adapter Basic Status Codes
  222.     */
  223.    #define IPS_BASIC_STATUS_MASK        0xFF
  224.    #define IPS_GSC_STATUS_MASK          0x0F
  225.    #define IPS_CMD_SUCCESS              0x00
  226.    #define IPS_CMD_RECOVERED_ERROR      0x01
  227.    #define IPS_INVAL_OPCO               0x03
  228.    #define IPS_INVAL_CMD_BLK            0x04
  229.    #define IPS_INVAL_PARM_BLK           0x05
  230.    #define IPS_BUSY                     0x08
  231.    #define IPS_CMD_CMPLT_WERROR         0x0C
  232.    #define IPS_LD_ERROR                 0x0D
  233.    #define IPS_CMD_TIMEOUT              0x0E
  234.    #define IPS_PHYS_DRV_ERROR           0x0F
  235.    /*
  236.     * Adapter Extended Status Equates
  237.     */
  238.    #define IPS_ERR_SEL_TO               0xF0
  239.    #define IPS_ERR_OU_RUN               0xF2
  240.    #define IPS_ERR_HOST_RESET           0xF7
  241.    #define IPS_ERR_DEV_RESET            0xF8
  242.    #define IPS_ERR_RECOVERY             0xFC
  243.    #define IPS_ERR_CKCOND               0xFF
  244.    /*
  245.     * Operating System Defines
  246.     */
  247.    #define IPS_OS_WINDOWS_NT            0x01
  248.    #define IPS_OS_NETWARE               0x02
  249.    #define IPS_OS_OPENSERVER            0x03
  250.    #define IPS_OS_UNIXWARE              0x04
  251.    #define IPS_OS_SOLARIS               0x05
  252.    #define IPS_OS_OS2                   0x06
  253.    #define IPS_OS_LINUX                 0x07
  254.    #define IPS_OS_FREEBSD               0x08
  255.    /*
  256.     * Adapter Revision ID's
  257.     */
  258.    #define IPS_REVID_SERVERAID          0x02
  259.    #define IPS_REVID_NAVAJO             0x03
  260.    #define IPS_REVID_SERVERAID2         0x04
  261.    #define IPS_REVID_CLARINETP1         0x05
  262.    #define IPS_REVID_CLARINETP2         0x07
  263.    #define IPS_REVID_CLARINETP3         0x0D
  264.    #define IPS_REVID_TROMBONE32         0x0F
  265.    #define IPS_REVID_TROMBONE64         0x10
  266.    /*
  267.     * NVRAM Page 5 Adapter Defines
  268.     */
  269.    #define IPS_ADTYPE_SERVERAID         0x01
  270.    #define IPS_ADTYPE_SERVERAID2        0x02
  271.    #define IPS_ADTYPE_NAVAJO            0x03
  272.    #define IPS_ADTYPE_KIOWA             0x04
  273.    #define IPS_ADTYPE_SERVERAID3        0x05
  274.    #define IPS_ADTYPE_SERVERAID3L       0x06
  275.    #define IPS_ADTYPE_SERVERAID4H       0x07
  276.    #define IPS_ADTYPE_SERVERAID4M       0x08
  277.    #define IPS_ADTYPE_SERVERAID4L       0x09
  278.    #define IPS_ADTYPE_SERVERAID4MX      0x0A
  279.    #define IPS_ADTYPE_SERVERAID4LX      0x0B
  280.    #define IPS_ADTYPE_SERVERAID5I2      0x0C
  281.    #define IPS_ADTYPE_SERVERAID5I1      0x0D
  282.    /*
  283.     * Adapter Command/Status Packet Definitions
  284.     */
  285.    #define IPS_SUCCESS                  0x01 /* Successfully completed       */
  286.    #define IPS_SUCCESS_IMM              0x02 /* Success - Immediately        */
  287.    #define IPS_FAILURE                  0x04 /* Completed with Error         */
  288.    /*
  289.     * Logical Drive Equates
  290.     */
  291.    #define IPS_LD_OFFLINE               0x02
  292.    #define IPS_LD_OKAY                  0x03
  293.    #define IPS_LD_FREE                  0x00
  294.    #define IPS_LD_SYS                   0x06
  295.    #define IPS_LD_CRS                   0x24
  296.    /*
  297.     * DCDB Table Equates
  298.     */
  299.    #define IPS_NO_DISCONNECT            0x00
  300.    #define IPS_DISCONNECT_ALLOWED       0x80
  301.    #define IPS_NO_AUTO_REQSEN           0x40
  302.    #define IPS_DATA_NONE                0x00
  303.    #define IPS_DATA_UNK                 0x00
  304.    #define IPS_DATA_IN                  0x01
  305.    #define IPS_DATA_OUT                 0x02
  306.    #define IPS_TRANSFER64K              0x08
  307.    #define IPS_NOTIMEOUT                0x00
  308.    #define IPS_TIMEOUT10                0x10
  309.    #define IPS_TIMEOUT60                0x20
  310.    #define IPS_TIMEOUT20M               0x30
  311.    /*
  312.     * SCSI Inquiry Data Flags
  313.     */
  314.    #define IPS_SCSI_INQ_TYPE_DASD       0x00
  315.    #define IPS_SCSI_INQ_TYPE_PROCESSOR  0x03
  316.    #define IPS_SCSI_INQ_LU_CONNECTED    0x00
  317.    #define IPS_SCSI_INQ_RD_REV2         0x02
  318.    #define IPS_SCSI_INQ_REV2            0x02
  319.    #define IPS_SCSI_INQ_REV3            0x03
  320.    #define IPS_SCSI_INQ_Address16       0x01
  321.    #define IPS_SCSI_INQ_Address32       0x02
  322.    #define IPS_SCSI_INQ_MedChanger      0x08
  323.    #define IPS_SCSI_INQ_MultiPort       0x10
  324.    #define IPS_SCSI_INQ_EncServ         0x40
  325.    #define IPS_SCSI_INQ_SoftReset       0x01
  326.    #define IPS_SCSI_INQ_CmdQue          0x02
  327.    #define IPS_SCSI_INQ_Linked          0x08
  328.    #define IPS_SCSI_INQ_Sync            0x10
  329.    #define IPS_SCSI_INQ_WBus16          0x20
  330.    #define IPS_SCSI_INQ_WBus32          0x40
  331.    #define IPS_SCSI_INQ_RelAdr          0x80
  332.    /*
  333.     * SCSI Request Sense Data Flags
  334.     */
  335.    #define IPS_SCSI_REQSEN_VALID        0x80
  336.    #define IPS_SCSI_REQSEN_CURRENT_ERR  0x70
  337.    #define IPS_SCSI_REQSEN_NO_SENSE     0x00
  338.    /*
  339.     * SCSI Mode Page Equates
  340.     */
  341.    #define IPS_SCSI_MP3_SoftSector      0x01
  342.    #define IPS_SCSI_MP3_HardSector      0x02
  343.    #define IPS_SCSI_MP3_Removeable      0x04
  344.    #define IPS_SCSI_MP3_AllocateSurface 0x08
  345.    /*
  346.     * Configuration Structure Flags
  347.     */
  348.    #define IPS_CFG_USEROPT_UPDATECOUNT(cfg)   (((cfg)->UserOpt & 0xffff000) >> 16)
  349.    #define IPS_CFG_USEROPT_CONCURSTART(cfg)   (((cfg)->UserOpt & 0xf000) >> 12)
  350.    #define IPS_CFG_USEROPT_STARTUPDELAY(cfg)  (((cfg)->UserOpt & 0xf00) >> 8)
  351.    #define IPS_CFG_USEROPT_REARRANGE(cfg)     ((cfg)->UserOpt & 0x80)
  352.    #define IPS_CFG_USEROPT_CDBOOT(cfg)        ((cfg)->UserOpt & 0x40)
  353.    #define IPS_CFG_USEROPT_CLUSTER(cfg)       ((cfg)->UserOpt & 0x20)
  354.    /*
  355.     * Host adapter Flags (bit numbers)
  356.     */
  357.    #define IPS_IN_INTR                  0
  358.    #define IPS_IN_ABORT                 1
  359.    #define IPS_IN_RESET                 2
  360.    /*
  361.     * SCB Flags
  362.     */
  363.    #define IPS_SCB_ACTIVE               0x00001
  364.    #define IPS_SCB_WAITING              0x00002
  365.    #define IPS_SCB_MAP_SG               0x00008
  366.    #define IPS_SCB_MAP_SINGLE           0X00010
  367.    /*
  368.     * Passthru stuff
  369.     */
  370.    #define IPS_COPPUSRCMD              (('C'<<8) | 65)
  371.    #define IPS_COPPIOCCMD              (('C'<<8) | 66)
  372.    #define IPS_NUMCTRLS                (('C'<<8) | 68)
  373.    #define IPS_CTRLINFO                (('C'<<8) | 69)
  374.    #define IPS_FLASHBIOS               (('C'<<8) | 70)
  375.    /* flashing defines */
  376.    #define IPS_FW_IMAGE                0x00
  377.    #define IPS_BIOS_IMAGE              0x01
  378.    #define IPS_WRITE_FW                0x01
  379.    #define IPS_WRITE_BIOS              0x02
  380.    #define IPS_ERASE_BIOS              0x03
  381.    #define IPS_BIOS_HEADER             0xC0
  382.    /* time oriented stuff */
  383.    #define IPS_IS_LEAP_YEAR(y)           (((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))) ? 1 : 0)
  384.    #define IPS_NUM_LEAP_YEARS_THROUGH(y) ((y) / 4 - (y) / 100 + (y) / 400)
  385.    #define IPS_SECS_MIN                 60
  386.    #define IPS_SECS_HOUR                3600
  387.    #define IPS_SECS_8HOURS              28800
  388.    #define IPS_SECS_DAY                 86400
  389.    #define IPS_DAYS_NORMAL_YEAR         365
  390.    #define IPS_DAYS_LEAP_YEAR           366
  391.    #define IPS_EPOCH_YEAR               1970
  392.    /*
  393.     * Scsi_Host Template
  394.     */
  395. #if LINUX_VERSION_CODE < LinuxVersionCode(2,4,0)
  396.  #define IPS {                            
  397.     next : NULL,                          
  398.     module : NULL,                        
  399.     proc_info : NULL,                     
  400.     proc_dir : NULL,                      
  401.     name : NULL,                          
  402.     detect : ips_detect,                  
  403.     release : ips_release,                
  404.     info : ips_info,                      
  405.     command : NULL,                       
  406.     queuecommand : ips_queue,             
  407.     eh_strategy_handler : NULL,           
  408.     eh_abort_handler : ips_eh_abort,      
  409.     eh_device_reset_handler : NULL,       
  410.     eh_bus_reset_handler : NULL,          
  411.     eh_host_reset_handler : ips_eh_reset, 
  412.     abort : NULL,                         
  413.     reset : NULL,                         
  414.     slave_attach : NULL,                  
  415.     bios_param : ips_biosparam,           
  416.     can_queue : 0,                        
  417.     this_id: -1,                          
  418.     sg_tablesize : IPS_MAX_SG,            
  419.     cmd_per_lun: 16,                      
  420.     present : 0,                          
  421.     unchecked_isa_dma : 0,                
  422.     use_clustering : ENABLE_CLUSTERING,   
  423.     use_new_eh_code : 1                   
  424. }
  425. #else
  426.  #define IPS {                            
  427.     next : NULL,                          
  428.     module : NULL,                        
  429.     proc_info : NULL,                     
  430.     name : NULL,                          
  431.     detect : ips_detect,                  
  432.     release : ips_release,                
  433.     info : ips_info,                      
  434.     command : NULL,                       
  435.     queuecommand : ips_queue,             
  436.     eh_strategy_handler : NULL,           
  437.     eh_abort_handler : ips_eh_abort,      
  438.     eh_device_reset_handler : NULL,       
  439.     eh_bus_reset_handler : NULL,          
  440.     eh_host_reset_handler : ips_eh_reset, 
  441.     abort : NULL,                         
  442.     reset : NULL,                         
  443.     slave_attach : NULL,                  
  444.     bios_param : ips_biosparam,           
  445.     can_queue : 0,                        
  446.     this_id: -1,                          
  447.     sg_tablesize : IPS_MAX_SG,            
  448.     cmd_per_lun: 16,                      
  449.     present : 0,                          
  450.     unchecked_isa_dma : 0,                
  451.     use_clustering : ENABLE_CLUSTERING,   
  452.     use_new_eh_code : 1                   
  453. }
  454. #endif
  455. /*
  456.  * IBM PCI Raid Command Formats
  457.  */
  458. typedef struct {
  459.    uint8_t  op_code;
  460.    uint8_t  command_id;
  461.    uint8_t  log_drv;
  462.    uint8_t  sg_count;
  463.    uint32_t lba;
  464.    uint32_t sg_addr;
  465.    uint16_t sector_count;
  466.    uint16_t reserved;
  467.    uint32_t ccsar;
  468.    uint32_t cccr;
  469. } IPS_IO_CMD, *PIPS_IO_CMD;
  470. typedef struct {
  471.    uint8_t  op_code;
  472.    uint8_t  command_id;
  473.    uint16_t reserved;
  474.    uint32_t reserved2;
  475.    uint32_t buffer_addr;
  476.    uint32_t reserved3;
  477.    uint32_t ccsar;
  478.    uint32_t cccr;
  479. } IPS_LD_CMD, *PIPS_LD_CMD;
  480. typedef struct {
  481.    uint8_t  op_code;
  482.    uint8_t  command_id;
  483.    uint8_t  reserved;
  484.    uint8_t  reserved2;
  485.    uint32_t reserved3;
  486.    uint32_t buffer_addr;
  487.    uint32_t reserved4;
  488. } IPS_IOCTL_CMD, *PIPS_IOCTL_CMD; 
  489. typedef struct {
  490.    uint8_t  op_code;
  491.    uint8_t  command_id;
  492.    uint8_t  channel;
  493.    uint8_t  reserved3;
  494.    uint8_t  reserved4;
  495.    uint8_t  reserved5;
  496.    uint8_t  reserved6;
  497.    uint8_t  reserved7;
  498.    uint8_t  reserved8;
  499.    uint8_t  reserved9;
  500.    uint8_t  reserved10;
  501.    uint8_t  reserved11;
  502.    uint8_t  reserved12;
  503.    uint8_t  reserved13;
  504.    uint8_t  reserved14;
  505.    uint8_t  adapter_flag;
  506. } IPS_RESET_CMD, *PIPS_RESET_CMD;
  507. typedef struct {
  508.    uint8_t  op_code;
  509.    uint8_t  command_id;
  510.    uint16_t reserved;
  511.    uint32_t reserved2;
  512.    uint32_t dcdb_address;
  513.    uint32_t reserved3;
  514.    uint32_t ccsar;
  515.    uint32_t cccr;
  516. } IPS_DCDB_CMD, *PIPS_DCDB_CMD;
  517. typedef struct {
  518.    uint8_t  op_code;
  519.    uint8_t  command_id;
  520.    uint8_t  channel;
  521.    uint8_t  source_target;
  522.    uint32_t reserved;
  523.    uint32_t reserved2;
  524.    uint32_t reserved3;
  525.    uint32_t ccsar;
  526.    uint32_t cccr;
  527. } IPS_CS_CMD, *PIPS_CS_CMD;
  528. typedef struct {
  529.    uint8_t  op_code;
  530.    uint8_t  command_id;
  531.    uint8_t  log_drv;
  532.    uint8_t  control;
  533.    uint32_t reserved;
  534.    uint32_t reserved2;
  535.    uint32_t reserved3;
  536.    uint32_t ccsar;
  537.    uint32_t cccr;
  538. } IPS_US_CMD, *PIPS_US_CMD;
  539. typedef struct {
  540.    uint8_t  op_code;
  541.    uint8_t  command_id;
  542.    uint8_t  reserved;
  543.    uint8_t  state;
  544.    uint32_t reserved2;
  545.    uint32_t reserved3;
  546.    uint32_t reserved4;
  547.    uint32_t ccsar;
  548.    uint32_t cccr;
  549. } IPS_FC_CMD, *PIPS_FC_CMD;
  550. typedef struct {
  551.    uint8_t  op_code;
  552.    uint8_t  command_id;
  553.    uint8_t  reserved;
  554.    uint8_t  desc;
  555.    uint32_t reserved2;
  556.    uint32_t buffer_addr;
  557.    uint32_t reserved3;
  558.    uint32_t ccsar;
  559.    uint32_t cccr;
  560. } IPS_STATUS_CMD, *PIPS_STATUS_CMD;
  561. typedef struct {
  562.    uint8_t  op_code;
  563.    uint8_t  command_id;
  564.    uint8_t  page;
  565.    uint8_t  write;
  566.    uint32_t reserved;
  567.    uint32_t buffer_addr;
  568.    uint32_t reserved2;
  569.    uint32_t ccsar;
  570.    uint32_t cccr;
  571. } IPS_NVRAM_CMD, *PIPS_NVRAM_CMD;
  572. typedef struct 
  573. {
  574.     uint8_t  op_code;
  575.     uint8_t  command_id;
  576.     uint16_t reserved;
  577.     uint32_t count;
  578.     uint32_t buffer_addr;
  579.     uint32_t reserved2;
  580. } IPS_VERSION_INFO, *PIPS_VERSION_INFO;
  581. typedef struct {
  582.    uint8_t  op_code;
  583.    uint8_t  command_id;
  584.    uint8_t  reset_count;
  585.    uint8_t  reset_type;
  586.    uint8_t  second;
  587.    uint8_t  minute;
  588.    uint8_t  hour;
  589.    uint8_t  day;
  590.    uint8_t  reserved1[4];
  591.    uint8_t  month;
  592.    uint8_t  yearH;
  593.    uint8_t  yearL;
  594.    uint8_t  reserved2;
  595. } IPS_FFDC_CMD, *PIPS_FFDC_CMD;
  596. typedef struct {
  597.    uint8_t  op_code;
  598.    uint8_t  command_id;
  599.    uint8_t  type;
  600.    uint8_t  direction;
  601.    uint32_t count;
  602.    uint32_t buffer_addr;
  603.    uint8_t  total_packets;
  604.    uint8_t  packet_num;
  605.    uint16_t reserved;
  606. } IPS_FLASHFW_CMD, *PIPS_FLASHFW_CMD;
  607. typedef struct {
  608.    uint8_t  op_code;
  609.    uint8_t  command_id;
  610.    uint8_t  type;
  611.    uint8_t  direction;
  612.    uint32_t count;
  613.    uint32_t buffer_addr;
  614.    uint32_t offset;
  615. } IPS_FLASHBIOS_CMD, *PIPS_FLASHBIOS_CMD;
  616. typedef union {
  617.    IPS_IO_CMD         basic_io;
  618.    IPS_LD_CMD         logical_info;
  619.    IPS_IOCTL_CMD      ioctl_info;
  620.    IPS_DCDB_CMD       dcdb;
  621.    IPS_CS_CMD         config_sync;
  622.    IPS_US_CMD         unlock_stripe;
  623.    IPS_FC_CMD         flush_cache;
  624.    IPS_STATUS_CMD     status;
  625.    IPS_NVRAM_CMD      nvram;
  626.    IPS_FFDC_CMD       ffdc;
  627.    IPS_FLASHFW_CMD    flashfw;
  628.    IPS_FLASHBIOS_CMD  flashbios;
  629.    IPS_VERSION_INFO   version_info;
  630.    IPS_RESET_CMD      reset;
  631. } IPS_HOST_COMMAND, *PIPS_HOST_COMMAND;
  632. typedef struct {
  633.    uint8_t  logical_id;
  634.    uint8_t  reserved;
  635.    uint8_t  raid_level;
  636.    uint8_t  state;
  637.    uint32_t sector_count;
  638. } IPS_DRIVE_INFO, *PIPS_DRIVE_INFO;
  639. typedef struct {
  640.    uint8_t       no_of_log_drive;
  641.    uint8_t       reserved[3];
  642.    IPS_DRIVE_INFO drive_info[IPS_MAX_LD];
  643. } IPS_LD_INFO, *PIPS_LD_INFO;
  644. typedef struct {
  645.    uint8_t   device_address;
  646.    uint8_t   cmd_attribute;
  647.    uint16_t  transfer_length;
  648.    uint32_t  buffer_pointer;
  649.    uint8_t   cdb_length;
  650.    uint8_t   sense_length;
  651.    uint8_t   sg_count;
  652.    uint8_t   reserved;
  653.    uint8_t   scsi_cdb[12];
  654.    uint8_t   sense_info[64];
  655.    uint8_t   scsi_status;
  656.    uint8_t   reserved2[3];
  657. } IPS_DCDB_TABLE, *PIPS_DCDB_TABLE;
  658. typedef struct {
  659.    uint8_t   device_address;
  660.    uint8_t   cmd_attribute;
  661.    uint8_t   cdb_length;
  662.    uint8_t   reserved_for_LUN;   
  663.    uint32_t  transfer_length;
  664.    uint32_t  buffer_pointer;
  665.    uint16_t  sg_count;
  666.    uint8_t   sense_length;
  667.    uint8_t   scsi_status;
  668.    uint32_t  reserved;
  669.    uint8_t   scsi_cdb[16];
  670.    uint8_t   sense_info[56];
  671. } IPS_DCDB_TABLE_TAPE, *PIPS_DCDB_TABLE_TAPE;
  672. typedef union {
  673.    struct {
  674.       volatile uint8_t  reserved;
  675.       volatile uint8_t  command_id;
  676.       volatile uint8_t  basic_status;
  677.       volatile uint8_t  extended_status;
  678.    } fields;
  679.    volatile uint32_t    value;
  680. } IPS_STATUS, *PIPS_STATUS;
  681. typedef struct {
  682.    IPS_STATUS           status[IPS_MAX_CMDS + 1];
  683.    volatile PIPS_STATUS p_status_start;
  684.    volatile PIPS_STATUS p_status_end;
  685.    volatile PIPS_STATUS p_status_tail;
  686.    volatile uint32_t    hw_status_start;
  687.    volatile uint32_t    hw_status_tail;
  688.    IPS_LD_INFO          logical_drive_info;
  689. } IPS_ADAPTER, *PIPS_ADAPTER;
  690. typedef struct {
  691.    uint8_t  ucLogDriveCount;
  692.    uint8_t  ucMiscFlag;
  693.    uint8_t  ucSLTFlag;
  694.    uint8_t  ucBSTFlag;
  695.    uint8_t  ucPwrChgCnt;
  696.    uint8_t  ucWrongAdrCnt;
  697.    uint8_t  ucUnidentCnt;
  698.    uint8_t  ucNVramDevChgCnt;
  699.    uint8_t  CodeBlkVersion[8];
  700.    uint8_t  BootBlkVersion[8];
  701.    uint32_t ulDriveSize[IPS_MAX_LD];
  702.    uint8_t  ucConcurrentCmdCount;
  703.    uint8_t  ucMaxPhysicalDevices;
  704.    uint16_t usFlashRepgmCount;
  705.    uint8_t  ucDefunctDiskCount;
  706.    uint8_t  ucRebuildFlag;
  707.    uint8_t  ucOfflineLogDrvCount;
  708.    uint8_t  ucCriticalDrvCount;
  709.    uint16_t usConfigUpdateCount;
  710.    uint8_t  ucBlkFlag;
  711.    uint8_t  reserved;
  712.    uint16_t usAddrDeadDisk[IPS_MAX_CHANNELS * IPS_MAX_TARGETS];
  713. } IPS_ENQ, *PIPS_ENQ;
  714. typedef struct {
  715.    uint8_t  ucInitiator;
  716.    uint8_t  ucParameters;
  717.    uint8_t  ucMiscFlag;
  718.    uint8_t  ucState;
  719.    uint32_t ulBlockCount;
  720.    uint8_t  ucDeviceId[28];
  721. } IPS_DEVSTATE, *PIPS_DEVSTATE;
  722. typedef struct {
  723.    uint8_t  ucChn;
  724.    uint8_t  ucTgt;
  725.    uint16_t ucReserved;
  726.    uint32_t ulStartSect;
  727.    uint32_t ulNoOfSects;
  728. } IPS_CHUNK, *PIPS_CHUNK;
  729. typedef struct {
  730.    uint16_t ucUserField;
  731.    uint8_t  ucState;
  732.    uint8_t  ucRaidCacheParam;
  733.    uint8_t  ucNoOfChunkUnits;
  734.    uint8_t  ucStripeSize;
  735.    uint8_t  ucParams;
  736.    uint8_t  ucReserved;
  737.    uint32_t ulLogDrvSize;
  738.    IPS_CHUNK chunk[IPS_MAX_CHUNKS];
  739. } IPS_LD, *PIPS_LD;
  740. typedef struct {
  741.    uint8_t  board_disc[8];
  742.    uint8_t  processor[8];
  743.    uint8_t  ucNoChanType;
  744.    uint8_t  ucNoHostIntType;
  745.    uint8_t  ucCompression;
  746.    uint8_t  ucNvramType;
  747.    uint32_t ulNvramSize;
  748. } IPS_HARDWARE, *PIPS_HARDWARE;
  749. typedef struct {
  750.    uint8_t        ucLogDriveCount;
  751.    uint8_t        ucDateD;
  752.    uint8_t        ucDateM;
  753.    uint8_t        ucDateY;
  754.    uint8_t        init_id[4];
  755.    uint8_t        host_id[12];
  756.    uint8_t        time_sign[8];
  757.    uint32_t       UserOpt;
  758.    uint16_t       user_field;
  759.    uint8_t        ucRebuildRate;
  760.    uint8_t        ucReserve;
  761.    IPS_HARDWARE   hardware_disc;
  762.    IPS_LD         logical_drive[IPS_MAX_LD];
  763.    IPS_DEVSTATE   dev[IPS_MAX_CHANNELS][IPS_MAX_TARGETS+1];
  764.    uint8_t        reserved[512];
  765. } IPS_CONF, *PIPS_CONF;
  766. typedef struct {
  767.    uint32_t  signature;
  768.    uint8_t   reserved1;
  769.    uint8_t   adapter_slot;
  770.    uint16_t  adapter_type;
  771.    uint8_t   ctrl_bios[8];
  772.    uint8_t   versioning;                   /* 1 = Versioning Supported, else 0 */
  773.    uint8_t   version_mismatch;             /* 1 = Versioning MisMatch,  else 0 */
  774.    uint8_t   reserved2;
  775.    uint8_t   operating_system;
  776.    uint8_t   driver_high[4];
  777.    uint8_t   driver_low[4];
  778.    uint8_t   BiosCompatibilityID[8];
  779.    uint8_t   ReservedForOS2[8];
  780.    uint8_t   bios_high[4];                 /* Adapter's Flashed BIOS Version   */
  781.    uint8_t   bios_low[4];
  782.    uint8_t   Filler[76];
  783. } IPS_NVRAM_P5, *PIPS_NVRAM_P5;
  784. /*--------------------------------------------------------------------------*/
  785. /* Data returned from a GetVersion Command                                  */
  786. /*--------------------------------------------------------------------------*/
  787.                                              /* SubSystem Parameter[4]      */
  788. #define  IPS_GET_VERSION_SUPPORT 0x00018000  /* Mask for Versioning Support */
  789. typedef struct 
  790. {
  791.    uint32_t  revision;
  792.    uint8_t   bootBlkVersion[32];
  793.    uint8_t   bootBlkAttributes[4];
  794.    uint8_t   codeBlkVersion[32];
  795.    uint8_t   biosVersion[32];
  796.    uint8_t   biosAttributes[4];
  797.    uint8_t   compatibilityId[32];
  798.    uint8_t   reserved[4];
  799. } IPS_VERSION_DATA;
  800. typedef struct _IPS_SUBSYS {
  801.    uint32_t  param[128];
  802. } IPS_SUBSYS, *PIPS_SUBSYS;
  803. /**
  804.  ** SCSI Structures
  805.  **/
  806. /*
  807.  * Inquiry Data Format
  808.  */
  809. typedef struct {
  810.    uint8_t   DeviceType;
  811.    uint8_t   DeviceTypeQualifier;
  812.    uint8_t   Version;
  813.    uint8_t   ResponseDataFormat;
  814.    uint8_t   AdditionalLength;
  815.    uint8_t   Reserved;
  816.    uint8_t   Flags[2];
  817.    uint8_t   VendorId[8];
  818.    uint8_t   ProductId[16];
  819.    uint8_t   ProductRevisionLevel[4];
  820.    uint8_t   Reserved2;                                  /* Provides NULL terminator to name */
  821. } IPS_SCSI_INQ_DATA, *PIPS_SCSI_INQ_DATA;
  822. /*
  823.  * Read Capacity Data Format
  824.  */
  825. typedef struct {
  826.    uint32_t lba;
  827.    uint32_t len;
  828. } IPS_SCSI_CAPACITY;
  829. /*
  830.  * Request Sense Data Format
  831.  */
  832. typedef struct {
  833.    uint8_t  ResponseCode;
  834.    uint8_t  SegmentNumber;
  835.    uint8_t  Flags;
  836.    uint8_t  Information[4];
  837.    uint8_t  AdditionalLength;
  838.    uint8_t  CommandSpecific[4];
  839.    uint8_t  AdditionalSenseCode;
  840.    uint8_t  AdditionalSenseCodeQual;
  841.    uint8_t  FRUCode;
  842.    uint8_t  SenseKeySpecific[3];
  843. } IPS_SCSI_REQSEN;
  844. /*
  845.  * Sense Data Format - Page 3
  846.  */
  847. typedef struct {
  848.    uint8_t  PageCode;
  849.    uint8_t  PageLength;
  850.    uint16_t TracksPerZone;
  851.    uint16_t AltSectorsPerZone;
  852.    uint16_t AltTracksPerZone;
  853.    uint16_t AltTracksPerVolume;
  854.    uint16_t SectorsPerTrack;
  855.    uint16_t BytesPerSector;
  856.    uint16_t Interleave;
  857.    uint16_t TrackSkew;
  858.    uint16_t CylinderSkew;
  859.    uint8_t  flags;
  860.    uint8_t  reserved[3];
  861. } IPS_SCSI_MODE_PAGE3;
  862. /*
  863.  * Sense Data Format - Page 4
  864.  */
  865. typedef struct {
  866.    uint8_t  PageCode;
  867.    uint8_t  PageLength;
  868.    uint16_t CylindersHigh;
  869.    uint8_t  CylindersLow;
  870.    uint8_t  Heads;
  871.    uint16_t WritePrecompHigh;
  872.    uint8_t  WritePrecompLow;
  873.    uint16_t ReducedWriteCurrentHigh;
  874.    uint8_t  ReducedWriteCurrentLow;
  875.    uint16_t StepRate;
  876.    uint16_t LandingZoneHigh;
  877.    uint8_t  LandingZoneLow;
  878.    uint8_t  flags;
  879.    uint8_t  RotationalOffset;
  880.    uint8_t  Reserved;
  881.    uint16_t MediumRotationRate;
  882.    uint8_t  Reserved2[2];
  883. } IPS_SCSI_MODE_PAGE4;
  884. /*
  885.  * Sense Data Format - Block Descriptor (DASD)
  886.  */
  887. typedef struct {
  888.    uint32_t NumberOfBlocks;
  889.    uint8_t  DensityCode;
  890.    uint16_t BlockLengthHigh;
  891.    uint8_t  BlockLengthLow;
  892. } IPS_SCSI_MODE_PAGE_BLKDESC;
  893. /*
  894.  * Sense Data Format - Mode Page Header
  895.  */
  896. typedef struct {
  897.    uint8_t  DataLength;
  898.    uint8_t  MediumType;
  899.    uint8_t  Reserved;
  900.    uint8_t  BlockDescLength;
  901. } IPS_SCSI_MODE_PAGE_HEADER;
  902. typedef struct {
  903.    IPS_SCSI_MODE_PAGE_HEADER  hdr;
  904.    IPS_SCSI_MODE_PAGE_BLKDESC blkdesc;
  905.    union {
  906.       IPS_SCSI_MODE_PAGE3 pg3;
  907.       IPS_SCSI_MODE_PAGE4 pg4;
  908.    } pdata;
  909. } IPS_SCSI_MODE_PAGE_DATA;
  910. /*
  911.  * Scatter Gather list format
  912.  */
  913. typedef struct ips_sglist {
  914.    uint32_t address;
  915.    uint32_t length;
  916. } IPS_SG_LIST, *PIPS_SG_LIST;
  917. typedef struct _IPS_INFOSTR {
  918.    char *buffer;
  919.    int   length;
  920.    int   offset;
  921.    int   pos;
  922.    int   localpos;
  923. } IPS_INFOSTR;
  924. typedef struct {
  925.    char *option_name;
  926.    int  *option_flag;
  927.    int   option_value;
  928. } IPS_OPTION;
  929. typedef struct {
  930.    void             *userbuffer;
  931.    uint32_t          usersize;
  932.    void             *kernbuffer;
  933.    uint32_t          kernsize;
  934.    void             *ha;
  935.    void             *SC;
  936.    void             *pt;
  937.    struct semaphore *sem;
  938.    uint32_t          offset;
  939.    uint32_t          retcode;
  940. } IPS_FLASH_DATA;
  941. /*
  942.  * Status Info
  943.  */
  944. typedef struct ips_stat {
  945.    uint32_t residue_len;
  946.    void     *scb_addr;
  947.    uint8_t  padding[12 - sizeof(void *)];
  948. } ips_stat_t;
  949. /*
  950.  * SCB Queue Format
  951.  */
  952. typedef struct ips_scb_queue {
  953.    struct ips_scb *head;
  954.    struct ips_scb *tail;
  955.    int             count;
  956.    unsigned long   cpu_flags;
  957.    spinlock_t      lock;
  958. } ips_scb_queue_t;
  959. /*
  960.  * Wait queue_format
  961.  */
  962. typedef struct ips_wait_queue {
  963.    Scsi_Cmnd      *head;
  964.    Scsi_Cmnd      *tail;
  965.    int             count;
  966.    unsigned long   cpu_flags;
  967.    spinlock_t      lock;
  968. } ips_wait_queue_t;
  969. typedef struct ips_copp_wait_item {
  970.    Scsi_Cmnd                 *scsi_cmd;
  971.    struct semaphore          *sem;
  972.    struct ips_copp_wait_item *next;
  973. } ips_copp_wait_item_t;
  974. typedef struct ips_copp_queue {
  975.    struct ips_copp_wait_item *head;
  976.    struct ips_copp_wait_item *tail;
  977.    int                        count;
  978.    unsigned long              cpu_flags;
  979.    spinlock_t                 lock;
  980. } ips_copp_queue_t;
  981. /* forward decl for host structure */
  982. struct ips_ha;
  983. typedef struct {
  984.    int       (*reset)(struct ips_ha *);
  985.    int       (*issue)(struct ips_ha *, struct ips_scb *);
  986.    int       (*isinit)(struct ips_ha *);
  987.    int       (*isintr)(struct ips_ha *);
  988.    int       (*init)(struct ips_ha *);
  989.    int       (*erasebios)(struct ips_ha *);
  990.    int       (*programbios)(struct ips_ha *, char *, uint32_t, uint32_t);
  991.    int       (*verifybios)(struct ips_ha *, char *, uint32_t, uint32_t);
  992.    void      (*statinit)(struct ips_ha *);
  993.    void      (*intr)(struct ips_ha *);
  994.    void      (*enableint)(struct ips_ha *);
  995.    uint32_t (*statupd)(struct ips_ha *);
  996. } ips_hw_func_t;
  997. typedef struct ips_ha {
  998.    uint8_t            ha_id[IPS_MAX_CHANNELS+1];
  999.    uint32_t           dcdb_active[IPS_MAX_CHANNELS];
  1000.    uint32_t           io_addr;            /* Base I/O address           */
  1001.    uint8_t            irq;                /* IRQ for adapter            */
  1002.    uint8_t            ntargets;           /* Number of targets          */
  1003.    uint8_t            nbus;               /* Number of buses            */
  1004.    uint8_t            nlun;               /* Number of Luns             */
  1005.    uint16_t           ad_type;            /* Adapter type               */
  1006.    uint16_t           host_num;           /* Adapter number             */
  1007.    uint32_t           max_xfer;           /* Maximum Xfer size          */
  1008.    uint32_t           max_cmds;           /* Max concurrent commands    */
  1009.    uint32_t           num_ioctl;          /* Number of Ioctls           */
  1010.    ips_stat_t         sp;                 /* Status packer pointer      */
  1011.    struct ips_scb    *scbs;               /* Array of all CCBS          */
  1012.    struct ips_scb    *scb_freelist;       /* SCB free list              */
  1013.    ips_wait_queue_t   scb_waitlist;       /* Pending SCB list           */
  1014.    ips_copp_queue_t   copp_waitlist;      /* Pending PT list            */
  1015.    ips_scb_queue_t    scb_activelist;     /* Active SCB list            */
  1016.    IPS_IO_CMD        *dummy;              /* dummy command              */
  1017.    IPS_ADAPTER       *adapt;              /* Adapter status area        */
  1018.    IPS_ENQ           *enq;                /* Adapter Enquiry data       */
  1019.    IPS_CONF          *conf;               /* Adapter config data        */
  1020.    IPS_NVRAM_P5      *nvram;              /* NVRAM page 5 data          */
  1021.    IPS_SUBSYS        *subsys;             /* Subsystem parameters       */
  1022.    char              *ioctl_data;         /* IOCTL data area            */
  1023.    uint32_t           ioctl_datasize;     /* IOCTL data size            */
  1024.    uint32_t           cmd_in_progress;    /* Current command in progress*/
  1025.    unsigned long      flags;              /* HA flags                   */
  1026.    uint8_t            waitflag;           /* are we waiting for cmd     */
  1027.    uint8_t            active;
  1028.    int                ioctl_reset;        /* IOCTL Requested Reset Flag */
  1029.    uint16_t           reset_count;        /* number of resets           */
  1030.    time_t             last_ffdc;          /* last time we sent ffdc info*/
  1031.    uint8_t            revision_id;        /* Revision level             */
  1032.    uint16_t           device_id;          /* PCI device ID              */
  1033.    uint8_t            slot_num;           /* PCI Slot Number            */
  1034.    uint16_t           subdevice_id;       /* Subsystem device ID        */
  1035.    uint8_t            ioctl_order;        /* Number of pages in ioctl   */
  1036.    uint8_t            reserved2;          /* Empty                      */
  1037.    uint8_t            bios_version[8];    /* BIOS Revision              */
  1038.    uint32_t           mem_addr;           /* Memory mapped address      */
  1039.    uint32_t           io_len;             /* Size of IO Address         */
  1040.    uint32_t           mem_len;            /* Size of memory address     */
  1041.    char              *mem_ptr;            /* Memory mapped Ptr          */
  1042.    char              *ioremap_ptr;        /* ioremapped memory pointer  */
  1043.    ips_hw_func_t      func;               /* hw function pointers       */
  1044.    struct pci_dev    *pcidev;             /* PCI device handle          */
  1045.    spinlock_t         scb_lock;
  1046.    spinlock_t         copp_lock;
  1047.    spinlock_t         ips_lock;
  1048.    struct semaphore   ioctl_sem;          /* Semaphore for new IOCTL's  */
  1049.    struct semaphore   flash_ioctl_sem;    /* Semaphore for Flashing     */
  1050.    char              *flash_data;         /* Save Area for flash data   */
  1051.    u8                 flash_order;        /* Save Area for flash size order  */
  1052.    u32                flash_datasize;   /* Save Area for flash data size */
  1053. } ips_ha_t;
  1054. typedef void (*ips_scb_callback) (ips_ha_t *, struct ips_scb *);
  1055. /*
  1056.  * SCB Format
  1057.  */
  1058. typedef struct ips_scb {
  1059.    IPS_HOST_COMMAND  cmd;
  1060.    IPS_DCDB_TABLE    dcdb;
  1061.    uint8_t           target_id;
  1062.    uint8_t           bus;
  1063.    uint8_t           lun;
  1064.    uint8_t           cdb[12];
  1065.    uint32_t          scb_busaddr;
  1066.    uint32_t          data_busaddr;
  1067.    uint32_t          timeout;
  1068.    uint8_t           basic_status;
  1069.    uint8_t           extended_status;
  1070.    uint8_t           breakup;
  1071.    uint8_t           sg_break;
  1072.    uint32_t          data_len;
  1073.    uint32_t          sg_len;
  1074.    uint32_t          flags;
  1075.    uint32_t          op_code;
  1076.    IPS_SG_LIST      *sg_list;
  1077.    Scsi_Cmnd        *scsi_cmd;
  1078.    struct ips_scb   *q_next;
  1079.    ips_scb_callback  callback;
  1080.    struct semaphore *sem;
  1081.    uint32_t          sg_busaddr;
  1082.    int               sg_count;
  1083. } ips_scb_t;
  1084. typedef struct ips_scb_pt {
  1085.    IPS_HOST_COMMAND  cmd;
  1086.    IPS_DCDB_TABLE    dcdb;
  1087.    uint8_t           target_id;
  1088.    uint8_t           bus;
  1089.    uint8_t           lun;
  1090.    uint8_t           cdb[12];
  1091.    uint32_t          scb_busaddr;
  1092.    uint32_t          data_busaddr;
  1093.    uint32_t          timeout;
  1094.    uint8_t           basic_status;
  1095.    uint8_t           extended_status;
  1096.    uint16_t          breakup;
  1097.    uint32_t          data_len;
  1098.    uint32_t          sg_len;
  1099.    uint32_t          flags;
  1100.    uint32_t          op_code;
  1101.    IPS_SG_LIST      *sg_list;
  1102.    Scsi_Cmnd        *scsi_cmd;
  1103.    struct ips_scb   *q_next;
  1104.    ips_scb_callback  callback;
  1105. } ips_scb_pt_t;
  1106. /*
  1107.  * Passthru Command Format
  1108.  */
  1109. typedef struct {
  1110.    uint8_t       CoppID[4];
  1111.    uint32_t      CoppCmd;
  1112.    uint32_t      PtBuffer;
  1113.    uint8_t      *CmdBuffer;
  1114.    uint32_t      CmdBSize;
  1115.    ips_scb_pt_t  CoppCP;
  1116.    uint32_t      TimeOut;
  1117.    uint8_t       BasicStatus;
  1118.    uint8_t       ExtendedStatus;
  1119.    uint8_t       AdapterType;
  1120.    uint8_t       reserved;
  1121. } ips_passthru_t;
  1122. #endif
  1123. /* The Version Information below gets created by SED during the build process. */
  1124. /* Do not modify the next line; it's what SED is looking for to do the insert. */
  1125. /* Version Info                                                                */
  1126. /*************************************************************************
  1127. *
  1128. * VERSION.H -- version numbers and copyright notices in various formats
  1129. *
  1130. *************************************************************************/
  1131. #define IPS_VER_MAJOR 5
  1132. #define IPS_VER_MAJOR_STRING "5"
  1133. #define IPS_VER_MINOR 10
  1134. #define IPS_VER_MINOR_STRING "10"
  1135. #define IPS_VER_BUILD 21
  1136. #define IPS_VER_BUILD_STRING "21"
  1137. #define IPS_VER_STRING "5.10.21"
  1138. #define IPS_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002. All Rights Reserved."
  1139. #define IPS_ADAPTECCOPYRIGHT_STRING "(c) Copyright Adaptec, Inc. 2002 to present. All Rights Reserved."
  1140. #define IPS_NT_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002."
  1141. /* Version numbers for various adapters */
  1142. #define IPS_VER_SERVERAID1 "2.25.01"
  1143. #define IPS_VER_SERVERAID2 "2.88.13"
  1144. #define IPS_VER_NAVAJO "2.88.13"
  1145. #define IPS_VER_SERVERAID3 "5.10.21"
  1146. #define IPS_VER_SERVERAID4H "5.10.21"
  1147. #define IPS_VER_SERVERAID4MLx "5.10.21"
  1148. #define IPS_VER_SARASOTA "5.10.21"
  1149. /* Compatability IDs for various adapters */
  1150. #define IPS_COMPAT_UNKNOWN ""
  1151. #define IPS_COMPAT_CURRENT "SA510"
  1152. #define IPS_COMPAT_SERVERAID1 "2.25.01"
  1153. #define IPS_COMPAT_SERVERAID2 "2.88.13"
  1154. #define IPS_COMPAT_NAVAJO  "2.88.13"
  1155. #define IPS_COMPAT_KIOWA "2.88.13"
  1156. #define IPS_COMPAT_SERVERAID3H  "SA510"
  1157. #define IPS_COMPAT_SERVERAID3L  "SA510"
  1158. #define IPS_COMPAT_SERVERAID4H  "SA510"
  1159. #define IPS_COMPAT_SERVERAID4M  "SA510"
  1160. #define IPS_COMPAT_SERVERAID4L  "SA510"
  1161. #define IPS_COMPAT_SERVERAID4Mx "SA510"
  1162. #define IPS_COMPAT_SERVERAID4Lx "SA510"
  1163. #define IPS_COMPAT_SARASOTA     "SA510"
  1164. #define IPS_COMPAT_BIOS "SA510"
  1165. #define IPS_COMPAT_MAX_ADAPTER_TYPE 14
  1166. #define IPS_COMPAT_ID_LENGTH 8
  1167. #define IPS_DEFINE_COMPAT_TABLE(tablename) 
  1168.    char tablename[IPS_COMPAT_MAX_ADAPTER_TYPE] [IPS_COMPAT_ID_LENGTH] = { 
  1169.       IPS_COMPAT_UNKNOWN, 
  1170.       IPS_COMPAT_SERVERAID1, 
  1171.       IPS_COMPAT_SERVERAID2, 
  1172.       IPS_COMPAT_NAVAJO, 
  1173.       IPS_COMPAT_KIOWA, 
  1174.       IPS_COMPAT_SERVERAID3H, 
  1175.       IPS_COMPAT_SERVERAID3L, 
  1176.       IPS_COMPAT_SERVERAID4H, 
  1177.       IPS_COMPAT_SERVERAID4M, 
  1178.       IPS_COMPAT_SERVERAID4L, 
  1179.       IPS_COMPAT_SERVERAID4Mx, 
  1180.       IPS_COMPAT_SERVERAID4Lx, 
  1181.       IPS_COMPAT_SARASOTA, 
  1182.       IPS_COMPAT_SARASOTA 
  1183.    }
  1184. /*
  1185.  * Overrides for Emacs so that we almost follow Linus's tabbing style.
  1186.  * Emacs will notice this stuff at the end of the file and automatically
  1187.  * adjust the settings for this buffer only.  This must remain at the end
  1188.  * of the file.
  1189.  * ---------------------------------------------------------------------------
  1190.  * Local variables:
  1191.  * c-indent-level: 2
  1192.  * c-brace-imaginary-offset: 0
  1193.  * c-brace-offset: -2
  1194.  * c-argdecl-indent: 2
  1195.  * c-label-offset: -2
  1196.  * c-continued-statement-offset: 2
  1197.  * c-continued-brace-offset: 0
  1198.  * indent-tabs-mode: nil
  1199.  * tab-width: 8
  1200.  * End:
  1201.  */