11da177e4SLinus Torvalds /*****************************************************************************/ 21da177e4SLinus Torvalds /* ips.h -- driver for the Adaptec / IBM ServeRAID controller */ 31da177e4SLinus Torvalds /* */ 41da177e4SLinus Torvalds /* Written By: Keith Mitchell, IBM Corporation */ 51da177e4SLinus Torvalds /* Jack Hammer, Adaptec, Inc. */ 61da177e4SLinus Torvalds /* David Jeffery, Adaptec, Inc. */ 71da177e4SLinus Torvalds /* */ 81da177e4SLinus Torvalds /* Copyright (C) 1999 IBM Corporation */ 91da177e4SLinus Torvalds /* Copyright (C) 2003 Adaptec, Inc. */ 101da177e4SLinus Torvalds /* */ 111da177e4SLinus Torvalds /* This program is free software; you can redistribute it and/or modify */ 121da177e4SLinus Torvalds /* it under the terms of the GNU General Public License as published by */ 131da177e4SLinus Torvalds /* the Free Software Foundation; either version 2 of the License, or */ 141da177e4SLinus Torvalds /* (at your option) any later version. */ 151da177e4SLinus Torvalds /* */ 161da177e4SLinus Torvalds /* This program is distributed in the hope that it will be useful, */ 171da177e4SLinus Torvalds /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 181da177e4SLinus Torvalds /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ 191da177e4SLinus Torvalds /* GNU General Public License for more details. */ 201da177e4SLinus Torvalds /* */ 211da177e4SLinus Torvalds /* NO WARRANTY */ 221da177e4SLinus Torvalds /* THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR */ 231da177e4SLinus Torvalds /* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT */ 241da177e4SLinus Torvalds /* LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, */ 251da177e4SLinus Torvalds /* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is */ 261da177e4SLinus Torvalds /* solely responsible for determining the appropriateness of using and */ 271da177e4SLinus Torvalds /* distributing the Program and assumes all risks associated with its */ 281da177e4SLinus Torvalds /* exercise of rights under this Agreement, including but not limited to */ 291da177e4SLinus Torvalds /* the risks and costs of program errors, damage to or loss of data, */ 301da177e4SLinus Torvalds /* programs or equipment, and unavailability or interruption of operations. */ 311da177e4SLinus Torvalds /* */ 321da177e4SLinus Torvalds /* DISCLAIMER OF LIABILITY */ 331da177e4SLinus Torvalds /* NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY */ 341da177e4SLinus Torvalds /* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */ 351da177e4SLinus Torvalds /* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND */ 361da177e4SLinus Torvalds /* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR */ 371da177e4SLinus Torvalds /* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE */ 381da177e4SLinus Torvalds /* USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED */ 391da177e4SLinus Torvalds /* HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES */ 401da177e4SLinus Torvalds /* */ 411da177e4SLinus Torvalds /* You should have received a copy of the GNU General Public License */ 421da177e4SLinus Torvalds /* along with this program; if not, write to the Free Software */ 431da177e4SLinus Torvalds /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ 441da177e4SLinus Torvalds /* */ 451da177e4SLinus Torvalds /* Bugs/Comments/Suggestions should be mailed to: */ 461da177e4SLinus Torvalds /* ipslinux@adaptec.com */ 471da177e4SLinus Torvalds /* */ 481da177e4SLinus Torvalds /*****************************************************************************/ 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds #ifndef _IPS_H_ 511da177e4SLinus Torvalds #define _IPS_H_ 521da177e4SLinus Torvalds 53733482e4SOlaf Hering #include <linux/version.h> 54297295aeSAndrew Morton #include <linux/nmi.h> 551da177e4SLinus Torvalds #include <asm/uaccess.h> 561da177e4SLinus Torvalds #include <asm/io.h> 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds /* 591da177e4SLinus Torvalds * Some handy macros 601da177e4SLinus Torvalds */ 611da177e4SLinus Torvalds #define IPS_HA(x) ((ips_ha_t *) x->hostdata) 621da177e4SLinus Torvalds #define IPS_COMMAND_ID(ha, scb) (int) (scb - ha->scbs) 631da177e4SLinus Torvalds #define IPS_IS_TROMBONE(ha) (((ha->device_id == IPS_DEVICEID_COPPERHEAD) && \ 641da177e4SLinus Torvalds (ha->revision_id >= IPS_REVID_TROMBONE32) && \ 651da177e4SLinus Torvalds (ha->revision_id <= IPS_REVID_TROMBONE64)) ? 1 : 0) 661da177e4SLinus Torvalds #define IPS_IS_CLARINET(ha) (((ha->device_id == IPS_DEVICEID_COPPERHEAD) && \ 671da177e4SLinus Torvalds (ha->revision_id >= IPS_REVID_CLARINETP1) && \ 681da177e4SLinus Torvalds (ha->revision_id <= IPS_REVID_CLARINETP3)) ? 1 : 0) 691da177e4SLinus Torvalds #define IPS_IS_MORPHEUS(ha) (ha->device_id == IPS_DEVICEID_MORPHEUS) 701da177e4SLinus Torvalds #define IPS_IS_MARCO(ha) (ha->device_id == IPS_DEVICEID_MARCO) 711da177e4SLinus Torvalds #define IPS_USE_I2O_DELIVER(ha) ((IPS_IS_MORPHEUS(ha) || \ 721da177e4SLinus Torvalds (IPS_IS_TROMBONE(ha) && \ 731da177e4SLinus Torvalds (ips_force_i2o))) ? 1 : 0) 741da177e4SLinus Torvalds #define IPS_USE_MEMIO(ha) ((IPS_IS_MORPHEUS(ha) || \ 751da177e4SLinus Torvalds ((IPS_IS_TROMBONE(ha) || IPS_IS_CLARINET(ha)) && \ 761da177e4SLinus Torvalds (ips_force_memio))) ? 1 : 0) 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds #define IPS_HAS_ENH_SGLIST(ha) (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) 791da177e4SLinus Torvalds #define IPS_USE_ENH_SGLIST(ha) ((ha)->flags & IPS_HA_ENH_SG) 801da177e4SLinus Torvalds #define IPS_SGLIST_SIZE(ha) (IPS_USE_ENH_SGLIST(ha) ? \ 811da177e4SLinus Torvalds sizeof(IPS_ENH_SG_LIST) : sizeof(IPS_STD_SG_LIST)) 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds #define IPS_PRINTK(level, pcidev, format, arg...) \ 841da177e4SLinus Torvalds dev_printk(level , &((pcidev)->dev) , format , ## arg) 851da177e4SLinus Torvalds 86297295aeSAndrew Morton #define MDELAY(n) \ 87297295aeSAndrew Morton do { \ 88297295aeSAndrew Morton mdelay(n); \ 89297295aeSAndrew Morton touch_nmi_watchdog(); \ 90297295aeSAndrew Morton } while (0) 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds #ifndef min 931da177e4SLinus Torvalds #define min(x,y) ((x) < (y) ? x : y) 941da177e4SLinus Torvalds #endif 951da177e4SLinus Torvalds 96c1a15468SJack Hammer #ifndef __iomem /* For clean compiles in earlier kernels without __iomem annotations */ 97c1a15468SJack Hammer #define __iomem 98c1a15468SJack Hammer #endif 99c1a15468SJack Hammer 1001da177e4SLinus Torvalds #define pci_dma_hi32(a) ((a >> 16) >> 16) 1011da177e4SLinus Torvalds #define pci_dma_lo32(a) (a & 0xffffffff) 1021da177e4SLinus Torvalds 103c6a6c81cSAdrian Bunk #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G) 1041da177e4SLinus Torvalds #define IPS_ENABLE_DMA64 (1) 1051da177e4SLinus Torvalds #else 1061da177e4SLinus Torvalds #define IPS_ENABLE_DMA64 (0) 1071da177e4SLinus Torvalds #endif 1081da177e4SLinus Torvalds 1091da177e4SLinus Torvalds /* 1101da177e4SLinus Torvalds * Adapter address map equates 1111da177e4SLinus Torvalds */ 1121da177e4SLinus Torvalds #define IPS_REG_HISR 0x08 /* Host Interrupt Status Reg */ 1131da177e4SLinus Torvalds #define IPS_REG_CCSAR 0x10 /* Cmd Channel System Addr Reg */ 1141da177e4SLinus Torvalds #define IPS_REG_CCCR 0x14 /* Cmd Channel Control Reg */ 1151da177e4SLinus Torvalds #define IPS_REG_SQHR 0x20 /* Status Q Head Reg */ 1161da177e4SLinus Torvalds #define IPS_REG_SQTR 0x24 /* Status Q Tail Reg */ 1171da177e4SLinus Torvalds #define IPS_REG_SQER 0x28 /* Status Q End Reg */ 1181da177e4SLinus Torvalds #define IPS_REG_SQSR 0x2C /* Status Q Start Reg */ 1191da177e4SLinus Torvalds #define IPS_REG_SCPR 0x05 /* Subsystem control port reg */ 1201da177e4SLinus Torvalds #define IPS_REG_ISPR 0x06 /* interrupt status port reg */ 1211da177e4SLinus Torvalds #define IPS_REG_CBSP 0x07 /* CBSP register */ 1221da177e4SLinus Torvalds #define IPS_REG_FLAP 0x18 /* Flash address port */ 1231da177e4SLinus Torvalds #define IPS_REG_FLDP 0x1C /* Flash data port */ 1241da177e4SLinus Torvalds #define IPS_REG_NDAE 0x38 /* Anaconda 64 NDAE Register */ 1251da177e4SLinus Torvalds #define IPS_REG_I2O_INMSGQ 0x40 /* I2O Inbound Message Queue */ 1261da177e4SLinus Torvalds #define IPS_REG_I2O_OUTMSGQ 0x44 /* I2O Outbound Message Queue */ 1271da177e4SLinus Torvalds #define IPS_REG_I2O_HIR 0x30 /* I2O Interrupt Status */ 1281da177e4SLinus Torvalds #define IPS_REG_I960_IDR 0x20 /* i960 Inbound Doorbell */ 1291da177e4SLinus Torvalds #define IPS_REG_I960_MSG0 0x18 /* i960 Outbound Reg 0 */ 1301da177e4SLinus Torvalds #define IPS_REG_I960_MSG1 0x1C /* i960 Outbound Reg 1 */ 1311da177e4SLinus Torvalds #define IPS_REG_I960_OIMR 0x34 /* i960 Oubound Int Mask Reg */ 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvalds /* 1341da177e4SLinus Torvalds * Adapter register bit equates 1351da177e4SLinus Torvalds */ 1361da177e4SLinus Torvalds #define IPS_BIT_GHI 0x04 /* HISR General Host Interrupt */ 1371da177e4SLinus Torvalds #define IPS_BIT_SQO 0x02 /* HISR Status Q Overflow */ 1381da177e4SLinus Torvalds #define IPS_BIT_SCE 0x01 /* HISR Status Channel Enqueue */ 1391da177e4SLinus Torvalds #define IPS_BIT_SEM 0x08 /* CCCR Semaphore Bit */ 1401da177e4SLinus Torvalds #define IPS_BIT_ILE 0x10 /* CCCR ILE Bit */ 1411da177e4SLinus Torvalds #define IPS_BIT_START_CMD 0x101A /* CCCR Start Command Channel */ 1421da177e4SLinus Torvalds #define IPS_BIT_START_STOP 0x0002 /* CCCR Start/Stop Bit */ 1431da177e4SLinus Torvalds #define IPS_BIT_RST 0x80 /* SCPR Reset Bit */ 1441da177e4SLinus Torvalds #define IPS_BIT_EBM 0x02 /* SCPR Enable Bus Master */ 1451da177e4SLinus Torvalds #define IPS_BIT_EI 0x80 /* HISR Enable Interrupts */ 1461da177e4SLinus Torvalds #define IPS_BIT_OP 0x01 /* OP bit in CBSP */ 1471da177e4SLinus Torvalds #define IPS_BIT_I2O_OPQI 0x08 /* General Host Interrupt */ 1481da177e4SLinus Torvalds #define IPS_BIT_I960_MSG0I 0x01 /* Message Register 0 Interrupt*/ 1491da177e4SLinus Torvalds #define IPS_BIT_I960_MSG1I 0x02 /* Message Register 1 Interrupt*/ 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds /* 1521da177e4SLinus Torvalds * Adapter Command ID Equates 1531da177e4SLinus Torvalds */ 1541da177e4SLinus Torvalds #define IPS_CMD_GET_LD_INFO 0x19 1551da177e4SLinus Torvalds #define IPS_CMD_GET_SUBSYS 0x40 1561da177e4SLinus Torvalds #define IPS_CMD_READ_CONF 0x38 1571da177e4SLinus Torvalds #define IPS_CMD_RW_NVRAM_PAGE 0xBC 1581da177e4SLinus Torvalds #define IPS_CMD_READ 0x02 1591da177e4SLinus Torvalds #define IPS_CMD_WRITE 0x03 1601da177e4SLinus Torvalds #define IPS_CMD_FFDC 0xD7 1611da177e4SLinus Torvalds #define IPS_CMD_ENQUIRY 0x05 1621da177e4SLinus Torvalds #define IPS_CMD_FLUSH 0x0A 1631da177e4SLinus Torvalds #define IPS_CMD_READ_SG 0x82 1641da177e4SLinus Torvalds #define IPS_CMD_WRITE_SG 0x83 1651da177e4SLinus Torvalds #define IPS_CMD_DCDB 0x04 1661da177e4SLinus Torvalds #define IPS_CMD_DCDB_SG 0x84 1671da177e4SLinus Torvalds #define IPS_CMD_EXTENDED_DCDB 0x95 1681da177e4SLinus Torvalds #define IPS_CMD_EXTENDED_DCDB_SG 0x96 1691da177e4SLinus Torvalds #define IPS_CMD_CONFIG_SYNC 0x58 1701da177e4SLinus Torvalds #define IPS_CMD_ERROR_TABLE 0x17 1711da177e4SLinus Torvalds #define IPS_CMD_DOWNLOAD 0x20 1721da177e4SLinus Torvalds #define IPS_CMD_RW_BIOSFW 0x22 1731da177e4SLinus Torvalds #define IPS_CMD_GET_VERSION_INFO 0xC6 1741da177e4SLinus Torvalds #define IPS_CMD_RESET_CHANNEL 0x1A 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds /* 1771da177e4SLinus Torvalds * Adapter Equates 1781da177e4SLinus Torvalds */ 1791da177e4SLinus Torvalds #define IPS_CSL 0xFF 1801da177e4SLinus Torvalds #define IPS_POCL 0x30 1811da177e4SLinus Torvalds #define IPS_NORM_STATE 0x00 1821da177e4SLinus Torvalds #define IPS_MAX_ADAPTER_TYPES 3 1831da177e4SLinus Torvalds #define IPS_MAX_ADAPTERS 16 1841da177e4SLinus Torvalds #define IPS_MAX_IOCTL 1 1851da177e4SLinus Torvalds #define IPS_MAX_IOCTL_QUEUE 8 1861da177e4SLinus Torvalds #define IPS_MAX_QUEUE 128 1871da177e4SLinus Torvalds #define IPS_BLKSIZE 512 1881da177e4SLinus Torvalds #define IPS_MAX_SG 17 1891da177e4SLinus Torvalds #define IPS_MAX_LD 8 1901da177e4SLinus Torvalds #define IPS_MAX_CHANNELS 4 1911da177e4SLinus Torvalds #define IPS_MAX_TARGETS 15 1921da177e4SLinus Torvalds #define IPS_MAX_CHUNKS 16 1931da177e4SLinus Torvalds #define IPS_MAX_CMDS 128 1941da177e4SLinus Torvalds #define IPS_MAX_XFER 0x10000 1951da177e4SLinus Torvalds #define IPS_NVRAM_P5_SIG 0xFFDDBB99 1961da177e4SLinus Torvalds #define IPS_MAX_POST_BYTES 0x02 1971da177e4SLinus Torvalds #define IPS_MAX_CONFIG_BYTES 0x02 1981da177e4SLinus Torvalds #define IPS_GOOD_POST_STATUS 0x80 1991da177e4SLinus Torvalds #define IPS_SEM_TIMEOUT 2000 2001da177e4SLinus Torvalds #define IPS_IOCTL_COMMAND 0x0D 2011da177e4SLinus Torvalds #define IPS_INTR_ON 0 2021da177e4SLinus Torvalds #define IPS_INTR_IORL 1 2031da177e4SLinus Torvalds #define IPS_FFDC 99 2041da177e4SLinus Torvalds #define IPS_ADAPTER_ID 0xF 2051da177e4SLinus Torvalds #define IPS_VENDORID_IBM 0x1014 2061da177e4SLinus Torvalds #define IPS_VENDORID_ADAPTEC 0x9005 2071da177e4SLinus Torvalds #define IPS_DEVICEID_COPPERHEAD 0x002E 2081da177e4SLinus Torvalds #define IPS_DEVICEID_MORPHEUS 0x01BD 2091da177e4SLinus Torvalds #define IPS_DEVICEID_MARCO 0x0250 2101da177e4SLinus Torvalds #define IPS_SUBDEVICEID_4M 0x01BE 2111da177e4SLinus Torvalds #define IPS_SUBDEVICEID_4L 0x01BF 2121da177e4SLinus Torvalds #define IPS_SUBDEVICEID_4MX 0x0208 2131da177e4SLinus Torvalds #define IPS_SUBDEVICEID_4LX 0x020E 2141da177e4SLinus Torvalds #define IPS_SUBDEVICEID_5I2 0x0259 2151da177e4SLinus Torvalds #define IPS_SUBDEVICEID_5I1 0x0258 2161da177e4SLinus Torvalds #define IPS_SUBDEVICEID_6M 0x0279 2171da177e4SLinus Torvalds #define IPS_SUBDEVICEID_6I 0x028C 2181da177e4SLinus Torvalds #define IPS_SUBDEVICEID_7k 0x028E 2191da177e4SLinus Torvalds #define IPS_SUBDEVICEID_7M 0x028F 2201da177e4SLinus Torvalds #define IPS_IOCTL_SIZE 8192 2211da177e4SLinus Torvalds #define IPS_STATUS_SIZE 4 2221da177e4SLinus Torvalds #define IPS_STATUS_Q_SIZE (IPS_MAX_CMDS+1) * IPS_STATUS_SIZE 2231da177e4SLinus Torvalds #define IPS_IMAGE_SIZE 500 * 1024 2241da177e4SLinus Torvalds #define IPS_MEMMAP_SIZE 128 2251da177e4SLinus Torvalds #define IPS_ONE_MSEC 1 2261da177e4SLinus Torvalds #define IPS_ONE_SEC 1000 2271da177e4SLinus Torvalds 2281da177e4SLinus Torvalds /* 2291da177e4SLinus Torvalds * Geometry Settings 2301da177e4SLinus Torvalds */ 2311da177e4SLinus Torvalds #define IPS_COMP_HEADS 128 2321da177e4SLinus Torvalds #define IPS_COMP_SECTORS 32 2331da177e4SLinus Torvalds #define IPS_NORM_HEADS 254 2341da177e4SLinus Torvalds #define IPS_NORM_SECTORS 63 2351da177e4SLinus Torvalds 2361da177e4SLinus Torvalds /* 2371da177e4SLinus Torvalds * Adapter Basic Status Codes 2381da177e4SLinus Torvalds */ 2391da177e4SLinus Torvalds #define IPS_BASIC_STATUS_MASK 0xFF 2401da177e4SLinus Torvalds #define IPS_GSC_STATUS_MASK 0x0F 2411da177e4SLinus Torvalds #define IPS_CMD_SUCCESS 0x00 2421da177e4SLinus Torvalds #define IPS_CMD_RECOVERED_ERROR 0x01 2431da177e4SLinus Torvalds #define IPS_INVAL_OPCO 0x03 2441da177e4SLinus Torvalds #define IPS_INVAL_CMD_BLK 0x04 2451da177e4SLinus Torvalds #define IPS_INVAL_PARM_BLK 0x05 2461da177e4SLinus Torvalds #define IPS_BUSY 0x08 2471da177e4SLinus Torvalds #define IPS_CMD_CMPLT_WERROR 0x0C 2481da177e4SLinus Torvalds #define IPS_LD_ERROR 0x0D 2491da177e4SLinus Torvalds #define IPS_CMD_TIMEOUT 0x0E 2501da177e4SLinus Torvalds #define IPS_PHYS_DRV_ERROR 0x0F 2511da177e4SLinus Torvalds 2521da177e4SLinus Torvalds /* 2531da177e4SLinus Torvalds * Adapter Extended Status Equates 2541da177e4SLinus Torvalds */ 2551da177e4SLinus Torvalds #define IPS_ERR_SEL_TO 0xF0 2561da177e4SLinus Torvalds #define IPS_ERR_OU_RUN 0xF2 2571da177e4SLinus Torvalds #define IPS_ERR_HOST_RESET 0xF7 2581da177e4SLinus Torvalds #define IPS_ERR_DEV_RESET 0xF8 2591da177e4SLinus Torvalds #define IPS_ERR_RECOVERY 0xFC 2601da177e4SLinus Torvalds #define IPS_ERR_CKCOND 0xFF 2611da177e4SLinus Torvalds 2621da177e4SLinus Torvalds /* 2631da177e4SLinus Torvalds * Operating System Defines 2641da177e4SLinus Torvalds */ 2651da177e4SLinus Torvalds #define IPS_OS_WINDOWS_NT 0x01 2661da177e4SLinus Torvalds #define IPS_OS_NETWARE 0x02 2671da177e4SLinus Torvalds #define IPS_OS_OPENSERVER 0x03 2681da177e4SLinus Torvalds #define IPS_OS_UNIXWARE 0x04 2691da177e4SLinus Torvalds #define IPS_OS_SOLARIS 0x05 2701da177e4SLinus Torvalds #define IPS_OS_OS2 0x06 2711da177e4SLinus Torvalds #define IPS_OS_LINUX 0x07 2721da177e4SLinus Torvalds #define IPS_OS_FREEBSD 0x08 2731da177e4SLinus Torvalds 2741da177e4SLinus Torvalds /* 2751da177e4SLinus Torvalds * Adapter Revision ID's 2761da177e4SLinus Torvalds */ 2771da177e4SLinus Torvalds #define IPS_REVID_SERVERAID 0x02 2781da177e4SLinus Torvalds #define IPS_REVID_NAVAJO 0x03 2791da177e4SLinus Torvalds #define IPS_REVID_SERVERAID2 0x04 2801da177e4SLinus Torvalds #define IPS_REVID_CLARINETP1 0x05 2811da177e4SLinus Torvalds #define IPS_REVID_CLARINETP2 0x07 2821da177e4SLinus Torvalds #define IPS_REVID_CLARINETP3 0x0D 2831da177e4SLinus Torvalds #define IPS_REVID_TROMBONE32 0x0F 2841da177e4SLinus Torvalds #define IPS_REVID_TROMBONE64 0x10 2851da177e4SLinus Torvalds 2861da177e4SLinus Torvalds /* 2871da177e4SLinus Torvalds * NVRAM Page 5 Adapter Defines 2881da177e4SLinus Torvalds */ 2891da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID 0x01 2901da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID2 0x02 2911da177e4SLinus Torvalds #define IPS_ADTYPE_NAVAJO 0x03 2921da177e4SLinus Torvalds #define IPS_ADTYPE_KIOWA 0x04 2931da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID3 0x05 2941da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID3L 0x06 2951da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID4H 0x07 2961da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID4M 0x08 2971da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID4L 0x09 2981da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID4MX 0x0A 2991da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID4LX 0x0B 3001da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID5I2 0x0C 3011da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID5I1 0x0D 3021da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID6M 0x0E 3031da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID6I 0x0F 3041da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID7t 0x10 3051da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID7k 0x11 3061da177e4SLinus Torvalds #define IPS_ADTYPE_SERVERAID7M 0x12 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvalds /* 3091da177e4SLinus Torvalds * Adapter Command/Status Packet Definitions 3101da177e4SLinus Torvalds */ 3111da177e4SLinus Torvalds #define IPS_SUCCESS 0x01 /* Successfully completed */ 3121da177e4SLinus Torvalds #define IPS_SUCCESS_IMM 0x02 /* Success - Immediately */ 3131da177e4SLinus Torvalds #define IPS_FAILURE 0x04 /* Completed with Error */ 3141da177e4SLinus Torvalds 3151da177e4SLinus Torvalds /* 3161da177e4SLinus Torvalds * Logical Drive Equates 3171da177e4SLinus Torvalds */ 3181da177e4SLinus Torvalds #define IPS_LD_OFFLINE 0x02 3191da177e4SLinus Torvalds #define IPS_LD_OKAY 0x03 3201da177e4SLinus Torvalds #define IPS_LD_FREE 0x00 3211da177e4SLinus Torvalds #define IPS_LD_SYS 0x06 3221da177e4SLinus Torvalds #define IPS_LD_CRS 0x24 3231da177e4SLinus Torvalds 3241da177e4SLinus Torvalds /* 3251da177e4SLinus Torvalds * DCDB Table Equates 3261da177e4SLinus Torvalds */ 3271da177e4SLinus Torvalds #define IPS_NO_DISCONNECT 0x00 3281da177e4SLinus Torvalds #define IPS_DISCONNECT_ALLOWED 0x80 3291da177e4SLinus Torvalds #define IPS_NO_AUTO_REQSEN 0x40 3301da177e4SLinus Torvalds #define IPS_DATA_NONE 0x00 3311da177e4SLinus Torvalds #define IPS_DATA_UNK 0x00 3321da177e4SLinus Torvalds #define IPS_DATA_IN 0x01 3331da177e4SLinus Torvalds #define IPS_DATA_OUT 0x02 3341da177e4SLinus Torvalds #define IPS_TRANSFER64K 0x08 3351da177e4SLinus Torvalds #define IPS_NOTIMEOUT 0x00 3361da177e4SLinus Torvalds #define IPS_TIMEOUT10 0x10 3371da177e4SLinus Torvalds #define IPS_TIMEOUT60 0x20 3381da177e4SLinus Torvalds #define IPS_TIMEOUT20M 0x30 3391da177e4SLinus Torvalds 3401da177e4SLinus Torvalds /* 3411da177e4SLinus Torvalds * SCSI Inquiry Data Flags 3421da177e4SLinus Torvalds */ 3431da177e4SLinus Torvalds #define IPS_SCSI_INQ_TYPE_DASD 0x00 3441da177e4SLinus Torvalds #define IPS_SCSI_INQ_TYPE_PROCESSOR 0x03 3451da177e4SLinus Torvalds #define IPS_SCSI_INQ_LU_CONNECTED 0x00 3461da177e4SLinus Torvalds #define IPS_SCSI_INQ_RD_REV2 0x02 3471da177e4SLinus Torvalds #define IPS_SCSI_INQ_REV2 0x02 3481da177e4SLinus Torvalds #define IPS_SCSI_INQ_REV3 0x03 3491da177e4SLinus Torvalds #define IPS_SCSI_INQ_Address16 0x01 3501da177e4SLinus Torvalds #define IPS_SCSI_INQ_Address32 0x02 3511da177e4SLinus Torvalds #define IPS_SCSI_INQ_MedChanger 0x08 3521da177e4SLinus Torvalds #define IPS_SCSI_INQ_MultiPort 0x10 3531da177e4SLinus Torvalds #define IPS_SCSI_INQ_EncServ 0x40 3541da177e4SLinus Torvalds #define IPS_SCSI_INQ_SoftReset 0x01 3551da177e4SLinus Torvalds #define IPS_SCSI_INQ_CmdQue 0x02 3561da177e4SLinus Torvalds #define IPS_SCSI_INQ_Linked 0x08 3571da177e4SLinus Torvalds #define IPS_SCSI_INQ_Sync 0x10 3581da177e4SLinus Torvalds #define IPS_SCSI_INQ_WBus16 0x20 3591da177e4SLinus Torvalds #define IPS_SCSI_INQ_WBus32 0x40 3601da177e4SLinus Torvalds #define IPS_SCSI_INQ_RelAdr 0x80 3611da177e4SLinus Torvalds 3621da177e4SLinus Torvalds /* 3631da177e4SLinus Torvalds * SCSI Request Sense Data Flags 3641da177e4SLinus Torvalds */ 3651da177e4SLinus Torvalds #define IPS_SCSI_REQSEN_VALID 0x80 3661da177e4SLinus Torvalds #define IPS_SCSI_REQSEN_CURRENT_ERR 0x70 3671da177e4SLinus Torvalds #define IPS_SCSI_REQSEN_NO_SENSE 0x00 3681da177e4SLinus Torvalds 3691da177e4SLinus Torvalds /* 3701da177e4SLinus Torvalds * SCSI Mode Page Equates 3711da177e4SLinus Torvalds */ 3721da177e4SLinus Torvalds #define IPS_SCSI_MP3_SoftSector 0x01 3731da177e4SLinus Torvalds #define IPS_SCSI_MP3_HardSector 0x02 3741da177e4SLinus Torvalds #define IPS_SCSI_MP3_Removeable 0x04 3751da177e4SLinus Torvalds #define IPS_SCSI_MP3_AllocateSurface 0x08 3761da177e4SLinus Torvalds 3771da177e4SLinus Torvalds /* 3781da177e4SLinus Torvalds * HA Flags 3791da177e4SLinus Torvalds */ 3801da177e4SLinus Torvalds 3811da177e4SLinus Torvalds #define IPS_HA_ENH_SG 0x1 3821da177e4SLinus Torvalds 3831da177e4SLinus Torvalds /* 3841da177e4SLinus Torvalds * SCB Flags 3851da177e4SLinus Torvalds */ 3861da177e4SLinus Torvalds #define IPS_SCB_MAP_SG 0x00008 3871da177e4SLinus Torvalds #define IPS_SCB_MAP_SINGLE 0X00010 3881da177e4SLinus Torvalds 3891da177e4SLinus Torvalds /* 3901da177e4SLinus Torvalds * Passthru stuff 3911da177e4SLinus Torvalds */ 3921da177e4SLinus Torvalds #define IPS_COPPUSRCMD (('C'<<8) | 65) 3931da177e4SLinus Torvalds #define IPS_COPPIOCCMD (('C'<<8) | 66) 3941da177e4SLinus Torvalds #define IPS_NUMCTRLS (('C'<<8) | 68) 3951da177e4SLinus Torvalds #define IPS_CTRLINFO (('C'<<8) | 69) 3961da177e4SLinus Torvalds 3971da177e4SLinus Torvalds /* flashing defines */ 3981da177e4SLinus Torvalds #define IPS_FW_IMAGE 0x00 3991da177e4SLinus Torvalds #define IPS_BIOS_IMAGE 0x01 4001da177e4SLinus Torvalds #define IPS_WRITE_FW 0x01 4011da177e4SLinus Torvalds #define IPS_WRITE_BIOS 0x02 4021da177e4SLinus Torvalds #define IPS_ERASE_BIOS 0x03 4031da177e4SLinus Torvalds #define IPS_BIOS_HEADER 0xC0 4041da177e4SLinus Torvalds 4051da177e4SLinus Torvalds /* time oriented stuff */ 4061da177e4SLinus Torvalds #define IPS_IS_LEAP_YEAR(y) (((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))) ? 1 : 0) 4071da177e4SLinus Torvalds #define IPS_NUM_LEAP_YEARS_THROUGH(y) ((y) / 4 - (y) / 100 + (y) / 400) 4081da177e4SLinus Torvalds 4091da177e4SLinus Torvalds #define IPS_SECS_MIN 60 4101da177e4SLinus Torvalds #define IPS_SECS_HOUR 3600 4111da177e4SLinus Torvalds #define IPS_SECS_8HOURS 28800 4121da177e4SLinus Torvalds #define IPS_SECS_DAY 86400 4131da177e4SLinus Torvalds #define IPS_DAYS_NORMAL_YEAR 365 4141da177e4SLinus Torvalds #define IPS_DAYS_LEAP_YEAR 366 4151da177e4SLinus Torvalds #define IPS_EPOCH_YEAR 1970 4161da177e4SLinus Torvalds 4171da177e4SLinus Torvalds /* 4181da177e4SLinus Torvalds * Scsi_Host Template 4191da177e4SLinus Torvalds */ 4201da177e4SLinus Torvalds static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); 4211da177e4SLinus Torvalds static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev, 4221da177e4SLinus Torvalds sector_t capacity, int geom[]); 423f64a181dSChristoph Hellwig static int ips_slave_configure(struct scsi_device *SDptr); 4241da177e4SLinus Torvalds 4251da177e4SLinus Torvalds /* 4261da177e4SLinus Torvalds * Raid Command Formats 4271da177e4SLinus Torvalds */ 4281da177e4SLinus Torvalds typedef struct { 4291da177e4SLinus Torvalds uint8_t op_code; 4301da177e4SLinus Torvalds uint8_t command_id; 4311da177e4SLinus Torvalds uint8_t log_drv; 4321da177e4SLinus Torvalds uint8_t sg_count; 4331da177e4SLinus Torvalds uint32_t lba; 4341da177e4SLinus Torvalds uint32_t sg_addr; 4351da177e4SLinus Torvalds uint16_t sector_count; 4361da177e4SLinus Torvalds uint8_t segment_4G; 4371da177e4SLinus Torvalds uint8_t enhanced_sg; 4381da177e4SLinus Torvalds uint32_t ccsar; 4391da177e4SLinus Torvalds uint32_t cccr; 4401da177e4SLinus Torvalds } IPS_IO_CMD, *PIPS_IO_CMD; 4411da177e4SLinus Torvalds 4421da177e4SLinus Torvalds typedef struct { 4431da177e4SLinus Torvalds uint8_t op_code; 4441da177e4SLinus Torvalds uint8_t command_id; 4451da177e4SLinus Torvalds uint16_t reserved; 4461da177e4SLinus Torvalds uint32_t reserved2; 4471da177e4SLinus Torvalds uint32_t buffer_addr; 4481da177e4SLinus Torvalds uint32_t reserved3; 4491da177e4SLinus Torvalds uint32_t ccsar; 4501da177e4SLinus Torvalds uint32_t cccr; 4511da177e4SLinus Torvalds } IPS_LD_CMD, *PIPS_LD_CMD; 4521da177e4SLinus Torvalds 4531da177e4SLinus Torvalds typedef struct { 4541da177e4SLinus Torvalds uint8_t op_code; 4551da177e4SLinus Torvalds uint8_t command_id; 4561da177e4SLinus Torvalds uint8_t reserved; 4571da177e4SLinus Torvalds uint8_t reserved2; 4581da177e4SLinus Torvalds uint32_t reserved3; 4591da177e4SLinus Torvalds uint32_t buffer_addr; 4601da177e4SLinus Torvalds uint32_t reserved4; 4611da177e4SLinus Torvalds } IPS_IOCTL_CMD, *PIPS_IOCTL_CMD; 4621da177e4SLinus Torvalds 4631da177e4SLinus Torvalds typedef struct { 4641da177e4SLinus Torvalds uint8_t op_code; 4651da177e4SLinus Torvalds uint8_t command_id; 4661da177e4SLinus Torvalds uint8_t channel; 4671da177e4SLinus Torvalds uint8_t reserved3; 4681da177e4SLinus Torvalds uint8_t reserved4; 4691da177e4SLinus Torvalds uint8_t reserved5; 4701da177e4SLinus Torvalds uint8_t reserved6; 4711da177e4SLinus Torvalds uint8_t reserved7; 4721da177e4SLinus Torvalds uint8_t reserved8; 4731da177e4SLinus Torvalds uint8_t reserved9; 4741da177e4SLinus Torvalds uint8_t reserved10; 4751da177e4SLinus Torvalds uint8_t reserved11; 4761da177e4SLinus Torvalds uint8_t reserved12; 4771da177e4SLinus Torvalds uint8_t reserved13; 4781da177e4SLinus Torvalds uint8_t reserved14; 4791da177e4SLinus Torvalds uint8_t adapter_flag; 4801da177e4SLinus Torvalds } IPS_RESET_CMD, *PIPS_RESET_CMD; 4811da177e4SLinus Torvalds 4821da177e4SLinus Torvalds typedef struct { 4831da177e4SLinus Torvalds uint8_t op_code; 4841da177e4SLinus Torvalds uint8_t command_id; 4851da177e4SLinus Torvalds uint16_t reserved; 4861da177e4SLinus Torvalds uint32_t reserved2; 4871da177e4SLinus Torvalds uint32_t dcdb_address; 4881da177e4SLinus Torvalds uint16_t reserved3; 4891da177e4SLinus Torvalds uint8_t segment_4G; 4901da177e4SLinus Torvalds uint8_t enhanced_sg; 4911da177e4SLinus Torvalds uint32_t ccsar; 4921da177e4SLinus Torvalds uint32_t cccr; 4931da177e4SLinus Torvalds } IPS_DCDB_CMD, *PIPS_DCDB_CMD; 4941da177e4SLinus Torvalds 4951da177e4SLinus Torvalds typedef struct { 4961da177e4SLinus Torvalds uint8_t op_code; 4971da177e4SLinus Torvalds uint8_t command_id; 4981da177e4SLinus Torvalds uint8_t channel; 4991da177e4SLinus Torvalds uint8_t source_target; 5001da177e4SLinus Torvalds uint32_t reserved; 5011da177e4SLinus Torvalds uint32_t reserved2; 5021da177e4SLinus Torvalds uint32_t reserved3; 5031da177e4SLinus Torvalds uint32_t ccsar; 5041da177e4SLinus Torvalds uint32_t cccr; 5051da177e4SLinus Torvalds } IPS_CS_CMD, *PIPS_CS_CMD; 5061da177e4SLinus Torvalds 5071da177e4SLinus Torvalds typedef struct { 5081da177e4SLinus Torvalds uint8_t op_code; 5091da177e4SLinus Torvalds uint8_t command_id; 5101da177e4SLinus Torvalds uint8_t log_drv; 5111da177e4SLinus Torvalds uint8_t control; 5121da177e4SLinus Torvalds uint32_t reserved; 5131da177e4SLinus Torvalds uint32_t reserved2; 5141da177e4SLinus Torvalds uint32_t reserved3; 5151da177e4SLinus Torvalds uint32_t ccsar; 5161da177e4SLinus Torvalds uint32_t cccr; 5171da177e4SLinus Torvalds } IPS_US_CMD, *PIPS_US_CMD; 5181da177e4SLinus Torvalds 5191da177e4SLinus Torvalds typedef struct { 5201da177e4SLinus Torvalds uint8_t op_code; 5211da177e4SLinus Torvalds uint8_t command_id; 5221da177e4SLinus Torvalds uint8_t reserved; 5231da177e4SLinus Torvalds uint8_t state; 5241da177e4SLinus Torvalds uint32_t reserved2; 5251da177e4SLinus Torvalds uint32_t reserved3; 5261da177e4SLinus Torvalds uint32_t reserved4; 5271da177e4SLinus Torvalds uint32_t ccsar; 5281da177e4SLinus Torvalds uint32_t cccr; 5291da177e4SLinus Torvalds } IPS_FC_CMD, *PIPS_FC_CMD; 5301da177e4SLinus Torvalds 5311da177e4SLinus Torvalds typedef struct { 5321da177e4SLinus Torvalds uint8_t op_code; 5331da177e4SLinus Torvalds uint8_t command_id; 5341da177e4SLinus Torvalds uint8_t reserved; 5351da177e4SLinus Torvalds uint8_t desc; 5361da177e4SLinus Torvalds uint32_t reserved2; 5371da177e4SLinus Torvalds uint32_t buffer_addr; 5381da177e4SLinus Torvalds uint32_t reserved3; 5391da177e4SLinus Torvalds uint32_t ccsar; 5401da177e4SLinus Torvalds uint32_t cccr; 5411da177e4SLinus Torvalds } IPS_STATUS_CMD, *PIPS_STATUS_CMD; 5421da177e4SLinus Torvalds 5431da177e4SLinus Torvalds typedef struct { 5441da177e4SLinus Torvalds uint8_t op_code; 5451da177e4SLinus Torvalds uint8_t command_id; 5461da177e4SLinus Torvalds uint8_t page; 5471da177e4SLinus Torvalds uint8_t write; 5481da177e4SLinus Torvalds uint32_t reserved; 5491da177e4SLinus Torvalds uint32_t buffer_addr; 5501da177e4SLinus Torvalds uint32_t reserved2; 5511da177e4SLinus Torvalds uint32_t ccsar; 5521da177e4SLinus Torvalds uint32_t cccr; 5531da177e4SLinus Torvalds } IPS_NVRAM_CMD, *PIPS_NVRAM_CMD; 5541da177e4SLinus Torvalds 5551da177e4SLinus Torvalds typedef struct 5561da177e4SLinus Torvalds { 5571da177e4SLinus Torvalds uint8_t op_code; 5581da177e4SLinus Torvalds uint8_t command_id; 5591da177e4SLinus Torvalds uint16_t reserved; 5601da177e4SLinus Torvalds uint32_t count; 5611da177e4SLinus Torvalds uint32_t buffer_addr; 5621da177e4SLinus Torvalds uint32_t reserved2; 5631da177e4SLinus Torvalds } IPS_VERSION_INFO, *PIPS_VERSION_INFO; 5641da177e4SLinus Torvalds 5651da177e4SLinus Torvalds typedef struct { 5661da177e4SLinus Torvalds uint8_t op_code; 5671da177e4SLinus Torvalds uint8_t command_id; 5681da177e4SLinus Torvalds uint8_t reset_count; 5691da177e4SLinus Torvalds uint8_t reset_type; 5701da177e4SLinus Torvalds uint8_t second; 5711da177e4SLinus Torvalds uint8_t minute; 5721da177e4SLinus Torvalds uint8_t hour; 5731da177e4SLinus Torvalds uint8_t day; 5741da177e4SLinus Torvalds uint8_t reserved1[4]; 5751da177e4SLinus Torvalds uint8_t month; 5761da177e4SLinus Torvalds uint8_t yearH; 5771da177e4SLinus Torvalds uint8_t yearL; 5781da177e4SLinus Torvalds uint8_t reserved2; 5791da177e4SLinus Torvalds } IPS_FFDC_CMD, *PIPS_FFDC_CMD; 5801da177e4SLinus Torvalds 5811da177e4SLinus Torvalds typedef struct { 5821da177e4SLinus Torvalds uint8_t op_code; 5831da177e4SLinus Torvalds uint8_t command_id; 5841da177e4SLinus Torvalds uint8_t type; 5851da177e4SLinus Torvalds uint8_t direction; 5861da177e4SLinus Torvalds uint32_t count; 5871da177e4SLinus Torvalds uint32_t buffer_addr; 5881da177e4SLinus Torvalds uint8_t total_packets; 5891da177e4SLinus Torvalds uint8_t packet_num; 5901da177e4SLinus Torvalds uint16_t reserved; 5911da177e4SLinus Torvalds } IPS_FLASHFW_CMD, *PIPS_FLASHFW_CMD; 5921da177e4SLinus Torvalds 5931da177e4SLinus Torvalds typedef struct { 5941da177e4SLinus Torvalds uint8_t op_code; 5951da177e4SLinus Torvalds uint8_t command_id; 5961da177e4SLinus Torvalds uint8_t type; 5971da177e4SLinus Torvalds uint8_t direction; 5981da177e4SLinus Torvalds uint32_t count; 5991da177e4SLinus Torvalds uint32_t buffer_addr; 6001da177e4SLinus Torvalds uint32_t offset; 6011da177e4SLinus Torvalds } IPS_FLASHBIOS_CMD, *PIPS_FLASHBIOS_CMD; 6021da177e4SLinus Torvalds 6031da177e4SLinus Torvalds typedef union { 6041da177e4SLinus Torvalds IPS_IO_CMD basic_io; 6051da177e4SLinus Torvalds IPS_LD_CMD logical_info; 6061da177e4SLinus Torvalds IPS_IOCTL_CMD ioctl_info; 6071da177e4SLinus Torvalds IPS_DCDB_CMD dcdb; 6081da177e4SLinus Torvalds IPS_CS_CMD config_sync; 6091da177e4SLinus Torvalds IPS_US_CMD unlock_stripe; 6101da177e4SLinus Torvalds IPS_FC_CMD flush_cache; 6111da177e4SLinus Torvalds IPS_STATUS_CMD status; 6121da177e4SLinus Torvalds IPS_NVRAM_CMD nvram; 6131da177e4SLinus Torvalds IPS_FFDC_CMD ffdc; 6141da177e4SLinus Torvalds IPS_FLASHFW_CMD flashfw; 6151da177e4SLinus Torvalds IPS_FLASHBIOS_CMD flashbios; 6161da177e4SLinus Torvalds IPS_VERSION_INFO version_info; 6171da177e4SLinus Torvalds IPS_RESET_CMD reset; 6181da177e4SLinus Torvalds } IPS_HOST_COMMAND, *PIPS_HOST_COMMAND; 6191da177e4SLinus Torvalds 6201da177e4SLinus Torvalds typedef struct { 6211da177e4SLinus Torvalds uint8_t logical_id; 6221da177e4SLinus Torvalds uint8_t reserved; 6231da177e4SLinus Torvalds uint8_t raid_level; 6241da177e4SLinus Torvalds uint8_t state; 6251da177e4SLinus Torvalds uint32_t sector_count; 6261da177e4SLinus Torvalds } IPS_DRIVE_INFO, *PIPS_DRIVE_INFO; 6271da177e4SLinus Torvalds 6281da177e4SLinus Torvalds typedef struct { 6291da177e4SLinus Torvalds uint8_t no_of_log_drive; 6301da177e4SLinus Torvalds uint8_t reserved[3]; 6311da177e4SLinus Torvalds IPS_DRIVE_INFO drive_info[IPS_MAX_LD]; 6321da177e4SLinus Torvalds } IPS_LD_INFO, *PIPS_LD_INFO; 6331da177e4SLinus Torvalds 6341da177e4SLinus Torvalds typedef struct { 6351da177e4SLinus Torvalds uint8_t device_address; 6361da177e4SLinus Torvalds uint8_t cmd_attribute; 6371da177e4SLinus Torvalds uint16_t transfer_length; 6381da177e4SLinus Torvalds uint32_t buffer_pointer; 6391da177e4SLinus Torvalds uint8_t cdb_length; 6401da177e4SLinus Torvalds uint8_t sense_length; 6411da177e4SLinus Torvalds uint8_t sg_count; 6421da177e4SLinus Torvalds uint8_t reserved; 6431da177e4SLinus Torvalds uint8_t scsi_cdb[12]; 6441da177e4SLinus Torvalds uint8_t sense_info[64]; 6451da177e4SLinus Torvalds uint8_t scsi_status; 6461da177e4SLinus Torvalds uint8_t reserved2[3]; 6471da177e4SLinus Torvalds } IPS_DCDB_TABLE, *PIPS_DCDB_TABLE; 6481da177e4SLinus Torvalds 6491da177e4SLinus Torvalds typedef struct { 6501da177e4SLinus Torvalds uint8_t device_address; 6511da177e4SLinus Torvalds uint8_t cmd_attribute; 6521da177e4SLinus Torvalds uint8_t cdb_length; 6531da177e4SLinus Torvalds uint8_t reserved_for_LUN; 6541da177e4SLinus Torvalds uint32_t transfer_length; 6551da177e4SLinus Torvalds uint32_t buffer_pointer; 6561da177e4SLinus Torvalds uint16_t sg_count; 6571da177e4SLinus Torvalds uint8_t sense_length; 6581da177e4SLinus Torvalds uint8_t scsi_status; 6591da177e4SLinus Torvalds uint32_t reserved; 6601da177e4SLinus Torvalds uint8_t scsi_cdb[16]; 6611da177e4SLinus Torvalds uint8_t sense_info[56]; 6621da177e4SLinus Torvalds } IPS_DCDB_TABLE_TAPE, *PIPS_DCDB_TABLE_TAPE; 6631da177e4SLinus Torvalds 6641da177e4SLinus Torvalds typedef union { 6651da177e4SLinus Torvalds struct { 6661da177e4SLinus Torvalds volatile uint8_t reserved; 6671da177e4SLinus Torvalds volatile uint8_t command_id; 6681da177e4SLinus Torvalds volatile uint8_t basic_status; 6691da177e4SLinus Torvalds volatile uint8_t extended_status; 6701da177e4SLinus Torvalds } fields; 6711da177e4SLinus Torvalds 6721da177e4SLinus Torvalds volatile uint32_t value; 6731da177e4SLinus Torvalds } IPS_STATUS, *PIPS_STATUS; 6741da177e4SLinus Torvalds 6751da177e4SLinus Torvalds typedef struct { 6761da177e4SLinus Torvalds IPS_STATUS status[IPS_MAX_CMDS + 1]; 6771da177e4SLinus Torvalds volatile PIPS_STATUS p_status_start; 6781da177e4SLinus Torvalds volatile PIPS_STATUS p_status_end; 6791da177e4SLinus Torvalds volatile PIPS_STATUS p_status_tail; 6801da177e4SLinus Torvalds volatile uint32_t hw_status_start; 6811da177e4SLinus Torvalds volatile uint32_t hw_status_tail; 6821da177e4SLinus Torvalds } IPS_ADAPTER, *PIPS_ADAPTER; 6831da177e4SLinus Torvalds 6841da177e4SLinus Torvalds typedef struct { 6851da177e4SLinus Torvalds uint8_t ucLogDriveCount; 6861da177e4SLinus Torvalds uint8_t ucMiscFlag; 6871da177e4SLinus Torvalds uint8_t ucSLTFlag; 6881da177e4SLinus Torvalds uint8_t ucBSTFlag; 6891da177e4SLinus Torvalds uint8_t ucPwrChgCnt; 6901da177e4SLinus Torvalds uint8_t ucWrongAdrCnt; 6911da177e4SLinus Torvalds uint8_t ucUnidentCnt; 6921da177e4SLinus Torvalds uint8_t ucNVramDevChgCnt; 6931da177e4SLinus Torvalds uint8_t CodeBlkVersion[8]; 6941da177e4SLinus Torvalds uint8_t BootBlkVersion[8]; 6951da177e4SLinus Torvalds uint32_t ulDriveSize[IPS_MAX_LD]; 6961da177e4SLinus Torvalds uint8_t ucConcurrentCmdCount; 6971da177e4SLinus Torvalds uint8_t ucMaxPhysicalDevices; 6981da177e4SLinus Torvalds uint16_t usFlashRepgmCount; 6991da177e4SLinus Torvalds uint8_t ucDefunctDiskCount; 7001da177e4SLinus Torvalds uint8_t ucRebuildFlag; 7011da177e4SLinus Torvalds uint8_t ucOfflineLogDrvCount; 7021da177e4SLinus Torvalds uint8_t ucCriticalDrvCount; 7031da177e4SLinus Torvalds uint16_t usConfigUpdateCount; 7041da177e4SLinus Torvalds uint8_t ucBlkFlag; 7051da177e4SLinus Torvalds uint8_t reserved; 7061da177e4SLinus Torvalds uint16_t usAddrDeadDisk[IPS_MAX_CHANNELS * (IPS_MAX_TARGETS + 1)]; 7071da177e4SLinus Torvalds } IPS_ENQ, *PIPS_ENQ; 7081da177e4SLinus Torvalds 7091da177e4SLinus Torvalds typedef struct { 7101da177e4SLinus Torvalds uint8_t ucInitiator; 7111da177e4SLinus Torvalds uint8_t ucParameters; 7121da177e4SLinus Torvalds uint8_t ucMiscFlag; 7131da177e4SLinus Torvalds uint8_t ucState; 7141da177e4SLinus Torvalds uint32_t ulBlockCount; 7151da177e4SLinus Torvalds uint8_t ucDeviceId[28]; 7161da177e4SLinus Torvalds } IPS_DEVSTATE, *PIPS_DEVSTATE; 7171da177e4SLinus Torvalds 7181da177e4SLinus Torvalds typedef struct { 7191da177e4SLinus Torvalds uint8_t ucChn; 7201da177e4SLinus Torvalds uint8_t ucTgt; 7211da177e4SLinus Torvalds uint16_t ucReserved; 7221da177e4SLinus Torvalds uint32_t ulStartSect; 7231da177e4SLinus Torvalds uint32_t ulNoOfSects; 7241da177e4SLinus Torvalds } IPS_CHUNK, *PIPS_CHUNK; 7251da177e4SLinus Torvalds 7261da177e4SLinus Torvalds typedef struct { 7271da177e4SLinus Torvalds uint16_t ucUserField; 7281da177e4SLinus Torvalds uint8_t ucState; 7291da177e4SLinus Torvalds uint8_t ucRaidCacheParam; 7301da177e4SLinus Torvalds uint8_t ucNoOfChunkUnits; 7311da177e4SLinus Torvalds uint8_t ucStripeSize; 7321da177e4SLinus Torvalds uint8_t ucParams; 7331da177e4SLinus Torvalds uint8_t ucReserved; 7341da177e4SLinus Torvalds uint32_t ulLogDrvSize; 7351da177e4SLinus Torvalds IPS_CHUNK chunk[IPS_MAX_CHUNKS]; 7361da177e4SLinus Torvalds } IPS_LD, *PIPS_LD; 7371da177e4SLinus Torvalds 7381da177e4SLinus Torvalds typedef struct { 7391da177e4SLinus Torvalds uint8_t board_disc[8]; 7401da177e4SLinus Torvalds uint8_t processor[8]; 7411da177e4SLinus Torvalds uint8_t ucNoChanType; 7421da177e4SLinus Torvalds uint8_t ucNoHostIntType; 7431da177e4SLinus Torvalds uint8_t ucCompression; 7441da177e4SLinus Torvalds uint8_t ucNvramType; 7451da177e4SLinus Torvalds uint32_t ulNvramSize; 7461da177e4SLinus Torvalds } IPS_HARDWARE, *PIPS_HARDWARE; 7471da177e4SLinus Torvalds 7481da177e4SLinus Torvalds typedef struct { 7491da177e4SLinus Torvalds uint8_t ucLogDriveCount; 7501da177e4SLinus Torvalds uint8_t ucDateD; 7511da177e4SLinus Torvalds uint8_t ucDateM; 7521da177e4SLinus Torvalds uint8_t ucDateY; 7531da177e4SLinus Torvalds uint8_t init_id[4]; 7541da177e4SLinus Torvalds uint8_t host_id[12]; 7551da177e4SLinus Torvalds uint8_t time_sign[8]; 7561da177e4SLinus Torvalds uint32_t UserOpt; 7571da177e4SLinus Torvalds uint16_t user_field; 7581da177e4SLinus Torvalds uint8_t ucRebuildRate; 7591da177e4SLinus Torvalds uint8_t ucReserve; 7601da177e4SLinus Torvalds IPS_HARDWARE hardware_disc; 7611da177e4SLinus Torvalds IPS_LD logical_drive[IPS_MAX_LD]; 7621da177e4SLinus Torvalds IPS_DEVSTATE dev[IPS_MAX_CHANNELS][IPS_MAX_TARGETS+1]; 7631da177e4SLinus Torvalds uint8_t reserved[512]; 7641da177e4SLinus Torvalds } IPS_CONF, *PIPS_CONF; 7651da177e4SLinus Torvalds 7661da177e4SLinus Torvalds typedef struct { 7671da177e4SLinus Torvalds uint32_t signature; 7681da177e4SLinus Torvalds uint8_t reserved1; 7691da177e4SLinus Torvalds uint8_t adapter_slot; 7701da177e4SLinus Torvalds uint16_t adapter_type; 7711da177e4SLinus Torvalds uint8_t ctrl_bios[8]; 7721da177e4SLinus Torvalds uint8_t versioning; /* 1 = Versioning Supported, else 0 */ 7731da177e4SLinus Torvalds uint8_t version_mismatch; /* 1 = Versioning MisMatch, else 0 */ 7741da177e4SLinus Torvalds uint8_t reserved2; 7751da177e4SLinus Torvalds uint8_t operating_system; 7761da177e4SLinus Torvalds uint8_t driver_high[4]; 7771da177e4SLinus Torvalds uint8_t driver_low[4]; 7781da177e4SLinus Torvalds uint8_t BiosCompatibilityID[8]; 7791da177e4SLinus Torvalds uint8_t ReservedForOS2[8]; 7801da177e4SLinus Torvalds uint8_t bios_high[4]; /* Adapter's Flashed BIOS Version */ 7811da177e4SLinus Torvalds uint8_t bios_low[4]; 7821da177e4SLinus Torvalds uint8_t adapter_order[16]; /* BIOS Telling us the Sort Order */ 7831da177e4SLinus Torvalds uint8_t Filler[60]; 7841da177e4SLinus Torvalds } IPS_NVRAM_P5, *PIPS_NVRAM_P5; 7851da177e4SLinus Torvalds 7861da177e4SLinus Torvalds /*--------------------------------------------------------------------------*/ 7871da177e4SLinus Torvalds /* Data returned from a GetVersion Command */ 7881da177e4SLinus Torvalds /*--------------------------------------------------------------------------*/ 7891da177e4SLinus Torvalds 7901da177e4SLinus Torvalds /* SubSystem Parameter[4] */ 7911da177e4SLinus Torvalds #define IPS_GET_VERSION_SUPPORT 0x00018000 /* Mask for Versioning Support */ 7921da177e4SLinus Torvalds 7931da177e4SLinus Torvalds typedef struct 7941da177e4SLinus Torvalds { 7951da177e4SLinus Torvalds uint32_t revision; 7961da177e4SLinus Torvalds uint8_t bootBlkVersion[32]; 7971da177e4SLinus Torvalds uint8_t bootBlkAttributes[4]; 7981da177e4SLinus Torvalds uint8_t codeBlkVersion[32]; 7991da177e4SLinus Torvalds uint8_t biosVersion[32]; 8001da177e4SLinus Torvalds uint8_t biosAttributes[4]; 8011da177e4SLinus Torvalds uint8_t compatibilityId[32]; 8021da177e4SLinus Torvalds uint8_t reserved[4]; 8031da177e4SLinus Torvalds } IPS_VERSION_DATA; 8041da177e4SLinus Torvalds 8051da177e4SLinus Torvalds 8061da177e4SLinus Torvalds typedef struct _IPS_SUBSYS { 8071da177e4SLinus Torvalds uint32_t param[128]; 8081da177e4SLinus Torvalds } IPS_SUBSYS, *PIPS_SUBSYS; 8091da177e4SLinus Torvalds 8101da177e4SLinus Torvalds /** 8111da177e4SLinus Torvalds ** SCSI Structures 8121da177e4SLinus Torvalds **/ 8131da177e4SLinus Torvalds 8141da177e4SLinus Torvalds /* 8151da177e4SLinus Torvalds * Inquiry Data Format 8161da177e4SLinus Torvalds */ 8171da177e4SLinus Torvalds typedef struct { 8181da177e4SLinus Torvalds uint8_t DeviceType; 8191da177e4SLinus Torvalds uint8_t DeviceTypeQualifier; 8201da177e4SLinus Torvalds uint8_t Version; 8211da177e4SLinus Torvalds uint8_t ResponseDataFormat; 8221da177e4SLinus Torvalds uint8_t AdditionalLength; 8231da177e4SLinus Torvalds uint8_t Reserved; 8241da177e4SLinus Torvalds uint8_t Flags[2]; 8251da177e4SLinus Torvalds uint8_t VendorId[8]; 8261da177e4SLinus Torvalds uint8_t ProductId[16]; 8271da177e4SLinus Torvalds uint8_t ProductRevisionLevel[4]; 8281da177e4SLinus Torvalds uint8_t Reserved2; /* Provides NULL terminator to name */ 8291da177e4SLinus Torvalds } IPS_SCSI_INQ_DATA, *PIPS_SCSI_INQ_DATA; 8301da177e4SLinus Torvalds 8311da177e4SLinus Torvalds /* 8321da177e4SLinus Torvalds * Read Capacity Data Format 8331da177e4SLinus Torvalds */ 8341da177e4SLinus Torvalds typedef struct { 8351da177e4SLinus Torvalds uint32_t lba; 8361da177e4SLinus Torvalds uint32_t len; 8371da177e4SLinus Torvalds } IPS_SCSI_CAPACITY; 8381da177e4SLinus Torvalds 8391da177e4SLinus Torvalds /* 8401da177e4SLinus Torvalds * Request Sense Data Format 8411da177e4SLinus Torvalds */ 8421da177e4SLinus Torvalds typedef struct { 8431da177e4SLinus Torvalds uint8_t ResponseCode; 8441da177e4SLinus Torvalds uint8_t SegmentNumber; 8451da177e4SLinus Torvalds uint8_t Flags; 8461da177e4SLinus Torvalds uint8_t Information[4]; 8471da177e4SLinus Torvalds uint8_t AdditionalLength; 8481da177e4SLinus Torvalds uint8_t CommandSpecific[4]; 8491da177e4SLinus Torvalds uint8_t AdditionalSenseCode; 8501da177e4SLinus Torvalds uint8_t AdditionalSenseCodeQual; 8511da177e4SLinus Torvalds uint8_t FRUCode; 8521da177e4SLinus Torvalds uint8_t SenseKeySpecific[3]; 8531da177e4SLinus Torvalds } IPS_SCSI_REQSEN; 8541da177e4SLinus Torvalds 8551da177e4SLinus Torvalds /* 8561da177e4SLinus Torvalds * Sense Data Format - Page 3 8571da177e4SLinus Torvalds */ 8581da177e4SLinus Torvalds typedef struct { 8591da177e4SLinus Torvalds uint8_t PageCode; 8601da177e4SLinus Torvalds uint8_t PageLength; 8611da177e4SLinus Torvalds uint16_t TracksPerZone; 8621da177e4SLinus Torvalds uint16_t AltSectorsPerZone; 8631da177e4SLinus Torvalds uint16_t AltTracksPerZone; 8641da177e4SLinus Torvalds uint16_t AltTracksPerVolume; 8651da177e4SLinus Torvalds uint16_t SectorsPerTrack; 8661da177e4SLinus Torvalds uint16_t BytesPerSector; 8671da177e4SLinus Torvalds uint16_t Interleave; 8681da177e4SLinus Torvalds uint16_t TrackSkew; 8691da177e4SLinus Torvalds uint16_t CylinderSkew; 8701da177e4SLinus Torvalds uint8_t flags; 8711da177e4SLinus Torvalds uint8_t reserved[3]; 8721da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE3; 8731da177e4SLinus Torvalds 8741da177e4SLinus Torvalds /* 8751da177e4SLinus Torvalds * Sense Data Format - Page 4 8761da177e4SLinus Torvalds */ 8771da177e4SLinus Torvalds typedef struct { 8781da177e4SLinus Torvalds uint8_t PageCode; 8791da177e4SLinus Torvalds uint8_t PageLength; 8801da177e4SLinus Torvalds uint16_t CylindersHigh; 8811da177e4SLinus Torvalds uint8_t CylindersLow; 8821da177e4SLinus Torvalds uint8_t Heads; 8831da177e4SLinus Torvalds uint16_t WritePrecompHigh; 8841da177e4SLinus Torvalds uint8_t WritePrecompLow; 8851da177e4SLinus Torvalds uint16_t ReducedWriteCurrentHigh; 8861da177e4SLinus Torvalds uint8_t ReducedWriteCurrentLow; 8871da177e4SLinus Torvalds uint16_t StepRate; 8881da177e4SLinus Torvalds uint16_t LandingZoneHigh; 8891da177e4SLinus Torvalds uint8_t LandingZoneLow; 8901da177e4SLinus Torvalds uint8_t flags; 8911da177e4SLinus Torvalds uint8_t RotationalOffset; 8921da177e4SLinus Torvalds uint8_t Reserved; 8931da177e4SLinus Torvalds uint16_t MediumRotationRate; 8941da177e4SLinus Torvalds uint8_t Reserved2[2]; 8951da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE4; 8961da177e4SLinus Torvalds 8971da177e4SLinus Torvalds /* 8981da177e4SLinus Torvalds * Sense Data Format - Page 8 8991da177e4SLinus Torvalds */ 9001da177e4SLinus Torvalds typedef struct { 9011da177e4SLinus Torvalds uint8_t PageCode; 9021da177e4SLinus Torvalds uint8_t PageLength; 9031da177e4SLinus Torvalds uint8_t flags; 9041da177e4SLinus Torvalds uint8_t RetentPrio; 9051da177e4SLinus Torvalds uint16_t DisPrefetchLen; 9061da177e4SLinus Torvalds uint16_t MinPrefetchLen; 9071da177e4SLinus Torvalds uint16_t MaxPrefetchLen; 9081da177e4SLinus Torvalds uint16_t MaxPrefetchCeiling; 9091da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE8; 9101da177e4SLinus Torvalds 9111da177e4SLinus Torvalds /* 9121da177e4SLinus Torvalds * Sense Data Format - Block Descriptor (DASD) 9131da177e4SLinus Torvalds */ 9141da177e4SLinus Torvalds typedef struct { 9151da177e4SLinus Torvalds uint32_t NumberOfBlocks; 9161da177e4SLinus Torvalds uint8_t DensityCode; 9171da177e4SLinus Torvalds uint16_t BlockLengthHigh; 9181da177e4SLinus Torvalds uint8_t BlockLengthLow; 9191da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE_BLKDESC; 9201da177e4SLinus Torvalds 9211da177e4SLinus Torvalds /* 9221da177e4SLinus Torvalds * Sense Data Format - Mode Page Header 9231da177e4SLinus Torvalds */ 9241da177e4SLinus Torvalds typedef struct { 9251da177e4SLinus Torvalds uint8_t DataLength; 9261da177e4SLinus Torvalds uint8_t MediumType; 9271da177e4SLinus Torvalds uint8_t Reserved; 9281da177e4SLinus Torvalds uint8_t BlockDescLength; 9291da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE_HEADER; 9301da177e4SLinus Torvalds 9311da177e4SLinus Torvalds typedef struct { 9321da177e4SLinus Torvalds IPS_SCSI_MODE_PAGE_HEADER hdr; 9331da177e4SLinus Torvalds IPS_SCSI_MODE_PAGE_BLKDESC blkdesc; 9341da177e4SLinus Torvalds 9351da177e4SLinus Torvalds union { 9361da177e4SLinus Torvalds IPS_SCSI_MODE_PAGE3 pg3; 9371da177e4SLinus Torvalds IPS_SCSI_MODE_PAGE4 pg4; 9381da177e4SLinus Torvalds IPS_SCSI_MODE_PAGE8 pg8; 9391da177e4SLinus Torvalds } pdata; 9401da177e4SLinus Torvalds } IPS_SCSI_MODE_PAGE_DATA; 9411da177e4SLinus Torvalds 9421da177e4SLinus Torvalds /* 9431da177e4SLinus Torvalds * Scatter Gather list format 9441da177e4SLinus Torvalds */ 9451da177e4SLinus Torvalds typedef struct ips_sglist { 9461da177e4SLinus Torvalds uint32_t address; 9471da177e4SLinus Torvalds uint32_t length; 9481da177e4SLinus Torvalds } IPS_STD_SG_LIST; 9491da177e4SLinus Torvalds 9501da177e4SLinus Torvalds typedef struct ips_enh_sglist { 9511da177e4SLinus Torvalds uint32_t address_lo; 9521da177e4SLinus Torvalds uint32_t address_hi; 9531da177e4SLinus Torvalds uint32_t length; 9541da177e4SLinus Torvalds uint32_t reserved; 9551da177e4SLinus Torvalds } IPS_ENH_SG_LIST; 9561da177e4SLinus Torvalds 9571da177e4SLinus Torvalds typedef union { 9581da177e4SLinus Torvalds void *list; 9591da177e4SLinus Torvalds IPS_STD_SG_LIST *std_list; 9601da177e4SLinus Torvalds IPS_ENH_SG_LIST *enh_list; 9611da177e4SLinus Torvalds } IPS_SG_LIST; 9621da177e4SLinus Torvalds 9631da177e4SLinus Torvalds typedef struct _IPS_INFOSTR { 9641da177e4SLinus Torvalds char *buffer; 9651da177e4SLinus Torvalds int length; 9661da177e4SLinus Torvalds int offset; 9671da177e4SLinus Torvalds int pos; 9681da177e4SLinus Torvalds int localpos; 9691da177e4SLinus Torvalds } IPS_INFOSTR; 9701da177e4SLinus Torvalds 9711da177e4SLinus Torvalds typedef struct { 9721da177e4SLinus Torvalds char *option_name; 9731da177e4SLinus Torvalds int *option_flag; 9741da177e4SLinus Torvalds int option_value; 9751da177e4SLinus Torvalds } IPS_OPTION; 9761da177e4SLinus Torvalds 9771da177e4SLinus Torvalds /* 9781da177e4SLinus Torvalds * Status Info 9791da177e4SLinus Torvalds */ 9801da177e4SLinus Torvalds typedef struct ips_stat { 9811da177e4SLinus Torvalds uint32_t residue_len; 9821da177e4SLinus Torvalds void *scb_addr; 9831da177e4SLinus Torvalds uint8_t padding[12 - sizeof(void *)]; 9841da177e4SLinus Torvalds } ips_stat_t; 9851da177e4SLinus Torvalds 9861da177e4SLinus Torvalds /* 9871da177e4SLinus Torvalds * SCB Queue Format 9881da177e4SLinus Torvalds */ 9891da177e4SLinus Torvalds typedef struct ips_scb_queue { 9901da177e4SLinus Torvalds struct ips_scb *head; 9911da177e4SLinus Torvalds struct ips_scb *tail; 9921da177e4SLinus Torvalds int count; 9931da177e4SLinus Torvalds } ips_scb_queue_t; 9941da177e4SLinus Torvalds 9951da177e4SLinus Torvalds /* 9961da177e4SLinus Torvalds * Wait queue_format 9971da177e4SLinus Torvalds */ 9981da177e4SLinus Torvalds typedef struct ips_wait_queue { 9991516b55dSHenne struct scsi_cmnd *head; 10001516b55dSHenne struct scsi_cmnd *tail; 10011da177e4SLinus Torvalds int count; 10021da177e4SLinus Torvalds } ips_wait_queue_t; 10031da177e4SLinus Torvalds 10041da177e4SLinus Torvalds typedef struct ips_copp_wait_item { 10051516b55dSHenne struct scsi_cmnd *scsi_cmd; 10061da177e4SLinus Torvalds struct ips_copp_wait_item *next; 10071da177e4SLinus Torvalds } ips_copp_wait_item_t; 10081da177e4SLinus Torvalds 10091da177e4SLinus Torvalds typedef struct ips_copp_queue { 10101da177e4SLinus Torvalds struct ips_copp_wait_item *head; 10111da177e4SLinus Torvalds struct ips_copp_wait_item *tail; 10121da177e4SLinus Torvalds int count; 10131da177e4SLinus Torvalds } ips_copp_queue_t; 10141da177e4SLinus Torvalds 10151da177e4SLinus Torvalds /* forward decl for host structure */ 10161da177e4SLinus Torvalds struct ips_ha; 10171da177e4SLinus Torvalds 10181da177e4SLinus Torvalds typedef struct { 10191da177e4SLinus Torvalds int (*reset)(struct ips_ha *); 10201da177e4SLinus Torvalds int (*issue)(struct ips_ha *, struct ips_scb *); 10211da177e4SLinus Torvalds int (*isinit)(struct ips_ha *); 10221da177e4SLinus Torvalds int (*isintr)(struct ips_ha *); 10231da177e4SLinus Torvalds int (*init)(struct ips_ha *); 10241da177e4SLinus Torvalds int (*erasebios)(struct ips_ha *); 10251da177e4SLinus Torvalds int (*programbios)(struct ips_ha *, char *, uint32_t, uint32_t); 10261da177e4SLinus Torvalds int (*verifybios)(struct ips_ha *, char *, uint32_t, uint32_t); 10271da177e4SLinus Torvalds void (*statinit)(struct ips_ha *); 10281da177e4SLinus Torvalds int (*intr)(struct ips_ha *); 10291da177e4SLinus Torvalds void (*enableint)(struct ips_ha *); 10301da177e4SLinus Torvalds uint32_t (*statupd)(struct ips_ha *); 10311da177e4SLinus Torvalds } ips_hw_func_t; 10321da177e4SLinus Torvalds 10331da177e4SLinus Torvalds typedef struct ips_ha { 10341da177e4SLinus Torvalds uint8_t ha_id[IPS_MAX_CHANNELS+1]; 10351da177e4SLinus Torvalds uint32_t dcdb_active[IPS_MAX_CHANNELS]; 10361da177e4SLinus Torvalds uint32_t io_addr; /* Base I/O address */ 10371da177e4SLinus Torvalds uint8_t irq; /* IRQ for adapter */ 10381da177e4SLinus Torvalds uint8_t ntargets; /* Number of targets */ 10391da177e4SLinus Torvalds uint8_t nbus; /* Number of buses */ 10401da177e4SLinus Torvalds uint8_t nlun; /* Number of Luns */ 10411da177e4SLinus Torvalds uint16_t ad_type; /* Adapter type */ 10421da177e4SLinus Torvalds uint16_t host_num; /* Adapter number */ 10431da177e4SLinus Torvalds uint32_t max_xfer; /* Maximum Xfer size */ 10441da177e4SLinus Torvalds uint32_t max_cmds; /* Max concurrent commands */ 10451da177e4SLinus Torvalds uint32_t num_ioctl; /* Number of Ioctls */ 10461da177e4SLinus Torvalds ips_stat_t sp; /* Status packer pointer */ 10471da177e4SLinus Torvalds struct ips_scb *scbs; /* Array of all CCBS */ 10481da177e4SLinus Torvalds struct ips_scb *scb_freelist; /* SCB free list */ 10491da177e4SLinus Torvalds ips_wait_queue_t scb_waitlist; /* Pending SCB list */ 10501da177e4SLinus Torvalds ips_copp_queue_t copp_waitlist; /* Pending PT list */ 10511da177e4SLinus Torvalds ips_scb_queue_t scb_activelist; /* Active SCB list */ 10521da177e4SLinus Torvalds IPS_IO_CMD *dummy; /* dummy command */ 10531da177e4SLinus Torvalds IPS_ADAPTER *adapt; /* Adapter status area */ 10541da177e4SLinus Torvalds IPS_LD_INFO *logical_drive_info; /* Adapter Logical Drive Info */ 10551da177e4SLinus Torvalds dma_addr_t logical_drive_info_dma_addr; /* Logical Drive Info DMA Address */ 10561da177e4SLinus Torvalds IPS_ENQ *enq; /* Adapter Enquiry data */ 10571da177e4SLinus Torvalds IPS_CONF *conf; /* Adapter config data */ 10581da177e4SLinus Torvalds IPS_NVRAM_P5 *nvram; /* NVRAM page 5 data */ 10591da177e4SLinus Torvalds IPS_SUBSYS *subsys; /* Subsystem parameters */ 10601da177e4SLinus Torvalds char *ioctl_data; /* IOCTL data area */ 10611da177e4SLinus Torvalds uint32_t ioctl_datasize; /* IOCTL data size */ 10621da177e4SLinus Torvalds uint32_t cmd_in_progress; /* Current command in progress*/ 10631da177e4SLinus Torvalds int flags; /* */ 10641da177e4SLinus Torvalds uint8_t waitflag; /* are we waiting for cmd */ 10651da177e4SLinus Torvalds uint8_t active; 10661da177e4SLinus Torvalds int ioctl_reset; /* IOCTL Requested Reset Flag */ 10671da177e4SLinus Torvalds uint16_t reset_count; /* number of resets */ 10681da177e4SLinus Torvalds time_t last_ffdc; /* last time we sent ffdc info*/ 10691da177e4SLinus Torvalds uint8_t revision_id; /* Revision level */ 10701da177e4SLinus Torvalds uint16_t device_id; /* PCI device ID */ 10711da177e4SLinus Torvalds uint8_t slot_num; /* PCI Slot Number */ 10721da177e4SLinus Torvalds uint16_t subdevice_id; /* Subsystem device ID */ 10731da177e4SLinus Torvalds int ioctl_len; /* size of ioctl buffer */ 10741da177e4SLinus Torvalds dma_addr_t ioctl_busaddr; /* dma address of ioctl buffer*/ 10751da177e4SLinus Torvalds uint8_t bios_version[8]; /* BIOS Revision */ 10761da177e4SLinus Torvalds uint32_t mem_addr; /* Memory mapped address */ 10771da177e4SLinus Torvalds uint32_t io_len; /* Size of IO Address */ 10781da177e4SLinus Torvalds uint32_t mem_len; /* Size of memory address */ 10791da177e4SLinus Torvalds char __iomem *mem_ptr; /* Memory mapped Ptr */ 10801da177e4SLinus Torvalds char __iomem *ioremap_ptr;/* ioremapped memory pointer */ 10811da177e4SLinus Torvalds ips_hw_func_t func; /* hw function pointers */ 10821da177e4SLinus Torvalds struct pci_dev *pcidev; /* PCI device handle */ 10831da177e4SLinus Torvalds char *flash_data; /* Save Area for flash data */ 10841da177e4SLinus Torvalds int flash_len; /* length of flash buffer */ 10851da177e4SLinus Torvalds u32 flash_datasize; /* Save Area for flash data size */ 10861da177e4SLinus Torvalds dma_addr_t flash_busaddr; /* dma address of flash buffer*/ 10871da177e4SLinus Torvalds dma_addr_t enq_busaddr; /* dma address of enq struct */ 10881da177e4SLinus Torvalds uint8_t requires_esl; /* Requires an EraseStripeLock */ 10891da177e4SLinus Torvalds } ips_ha_t; 10901da177e4SLinus Torvalds 10911da177e4SLinus Torvalds typedef void (*ips_scb_callback) (ips_ha_t *, struct ips_scb *); 10921da177e4SLinus Torvalds 10931da177e4SLinus Torvalds /* 10941da177e4SLinus Torvalds * SCB Format 10951da177e4SLinus Torvalds */ 10961da177e4SLinus Torvalds typedef struct ips_scb { 10971da177e4SLinus Torvalds IPS_HOST_COMMAND cmd; 10981da177e4SLinus Torvalds IPS_DCDB_TABLE dcdb; 10991da177e4SLinus Torvalds uint8_t target_id; 11001da177e4SLinus Torvalds uint8_t bus; 11011da177e4SLinus Torvalds uint8_t lun; 11021da177e4SLinus Torvalds uint8_t cdb[12]; 11031da177e4SLinus Torvalds uint32_t scb_busaddr; 11041da177e4SLinus Torvalds uint32_t old_data_busaddr; // Obsolete, but kept for old utility compatibility 11051da177e4SLinus Torvalds uint32_t timeout; 11061da177e4SLinus Torvalds uint8_t basic_status; 11071da177e4SLinus Torvalds uint8_t extended_status; 11081da177e4SLinus Torvalds uint8_t breakup; 11091da177e4SLinus Torvalds uint8_t sg_break; 11101da177e4SLinus Torvalds uint32_t data_len; 11111da177e4SLinus Torvalds uint32_t sg_len; 11121da177e4SLinus Torvalds uint32_t flags; 11131da177e4SLinus Torvalds uint32_t op_code; 11141da177e4SLinus Torvalds IPS_SG_LIST sg_list; 11151516b55dSHenne struct scsi_cmnd *scsi_cmd; 11161da177e4SLinus Torvalds struct ips_scb *q_next; 11171da177e4SLinus Torvalds ips_scb_callback callback; 11181da177e4SLinus Torvalds uint32_t sg_busaddr; 11191da177e4SLinus Torvalds int sg_count; 11201da177e4SLinus Torvalds dma_addr_t data_busaddr; 11211da177e4SLinus Torvalds } ips_scb_t; 11221da177e4SLinus Torvalds 11231da177e4SLinus Torvalds typedef struct ips_scb_pt { 11241da177e4SLinus Torvalds IPS_HOST_COMMAND cmd; 11251da177e4SLinus Torvalds IPS_DCDB_TABLE dcdb; 11261da177e4SLinus Torvalds uint8_t target_id; 11271da177e4SLinus Torvalds uint8_t bus; 11281da177e4SLinus Torvalds uint8_t lun; 11291da177e4SLinus Torvalds uint8_t cdb[12]; 11301da177e4SLinus Torvalds uint32_t scb_busaddr; 11311da177e4SLinus Torvalds uint32_t data_busaddr; 11321da177e4SLinus Torvalds uint32_t timeout; 11331da177e4SLinus Torvalds uint8_t basic_status; 11341da177e4SLinus Torvalds uint8_t extended_status; 11351da177e4SLinus Torvalds uint16_t breakup; 11361da177e4SLinus Torvalds uint32_t data_len; 11371da177e4SLinus Torvalds uint32_t sg_len; 11381da177e4SLinus Torvalds uint32_t flags; 11391da177e4SLinus Torvalds uint32_t op_code; 11401da177e4SLinus Torvalds IPS_SG_LIST *sg_list; 11411516b55dSHenne struct scsi_cmnd *scsi_cmd; 11421da177e4SLinus Torvalds struct ips_scb *q_next; 11431da177e4SLinus Torvalds ips_scb_callback callback; 11441da177e4SLinus Torvalds } ips_scb_pt_t; 11451da177e4SLinus Torvalds 11461da177e4SLinus Torvalds /* 11471da177e4SLinus Torvalds * Passthru Command Format 11481da177e4SLinus Torvalds */ 11491da177e4SLinus Torvalds typedef struct { 11501da177e4SLinus Torvalds uint8_t CoppID[4]; 11511da177e4SLinus Torvalds uint32_t CoppCmd; 11521da177e4SLinus Torvalds uint32_t PtBuffer; 11531da177e4SLinus Torvalds uint8_t *CmdBuffer; 11541da177e4SLinus Torvalds uint32_t CmdBSize; 11551da177e4SLinus Torvalds ips_scb_pt_t CoppCP; 11561da177e4SLinus Torvalds uint32_t TimeOut; 11571da177e4SLinus Torvalds uint8_t BasicStatus; 11581da177e4SLinus Torvalds uint8_t ExtendedStatus; 11591da177e4SLinus Torvalds uint8_t AdapterType; 11601da177e4SLinus Torvalds uint8_t reserved; 11611da177e4SLinus Torvalds } ips_passthru_t; 11621da177e4SLinus Torvalds 11631da177e4SLinus Torvalds #endif 11641da177e4SLinus Torvalds 11651da177e4SLinus Torvalds /* The Version Information below gets created by SED during the build process. */ 11661da177e4SLinus Torvalds /* Do not modify the next line; it's what SED is looking for to do the insert. */ 11671da177e4SLinus Torvalds /* Version Info */ 11681da177e4SLinus Torvalds /************************************************************************* 11691da177e4SLinus Torvalds * 11701da177e4SLinus Torvalds * VERSION.H -- version numbers and copyright notices in various formats 11711da177e4SLinus Torvalds * 11721da177e4SLinus Torvalds *************************************************************************/ 11731da177e4SLinus Torvalds 11741da177e4SLinus Torvalds #define IPS_VER_MAJOR 7 11758c8fdc59SBernhard Walle #define IPS_VER_MAJOR_STRING __stringify(IPS_VER_MAJOR) 1176c1a15468SJack Hammer #define IPS_VER_MINOR 12 11778c8fdc59SBernhard Walle #define IPS_VER_MINOR_STRING __stringify(IPS_VER_MINOR) 11788c8fdc59SBernhard Walle #define IPS_VER_BUILD 05 11798c8fdc59SBernhard Walle #define IPS_VER_BUILD_STRING __stringify(IPS_VER_BUILD) 11808c8fdc59SBernhard Walle #define IPS_VER_STRING IPS_VER_MAJOR_STRING "." \ 11818c8fdc59SBernhard Walle IPS_VER_MINOR_STRING "." IPS_VER_BUILD_STRING 11821da177e4SLinus Torvalds #define IPS_RELEASE_ID 0x00020000 1183c1a15468SJack Hammer #define IPS_BUILD_IDENT 761 11841da177e4SLinus Torvalds #define IPS_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002. All Rights Reserved." 11851da177e4SLinus Torvalds #define IPS_ADAPTECCOPYRIGHT_STRING "(c) Copyright Adaptec, Inc. 2002 to 2004. All Rights Reserved." 11861da177e4SLinus Torvalds #define IPS_DELLCOPYRIGHT_STRING "(c) Copyright Dell 2004. All Rights Reserved." 11871da177e4SLinus Torvalds #define IPS_NT_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002." 11881da177e4SLinus Torvalds 11891da177e4SLinus Torvalds /* Version numbers for various adapters */ 11901da177e4SLinus Torvalds #define IPS_VER_SERVERAID1 "2.25.01" 11911da177e4SLinus Torvalds #define IPS_VER_SERVERAID2 "2.88.13" 11921da177e4SLinus Torvalds #define IPS_VER_NAVAJO "2.88.13" 11931da177e4SLinus Torvalds #define IPS_VER_SERVERAID3 "6.10.24" 1194c1a15468SJack Hammer #define IPS_VER_SERVERAID4H "7.12.02" 1195c1a15468SJack Hammer #define IPS_VER_SERVERAID4MLx "7.12.02" 1196c1a15468SJack Hammer #define IPS_VER_SARASOTA "7.12.02" 1197c1a15468SJack Hammer #define IPS_VER_MARCO "7.12.02" 1198c1a15468SJack Hammer #define IPS_VER_SEBRING "7.12.02" 1199c1a15468SJack Hammer #define IPS_VER_KEYWEST "7.12.02" 12001da177e4SLinus Torvalds 12011da177e4SLinus Torvalds /* Compatability IDs for various adapters */ 12021da177e4SLinus Torvalds #define IPS_COMPAT_UNKNOWN "" 12031da177e4SLinus Torvalds #define IPS_COMPAT_CURRENT "KW710" 12041da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID1 "2.25.01" 12051da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID2 "2.88.13" 12061da177e4SLinus Torvalds #define IPS_COMPAT_NAVAJO "2.88.13" 12071da177e4SLinus Torvalds #define IPS_COMPAT_KIOWA "2.88.13" 12081da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID3H "SB610" 12091da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID3L "SB610" 12101da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID4H "KW710" 12111da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID4M "KW710" 12121da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID4L "KW710" 12131da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID4Mx "KW710" 12141da177e4SLinus Torvalds #define IPS_COMPAT_SERVERAID4Lx "KW710" 12151da177e4SLinus Torvalds #define IPS_COMPAT_SARASOTA "KW710" 12161da177e4SLinus Torvalds #define IPS_COMPAT_MARCO "KW710" 12171da177e4SLinus Torvalds #define IPS_COMPAT_SEBRING "KW710" 12181da177e4SLinus Torvalds #define IPS_COMPAT_TAMPA "KW710" 12191da177e4SLinus Torvalds #define IPS_COMPAT_KEYWEST "KW710" 12201da177e4SLinus Torvalds #define IPS_COMPAT_BIOS "KW710" 12211da177e4SLinus Torvalds 12221da177e4SLinus Torvalds #define IPS_COMPAT_MAX_ADAPTER_TYPE 18 12231da177e4SLinus Torvalds #define IPS_COMPAT_ID_LENGTH 8 12241da177e4SLinus Torvalds 12251da177e4SLinus Torvalds #define IPS_DEFINE_COMPAT_TABLE(tablename) \ 12261da177e4SLinus Torvalds char tablename[IPS_COMPAT_MAX_ADAPTER_TYPE] [IPS_COMPAT_ID_LENGTH] = { \ 12271da177e4SLinus Torvalds IPS_COMPAT_UNKNOWN, \ 12281da177e4SLinus Torvalds IPS_COMPAT_SERVERAID1, \ 12291da177e4SLinus Torvalds IPS_COMPAT_SERVERAID2, \ 12301da177e4SLinus Torvalds IPS_COMPAT_NAVAJO, \ 12311da177e4SLinus Torvalds IPS_COMPAT_KIOWA, \ 12321da177e4SLinus Torvalds IPS_COMPAT_SERVERAID3H, \ 12331da177e4SLinus Torvalds IPS_COMPAT_SERVERAID3L, \ 12341da177e4SLinus Torvalds IPS_COMPAT_SERVERAID4H, \ 12351da177e4SLinus Torvalds IPS_COMPAT_SERVERAID4M, \ 12361da177e4SLinus Torvalds IPS_COMPAT_SERVERAID4L, \ 12371da177e4SLinus Torvalds IPS_COMPAT_SERVERAID4Mx, \ 12381da177e4SLinus Torvalds IPS_COMPAT_SERVERAID4Lx, \ 12391da177e4SLinus Torvalds IPS_COMPAT_SARASOTA, /* one-channel variety of SARASOTA */ \ 12401da177e4SLinus Torvalds IPS_COMPAT_SARASOTA, /* two-channel variety of SARASOTA */ \ 12411da177e4SLinus Torvalds IPS_COMPAT_MARCO, \ 12421da177e4SLinus Torvalds IPS_COMPAT_SEBRING, \ 12431da177e4SLinus Torvalds IPS_COMPAT_TAMPA, \ 12441da177e4SLinus Torvalds IPS_COMPAT_KEYWEST \ 12451da177e4SLinus Torvalds } 12461da177e4SLinus Torvalds 12471da177e4SLinus Torvalds 12481da177e4SLinus Torvalds /* 12491da177e4SLinus Torvalds * Overrides for Emacs so that we almost follow Linus's tabbing style. 12501da177e4SLinus Torvalds * Emacs will notice this stuff at the end of the file and automatically 12511da177e4SLinus Torvalds * adjust the settings for this buffer only. This must remain at the end 12521da177e4SLinus Torvalds * of the file. 12531da177e4SLinus Torvalds * --------------------------------------------------------------------------- 12541da177e4SLinus Torvalds * Local variables: 12551da177e4SLinus Torvalds * c-indent-level: 2 12561da177e4SLinus Torvalds * c-brace-imaginary-offset: 0 12571da177e4SLinus Torvalds * c-brace-offset: -2 12581da177e4SLinus Torvalds * c-argdecl-indent: 2 12591da177e4SLinus Torvalds * c-label-offset: -2 12601da177e4SLinus Torvalds * c-continued-statement-offset: 2 12611da177e4SLinus Torvalds * c-continued-brace-offset: 0 12621da177e4SLinus Torvalds * indent-tabs-mode: nil 12631da177e4SLinus Torvalds * tab-width: 8 12641da177e4SLinus Torvalds * End: 12651da177e4SLinus Torvalds */ 1266