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