ispmbox.h revision 165308
150477Speter/* $FreeBSD: head/sys/dev/isp/ispmbox.h 165308 2006-12-17 16:59:19Z mjacob $ */ 2139749Simp/*- 339235Sgibbs * Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters. 435388Smjacob * 5154704Smjacob * Copyright (c) 1997-2006 by Matthew Jacob 635388Smjacob * All rights reserved. 735388Smjacob * 835388Smjacob * Redistribution and use in source and binary forms, with or without 935388Smjacob * modification, are permitted provided that the following conditions 1035388Smjacob * are met: 1135388Smjacob * 1. Redistributions of source code must retain the above copyright 1235388Smjacob * notice immediately at the beginning of the file, without modification, 1335388Smjacob * this list of conditions, and the following disclaimer. 1466189Smjacob * 2. The name of the author may not be used to endorse or promote products 1535388Smjacob * derived from this software without specific prior written permission. 1635388Smjacob * 1735388Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1835388Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1935388Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2035388Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 2135388Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2235388Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2335388Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2435388Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2535388Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2635388Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2735388Smjacob * SUCH DAMAGE. 2835388Smjacob * 2935388Smjacob */ 3035388Smjacob#ifndef _ISPMBOX_H 3135388Smjacob#define _ISPMBOX_H 3235388Smjacob 3335388Smjacob/* 3435388Smjacob * Mailbox Command Opcodes 3535388Smjacob */ 3635388Smjacob#define MBOX_NO_OP 0x0000 3735388Smjacob#define MBOX_LOAD_RAM 0x0001 3835388Smjacob#define MBOX_EXEC_FIRMWARE 0x0002 3935388Smjacob#define MBOX_DUMP_RAM 0x0003 4035388Smjacob#define MBOX_WRITE_RAM_WORD 0x0004 4135388Smjacob#define MBOX_READ_RAM_WORD 0x0005 4235388Smjacob#define MBOX_MAILBOX_REG_TEST 0x0006 4335388Smjacob#define MBOX_VERIFY_CHECKSUM 0x0007 4435388Smjacob#define MBOX_ABOUT_FIRMWARE 0x0008 45165308Smjacob#define MBOX_LOAD_RISC_RAM_2100 0x0009 4635388Smjacob /* a */ 47163899Smjacob#define MBOX_LOAD_RISC_RAM 0x000b 4835388Smjacob /* c */ 49160080Smjacob#define MBOX_WRITE_RAM_WORD_EXTENDED 0x000d 5035388Smjacob#define MBOX_CHECK_FIRMWARE 0x000e 5190754Smjacob#define MBOX_READ_RAM_WORD_EXTENDED 0x000f 5235388Smjacob#define MBOX_INIT_REQ_QUEUE 0x0010 5335388Smjacob#define MBOX_INIT_RES_QUEUE 0x0011 5435388Smjacob#define MBOX_EXECUTE_IOCB 0x0012 5535388Smjacob#define MBOX_WAKE_UP 0x0013 5635388Smjacob#define MBOX_STOP_FIRMWARE 0x0014 5735388Smjacob#define MBOX_ABORT 0x0015 5835388Smjacob#define MBOX_ABORT_DEVICE 0x0016 5935388Smjacob#define MBOX_ABORT_TARGET 0x0017 6035388Smjacob#define MBOX_BUS_RESET 0x0018 6135388Smjacob#define MBOX_STOP_QUEUE 0x0019 6235388Smjacob#define MBOX_START_QUEUE 0x001a 6335388Smjacob#define MBOX_SINGLE_STEP_QUEUE 0x001b 6435388Smjacob#define MBOX_ABORT_QUEUE 0x001c 6535388Smjacob#define MBOX_GET_DEV_QUEUE_STATUS 0x001d 6635388Smjacob /* 1e */ 6735388Smjacob#define MBOX_GET_FIRMWARE_STATUS 0x001f 6835388Smjacob#define MBOX_GET_INIT_SCSI_ID 0x0020 6935388Smjacob#define MBOX_GET_SELECT_TIMEOUT 0x0021 7035388Smjacob#define MBOX_GET_RETRY_COUNT 0x0022 7135388Smjacob#define MBOX_GET_TAG_AGE_LIMIT 0x0023 7235388Smjacob#define MBOX_GET_CLOCK_RATE 0x0024 7335388Smjacob#define MBOX_GET_ACT_NEG_STATE 0x0025 7435388Smjacob#define MBOX_GET_ASYNC_DATA_SETUP_TIME 0x0026 7535388Smjacob#define MBOX_GET_SBUS_PARAMS 0x0027 7681987Smjacob#define MBOX_GET_PCI_PARAMS MBOX_GET_SBUS_PARAMS 7735388Smjacob#define MBOX_GET_TARGET_PARAMS 0x0028 7835388Smjacob#define MBOX_GET_DEV_QUEUE_PARAMS 0x0029 7946966Smjacob#define MBOX_GET_RESET_DELAY_PARAMS 0x002a 8035388Smjacob /* 2b */ 8135388Smjacob /* 2c */ 8235388Smjacob /* 2d */ 8335388Smjacob /* 2e */ 8435388Smjacob /* 2f */ 8535388Smjacob#define MBOX_SET_INIT_SCSI_ID 0x0030 8635388Smjacob#define MBOX_SET_SELECT_TIMEOUT 0x0031 8735388Smjacob#define MBOX_SET_RETRY_COUNT 0x0032 8835388Smjacob#define MBOX_SET_TAG_AGE_LIMIT 0x0033 8935388Smjacob#define MBOX_SET_CLOCK_RATE 0x0034 9046966Smjacob#define MBOX_SET_ACT_NEG_STATE 0x0035 9135388Smjacob#define MBOX_SET_ASYNC_DATA_SETUP_TIME 0x0036 9235388Smjacob#define MBOX_SET_SBUS_CONTROL_PARAMS 0x0037 9335388Smjacob#define MBOX_SET_PCI_PARAMETERS 0x0037 9435388Smjacob#define MBOX_SET_TARGET_PARAMS 0x0038 9535388Smjacob#define MBOX_SET_DEV_QUEUE_PARAMS 0x0039 9646966Smjacob#define MBOX_SET_RESET_DELAY_PARAMS 0x003a 9735388Smjacob /* 3b */ 9835388Smjacob /* 3c */ 9935388Smjacob /* 3d */ 10035388Smjacob /* 3e */ 10135388Smjacob /* 3f */ 10235388Smjacob#define MBOX_RETURN_BIOS_BLOCK_ADDR 0x0040 10335388Smjacob#define MBOX_WRITE_FOUR_RAM_WORDS 0x0041 10435388Smjacob#define MBOX_EXEC_BIOS_IOCB 0x0042 10543420Smjacob#define MBOX_SET_FW_FEATURES 0x004a 10643420Smjacob#define MBOX_GET_FW_FEATURES 0x004b 10790224Smjacob#define FW_FEATURE_FAST_POST 0x1 10843420Smjacob#define FW_FEATURE_LVD_NOTIFY 0x2 10990224Smjacob#define FW_FEATURE_RIO_32BIT 0x4 11090224Smjacob#define FW_FEATURE_RIO_16BIT 0x8 11135388Smjacob 112103825Smjacob#define MBOX_INIT_REQ_QUEUE_A64 0x0052 113103825Smjacob#define MBOX_INIT_RES_QUEUE_A64 0x0053 114103825Smjacob 11584241Smjacob#define MBOX_ENABLE_TARGET_MODE 0x0055 11655363Smjacob#define ENABLE_TARGET_FLAG 0x8000 11775194Smjacob#define ENABLE_TQING_FLAG 0x0004 11875194Smjacob#define ENABLE_MANDATORY_DISC 0x0002 11984241Smjacob#define MBOX_GET_TARGET_STATUS 0x0056 12055138Smjacob 12184241Smjacob/* These are for the ISP2X00 FC cards */ 12284241Smjacob#define MBOX_GET_LOOP_ID 0x0020 12384241Smjacob#define MBOX_GET_FIRMWARE_OPTIONS 0x0028 12484241Smjacob#define MBOX_SET_FIRMWARE_OPTIONS 0x0038 12584241Smjacob#define MBOX_GET_RESOURCE_COUNT 0x0042 126163899Smjacob#define MBOX_REQUEST_OFFLINE_MODE 0x0043 12784241Smjacob#define MBOX_ENHANCED_GET_PDB 0x0047 12884241Smjacob#define MBOX_EXEC_COMMAND_IOCB_A64 0x0054 12984241Smjacob#define MBOX_INIT_FIRMWARE 0x0060 13084241Smjacob#define MBOX_GET_INIT_CONTROL_BLOCK 0x0061 13184241Smjacob#define MBOX_INIT_LIP 0x0062 13284241Smjacob#define MBOX_GET_FC_AL_POSITION_MAP 0x0063 13384241Smjacob#define MBOX_GET_PORT_DB 0x0064 13484241Smjacob#define MBOX_CLEAR_ACA 0x0065 13584241Smjacob#define MBOX_TARGET_RESET 0x0066 13684241Smjacob#define MBOX_CLEAR_TASK_SET 0x0067 13784241Smjacob#define MBOX_ABORT_TASK_SET 0x0068 13884241Smjacob#define MBOX_GET_FW_STATE 0x0069 13984241Smjacob#define MBOX_GET_PORT_NAME 0x006A 14084241Smjacob#define MBOX_GET_LINK_STATUS 0x006B 14184241Smjacob#define MBOX_INIT_LIP_RESET 0x006C 14284241Smjacob#define MBOX_SEND_SNS 0x006E 14384241Smjacob#define MBOX_FABRIC_LOGIN 0x006F 14484241Smjacob#define MBOX_SEND_CHANGE_REQUEST 0x0070 14584241Smjacob#define MBOX_FABRIC_LOGOUT 0x0071 14684241Smjacob#define MBOX_INIT_LIP_LOGIN 0x0072 147151834Smjacob#define MBOX_LUN_RESET 0x007E 14835388Smjacob 14998282Smjacob#define MBOX_DRIVER_HEARTBEAT 0x005B 15098282Smjacob#define MBOX_FW_HEARTBEAT 0x005C 15198282Smjacob 152163899Smjacob#define MBOX_GET_SET_DATA_RATE 0x005D /* 24XX/23XX only */ 153163899Smjacob#define MBGSD_GET_RATE 0 154163899Smjacob#define MBGSD_SET_RATE 1 155163899Smjacob#define MBGSD_SET_RATE_NOW 2 /* 24XX only */ 15684241Smjacob#define MBGSD_ONEGB 0 15784241Smjacob#define MBGSD_TWOGB 1 15884241Smjacob#define MBGSD_AUTO 2 159163899Smjacob#define MBGSD_FOURGB 3 /* 24XX only */ 16084241Smjacob 16184241Smjacob 16235388Smjacob#define ISP2100_SET_PCI_PARAM 0x00ff 16335388Smjacob 16435388Smjacob#define MBOX_BUSY 0x04 16535388Smjacob 16635388Smjacob/* 16739235Sgibbs * Mailbox Command Complete Status Codes 16839235Sgibbs */ 16939235Sgibbs#define MBOX_COMMAND_COMPLETE 0x4000 17039235Sgibbs#define MBOX_INVALID_COMMAND 0x4001 17139235Sgibbs#define MBOX_HOST_INTERFACE_ERROR 0x4002 17239235Sgibbs#define MBOX_TEST_FAILED 0x4003 17339235Sgibbs#define MBOX_COMMAND_ERROR 0x4005 17439235Sgibbs#define MBOX_COMMAND_PARAM_ERROR 0x4006 17557587Smjacob#define MBOX_PORT_ID_USED 0x4007 17657587Smjacob#define MBOX_LOOP_ID_USED 0x4008 17757587Smjacob#define MBOX_ALL_IDS_USED 0x4009 17857587Smjacob#define MBOX_NOT_LOGGED_IN 0x400A 179163899Smjacob/* pseudo mailbox completion codes */ 180163899Smjacob#define MBOX_REGS_BUSY 0x6000 /* registers in use */ 181163899Smjacob#define MBOX_TIMEOUT 0x6001 /* command timed out */ 182163899Smjacob 18364096Smjacob#define MBLOGALL 0x000f 18464096Smjacob#define MBLOGNONE 0x0000 18564096Smjacob#define MBLOGMASK(x) ((x) & 0xf) 18639235Sgibbs 18739235Sgibbs/* 18839235Sgibbs * Asynchronous event status codes 18939235Sgibbs */ 19039235Sgibbs#define ASYNC_BUS_RESET 0x8001 19139235Sgibbs#define ASYNC_SYSTEM_ERROR 0x8002 19239235Sgibbs#define ASYNC_RQS_XFER_ERR 0x8003 19339235Sgibbs#define ASYNC_RSP_XFER_ERR 0x8004 19439235Sgibbs#define ASYNC_QWAKEUP 0x8005 19539235Sgibbs#define ASYNC_TIMEOUT_RESET 0x8006 19641520Smjacob#define ASYNC_DEVICE_RESET 0x8007 19739235Sgibbs#define ASYNC_EXTMSG_UNDERRUN 0x800A 19839235Sgibbs#define ASYNC_SCAM_INT 0x800B 19939235Sgibbs#define ASYNC_HUNG_SCSI 0x800C 20039235Sgibbs#define ASYNC_KILLED_BUS 0x800D 20139235Sgibbs#define ASYNC_BUS_TRANSIT 0x800E /* LVD -> HVD, eg. */ 20239235Sgibbs#define ASYNC_LIP_OCCURRED 0x8010 20339235Sgibbs#define ASYNC_LOOP_UP 0x8011 20439235Sgibbs#define ASYNC_LOOP_DOWN 0x8012 20539235Sgibbs#define ASYNC_LOOP_RESET 0x8013 20641520Smjacob#define ASYNC_PDB_CHANGED 0x8014 20739235Sgibbs#define ASYNC_CHANGE_NOTIFY 0x8015 20881792Smjacob#define ASYNC_LIP_F8 0x8016 209163899Smjacob#define ASYNC_LIP_ERROR 0x8017 210163899Smjacob#define ASYNC_SECURITY_UPDATE 0x801B 21179237Smjacob#define ASYNC_CMD_CMPLT 0x8020 21279237Smjacob#define ASYNC_CTIO_DONE 0x8021 21379237Smjacob#define ASYNC_IP_XMIT_DONE 0x8022 21479237Smjacob#define ASYNC_IP_RECV_DONE 0x8023 21579237Smjacob#define ASYNC_IP_BROADCAST 0x8024 21679237Smjacob#define ASYNC_IP_RCVQ_LOW 0x8025 21779237Smjacob#define ASYNC_IP_RCVQ_EMPTY 0x8026 21879237Smjacob#define ASYNC_IP_RECV_DONE_ALIGNED 0x8027 21957149Smjacob#define ASYNC_PTPMODE 0x8030 22079237Smjacob#define ASYNC_RIO1 0x8031 22179237Smjacob#define ASYNC_RIO2 0x8032 22279237Smjacob#define ASYNC_RIO3 0x8033 22379237Smjacob#define ASYNC_RIO4 0x8034 22479237Smjacob#define ASYNC_RIO5 0x8035 22557149Smjacob#define ASYNC_CONNMODE 0x8036 22657149Smjacob#define ISP_CONN_LOOP 1 22757149Smjacob#define ISP_CONN_PTP 2 22857149Smjacob#define ISP_CONN_BADLIP 3 22957149Smjacob#define ISP_CONN_FATAL 4 23057149Smjacob#define ISP_CONN_LOOPBACK 5 23179237Smjacob#define ASYNC_RIO_RESP 0x8040 23279237Smjacob#define ASYNC_RIO_COMP 0x8042 233163899Smjacob#define ASYNC_RCV_ERR 0x8048 234163899Smjacob 23579237Smjacob/* 23679237Smjacob * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options 23779237Smjacob * mailbox command to enable this. 23879237Smjacob */ 23979237Smjacob#define ASYNC_QFULL_SENT 0x8049 24057149Smjacob 24139235Sgibbs/* 242163899Smjacob * 24XX only 24379237Smjacob */ 244163899Smjacob#define ASYNC_RJT_SENT 0x8049 24579237Smjacob 246163899Smjacob/* 247163899Smjacob * All IOCB Queue entries are this size 248163899Smjacob */ 249163899Smjacob#define QENTRY_LEN 64 25079237Smjacob 25179237Smjacob/* 25235388Smjacob * Command Structure Definitions 25335388Smjacob */ 25435388Smjacob 25535388Smjacobtypedef struct { 256155704Smjacob uint32_t ds_base; 257155704Smjacob uint32_t ds_count; 25835388Smjacob} ispds_t; 25935388Smjacob 26079237Smjacobtypedef struct { 261155704Smjacob uint32_t ds_base; 262155704Smjacob uint32_t ds_basehi; 263155704Smjacob uint32_t ds_count; 26479237Smjacob} ispds64_t; 26579237Smjacob 26687635Smjacob#define DSTYPE_32BIT 0 26787635Smjacob#define DSTYPE_64BIT 1 26879237Smjacobtypedef struct { 269155704Smjacob uint16_t ds_type; /* 0-> ispds_t, 1-> ispds64_t */ 270155704Smjacob uint32_t ds_segment; /* unused */ 271155704Smjacob uint32_t ds_base; /* 32 bit address of DSD list */ 27279237Smjacob} ispdslist_t; 27379237Smjacob 27479237Smjacob 27579237Smjacob/* 27679237Smjacob * These elements get swizzled around for SBus instances. 27779237Smjacob */ 27887635Smjacob#define ISP_SWAP8(a, b) { \ 279155704Smjacob uint8_t tmp; \ 28045283Smjacob tmp = a; \ 28145283Smjacob a = b; \ 28245283Smjacob b = tmp; \ 28345283Smjacob} 28435388Smjacobtypedef struct { 285155704Smjacob uint8_t rqs_entry_type; 286155704Smjacob uint8_t rqs_entry_count; 287155704Smjacob uint8_t rqs_seqno; 288155704Smjacob uint8_t rqs_flags; 28945283Smjacob} isphdr_t; 29035388Smjacob 29135388Smjacob/* RQS Flag definitions */ 29235388Smjacob#define RQSFLAG_CONTINUATION 0x01 29335388Smjacob#define RQSFLAG_FULL 0x02 29435388Smjacob#define RQSFLAG_BADHEADER 0x04 29535388Smjacob#define RQSFLAG_BADPACKET 0x08 296163899Smjacob#define RQSFLAG_MASK 0x0f 29735388Smjacob 29835388Smjacob/* RQS entry_type definitions */ 29939235Sgibbs#define RQSTYPE_REQUEST 0x01 30039235Sgibbs#define RQSTYPE_DATASEG 0x02 30139235Sgibbs#define RQSTYPE_RESPONSE 0x03 30239235Sgibbs#define RQSTYPE_MARKER 0x04 30339235Sgibbs#define RQSTYPE_CMDONLY 0x05 30439235Sgibbs#define RQSTYPE_ATIO 0x06 /* Target Mode */ 30555363Smjacob#define RQSTYPE_CTIO 0x07 /* Target Mode */ 30639235Sgibbs#define RQSTYPE_SCAM 0x08 30739235Sgibbs#define RQSTYPE_A64 0x09 30839235Sgibbs#define RQSTYPE_A64_CONT 0x0a 30939235Sgibbs#define RQSTYPE_ENABLE_LUN 0x0b /* Target Mode */ 31039235Sgibbs#define RQSTYPE_MODIFY_LUN 0x0c /* Target Mode */ 31139235Sgibbs#define RQSTYPE_NOTIFY 0x0d /* Target Mode */ 31239235Sgibbs#define RQSTYPE_NOTIFY_ACK 0x0e /* Target Mode */ 31339235Sgibbs#define RQSTYPE_CTIO1 0x0f /* Target Mode */ 31439235Sgibbs#define RQSTYPE_STATUS_CONT 0x10 31539235Sgibbs#define RQSTYPE_T2RQS 0x11 316163899Smjacob#define RQSTYPE_CTIO7 0x12 31779237Smjacob#define RQSTYPE_IP_XMIT 0x13 318163899Smjacob#define RQSTYPE_TSK_MGMT 0x14 31939235Sgibbs#define RQSTYPE_T4RQS 0x15 32079237Smjacob#define RQSTYPE_ATIO2 0x16 /* Target Mode */ 32179237Smjacob#define RQSTYPE_CTIO2 0x17 /* Target Mode */ 322163899Smjacob#define RQSTYPE_T7RQS 0x18 32339235Sgibbs#define RQSTYPE_T3RQS 0x19 32479237Smjacob#define RQSTYPE_IP_XMIT_64 0x1b 32579237Smjacob#define RQSTYPE_CTIO4 0x1e /* Target Mode */ 32679237Smjacob#define RQSTYPE_CTIO3 0x1f /* Target Mode */ 32779237Smjacob#define RQSTYPE_RIO1 0x21 32879237Smjacob#define RQSTYPE_RIO2 0x22 32979237Smjacob#define RQSTYPE_IP_RECV 0x23 33079237Smjacob#define RQSTYPE_IP_RECV_CONT 0x24 331163899Smjacob#define RQSTYPE_CT_PASSTHRU 0x29 332164370Smjacob#define RQSTYPE_MS_PASSTHRU 0x29 333163899Smjacob#define RQSTYPE_ABORT_IO 0x33 334163899Smjacob#define RQSTYPE_T6RQS 0x48 335163899Smjacob#define RQSTYPE_LOGIN 0x52 336163899Smjacob#define RQSTYPE_ABTS_RCVD 0x54 /* 24XX only */ 337163899Smjacob#define RQSTYPE_ABTS_RSP 0x55 /* 24XX only */ 33835388Smjacob 33939235Sgibbs 34035388Smjacob#define ISP_RQDSEG 4 34135388Smjacobtypedef struct { 34235388Smjacob isphdr_t req_header; 343155704Smjacob uint32_t req_handle; 344155704Smjacob uint8_t req_lun_trn; 345155704Smjacob uint8_t req_target; 346155704Smjacob uint16_t req_cdblen; 347155704Smjacob uint16_t req_flags; 348155704Smjacob uint16_t req_reserved; 349155704Smjacob uint16_t req_time; 350155704Smjacob uint16_t req_seg_count; 351155704Smjacob uint8_t req_cdb[12]; 35235388Smjacob ispds_t req_dataseg[ISP_RQDSEG]; 35335388Smjacob} ispreq_t; 354103825Smjacob#define ISP_RQDSEG_A64 2 355103825Smjacob 356163899Smjacobtypedef struct { 357163899Smjacob isphdr_t mrk_header; 358163899Smjacob uint32_t mrk_handle; 359163899Smjacob uint8_t mrk_reserved0; 360163899Smjacob uint8_t mrk_target; 361163899Smjacob uint16_t mrk_modifier; 362163899Smjacob uint16_t mrk_flags; 363163899Smjacob uint16_t mrk_lun; 364163899Smjacob uint8_t mrk_reserved1[48]; 365163899Smjacob} isp_marker_t; 366163899Smjacob 367163899Smjacobtypedef struct { 368163899Smjacob isphdr_t mrk_header; 369163899Smjacob uint32_t mrk_handle; 370163899Smjacob uint16_t mrk_nphdl; 371163899Smjacob uint8_t mrk_modifier; 372163899Smjacob uint8_t mrk_reserved0; 373163899Smjacob uint8_t mrk_reserved1; 374163899Smjacob uint8_t mrk_vphdl; 375163899Smjacob uint16_t mrk_reserved2; 376163899Smjacob uint8_t mrk_lun[8]; 377163899Smjacob uint8_t mrk_reserved3[40]; 378163899Smjacob} isp_marker_24xx_t; 379163899Smjacob 380163899Smjacob 38145283Smjacob#define SYNC_DEVICE 0 38245283Smjacob#define SYNC_TARGET 1 38345283Smjacob#define SYNC_ALL 2 384154704Smjacob#define SYNC_LIP 3 38545283Smjacob 38682689Smjacob#define ISP_RQDSEG_T2 3 38735388Smjacobtypedef struct { 38835388Smjacob isphdr_t req_header; 389155704Smjacob uint32_t req_handle; 390155704Smjacob uint8_t req_lun_trn; 391155704Smjacob uint8_t req_target; 392155704Smjacob uint16_t req_scclun; 393155704Smjacob uint16_t req_flags; 394163899Smjacob uint16_t req_reserved; 395155704Smjacob uint16_t req_time; 396155704Smjacob uint16_t req_seg_count; 397155704Smjacob uint8_t req_cdb[16]; 398155704Smjacob uint32_t req_totalcnt; 39935388Smjacob ispds_t req_dataseg[ISP_RQDSEG_T2]; 40035388Smjacob} ispreqt2_t; 40135388Smjacob 402154704Smjacobtypedef struct { 403154704Smjacob isphdr_t req_header; 404155704Smjacob uint32_t req_handle; 405155704Smjacob uint16_t req_target; 406155704Smjacob uint16_t req_scclun; 407155704Smjacob uint16_t req_flags; 408163899Smjacob uint16_t req_reserved; 409155704Smjacob uint16_t req_time; 410155704Smjacob uint16_t req_seg_count; 411155704Smjacob uint8_t req_cdb[16]; 412155704Smjacob uint32_t req_totalcnt; 413154704Smjacob ispds_t req_dataseg[ISP_RQDSEG_T2]; 414154704Smjacob} ispreqt2e_t; 415154704Smjacob 41682689Smjacob#define ISP_RQDSEG_T3 2 41782689Smjacobtypedef struct { 41882689Smjacob isphdr_t req_header; 419155704Smjacob uint32_t req_handle; 420155704Smjacob uint8_t req_lun_trn; 421155704Smjacob uint8_t req_target; 422155704Smjacob uint16_t req_scclun; 423155704Smjacob uint16_t req_flags; 424163899Smjacob uint16_t req_reserved; 425155704Smjacob uint16_t req_time; 426155704Smjacob uint16_t req_seg_count; 427155704Smjacob uint8_t req_cdb[16]; 428155704Smjacob uint32_t req_totalcnt; 42982689Smjacob ispds64_t req_dataseg[ISP_RQDSEG_T3]; 43082689Smjacob} ispreqt3_t; 431163899Smjacob#define ispreq64_t ispreqt3_t /* same as.... */ 43282689Smjacob 433154704Smjacobtypedef struct { 434154704Smjacob isphdr_t req_header; 435155704Smjacob uint32_t req_handle; 436155704Smjacob uint16_t req_target; 437155704Smjacob uint16_t req_scclun; 438155704Smjacob uint16_t req_flags; 439163899Smjacob uint16_t req_reserved; 440155704Smjacob uint16_t req_time; 441155704Smjacob uint16_t req_seg_count; 442155704Smjacob uint8_t req_cdb[16]; 443155704Smjacob uint32_t req_totalcnt; 444154704Smjacob ispds64_t req_dataseg[ISP_RQDSEG_T3]; 445154704Smjacob} ispreqt3e_t; 446154704Smjacob 44735388Smjacob/* req_flag values */ 44835388Smjacob#define REQFLAG_NODISCON 0x0001 44935388Smjacob#define REQFLAG_HTAG 0x0002 45035388Smjacob#define REQFLAG_OTAG 0x0004 45135388Smjacob#define REQFLAG_STAG 0x0008 45235388Smjacob#define REQFLAG_TARGET_RTN 0x0010 45335388Smjacob 45435388Smjacob#define REQFLAG_NODATA 0x0000 45535388Smjacob#define REQFLAG_DATA_IN 0x0020 45635388Smjacob#define REQFLAG_DATA_OUT 0x0040 45735388Smjacob#define REQFLAG_DATA_UNKNOWN 0x0060 45835388Smjacob 45935388Smjacob#define REQFLAG_DISARQ 0x0100 46039235Sgibbs#define REQFLAG_FRC_ASYNC 0x0200 46139235Sgibbs#define REQFLAG_FRC_SYNC 0x0400 46239235Sgibbs#define REQFLAG_FRC_WIDE 0x0800 46339235Sgibbs#define REQFLAG_NOPARITY 0x1000 46439235Sgibbs#define REQFLAG_STOPQ 0x2000 46539235Sgibbs#define REQFLAG_XTRASNS 0x4000 46639235Sgibbs#define REQFLAG_PRIORITY 0x8000 46735388Smjacob 46835388Smjacobtypedef struct { 46935388Smjacob isphdr_t req_header; 470155704Smjacob uint32_t req_handle; 471155704Smjacob uint8_t req_lun_trn; 472155704Smjacob uint8_t req_target; 473155704Smjacob uint16_t req_cdblen; 474155704Smjacob uint16_t req_flags; 475163899Smjacob uint16_t req_reserved; 476155704Smjacob uint16_t req_time; 477155704Smjacob uint16_t req_seg_count; 478155704Smjacob uint8_t req_cdb[44]; 47935388Smjacob} ispextreq_t; 48035388Smjacob 481163899Smjacob/* 24XX only */ 482163899Smjacobtypedef struct { 483163899Smjacob uint16_t fcd_length; 484163899Smjacob uint16_t fcd_a1500; 485163899Smjacob uint16_t fcd_a3116; 486163899Smjacob uint16_t fcd_a4732; 487163899Smjacob uint16_t fcd_a6348; 488163899Smjacob} fcp_cmnd_ds_t; 489163899Smjacob 490163899Smjacobtypedef struct { 491163899Smjacob isphdr_t req_header; 492163899Smjacob uint32_t req_handle; 493163899Smjacob uint16_t req_nphdl; 494163899Smjacob uint16_t req_time; 495163899Smjacob uint16_t req_seg_count; 496163899Smjacob uint16_t req_fc_rsp_dsd_length; 497163899Smjacob uint8_t req_lun[8]; 498163899Smjacob uint16_t req_flags; 499163899Smjacob uint16_t req_fc_cmnd_dsd_length; 500163899Smjacob uint16_t req_fc_cmnd_dsd_a1500; 501163899Smjacob uint16_t req_fc_cmnd_dsd_a3116; 502163899Smjacob uint16_t req_fc_cmnd_dsd_a4732; 503163899Smjacob uint16_t req_fc_cmnd_dsd_a6348; 504163899Smjacob uint16_t req_fc_rsp_dsd_a1500; 505163899Smjacob uint16_t req_fc_rsp_dsd_a3116; 506163899Smjacob uint16_t req_fc_rsp_dsd_a4732; 507163899Smjacob uint16_t req_fc_rsp_dsd_a6348; 508163899Smjacob uint32_t req_totalcnt; 509163899Smjacob uint16_t req_tidlo; 510163899Smjacob uint8_t req_tidhi; 511163899Smjacob uint8_t req_vpidx; 512163899Smjacob ispds64_t req_dataseg; 513163899Smjacob} ispreqt6_t; 514163899Smjacob 515163899Smjacobtypedef struct { 516163899Smjacob isphdr_t req_header; 517163899Smjacob uint32_t req_handle; 518163899Smjacob uint16_t req_nphdl; 519163899Smjacob uint16_t req_time; 520163899Smjacob uint16_t req_seg_count; 521163899Smjacob uint16_t req_reserved; 522163899Smjacob uint8_t req_lun[8]; 523163899Smjacob uint8_t req_alen_datadir; 524163899Smjacob uint8_t req_task_management; 525163899Smjacob uint8_t req_task_attribute; 526163899Smjacob uint8_t req_crn; 527163899Smjacob uint8_t req_cdb[16]; 528163899Smjacob uint32_t req_dl; 529163899Smjacob uint16_t req_tidlo; 530163899Smjacob uint8_t req_tidhi; 531163899Smjacob uint8_t req_vpidx; 532163899Smjacob ispds64_t req_dataseg; 533163899Smjacob} ispreqt7_t; 534163899Smjacob 535163899Smjacob/* I/O Abort Structure */ 536163899Smjacobtypedef struct { 537163899Smjacob isphdr_t abrt_header; 538163899Smjacob uint32_t abrt_handle; 539163899Smjacob uint16_t abrt_nphdl; 540163899Smjacob uint16_t abrt_options; 541163899Smjacob uint32_t abrt_cmd_handle; 542163899Smjacob uint8_t abrt_reserved[32]; 543163899Smjacob uint16_t abrt_tidlo; 544163899Smjacob uint8_t abrt_tidhi; 545163899Smjacob uint8_t abrt_vpidx; 546163899Smjacob uint8_t abrt_reserved1[12]; 547163899Smjacob} isp24xx_abrt_t; 548163899Smjacob#define ISP24XX_ABRT_NO_ABTS 0x01 /* don't actually send an ABTS */ 549163899Smjacob#define ISP24XX_ABRT_ENXIO 0x31 /* in nphdl on return */ 550163899Smjacob 55135388Smjacob#define ISP_CDSEG 7 55235388Smjacobtypedef struct { 55335388Smjacob isphdr_t req_header; 554163899Smjacob uint32_t req_reserved; 55535388Smjacob ispds_t req_dataseg[ISP_CDSEG]; 55635388Smjacob} ispcontreq_t; 55735388Smjacob 55882689Smjacob#define ISP_CDSEG64 5 55935388Smjacobtypedef struct { 56035388Smjacob isphdr_t req_header; 56182689Smjacob ispds64_t req_dataseg[ISP_CDSEG64]; 56282689Smjacob} ispcontreq64_t; 56382689Smjacob 56482689Smjacobtypedef struct { 56582689Smjacob isphdr_t req_header; 566155704Smjacob uint32_t req_handle; 567155704Smjacob uint16_t req_scsi_status; 568155704Smjacob uint16_t req_completion_status; 569155704Smjacob uint16_t req_state_flags; 570155704Smjacob uint16_t req_status_flags; 571155704Smjacob uint16_t req_time; 57255384Smjacob#define req_response_len req_time /* FC only */ 573155704Smjacob uint16_t req_sense_len; 574155704Smjacob uint32_t req_resid; 575155704Smjacob uint8_t req_response[8]; /* FC only */ 576155704Smjacob uint8_t req_sense_data[32]; 57735388Smjacob} ispstatusreq_t; 57835388Smjacob 579163899Smjacob/* 580163899Smjacob * Status Continuation 581163899Smjacob */ 58287635Smjacobtypedef struct { 58387635Smjacob isphdr_t req_header; 584155704Smjacob uint8_t req_sense_data[60]; 58587635Smjacob} ispstatus_cont_t; 58687635Smjacob 587163899Smjacob/* 588163899Smjacob * 24XX Type 0 status 589163899Smjacob */ 590163899Smjacobtypedef struct { 591163899Smjacob isphdr_t req_header; 592163899Smjacob uint32_t req_handle; 593163899Smjacob uint16_t req_completion_status; 594163899Smjacob uint16_t req_oxid; 595163899Smjacob uint32_t req_resid; 596163899Smjacob uint16_t req_reserved0; 597163899Smjacob uint16_t req_state_flags; 598163899Smjacob uint16_t req_reserved1; 599163899Smjacob uint16_t req_scsi_status; 600163899Smjacob uint32_t req_fcp_residual; 601163899Smjacob uint32_t req_sense_len; 602163899Smjacob uint32_t req_response_len; 603163899Smjacob uint8_t req_rsp_sense[28]; 604163899Smjacob} isp24xx_statusreq_t; 605163899Smjacob 60635388Smjacob/* 60770824Smjacob * For Qlogic 2X00, the high order byte of SCSI status has 60835388Smjacob * additional meaning. 60935388Smjacob */ 61035388Smjacob#define RQCS_RU 0x800 /* Residual Under */ 61135388Smjacob#define RQCS_RO 0x400 /* Residual Over */ 61265140Smjacob#define RQCS_RESID (RQCS_RU|RQCS_RO) 61335388Smjacob#define RQCS_SV 0x200 /* Sense Length Valid */ 61465140Smjacob#define RQCS_RV 0x100 /* FCP Response Length Valid */ 61535388Smjacob 616163899Smjacob/* 617163899Smjacob * CT Passthru IOCB 618163899Smjacob */ 619163899Smjacobtypedef struct { 620163899Smjacob isphdr_t ctp_header; 621163899Smjacob uint32_t ctp_handle; 622163899Smjacob uint16_t ctp_status; 623163899Smjacob uint16_t ctp_nphdl; /* n-port handle */ 624163899Smjacob uint16_t ctp_cmd_cnt; /* Command DSD count */ 625163899Smjacob uint16_t ctp_vpidx; /* low 8 bits */ 626163899Smjacob uint16_t ctp_time; 627163899Smjacob uint16_t ctp_reserved0; 628163899Smjacob uint16_t ctp_rsp_cnt; /* Response DSD count */ 629163899Smjacob uint16_t ctp_reserved1[5]; 630163899Smjacob uint32_t ctp_rsp_bcnt; /* Response byte count */ 631163899Smjacob uint32_t ctp_cmd_bcnt; /* Command byte count */ 632163899Smjacob ispds64_t ctp_dataseg[2]; 633163899Smjacob} isp_ct_pt_t; 634163899Smjacob 635164370Smjacob/* 636164370Smjacob * MS Passthru IOCB 637164370Smjacob */ 638164370Smjacobtypedef struct { 639164370Smjacob isphdr_t ms_header; 640164370Smjacob uint32_t ms_handle; 641165021Smjacob uint16_t ms_nphdl; /* handle in high byte for !2k f/w */ 642164370Smjacob uint16_t ms_status; 643164370Smjacob uint16_t ms_flags; 644164370Smjacob uint16_t ms_reserved1; /* low 8 bits */ 645164370Smjacob uint16_t ms_time; 646164370Smjacob uint16_t ms_cmd_cnt; /* Command DSD count */; 647164370Smjacob uint16_t ms_tot_cnt; /* Total DSD Count */ 648164370Smjacob uint8_t ms_type; /* MS type */ 649164370Smjacob uint8_t ms_r_ctl; /* R_CTL */ 650164370Smjacob uint16_t ms_rxid; /* RX_ID */ 651164370Smjacob uint16_t ms_reserved2; 652164370Smjacob uint32_t ms_handle2; 653164370Smjacob uint32_t ms_rsp_bcnt; /* Response byte count */ 654164370Smjacob uint32_t ms_cmd_bcnt; /* Command byte count */ 655164370Smjacob ispds64_t ms_dataseg[2]; 656164370Smjacob} isp_ms_t; 657164370Smjacob 65835388Smjacob/* 65935388Smjacob * Completion Status Codes. 66035388Smjacob */ 66135388Smjacob#define RQCS_COMPLETE 0x0000 66235388Smjacob#define RQCS_DMA_ERROR 0x0002 66335388Smjacob#define RQCS_RESET_OCCURRED 0x0004 66435388Smjacob#define RQCS_ABORTED 0x0005 66535388Smjacob#define RQCS_TIMEOUT 0x0006 66635388Smjacob#define RQCS_DATA_OVERRUN 0x0007 66765140Smjacob#define RQCS_DATA_UNDERRUN 0x0015 66865140Smjacob#define RQCS_QUEUE_FULL 0x001C 66965140Smjacob 67065140Smjacob/* 1X00 Only Completion Codes */ 67165140Smjacob#define RQCS_INCOMPLETE 0x0001 67265140Smjacob#define RQCS_TRANSPORT_ERROR 0x0003 67335388Smjacob#define RQCS_COMMAND_OVERRUN 0x0008 67435388Smjacob#define RQCS_STATUS_OVERRUN 0x0009 67535388Smjacob#define RQCS_BAD_MESSAGE 0x000a 67635388Smjacob#define RQCS_NO_MESSAGE_OUT 0x000b 67735388Smjacob#define RQCS_EXT_ID_FAILED 0x000c 67835388Smjacob#define RQCS_IDE_MSG_FAILED 0x000d 67935388Smjacob#define RQCS_ABORT_MSG_FAILED 0x000e 68035388Smjacob#define RQCS_REJECT_MSG_FAILED 0x000f 68135388Smjacob#define RQCS_NOP_MSG_FAILED 0x0010 68235388Smjacob#define RQCS_PARITY_ERROR_MSG_FAILED 0x0011 68335388Smjacob#define RQCS_DEVICE_RESET_MSG_FAILED 0x0012 68435388Smjacob#define RQCS_ID_MSG_FAILED 0x0013 68535388Smjacob#define RQCS_UNEXP_BUS_FREE 0x0014 68639235Sgibbs#define RQCS_XACT_ERR1 0x0018 68739235Sgibbs#define RQCS_XACT_ERR2 0x0019 68839235Sgibbs#define RQCS_XACT_ERR3 0x001A 68939235Sgibbs#define RQCS_BAD_ENTRY 0x001B 69039235Sgibbs#define RQCS_PHASE_SKIPPED 0x001D 69139235Sgibbs#define RQCS_ARQS_FAILED 0x001E 69239235Sgibbs#define RQCS_WIDE_FAILED 0x001F 69339235Sgibbs#define RQCS_SYNCXFER_FAILED 0x0020 69439235Sgibbs#define RQCS_LVD_BUSERR 0x0021 69539235Sgibbs 69665140Smjacob/* 2X00 Only Completion Codes */ 69735388Smjacob#define RQCS_PORT_UNAVAILABLE 0x0028 69835388Smjacob#define RQCS_PORT_LOGGED_OUT 0x0029 69935388Smjacob#define RQCS_PORT_CHANGED 0x002A 70035388Smjacob#define RQCS_PORT_BUSY 0x002B 70135388Smjacob 702163899Smjacob/* 24XX Only Completion Codes */ 703163899Smjacob#define RQCS_24XX_DRE 0x0011 /* data reassembly error */ 704163899Smjacob#define RQCS_24XX_TABORT 0x0013 /* aborted by target */ 705163899Smjacob#define RQCS_24XX_ENOMEM 0x002C /* f/w resource unavailable */ 706163899Smjacob#define RQCS_24XX_TMO 0x0030 /* task management overrun */ 707163899Smjacob 708163899Smjacob 70935388Smjacob/* 71065140Smjacob * 1X00 specific State Flags 71135388Smjacob */ 71235388Smjacob#define RQSF_GOT_BUS 0x0100 71335388Smjacob#define RQSF_GOT_TARGET 0x0200 71435388Smjacob#define RQSF_SENT_CDB 0x0400 71535388Smjacob#define RQSF_XFRD_DATA 0x0800 71635388Smjacob#define RQSF_GOT_STATUS 0x1000 71735388Smjacob#define RQSF_GOT_SENSE 0x2000 71835388Smjacob#define RQSF_XFER_COMPLETE 0x4000 71935388Smjacob 72035388Smjacob/* 72170824Smjacob * 2X00 specific State Flags 72270824Smjacob * (same as 1X00 except RQSF_GOT_BUS/RQSF_GOT_TARGET are not available) 72370824Smjacob */ 72470824Smjacob#define RQSF_DATA_IN 0x0020 72570824Smjacob#define RQSF_DATA_OUT 0x0040 72670824Smjacob#define RQSF_STAG 0x0008 72770824Smjacob#define RQSF_OTAG 0x0004 72870824Smjacob#define RQSF_HTAG 0x0002 72970824Smjacob/* 73065140Smjacob * 1X00 Status Flags 73135388Smjacob */ 73235388Smjacob#define RQSTF_DISCONNECT 0x0001 73335388Smjacob#define RQSTF_SYNCHRONOUS 0x0002 73435388Smjacob#define RQSTF_PARITY_ERROR 0x0004 73535388Smjacob#define RQSTF_BUS_RESET 0x0008 73635388Smjacob#define RQSTF_DEVICE_RESET 0x0010 73735388Smjacob#define RQSTF_ABORTED 0x0020 73835388Smjacob#define RQSTF_TIMEOUT 0x0040 73935388Smjacob#define RQSTF_NEGOTIATION 0x0080 74035388Smjacob 74135388Smjacob/* 74265140Smjacob * 2X00 specific state flags 74365140Smjacob */ 74465140Smjacob/* RQSF_SENT_CDB */ 74565140Smjacob/* RQSF_XFRD_DATA */ 74665140Smjacob/* RQSF_GOT_STATUS */ 74765140Smjacob/* RQSF_XFER_COMPLETE */ 74865140Smjacob 74965140Smjacob/* 75065140Smjacob * 2X00 specific status flags 75165140Smjacob */ 75265140Smjacob/* RQSTF_ABORTED */ 75365140Smjacob/* RQSTF_TIMEOUT */ 75465140Smjacob#define RQSTF_DMA_ERROR 0x0080 75565140Smjacob#define RQSTF_LOGOUT 0x2000 75665140Smjacob 75765140Smjacob/* 75865140Smjacob * Miscellaneous 75965140Smjacob */ 76065140Smjacob#ifndef ISP_EXEC_THROTTLE 76165140Smjacob#define ISP_EXEC_THROTTLE 16 76265140Smjacob#endif 76365140Smjacob 76465140Smjacob/* 76575194Smjacob * About Firmware returns an 'attribute' word in mailbox 6. 766163899Smjacob * These attributes are for 2200 and 2300. 76775194Smjacob */ 76875194Smjacob#define ISP_FW_ATTR_TMODE 0x01 76975194Smjacob#define ISP_FW_ATTR_SCCLUN 0x02 77075194Smjacob#define ISP_FW_ATTR_FABRIC 0x04 77175194Smjacob#define ISP_FW_ATTR_CLASS2 0x08 77275194Smjacob#define ISP_FW_ATTR_FCTAPE 0x10 77375194Smjacob#define ISP_FW_ATTR_IP 0x20 774154704Smjacob#define ISP_FW_ATTR_VI 0x40 775154704Smjacob#define ISP_FW_ATTR_VI_SOLARIS 0x80 776154704Smjacob#define ISP_FW_ATTR_2KLOGINS 0x100 /* XXX: just a guess */ 77775194Smjacob 778163899Smjacob/* and these are for the 2400 */ 779163899Smjacob#define ISP2400_FW_ATTR_CLASS2 (1 << 0) 780163899Smjacob#define ISP2400_FW_ATTR_IP (1 << 1) 781163899Smjacob#define ISP2400_FW_ATTR_MULTIID (1 << 2) 782163899Smjacob#define ISP2400_FW_ATTR_SB2 (1 << 3) 783163899Smjacob#define ISP2400_FW_ATTR_T10CRC (1 << 4) 784163899Smjacob#define ISP2400_FW_ATTR_VI (1 << 5) 785163899Smjacob#define ISP2400_FW_ATTR_EXPFW (1 << 13) 786154704Smjacob 78775194Smjacob/* 78879237Smjacob * Reduced Interrupt Operation Response Queue Entreis 78979237Smjacob */ 79079237Smjacob 79179237Smjacobtypedef struct { 79279237Smjacob isphdr_t req_header; 793155704Smjacob uint32_t req_handles[15]; 79479237Smjacob} isp_rio1_t; 79579237Smjacob 79679237Smjacobtypedef struct { 79779237Smjacob isphdr_t req_header; 798155704Smjacob uint16_t req_handles[30]; 79979237Smjacob} isp_rio2_t; 80079237Smjacob 80179237Smjacob/* 802163899Smjacob * FC (ISP2100/ISP2200/ISP2300/ISP2400) specific data structures 80339235Sgibbs */ 80439235Sgibbs 80539235Sgibbs/* 80635388Smjacob * Initialization Control Block 80739235Sgibbs * 80849910Smjacob * Version One (prime) format. 80935388Smjacob */ 810163899Smjacobtypedef struct { 811155704Smjacob uint8_t icb_version; 812163899Smjacob uint8_t icb_reserved0; 813155704Smjacob uint16_t icb_fwoptions; 814155704Smjacob uint16_t icb_maxfrmlen; 815155704Smjacob uint16_t icb_maxalloc; 816155704Smjacob uint16_t icb_execthrottle; 817155704Smjacob uint8_t icb_retry_count; 818155704Smjacob uint8_t icb_retry_delay; 819155704Smjacob uint8_t icb_portname[8]; 820155704Smjacob uint16_t icb_hardaddr; 821155704Smjacob uint8_t icb_iqdevtype; 822155704Smjacob uint8_t icb_logintime; 823155704Smjacob uint8_t icb_nodename[8]; 824155704Smjacob uint16_t icb_rqstout; 825155704Smjacob uint16_t icb_rspnsin; 826155704Smjacob uint16_t icb_rqstqlen; 827155704Smjacob uint16_t icb_rsltqlen; 828155704Smjacob uint16_t icb_rqstaddr[4]; 829155704Smjacob uint16_t icb_respaddr[4]; 830155704Smjacob uint16_t icb_lunenables; 831155704Smjacob uint8_t icb_ccnt; 832155704Smjacob uint8_t icb_icnt; 833155704Smjacob uint16_t icb_lunetimeout; 834163899Smjacob uint16_t icb_reserved1; 835155704Smjacob uint16_t icb_xfwoptions; 836155704Smjacob uint8_t icb_racctimer; 837155704Smjacob uint8_t icb_idelaytimer; 838155704Smjacob uint16_t icb_zfwoptions; 839163899Smjacob uint16_t icb_reserved2[13]; 84035388Smjacob} isp_icb_t; 841163899Smjacob 84239235Sgibbs#define ICB_VERSION1 1 84335388Smjacob 844163899Smjacob#define ICBOPT_EXTENDED 0x8000 845163899Smjacob#define ICBOPT_BOTH_WWNS 0x4000 846163899Smjacob#define ICBOPT_FULL_LOGIN 0x2000 847163899Smjacob#define ICBOPT_STOP_ON_QFULL 0x1000 /* 2200/2100 only */ 848163899Smjacob#define ICBOPT_PREVLOOP 0x0800 849163899Smjacob#define ICBOPT_SRCHDOWN 0x0400 850163899Smjacob#define ICBOPT_NOLIP 0x0200 851163899Smjacob#define ICBOPT_PDBCHANGE_AE 0x0100 852163899Smjacob#define ICBOPT_INI_TGTTYPE 0x0080 853163899Smjacob#define ICBOPT_INI_ADISC 0x0040 854163899Smjacob#define ICBOPT_INI_DISABLE 0x0020 855163899Smjacob#define ICBOPT_TGT_ENABLE 0x0010 856163899Smjacob#define ICBOPT_FAST_POST 0x0008 857163899Smjacob#define ICBOPT_FULL_DUPLEX 0x0004 858163899Smjacob#define ICBOPT_FAIRNESS 0x0002 85948481Smjacob#define ICBOPT_HARD_ADDRESS 0x0001 86035388Smjacob 861163899Smjacob#define ICBXOPT_NO_LOGOUT 0x8000 /* no logout on link failure */ 862163899Smjacob#define ICBXOPT_FCTAPE_CCQ 0x4000 /* FC-Tape Command Queueing */ 863163899Smjacob#define ICBXOPT_FCTAPE_CONFIRM 0x2000 864163899Smjacob#define ICBXOPT_FCTAPE 0x1000 86557149Smjacob#define ICBXOPT_CLASS2_ACK0 0x0200 86657149Smjacob#define ICBXOPT_CLASS2 0x0100 867163899Smjacob#define ICBXOPT_NO_PLAY 0x0080 /* don't play if can't get hard addr */ 868163899Smjacob#define ICBXOPT_TOPO_MASK 0x0070 869163899Smjacob#define ICBXOPT_LOOP_ONLY 0x0000 870163899Smjacob#define ICBXOPT_PTP_ONLY 0x0010 871163899Smjacob#define ICBXOPT_LOOP_2_PTP 0x0020 872163899Smjacob#define ICBXOPT_PTP_2_LOOP 0x0030 873112593Smjacob/* 874112593Smjacob * The lower 4 bits of the xfwoptions field are the OPERATION MODE bits. 875163899Smjacob * RIO is not defined for the 23XX cards (just 2200) 876112593Smjacob */ 87757149Smjacob#define ICBXOPT_RIO_OFF 0 87857149Smjacob#define ICBXOPT_RIO_16BIT 1 87957149Smjacob#define ICBXOPT_RIO_32BIT 2 88088855Smjacob#define ICBXOPT_RIO_16BIT_IOCB 3 88188855Smjacob#define ICBXOPT_RIO_32BIT_IOCB 4 882112593Smjacob#define ICBXOPT_ZIO 5 883160080Smjacob#define ICBXOPT_TIMER_MASK 0x7 88457149Smjacob 885163899Smjacob#define ICBZOPT_RATE_MASK 0xC000 886163899Smjacob#define ICBZOPT_RATE_ONEGB 0x0000 887163899Smjacob#define ICBZOPT_RATE_AUTO 0x8000 888163899Smjacob#define ICBZOPT_RATE_TWOGB 0x4000 889163899Smjacob#define ICBZOPT_50_OHM 0x2000 890163899Smjacob#define ICBZOPT_ENA_OOF 0x0040 /* out of order frame handling */ 891163899Smjacob#define ICBZOPT_RSPSZ_MASK 0x0030 892163899Smjacob#define ICBZOPT_RSPSZ_24 0x0000 893163899Smjacob#define ICBZOPT_RSPSZ_12 0x0010 894163899Smjacob#define ICBZOPT_RSPSZ_24A 0x0020 895163899Smjacob#define ICBZOPT_RSPSZ_32 0x0030 896163899Smjacob#define ICBZOPT_SOFTID 0x0002 897163899Smjacob#define ICBZOPT_ENA_RDXFR_RDY 0x0001 89857149Smjacob 899163899Smjacob/* 2400 F/W options */ 900163899Smjacob#define ICB2400_OPT1_BOTH_WWNS 0x00004000 901163899Smjacob#define ICB2400_OPT1_FULL_LOGIN 0x00002000 902163899Smjacob#define ICB2400_OPT1_PREVLOOP 0x00000800 903163899Smjacob#define ICB2400_OPT1_SRCHDOWN 0x00000400 904163899Smjacob#define ICB2400_OPT1_NOLIP 0x00000200 905163899Smjacob#define ICB2400_OPT1_INI_DISABLE 0x00000020 906163899Smjacob#define ICB2400_OPT1_TGT_ENABLE 0x00000010 907163899Smjacob#define ICB2400_OPT1_FULL_DUPLEX 0x00000004 908163899Smjacob#define ICB2400_OPT1_FAIRNESS 0x00000002 909163899Smjacob#define ICB2400_OPT1_HARD_ADDRESS 0x00000001 91057149Smjacob 911163899Smjacob#define ICB2400_OPT2_FCTAPE 0x00001000 912163899Smjacob#define ICB2400_OPT2_CLASS2_ACK0 0x00000200 913163899Smjacob#define ICB2400_OPT2_CLASS2 0x00000100 914163899Smjacob#define ICB2400_OPT2_NO_PLAY 0x00000080 915163899Smjacob#define ICB2400_OPT2_TOPO_MASK 0x00000070 916163899Smjacob#define ICB2400_OPT2_LOOP_ONLY 0x00000000 917163899Smjacob#define ICB2400_OPT2_PTP_ONLY 0x00000010 918163899Smjacob#define ICB2400_OPT2_LOOP_2_PTP 0x00000020 919163899Smjacob#define ICB2400_OPT2_PTP_2_LOOP 0x00000030 920163899Smjacob#define ICB2400_OPT2_TIMER_MASK 0x00000007 921163899Smjacob#define ICB2400_OPT2_ZIO 0x00000005 922163899Smjacob#define ICB2400_OPT2_ZIO1 0x00000006 923163899Smjacob 924163899Smjacob#define ICB2400_OPT3_75_OHM 0x00010000 925163899Smjacob#define ICB2400_OPT3_RATE_MASK 0x0000E000 926163899Smjacob#define ICB2400_OPT3_RATE_ONEGB 0x00000000 927163899Smjacob#define ICB2400_OPT3_RATE_TWOGB 0x00002000 928163899Smjacob#define ICB2400_OPT3_RATE_AUTO 0x00004000 929163899Smjacob#define ICB2400_OPT3_RATE_FOURGB 0x00006000 930163899Smjacob#define ICB2400_OPT3_ENA_OOF_XFRDY 0x00000200 931163899Smjacob#define ICB2400_OPT3_NO_LOCAL_PLOGI 0x00000080 932163899Smjacob#define ICB2400_OPT3_ENA_OOF 0x00000040 933163899Smjacob/* note that a response size flag of zero is reserved! */ 934163899Smjacob#define ICB2400_OPT3_RSPSZ_MASK 0x00000030 935163899Smjacob#define ICB2400_OPT3_RSPSZ_12 0x00000010 936163899Smjacob#define ICB2400_OPT3_RSPSZ_24 0x00000020 937163899Smjacob#define ICB2400_OPT3_RSPSZ_32 0x00000030 938163899Smjacob#define ICB2400_OPT3_SOFTID 0x00000002 939163899Smjacob 94039235Sgibbs#define ICB_MIN_FRMLEN 256 94139235Sgibbs#define ICB_MAX_FRMLEN 2112 94239235Sgibbs#define ICB_DFLT_FRMLEN 1024 94348481Smjacob#define ICB_DFLT_ALLOC 256 94448481Smjacob#define ICB_DFLT_THROTTLE 16 94548481Smjacob#define ICB_DFLT_RDELAY 5 94648481Smjacob#define ICB_DFLT_RCOUNT 3 94739235Sgibbs 948157943Smjacob#define ICB_LOGIN_TOV 30 949157943Smjacob#define ICB_LUN_ENABLE_TOV 180 95048481Smjacob 951157943Smjacob 952163899Smjacob/* 953163899Smjacob * And somebody at QLogic had a great idea that you could just change 954163899Smjacob * the structure *and* keep the version number the same as the other cards. 955163899Smjacob */ 956163899Smjacobtypedef struct { 957163899Smjacob uint16_t icb_version; 958163899Smjacob uint16_t icb_reserved0; 959163899Smjacob uint16_t icb_maxfrmlen; 960163899Smjacob uint16_t icb_execthrottle; 961163899Smjacob uint16_t icb_xchgcnt; 962163899Smjacob uint16_t icb_hardaddr; 963163899Smjacob uint8_t icb_portname[8]; 964163899Smjacob uint8_t icb_nodename[8]; 965163899Smjacob uint16_t icb_rspnsin; 966163899Smjacob uint16_t icb_rqstout; 967163899Smjacob uint16_t icb_retry_count; 968163899Smjacob uint16_t icb_priout; 969163899Smjacob uint16_t icb_rsltqlen; 970163899Smjacob uint16_t icb_rqstqlen; 971163899Smjacob uint16_t icb_ldn_nols; 972163899Smjacob uint16_t icb_prqstqlen; 973163899Smjacob uint16_t icb_rqstaddr[4]; 974163899Smjacob uint16_t icb_respaddr[4]; 975163899Smjacob uint16_t icb_priaddr[4]; 976163899Smjacob uint16_t icb_reserved1[4]; 977163899Smjacob uint16_t icb_atio_in; 978163899Smjacob uint16_t icb_atioqlen; 979163899Smjacob uint16_t icb_atioqaddr[4]; 980163899Smjacob uint16_t icb_idelaytimer; 981163899Smjacob uint16_t icb_logintime; 982163899Smjacob uint32_t icb_fwoptions1; 983163899Smjacob uint32_t icb_fwoptions2; 984163899Smjacob uint32_t icb_fwoptions3; 985163899Smjacob uint16_t icb_reserved2[12]; 986163899Smjacob} isp_icb_2400_t; 987157943Smjacob 98839235Sgibbs#define RQRSP_ADDR0015 0 98939235Sgibbs#define RQRSP_ADDR1631 1 99039235Sgibbs#define RQRSP_ADDR3247 2 99139235Sgibbs#define RQRSP_ADDR4863 3 99239235Sgibbs 99345283Smjacob 99439235Sgibbs#define ICB_NNM0 7 99539235Sgibbs#define ICB_NNM1 6 99639235Sgibbs#define ICB_NNM2 5 99739235Sgibbs#define ICB_NNM3 4 99839235Sgibbs#define ICB_NNM4 3 99939235Sgibbs#define ICB_NNM5 2 100039235Sgibbs#define ICB_NNM6 1 100139235Sgibbs#define ICB_NNM7 0 100239235Sgibbs 100339235Sgibbs#define MAKE_NODE_NAME_FROM_WWN(array, wwn) \ 1004155704Smjacob array[ICB_NNM0] = (uint8_t) ((wwn >> 0) & 0xff), \ 1005155704Smjacob array[ICB_NNM1] = (uint8_t) ((wwn >> 8) & 0xff), \ 1006155704Smjacob array[ICB_NNM2] = (uint8_t) ((wwn >> 16) & 0xff), \ 1007155704Smjacob array[ICB_NNM3] = (uint8_t) ((wwn >> 24) & 0xff), \ 1008155704Smjacob array[ICB_NNM4] = (uint8_t) ((wwn >> 32) & 0xff), \ 1009155704Smjacob array[ICB_NNM5] = (uint8_t) ((wwn >> 40) & 0xff), \ 1010155704Smjacob array[ICB_NNM6] = (uint8_t) ((wwn >> 48) & 0xff), \ 1011155704Smjacob array[ICB_NNM7] = (uint8_t) ((wwn >> 56) & 0xff) 101239235Sgibbs 1013124893Smjacob#define MAKE_WWN_FROM_NODE_NAME(wwn, array) \ 1014155704Smjacob wwn = ((uint64_t) array[ICB_NNM0]) | \ 1015155704Smjacob ((uint64_t) array[ICB_NNM1] << 8) | \ 1016155704Smjacob ((uint64_t) array[ICB_NNM2] << 16) | \ 1017155704Smjacob ((uint64_t) array[ICB_NNM3] << 24) | \ 1018155704Smjacob ((uint64_t) array[ICB_NNM4] << 32) | \ 1019155704Smjacob ((uint64_t) array[ICB_NNM5] << 40) | \ 1020155704Smjacob ((uint64_t) array[ICB_NNM6] << 48) | \ 1021155704Smjacob ((uint64_t) array[ICB_NNM7] << 56) 1022124893Smjacob 102341520Smjacob/* 102444819Smjacob * Port Data Base Element 102544819Smjacob */ 102644819Smjacob 102744819Smjacobtypedef struct { 1028155704Smjacob uint16_t pdb_options; 1029155704Smjacob uint8_t pdb_mstate; 1030155704Smjacob uint8_t pdb_sstate; 1031155704Smjacob uint8_t pdb_hardaddr_bits[4]; 1032155704Smjacob uint8_t pdb_portid_bits[4]; 1033155704Smjacob uint8_t pdb_nodename[8]; 1034155704Smjacob uint8_t pdb_portname[8]; 1035155704Smjacob uint16_t pdb_execthrottle; 1036155704Smjacob uint16_t pdb_exec_count; 1037155704Smjacob uint8_t pdb_retry_count; 1038155704Smjacob uint8_t pdb_retry_delay; 1039155704Smjacob uint16_t pdb_resalloc; 1040155704Smjacob uint16_t pdb_curalloc; 1041155704Smjacob uint16_t pdb_qhead; 1042155704Smjacob uint16_t pdb_qtail; 1043155704Smjacob uint16_t pdb_tl_next; 1044155704Smjacob uint16_t pdb_tl_last; 1045155704Smjacob uint16_t pdb_features; /* PLOGI, Common Service */ 1046155704Smjacob uint16_t pdb_pconcurrnt; /* PLOGI, Common Service */ 1047155704Smjacob uint16_t pdb_roi; /* PLOGI, Common Service */ 1048155704Smjacob uint8_t pdb_target; 1049155704Smjacob uint8_t pdb_initiator; /* PLOGI, Class 3 Control Flags */ 1050155704Smjacob uint16_t pdb_rdsiz; /* PLOGI, Class 3 */ 1051155704Smjacob uint16_t pdb_ncseq; /* PLOGI, Class 3 */ 1052155704Smjacob uint16_t pdb_noseq; /* PLOGI, Class 3 */ 1053155704Smjacob uint16_t pdb_labrtflg; 1054155704Smjacob uint16_t pdb_lstopflg; 1055155704Smjacob uint16_t pdb_sqhead; 1056155704Smjacob uint16_t pdb_sqtail; 1057155704Smjacob uint16_t pdb_ptimer; 1058155704Smjacob uint16_t pdb_nxt_seqid; 1059155704Smjacob uint16_t pdb_fcount; 1060155704Smjacob uint16_t pdb_prli_len; 1061155704Smjacob uint16_t pdb_prli_svc0; 1062155704Smjacob uint16_t pdb_prli_svc3; 1063155704Smjacob uint16_t pdb_loopid; 1064155704Smjacob uint16_t pdb_il_ptr; 1065155704Smjacob uint16_t pdb_sl_ptr; 1066163899Smjacob} isp_pdb_21xx_t; 106744819Smjacob 106844819Smjacob#define PDB_OPTIONS_XMITTING (1<<11) 106944819Smjacob#define PDB_OPTIONS_LNKXMIT (1<<10) 107044819Smjacob#define PDB_OPTIONS_ABORTED (1<<9) 107144819Smjacob#define PDB_OPTIONS_ADISC (1<<1) 107244819Smjacob 107344819Smjacob#define PDB_STATE_DISCOVERY 0 107444819Smjacob#define PDB_STATE_WDISC_ACK 1 107544819Smjacob#define PDB_STATE_PLOGI 2 107644819Smjacob#define PDB_STATE_PLOGI_ACK 3 107744819Smjacob#define PDB_STATE_PRLI 4 107844819Smjacob#define PDB_STATE_PRLI_ACK 5 107944819Smjacob#define PDB_STATE_LOGGED_IN 6 108044819Smjacob#define PDB_STATE_PORT_UNAVAIL 7 108144819Smjacob#define PDB_STATE_PRLO 8 108244819Smjacob#define PDB_STATE_PRLO_ACK 9 108344819Smjacob#define PDB_STATE_PLOGO 10 108444819Smjacob#define PDB_STATE_PLOG_ACK 11 108544819Smjacob 108644819Smjacob#define SVC3_TGT_ROLE 0x10 108744819Smjacob#define SVC3_INI_ROLE 0x20 108844819Smjacob#define SVC3_ROLE_MASK 0x30 108948481Smjacob#define SVC3_ROLE_SHIFT 4 109044819Smjacob 1091163899Smjacob#define BITS2WORD(x) ((x)[0] << 16 | (x)[3] << 8 | (x)[2]) 1092163899Smjacob#define BITS2WORD_24XX(x) ((x)[0] << 16 | (x)[1] << 8 | (x)[2]) 1093163899Smjacob 109493837Smjacob/* 1095163899Smjacob * Port Data Base Element- 24XX cards 109693837Smjacob */ 1097163899Smjacobtypedef struct { 1098163899Smjacob uint16_t pdb_flags; 1099163899Smjacob uint8_t pdb_curstate; 1100163899Smjacob uint8_t pdb_laststate; 1101163899Smjacob uint8_t pdb_hardaddr_bits[4]; 1102163899Smjacob uint8_t pdb_portid_bits[4]; 1103163899Smjacob#define pdb_nxt_seqid_2400 pdb_portid_bits[3] 1104163899Smjacob uint16_t pdb_retry_timer; 1105163899Smjacob uint16_t pdb_handle; 1106163899Smjacob uint16_t pdb_rcv_dsize; 1107163899Smjacob uint16_t pdb_reserved0; 1108163899Smjacob uint16_t pdb_prli_svc0; 1109163899Smjacob uint16_t pdb_prli_svc3; 1110163899Smjacob uint8_t pdb_portname[8]; 1111163899Smjacob uint8_t pdb_nodename[8]; 1112163899Smjacob uint8_t pdb_reserved1[24]; 1113163899Smjacob} isp_pdb_24xx_t; 111493837Smjacob 1115163899Smjacob#define PDB2400_TID_SUPPORTED 0x4000 1116163899Smjacob#define PDB2400_FC_TAPE 0x0080 1117163899Smjacob#define PDB2400_CLASS2_ACK0 0x0040 1118163899Smjacob#define PDB2400_FCP_CONF 0x0020 1119163899Smjacob#define PDB2400_CLASS2 0x0010 1120163899Smjacob#define PDB2400_ADDR_VALID 0x0002 1121163899Smjacob 1122163899Smjacob/* 1123163899Smjacob * Common elements from the above two structures that are actually useful to us. 1124163899Smjacob */ 112548481Smjacobtypedef struct { 1126163899Smjacob uint16_t handle; 1127163899Smjacob uint16_t reserved; 1128163899Smjacob uint32_t s3_role : 8, 1129163899Smjacob portid : 24; 1130163899Smjacob uint8_t portname[8]; 1131163899Smjacob uint8_t nodename[8]; 1132163899Smjacob} isp_pdb_t; 113393837Smjacob 1134163899Smjacob/* 1135164370Smjacob * Genericized Port Login/Logout software structure 1136164370Smjacob */ 1137164370Smjacobtypedef struct { 1138164370Smjacob uint16_t handle; 1139164370Smjacob uint32_t 1140164370Smjacob flags : 8, 1141164370Smjacob portid : 24; 1142164370Smjacob} isp_plcmd_t; 1143164370Smjacob/* the flags to use are those for PLOGX_FLG_* below */ 1144164370Smjacob 1145164370Smjacob/* 1146163899Smjacob * ISP24XX- Login/Logout Port IOCB 1147163899Smjacob */ 1148163899Smjacobtypedef struct { 1149163899Smjacob isphdr_t plogx_header; 1150163899Smjacob uint32_t plogx_handle; 1151163899Smjacob uint16_t plogx_status; 1152163899Smjacob uint16_t plogx_nphdl; 1153163899Smjacob uint16_t plogx_flags; 1154163899Smjacob uint16_t plogx_vphdl; /* low 8 bits */ 1155163899Smjacob uint16_t plogx_portlo; /* low 16 bits */ 1156163899Smjacob uint16_t plogx_rspsz_porthi; 1157163899Smjacob struct { 1158163899Smjacob uint16_t lo16; 1159163899Smjacob uint16_t hi16; 1160163899Smjacob } plogx_ioparm[11]; 1161163899Smjacob} isp_plogx_t; 116293837Smjacob 1163163899Smjacob#define PLOGX_STATUS_OK 0x00 1164163899Smjacob#define PLOGX_STATUS_UNAVAIL 0x28 1165163899Smjacob#define PLOGX_STATUS_LOGOUT 0x29 1166163899Smjacob#define PLOGX_STATUS_IOCBERR 0x31 1167163899Smjacob 1168163899Smjacob#define PLOGX_IOCBERR_NOLINK 0x01 1169163899Smjacob#define PLOGX_IOCBERR_NOIOCB 0x02 1170163899Smjacob#define PLOGX_IOCBERR_NOXGHG 0x03 1171163899Smjacob#define PLOGX_IOCBERR_FAILED 0x04 /* further info in IOPARM 1 */ 1172163899Smjacob#define PLOGX_IOCBERR_NOFABRIC 0x05 1173163899Smjacob#define PLOGX_IOCBERR_NOTREADY 0x07 1174163899Smjacob#define PLOGX_IOCBERR_NOLOGIN 0x08 /* further info in IOPARM 1 */ 1175163899Smjacob#define PLOGX_IOCBERR_NOPCB 0x0a 1176163899Smjacob#define PLOGX_IOCBERR_REJECT 0x18 /* further info in IOPARM 1 */ 1177163899Smjacob#define PLOGX_IOCBERR_EINVAL 0x19 /* further info in IOPARM 1 */ 1178163899Smjacob#define PLOGX_IOCBERR_PORTUSED 0x1a /* further info in IOPARM 1 */ 1179163899Smjacob#define PLOGX_IOCBERR_HNDLUSED 0x1b /* further info in IOPARM 1 */ 1180163899Smjacob#define PLOGX_IOCBERR_NOHANDLE 0x1c 1181163899Smjacob#define PLOGX_IOCBERR_NOFLOGI 0x1f /* further info in IOPARM 1 */ 1182163899Smjacob 1183163899Smjacob#define PLOGX_FLG_CMD_MASK 0xf 1184163899Smjacob#define PLOGX_FLG_CMD_PLOGI 0 1185163899Smjacob#define PLOGX_FLG_CMD_PRLI 1 1186163899Smjacob#define PLOGX_FLG_CMD_PDISC 2 1187163899Smjacob#define PLOGX_FLG_CMD_LOGO 8 1188163899Smjacob#define PLOGX_FLG_CMD_PRLO 9 1189163899Smjacob#define PLOGX_FLG_CMD_TPRLO 10 1190163899Smjacob 1191163899Smjacob#define PLOGX_FLG_COND_PLOGI 0x10 /* if with PLOGI */ 1192163899Smjacob#define PLOGX_FLG_IMPLICIT 0x10 /* if with LOGO, PRLO, TPRLO */ 1193163899Smjacob#define PLOGX_FLG_SKIP_PRLI 0x20 /* if with PLOGI */ 1194163899Smjacob#define PLOGX_FLG_IMPLICIT_LOGO_ALL 0x20 /* if with LOGO */ 1195163899Smjacob#define PLOGX_FLG_EXPLICIT_LOGO 0x40 /* if with LOGO */ 1196163899Smjacob#define PLOGX_FLG_COMMON_FEATURES 0x80 /* if with PLOGI */ 1197163899Smjacob#define PLOGX_FLG_FREE_NPHDL 0x80 /* if with with LOGO */ 1198163899Smjacob 1199163899Smjacob#define PLOGX_FLG_CLASS2 0x100 /* if with PLOGI */ 1200163899Smjacob#define PLOGX_FLG_FCP2_OVERRIDE 0x200 /* if with PRLOG, PRLI */ 1201163899Smjacob 1202163899Smjacob/* 1203163899Smjacob * Simple Name Server Data Structures 1204163899Smjacob */ 120593837Smjacob#define SNS_GA_NXT 0x100 120693837Smjacob#define SNS_GPN_ID 0x112 120793837Smjacob#define SNS_GNN_ID 0x113 120894867Smjacob#define SNS_GFF_ID 0x11F 120993837Smjacob#define SNS_GID_FT 0x171 121093837Smjacob#define SNS_RFT_ID 0x217 121193837Smjacobtypedef struct { 1212155704Smjacob uint16_t snscb_rblen; /* response buffer length (words) */ 1213163899Smjacob uint16_t snscb_reserved0; 1214155704Smjacob uint16_t snscb_addr[4]; /* response buffer address */ 1215155704Smjacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1216163899Smjacob uint16_t snscb_reserved1; 1217155704Smjacob uint16_t snscb_data[1]; /* variable data */ 121848481Smjacob} sns_screq_t; /* Subcommand Request Structure */ 121948481Smjacob 122048481Smjacobtypedef struct { 1221155704Smjacob uint16_t snscb_rblen; /* response buffer length (words) */ 1222163899Smjacob uint16_t snscb_reserved0; 1223155704Smjacob uint16_t snscb_addr[4]; /* response buffer address */ 1224155704Smjacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1225163899Smjacob uint16_t snscb_reserved1; 1226155704Smjacob uint16_t snscb_cmd; 1227163899Smjacob uint16_t snscb_reserved2; 1228163899Smjacob uint32_t snscb_reserved3; 1229155704Smjacob uint32_t snscb_port; 123093837Smjacob} sns_ga_nxt_req_t; 123193837Smjacob#define SNS_GA_NXT_REQ_SIZE (sizeof (sns_ga_nxt_req_t)) 123293837Smjacob 123393837Smjacobtypedef struct { 1234155704Smjacob uint16_t snscb_rblen; /* response buffer length (words) */ 1235163899Smjacob uint16_t snscb_reserved0; 1236155704Smjacob uint16_t snscb_addr[4]; /* response buffer address */ 1237155704Smjacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1238163899Smjacob uint16_t snscb_reserved1; 1239155704Smjacob uint16_t snscb_cmd; 1240163899Smjacob uint16_t snscb_reserved2; 1241163899Smjacob uint32_t snscb_reserved3; 1242155704Smjacob uint32_t snscb_portid; 124393837Smjacob} sns_gxn_id_req_t; 124493837Smjacob#define SNS_GXN_ID_REQ_SIZE (sizeof (sns_gxn_id_req_t)) 124593837Smjacob 124693837Smjacobtypedef struct { 1247155704Smjacob uint16_t snscb_rblen; /* response buffer length (words) */ 1248163899Smjacob uint16_t snscb_reserved0; 1249155704Smjacob uint16_t snscb_addr[4]; /* response buffer address */ 1250155704Smjacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1251163899Smjacob uint16_t snscb_reserved1; 1252155704Smjacob uint16_t snscb_cmd; 1253155704Smjacob uint16_t snscb_mword_div_2; 1254163899Smjacob uint32_t snscb_reserved3; 1255155704Smjacob uint32_t snscb_fc4_type; 125693837Smjacob} sns_gid_ft_req_t; 125793837Smjacob#define SNS_GID_FT_REQ_SIZE (sizeof (sns_gid_ft_req_t)) 125893837Smjacob 125993837Smjacobtypedef struct { 1260155704Smjacob uint16_t snscb_rblen; /* response buffer length (words) */ 1261163899Smjacob uint16_t snscb_reserved0; 1262155704Smjacob uint16_t snscb_addr[4]; /* response buffer address */ 1263155704Smjacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1264163899Smjacob uint16_t snscb_reserved1; 1265155704Smjacob uint16_t snscb_cmd; 1266163899Smjacob uint16_t snscb_reserved2; 1267163899Smjacob uint32_t snscb_reserved3; 1268155704Smjacob uint32_t snscb_port; 1269155704Smjacob uint32_t snscb_fc4_types[8]; 127093837Smjacob} sns_rft_id_req_t; 127193837Smjacob#define SNS_RFT_ID_REQ_SIZE (sizeof (sns_rft_id_req_t)) 127293837Smjacob 127393837Smjacobtypedef struct { 127493837Smjacob ct_hdr_t snscb_cthdr; 1275155704Smjacob uint8_t snscb_port_type; 1276155704Smjacob uint8_t snscb_port_id[3]; 1277155704Smjacob uint8_t snscb_portname[8]; 1278155704Smjacob uint16_t snscb_data[1]; /* variable data */ 127948481Smjacob} sns_scrsp_t; /* Subcommand Response Structure */ 128048481Smjacob 128157587Smjacobtypedef struct { 128293837Smjacob ct_hdr_t snscb_cthdr; 1283155704Smjacob uint8_t snscb_port_type; 1284155704Smjacob uint8_t snscb_port_id[3]; 1285155704Smjacob uint8_t snscb_portname[8]; 1286155704Smjacob uint8_t snscb_pnlen; /* symbolic port name length */ 1287155704Smjacob uint8_t snscb_pname[255]; /* symbolic port name */ 1288155704Smjacob uint8_t snscb_nodename[8]; 1289155704Smjacob uint8_t snscb_nnlen; /* symbolic node name length */ 1290155704Smjacob uint8_t snscb_nname[255]; /* symbolic node name */ 1291155704Smjacob uint8_t snscb_ipassoc[8]; 1292155704Smjacob uint8_t snscb_ipaddr[16]; 1293155704Smjacob uint8_t snscb_svc_class[4]; 1294155704Smjacob uint8_t snscb_fc4_types[32]; 1295155704Smjacob uint8_t snscb_fpname[8]; 1296155704Smjacob uint8_t snscb_reserved; 1297155704Smjacob uint8_t snscb_hardaddr[3]; 129893837Smjacob} sns_ga_nxt_rsp_t; /* Subcommand Response Structure */ 129993837Smjacob#define SNS_GA_NXT_RESP_SIZE (sizeof (sns_ga_nxt_rsp_t)) 130057587Smjacob 130193837Smjacobtypedef struct { 130293837Smjacob ct_hdr_t snscb_cthdr; 1303155704Smjacob uint8_t snscb_wwn[8]; 130493837Smjacob} sns_gxn_id_rsp_t; 130593837Smjacob#define SNS_GXN_ID_RESP_SIZE (sizeof (sns_gxn_id_rsp_t)) 130693837Smjacob 130794867Smjacobtypedef struct { 130894867Smjacob ct_hdr_t snscb_cthdr; 1309155704Smjacob uint32_t snscb_fc4_features[32]; 131094867Smjacob} sns_gff_id_rsp_t; 131194867Smjacob#define SNS_GFF_ID_RESP_SIZE (sizeof (sns_gff_id_rsp_t)) 131293837Smjacob 131393837Smjacobtypedef struct { 131493837Smjacob ct_hdr_t snscb_cthdr; 131593837Smjacob struct { 1316155704Smjacob uint8_t control; 1317155704Smjacob uint8_t portid[3]; 131893837Smjacob } snscb_ports[1]; 131993837Smjacob} sns_gid_ft_rsp_t; 132093837Smjacob#define SNS_GID_FT_RESP_SIZE(x) ((sizeof (sns_gid_ft_rsp_t)) + ((x - 1) << 2)) 132193837Smjacob#define SNS_RFT_ID_RESP_SIZE (sizeof (ct_hdr_t)) 132293837Smjacob 1323163899Smjacob/* 1324163899Smjacob * Other Misc Structures 1325163899Smjacob */ 1326163899Smjacob 1327163899Smjacob/* ELS Pass Through */ 1328163899Smjacobtypedef struct { 1329163899Smjacob isphdr_t els_hdr; 1330163899Smjacob uint32_t els_handle; 1331163899Smjacob uint16_t els_status; 1332163899Smjacob uint16_t els_nphdl; 1333163899Smjacob uint16_t els_xmit_dsd_count; /* outgoing only */ 1334163899Smjacob uint8_t els_vphdl; 1335163899Smjacob uint8_t els_sof; 1336163899Smjacob uint32_t els_rxid; 1337163899Smjacob uint16_t els_recv_dsd_count; /* outgoing only */ 1338163899Smjacob uint8_t els_opcode; 1339163899Smjacob uint8_t els_reserved1; 1340163899Smjacob uint8_t els_did_lo; 1341163899Smjacob uint8_t els_did_mid; 1342163899Smjacob uint8_t els_did_hi; 1343163899Smjacob uint8_t els_reserved2; 1344163899Smjacob uint16_t els_reserved3; 1345163899Smjacob uint16_t els_ctl_flags; 1346163899Smjacob union { 1347163899Smjacob struct { 1348163899Smjacob uint32_t _els_bytecnt; 1349163899Smjacob uint32_t _els_subcode1; 1350163899Smjacob uint32_t _els_subcode2; 1351163899Smjacob uint8_t _els_reserved4[20]; 1352163899Smjacob } in; 1353163899Smjacob struct { 1354163899Smjacob uint32_t _els_recv_bytecnt; 1355163899Smjacob uint32_t _els_xmit_bytecnt; 1356163899Smjacob uint32_t _els_xmit_dsd_length; 1357163899Smjacob uint16_t _els_xmit_dsd_a1500; 1358163899Smjacob uint16_t _els_xmit_dsd_a3116; 1359163899Smjacob uint16_t _els_xmit_dsd_a4732; 1360163899Smjacob uint16_t _els_xmit_dsd_a6348; 1361163899Smjacob uint32_t _els_recv_dsd_length; 1362163899Smjacob uint16_t _els_recv_dsd_a1500; 1363163899Smjacob uint16_t _els_recv_dsd_a3116; 1364163899Smjacob uint16_t _els_recv_dsd_a4732; 1365163899Smjacob uint16_t _els_recv_dsd_a6348; 1366163899Smjacob } out; 1367163899Smjacob } inout; 1368163899Smjacob#define els_bytecnt inout.in._els_bytecnt 1369163899Smjacob#define els_subcode1 inout.in._els_subcode1 1370163899Smjacob#define els_subcode2 inout.in._els_subcode2 1371163899Smjacob#define els_reserved4 inout.in._els_reserved4 1372163899Smjacob#define els_recv_bytecnt inout.out._els_recv_bytecnt 1373163899Smjacob#define els_xmit_bytecnt inout.out._els_xmit_bytecnt 1374163899Smjacob#define els_xmit_dsd_length inout.out._els_xmit_dsd_length 1375163899Smjacob#define els_xmit_dsd_a1500 inout.out._els_xmit_dsd_a1500 1376163899Smjacob#define els_xmit_dsd_a3116 inout.out._els_xmit_dsd_a3116 1377163899Smjacob#define els_xmit_dsd_a4732 inout.out._els_xmit_dsd_a4732 1378163899Smjacob#define els_xmit_dsd_a6348 inout.out._els_xmit_dsd_a6348 1379163899Smjacob#define els_recv_dsd_length inout.out._els_recv_dsd_length 1380163899Smjacob#define els_recv_dsd_a1500 inout.out._els_recv_dsd_a1500 1381163899Smjacob#define els_recv_dsd_a3116 inout.out._els_recv_dsd_a3116 1382163899Smjacob#define els_recv_dsd_a4732 inout.out._els_recv_dsd_a4732 1383163899Smjacob#define els_recv_dsd_a6348 inout.out._els_recv_dsd_a6348 1384163899Smjacob} els_t; 1385164318Smjacob 1386164318Smjacob/* 1387164318Smjacob * A handy package structure for running FC-SCSI commands via RUN IOCB A64. 1388164318Smjacob */ 1389164318Smjacobtypedef struct { 1390164318Smjacob uint16_t handle; 1391164318Smjacob uint16_t lun; 1392164318Smjacob uint32_t portid; 1393164318Smjacob uint32_t timeout; 1394164318Smjacob union { 1395164318Smjacob struct { 1396164318Smjacob uint32_t data_length; 1397164318Smjacob uint8_t do_read; 1398164318Smjacob uint8_t pad[3]; 1399164318Smjacob uint8_t cdb[16]; 1400164318Smjacob void *data_ptr; 1401164318Smjacob } beg; 1402164318Smjacob struct { 1403164318Smjacob uint32_t data_residual; 1404164318Smjacob uint8_t status; 1405164318Smjacob uint8_t pad; 1406164318Smjacob uint16_t sense_length; 1407164318Smjacob uint8_t sense_data[32]; 1408164318Smjacob } end; 1409164318Smjacob } fcd; 1410164318Smjacob} isp_xcmd_t; 141135388Smjacob#endif /* _ISPMBOX_H */ 1412