ispmbox.h revision 35388
135388Smjacob/* $Id: ispmbox.h,v 1.3 1998/04/14 17:51:32 mjacob Exp $ */ 235388Smjacob/* 335388Smjacob * Mailbox and Command Definitions for for Qlogic ISP SCSI adapters. 435388Smjacob * 535388Smjacob *--------------------------------------- 635388Smjacob * Copyright (c) 1997, 1998 by Matthew Jacob 735388Smjacob * NASA/Ames Research Center 835388Smjacob * All rights reserved. 935388Smjacob *--------------------------------------- 1035388Smjacob * 1135388Smjacob * Redistribution and use in source and binary forms, with or without 1235388Smjacob * modification, are permitted provided that the following conditions 1335388Smjacob * are met: 1435388Smjacob * 1. Redistributions of source code must retain the above copyright 1535388Smjacob * notice immediately at the beginning of the file, without modification, 1635388Smjacob * this list of conditions, and the following disclaimer. 1735388Smjacob * 2. Redistributions in binary form must reproduce the above copyright 1835388Smjacob * notice, this list of conditions and the following disclaimer in the 1935388Smjacob * documentation and/or other materials provided with the distribution. 2035388Smjacob * 3. The name of the author may not be used to endorse or promote products 2135388Smjacob * derived from this software without specific prior written permission. 2235388Smjacob * 2335388Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2435388Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2535388Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2635388Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 2735388Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2835388Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2935388Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3035388Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3135388Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3235388Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3335388Smjacob * SUCH DAMAGE. 3435388Smjacob * 3535388Smjacob */ 3635388Smjacob#ifndef _ISPMBOX_H 3735388Smjacob#define _ISPMBOX_H 3835388Smjacob 3935388Smjacob/* 4035388Smjacob * Mailbox Command Opcodes 4135388Smjacob */ 4235388Smjacob 4335388Smjacob#define MBOX_NO_OP 0x0000 4435388Smjacob#define MBOX_LOAD_RAM 0x0001 4535388Smjacob#define MBOX_EXEC_FIRMWARE 0x0002 4635388Smjacob#define MBOX_DUMP_RAM 0x0003 4735388Smjacob#define MBOX_WRITE_RAM_WORD 0x0004 4835388Smjacob#define MBOX_READ_RAM_WORD 0x0005 4935388Smjacob#define MBOX_MAILBOX_REG_TEST 0x0006 5035388Smjacob#define MBOX_VERIFY_CHECKSUM 0x0007 5135388Smjacob#define MBOX_ABOUT_FIRMWARE 0x0008 5235388Smjacob /* 9 */ 5335388Smjacob /* a */ 5435388Smjacob /* b */ 5535388Smjacob /* c */ 5635388Smjacob /* d */ 5735388Smjacob#define MBOX_CHECK_FIRMWARE 0x000e 5835388Smjacob /* f */ 5935388Smjacob#define MBOX_INIT_REQ_QUEUE 0x0010 6035388Smjacob#define MBOX_INIT_RES_QUEUE 0x0011 6135388Smjacob#define MBOX_EXECUTE_IOCB 0x0012 6235388Smjacob#define MBOX_WAKE_UP 0x0013 6335388Smjacob#define MBOX_STOP_FIRMWARE 0x0014 6435388Smjacob#define MBOX_ABORT 0x0015 6535388Smjacob#define MBOX_ABORT_DEVICE 0x0016 6635388Smjacob#define MBOX_ABORT_TARGET 0x0017 6735388Smjacob#define MBOX_BUS_RESET 0x0018 6835388Smjacob#define MBOX_STOP_QUEUE 0x0019 6935388Smjacob#define MBOX_START_QUEUE 0x001a 7035388Smjacob#define MBOX_SINGLE_STEP_QUEUE 0x001b 7135388Smjacob#define MBOX_ABORT_QUEUE 0x001c 7235388Smjacob#define MBOX_GET_DEV_QUEUE_STATUS 0x001d 7335388Smjacob /* 1e */ 7435388Smjacob#define MBOX_GET_FIRMWARE_STATUS 0x001f 7535388Smjacob#define MBOX_GET_INIT_SCSI_ID 0x0020 7635388Smjacob#define MBOX_GET_SELECT_TIMEOUT 0x0021 7735388Smjacob#define MBOX_GET_RETRY_COUNT 0x0022 7835388Smjacob#define MBOX_GET_TAG_AGE_LIMIT 0x0023 7935388Smjacob#define MBOX_GET_CLOCK_RATE 0x0024 8035388Smjacob#define MBOX_GET_ACT_NEG_STATE 0x0025 8135388Smjacob#define MBOX_GET_ASYNC_DATA_SETUP_TIME 0x0026 8235388Smjacob#define MBOX_GET_SBUS_PARAMS 0x0027 8335388Smjacob#define MBOX_GET_TARGET_PARAMS 0x0028 8435388Smjacob#define MBOX_GET_DEV_QUEUE_PARAMS 0x0029 8535388Smjacob /* 2a */ 8635388Smjacob /* 2b */ 8735388Smjacob /* 2c */ 8835388Smjacob /* 2d */ 8935388Smjacob /* 2e */ 9035388Smjacob /* 2f */ 9135388Smjacob#define MBOX_SET_INIT_SCSI_ID 0x0030 9235388Smjacob#define MBOX_SET_SELECT_TIMEOUT 0x0031 9335388Smjacob#define MBOX_SET_RETRY_COUNT 0x0032 9435388Smjacob#define MBOX_SET_TAG_AGE_LIMIT 0x0033 9535388Smjacob#define MBOX_SET_CLOCK_RATE 0x0034 9635388Smjacob#define MBOX_SET_ACTIVE_NEG_STATE 0x0035 9735388Smjacob#define MBOX_SET_ASYNC_DATA_SETUP_TIME 0x0036 9835388Smjacob#define MBOX_SET_SBUS_CONTROL_PARAMS 0x0037 9935388Smjacob#define MBOX_SET_PCI_PARAMETERS 0x0037 10035388Smjacob#define MBOX_SET_TARGET_PARAMS 0x0038 10135388Smjacob#define MBOX_SET_DEV_QUEUE_PARAMS 0x0039 10235388Smjacob /* 3a */ 10335388Smjacob /* 3b */ 10435388Smjacob /* 3c */ 10535388Smjacob /* 3d */ 10635388Smjacob /* 3e */ 10735388Smjacob /* 3f */ 10835388Smjacob#define MBOX_RETURN_BIOS_BLOCK_ADDR 0x0040 10935388Smjacob#define MBOX_WRITE_FOUR_RAM_WORDS 0x0041 11035388Smjacob#define MBOX_EXEC_BIOS_IOCB 0x0042 11135388Smjacob 11235388Smjacob/* These are for the ISP2100 FC cards */ 11335388Smjacob#define MBOX_GET_LOOP_ID 0x20 11435388Smjacob#define MBOX_EXEC_COMMAND_IOCB_A64 0x54 11535388Smjacob#define MBOX_INIT_FIRMWARE 0x60 11635388Smjacob#define MBOX_GET_INIT_CONTROL_BLOCK 0x61 11735388Smjacob#define MBOX_INIT_LIP 0x62 11835388Smjacob#define MBOX_GET_FC_AL_POSITION_MAP 0x63 11935388Smjacob#define MBOX_GET_PORT_DB 0x64 12035388Smjacob#define MBOX_CLEAR_ACA 0x65 12135388Smjacob#define MBOX_TARGET_RESET 0x66 12235388Smjacob#define MBOX_CLEAR_TASK_SET 0x67 12335388Smjacob#define MBOX_ABORT_TASK_SET 0x68 12435388Smjacob#define MBOX_GET_FW_STATE 0x69 12535388Smjacob 12635388Smjacob#define ISP2100_SET_PCI_PARAM 0x00ff 12735388Smjacob 12835388Smjacob#define MBOX_BUSY 0x04 12935388Smjacob 13035388Smjacobtypedef struct { 13135388Smjacob u_int16_t param[8]; 13235388Smjacob} mbreg_t; 13335388Smjacob 13435388Smjacob/* 13535388Smjacob * Command Structure Definitions 13635388Smjacob */ 13735388Smjacob 13835388Smjacobtypedef struct { 13935388Smjacob u_int32_t ds_base; 14035388Smjacob u_int32_t ds_count; 14135388Smjacob} ispds_t; 14235388Smjacob 14335388Smjacobtypedef struct { 14435388Smjacob#if BYTE_ORDER == BIG_ENDIAN 14535388Smjacob u_int8_t rqs_entry_count; 14635388Smjacob u_int8_t rqs_entry_type; 14735388Smjacob u_int8_t rqs_flags; 14835388Smjacob u_int8_t rqs_seqno; 14935388Smjacob#else 15035388Smjacob u_int8_t rqs_entry_type; 15135388Smjacob u_int8_t rqs_entry_count; 15235388Smjacob u_int8_t rqs_seqno; 15335388Smjacob u_int8_t rqs_flags; 15435388Smjacob#endif 15535388Smjacob} isphdr_t; 15635388Smjacob 15735388Smjacob/* RQS Flag definitions */ 15835388Smjacob#define RQSFLAG_CONTINUATION 0x01 15935388Smjacob#define RQSFLAG_FULL 0x02 16035388Smjacob#define RQSFLAG_BADHEADER 0x04 16135388Smjacob#define RQSFLAG_BADPACKET 0x08 16235388Smjacob 16335388Smjacob/* RQS entry_type definitions */ 16435388Smjacob#define RQSTYPE_REQUEST 1 16535388Smjacob#define RQSTYPE_DATASEG 2 16635388Smjacob#define RQSTYPE_RESPONSE 3 16735388Smjacob#define RQSTYPE_MARKER 4 16835388Smjacob#define RQSTYPE_CMDONLY 5 16935388Smjacob#define RQSTYPE_T2RQS 17 17035388Smjacob#define RQSTYPE_T3RQS 25 17135388Smjacob#define RQSTYPE_T1DSEG 10 17235388Smjacob 17335388Smjacob 17435388Smjacob#define ISP_RQDSEG 4 17535388Smjacobtypedef struct { 17635388Smjacob isphdr_t req_header; 17735388Smjacob u_int32_t req_handle; 17835388Smjacob#if BYTE_ORDER == BIG_ENDIAN 17935388Smjacob u_int8_t req_target; 18035388Smjacob u_int8_t req_lun_trn; 18135388Smjacob#else 18235388Smjacob u_int8_t req_lun_trn; 18335388Smjacob u_int8_t req_target; 18435388Smjacob#endif 18535388Smjacob u_int16_t req_cdblen; 18635388Smjacob#define req_modifier req_cdblen /* marker packet */ 18735388Smjacob u_int16_t req_flags; 18835388Smjacob u_int16_t _res1; 18935388Smjacob u_int16_t req_time; 19035388Smjacob u_int16_t req_seg_count; 19135388Smjacob u_int8_t req_cdb[12]; 19235388Smjacob ispds_t req_dataseg[ISP_RQDSEG]; 19335388Smjacob} ispreq_t; 19435388Smjacob 19535388Smjacob#define ISP_RQDSEG_T2 3 19635388Smjacobtypedef struct { 19735388Smjacob isphdr_t req_header; 19835388Smjacob u_int32_t req_handle; 19935388Smjacob#if BYTE_ORDER == BIG_ENDIAN 20035388Smjacob u_int8_t req_target; 20135388Smjacob u_int8_t req_lun_trn; 20235388Smjacob#else 20335388Smjacob u_int8_t req_lun_trn; 20435388Smjacob u_int8_t req_target; 20535388Smjacob#endif 20635388Smjacob u_int16_t _res1; 20735388Smjacob u_int16_t req_flags; 20835388Smjacob u_int16_t _res2; 20935388Smjacob u_int16_t req_time; 21035388Smjacob u_int16_t req_seg_count; 21135388Smjacob u_int32_t req_cdb[4]; 21235388Smjacob u_int32_t req_totalcnt; 21335388Smjacob ispds_t req_dataseg[ISP_RQDSEG_T2]; 21435388Smjacob} ispreqt2_t; 21535388Smjacob 21635388Smjacob/* req_flag values */ 21735388Smjacob#define REQFLAG_NODISCON 0x0001 21835388Smjacob#define REQFLAG_HTAG 0x0002 21935388Smjacob#define REQFLAG_OTAG 0x0004 22035388Smjacob#define REQFLAG_STAG 0x0008 22135388Smjacob#define REQFLAG_TARGET_RTN 0x0010 22235388Smjacob 22335388Smjacob#define REQFLAG_NODATA 0x0000 22435388Smjacob#define REQFLAG_DATA_IN 0x0020 22535388Smjacob#define REQFLAG_DATA_OUT 0x0040 22635388Smjacob#define REQFLAG_DATA_UNKNOWN 0x0060 22735388Smjacob 22835388Smjacob#define REQFLAG_DISARQ 0x0100 22935388Smjacob 23035388Smjacobtypedef struct { 23135388Smjacob isphdr_t req_header; 23235388Smjacob u_int32_t req_handle; 23335388Smjacob#if BYTE_ORDER == BIG_ENDIAN 23435388Smjacob u_int8_t req_target; 23535388Smjacob u_int8_t req_lun_trn; 23635388Smjacob#else 23735388Smjacob u_int8_t req_lun_trn; 23835388Smjacob u_int8_t req_target; 23935388Smjacob#endif 24035388Smjacob u_int16_t req_cdblen; 24135388Smjacob u_int16_t req_flags; 24235388Smjacob u_int16_t _res1; 24335388Smjacob u_int16_t req_time; 24435388Smjacob u_int16_t req_seg_count; 24535388Smjacob u_int8_t req_cdb[44]; 24635388Smjacob} ispextreq_t; 24735388Smjacob 24835388Smjacob#define ISP_CDSEG 7 24935388Smjacobtypedef struct { 25035388Smjacob isphdr_t req_header; 25135388Smjacob u_int32_t _res1; 25235388Smjacob ispds_t req_dataseg[ISP_CDSEG]; 25335388Smjacob} ispcontreq_t; 25435388Smjacob 25535388Smjacobtypedef struct { 25635388Smjacob isphdr_t req_header; 25735388Smjacob u_int32_t _res1; 25835388Smjacob#if BYTE_ORDER == BIG_ENDIAN 25935388Smjacob u_int8_t req_target; 26035388Smjacob u_int8_t req_lun_trn; 26135388Smjacob u_int8_t _res2; 26235388Smjacob u_int8_t req_modifier; 26335388Smjacob#else 26435388Smjacob u_int8_t req_lun_trn; 26535388Smjacob u_int8_t req_target; 26635388Smjacob u_int8_t req_modifier; 26735388Smjacob u_int8_t _res2; 26835388Smjacob#endif 26935388Smjacob} ispmarkreq_t; 27035388Smjacob 27135388Smjacob#define SYNC_DEVICE 0 27235388Smjacob#define SYNC_TARGET 1 27335388Smjacob#define SYNC_ALL 2 27435388Smjacob 27535388Smjacobtypedef struct { 27635388Smjacob isphdr_t req_header; 27735388Smjacob u_int32_t req_handle; 27835388Smjacob u_int16_t req_scsi_status; 27935388Smjacob u_int16_t req_completion_status; 28035388Smjacob u_int16_t req_state_flags; 28135388Smjacob u_int16_t req_status_flags; 28235388Smjacob u_int16_t req_time; 28335388Smjacob u_int16_t req_sense_len; 28435388Smjacob u_int32_t req_resid; 28535388Smjacob u_int8_t _res1[8]; 28635388Smjacob u_int8_t req_sense_data[32]; 28735388Smjacob} ispstatusreq_t; 28835388Smjacob 28935388Smjacob/* 29035388Smjacob * For Qlogic 2100, the high order byte of SCSI status has 29135388Smjacob * additional meaning. 29235388Smjacob */ 29335388Smjacob#define RQCS_RU 0x800 /* Residual Under */ 29435388Smjacob#define RQCS_RO 0x400 /* Residual Over */ 29535388Smjacob#define RQCS_SV 0x200 /* Sense Length Valid */ 29635388Smjacob#define RQCS_RV 0x100 /* Residual Valid */ 29735388Smjacob 29835388Smjacob/* 29935388Smjacob * Completion Status Codes. 30035388Smjacob */ 30135388Smjacob#define RQCS_COMPLETE 0x0000 30235388Smjacob#define RQCS_INCOMPLETE 0x0001 30335388Smjacob#define RQCS_DMA_ERROR 0x0002 30435388Smjacob#define RQCS_TRANSPORT_ERROR 0x0003 30535388Smjacob#define RQCS_RESET_OCCURRED 0x0004 30635388Smjacob#define RQCS_ABORTED 0x0005 30735388Smjacob#define RQCS_TIMEOUT 0x0006 30835388Smjacob#define RQCS_DATA_OVERRUN 0x0007 30935388Smjacob#define RQCS_COMMAND_OVERRUN 0x0008 31035388Smjacob#define RQCS_STATUS_OVERRUN 0x0009 31135388Smjacob#define RQCS_BAD_MESSAGE 0x000a 31235388Smjacob#define RQCS_NO_MESSAGE_OUT 0x000b 31335388Smjacob#define RQCS_EXT_ID_FAILED 0x000c 31435388Smjacob#define RQCS_IDE_MSG_FAILED 0x000d 31535388Smjacob#define RQCS_ABORT_MSG_FAILED 0x000e 31635388Smjacob#define RQCS_REJECT_MSG_FAILED 0x000f 31735388Smjacob#define RQCS_NOP_MSG_FAILED 0x0010 31835388Smjacob#define RQCS_PARITY_ERROR_MSG_FAILED 0x0011 31935388Smjacob#define RQCS_DEVICE_RESET_MSG_FAILED 0x0012 32035388Smjacob#define RQCS_ID_MSG_FAILED 0x0013 32135388Smjacob#define RQCS_UNEXP_BUS_FREE 0x0014 32235388Smjacob#define RQCS_DATA_UNDERRUN 0x0015 32335388Smjacob/* 2100 Only Completion Codes */ 32435388Smjacob#define RQCS_PORT_UNAVAILABLE 0x0028 32535388Smjacob#define RQCS_PORT_LOGGED_OUT 0x0029 32635388Smjacob#define RQCS_PORT_CHANGED 0x002A 32735388Smjacob#define RQCS_PORT_BUSY 0x002B 32835388Smjacob 32935388Smjacob/* 33035388Smjacob * State Flags (not applicable to 2100) 33135388Smjacob */ 33235388Smjacob#define RQSF_GOT_BUS 0x0100 33335388Smjacob#define RQSF_GOT_TARGET 0x0200 33435388Smjacob#define RQSF_SENT_CDB 0x0400 33535388Smjacob#define RQSF_XFRD_DATA 0x0800 33635388Smjacob#define RQSF_GOT_STATUS 0x1000 33735388Smjacob#define RQSF_GOT_SENSE 0x2000 33835388Smjacob#define RQSF_XFER_COMPLETE 0x4000 33935388Smjacob 34035388Smjacob/* 34135388Smjacob * Status Flags (not applicable to 2100) 34235388Smjacob */ 34335388Smjacob#define RQSTF_DISCONNECT 0x0001 34435388Smjacob#define RQSTF_SYNCHRONOUS 0x0002 34535388Smjacob#define RQSTF_PARITY_ERROR 0x0004 34635388Smjacob#define RQSTF_BUS_RESET 0x0008 34735388Smjacob#define RQSTF_DEVICE_RESET 0x0010 34835388Smjacob#define RQSTF_ABORTED 0x0020 34935388Smjacob#define RQSTF_TIMEOUT 0x0040 35035388Smjacob#define RQSTF_NEGOTIATION 0x0080 35135388Smjacob 35235388Smjacob/* 35335388Smjacob * FC (ISP2100) specific data structures 35435388Smjacob */ 35535388Smjacob 35635388Smjacob/* 35735388Smjacob * Initialization Control Block 35835388Smjacob */ 35935388Smjacobtypedef struct { 36035388Smjacob#if BYTE_ORDER == BIG_ENDIAN 36135388Smjacob u_int8_t _reserved0; 36235388Smjacob u_int8_t icb_version; 36335388Smjacob#else 36435388Smjacob u_int8_t icb_version; 36535388Smjacob u_int8_t _reserved0; 36635388Smjacob#endif 36735388Smjacob u_int16_t icb_fwoptions; 36835388Smjacob u_int16_t icb_maxfrmlen; 36935388Smjacob u_int16_t icb_maxalloc; 37035388Smjacob u_int16_t icb_execthrottle; 37135388Smjacob#if BYTE_ORDER == BIG_ENDIAN 37235388Smjacob u_int8_t icb_retry_delay; 37335388Smjacob u_int8_t icb_retry_count; 37435388Smjacob#else 37535388Smjacob u_int8_t icb_retry_count; 37635388Smjacob u_int8_t icb_retry_delay; 37735388Smjacob#endif 37835388Smjacob u_int16_t icb_nodename[4]; 37935388Smjacob u_int16_t icb_hardaddr; 38035388Smjacob u_int16_t _reserved1[5]; 38135388Smjacob u_int16_t icb_rqstout; 38235388Smjacob u_int16_t icb_rspnsin; 38335388Smjacob u_int16_t icb_rqstqlen; 38435388Smjacob u_int16_t icb_rsltqlen; 38535388Smjacob u_int16_t icb_rqstaddr[4]; 38635388Smjacob u_int16_t icb_respaddr[4]; 38735388Smjacob} isp_icb_t; 38835388Smjacob 38935388Smjacob#define ICB_DFLT_FRMLEN 1024 39035388Smjacob#define MAKE_NODE_NAME(isp, icbp) \ 39135388Smjacob (icbp)->icb_nodename[0] = 0, (icbp)->icb_nodename[1] = 0x5355,\ 39235388Smjacob (icbp)->icb_nodename[2] = 0x4E57, (icbp)->icb_nodename[3] = 0 39335388Smjacob 39435388Smjacob#endif /* _ISPMBOX_H */ 395