14890 unix: dboot should use efi memory map if present
[illumos-gate.git] / usr / src / uts / common / sys / fct.h
blob0960bbfb974faf9eeae280ab828fe83590f1c11e
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
24 * Copyright 2020 RackTop Systems, Inc.
26 #ifndef _FCT_H
27 #define _FCT_H
30 * Definitions for common FC Target.
32 #include <sys/note.h>
33 #include <sys/stmf_defines.h>
34 #include <sys/fct_defines.h>
35 #include <sys/portif.h>
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
41 typedef enum fct_struct_id {
42 FCT_STRUCT_LOCAL_PORT = 1,
43 FCT_STRUCT_REMOTE_PORT,
44 FCT_STRUCT_CMD_RCVD_ELS,
45 FCT_STRUCT_CMD_SOL_ELS,
46 FCT_STRUCT_CMD_SOL_CT,
47 FCT_STRUCT_CMD_RCVD_ABTS,
48 FCT_STRUCT_CMD_FCP_XCHG,
49 FCT_STRUCT_DBUF_STORE,
51 FCT_MAX_STRUCT_IDS
52 } fct_struct_id_t;
54 typedef struct fct_remote_port {
55 void *rp_fct_private;
56 void *rp_fca_private;
58 struct fct_local_port *rp_port;
59 char rp_nwwn_str[FC_WWN_BUFLEN];
60 char rp_pwwn_str[FC_WWN_BUFLEN];
61 uint8_t rp_nwwn[FC_WWN_LEN];
62 uint8_t rp_pwwn[FC_WWN_LEN];
63 uint32_t rp_id; /* 8 or 24 bit */
64 uint32_t rp_hard_address;
65 uint16_t rp_handle;
66 } fct_remote_port_t;
68 #define FCT_HANDLE_NONE 0xffff
70 typedef struct fct_cmd {
71 void *cmd_fct_private;
72 void *cmd_fca_private;
73 void *cmd_specific;
75 struct fct_local_port *cmd_port;
77 /* During cmd porting this can be set to NULL */
78 struct fct_remote_port *cmd_rp;
80 /* To link cmds together for handling things like ABTS. */
81 struct fct_cmd *cmd_link;
82 uint8_t cmd_type;
83 uint8_t cmd_rsvd1;
85 /* During cmd posting this can be set to FCT_HANDLE_NONE */
86 uint16_t cmd_rp_handle;
87 uint32_t cmd_handle;
88 uint32_t cmd_rportid;
89 uint32_t cmd_lportid;
90 uint32_t cmd_rsvd2;
91 uint16_t cmd_oxid;
92 uint16_t cmd_rxid;
93 fct_status_t cmd_comp_status;
94 } fct_cmd_t;
97 * fcmd_cmd_handle: Bit definitions.
98 * 31 23 15 7 0
99 * +--------------+------------+------------+------------+
100 * | V |uniq_cntr |fca specific| cmd slot index |
101 * +--------------+------------+------------+------------+
102 * V = handle valid.
104 #define CMD_HANDLE_SLOT_INDEX(x) ((x) & 0xffff)
105 #define CMD_HANDLE_VALID(x) ((x) & 0x80000000)
107 enum fct_cmd_types {
108 FCT_CMD_FCP_XCHG = 0x0001,
109 FCT_CMD_RCVD_ELS = 0x0002,
110 FCT_CMD_SOL_ELS = 0x0004,
111 FCT_CMD_RCVD_ABTS = 0x0008,
112 FCT_CMD_SOL_CT = 0x0010,
114 FCT_CMD_TYPE_ALL = 0xffff
117 typedef struct fct_els {
118 uint16_t els_req_size;
119 uint16_t els_resp_size;
120 uint16_t els_req_alloc_size;
121 uint16_t els_resp_alloc_size;
122 uint8_t *els_req_payload;
123 uint8_t *els_resp_payload;
124 } fct_els_t;
126 typedef struct fct_sol_ct {
127 uint16_t ct_req_size;
128 uint16_t ct_resp_size;
129 uint16_t ct_req_alloc_size;
130 uint16_t ct_resp_alloc_size;
131 uint8_t *ct_req_payload;
132 uint8_t *ct_resp_payload;
133 } fct_sol_ct_t;
135 typedef struct fct_rcvd_abts {
136 uint8_t abts_resp_rctl; /* Can be BA_ACC or BA_RJT */
137 uint8_t abts_state;
138 uint16_t rsvd;
139 uint8_t abts_resp_payload[12];
140 } fct_rcvd_abts_t;
143 * abts state
145 #define ABTS_STATE_RECEIVED 0
146 #define ABTS_STATE_RESPONDED 1
147 #define ABTS_STATE_COMPLETED 2
148 #define ABTS_STATE_ABORT_REQUESTED 3
149 #define ABTS_STATE_ABORT_COMPLETED 4
151 #define FCHBA_MANUFACTURER_LEN 64
152 #define FCHBA_SERIAL_NUMBER_LEN 64
153 #define FCHBA_MODEL_LEN 256
154 #define FCHBA_MODEL_DESCRIPTION_LEN 256
155 #define FCHBA_HARDWARE_VERSION_LEN 256
156 #define FCHBA_DRIVER_VERSION_LEN 256
157 #define FCHBA_OPTION_ROM_VERSION_LEN 256
158 #define FCHBA_FIRMWARE_VERSION_LEN 256
159 #define FCHBA_DRIVER_NAME_LEN 256
160 #define FCHBA_SYMB_NAME_LEN 255
162 #define FCT_INFO_LEN 160
163 #define FCT_TASKQ_NAME_LEN 24
165 #define FC_TGT_PORT_INFO_CMD (((uint32_t)'I') << 24)
166 #define FC_TGT_PORT_RLS FC_TGT_PORT_INFO_CMD + 0x1
168 typedef struct fct_port_attrs {
169 char manufacturer[FCHBA_MANUFACTURER_LEN];
170 char serial_number[FCHBA_SERIAL_NUMBER_LEN];
171 char model[FCHBA_MODEL_LEN];
172 char model_description[FCHBA_MODEL_DESCRIPTION_LEN];
173 char hardware_version[FCHBA_HARDWARE_VERSION_LEN];
174 char driver_version[FCHBA_DRIVER_VERSION_LEN];
175 char option_rom_version[FCHBA_OPTION_ROM_VERSION_LEN];
176 char firmware_version[FCHBA_FIRMWARE_VERSION_LEN];
177 char driver_name[FCHBA_DRIVER_NAME_LEN];
178 uint32_t vendor_specific_id;
179 uint32_t supported_cos;
180 uint32_t supported_speed;
181 uint32_t max_frame_size;
182 } fct_port_attrs_t;
184 typedef struct fct_port_link_status {
185 uint32_t LinkFailureCount;
186 uint32_t LossOfSyncCount;
187 uint32_t LossOfSignalsCount;
188 uint32_t PrimitiveSeqProtocolErrorCount;
189 uint32_t InvalidTransmissionWordCount;
190 uint32_t InvalidCRCCount;
191 } fct_port_link_status_t;
193 typedef struct fct_dbuf_store {
194 void *fds_fct_private;
195 void *fds_fca_private;
196 struct stmf_dbuf_store *fds_ds;
198 stmf_data_buf_t *(*fds_alloc_data_buf)(struct fct_local_port *port,
199 uint32_t size, uint32_t *pminsize, uint32_t flags);
200 void (*fds_free_data_buf)(struct fct_dbuf_store *fds,
201 stmf_data_buf_t *dbuf);
202 stmf_status_t (*fds_setup_dbuf)(struct fct_local_port *port,
203 stmf_data_buf_t *dbuf, uint32_t flags);
204 void (*fds_teardown_dbuf)(struct fct_dbuf_store *fds,
205 stmf_data_buf_t *dbuf);
207 uint32_t fds_max_sgl_xfer_len;
208 uint32_t fds_copy_threshold;
209 } fct_dbuf_store_t;
211 #define FCT_FCA_MODREV_1 1
213 typedef struct fct_local_port {
214 void *port_fct_private;
215 void *port_fca_private;
216 stmf_local_port_t *port_lport;
218 char port_nwwn_str[FC_WWN_BUFLEN];
219 char port_pwwn_str[FC_WWN_BUFLEN];
220 uint8_t port_nwwn[FC_WWN_LEN];
221 uint8_t port_pwwn[FC_WWN_LEN];
222 char *port_default_alias;
223 char *port_sym_node_name;
224 char *port_sym_port_name;
226 stmf_port_provider_t *port_pp;
228 uint32_t port_hard_address;
229 uint16_t port_max_logins;
230 uint16_t port_max_xchges;
231 uint32_t port_fca_fcp_cmd_size;
232 uint32_t port_fca_rp_private_size;
233 uint32_t port_fca_sol_els_private_size;
234 uint32_t port_fca_sol_ct_private_size;
236 /* in milliseconds */
237 uint32_t port_fca_abort_timeout;
239 fct_dbuf_store_t *port_fds;
240 fct_status_t (*port_get_link_info)(
241 struct fct_local_port *port, struct fct_link_info *li);
242 fct_status_t (*port_register_remote_port)(
243 struct fct_local_port *port, struct fct_remote_port *rp,
244 struct fct_cmd *login_els);
245 fct_status_t (*port_deregister_remote_port)(
246 struct fct_local_port *port, struct fct_remote_port *rp);
247 fct_status_t (*port_send_cmd)(fct_cmd_t *cmd);
248 fct_status_t (*port_xfer_scsi_data)(fct_cmd_t *cmd,
249 stmf_data_buf_t *dbuf, uint32_t flags);
250 fct_status_t (*port_send_cmd_response)(fct_cmd_t *cmd,
251 uint32_t ioflags);
252 fct_status_t (*port_abort_cmd)(struct fct_local_port *port,
253 fct_cmd_t *cmd, uint32_t flags);
254 void (*port_ctl)(struct fct_local_port *port,
255 int cmd, void *arg);
256 fct_status_t (*port_flogi_xchg)(struct fct_local_port *port,
257 struct fct_flogi_xchg *fx);
258 void (*port_populate_hba_details)(
259 struct fct_local_port *port, struct fct_port_attrs *port_attrs);
260 fct_status_t (*port_info)(uint32_t cmd,
261 struct fct_local_port *port, void *arg, uint8_t *buf,
262 uint32_t *bufsizep);
263 int port_fca_version;
264 } fct_local_port_t;
267 * Common struct used during FLOGI exchange.
269 typedef struct fct_flogi_xchg {
270 uint8_t fx_op; /* ELS_OP_FLOGI or ELS_OP_ACC/RJT */
271 uint8_t fx_rjt_reason;
272 uint8_t fx_rjt_expl;
273 uint8_t fx_sec_timeout; /* Timeout in seconds */
274 uint32_t fx_fport:1, /* 0=N_port, 1=F_port */
275 rsvd2:31;
276 uint32_t fx_sid; /* 24 bit SID to use */
277 uint32_t fx_did; /* 24 bit DID to use */
278 uint8_t fx_pwwn[8];
279 uint8_t fx_nwwn[8];
280 } fct_flogi_xchg_t;
282 typedef struct fct_link_info {
283 uint32_t portid;
284 uint8_t port_topology;
285 uint8_t port_speed;
287 uint8_t rsvd:5,
290 * FCA sets this bit to indicate that fct does not need to do FLOGI
291 * because either FCA did the FLOGI or it determined that its a private
292 * loop. Setting this bit by FCA is optional.
294 port_no_fct_flogi:1,
296 /* FCA sets this bit to indicate that it did FLOGI */
297 port_fca_flogi_done:1,
299 /* FCT sets this bit to indicate that it did FLOGI */
300 port_fct_flogi_done:1;
302 uint8_t rsvd1;
304 /* The fields below are only valid if someone did a successful flogi */
305 uint8_t port_rnwwn[8];
306 uint8_t port_rpwwn[8];
307 } fct_link_info_t;
309 typedef struct fct_port_stat {
310 kstat_named_t link_failure_cnt;
311 kstat_named_t loss_of_sync_cnt;
312 kstat_named_t loss_of_signals_cnt;
313 kstat_named_t prim_seq_protocol_err_cnt;
314 kstat_named_t invalid_tx_word_cnt;
315 kstat_named_t invalid_crc_cnt;
316 } fct_port_stat_t;
319 * port topology
321 #define PORT_TOPOLOGY_UNKNOWN 0
322 #define PORT_TOPOLOGY_PT_TO_PT 1
323 #define PORT_TOPOLOGY_PRIVATE_LOOP 2
324 #define PORT_TOPOLOGY_PUBLIC_LOOP 6
325 #define PORT_TOPOLOGY_FABRIC_PT_TO_PT 5
326 #define PORT_TOPOLOGY_FABRIC_BIT 4
328 #define PORT_FLOGI_DONE(li) (((li)->port_fca_flogi_done) || \
329 ((li)->port_fct_flogi_done))
332 * port speed
334 #define PORT_SPEED_UNKNOWN 0
335 #define PORT_SPEED_1G 1
336 #define PORT_SPEED_2G 2
337 #define PORT_SPEED_4G 4
338 #define PORT_SPEED_8G 8
339 #define PORT_SPEED_10G 16
340 #define PORT_SPEED_16G 32
341 #define PORT_SPEED_32G 64
344 * Abort commands
346 #define FCT_TERMINATE_CMD 1
349 * FCT port states.
351 #define FCT_STATE_OFFLINE 0
352 #define FCT_STATE_ONLINING 1
353 #define FCT_STATE_ONLINE 2
354 #define FCT_STATE_OFFLINING 3
357 * fct ctl commands. These should not conflict with stmf ctl commands
359 #define FCT_CMD_PORT_ONLINE (STMF_LPORT_CTL_CMDS | 0x01)
360 #define FCT_CMD_PORT_ONLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x02)
361 #define FCT_CMD_PORT_OFFLINE (STMF_LPORT_CTL_CMDS | 0x03)
362 #define FCT_CMD_PORT_OFFLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x04)
363 #define FCT_ACK_PORT_ONLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x05)
364 #define FCT_ACK_PORT_OFFLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x06)
365 #define FCT_CMD_FORCE_LIP (STMF_LPORT_CTL_CMDS | 0x07)
368 * IO flags for cmd flow.
370 #define FCT_IOF_FCA_DONE 0x10000
371 #define FCT_IOF_FORCE_FCA_DONE 0x20000
374 * Fill CTIU preamble
376 #ifdef lint
377 #define FCT_FILL_CTIU_PREAMBLE(x_payload, x_ctop) _NOTE(EMPTY)
378 #else
379 #define FCT_FILL_CTIU_PREAMBLE(x_payload, x_ctop) \
380 do { \
381 x_payload[0] = 0x01; \
382 x_payload[4] = 0xFC; \
383 x_payload[5] = 0x02; \
384 x_payload[8] = 0xFF & (x_ctop >> 8); \
385 x_payload[9] = 0xFF & (x_ctop); \
386 } while (0)
387 #endif
389 uint64_t fct_netbuf_to_value(uint8_t *buf, uint8_t nbytes);
390 void fct_value_to_netbuf(uint64_t value, uint8_t *buf, uint8_t nbytes);
391 void *fct_alloc(fct_struct_id_t struct_id, int additional_size, int flags);
392 void fct_free(void *ptr);
393 fct_cmd_t *fct_scsi_task_alloc(struct fct_local_port *port,
394 uint16_t rp_handle, uint32_t rportid, uint8_t *lun,
395 uint16_t cdb_length, uint16_t task_ext);
396 fct_status_t fct_register_local_port(fct_local_port_t *port);
397 fct_status_t fct_deregister_local_port(fct_local_port_t *port);
398 void fct_handle_event(fct_local_port_t *port, int event_id,
399 uint32_t event_flags, caddr_t arg);
400 void fct_post_rcvd_cmd(fct_cmd_t *cmd, stmf_data_buf_t *dbuf);
401 void fct_queue_cmd_for_termination(fct_cmd_t *cmd, fct_status_t s);
402 void fct_queue_scsi_task_for_termination(fct_cmd_t *cmd, fct_status_t s);
403 fct_cmd_t *fct_handle_to_cmd(fct_local_port_t *port, uint32_t fct_handle);
404 void fct_ctl(struct stmf_local_port *lport, int cmd, void *arg);
405 void fct_cmd_fca_aborted(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags);
406 uint16_t fct_get_rp_handle(fct_local_port_t *port, uint32_t rportid);
407 void fct_send_response_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags);
408 void fct_send_cmd_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags);
409 void fct_scsi_data_xfer_done(fct_cmd_t *cmd, stmf_data_buf_t *dbuf,
410 uint32_t ioflags);
411 fct_status_t fct_port_initialize(fct_local_port_t *port, uint32_t rflags,
412 char *additional_info);
413 fct_status_t fct_port_shutdown(fct_local_port_t *port, uint32_t rflags,
414 char *additional_info);
415 fct_status_t fct_handle_rcvd_flogi(fct_local_port_t *port,
416 fct_flogi_xchg_t *fx);
417 void fct_log_local_port_event(fct_local_port_t *port, char *subclass);
418 void fct_log_remote_port_event(fct_local_port_t *port, char *subclass,
419 uint8_t *rp_pwwn, uint32_t rp_id);
420 void fct_wwn_to_str(char *to_ptr, const uint8_t *from_ptr);
422 #ifdef __cplusplus
424 #endif
426 #endif /* _FCT_H */