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 */
|