186d7f5d3SJohn Marino /*- 286d7f5d3SJohn Marino * Copyright (c) 2002 Adaptec Inc. 386d7f5d3SJohn Marino * All rights reserved. 486d7f5d3SJohn Marino * 586d7f5d3SJohn Marino * Written by: David Jeffery 686d7f5d3SJohn Marino * 786d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 886d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 986d7f5d3SJohn Marino * are met: 1086d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 1186d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 1286d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 1386d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the 1486d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution. 1586d7f5d3SJohn Marino * 1686d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1786d7f5d3SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1886d7f5d3SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1986d7f5d3SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2086d7f5d3SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2186d7f5d3SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2286d7f5d3SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2386d7f5d3SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2486d7f5d3SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2586d7f5d3SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2686d7f5d3SJohn Marino * SUCH DAMAGE. 2786d7f5d3SJohn Marino * 2886d7f5d3SJohn Marino * $FreeBSD: src/sys/dev/ips/ips.h,v 1.10 2004/05/30 20:08:34 phk Exp $ 2986d7f5d3SJohn Marino */ 3086d7f5d3SJohn Marino 3186d7f5d3SJohn Marino 3286d7f5d3SJohn Marino #include <sys/param.h> 3386d7f5d3SJohn Marino #include <sys/systm.h> 3486d7f5d3SJohn Marino #include <sys/kernel.h> 3586d7f5d3SJohn Marino #include <sys/module.h> 3686d7f5d3SJohn Marino #include <sys/bus.h> 3786d7f5d3SJohn Marino #include <sys/conf.h> 3886d7f5d3SJohn Marino #include <sys/types.h> 3986d7f5d3SJohn Marino #include <sys/thread.h> 4086d7f5d3SJohn Marino #include <sys/queue.h> 4186d7f5d3SJohn Marino #include <sys/buf.h> 4286d7f5d3SJohn Marino #include <sys/malloc.h> 4386d7f5d3SJohn Marino #include <sys/time.h> 4486d7f5d3SJohn Marino #include <sys/lock.h> 4586d7f5d3SJohn Marino #include <sys/rman.h> 4686d7f5d3SJohn Marino #include <sys/buf2.h> 4786d7f5d3SJohn Marino #include <sys/thread2.h> 4886d7f5d3SJohn Marino 4986d7f5d3SJohn Marino #include <bus/pci/pcireg.h> 5086d7f5d3SJohn Marino #include <bus/pci/pcivar.h> 5186d7f5d3SJohn Marino 5286d7f5d3SJohn Marino MALLOC_DECLARE(M_IPSBUF); 5386d7f5d3SJohn Marino 5486d7f5d3SJohn Marino /* 5586d7f5d3SJohn Marino * IPS CONSTANTS 5686d7f5d3SJohn Marino */ 5786d7f5d3SJohn Marino #define IPS_VENDOR_ID 0x1014 5886d7f5d3SJohn Marino #define IPS_VENDOR_ID_ADAPTEC 0x9005 5986d7f5d3SJohn Marino #define IPS_MORPHEUS_DEVICE_ID 0x01BD 6086d7f5d3SJohn Marino #define IPS_COPPERHEAD_DEVICE_ID 0x002E 6186d7f5d3SJohn Marino #define IPS_MARCO_DEVICE_ID 0x0250 6286d7f5d3SJohn Marino #define IPS_CSL 0xff 6386d7f5d3SJohn Marino #define IPS_POCL 0x30 6486d7f5d3SJohn Marino 6586d7f5d3SJohn Marino /* amounts of memory to allocate for certain commands */ 6686d7f5d3SJohn Marino #define IPS_ADAPTER_INFO_LEN (sizeof(ips_adapter_info_t)) 6786d7f5d3SJohn Marino #define IPS_DRIVE_INFO_LEN (sizeof(ips_drive_info_t)) 6886d7f5d3SJohn Marino #define IPS_COMMAND_LEN 24 6986d7f5d3SJohn Marino #define IPS_MAX_SG_LEN (sizeof(ips_sg_element_t) * IPS_MAX_SG_ELEMENTS) 7086d7f5d3SJohn Marino #define IPS_NVRAM_PAGE_SIZE 128 7186d7f5d3SJohn Marino /* various flags */ 7286d7f5d3SJohn Marino #define IPS_STATIC_FLAG 1 7386d7f5d3SJohn Marino 7486d7f5d3SJohn Marino /* states for the card to be in */ 7586d7f5d3SJohn Marino #define IPS_DEV_OPEN 0x01 7686d7f5d3SJohn Marino #define IPS_TIMEOUT 0x02 /* command time out, need reset */ 7786d7f5d3SJohn Marino #define IPS_OFFLINE 0x04 /* can't reset card/card failure */ 7886d7f5d3SJohn Marino #define IPS_STATIC_BUSY 0x08 /* static command slot in use */ 7986d7f5d3SJohn Marino 8086d7f5d3SJohn Marino /* max number of commands set to something low for now */ 8186d7f5d3SJohn Marino #define IPS_MAX_CMD_NUM 128 8286d7f5d3SJohn Marino #define IPS_MAX_NUM_DRIVES 8 8386d7f5d3SJohn Marino #define IPS_MAX_SG_ELEMENTS 32 8486d7f5d3SJohn Marino #define IPS_MAX_IOBUF_SIZE (64 * 1024) 8586d7f5d3SJohn Marino #define IPS_BLKSIZE 512 8686d7f5d3SJohn Marino 8786d7f5d3SJohn Marino /* logical drive states */ 8886d7f5d3SJohn Marino 8986d7f5d3SJohn Marino #define IPS_LD_OFFLINE 0x02 9086d7f5d3SJohn Marino #define IPS_LD_OKAY 0x03 9186d7f5d3SJohn Marino #define IPS_LD_DEGRADED 0x04 9286d7f5d3SJohn Marino #define IPS_LD_FREE 0x00 9386d7f5d3SJohn Marino #define IPS_LD_SYS 0x06 9486d7f5d3SJohn Marino #define IPS_LD_CRS 0x24 9586d7f5d3SJohn Marino 9686d7f5d3SJohn Marino /* register offsets */ 9786d7f5d3SJohn Marino #define MORPHEUS_REG_OMR0 0x0018 /* Outbound Msg. Reg. 0 */ 9886d7f5d3SJohn Marino #define MORPHEUS_REG_OMR1 0x001C /* Outbound Msg. Reg. 1 */ 9986d7f5d3SJohn Marino #define MORPHEUS_REG_IDR 0x0020 /* Inbound Doorbell Reg. */ 10086d7f5d3SJohn Marino #define MORPHEUS_REG_IISR 0x0024 /* Inbound IRQ Status Reg. */ 10186d7f5d3SJohn Marino #define MORPHEUS_REG_IIMR 0x0028 /* Inbound IRQ Mask Reg. */ 10286d7f5d3SJohn Marino #define MORPHEUS_REG_OISR 0x0030 /* Outbound IRQ Status Reg. */ 10386d7f5d3SJohn Marino #define MORPHEUS_REG_OIMR 0x0034 /* Outbound IRQ Status Reg. */ 10486d7f5d3SJohn Marino #define MORPHEUS_REG_IQPR 0x0040 /* Inbound Queue Port Reg. */ 10586d7f5d3SJohn Marino #define MORPHEUS_REG_OQPR 0x0044 /* Outbound Queue Port Reg. */ 10686d7f5d3SJohn Marino 10786d7f5d3SJohn Marino #define COPPER_REG_SCPR 0x05 /* Subsystem Ctrl. Port Reg. */ 10886d7f5d3SJohn Marino #define COPPER_REG_ISPR 0x06 /* IRQ Status Port Reg. */ 10986d7f5d3SJohn Marino #define COPPER_REG_CBSP 0x07 /* ? Reg. */ 11086d7f5d3SJohn Marino #define COPPER_REG_HISR 0x08 /* Host IRQ Status Reg. */ 11186d7f5d3SJohn Marino #define COPPER_REG_CCSAR 0x10 /* Cmd. Channel Sys Addr Reg.*/ 11286d7f5d3SJohn Marino #define COPPER_REG_CCCR 0x14 /* Cmd. Channel Ctrl. Reg. */ 11386d7f5d3SJohn Marino #define COPPER_REG_SQHR 0x20 /* Status Queue Head Reg. */ 11486d7f5d3SJohn Marino #define COPPER_REG_SQTR 0x24 /* Status Queue Tail Reg. */ 11586d7f5d3SJohn Marino #define COPPER_REG_SQER 0x28 /* Status Queue End Reg. */ 11686d7f5d3SJohn Marino #define COPPER_REG_SQSR 0x2C /* Status Queue Start Reg. */ 11786d7f5d3SJohn Marino 11886d7f5d3SJohn Marino /* bit definitions */ 11986d7f5d3SJohn Marino #define MORPHEUS_BIT_POST1 0x01 12086d7f5d3SJohn Marino #define MORPHEUS_BIT_POST2 0x02 12186d7f5d3SJohn Marino #define MORPHEUS_BIT_CMD_IRQ 0x08 12286d7f5d3SJohn Marino 12386d7f5d3SJohn Marino #define COPPER_CMD_START 0x101A 12486d7f5d3SJohn Marino #define COPPER_SEM_BIT 0x08 12586d7f5d3SJohn Marino #define COPPER_EI_BIT 0x80 12686d7f5d3SJohn Marino #define COPPER_EBM_BIT 0x02 12786d7f5d3SJohn Marino #define COPPER_RESET_BIT 0x80 12886d7f5d3SJohn Marino #define COPPER_GHI_BIT 0x04 12986d7f5d3SJohn Marino #define COPPER_SCE_BIT 0x01 13086d7f5d3SJohn Marino #define COPPER_OP_BIT 0x01 13186d7f5d3SJohn Marino #define COPPER_ILE_BIT 0x10 13286d7f5d3SJohn Marino 13386d7f5d3SJohn Marino /* status defines */ 13486d7f5d3SJohn Marino #define IPS_POST1_OK 0x8000 13586d7f5d3SJohn Marino #define IPS_POST2_OK 0x000f 13686d7f5d3SJohn Marino 13786d7f5d3SJohn Marino /* command op codes */ 13886d7f5d3SJohn Marino #define IPS_READ_CMD 0x02 13986d7f5d3SJohn Marino #define IPS_WRITE_CMD 0x03 14086d7f5d3SJohn Marino #define IPS_ADAPTER_INFO_CMD 0x05 14186d7f5d3SJohn Marino #define IPS_CACHE_FLUSH_CMD 0x0A 14286d7f5d3SJohn Marino #define IPS_REBUILD_STATUS_CMD 0x0C 14386d7f5d3SJohn Marino #define IPS_ERROR_TABLE_CMD 0x17 14486d7f5d3SJohn Marino #define IPS_DRIVE_INFO_CMD 0x19 14586d7f5d3SJohn Marino #define IPS_SUBSYS_PARAM_CMD 0x40 14686d7f5d3SJohn Marino #define IPS_CONFIG_SYNC_CMD 0x58 14786d7f5d3SJohn Marino #define IPS_SG_READ_CMD 0x82 14886d7f5d3SJohn Marino #define IPS_SG_WRITE_CMD 0x83 14986d7f5d3SJohn Marino #define IPS_RW_NVRAM_CMD 0xBC 15086d7f5d3SJohn Marino #define IPS_FFDC_CMD 0xD7 15186d7f5d3SJohn Marino 15286d7f5d3SJohn Marino /* error information returned by the adapter */ 15386d7f5d3SJohn Marino #define IPS_MIN_ERROR 0x02 15486d7f5d3SJohn Marino #define IPS_ERROR_STATUS 0x13000200 /* ahh, magic numbers */ 15586d7f5d3SJohn Marino 15686d7f5d3SJohn Marino #define IPS_OS_FREEBSD 8 15786d7f5d3SJohn Marino #define IPS_VERSION_MAJOR "0.90" 15886d7f5d3SJohn Marino #define IPS_VERSION_MINOR ".10" 15986d7f5d3SJohn Marino 16086d7f5d3SJohn Marino /* Adapter Types */ 16186d7f5d3SJohn Marino #define IPS_ADAPTER_COPPERHEAD 0x01 16286d7f5d3SJohn Marino #define IPS_ADAPTER_COPPERHEAD2 0x02 16386d7f5d3SJohn Marino #define IPS_ADAPTER_COPPERHEADOB1 0x03 16486d7f5d3SJohn Marino #define IPS_ADAPTER_COPPERHEADOB2 0x04 16586d7f5d3SJohn Marino #define IPS_ADAPTER_CLARINET 0x05 16686d7f5d3SJohn Marino #define IPS_ADAPTER_CLARINETLITE 0x06 16786d7f5d3SJohn Marino #define IPS_ADAPTER_TROMBONE 0x07 16886d7f5d3SJohn Marino #define IPS_ADAPTER_MORPHEUS 0x08 16986d7f5d3SJohn Marino #define IPS_ADAPTER_MORPHEUSLITE 0x09 17086d7f5d3SJohn Marino #define IPS_ADAPTER_NEO 0x0A 17186d7f5d3SJohn Marino #define IPS_ADAPTER_NEOLITE 0x0B 17286d7f5d3SJohn Marino #define IPS_ADAPTER_SARASOTA2 0x0C 17386d7f5d3SJohn Marino #define IPS_ADAPTER_SARASOTA1 0x0D 17486d7f5d3SJohn Marino #define IPS_ADAPTER_MARCO 0x0E 17586d7f5d3SJohn Marino #define IPS_ADAPTER_SEBRING 0x0F 17686d7f5d3SJohn Marino #define IPS_ADAPTER_7T 0x10 17786d7f5d3SJohn Marino #define IPS_ADAPTER_7K 0x11 17886d7f5d3SJohn Marino #define IPS_ADAPTER_7M 0x12 17986d7f5d3SJohn Marino #define IPS_ADAPTER_MAX_T IPS_ADAPTER_7M 18086d7f5d3SJohn Marino 18186d7f5d3SJohn Marino /* values for ffdc_settime (from gmtime) */ 18286d7f5d3SJohn Marino #define IPS_SECSPERMIN 60 18386d7f5d3SJohn Marino #define IPS_MINSPERHOUR 60 18486d7f5d3SJohn Marino #define IPS_HOURSPERDAY 24 18586d7f5d3SJohn Marino #define IPS_DAYSPERWEEK 7 18686d7f5d3SJohn Marino #define IPS_DAYSPERNYEAR 365 18786d7f5d3SJohn Marino #define IPS_DAYSPERLYEAR 366 18886d7f5d3SJohn Marino #define IPS_SECSPERHOUR (IPS_SECSPERMIN * IPS_MINSPERHOUR) 18986d7f5d3SJohn Marino #define IPS_SECSPERDAY ((long) IPS_SECSPERHOUR * IPS_HOURSPERDAY) 19086d7f5d3SJohn Marino #define IPS_MONSPERYEAR 12 19186d7f5d3SJohn Marino #define IPS_EPOCH_YEAR 1970 19286d7f5d3SJohn Marino #define IPS_LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) 19386d7f5d3SJohn Marino #define ips_isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) 19486d7f5d3SJohn Marino 19586d7f5d3SJohn Marino 19686d7f5d3SJohn Marino /* 19786d7f5d3SJohn Marino * for compatibility 19886d7f5d3SJohn Marino */ 19986d7f5d3SJohn Marino /* struct buf to struct bio changes */ 20086d7f5d3SJohn Marino 20186d7f5d3SJohn Marino #define d_maxsize si_iosize_max 20286d7f5d3SJohn Marino 20386d7f5d3SJohn Marino #if defined(PCIR_MAPS) && !defined(PCIR_BARS) 20486d7f5d3SJohn Marino # define PCIR_BAR(x) (PCIR_BARS + (x) * 4) 20586d7f5d3SJohn Marino # define PCIR_BARS PCIR_MAPS 20686d7f5d3SJohn Marino #endif 20786d7f5d3SJohn Marino 20886d7f5d3SJohn Marino 20986d7f5d3SJohn Marino /* 21086d7f5d3SJohn Marino * IPS MACROS 21186d7f5d3SJohn Marino */ 21286d7f5d3SJohn Marino 21386d7f5d3SJohn Marino #define ips_read_1(sc,offset) bus_space_read_1(sc->bustag, sc->bushandle, offset) 21486d7f5d3SJohn Marino #define ips_read_2(sc,offset) bus_space_read_2(sc->bustag, sc->bushandle, offset) 21586d7f5d3SJohn Marino #define ips_read_4(sc,offset) bus_space_read_4(sc->bustag, sc->bushandle, offset) 21686d7f5d3SJohn Marino 21786d7f5d3SJohn Marino #define ips_write_1(sc,offset,value) bus_space_write_1(sc->bustag, sc->bushandle, offset, value) 21886d7f5d3SJohn Marino #define ips_write_2(sc,offset,value) bus_space_write_2(sc->bustag, sc->bushandle, offset, value) 21986d7f5d3SJohn Marino #define ips_write_4(sc,offset,value) bus_space_write_4(sc->bustag, sc->bushandle, offset, value) 22086d7f5d3SJohn Marino 22186d7f5d3SJohn Marino #define ips_read_request(iobuf) ((bio)->bio_buf->b_cmd == BUF_CMD_READ) 22286d7f5d3SJohn Marino 22386d7f5d3SJohn Marino #define COMMAND_ERROR(status) (((status)->fields.basic_status & 0x0f) >= IPS_MIN_ERROR) 22486d7f5d3SJohn Marino 22586d7f5d3SJohn Marino #ifndef IPS_DEBUG 22686d7f5d3SJohn Marino #define DEVICE_PRINTF(x...) 22786d7f5d3SJohn Marino #define PRINTF(x...) 22886d7f5d3SJohn Marino #else 22986d7f5d3SJohn Marino #define DEVICE_PRINTF(level,x...) if(IPS_DEBUG >= level)device_printf(x) 23086d7f5d3SJohn Marino #define PRINTF(level,x...) if(IPS_DEBUG >= level)kprintf(x) 23186d7f5d3SJohn Marino #endif 23286d7f5d3SJohn Marino 23386d7f5d3SJohn Marino /* 23486d7f5d3SJohn Marino * IPS STRUCTS 23586d7f5d3SJohn Marino */ 23686d7f5d3SJohn Marino struct ips_softc; 23786d7f5d3SJohn Marino 23886d7f5d3SJohn Marino typedef struct { 23986d7f5d3SJohn Marino u_int8_t command; 24086d7f5d3SJohn Marino u_int8_t id; 24186d7f5d3SJohn Marino u_int8_t drivenum; 24286d7f5d3SJohn Marino u_int8_t reserve2; 24386d7f5d3SJohn Marino u_int32_t lba; 24486d7f5d3SJohn Marino u_int32_t buffaddr; 24586d7f5d3SJohn Marino u_int32_t reserve3; 24686d7f5d3SJohn Marino } __attribute__ ((packed)) ips_generic_cmd; 24786d7f5d3SJohn Marino 24886d7f5d3SJohn Marino typedef struct { 24986d7f5d3SJohn Marino u_int8_t command; 25086d7f5d3SJohn Marino u_int8_t id; 25186d7f5d3SJohn Marino u_int8_t drivenum; 25286d7f5d3SJohn Marino u_int8_t segnum; 25386d7f5d3SJohn Marino u_int32_t lba; 25486d7f5d3SJohn Marino u_int32_t buffaddr; 25586d7f5d3SJohn Marino u_int16_t length; 25686d7f5d3SJohn Marino u_int16_t reserve1; 25786d7f5d3SJohn Marino } __attribute__ ((packed)) ips_io_cmd; 25886d7f5d3SJohn Marino 25986d7f5d3SJohn Marino typedef struct { 26086d7f5d3SJohn Marino u_int8_t command; 26186d7f5d3SJohn Marino u_int8_t id; 26286d7f5d3SJohn Marino u_int8_t pagenum; 26386d7f5d3SJohn Marino u_int8_t rw; 26486d7f5d3SJohn Marino u_int32_t reserve1; 26586d7f5d3SJohn Marino u_int32_t buffaddr; 26686d7f5d3SJohn Marino u_int32_t reserve3; 26786d7f5d3SJohn Marino } __attribute__ ((packed)) ips_rw_nvram_cmd; 26886d7f5d3SJohn Marino 26986d7f5d3SJohn Marino typedef struct { 27086d7f5d3SJohn Marino u_int8_t command; 27186d7f5d3SJohn Marino u_int8_t id; 27286d7f5d3SJohn Marino u_int8_t drivenum; 27386d7f5d3SJohn Marino u_int8_t reserve1; 27486d7f5d3SJohn Marino u_int32_t reserve2; 27586d7f5d3SJohn Marino u_int32_t buffaddr; 27686d7f5d3SJohn Marino u_int32_t reserve3; 27786d7f5d3SJohn Marino } __attribute__ ((packed)) ips_drive_cmd; 27886d7f5d3SJohn Marino 27986d7f5d3SJohn Marino typedef struct { 28086d7f5d3SJohn Marino u_int8_t command; 28186d7f5d3SJohn Marino u_int8_t id; 28286d7f5d3SJohn Marino u_int8_t reserve1; 28386d7f5d3SJohn Marino u_int8_t commandtype; 28486d7f5d3SJohn Marino u_int32_t reserve2; 28586d7f5d3SJohn Marino u_int32_t buffaddr; 28686d7f5d3SJohn Marino u_int32_t reserve3; 28786d7f5d3SJohn Marino } __attribute__((packed)) ips_adapter_info_cmd; 28886d7f5d3SJohn Marino 28986d7f5d3SJohn Marino typedef struct { 29086d7f5d3SJohn Marino u_int8_t command; 29186d7f5d3SJohn Marino u_int8_t id; 29286d7f5d3SJohn Marino u_int8_t reset_count; 29386d7f5d3SJohn Marino u_int8_t reset_type; 29486d7f5d3SJohn Marino u_int8_t second; 29586d7f5d3SJohn Marino u_int8_t minute; 29686d7f5d3SJohn Marino u_int8_t hour; 29786d7f5d3SJohn Marino u_int8_t day; 29886d7f5d3SJohn Marino u_int8_t reserve1[4]; 29986d7f5d3SJohn Marino u_int8_t month; 30086d7f5d3SJohn Marino u_int8_t yearH; 30186d7f5d3SJohn Marino u_int8_t yearL; 30286d7f5d3SJohn Marino u_int8_t reserve2; 30386d7f5d3SJohn Marino } __attribute__((packed)) ips_adapter_ffdc_cmd; 30486d7f5d3SJohn Marino 30586d7f5d3SJohn Marino typedef union{ 30686d7f5d3SJohn Marino ips_generic_cmd generic_cmd; 30786d7f5d3SJohn Marino ips_drive_cmd drive_cmd; 30886d7f5d3SJohn Marino ips_adapter_info_cmd adapter_info_cmd; 30986d7f5d3SJohn Marino } ips_cmd_buff_t; 31086d7f5d3SJohn Marino 31186d7f5d3SJohn Marino typedef struct { 31286d7f5d3SJohn Marino u_int32_t signature; 31386d7f5d3SJohn Marino u_int8_t reserved; 31486d7f5d3SJohn Marino u_int8_t adapter_slot; 31586d7f5d3SJohn Marino u_int16_t adapter_type; 31686d7f5d3SJohn Marino u_int8_t bios_high[4]; 31786d7f5d3SJohn Marino u_int8_t bios_low[4]; 31886d7f5d3SJohn Marino u_int16_t reserve2; 31986d7f5d3SJohn Marino u_int8_t reserve3; 32086d7f5d3SJohn Marino u_int8_t operating_system; 32186d7f5d3SJohn Marino u_int8_t driver_high[4]; 32286d7f5d3SJohn Marino u_int8_t driver_low[4]; 32386d7f5d3SJohn Marino u_int8_t reserve4[100]; 32486d7f5d3SJohn Marino } __attribute__((packed)) ips_nvram_page5; 32586d7f5d3SJohn Marino 32686d7f5d3SJohn Marino typedef struct { 32786d7f5d3SJohn Marino u_int32_t addr; 32886d7f5d3SJohn Marino u_int32_t len; 32986d7f5d3SJohn Marino } ips_sg_element_t; 33086d7f5d3SJohn Marino 33186d7f5d3SJohn Marino typedef struct { 33286d7f5d3SJohn Marino u_int8_t drivenum; 33386d7f5d3SJohn Marino u_int8_t merge_id; 33486d7f5d3SJohn Marino u_int8_t raid_lvl; 33586d7f5d3SJohn Marino u_int8_t state; 33686d7f5d3SJohn Marino u_int32_t sector_count; 33786d7f5d3SJohn Marino } __attribute__((packed)) ips_drive_t; 33886d7f5d3SJohn Marino 33986d7f5d3SJohn Marino typedef struct { 34086d7f5d3SJohn Marino u_int8_t drivecount; 34186d7f5d3SJohn Marino u_int8_t reserve1; 34286d7f5d3SJohn Marino u_int16_t reserve2; 34386d7f5d3SJohn Marino ips_drive_t drives[IPS_MAX_NUM_DRIVES]; 34486d7f5d3SJohn Marino } __attribute__((packed)) ips_drive_info_t; 34586d7f5d3SJohn Marino 34686d7f5d3SJohn Marino typedef struct { 34786d7f5d3SJohn Marino u_int8_t drivecount; 34886d7f5d3SJohn Marino u_int8_t miscflags; 34986d7f5d3SJohn Marino u_int8_t SLTflags; 35086d7f5d3SJohn Marino u_int8_t BSTflags; 35186d7f5d3SJohn Marino u_int8_t pwr_chg_count; 35286d7f5d3SJohn Marino u_int8_t wrong_addr_count; 35386d7f5d3SJohn Marino u_int8_t unident_count; 35486d7f5d3SJohn Marino u_int8_t nvram_dev_chg_count; 35586d7f5d3SJohn Marino u_int8_t codeblock_version[8]; 35686d7f5d3SJohn Marino u_int8_t bootblock_version[8]; 35786d7f5d3SJohn Marino u_int32_t drive_sector_count[IPS_MAX_NUM_DRIVES]; 35886d7f5d3SJohn Marino u_int8_t max_concurrent_cmds; 35986d7f5d3SJohn Marino u_int8_t max_phys_devices; 36086d7f5d3SJohn Marino u_int16_t flash_prog_count; 36186d7f5d3SJohn Marino u_int8_t defunct_disks; 36286d7f5d3SJohn Marino u_int8_t rebuildflags; 36386d7f5d3SJohn Marino u_int8_t offline_drivecount; 36486d7f5d3SJohn Marino u_int8_t critical_drivecount; 36586d7f5d3SJohn Marino u_int16_t config_update_count; 36686d7f5d3SJohn Marino u_int8_t blockedflags; 36786d7f5d3SJohn Marino u_int8_t psdn_error; 36886d7f5d3SJohn Marino u_int16_t addr_dead_disk[4*16]; /* ugly, max # channels * max # scsi devices per channel */ 36986d7f5d3SJohn Marino } __attribute__((packed)) ips_adapter_info_t; 37086d7f5d3SJohn Marino 37186d7f5d3SJohn Marino typedef struct { 37286d7f5d3SJohn Marino u_int32_t status[IPS_MAX_CMD_NUM]; 37386d7f5d3SJohn Marino u_int32_t base_phys_addr; 37486d7f5d3SJohn Marino int nextstatus; 37586d7f5d3SJohn Marino bus_dma_tag_t dmatag; 37686d7f5d3SJohn Marino bus_dmamap_t dmamap; 37786d7f5d3SJohn Marino } ips_copper_queue_t; 37886d7f5d3SJohn Marino 37986d7f5d3SJohn Marino typedef union { 38086d7f5d3SJohn Marino struct { 38186d7f5d3SJohn Marino u_int8_t reserved; 38286d7f5d3SJohn Marino u_int8_t command_id; 38386d7f5d3SJohn Marino u_int8_t basic_status; 38486d7f5d3SJohn Marino u_int8_t extended_status; 38586d7f5d3SJohn Marino } fields; 38686d7f5d3SJohn Marino volatile u_int32_t value; 38786d7f5d3SJohn Marino } ips_cmd_status_t; 38886d7f5d3SJohn Marino 38986d7f5d3SJohn Marino /* used to keep track of current commands to the card */ 39086d7f5d3SJohn Marino typedef struct ips_command { 39186d7f5d3SJohn Marino u_int8_t command_number; 39286d7f5d3SJohn Marino u_int8_t id; 39386d7f5d3SJohn Marino u_int8_t timeout; 39486d7f5d3SJohn Marino struct ips_softc *sc; 39586d7f5d3SJohn Marino bus_dmamap_t command_dmamap; 39686d7f5d3SJohn Marino void *command_buffer; 39786d7f5d3SJohn Marino u_int32_t command_phys_addr; /*WARNING! must be changed if 64bit addressing ever used*/ 39886d7f5d3SJohn Marino bus_dma_tag_t data_dmatag; 39986d7f5d3SJohn Marino bus_dmamap_t data_dmamap; 40086d7f5d3SJohn Marino /* members below are zero'd when handed out */ 40186d7f5d3SJohn Marino ips_cmd_status_t status; 40286d7f5d3SJohn Marino SLIST_ENTRY(ips_command) next; 40386d7f5d3SJohn Marino void *data_buffer; 40486d7f5d3SJohn Marino void *arg; 40586d7f5d3SJohn Marino void (*callback)(struct ips_command *command); 40686d7f5d3SJohn Marino int completed; 40786d7f5d3SJohn Marino } ips_command_t; 40886d7f5d3SJohn Marino 40986d7f5d3SJohn Marino typedef struct ips_wait_list { 41086d7f5d3SJohn Marino STAILQ_ENTRY(ips_wait_list) next; 41186d7f5d3SJohn Marino void *data; 41286d7f5d3SJohn Marino int (* callback)(ips_command_t *command); 41386d7f5d3SJohn Marino } ips_wait_list_t; 41486d7f5d3SJohn Marino 41586d7f5d3SJohn Marino typedef struct ips_softc { 41686d7f5d3SJohn Marino struct resource *iores; 41786d7f5d3SJohn Marino struct resource *irqres; 41886d7f5d3SJohn Marino struct intr_config_hook ips_ich; 41986d7f5d3SJohn Marino int configured; 42086d7f5d3SJohn Marino int state; 42186d7f5d3SJohn Marino int iotype; 42286d7f5d3SJohn Marino int rid; 42386d7f5d3SJohn Marino int irqrid; 42486d7f5d3SJohn Marino void *irqcookie; 42586d7f5d3SJohn Marino bus_space_tag_t bustag; 42686d7f5d3SJohn Marino bus_space_handle_t bushandle; 42786d7f5d3SJohn Marino bus_dma_tag_t adapter_dmatag; 42886d7f5d3SJohn Marino bus_dma_tag_t command_dmatag; 42986d7f5d3SJohn Marino bus_dma_tag_t sg_dmatag; 43086d7f5d3SJohn Marino device_t dev; 43186d7f5d3SJohn Marino struct callout timer; 43286d7f5d3SJohn Marino u_int16_t adapter_type; 43386d7f5d3SJohn Marino ips_adapter_info_t adapter_info; 43486d7f5d3SJohn Marino device_t diskdev[IPS_MAX_NUM_DRIVES]; 43586d7f5d3SJohn Marino ips_drive_t drives[IPS_MAX_NUM_DRIVES]; 43686d7f5d3SJohn Marino u_int8_t drivecount; 43786d7f5d3SJohn Marino u_int16_t ffdc_resetcount; 43886d7f5d3SJohn Marino struct timeval ffdc_resettime; 43986d7f5d3SJohn Marino u_int8_t next_drive; 44086d7f5d3SJohn Marino u_int8_t max_cmds; 44186d7f5d3SJohn Marino volatile u_int8_t used_commands; 44286d7f5d3SJohn Marino ips_command_t *commandarray; 44386d7f5d3SJohn Marino ips_command_t *staticcmd; 44486d7f5d3SJohn Marino SLIST_HEAD(command_list, ips_command) free_cmd_list; 44586d7f5d3SJohn Marino int (*ips_adapter_reinit)(struct ips_softc *sc, 44686d7f5d3SJohn Marino int force); 44786d7f5d3SJohn Marino void (*ips_adapter_intr)(void *sc); 44886d7f5d3SJohn Marino void (*ips_issue_cmd)(ips_command_t *command); 44986d7f5d3SJohn Marino void (*ips_poll_cmd)(ips_command_t *command); 45086d7f5d3SJohn Marino ips_copper_queue_t *copper_queue; 45186d7f5d3SJohn Marino 45286d7f5d3SJohn Marino struct lock queue_lock; 45386d7f5d3SJohn Marino struct bio_queue_head bio_queue; 45486d7f5d3SJohn Marino } ips_softc_t; 45586d7f5d3SJohn Marino 45686d7f5d3SJohn Marino /* function defines from ips_ioctl.c */ 45786d7f5d3SJohn Marino extern int ips_ioctl_request(ips_softc_t *sc, u_long ioctl_cmd, caddr_t addr, 45886d7f5d3SJohn Marino int32_t flags); 45986d7f5d3SJohn Marino /* function defines from ips_disk.c */ 46086d7f5d3SJohn Marino extern void ipsd_finish(struct bio *iobuf); 46186d7f5d3SJohn Marino 46286d7f5d3SJohn Marino /* function defines from ips_commands.c */ 46386d7f5d3SJohn Marino extern int ips_flush_cache(ips_softc_t *sc); 46486d7f5d3SJohn Marino extern void ips_start_io_request(ips_softc_t *sc); 46586d7f5d3SJohn Marino extern int ips_get_drive_info(ips_softc_t *sc); 46686d7f5d3SJohn Marino extern int ips_get_adapter_info(ips_softc_t *sc); 46786d7f5d3SJohn Marino extern int ips_ffdc_reset(ips_softc_t *sc); 46886d7f5d3SJohn Marino extern int ips_update_nvram(ips_softc_t *sc); 46986d7f5d3SJohn Marino extern int ips_clear_adapter(ips_softc_t *sc); 47086d7f5d3SJohn Marino 47186d7f5d3SJohn Marino /* function defines from ips.c */ 47286d7f5d3SJohn Marino extern int ips_get_free_cmd(ips_softc_t *sc, ips_command_t **command, 47386d7f5d3SJohn Marino unsigned long flags); 47486d7f5d3SJohn Marino extern void ips_insert_free_cmd(ips_softc_t *sc, ips_command_t *command); 47586d7f5d3SJohn Marino extern int ips_adapter_init(ips_softc_t *sc); 47686d7f5d3SJohn Marino extern int ips_morpheus_reinit(ips_softc_t *sc, int force); 47786d7f5d3SJohn Marino extern int ips_adapter_free(ips_softc_t *sc); 47886d7f5d3SJohn Marino extern void ips_morpheus_intr(void *sc); 47986d7f5d3SJohn Marino extern void ips_issue_morpheus_cmd(ips_command_t *command); 48086d7f5d3SJohn Marino extern void ips_morpheus_poll(ips_command_t *command); 48186d7f5d3SJohn Marino extern int ips_copperhead_reinit(ips_softc_t *sc, int force); 48286d7f5d3SJohn Marino extern void ips_copperhead_intr(void *sc); 48386d7f5d3SJohn Marino extern void ips_issue_copperhead_cmd(ips_command_t *command); 48486d7f5d3SJohn Marino extern void ips_copperhead_poll(ips_command_t *command); 48586d7f5d3SJohn Marino int ips_timed_wait(ips_command_t *, const char *, int); 486