1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_SYS_SCSI_ADAPTERS_IFPIO_H
27#define	_SYS_SCSI_ADAPTERS_IFPIO_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31/*
32 * Include any headers you depend on.
33 */
34
35#ifdef	__cplusplus
36extern "C" {
37#endif
38
39#define	IFP_IOC	('I' << 8)
40
41/*
42 * Get ifp device map ioctl.
43 */
44#define	IFPIOCGMAP		(IFP_IOC|1)	/* Get device map/wwn's */
45#define	IFPIO_ADISC_ELS		(IFP_IOC|2)	/* Get ADISC info */
46#define	IFPIO_FORCE_LIP		(IFP_IOC|3)	/* Force a LIP */
47#define	IFPIO_LINKSTATUS	(IFP_IOC|4)	/* Link Status */
48#define	IFPIO_DIAG_GET_FWREV	(IFP_IOC|5)	/* SunVTS diag get fw rev */
49#define	IFPIO_DIAG_NOP		(IFP_IOC|6)	/* SunVTS diag NOOP */
50#define	IFPIO_DIAG_MBOXCMD	(IFP_IOC|7)	/* SunVTS diag mbox cmds */
51#define	IFPIO_LOOPBACK_FRAME	(IFP_IOC|8)	/* Diagnostic loopback */
52#define	IFPIO_DIAG_SELFTEST	(IFP_IOC|9)	/* Diagnostic selftest */
53#define	IFPIO_BOARD_INFO	(IFP_IOC|10)	/* Get device id and rev's */
54#define	IFPIO_FCODE_DOWNLOAD	(IFP_IOC|11)	/* Download fcode to flash */
55
56struct ifp_board_info {
57	uint16_t	ifpd_major;		/* FW major revision */
58	uint16_t	ifpd_minor;		/* FW minor revision */
59	uint16_t	ifpd_subminor;		/* FW subminor revision */
60	uint16_t	chip_rev;		/* chip revision level */
61	uint16_t	ctrl_id;		/* 2100 or 2200 */
62};
63typedef struct ifp_board_info ifp_board_info_t;
64
65struct ifp_diag_fw_rev {
66	uint16_t	ifpd_major;		/* FW major revision */
67	uint16_t	ifpd_minor;		/* FW minor revision */
68};
69typedef struct ifp_diag_fw_rev ifp_diag_fw_rev_t;
70
71struct ifp_lb_frame_cmd {
72	uint16_t	options;		/* diag loop-back options */
73	uint32_t	iter_cnt;		/* count of loopback ops */
74	uint32_t	xfer_cnt;		/* transmit/receive xfer len */
75	caddr_t		xmit_addr;		/* transmit data address */
76	caddr_t		recv_addr;		/* receive data address */
77
78	uint16_t	status;			/* completion status */
79	uint16_t	crc_cnt;		/* crc error count */
80	uint16_t	disparity_cnt;		/* disparity error count */
81	uint16_t	frame_len_err_cnt;	/* frame length error count */
82	uint32_t	fail_iter_cnt;		/* failing iteration count */
83};
84typedef struct ifp_lb_frame_cmd ifp_lb_frame_cmd_t;
85
86#if defined(_LP64)
87struct ifp_lb_frame_cmd32 {
88	uint16_t	options;		/* diag loop-back options */
89	uint32_t	iter_cnt;		/* count of loopback ops */
90	uint32_t	xfer_cnt;		/* transmit/receive xfer len */
91	caddr32_t	xmit_addr;		/* transmit data address */
92	caddr32_t	recv_addr;		/* receive data address */
93
94	uint16_t	status;			/* completion status */
95	uint16_t	crc_cnt;		/* crc error count */
96	uint16_t	disparity_cnt;		/* disparity error count */
97	uint16_t	frame_len_err_cnt;	/* frame length error count */
98	uint32_t	fail_iter_cnt;		/* failing iteration count */
99};
100#endif
101
102/* defines for options field */
103#define	LOOP_10BIT	0x0000		/* loopback at 10 bit interface */
104#define	LOOP_1BIT	0x0001		/* loopback at 1 bit interface */
105#define	LOOP_EXTERNAL	0x0002		/* loopback on external loop */
106#define	LOOP_XMIT_OFF	0x0004		/* transmitter powered off */
107#define	LOOP_XMIT_RAM	0x0010		/* xmit data from system ram */
108#define	LOOP_RECV_RAM	0x0020		/* receive data to system ram */
109#define	LOOP_ERR_STOP	0x0080		/* stop test on error */
110
111struct ifp_diag_selftest {
112	uint16_t	status;			/* completion status */
113	uint16_t	test_num;		/* failing test number */
114	uint16_t	fail_addr;		/* failure address */
115	uint16_t	fail_data;		/* failure data */
116};
117typedef struct ifp_diag_selftest ifp_diag_selftest_t;
118
119/* offset of the fcode from begining of file */
120#define	FCODE_OFFSET	0x20
121struct ifp_download {
122	uint32_t	dl_fcode_len;		/* length of the fcode array */
123	uint16_t	dl_chip_id;		/* Chip id for FCODE */
124	uchar_t	dl_fcode[1];		/* the fcode */
125};
126typedef struct ifp_download ifp_download_t;
127
128#define	IFP_NUM_ENTRIES_IN_MAP	127
129#define	IFP_DIAG_MAX_MBOX	10
130
131struct ifp_al_addr_pair {
132	uchar_t	ifp_al_pa;
133	uchar_t	ifp_hard_address;
134	uchar_t	ifp_inq_dtype;
135	uchar_t	ifp_node_wwn[FC_WWN_SIZE];
136	uchar_t	ifp_port_wwn[FC_WWN_SIZE];
137};
138typedef struct ifp_al_addr_pair ifp_al_addr_pair_t;
139
140struct ifp_al_map {
141	short			ifp_count;
142	ifp_al_addr_pair_t	ifp_addr_pair[IFP_NUM_ENTRIES_IN_MAP];
143	ifp_al_addr_pair_t	ifp_hba_addr;
144};
145typedef struct ifp_al_map ifp_al_map_t;
146
147struct adisc_payload {
148	uint_t	adisc_hardaddr;
149	uchar_t	adisc_portwwn[8];
150	uchar_t	adisc_nodewwn[8];
151	uint_t	adisc_dest;
152};
153
154struct rls_payload {
155	uint_t	rls_portno;
156	uint_t	rls_linkfail;
157	uint_t	rls_syncfail;
158	uint_t	rls_sigfail;
159	uint_t	rls_primitiverr;
160	uint_t	rls_invalidword;
161	uint_t	rls_invalidcrc;
162};
163typedef struct rls_payload rls_payload_t;
164
165struct ifp_target_stats {
166	int	logouts_recvd;
167					/*
168					 * unsolicited LOGOs recvd from
169					 * target
170					 */
171	int	task_mgmt_failures;
172	int	data_ro_mismatches;
173	int	dl_len_mismatches;
174};
175typedef struct ifp_target_stats ifp_target_stats_t;
176
177struct ifp_stats {
178	int	version;		/* version of this struct */
179	int	lip_count;		/* lips forced by ifp */
180	int	ncmds;			/* outstanding commands */
181	ifp_target_stats_t tstats[IFP_NUM_ENTRIES_IN_MAP]; /* per tgt stats */
182};
183typedef struct ifp_stats ifp_stats_t;
184
185/* XXX temp hack to get sf/socal ioctls used by luxadm to work with ifp */
186
187#if !defined(SFIOCGMAP)
188#define	SFIOCGMAP		((0xda << 8)|1)
189#endif
190#if !defined(FCIO_GETMAP)
191#define	FCIO_GETMAP		(('F' << 8)|175)
192struct lilpmap {
193	ushort_t lilp_magic;
194	ushort_t lilp_myalpa;
195	uchar_t  lilp_length;
196	uchar_t  lilp_list[127];
197};
198#endif
199
200/*
201 * Structure used for diag loopback commands.
202 * This is copied from socalvar.h and must
203 * remain the same as for the socal driver.
204 */
205typedef	struct flb_hdr {
206	uint_t max_length;
207	uint_t length;
208} flb_hdr_t;
209/* This is the max loopback transfer size */
210#define	MAX_LOOPBACK		65536
211
212#if !defined(FCIO_FORCE_LIP)
213#define	FCIO_FORCE_LIP		(('F' << 8)|177)
214#endif
215#if !defined(FCIO_LINKSTATUS)
216#define	FCIO_LINKSTATUS		(('F' << 8)|183)
217#endif
218#if !defined(FCIO_FCODE_MCODE_VERSION)
219#define	FCIO_FCODE_MCODE_VERSION	(('F' << 8)|202)
220#endif
221struct ifp_fm_version {
222	int	fcode_ver_len;
223	int	mcode_ver_len;
224	int	prom_ver_len;
225	caddr_t	fcode_ver;
226	caddr_t	mcode_ver;
227	caddr_t	prom_ver;
228};
229#if defined(_LP64)
230struct ifp_fm_version32 {
231	int		fcode_ver_len;
232	int		mcode_ver_len;
233	int		prom_ver_len;
234	caddr32_t	fcode_ver;
235	caddr32_t	mcode_ver;
236	caddr32_t	prom_ver;
237};
238#endif
239
240/* XXX end temp hack to get sf/socal ioctls used by luxadm to work with ifp */
241
242struct ifp_diag_mbox {
243	ushort_t	ifp_in_mbox[8];	/* in regs -- from ISP */
244	ushort_t	ifp_out_mbox[8];	/* out regs -- to ISP */
245};
246typedef struct ifp_diag_mbox ifp_diag_mbox_t;
247
248struct ifp_diag_regs {
249	ushort_t		ifpd_mailbox[8];
250	ushort_t		ifpd_hccr;
251	ushort_t		ifpd_bus_sema;
252	ushort_t		ifpd_isr;
253	ushort_t		ifpd_icr;
254	ushort_t		ifpd_icsr;
255	ushort_t		ifpd_cdma_count;
256	uint_t			ifpd_cdma_addr;
257	ushort_t		ifpd_cdma_status;
258	ushort_t		ifpd_cdma_control;
259	uint_t			ifpd_rdma_count;
260	uint_t			ifpd_rdma_addr;
261	ushort_t		ifpd_rdma_status;
262	ushort_t		ifpd_rdma_control;
263	uint_t			ifpd_tdma_count;
264	uint_t			ifpd_tdma_addr;
265	ushort_t		ifpd_tdma_status;
266	ushort_t		ifpd_tdma_control;
267	ushort_t		ifpd_risc_reg[16];
268	ushort_t		ifpd_risc_psr;
269	ushort_t		ifpd_risc_ivr;
270	ushort_t		ifpd_risc_pcr;
271	ushort_t		ifpd_risc_rar0;
272	ushort_t		ifpd_risc_rar1;
273	ushort_t		ifpd_risc_lcr;
274	ushort_t		ifpd_risc_pc;
275	ushort_t		ifpd_risc_mtr;
276	ushort_t		ifpd_risc_sp;
277	ushort_t		ifpd_request_in;
278	ushort_t		ifpd_request_out;
279	ushort_t		ifpd_response_in;
280	ushort_t		ifpd_response_out;
281	void			*ifpd_current_req_ptr;
282	void			*ifpd_base_req_ptr;
283	void			*ifpd_current_resp_ptr;
284	void			*ifpd_base_resp_ptr;
285};
286typedef struct ifp_diag_regs ifp_diag_regs_t;
287
288struct ifp_diag_cmd {
289	short		ifp_cmds_rev;		/* revision */
290	short		ifp_cmds_current_rev;	/* rev driver expects */
291	short		ifp_cmds_count;		/* number of cmds */
292	short		ifp_cmds_done;		/* number of cmds done */
293	ifp_diag_regs_t	ifp_regs;		/* reg dump area */
294	ifp_diag_mbox_t	ifp_mbox[IFP_DIAG_MAX_MBOX];	/* mbox values */
295};
296typedef struct ifp_diag_cmd ifp_diag_cmd_t;
297
298#define	IFP_DIAG_CMD_REV	0x1		/* diag cmd rev supported */
299
300#ifdef	__cplusplus
301}
302#endif
303
304#endif	/* _SYS_SCSI_ADAPTERS_IFPIO_H */
305