ispmbox.h revision 93837
150477Speter/* $FreeBSD: head/sys/dev/isp/ispmbox.h 93837 2002-04-04 23:46:01Z mjacob $ */
235388Smjacob/*
339235Sgibbs * Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
435388Smjacob *
566189Smjacob * Copyright (c) 1997, 1998, 1999, 2000 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
4535388Smjacob					/*   9 */
4635388Smjacob					/*   a */
4735388Smjacob					/*   b */
4835388Smjacob					/*   c */
4935388Smjacob					/*   d */
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
11284241Smjacob#define	MBOX_ENABLE_TARGET_MODE		0x0055
11355363Smjacob#define		ENABLE_TARGET_FLAG	0x8000
11475194Smjacob#define		ENABLE_TQING_FLAG	0x0004
11575194Smjacob#define		ENABLE_MANDATORY_DISC	0x0002
11684241Smjacob#define	MBOX_GET_TARGET_STATUS		0x0056
11755138Smjacob
11884241Smjacob/* These are for the ISP2X00 FC cards */
11984241Smjacob#define	MBOX_GET_LOOP_ID		0x0020
12084241Smjacob#define	MBOX_GET_FIRMWARE_OPTIONS	0x0028
12184241Smjacob#define	MBOX_SET_FIRMWARE_OPTIONS	0x0038
12284241Smjacob#define	MBOX_GET_RESOURCE_COUNT		0x0042
12384241Smjacob#define	MBOX_ENHANCED_GET_PDB		0x0047
12484241Smjacob#define	MBOX_EXEC_COMMAND_IOCB_A64	0x0054
12584241Smjacob#define	MBOX_INIT_FIRMWARE		0x0060
12684241Smjacob#define	MBOX_GET_INIT_CONTROL_BLOCK	0x0061
12784241Smjacob#define	MBOX_INIT_LIP			0x0062
12884241Smjacob#define	MBOX_GET_FC_AL_POSITION_MAP	0x0063
12984241Smjacob#define	MBOX_GET_PORT_DB		0x0064
13084241Smjacob#define	MBOX_CLEAR_ACA			0x0065
13184241Smjacob#define	MBOX_TARGET_RESET		0x0066
13284241Smjacob#define	MBOX_CLEAR_TASK_SET		0x0067
13384241Smjacob#define	MBOX_ABORT_TASK_SET		0x0068
13484241Smjacob#define	MBOX_GET_FW_STATE		0x0069
13584241Smjacob#define	MBOX_GET_PORT_NAME		0x006A
13684241Smjacob#define	MBOX_GET_LINK_STATUS		0x006B
13784241Smjacob#define	MBOX_INIT_LIP_RESET		0x006C
13884241Smjacob#define	MBOX_SEND_SNS			0x006E
13984241Smjacob#define	MBOX_FABRIC_LOGIN		0x006F
14084241Smjacob#define	MBOX_SEND_CHANGE_REQUEST	0x0070
14184241Smjacob#define	MBOX_FABRIC_LOGOUT		0x0071
14284241Smjacob#define	MBOX_INIT_LIP_LOGIN		0x0072
14335388Smjacob
14484241Smjacob#define	MBOX_GET_SET_DATA_RATE		0x005D	/* 23XX only */
14584241Smjacob#define		MBGSD_GET_RATE	0
14684241Smjacob#define		MBGSD_SET_RATE	1
14784241Smjacob#define		MBGSD_ONEGB	0
14884241Smjacob#define		MBGSD_TWOGB	1
14984241Smjacob#define		MBGSD_AUTO	2
15084241Smjacob
15184241Smjacob
15235388Smjacob#define	ISP2100_SET_PCI_PARAM		0x00ff
15335388Smjacob
15435388Smjacob#define	MBOX_BUSY			0x04
15535388Smjacob
15635388Smjacobtypedef struct {
15735388Smjacob	u_int16_t param[8];
15835388Smjacob} mbreg_t;
15935388Smjacob
16035388Smjacob/*
16139235Sgibbs * Mailbox Command Complete Status Codes
16239235Sgibbs */
16339235Sgibbs#define	MBOX_COMMAND_COMPLETE		0x4000
16439235Sgibbs#define	MBOX_INVALID_COMMAND		0x4001
16539235Sgibbs#define	MBOX_HOST_INTERFACE_ERROR	0x4002
16639235Sgibbs#define	MBOX_TEST_FAILED		0x4003
16739235Sgibbs#define	MBOX_COMMAND_ERROR		0x4005
16839235Sgibbs#define	MBOX_COMMAND_PARAM_ERROR	0x4006
16957587Smjacob#define	MBOX_PORT_ID_USED		0x4007
17057587Smjacob#define	MBOX_LOOP_ID_USED		0x4008
17157587Smjacob#define	MBOX_ALL_IDS_USED		0x4009
17257587Smjacob#define	MBOX_NOT_LOGGED_IN		0x400A
17364096Smjacob#define	MBLOGALL			0x000f
17464096Smjacob#define	MBLOGNONE			0x0000
17564096Smjacob#define	MBLOGMASK(x)			((x) & 0xf)
17639235Sgibbs
17739235Sgibbs/*
17839235Sgibbs * Asynchronous event status codes
17939235Sgibbs */
18039235Sgibbs#define	ASYNC_BUS_RESET			0x8001
18139235Sgibbs#define	ASYNC_SYSTEM_ERROR		0x8002
18239235Sgibbs#define	ASYNC_RQS_XFER_ERR		0x8003
18339235Sgibbs#define	ASYNC_RSP_XFER_ERR		0x8004
18439235Sgibbs#define	ASYNC_QWAKEUP			0x8005
18539235Sgibbs#define	ASYNC_TIMEOUT_RESET		0x8006
18641520Smjacob#define	ASYNC_DEVICE_RESET		0x8007
18739235Sgibbs#define	ASYNC_EXTMSG_UNDERRUN		0x800A
18839235Sgibbs#define	ASYNC_SCAM_INT			0x800B
18939235Sgibbs#define	ASYNC_HUNG_SCSI			0x800C
19039235Sgibbs#define	ASYNC_KILLED_BUS		0x800D
19139235Sgibbs#define	ASYNC_BUS_TRANSIT		0x800E	/* LVD -> HVD, eg. */
19239235Sgibbs#define	ASYNC_LIP_OCCURRED		0x8010
19339235Sgibbs#define	ASYNC_LOOP_UP			0x8011
19439235Sgibbs#define	ASYNC_LOOP_DOWN			0x8012
19539235Sgibbs#define	ASYNC_LOOP_RESET		0x8013
19641520Smjacob#define	ASYNC_PDB_CHANGED		0x8014
19739235Sgibbs#define	ASYNC_CHANGE_NOTIFY		0x8015
19881792Smjacob#define	ASYNC_LIP_F8			0x8016
19979237Smjacob#define	ASYNC_CMD_CMPLT			0x8020
20079237Smjacob#define	ASYNC_CTIO_DONE			0x8021
20179237Smjacob#define	ASYNC_IP_XMIT_DONE		0x8022
20279237Smjacob#define	ASYNC_IP_RECV_DONE		0x8023
20379237Smjacob#define	ASYNC_IP_BROADCAST		0x8024
20479237Smjacob#define	ASYNC_IP_RCVQ_LOW		0x8025
20579237Smjacob#define	ASYNC_IP_RCVQ_EMPTY		0x8026
20679237Smjacob#define	ASYNC_IP_RECV_DONE_ALIGNED	0x8027
20757149Smjacob#define	ASYNC_PTPMODE			0x8030
20879237Smjacob#define	ASYNC_RIO1			0x8031
20979237Smjacob#define	ASYNC_RIO2			0x8032
21079237Smjacob#define	ASYNC_RIO3			0x8033
21179237Smjacob#define	ASYNC_RIO4			0x8034
21279237Smjacob#define	ASYNC_RIO5			0x8035
21357149Smjacob#define	ASYNC_CONNMODE			0x8036
21457149Smjacob#define		ISP_CONN_LOOP		1
21557149Smjacob#define		ISP_CONN_PTP		2
21657149Smjacob#define		ISP_CONN_BADLIP		3
21757149Smjacob#define		ISP_CONN_FATAL		4
21857149Smjacob#define		ISP_CONN_LOOPBACK	5
21979237Smjacob#define	ASYNC_RIO_RESP			0x8040
22079237Smjacob#define	ASYNC_RIO_COMP			0x8042
22179237Smjacob/*
22279237Smjacob * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options
22379237Smjacob * mailbox command to enable this.
22479237Smjacob */
22579237Smjacob#define	ASYNC_QFULL_SENT		0x8049
22657149Smjacob
22739235Sgibbs/*
22879237Smjacob * Mailbox Usages
22979237Smjacob */
23079237Smjacob
23179237Smjacob#define	WRITE_REQUEST_QUEUE_IN_POINTER(isp, value)	\
23282689Smjacob	ISP_WRITE(isp, isp->isp_rqstinrp, value)
23379237Smjacob
23482689Smjacob#define	READ_REQUEST_QUEUE_OUT_POINTER(isp)		\
23582689Smjacob	ISP_READ(isp, isp->isp_rqstoutrp)
23679237Smjacob
23782689Smjacob#define	READ_RESPONSE_QUEUE_IN_POINTER(isp)		\
23882689Smjacob	ISP_READ(isp, isp->isp_respinrp)
23979237Smjacob
24082689Smjacob#define	WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, value)	\
24182689Smjacob	ISP_WRITE(isp, isp->isp_respoutrp, value)
24279237Smjacob
24379237Smjacob/*
24435388Smjacob * Command Structure Definitions
24535388Smjacob */
24635388Smjacob
24735388Smjacobtypedef struct {
24835388Smjacob	u_int32_t	ds_base;
24935388Smjacob	u_int32_t	ds_count;
25035388Smjacob} ispds_t;
25135388Smjacob
25279237Smjacobtypedef struct {
25382689Smjacob	u_int32_t	ds_base;
25482689Smjacob	u_int32_t	ds_basehi;
25579237Smjacob	u_int32_t	ds_count;
25679237Smjacob} ispds64_t;
25779237Smjacob
25887635Smjacob#define	DSTYPE_32BIT	0
25987635Smjacob#define	DSTYPE_64BIT	1
26079237Smjacobtypedef struct {
26179237Smjacob	u_int16_t	ds_type;	/* 0-> ispds_t, 1-> ispds64_t */
26279237Smjacob	u_int32_t	ds_segment;	/* unused */
26379237Smjacob	u_int32_t	ds_base;	/* 32 bit address of DSD list */
26479237Smjacob} ispdslist_t;
26579237Smjacob
26679237Smjacob
26779237Smjacob/*
26879237Smjacob * These elements get swizzled around for SBus instances.
26979237Smjacob */
27087635Smjacob#define	ISP_SWAP8(a, b)	{		\
27145283Smjacob	u_int8_t tmp;			\
27245283Smjacob	tmp = a;			\
27345283Smjacob	a = b;				\
27445283Smjacob	b = tmp;			\
27545283Smjacob}
27635388Smjacobtypedef struct {
27735388Smjacob	u_int8_t	rqs_entry_type;
27835388Smjacob	u_int8_t	rqs_entry_count;
27935388Smjacob	u_int8_t	rqs_seqno;
28035388Smjacob	u_int8_t	rqs_flags;
28145283Smjacob} isphdr_t;
28235388Smjacob
28335388Smjacob/* RQS Flag definitions */
28435388Smjacob#define	RQSFLAG_CONTINUATION	0x01
28535388Smjacob#define	RQSFLAG_FULL		0x02
28635388Smjacob#define	RQSFLAG_BADHEADER	0x04
28735388Smjacob#define	RQSFLAG_BADPACKET	0x08
28835388Smjacob
28935388Smjacob/* RQS entry_type definitions */
29039235Sgibbs#define	RQSTYPE_REQUEST		0x01
29139235Sgibbs#define	RQSTYPE_DATASEG		0x02
29239235Sgibbs#define	RQSTYPE_RESPONSE	0x03
29339235Sgibbs#define	RQSTYPE_MARKER		0x04
29439235Sgibbs#define	RQSTYPE_CMDONLY		0x05
29539235Sgibbs#define	RQSTYPE_ATIO		0x06	/* Target Mode */
29655363Smjacob#define	RQSTYPE_CTIO		0x07	/* Target Mode */
29739235Sgibbs#define	RQSTYPE_SCAM		0x08
29839235Sgibbs#define	RQSTYPE_A64		0x09
29939235Sgibbs#define	RQSTYPE_A64_CONT	0x0a
30039235Sgibbs#define	RQSTYPE_ENABLE_LUN	0x0b	/* Target Mode */
30139235Sgibbs#define	RQSTYPE_MODIFY_LUN	0x0c	/* Target Mode */
30239235Sgibbs#define	RQSTYPE_NOTIFY		0x0d	/* Target Mode */
30339235Sgibbs#define	RQSTYPE_NOTIFY_ACK	0x0e	/* Target Mode */
30439235Sgibbs#define	RQSTYPE_CTIO1		0x0f	/* Target Mode */
30539235Sgibbs#define	RQSTYPE_STATUS_CONT	0x10
30639235Sgibbs#define	RQSTYPE_T2RQS		0x11
30779237Smjacob#define	RQSTYPE_IP_XMIT		0x13
30839235Sgibbs#define	RQSTYPE_T4RQS		0x15
30979237Smjacob#define	RQSTYPE_ATIO2		0x16	/* Target Mode */
31079237Smjacob#define	RQSTYPE_CTIO2		0x17	/* Target Mode */
31139235Sgibbs#define	RQSTYPE_CSET0		0x18
31239235Sgibbs#define	RQSTYPE_T3RQS		0x19
31379237Smjacob#define	RQSTYPE_IP_XMIT_64	0x1b
31479237Smjacob#define	RQSTYPE_CTIO4		0x1e	/* Target Mode */
31579237Smjacob#define	RQSTYPE_CTIO3		0x1f	/* Target Mode */
31679237Smjacob#define	RQSTYPE_RIO1		0x21
31779237Smjacob#define	RQSTYPE_RIO2		0x22
31879237Smjacob#define	RQSTYPE_IP_RECV		0x23
31979237Smjacob#define	RQSTYPE_IP_RECV_CONT	0x24
32035388Smjacob
32139235Sgibbs
32235388Smjacob#define	ISP_RQDSEG	4
32335388Smjacobtypedef struct {
32435388Smjacob	isphdr_t	req_header;
32535388Smjacob	u_int32_t	req_handle;
32635388Smjacob	u_int8_t	req_lun_trn;
32735388Smjacob	u_int8_t	req_target;
32835388Smjacob	u_int16_t	req_cdblen;
32935388Smjacob#define	req_modifier	req_cdblen	/* marker packet */
33035388Smjacob	u_int16_t	req_flags;
33141520Smjacob	u_int16_t	req_reserved;
33235388Smjacob	u_int16_t	req_time;
33335388Smjacob	u_int16_t	req_seg_count;
33435388Smjacob	u_int8_t	req_cdb[12];
33535388Smjacob	ispds_t		req_dataseg[ISP_RQDSEG];
33635388Smjacob} ispreq_t;
33735388Smjacob
33845283Smjacob/*
33945283Smjacob * A request packet can also be a marker packet.
34045283Smjacob */
34145283Smjacob#define SYNC_DEVICE	0
34245283Smjacob#define SYNC_TARGET	1
34345283Smjacob#define SYNC_ALL	2
34445283Smjacob
34582689Smjacob#define	ISP_RQDSEG_T2		3
34635388Smjacobtypedef struct {
34735388Smjacob	isphdr_t	req_header;
34835388Smjacob	u_int32_t	req_handle;
34935388Smjacob	u_int8_t	req_lun_trn;
35035388Smjacob	u_int8_t	req_target;
35141520Smjacob	u_int16_t	req_scclun;
35235388Smjacob	u_int16_t	req_flags;
35335388Smjacob	u_int16_t	_res2;
35435388Smjacob	u_int16_t	req_time;
35535388Smjacob	u_int16_t	req_seg_count;
35687635Smjacob	u_int8_t	req_cdb[16];
35735388Smjacob	u_int32_t	req_totalcnt;
35835388Smjacob	ispds_t		req_dataseg[ISP_RQDSEG_T2];
35935388Smjacob} ispreqt2_t;
36035388Smjacob
36182689Smjacob#define	ISP_RQDSEG_T3		2
36282689Smjacobtypedef struct {
36382689Smjacob	isphdr_t	req_header;
36482689Smjacob	u_int32_t	req_handle;
36582689Smjacob	u_int8_t	req_lun_trn;
36682689Smjacob	u_int8_t	req_target;
36782689Smjacob	u_int16_t	req_scclun;
36882689Smjacob	u_int16_t	req_flags;
36982689Smjacob	u_int16_t	_res2;
37082689Smjacob	u_int16_t	req_time;
37182689Smjacob	u_int16_t	req_seg_count;
37287635Smjacob	u_int8_t	req_cdb[16];
37382689Smjacob	u_int32_t	req_totalcnt;
37482689Smjacob	ispds64_t	req_dataseg[ISP_RQDSEG_T3];
37582689Smjacob} ispreqt3_t;
37682689Smjacob
37735388Smjacob/* req_flag values */
37835388Smjacob#define	REQFLAG_NODISCON	0x0001
37935388Smjacob#define	REQFLAG_HTAG		0x0002
38035388Smjacob#define	REQFLAG_OTAG		0x0004
38135388Smjacob#define	REQFLAG_STAG		0x0008
38235388Smjacob#define	REQFLAG_TARGET_RTN	0x0010
38335388Smjacob
38435388Smjacob#define	REQFLAG_NODATA		0x0000
38535388Smjacob#define	REQFLAG_DATA_IN		0x0020
38635388Smjacob#define	REQFLAG_DATA_OUT	0x0040
38735388Smjacob#define	REQFLAG_DATA_UNKNOWN	0x0060
38835388Smjacob
38935388Smjacob#define	REQFLAG_DISARQ		0x0100
39039235Sgibbs#define	REQFLAG_FRC_ASYNC	0x0200
39139235Sgibbs#define	REQFLAG_FRC_SYNC	0x0400
39239235Sgibbs#define	REQFLAG_FRC_WIDE	0x0800
39339235Sgibbs#define	REQFLAG_NOPARITY	0x1000
39439235Sgibbs#define	REQFLAG_STOPQ		0x2000
39539235Sgibbs#define	REQFLAG_XTRASNS		0x4000
39639235Sgibbs#define	REQFLAG_PRIORITY	0x8000
39735388Smjacob
39835388Smjacobtypedef struct {
39935388Smjacob	isphdr_t	req_header;
40035388Smjacob	u_int32_t	req_handle;
40135388Smjacob	u_int8_t	req_lun_trn;
40235388Smjacob	u_int8_t	req_target;
40335388Smjacob	u_int16_t	req_cdblen;
40435388Smjacob	u_int16_t	req_flags;
40535388Smjacob	u_int16_t	_res1;
40635388Smjacob	u_int16_t	req_time;
40735388Smjacob	u_int16_t	req_seg_count;
40835388Smjacob	u_int8_t	req_cdb[44];
40935388Smjacob} ispextreq_t;
41035388Smjacob
41135388Smjacob#define	ISP_CDSEG	7
41235388Smjacobtypedef struct {
41335388Smjacob	isphdr_t	req_header;
41435388Smjacob	u_int32_t	_res1;
41535388Smjacob	ispds_t		req_dataseg[ISP_CDSEG];
41635388Smjacob} ispcontreq_t;
41735388Smjacob
41882689Smjacob#define	ISP_CDSEG64	5
41935388Smjacobtypedef struct {
42035388Smjacob	isphdr_t	req_header;
42182689Smjacob	ispds64_t	req_dataseg[ISP_CDSEG64];
42282689Smjacob} ispcontreq64_t;
42382689Smjacob
42482689Smjacobtypedef struct {
42582689Smjacob	isphdr_t	req_header;
42635388Smjacob	u_int32_t	req_handle;
42735388Smjacob	u_int16_t	req_scsi_status;
42835388Smjacob	u_int16_t	req_completion_status;
42935388Smjacob	u_int16_t	req_state_flags;
43035388Smjacob	u_int16_t	req_status_flags;
43135388Smjacob	u_int16_t	req_time;
43255384Smjacob#define	req_response_len	req_time	/* FC only */
43335388Smjacob	u_int16_t	req_sense_len;
43435388Smjacob	u_int32_t	req_resid;
43565140Smjacob	u_int8_t	req_response[8];	/* FC only */
43635388Smjacob	u_int8_t	req_sense_data[32];
43735388Smjacob} ispstatusreq_t;
43835388Smjacob
43987635Smjacobtypedef struct {
44087635Smjacob	isphdr_t	req_header;
44187635Smjacob	u_int8_t	req_sense_data[60];
44287635Smjacob} ispstatus_cont_t;
44387635Smjacob
44435388Smjacob/*
44570824Smjacob * For Qlogic 2X00, the high order byte of SCSI status has
44635388Smjacob * additional meaning.
44735388Smjacob */
44835388Smjacob#define	RQCS_RU	0x800	/* Residual Under */
44935388Smjacob#define	RQCS_RO	0x400	/* Residual Over */
45065140Smjacob#define	RQCS_RESID	(RQCS_RU|RQCS_RO)
45135388Smjacob#define	RQCS_SV	0x200	/* Sense Length Valid */
45265140Smjacob#define	RQCS_RV	0x100	/* FCP Response Length Valid */
45335388Smjacob
45435388Smjacob/*
45535388Smjacob * Completion Status Codes.
45635388Smjacob */
45735388Smjacob#define RQCS_COMPLETE			0x0000
45835388Smjacob#define RQCS_DMA_ERROR			0x0002
45935388Smjacob#define RQCS_RESET_OCCURRED		0x0004
46035388Smjacob#define RQCS_ABORTED			0x0005
46135388Smjacob#define RQCS_TIMEOUT			0x0006
46235388Smjacob#define RQCS_DATA_OVERRUN		0x0007
46365140Smjacob#define RQCS_DATA_UNDERRUN		0x0015
46465140Smjacob#define	RQCS_QUEUE_FULL			0x001C
46565140Smjacob
46665140Smjacob/* 1X00 Only Completion Codes */
46765140Smjacob#define RQCS_INCOMPLETE			0x0001
46865140Smjacob#define RQCS_TRANSPORT_ERROR		0x0003
46935388Smjacob#define RQCS_COMMAND_OVERRUN		0x0008
47035388Smjacob#define RQCS_STATUS_OVERRUN		0x0009
47135388Smjacob#define RQCS_BAD_MESSAGE		0x000a
47235388Smjacob#define RQCS_NO_MESSAGE_OUT		0x000b
47335388Smjacob#define RQCS_EXT_ID_FAILED		0x000c
47435388Smjacob#define RQCS_IDE_MSG_FAILED		0x000d
47535388Smjacob#define RQCS_ABORT_MSG_FAILED		0x000e
47635388Smjacob#define RQCS_REJECT_MSG_FAILED		0x000f
47735388Smjacob#define RQCS_NOP_MSG_FAILED		0x0010
47835388Smjacob#define RQCS_PARITY_ERROR_MSG_FAILED	0x0011
47935388Smjacob#define RQCS_DEVICE_RESET_MSG_FAILED	0x0012
48035388Smjacob#define RQCS_ID_MSG_FAILED		0x0013
48135388Smjacob#define RQCS_UNEXP_BUS_FREE		0x0014
48239235Sgibbs#define	RQCS_XACT_ERR1			0x0018
48339235Sgibbs#define	RQCS_XACT_ERR2			0x0019
48439235Sgibbs#define	RQCS_XACT_ERR3			0x001A
48539235Sgibbs#define	RQCS_BAD_ENTRY			0x001B
48639235Sgibbs#define	RQCS_PHASE_SKIPPED		0x001D
48739235Sgibbs#define	RQCS_ARQS_FAILED		0x001E
48839235Sgibbs#define	RQCS_WIDE_FAILED		0x001F
48939235Sgibbs#define	RQCS_SYNCXFER_FAILED		0x0020
49039235Sgibbs#define	RQCS_LVD_BUSERR			0x0021
49139235Sgibbs
49265140Smjacob/* 2X00 Only Completion Codes */
49335388Smjacob#define	RQCS_PORT_UNAVAILABLE		0x0028
49435388Smjacob#define	RQCS_PORT_LOGGED_OUT		0x0029
49535388Smjacob#define	RQCS_PORT_CHANGED		0x002A
49635388Smjacob#define	RQCS_PORT_BUSY			0x002B
49735388Smjacob
49835388Smjacob/*
49965140Smjacob * 1X00 specific State Flags
50035388Smjacob */
50135388Smjacob#define RQSF_GOT_BUS			0x0100
50235388Smjacob#define RQSF_GOT_TARGET			0x0200
50335388Smjacob#define RQSF_SENT_CDB			0x0400
50435388Smjacob#define RQSF_XFRD_DATA			0x0800
50535388Smjacob#define RQSF_GOT_STATUS			0x1000
50635388Smjacob#define RQSF_GOT_SENSE			0x2000
50735388Smjacob#define	RQSF_XFER_COMPLETE		0x4000
50835388Smjacob
50935388Smjacob/*
51070824Smjacob * 2X00 specific State Flags
51170824Smjacob * (same as 1X00 except RQSF_GOT_BUS/RQSF_GOT_TARGET are not available)
51270824Smjacob */
51370824Smjacob#define	RQSF_DATA_IN			0x0020
51470824Smjacob#define	RQSF_DATA_OUT			0x0040
51570824Smjacob#define	RQSF_STAG			0x0008
51670824Smjacob#define	RQSF_OTAG			0x0004
51770824Smjacob#define	RQSF_HTAG			0x0002
51870824Smjacob/*
51965140Smjacob * 1X00 Status Flags
52035388Smjacob */
52135388Smjacob#define RQSTF_DISCONNECT		0x0001
52235388Smjacob#define RQSTF_SYNCHRONOUS		0x0002
52335388Smjacob#define RQSTF_PARITY_ERROR		0x0004
52435388Smjacob#define RQSTF_BUS_RESET			0x0008
52535388Smjacob#define RQSTF_DEVICE_RESET		0x0010
52635388Smjacob#define RQSTF_ABORTED			0x0020
52735388Smjacob#define RQSTF_TIMEOUT			0x0040
52835388Smjacob#define RQSTF_NEGOTIATION		0x0080
52935388Smjacob
53035388Smjacob/*
53165140Smjacob * 2X00 specific state flags
53265140Smjacob */
53365140Smjacob/* RQSF_SENT_CDB	*/
53465140Smjacob/* RQSF_XFRD_DATA	*/
53565140Smjacob/* RQSF_GOT_STATUS	*/
53665140Smjacob/* RQSF_XFER_COMPLETE	*/
53765140Smjacob
53865140Smjacob/*
53965140Smjacob * 2X00 specific status flags
54065140Smjacob */
54165140Smjacob/* RQSTF_ABORTED */
54265140Smjacob/* RQSTF_TIMEOUT */
54365140Smjacob#define	RQSTF_DMA_ERROR			0x0080
54465140Smjacob#define	RQSTF_LOGOUT			0x2000
54565140Smjacob
54665140Smjacob/*
54765140Smjacob * Miscellaneous
54865140Smjacob */
54965140Smjacob#ifndef	ISP_EXEC_THROTTLE
55065140Smjacob#define	ISP_EXEC_THROTTLE	16
55165140Smjacob#endif
55265140Smjacob
55365140Smjacob/*
55475194Smjacob * About Firmware returns an 'attribute' word in mailbox 6.
55575194Smjacob */
55675194Smjacob#define	ISP_FW_ATTR_TMODE	0x01
55775194Smjacob#define	ISP_FW_ATTR_SCCLUN	0x02
55875194Smjacob#define	ISP_FW_ATTR_FABRIC	0x04
55975194Smjacob#define	ISP_FW_ATTR_CLASS2	0x08
56075194Smjacob#define	ISP_FW_ATTR_FCTAPE	0x10
56175194Smjacob#define	ISP_FW_ATTR_IP		0x20
56275194Smjacob
56375194Smjacob/*
56479237Smjacob * Reduced Interrupt Operation Response Queue Entreis
56579237Smjacob */
56679237Smjacob
56779237Smjacobtypedef struct {
56879237Smjacob	isphdr_t	req_header;
56979237Smjacob	u_int32_t	req_handles[15];
57079237Smjacob} isp_rio1_t;
57179237Smjacob
57279237Smjacobtypedef struct {
57379237Smjacob	isphdr_t	req_header;
57479237Smjacob	u_int16_t	req_handles[30];
57579237Smjacob} isp_rio2_t;
57679237Smjacob
57779237Smjacob/*
57844819Smjacob * FC (ISP2100) specific data structures
57939235Sgibbs */
58039235Sgibbs
58139235Sgibbs/*
58235388Smjacob * Initialization Control Block
58339235Sgibbs *
58449910Smjacob * Version One (prime) format.
58535388Smjacob */
58649910Smjacobtypedef struct isp_icb {
58735388Smjacob	u_int8_t	icb_version;
58835388Smjacob	u_int8_t	_reserved0;
58949910Smjacob	u_int16_t	icb_fwoptions;
59049910Smjacob	u_int16_t	icb_maxfrmlen;
59135388Smjacob	u_int16_t	icb_maxalloc;
59235388Smjacob	u_int16_t	icb_execthrottle;
59335388Smjacob	u_int8_t	icb_retry_count;
59435388Smjacob	u_int8_t	icb_retry_delay;
59549910Smjacob	u_int8_t	icb_portname[8];
59635388Smjacob	u_int16_t	icb_hardaddr;
59739235Sgibbs	u_int8_t	icb_iqdevtype;
59849910Smjacob	u_int8_t	icb_logintime;
59949910Smjacob	u_int8_t	icb_nodename[8];
60035388Smjacob	u_int16_t	icb_rqstout;
60135388Smjacob	u_int16_t	icb_rspnsin;
60249910Smjacob	u_int16_t	icb_rqstqlen;
60349910Smjacob	u_int16_t	icb_rsltqlen;
60449910Smjacob	u_int16_t	icb_rqstaddr[4];
60549910Smjacob	u_int16_t	icb_respaddr[4];
60649910Smjacob	u_int16_t	icb_lunenables;
60749910Smjacob	u_int8_t	icb_ccnt;
60849910Smjacob	u_int8_t	icb_icnt;
60949910Smjacob	u_int16_t	icb_lunetimeout;
61049910Smjacob	u_int16_t	_reserved1;
61149910Smjacob	u_int16_t	icb_xfwoptions;
61249910Smjacob	u_int8_t	icb_racctimer;
61349910Smjacob	u_int8_t	icb_idelaytimer;
61449910Smjacob	u_int16_t	icb_zfwoptions;
61549910Smjacob	u_int16_t	_reserved2[13];
61635388Smjacob} isp_icb_t;
61739235Sgibbs#define	ICB_VERSION1	1
61835388Smjacob
61948481Smjacob#define	ICBOPT_HARD_ADDRESS	0x0001
62048481Smjacob#define	ICBOPT_FAIRNESS		0x0002
62148481Smjacob#define	ICBOPT_FULL_DUPLEX	0x0004
62248481Smjacob#define	ICBOPT_FAST_POST	0x0008
62348481Smjacob#define	ICBOPT_TGT_ENABLE	0x0010
62448481Smjacob#define	ICBOPT_INI_DISABLE	0x0020
62548481Smjacob#define	ICBOPT_INI_ADISC	0x0040
62648481Smjacob#define	ICBOPT_INI_TGTTYPE	0x0080
62748481Smjacob#define	ICBOPT_PDBCHANGE_AE	0x0100
62848481Smjacob#define	ICBOPT_NOLIP		0x0200
62948481Smjacob#define	ICBOPT_SRCHDOWN		0x0400
63048481Smjacob#define	ICBOPT_PREVLOOP		0x0800
63148481Smjacob#define	ICBOPT_STOP_ON_QFULL	0x1000
63248481Smjacob#define	ICBOPT_FULL_LOGIN	0x2000
63372938Smjacob#define	ICBOPT_BOTH_WWNS	0x4000
63449910Smjacob#define	ICBOPT_EXTENDED		0x8000
63535388Smjacob
63657149Smjacob#define	ICBXOPT_CLASS2_ACK0	0x0200
63757149Smjacob#define	ICBXOPT_CLASS2		0x0100
63857149Smjacob#define	ICBXOPT_LOOP_ONLY	(0 << 4)
63957149Smjacob#define	ICBXOPT_PTP_ONLY	(1 << 4)
64057149Smjacob#define	ICBXOPT_LOOP_2_PTP	(2 << 4)
64157149Smjacob#define	ICBXOPT_PTP_2_LOOP	(3 << 4)
64239235Sgibbs
64357149Smjacob#define	ICBXOPT_RIO_OFF		0
64457149Smjacob#define	ICBXOPT_RIO_16BIT	1
64557149Smjacob#define	ICBXOPT_RIO_32BIT	2
64688855Smjacob#define	ICBXOPT_RIO_16BIT_IOCB	3
64788855Smjacob#define	ICBXOPT_RIO_32BIT_IOCB	4
64857149Smjacob
64988855Smjacob#define	ICBZOPT_ENA_RDXFR_RDY	0x01
65088855Smjacob#define	ICBZOPT_ENA_OOF		(1 << 6) /* out of order frame handling */
65182689Smjacob/* These 3 only apply to the 2300 */
65284598Smjacob#define	ICBZOPT_RATE_ONEGB	(MBGSD_ONEGB << 14)
65384598Smjacob#define	ICBZOPT_RATE_TWOGB	(MBGSD_TWOGB << 14)
65484598Smjacob#define	ICBZOPT_RATE_AUTO	(MBGSD_AUTO << 14)
65557149Smjacob
65657149Smjacob
65739235Sgibbs#define	ICB_MIN_FRMLEN		256
65839235Sgibbs#define	ICB_MAX_FRMLEN		2112
65939235Sgibbs#define	ICB_DFLT_FRMLEN		1024
66048481Smjacob#define	ICB_DFLT_ALLOC		256
66148481Smjacob#define	ICB_DFLT_THROTTLE	16
66248481Smjacob#define	ICB_DFLT_RDELAY		5
66348481Smjacob#define	ICB_DFLT_RCOUNT		3
66439235Sgibbs
66548481Smjacob
66639235Sgibbs#define	RQRSP_ADDR0015	0
66739235Sgibbs#define	RQRSP_ADDR1631	1
66839235Sgibbs#define	RQRSP_ADDR3247	2
66939235Sgibbs#define	RQRSP_ADDR4863	3
67039235Sgibbs
67145283Smjacob
67239235Sgibbs#define	ICB_NNM0	7
67339235Sgibbs#define	ICB_NNM1	6
67439235Sgibbs#define	ICB_NNM2	5
67539235Sgibbs#define	ICB_NNM3	4
67639235Sgibbs#define	ICB_NNM4	3
67739235Sgibbs#define	ICB_NNM5	2
67839235Sgibbs#define	ICB_NNM6	1
67939235Sgibbs#define	ICB_NNM7	0
68039235Sgibbs
68139235Sgibbs#define	MAKE_NODE_NAME_FROM_WWN(array, wwn)	\
68239235Sgibbs	array[ICB_NNM0] = (u_int8_t) ((wwn >>  0) & 0xff), \
68339235Sgibbs	array[ICB_NNM1] = (u_int8_t) ((wwn >>  8) & 0xff), \
68439235Sgibbs	array[ICB_NNM2] = (u_int8_t) ((wwn >> 16) & 0xff), \
68539235Sgibbs	array[ICB_NNM3] = (u_int8_t) ((wwn >> 24) & 0xff), \
68639235Sgibbs	array[ICB_NNM4] = (u_int8_t) ((wwn >> 32) & 0xff), \
68739235Sgibbs	array[ICB_NNM5] = (u_int8_t) ((wwn >> 40) & 0xff), \
68839235Sgibbs	array[ICB_NNM6] = (u_int8_t) ((wwn >> 48) & 0xff), \
68939235Sgibbs	array[ICB_NNM7] = (u_int8_t) ((wwn >> 56) & 0xff)
69039235Sgibbs
69141520Smjacob/*
69272354Smjacob * FC-AL Position Map
69372354Smjacob *
69472354Smjacob * This is an at most 128 byte map that returns either
69572354Smjacob * the LILP or Firmware generated list of ports.
69672354Smjacob *
69772354Smjacob * We deviate a bit from the returned qlogic format to
69872354Smjacob * use an extra bit to say whether this was a LILP or
69972354Smjacob * f/w generated map.
70072354Smjacob */
70172354Smjacobtypedef struct {
70272354Smjacob	u_int8_t	fwmap	: 1,
70372354Smjacob			count	: 7;
70472354Smjacob	u_int8_t	map[127];
70572354Smjacob} fcpos_map_t;
70672354Smjacob
70772354Smjacob/*
70844819Smjacob * Port Data Base Element
70944819Smjacob */
71044819Smjacob
71144819Smjacobtypedef struct {
71244819Smjacob	u_int16_t	pdb_options;
71344819Smjacob	u_int8_t	pdb_mstate;
71444819Smjacob	u_int8_t	pdb_sstate;
71560217Smjacob#define	BITS2WORD(x)	((x)[0] << 16 | (x)[3] << 8 | (x)[2])
71644819Smjacob	u_int8_t	pdb_hardaddr_bits[4];
71744819Smjacob	u_int8_t	pdb_portid_bits[4];
71844819Smjacob	u_int8_t	pdb_nodename[8];
71944819Smjacob	u_int8_t	pdb_portname[8];
72044819Smjacob	u_int16_t	pdb_execthrottle;
72144819Smjacob	u_int16_t	pdb_exec_count;
72244819Smjacob	u_int8_t	pdb_retry_count;
72344819Smjacob	u_int8_t	pdb_retry_delay;
72444819Smjacob	u_int16_t	pdb_resalloc;
72544819Smjacob	u_int16_t	pdb_curalloc;
72644819Smjacob	u_int16_t	pdb_qhead;
72744819Smjacob	u_int16_t	pdb_qtail;
72844819Smjacob	u_int16_t	pdb_tl_next;
72944819Smjacob	u_int16_t	pdb_tl_last;
73044819Smjacob	u_int16_t	pdb_features;	/* PLOGI, Common Service */
73144819Smjacob	u_int16_t	pdb_pconcurrnt;	/* PLOGI, Common Service */
73244819Smjacob	u_int16_t	pdb_roi;	/* PLOGI, Common Service */
73344819Smjacob	u_int8_t	pdb_target;
73444819Smjacob	u_int8_t	pdb_initiator;	/* PLOGI, Class 3 Control Flags */
73544819Smjacob	u_int16_t	pdb_rdsiz;	/* PLOGI, Class 3 */
73644819Smjacob	u_int16_t	pdb_ncseq;	/* PLOGI, Class 3 */
73744819Smjacob	u_int16_t	pdb_noseq;	/* PLOGI, Class 3 */
73844819Smjacob	u_int16_t	pdb_labrtflg;
73944819Smjacob	u_int16_t	pdb_lstopflg;
74044819Smjacob	u_int16_t	pdb_sqhead;
74144819Smjacob	u_int16_t	pdb_sqtail;
74244819Smjacob	u_int16_t	pdb_ptimer;
74344819Smjacob	u_int16_t	pdb_nxt_seqid;
74444819Smjacob	u_int16_t	pdb_fcount;
74544819Smjacob	u_int16_t	pdb_prli_len;
74644819Smjacob	u_int16_t	pdb_prli_svc0;
74744819Smjacob	u_int16_t	pdb_prli_svc3;
74844819Smjacob	u_int16_t	pdb_loopid;
74944819Smjacob	u_int16_t	pdb_il_ptr;
75044819Smjacob	u_int16_t	pdb_sl_ptr;
75144819Smjacob} isp_pdb_t;
75244819Smjacob
75344819Smjacob#define	PDB_OPTIONS_XMITTING	(1<<11)
75444819Smjacob#define	PDB_OPTIONS_LNKXMIT	(1<<10)
75544819Smjacob#define	PDB_OPTIONS_ABORTED	(1<<9)
75644819Smjacob#define	PDB_OPTIONS_ADISC	(1<<1)
75744819Smjacob
75844819Smjacob#define	PDB_STATE_DISCOVERY	0
75944819Smjacob#define	PDB_STATE_WDISC_ACK	1
76044819Smjacob#define	PDB_STATE_PLOGI		2
76144819Smjacob#define	PDB_STATE_PLOGI_ACK	3
76244819Smjacob#define	PDB_STATE_PRLI		4
76344819Smjacob#define	PDB_STATE_PRLI_ACK	5
76444819Smjacob#define	PDB_STATE_LOGGED_IN	6
76544819Smjacob#define	PDB_STATE_PORT_UNAVAIL	7
76644819Smjacob#define	PDB_STATE_PRLO		8
76744819Smjacob#define	PDB_STATE_PRLO_ACK	9
76844819Smjacob#define	PDB_STATE_PLOGO		10
76944819Smjacob#define	PDB_STATE_PLOG_ACK	11
77044819Smjacob
77144819Smjacob#define		SVC3_TGT_ROLE		0x10
77244819Smjacob#define 	SVC3_INI_ROLE		0x20
77344819Smjacob#define			SVC3_ROLE_MASK	0x30
77448481Smjacob#define			SVC3_ROLE_SHIFT	4
77544819Smjacob
77693837Smjacob/*
77793837Smjacob * CT definition
77893837Smjacob *
77993837Smjacob * This is as the QLogic f/w documentations defines it- which is just opposite,
78093837Smjacob * bit wise, from what the specification defines it as. Additionally, the
78193837Smjacob * ct_response and ct_resid (really from FC-GS-2) need to be byte swapped.
78293837Smjacob */
78393837Smjacob
78448481Smjacobtypedef struct {
78593837Smjacob	u_int8_t	ct_revision;
78693837Smjacob	u_int8_t	ct_portid[3];
78793837Smjacob	u_int8_t	ct_fcs_type;
78893837Smjacob	u_int8_t	ct_fcs_subtype;
78993837Smjacob	u_int8_t	ct_options;
79093837Smjacob	u_int8_t	ct_res0;
79193837Smjacob	u_int16_t	ct_response;
79293837Smjacob	u_int16_t	ct_resid;
79393837Smjacob	u_int8_t	ct_res1;
79493837Smjacob	u_int8_t	ct_reason;
79593837Smjacob	u_int8_t	ct_explanation;
79693837Smjacob	u_int8_t	ct_vunique;
79793837Smjacob} ct_hdr_t;
79893837Smjacob#define	FS_ACC	0x8002
79993837Smjacob#define	FS_RJT	0x8001
80093837Smjacob
80193837Smjacob#define	FC4_IP		5 /* ISO/EEC 8802-2 LLC/SNAP "Out of Order Delivery" */
80293837Smjacob#define	FC4_SCSI	8 /* SCSI-3 via Fivre Channel Protocol (FCP) */
80393837Smjacob
80493837Smjacob#define	SNS_GA_NXT	0x100
80593837Smjacob#define	SNS_GPN_ID	0x112
80693837Smjacob#define	SNS_GNN_ID	0x113
80793837Smjacob#define	SNS_GID_FT	0x171
80893837Smjacob#define	SNS_RFT_ID	0x217
80993837Smjacobtypedef struct {
81048481Smjacob	u_int16_t	snscb_rblen;	/* response buffer length (words) */
81148481Smjacob	u_int16_t	snscb_res0;
81248481Smjacob	u_int16_t	snscb_addr[4];	/* response buffer address */
81348481Smjacob	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
81448481Smjacob	u_int16_t	snscb_res1;
81548481Smjacob	u_int16_t	snscb_data[1];	/* variable data */
81648481Smjacob} sns_screq_t;	/* Subcommand Request Structure */
81748481Smjacob
81848481Smjacobtypedef struct {
81993837Smjacob	u_int16_t	snscb_rblen;	/* response buffer length (words) */
82093837Smjacob	u_int16_t	snscb_res0;
82193837Smjacob	u_int16_t	snscb_addr[4];	/* response buffer address */
82293837Smjacob	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
82393837Smjacob	u_int16_t	snscb_res1;
82493837Smjacob	u_int16_t	snscb_cmd;
82593837Smjacob	u_int16_t	snscb_res2;
82693837Smjacob	u_int32_t	snscb_res3;
82793837Smjacob	u_int32_t	snscb_port;
82893837Smjacob} sns_ga_nxt_req_t;
82993837Smjacob#define	SNS_GA_NXT_REQ_SIZE	(sizeof (sns_ga_nxt_req_t))
83093837Smjacob
83193837Smjacobtypedef struct {
83293837Smjacob	u_int16_t	snscb_rblen;	/* response buffer length (words) */
83393837Smjacob	u_int16_t	snscb_res0;
83493837Smjacob	u_int16_t	snscb_addr[4];	/* response buffer address */
83593837Smjacob	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
83693837Smjacob	u_int16_t	snscb_res1;
83793837Smjacob	u_int16_t	snscb_cmd;
83893837Smjacob	u_int16_t	snscb_res2;
83993837Smjacob	u_int32_t	snscb_res3;
84093837Smjacob	u_int32_t	snscb_portid;
84193837Smjacob} sns_gxn_id_req_t;
84293837Smjacob#define	SNS_GXN_ID_REQ_SIZE	(sizeof (sns_gxn_id_req_t))
84393837Smjacob
84493837Smjacobtypedef struct {
84593837Smjacob	u_int16_t	snscb_rblen;	/* response buffer length (words) */
84693837Smjacob	u_int16_t	snscb_res0;
84793837Smjacob	u_int16_t	snscb_addr[4];	/* response buffer address */
84893837Smjacob	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
84993837Smjacob	u_int16_t	snscb_res1;
85093837Smjacob	u_int16_t	snscb_cmd;
85193837Smjacob	u_int16_t	snscb_mword_div_2;
85293837Smjacob	u_int32_t	snscb_res3;
85393837Smjacob	u_int32_t	snscb_fc4_type;
85493837Smjacob} sns_gid_ft_req_t;
85593837Smjacob#define	SNS_GID_FT_REQ_SIZE	(sizeof (sns_gid_ft_req_t))
85693837Smjacob
85793837Smjacobtypedef struct {
85893837Smjacob	u_int16_t	snscb_rblen;	/* response buffer length (words) */
85993837Smjacob	u_int16_t	snscb_res0;
86093837Smjacob	u_int16_t	snscb_addr[4];	/* response buffer address */
86193837Smjacob	u_int16_t	snscb_sblen;	/* subcommand buffer length (words) */
86293837Smjacob	u_int16_t	snscb_res1;
86393837Smjacob	u_int16_t	snscb_cmd;
86493837Smjacob	u_int16_t	snscb_res2;
86593837Smjacob	u_int32_t	snscb_res3;
86693837Smjacob	u_int32_t	snscb_port;
86793837Smjacob	u_int32_t	snscb_fc4_types[8];
86893837Smjacob} sns_rft_id_req_t;
86993837Smjacob#define	SNS_RFT_ID_REQ_SIZE	(sizeof (sns_rft_id_req_t))
87093837Smjacob
87193837Smjacobtypedef struct {
87293837Smjacob	ct_hdr_t	snscb_cthdr;
87348481Smjacob	u_int8_t	snscb_port_type;
87448481Smjacob	u_int8_t	snscb_port_id[3];
87548481Smjacob	u_int8_t	snscb_portname[8];
87648481Smjacob	u_int16_t	snscb_data[1];	/* variable data */
87748481Smjacob} sns_scrsp_t;	/* Subcommand Response Structure */
87848481Smjacob
87957587Smjacobtypedef struct {
88093837Smjacob	ct_hdr_t	snscb_cthdr;
88157587Smjacob	u_int8_t	snscb_port_type;
88257587Smjacob	u_int8_t	snscb_port_id[3];
88357587Smjacob	u_int8_t	snscb_portname[8];
88457587Smjacob	u_int8_t	snscb_pnlen;		/* symbolic port name length */
88557587Smjacob	u_int8_t	snscb_pname[255];	/* symbolic port name */
88657587Smjacob	u_int8_t	snscb_nodename[8];
88757587Smjacob	u_int8_t	snscb_nnlen;		/* symbolic node name length */
88857587Smjacob	u_int8_t	snscb_nname[255];	/* symbolic node name */
88957587Smjacob	u_int8_t	snscb_ipassoc[8];
89057587Smjacob	u_int8_t	snscb_ipaddr[16];
89157587Smjacob	u_int8_t	snscb_svc_class[4];
89257587Smjacob	u_int8_t	snscb_fc4_types[32];
89357587Smjacob	u_int8_t	snscb_fpname[8];
89457587Smjacob	u_int8_t	snscb_reserved;
89557587Smjacob	u_int8_t	snscb_hardaddr[3];
89693837Smjacob} sns_ga_nxt_rsp_t;	/* Subcommand Response Structure */
89793837Smjacob#define	SNS_GA_NXT_RESP_SIZE	(sizeof (sns_ga_nxt_rsp_t))
89857587Smjacob
89993837Smjacobtypedef struct {
90093837Smjacob	ct_hdr_t	snscb_cthdr;
90193837Smjacob	u_int8_t	snscb_wwn[8];
90293837Smjacob} sns_gxn_id_rsp_t;
90393837Smjacob#define	SNS_GXN_ID_RESP_SIZE	(sizeof (sns_gxn_id_rsp_t))
90493837Smjacob
90593837Smjacob
90693837Smjacobtypedef struct {
90793837Smjacob	ct_hdr_t	snscb_cthdr;
90893837Smjacob	struct {
90993837Smjacob		u_int8_t	control;
91093837Smjacob		u_int8_t	portid[3];
91193837Smjacob	} snscb_ports[1];
91293837Smjacob} sns_gid_ft_rsp_t;
91393837Smjacob#define	SNS_GID_FT_RESP_SIZE(x)	((sizeof (sns_gid_ft_rsp_t)) + ((x - 1) << 2))
91493837Smjacob
91593837Smjacob#define	SNS_RFT_ID_RESP_SIZE	(sizeof (ct_hdr_t))
91693837Smjacob
91735388Smjacob#endif	/* _ISPMBOX_H */
918