41 #define FC_ELS_CMD_RJT 0x01
42 #define FC_ELS_CMD_ACC 0x02
43 #define FC_ELS_CMD_PLOGI 0x03
44 #define FC_ELS_CMD_FLOGI 0x04
45 #define FC_ELS_CMD_LOGO 0x05
46 #define FC_ELS_CMD_RRQ 0x12
47 #define FC_ELS_CMD_PRLI 0x20
48 #define FC_ELS_CMD_PRLO 0x21
49 #define FC_ELS_CMD_PDISC 0x50
50 #define FC_ELS_CMD_FDISC 0x51
51 #define FC_ELS_CMD_ADISC 0x52
52 #define FC_ELS_CMD_RSCN 0x61
53 #define FC_ELS_CMD_SCR 0x62
55 #define FC_TYPE_BASIC_LINK 0
56 #define FC_TYPE_FCP 0x08
57 #define FC_TYPE_NVME 0x28
58 #define FC_TYPE_GS 0x20
59 #define FC_TYPE_SW 0x22
61 #define FC_ADDR_FABRIC 0xfffffe
62 #define FC_ADDR_CONTROLLER 0xfffffd
63 #define FC_ADDR_IS_DOMAIN_CTRL(x) (((x) & 0xffff00) == 0xfffc00)
64 #define FC_ADDR_GET_DOMAIN_CTRL(x) ((x) & 0x0000ff)
65 #define FC_ADDR_NAMESERVER 0xfffffc
66 #define FC_ADDR_FDMI 0xfffffa
68 #define FC_GS_TYPE_ALIAS_SERVICE 0xf8
69 #define FC_GS_TYPE_MANAGEMENT_SERVICE 0xfa
70 #define FC_GS_TYPE_DIRECTORY_SERVICE 0xfc
71 #define FC_GS_TYPE_LOOPBACK 0x10
73 #define FC_GS_SUBTYPE_NAME_SERVER 0x02
74 #define FC_GS_SUBTYPE_FDMI 0x10
79 #define FC_GS_TYPE_WORD(type) ((type) >> 5)
80 #define FC_GS_TYPE_BIT(type) ((type) & 0x1f)
85 #define FC_GS_NAMESERVER_GPN_ID 0x0112
86 #define FC_GS_NAMESERVER_GNN_ID 0x0113
87 #define FC_GS_NAMESERVER_GFPN_ID 0x011c
88 #define FC_GS_NAMESERVER_GFF_ID 0x011f
89 #define FC_GS_NAMESERVER_GID_FT 0x0171
90 #define FC_GS_NAMESERVER_GID_PT 0x01a1
91 #define FC_GS_NAMESERVER_GA_NXT 0x0100
92 #define FC_GS_NAMESERVER_RHBA 0x0200
93 #define FC_GS_NAMESERVER_RPA 0x0211
94 #define FC_GS_NAMESERVER_RPN_ID 0x0212
95 #define FC_GS_NAMESERVER_RNN_ID 0x0213
96 #define FC_GS_NAMESERVER_RCS_ID 0x0214
97 #define FC_GS_NAMESERVER_RFT_ID 0x0217
98 #define FC_GS_NAMESERVER_RFF_ID 0x021f
99 #define FC_GS_NAMESERVER_RSNN_NN 0x0239
100 #define FC_GS_NAMESERVER_RSPN_ID 0x0218
106 #define FC_GS_FDMI_GRHL 0x100
107 #define FC_GS_FDMI_GHAT 0x101
108 #define FC_GS_FDMI_GRPL 0x102
109 #define FC_GS_FDMI_GPAT 0x110
110 #define FC_GS_FDMI_GPAS 0x120
111 #define FC_GS_FDMI_RHBA 0x200
112 #define FC_GS_FDMI_RHAT 0x201
113 #define FC_GS_FDMI_RPRT 0x210
114 #define FC_GS_FDMI_RPA 0x211
115 #define FC_GS_FDMI_DHBA 0x300
116 #define FC_GS_FDMI_DHAT 0x301
117 #define FC_GS_FDMI_DPRT 0x310
118 #define FC_GS_FDMI_DPA 0x311
120 #define FC_ELX_LOOPBACK_DATA 1
122 #define FC_GS_REVISION 0x03
124 #define FC_GS_IO_PARAMS { .fc_ct.r_ctl = 0x02, \
125 .fc_ct.type = FC_TYPE_GS, \
126 .fc_ct.df_ctl = 0x00 }
128 typedef struct fc_vft_header_s {
142 #if BYTE_ORDER == LITTLE_ENDIAN
143 static inline uint32_t
fc_be24toh(uint32_t x) {
return (ocs_be32toh(x) >> 8); }
145 static inline uint32_t
fc_be24toh(uint32_t x) { }
149 #define FC_SOFI3 0x2e
150 #define FC_SOFn3 0x36
157 typedef struct fc_header_s {
177 typedef struct fc_header_le_s {
178 #if BYTE_ORDER == LITTLE_ENDIAN
193 #error big endian version not defined
200 typedef struct fc_vm_header_s {
207 #define FC_DFCTL_DEVICE_HDR_16_MASK 0x1
208 #define FC_DFCTL_NETWORK_HDR_MASK 0x20
209 #define FC_DFCTL_ESP_HDR_MASK 0x40
210 #define FC_DFCTL_NETWORK_HDR_SIZE 16
211 #define FC_DFCTL_ESP_HDR_SIZE 0 //FIXME
213 #define FC_RCTL_FC4_DATA 0
214 #define FC_RCTL_ELS 2
215 #define FC_RCTL_BLS 8
217 #define FC_RCTL_INFO_UNCAT 0
218 #define FC_RCTL_INFO_SOL_DATA 1
219 #define FC_RCTL_INFO_UNSOL_CTRL 2
220 #define FC_RCTL_INFO_SOL_CTRL 3
221 #define FC_RCTL_INFO_UNSOL_DATA 4
222 #define FC_RCTL_INFO_DATA_DESC 5
223 #define FC_RCTL_INFO_UNSOL_CMD 6
224 #define FC_RCTL_INFO_CMD_STATUS 7
226 #define FC_FCTL_EXCHANGE_RESPONDER 0x800000
227 #define FC_FCTL_SEQUENCE_CONTEXT 0x400000
228 #define FC_FCTL_FIRST_SEQUENCE 0x200000
229 #define FC_FCTL_LAST_SEQUENCE 0x100000
230 #define FC_FCTL_END_SEQUENCE 0x080000
231 #define FC_FCTL_END_CONNECTION 0x040000
232 #define FC_FCTL_PRIORITY_ENABLE 0x020000
233 #define FC_FCTL_SEQUENCE_INITIATIVE 0x010000
234 #define FC_FCTL_FILL_DATA_BYTES_MASK 0x000003
239 #define FC_INFO_NOP 0x0
240 #define FC_INFO_ABTS 0x1
241 #define FC_INFO_RMC 0x2
243 #define FC_INFO_BA_ACC 0x4
244 #define FC_INFO_BA_RJT 0x5
245 #define FC_INFO_PRMT 0x6
248 #define FC_REASON_INVALID_COMMAND_CODE 0x01
249 #define FC_REASON_LOGICAL_ERROR 0x03
250 #define FC_REASON_LOGICAL_BUSY 0x05
251 #define FC_REASON_PROTOCOL_ERROR 0x07
252 #define FC_REASON_UNABLE_TO_PERFORM 0x09
253 #define FC_REASON_COMMAND_NOT_SUPPORTED 0x0b
254 #define FC_REASON_COMMAND_IN_PROGRESS 0x0e
255 #define FC_REASON_VENDOR_SPECIFIC 0xff
258 #define FC_EXPL_NO_ADDITIONAL 0x00
259 #define FC_EXPL_SPARAM_OPTIONS 0x01
260 #define FC_EXPL_SPARAM_INITIATOR 0x03
261 #define FC_EXPL_SPARAM_RECPIENT 0x05
262 #define FC_EXPL_SPARM_DATA_SIZE 0x07
263 #define FC_EXPL_SPARM_CONCURRENT 0x09
264 #define FC_EXPL_SPARM_CREDIT 0x0b
265 #define FC_EXPL_INV_PORT_NAME 0x0d
266 #define FC_EXPL_INV_NODE_NAME 0x0e
267 #define FC_EXPL_INV_COMMON_SPARAMS 0x0f
268 #define FC_EXPL_INV_ASSOC_HEADER 0x11
269 #define FC_EXPL_ASSOC_HDR_REQUIRED 0x13
270 #define FC_EXPL_INV_ORIGINATOR_S_ID 0x15
271 #define FC_EXPL_INV_X_ID_COMBINATION 0x17
272 #define FC_EXPL_COMMAND_IN_PROGRESS 0x19
273 #define FC_EXPL_NPORT_LOGIN_REQUIRED 0x1e
274 #define FC_EXPL_N_PORT_ID 0x1f
275 #define FC_EXPL_INSUFFICIENT_RESOURCES 0x29
276 #define FC_EXPL_UNABLE_TO_SUPPLY_DATA 0x2a
277 #define FC_EXPL_REQUEST_NOT_SUPPORTED 0x2c
278 #define FC_EXPL_INV_PAYLOAD_LEN 0x1d
279 #define FC_EXPL_INV_PORT_NODE_NAME 0x44
280 #define FC_EXPL_LOGIN_EXT_NOT_SUPPORTED 0x46
281 #define FC_EXPL_AUTH_REQUIRED 0x48
282 #define FC_EXPL_SCAN_VALUE_NOT_ALLOWED 0x50
283 #define FC_EXPL_SCAN_VALUE_NOT_SUPPORTED 0x51
284 #define FC_EXPL_NO_RESOURCES_ASSIGNED 0x52
285 #define FC_EXPL_MAC_ADDR_MODE_NOT_SUPPORTED 0x60
286 #define FC_EXPL_MAC_ADDR_INCORRECTLY_FORMED 0x61
287 #define FC_EXPL_VN2VN_PORT_NOT_IN_NEIGHBOR_SET 0x62
289 #define FC_EXPL_INV_X_ID 0x03
290 #define FC_EXPL_SEQUENCE_ABORTED 0x05
292 typedef struct fc_ba_acc_payload_s {
293 #define FC_SEQ_ID_VALID 0x80
294 #define FC_SEQ_ID_INVALID 0x00
295 uint32_t seq_id_validity:8,
300 uint32_t low_seq_cnt:16,
304 typedef struct fc_ba_rjt_payload_s {
305 uint32_t vendor_unique:8,
306 reason_explanation:8,
311 typedef struct fc_els_gen_s {
312 uint32_t command_code: 8,
316 #define FC_PLOGI_CSP_W1_BBSCN_CLEAR_MASK 0xFFFF0FFF
317 #define FC_PLOGI_CSP_W1_VALID_VENDOR_VER_LEVEL BIT(29)
318 #define OCS_FC_PLOGI_VENDOR_VERSION_EMLX_ID 0x454d4c58
320 typedef struct fc_plogi_playload_s {
321 uint32_t command_code: 8,
323 uint32_t common_service_parameters[4];
328 uint32_t class1_service_parameters[4];
329 uint32_t class2_service_parameters[4];
330 uint32_t class3_service_parameters[4];
331 uint32_t class4_service_parameters[4];
332 uint32_t vendor_version_level[4];
337 typedef struct fc_logo_payload_s {
338 uint32_t command_code: 8,
346 typedef struct fc_acc_payload_s {
347 uint32_t command_code: 8,
352 typedef struct fc_ls_rjt_payload_s {
353 uint32_t command_code:8,
361 typedef struct fc_prli_payload_s {
362 uint32_t command_code:8,
374 typedef struct fc_nvme_prli_payload_s {
375 uint32_t command_code:8,
389 typedef struct fc_prlo_payload_s {
390 uint32_t command_code:8,
401 typedef struct fc_prlo_acc_payload_s {
402 uint32_t command_code:8,
415 typedef struct fc_adisc_payload_s {
416 uint32_t command_code:8,
429 #define FC_PRLI_ORIGINATOR_PA_VALID 0x8000
430 #define FC_PRLI_RESPONDER_PA_VALID 0x4000
431 #define FC_PRLI_ESTABLISH_IMAGE_PAIR 0x2000
432 #define FC_PRLI_SERVICE_PARAM_INVALID 0x0800
433 #define FC_PRLI_REQUEST_EXECUTED 0x0100
436 #define FC_PRLI_TASK_RETRY_ID_REQ 0x0200
437 #define FC_PRLI_RETRY 0x0100
438 #define FC_PRLI_CONFIRMED_COMPLETION 0x0080
439 #define FC_PRLI_DATA_OVERLAY 0x0040
440 #define FC_PRLI_INITIATOR_FUNCTION 0x0020
441 #define FC_PRLI_TARGET_FUNCTION 0x0010
442 #define FC_PRLI_READ_XRDY_DISABLED 0x0002
443 #define FC_PRLI_WRITE_XRDY_DISABLED 0x0001
444 #define FC_PRLI_NVME_DISC_FUNCTION 0x0008
446 #define FC_PRLI_ACC_FCP_PAGE_LENGTH 16
447 #define FC_PRLI_ACC_NVME_PAGE_LENGTH 20
450 #define FC_PRLO_REQUEST_EXECUTED 0x0001
452 typedef struct fc_scr_payload_s {
453 uint32_t command_code:8,
459 #define FC_SCR_REG_FABRIC 1
460 #define FC_SCR_REG_NPORT 2
461 #define FC_SCR_REG_FULL 3
465 rscn_event_qualifier:4,
470 typedef struct fc_rscn_payload_s {
471 uint32_t command_code:8,
477 typedef struct fcct_iu_header_s {
478 #if BYTE_ORDER == LITTLE_ENDIAN
485 uint32_t cmd_rsp_code:16,
486 max_residual_size:16;
487 uint32_t fragment_id:8,
489 reason_code_explanation:8,
492 #error big endian version not defined
496 #define FCCT_REJECT_INVALID_COMMAND_CODE 1
497 #define FCCT_REJECT_INVALID_VERSION_LEVEL 2
498 #define FCCT_LOGICAL_ERROR 3
499 #define FCCT_INVALID_CT_IU_SIZE 4
500 #define FCCT_LOGICAL_BUSY 5
501 #define FCCT_PROTOCOL_ERROR 7
502 #define FCCT_UNABLE_TO_PERFORM 9
503 #define FCCT_COMMAND_NOT_SUPPORTED 0x0b
504 #define FCCT_FABRIC_PORT_NAME_NOT_REGISTERED 0x0c
505 #define FCCT_SERVER_NOT_AVAILABLE 0x0d
506 #define FCCT_SESSION_COULD_NOT_BE_ESTABLISHED 0x0e
507 #define FCCT_VENDOR_SPECIFIC_ERROR 0xff
509 #define FCCT_NO_ADDITIONAL_EXPLANATION 0
510 #define FCCT_AUTHORIZATION_EXCEPTION 0xf0
511 #define FCCT_AUTHENTICATION_EXCEPTION 0xf1
512 #define FCCT_DATA_BASE_FULL 0xf2
513 #define FCCT_DATA_BASE_EMPTY 0xf3
514 #define FCCT_PROCESSING_REQUEST 0xf4
515 #define FCCT_UNABLE_TO_VERIFY_CONNECTION 0xf5
516 #define FCCT_DEVICES_NOT_IN_COMMON_ZONE 0xf6
520 #if BYTE_ORDER == LITTLE_ENDIAN
524 #error big endian version not defined
530 #if BYTE_ORDER == LITTLE_ENDIAN
536 #error big endian version not defined
543 #if BYTE_ORDER == LITTLE_ENDIAN
547 #error big endian version not defined
555 #if BYTE_ORDER == LITTLE_ENDIAN
560 #error big endian version not defined
565 #define FCCT_CLASS_OF_SERVICE_F 0x1
566 #define FCCT_CLASS_OF_SERVICE_2 0x4
567 #define FCCT_CLASS_OF_SERVICE_3 0x8
571 #if BYTE_ORDER == LITTLE_ENDIAN
575 #error big endian version not defined
583 #if BYTE_ORDER == LITTLE_ENDIAN
586 char sym_node_name[1];
589 #error big endian version not defined
594 #define FCCT_HDR_CMDRSP_ACCEPT 0x8002
595 #define FCCT_HDR_CMDRSP_REJECT 0x8001
598 uint8_t type, uint8_t gs_subtype, uint16_t max_size)
631 typedef struct fcct_rftid_req_s {
634 uint32_t fc4_types[8];
637 #define FC4_FEATURE_TARGET (1U << 0)
638 #define FC4_FEATURE_INITIATOR (1U << 1)
639 #define FC4_FEATURE_NVME_DISC (1U << 2)
641 typedef struct fcct_rffid_req_s {
650 typedef union ocs_fdmi_attr_entry_u {
652 uint8_t attr_types[32];
653 uint8_t attr_string[256];
659 typedef struct ocs_fdmi_attr_block_s {
664 typedef struct fcct_fdmi_reg_port_list_s {
666 uint32_t port_entry[0];
669 typedef struct fcct_fdmi_rhba_req_s {
675 typedef struct fcct_fdmi_dereg_req_s {
680 typedef struct fcct_fdmi_rprt_req_s {
687 typedef struct fcct_fdmi_rpa_req_s {
689 uint32_t port_name[2];
694 typedef struct fcct_fdmi_grhl_req_s {
699 typedef struct fcct_fdmi_grhl_rsp_s {
705 typedef struct fcct_fdmi_grpl_req_s {
711 typedef struct fcct_fdmi_grpl_rsp_s {
717 typedef struct fcct_fdmi_ghat_req_s {
723 typedef struct fcct_fdmi_ghat_rsp_s {
729 typedef struct fcct_fdmi_gpat_req_s {
735 typedef struct fcct_fdmi_gpat_rsp_s {
740 typedef struct fcct_gnnid_req_s {
746 typedef struct fcct_gpnid_req_s {
752 typedef struct fcct_ganxt_req_s {
758 typedef struct fcct_gffid_req_s {
764 typedef struct fcct_gidft_req_s {
772 typedef struct fcct_gidpt_req_s {
774 uint32_t port_type:8,
780 typedef struct fcct_gnnid_acc_s {
785 typedef struct fcct_gpnid_acc_s {
790 typedef struct fcct_gffid_acc_s {
795 typedef struct fcct_gidft_acc_s {
803 typedef struct fcct_gidpt_acc_s {
811 #define FCCT_GID_PT_LAST_ID 0x80
812 #define FCCT_GIDPT_ID_MASK 0x00ffffff
815 typedef struct fcct_ganxt_acc_s {
816 uint32_t port_type:8,
820 uint8_t sym_port_name[255];
823 uint8_t sym_node_name[255];
827 uint8_t protocol_types[32];
831 typedef struct fcp_cmnd_iu_s {
834 uint8_t task_attribute:3,
840 additional_fcp_cdb_length:6;
842 uint8_t fcp_cdb_and_dl[20];
845 #define FCP_LUN_ADDRESS_METHOD_SHIFT 6
846 #define FCP_LUN_ADDRESS_METHOD_MASK 0xc0
847 #define FCP_LUN_ADDR_METHOD_PERIPHERAL 0x0
848 #define FCP_LUN_ADDR_METHOD_FLAT 0x1
849 #define FCP_LUN_ADDR_METHOD_LOGICAL 0x2
850 #define FCP_LUN_ADDR_METHOD_EXTENDED 0x3
852 #define FCP_LUN_ADDR_SIMPLE_MAX 0xff
853 #define FCP_LUN_ADDR_FLAT_MAX 0x3fff
855 #define FCP_TASK_ATTR_SIMPLE 0x0
856 #define FCP_TASK_ATTR_HEAD_OF_QUEUE 0x1
857 #define FCP_TASK_ATTR_ORDERED 0x2
858 #define FCP_TASK_ATTR_ACA 0x4
859 #define FCP_TASK_ATTR_UNTAGGED 0x5
861 #define FCP_QUERY_TASK_SET BIT(0)
862 #define FCP_ABORT_TASK_SET BIT(1)
863 #define FCP_CLEAR_TASK_SET BIT(2)
864 #define FCP_QUERY_ASYNCHRONOUS_EVENT BIT(3)
865 #define FCP_LOGICAL_UNIT_RESET BIT(4)
866 #define FCP_TARGET_RESET BIT(5)
867 #define FCP_CLEAR_ACA BIT(6)
870 #define FCP_MAX_SENSE_LEN 252
871 #define FCP_MAX_RSP_LEN 8
876 #define FCP_MAX_RSP_INFO_LEN FCP_MAX_SENSE_LEN
878 typedef struct fcp_rsp_iu_s {
880 uint8_t status_qualifier[2];
883 uint8_t fcp_resid[4];
884 uint8_t fcp_sns_len[4];
885 uint8_t fcp_rsp_len[4];
890 #define FCP_RSP_LEN_VALID BIT(0)
891 #define FCP_SNS_LEN_VALID BIT(1)
892 #define FCP_RESID_OVER BIT(2)
893 #define FCP_RESID_UNDER BIT(3)
894 #define FCP_CONF_REQ BIT(4)
895 #define FCP_BIDI_READ_RESID_OVER BIT(5)
896 #define FCP_BIDI_READ_RESID_UNDER BIT(6)
897 #define FCP_BIDI_RSP BIT(7)
900 #define FCP_TMF_COMPLETE 0x00
901 #define FCP_DATA_LENGTH_MISMATCH 0x01
902 #define FCP_INVALID_FIELD 0x02
903 #define FCP_DATA_RO_MISMATCH 0x03
904 #define FCP_TMF_REJECTED 0x04
905 #define FCP_TMF_FAILED 0x05
906 #define FCP_TMF_SUCCEEDED 0x08
907 #define FCP_TMF_INCORRECT_LUN 0x09
910 typedef struct fc_rsp_info_s {
911 uint8_t addl_rsp_info[3];
916 typedef struct fcp_xfer_rdy_iu_s {
917 uint8_t fcp_data_ro[4];
918 uint8_t fcp_burst_len[4];
922 #define MAX_ACC_REJECT_PAYLOAD (sizeof(fc_ls_rjt_payload_t) > sizeof(fc_acc_payload_t) ? sizeof(fc_ls_rjt_payload_t) : sizeof(fc_acc_payload_t))
fcct_fdmi_reg_port_list_t hba_list
uint8_t command_reference_number
fcct_fdmi_reg_port_list_t port_list
static uint32_t fc_htobe24(uint32_t x)
uint8_t sym_node_name_len
fcct_fdmi_reg_port_list_t port_list
ocs_fdmi_attr_entry_t entry
fcct_fdmi_reg_port_list_t port_list
#define FCP_MAX_RSP_INFO_LEN
static void fcct_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint8_t type, uint8_t gs_subtype, uint16_t max_size)
static void fcct_loopback_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint16_t max_size)
uint8_t sym_port_name_len
#define FC_GS_TYPE_LOOPBACK
static uint32_t fc_be24toh(uint32_t x)
uint8_t uint8_t task_management_flags
fc_plogi_payload_t fc_sparms_t