summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun/sys/scsi/adapters/ifpio.h
blob: 346e4abfbea681e11cdf162614c1609f537f8d62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_SCSI_ADAPTERS_IFPIO_H
#define	_SYS_SCSI_ADAPTERS_IFPIO_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

/*
 * Include any headers you depend on.
 */

#ifdef	__cplusplus
extern "C" {
#endif

#define	IFP_IOC	('I' << 8)

/*
 * Get ifp device map ioctl.
 */
#define	IFPIOCGMAP		(IFP_IOC|1)	/* Get device map/wwn's */
#define	IFPIO_ADISC_ELS		(IFP_IOC|2)	/* Get ADISC info */
#define	IFPIO_FORCE_LIP		(IFP_IOC|3)	/* Force a LIP */
#define	IFPIO_LINKSTATUS	(IFP_IOC|4)	/* Link Status */
#define	IFPIO_DIAG_GET_FWREV	(IFP_IOC|5)	/* SunVTS diag get fw rev */
#define	IFPIO_DIAG_NOP		(IFP_IOC|6)	/* SunVTS diag NOOP */
#define	IFPIO_DIAG_MBOXCMD	(IFP_IOC|7)	/* SunVTS diag mbox cmds */
#define	IFPIO_LOOPBACK_FRAME	(IFP_IOC|8)	/* Diagnostic loopback */
#define	IFPIO_DIAG_SELFTEST	(IFP_IOC|9)	/* Diagnostic selftest */
#define	IFPIO_BOARD_INFO	(IFP_IOC|10)	/* Get device id and rev's */
#define	IFPIO_FCODE_DOWNLOAD	(IFP_IOC|11)	/* Download fcode to flash */

struct ifp_board_info {
	uint16_t	ifpd_major;		/* FW major revision */
	uint16_t	ifpd_minor;		/* FW minor revision */
	uint16_t	ifpd_subminor;		/* FW subminor revision */
	uint16_t	chip_rev;		/* chip revision level */
	uint16_t	ctrl_id;		/* 2100 or 2200 */
};
typedef struct ifp_board_info ifp_board_info_t;

struct ifp_diag_fw_rev {
	uint16_t	ifpd_major;		/* FW major revision */
	uint16_t	ifpd_minor;		/* FW minor revision */
};
typedef struct ifp_diag_fw_rev ifp_diag_fw_rev_t;

struct ifp_lb_frame_cmd {
	uint16_t	options;		/* diag loop-back options */
	uint32_t	iter_cnt;		/* count of loopback ops */
	uint32_t	xfer_cnt;		/* transmit/receive xfer len */
	caddr_t		xmit_addr;		/* transmit data address */
	caddr_t		recv_addr;		/* receive data address */

	uint16_t	status;			/* completion status */
	uint16_t	crc_cnt;		/* crc error count */
	uint16_t	disparity_cnt;		/* disparity error count */
	uint16_t	frame_len_err_cnt;	/* frame length error count */
	uint32_t	fail_iter_cnt;		/* failing iteration count */
};
typedef struct ifp_lb_frame_cmd ifp_lb_frame_cmd_t;

#if defined(_LP64)
struct ifp_lb_frame_cmd32 {
	uint16_t	options;		/* diag loop-back options */
	uint32_t	iter_cnt;		/* count of loopback ops */
	uint32_t	xfer_cnt;		/* transmit/receive xfer len */
	caddr32_t	xmit_addr;		/* transmit data address */
	caddr32_t	recv_addr;		/* receive data address */

	uint16_t	status;			/* completion status */
	uint16_t	crc_cnt;		/* crc error count */
	uint16_t	disparity_cnt;		/* disparity error count */
	uint16_t	frame_len_err_cnt;	/* frame length error count */
	uint32_t	fail_iter_cnt;		/* failing iteration count */
};
#endif

/* defines for options field */
#define	LOOP_10BIT	0x0000		/* loopback at 10 bit interface */
#define	LOOP_1BIT	0x0001		/* loopback at 1 bit interface */
#define	LOOP_EXTERNAL	0x0002		/* loopback on external loop */
#define	LOOP_XMIT_OFF	0x0004		/* transmitter powered off */
#define	LOOP_XMIT_RAM	0x0010		/* xmit data from system ram */
#define	LOOP_RECV_RAM	0x0020		/* receive data to system ram */
#define	LOOP_ERR_STOP	0x0080		/* stop test on error */

struct ifp_diag_selftest {
	uint16_t	status;			/* completion status */
	uint16_t	test_num;		/* failing test number */
	uint16_t	fail_addr;		/* failure address */
	uint16_t	fail_data;		/* failure data */
};
typedef struct ifp_diag_selftest ifp_diag_selftest_t;

/* offset of the fcode from begining of file */
#define	FCODE_OFFSET	0x20
struct ifp_download {
	uint32_t	dl_fcode_len;		/* length of the fcode array */
	uint16_t	dl_chip_id;		/* Chip id for FCODE */
	uchar_t	dl_fcode[1];		/* the fcode */
};
typedef struct ifp_download ifp_download_t;

#define	IFP_NUM_ENTRIES_IN_MAP	127
#define	IFP_DIAG_MAX_MBOX	10

struct ifp_al_addr_pair {
	uchar_t	ifp_al_pa;
	uchar_t	ifp_hard_address;
	uchar_t	ifp_inq_dtype;
	uchar_t	ifp_node_wwn[FC_WWN_SIZE];
	uchar_t	ifp_port_wwn[FC_WWN_SIZE];
};
typedef struct ifp_al_addr_pair ifp_al_addr_pair_t;

struct ifp_al_map {
	short			ifp_count;
	ifp_al_addr_pair_t	ifp_addr_pair[IFP_NUM_ENTRIES_IN_MAP];
	ifp_al_addr_pair_t	ifp_hba_addr;
};
typedef struct ifp_al_map ifp_al_map_t;

struct adisc_payload {
	uint_t	adisc_hardaddr;
	uchar_t	adisc_portwwn[8];
	uchar_t	adisc_nodewwn[8];
	uint_t	adisc_dest;
};

struct rls_payload {
	uint_t	rls_portno;
	uint_t	rls_linkfail;
	uint_t	rls_syncfail;
	uint_t	rls_sigfail;
	uint_t	rls_primitiverr;
	uint_t	rls_invalidword;
	uint_t	rls_invalidcrc;
};
typedef struct rls_payload rls_payload_t;

struct ifp_target_stats {
	int	logouts_recvd;
					/*
					 * unsolicited LOGOs recvd from
					 * target
					 */
	int	task_mgmt_failures;
	int	data_ro_mismatches;
	int	dl_len_mismatches;
};
typedef struct ifp_target_stats ifp_target_stats_t;

struct ifp_stats {
	int	version;		/* version of this struct */
	int	lip_count;		/* lips forced by ifp */
	int	ncmds;			/* outstanding commands */
	ifp_target_stats_t tstats[IFP_NUM_ENTRIES_IN_MAP]; /* per tgt stats */
};
typedef struct ifp_stats ifp_stats_t;

/* XXX temp hack to get sf/socal ioctls used by luxadm to work with ifp */

#if !defined(SFIOCGMAP)
#define	SFIOCGMAP		((0xda << 8)|1)
#endif
#if !defined(FCIO_GETMAP)
#define	FCIO_GETMAP		(('F' << 8)|175)
struct lilpmap {
	ushort_t lilp_magic;
	ushort_t lilp_myalpa;
	uchar_t  lilp_length;
	uchar_t  lilp_list[127];
};
#endif

/*
 * Structure used for diag loopback commands.
 * This is copied from socalvar.h and must
 * remain the same as for the socal driver.
 */
typedef	struct flb_hdr {
	uint_t max_length;
	uint_t length;
} flb_hdr_t;
/* This is the max loopback transfer size */
#define	MAX_LOOPBACK		65536

#if !defined(FCIO_FORCE_LIP)
#define	FCIO_FORCE_LIP		(('F' << 8)|177)
#endif
#if !defined(FCIO_LINKSTATUS)
#define	FCIO_LINKSTATUS		(('F' << 8)|183)
#endif
#if !defined(FCIO_FCODE_MCODE_VERSION)
#define	FCIO_FCODE_MCODE_VERSION	(('F' << 8)|202)
#endif
struct ifp_fm_version {
	int	fcode_ver_len;
	int	mcode_ver_len;
	int	prom_ver_len;
	caddr_t	fcode_ver;
	caddr_t	mcode_ver;
	caddr_t	prom_ver;
};
#if defined(_LP64)
struct ifp_fm_version32 {
	int		fcode_ver_len;
	int		mcode_ver_len;
	int		prom_ver_len;
	caddr32_t	fcode_ver;
	caddr32_t	mcode_ver;
	caddr32_t	prom_ver;
};
#endif

/* XXX end temp hack to get sf/socal ioctls used by luxadm to work with ifp */

struct ifp_diag_mbox {
	ushort_t	ifp_in_mbox[8];	/* in regs -- from ISP */
	ushort_t	ifp_out_mbox[8];	/* out regs -- to ISP */
};
typedef struct ifp_diag_mbox ifp_diag_mbox_t;

struct ifp_diag_regs {
	ushort_t		ifpd_mailbox[8];
	ushort_t		ifpd_hccr;
	ushort_t		ifpd_bus_sema;
	ushort_t		ifpd_isr;
	ushort_t		ifpd_icr;
	ushort_t		ifpd_icsr;
	ushort_t		ifpd_cdma_count;
	uint_t			ifpd_cdma_addr;
	ushort_t		ifpd_cdma_status;
	ushort_t		ifpd_cdma_control;
	uint_t			ifpd_rdma_count;
	uint_t			ifpd_rdma_addr;
	ushort_t		ifpd_rdma_status;
	ushort_t		ifpd_rdma_control;
	uint_t			ifpd_tdma_count;
	uint_t			ifpd_tdma_addr;
	ushort_t		ifpd_tdma_status;
	ushort_t		ifpd_tdma_control;
	ushort_t		ifpd_risc_reg[16];
	ushort_t		ifpd_risc_psr;
	ushort_t		ifpd_risc_ivr;
	ushort_t		ifpd_risc_pcr;
	ushort_t		ifpd_risc_rar0;
	ushort_t		ifpd_risc_rar1;
	ushort_t		ifpd_risc_lcr;
	ushort_t		ifpd_risc_pc;
	ushort_t		ifpd_risc_mtr;
	ushort_t		ifpd_risc_sp;
	ushort_t		ifpd_request_in;
	ushort_t		ifpd_request_out;
	ushort_t		ifpd_response_in;
	ushort_t		ifpd_response_out;
	void			*ifpd_current_req_ptr;
	void			*ifpd_base_req_ptr;
	void			*ifpd_current_resp_ptr;
	void			*ifpd_base_resp_ptr;
};
typedef struct ifp_diag_regs ifp_diag_regs_t;

struct ifp_diag_cmd {
	short		ifp_cmds_rev;		/* revision */
	short		ifp_cmds_current_rev;	/* rev driver expects */
	short		ifp_cmds_count;		/* number of cmds */
	short		ifp_cmds_done;		/* number of cmds done */
	ifp_diag_regs_t	ifp_regs;		/* reg dump area */
	ifp_diag_mbox_t	ifp_mbox[IFP_DIAG_MAX_MBOX];	/* mbox values */
};
typedef struct ifp_diag_cmd ifp_diag_cmd_t;

#define	IFP_DIAG_CMD_REV	0x1		/* diag cmd rev supported */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_SCSI_ADAPTERS_IFPIO_H */