66 #define FDMI_ATTR_TYPE_LEN_SIZE 4
67 #define OCS_MAX_CT_SIZE (60 * 4096)
70 #define OCS_PORTSPEED_1GFC 0x00000001
71 #define OCS_PORTSPEED_2GFC 0x00000002
72 #define OCS_PORTSPEED_4GFC 0x00000008
73 #define OCS_PORTSPEED_8GFC 0x00000010
74 #define OCS_PORTSPEED_16GFC 0x00000020
75 #define OCS_PORTSPEED_32GFC 0x00000040
76 #define OCS_PORTSPEED_64GFC 0x00000400
77 #define OCS_PORTSPEED_128GFC 0x00000200
78 #define OCS_PORTSPEED_UNKNOWN 0x00008000
81 #define OCS_FDMI_PORTTYPE_UNKNOWN 0
82 #define OCS_FDMI_PORTTYPE_NPORT 1
83 #define OCS_FDMI_PORTTYPE_NLPORT 2
86 #define OCS_FDMI_PORTSTATE_OFFLINE 1
87 #define OCS_FDMI_PORTSTATE_ONLINE 2
111 ocs_log_debug(node->ocs,
">>> reenter !!\n");
142 node->sport->topology = topology;
158 ocs_node_t *tmp_node;
165 if (tmp_node != node) {
189 ocs_node_cb_t *cbdata = arg;
206 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
213 node_printf(node,
"p2p setup failed, shutting down node\n");
217 if (node->sport->p2p_winner) {
219 if (!node->sport->domain->attached) {
220 node_printf(node,
"p2p winner, domain not attached\n");
224 node_printf(node,
"p2p winner, domain already attached\n");
240 ocs_assert(!node->sport->domain->attached, NULL);
251 ocs_sport_t *sport = node->sport;
260 sport->display_name);
326 ocs_node_cb_t *cbdata = arg;
339 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
359 ocs_log_err(ocs,
"FDISC failed, shutting down sport\n");
411 if (node->sport->enable_rscn) {
515 ocs_node_cb_t *cbdata = arg;
531 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
578 node->attached = TRUE;
587 node->attached = FALSE;
663 ocs_node_cb_t *cbdata = arg;
679 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
726 node->attached = TRUE;
732 if (node->sport->is_vport) {
748 node->attached = FALSE;
801 node->attached = TRUE;
807 node->attached = FALSE;
855 if (ocs->enable_nvme_tgt) {
895 if (node->sport->enable_ini || node->sport->enable_tgt) {
900 if (node->sport->enable_rscn) {
953 if (node->sport->enable_rscn) {
993 ocs_node_cb_t *cbdata = arg;
1004 node->els_req_cnt--;
1016 node->els_req_cnt--;
1023 node_printf(node,
"RSCN received during GID_PT processing\n");
1024 node->rscn_pending = 1;
1049 node->els_req_cnt--;
1056 node->els_req_cnt--;
1062 node->rscn_pending = 1;
1098 if (!node->rscn_pending) {
1101 node_printf(node,
"RSCN pending, restart discovery\n");
1102 node->rscn_pending = 0;
1111 if ((ocs->tgt_rscn_delay_msec != 0) && !node->sport->enable_ini && node->sport->enable_tgt &&
1174 ocs_node_t *node = arg;
1177 ocs_del_timer(&node->gidpt_delay_timer);
1180 ocs_log_err(node->ocs,
"ocs_xport_control(OCS_XPORT_POST_NODE_EVENT) failed: %d\n", rc);
1208 ocs_assert(ocs->tgt_rscn_delay_msec != 0, NULL);
1214 delay_msec = ocs->tgt_rscn_delay_msec;
1215 if ((ocs_msectime() - node->time_last_gidpt_msec) < ocs->tgt_rscn_period_msec) {
1216 delay_msec = ocs->tgt_rscn_period_msec;
1225 node->time_last_gidpt_msec = ocs_msectime();
1232 ocs_log_debug(ocs,
"RSCN received while in GIDPT delay - no action\n");
1260 ocs_node_t *node = ctx->app;
1272 node->attached = TRUE;
1316 node->attached = TRUE;
1324 node->attached = FALSE;
1371 node->els_req_cnt--;
1402 ocs_node_cb_t *cbdata = arg;
1458 node->els_cmpl_cnt--;
1483 ocs_t *ocs = node->ocs;
1486 if (node->attached) {
1492 if (node->rnode.free_group) {
1494 node->node_group = NULL;
1495 node->rnode.free_group = FALSE;
1498 node_printf(node,
"Failed freeing HAL node, rc=%d\n", rc);
1523 ocs_node_t *node = NULL;
1601 uint64_t local_wwpn = sport->wwpn;
1603 uint64_t wwn_bump = 0;
1606 wwn_bump = ocs_strtoull(prop_buf, 0, 0);
1608 local_wwpn ^= wwn_bump;
1612 ocs_log_debug(sport->ocs,
"r: %08x %08x\n", ocs_be32toh(remote_sparms->
port_name_hi), ocs_be32toh(remote_sparms->
port_name_lo));
1613 ocs_log_debug(sport->ocs,
"l: %08x %08x\n", (uint32_t) (local_wwpn >> 32ll), (uint32_t) local_wwpn);
1615 if (remote_wwpn == local_wwpn) {
1616 ocs_log_warn(sport->ocs,
"WWPN of remote node [%08x %08x] matches local WWPN\n",
1617 (uint32_t) (local_wwpn >> 32ll), (uint32_t) local_wwpn);
1621 return (remote_wwpn > local_wwpn);
1656 ocs_sport_t *sport = node->sport;
1664 rnode =
ocs_node_find(sport, node->sport->p2p_remote_port_id);
1665 if (rnode != NULL) {
1668 node_printf(node,
"Node with fc_id x%x already exists\n", rnode->rnode.fc_id);
1672 rnode =
ocs_node_alloc(sport, sport->p2p_remote_port_id, FALSE, FALSE);
1673 if (rnode == NULL) {
1674 ocs_log_err(ocs,
"node alloc failed\n");
1684 if (node->rnode.fc_id == 0) {
1724 ocs_node_cb_t *cbdata = arg;
1766 ocs_node_cb_t *cbdata = arg;
1782 node->els_cmpl_cnt--;
1785 if (node->sport->p2p_winner) {
1787 if (node->sport->domain->attached &&
1788 !(node->sport->domain->domain_notify_pend)) {
1805 node_printf(node,
"FLOGI LS_ACC failed, shutting down\n");
1807 node->els_cmpl_cnt--;
1847 ocs_node_cb_t *cbdata = arg;
1858 node->els_req_cnt--;
1872 node_printf(node,
"PLOGI failed, shutting down\n");
1874 node->els_req_cnt--;
1883 if (node->ocs->external_loopback) {
1934 ocs_node_cb_t *cbdata = arg;
1964 node->els_req_cnt--;
1968 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
1983 node->els_req_cnt--;
2014 ocs_node_cb_t *cbdata = arg;
2029 node->attached = TRUE;
2030 switch (node->send_ls_acc) {
2034 node->ls_acc_io = NULL;
2049 node->attached = FALSE;
2153 if (fabctl == NULL) {
2155 if (fabctl == NULL) {
2184 ocs_node_t *newnode;
2185 ocs_sport_t *sport = node->sport;
2186 ocs_t *ocs = node->ocs;
2188 uint32_t port_count;
2190 ocs_node_t **active_nodes;
2191 uint32_t portlist_count;
2196 if (residual != 0) {
2197 ocs_log_debug(node->ocs,
"residual is %u words\n", residual);
2201 node_printf(node,
"GIDPT request failed: rsn %#x rsn_expl %#x\n",
2216 active_nodes = ocs_malloc(node->ocs, port_count *
sizeof(*active_nodes), OCS_M_NOWAIT | OCS_M_ZERO);
2217 if (active_nodes == NULL) {
2226 port_id = n->rnode.fc_id;
2234 active_nodes[i++] = n;
2241 for (i = 0; i < portlist_count; i ++) {
2244 for (j = 0; j < port_count; j ++) {
2245 if ((active_nodes[j] != NULL) && (port_id == active_nodes[j]->rnode.fc_id)) {
2246 active_nodes[j] = NULL;
2255 for (i = 0; i < port_count; i ++) {
2260 if (active_nodes[i] != NULL) {
2261 if ((node->sport->enable_ini && active_nodes[i]->targ) ||
2265 node_printf(node,
"GID_PT: skipping non-tgt port_id x%06x\n",
2266 active_nodes[i]->rnode.fc_id);
2270 ocs_free(ocs, active_nodes, port_count *
sizeof(*active_nodes));
2272 for(i = 0; i < portlist_count; i ++) {
2278 if (port_id != node->rnode.sport->fc_id && !
ocs_sport_find(sport->domain, port_id)) {
2282 if (node->sport->enable_ini && newnode->targ) {
2287 if (node->sport->enable_ini) {
2289 if (newnode == NULL) {
2290 ocs_log_err(ocs,
"ocs_node_alloc() failed\n");
2323 uint32_t grhl_len,
void *buf)
2325 uint32_t hostlist_count;
2333 if (residual != 0) {
2334 ocs_log_debug(node->ocs,
"residual is %u words\n", residual);
2338 node_printf(node,
"GRHL request failed: rsn x%x rsn_expl x%x\n",
2347 while (hostlist_count) {
2352 offset +=
sizeof(uint64_t);
2373 uint32_t grpl_len,
void *buf)
2375 uint32_t portlist_count;
2383 if (residual != 0) {
2384 ocs_log_debug(node->ocs,
"residual is %u words\n", residual);
2388 node_printf(node,
"GRPL request failed: rsn x%x rsn_expl x%x\n",
2397 while (portlist_count) {
2402 offset +=
sizeof(uint64_t);
2424 uint32_t ghat_len,
void *buf)
2426 uint32_t portlist_count;
2432 uint16_t attr_type, attr_len;
2433 uint32_t offset, num_attr_entries;
2437 if (residual != 0) {
2438 ocs_log_debug(node->ocs,
"residual is %u words\n", residual);
2442 node_printf(node,
"GHAT request failed: rsn x%x rsn_expl x%x\n",
2452 while (portlist_count) {
2457 offset +=
sizeof(uint64_t);
2465 num_attr_entries = ocs_be32toh(hba_attr_block->
num_entries);
2469 while (num_attr_entries) {
2472 attr_type = ocs_be16toh(attr_def->
attr_type);
2473 attr_len = ocs_be16toh(attr_def->
attr_len);
2475 switch (attr_type) {
2508 sizeof(hba_attr_info->
hw_ver)));
2526 sizeof(hba_attr_info->
fw_ver)));
2573 ocs_log_warn(node->ocs,
"Unrecognized HBA attribute(type: 0x%x)\n",
2600 uint32_t gpat_len,
void *buf)
2607 uint16_t attr_type, attr_len;
2608 uint32_t offset, num_attr_entries;
2611 if (residual != 0) {
2612 ocs_log_debug(node->ocs,
"residual is %u words\n", residual);
2616 node_printf(node,
"GPAT request failed: rsn x%x rsn_expl x%x\n",
2621 offset =
sizeof(gpat->
hdr);
2629 while (num_attr_entries) {
2632 attr_type = ocs_be16toh(attr_def->
attr_type);
2633 attr_len = ocs_be16toh(attr_def->
attr_len);
2635 switch (attr_type) {
2709 ocs_log_warn(node->ocs,
"Unrecognized HBA attribute(type: 0x%x)\n",
2735 ocs_t *ocs = sport->ocs;
2736 int32_t rnode_winner;
2740 if (rnode_winner == 1) {
2741 sport->p2p_remote_port_id = 0;
2742 sport->p2p_port_id = 0;
2743 sport->p2p_winner = FALSE;
2744 }
else if (rnode_winner == 0) {
2745 sport->p2p_remote_port_id = 2;
2746 sport->p2p_port_id = 1;
2747 sport->p2p_winner = TRUE;
2750 if (sport->ocs->external_loopback) {
2755 ocs_log_debug(ocs,
"External loopback mode enabled\n");
2756 sport->p2p_remote_port_id = 1;
2757 sport->p2p_port_id = 1;
2758 sport->p2p_winner = TRUE;
2760 ocs_log_warn(ocs,
"failed to determine p2p winner\n");
2761 return rnode_winner;
2782 ocs_t *ocs = node->ocs;
2783 ocs_sport_t *sport = node->sport;
2791 ocs_log_warn(ocs,
"can't find name server node\n");
2801 uint64_t wwnn = ocs_be64toh(sport->wwnn);
2804 memset(ae, 0,
sizeof(sport->wwnn));
2807 sizeof(sport->sli_wwnn));
2826 len += 4 - (len & 3);
2836 ocs_t *ocs = sport->ocs;
2838 uint32_t len, size, serialnum_len = 0;
2839 char *serialnum = NULL;
2846 serialnum_len = *serialnum++;
2848 ocs_strncpy(ae->
attr_string, serialnum, MIN(254, serialnum_len));
2850 len += 4 - (len & 3);
2860 ocs_t *ocs = sport->ocs;
2870 len += 4 - (len & 3);
2880 ocs_t *ocs = sport->ocs;
2890 len += 4 - (len & 3);
2902 ocs_t *ocs = sport->ocs;
2912 len += 4 - (len & 3);
2922 ocs_t *ocs = sport->ocs;
2929 ocs_strncpy(ae->
attr_string, ocs->fw_version, MIN(255, strlen(ocs->fw_version)));
2932 len += 4 - (len & 3);
2943 ocs_t *ocs = sport->ocs;
2949 ocs_strncpy(ae->
attr_string, ocs->fw_version, MIN(255, strlen(ocs->fw_version)));
2951 len += 4 - (len & 3);
2971 len += 4 - (len & 3);
2996 ocs_t *ocs = sport->ocs;
3004 "Emulex %s FV%s DV%s", ocs->model,ocs->fw_version,
3005 ocs->driver_version);
3008 len += 4 - (len & 3);
3052 memset(ae, 0,
sizeof(sport->sli_wwpn));
3054 ocs_memcpy(&ae->
attr_wwn, &sport->sli_wwpn,
3055 sizeof(sport->sli_wwpn));
3065 ocs_t *ocs = sport->ocs;
3072 ocs_strncpy(ae->
attr_string, ocs->fw_version, MIN(255, strlen(ocs->fw_version)));
3074 len += 4 - (len & 3);
3110 len += 4 - (len & 3);
3144 node->els_req_cnt--;
3148 ocs_log_debug(node->ocs,
"FDMI RHBA request got rejected curr HBA attrmask: 0x%x\n",
3149 node->sport->fdmi_hba_mask);
3202 node->els_req_cnt--;
3222 uint32_t expected_code, resp_status;
3229 if (node->sport->is_vport) {
3238 node->els_req_cnt--;
3241 ocs_log_debug(node->ocs,
"FDMI reg port request(cmd: 0x%x) curr Port attrmask: 0x%x\n",
3242 expected_code, node->sport->fdmi_port_mask);
3246 ocs_log_debug(node->ocs,
"Send regport with port attrmask: 0x%x\n",
3247 node->sport->fdmi_port_mask);
3292 node->els_req_cnt--;
3293 if (node->sport->is_vport) {
3336 ocs_t *ocs = sport->ocs;
3340 uint32_t supported_speeds = 0;
3358 speed.
value = 16000;
3362 speed.
value = 32000;
3366 speed.
value = 64000;
3370 speed.
value = 128000;
3376 ae->
attr_int = ocs_htobe32(supported_speeds);
3386 ocs_t *ocs = sport->ocs;
3397 switch (speed.
value) {
3437 uint16_t b2b_recv_data_size;
3447 ae->
attr_int = b2b_recv_data_size >> 16;
3448 ae->
attr_int = ocs_htobe32(b2b_recv_data_size);
3459 ocs_t *ocs = sport->ocs;
3470 len += 4 - (len & 3);
3489 len += 4 - (len & 3);
3501 uint64_t wwnn = ocs_be64toh(sport->wwnn);
3504 memset(ae, 0,
sizeof(sport->sli_wwnn));
3507 sizeof(sport->sli_wwnn));
3521 memset(ae, 0,
sizeof(sport->sli_wwpn));
3523 ocs_memcpy(&ae->
attr_wwn, &sport->sli_wwpn,
3524 sizeof(sport->sli_wwnn));
3540 len = ocs_snprintf(ae->
attr_string, 256,
"%d", sport->instance_index);
3541 len += (len & 3) ? (4 - (len & 3)) : 0;
3588 ocs_t *ocs = sport->ocs;
3595 ocs->domain->flogi_service_params;
3614 ocs_memset(ae, 0, 32);
3628 ocs_t *ocs = sport->ocs;
3656 ae->
attr_int = ocs_htobe32(sport->fc_id);
3686 node->els_req_cnt--;
3707 ocs_log_err(sport->ocs,
"failed to find FDMI node\n")
3715 ocs_log_err(sport->ocs,
"failed to send FDMI request\n");
uint32_t port_fabric_name_valid
void * __ocs_p2p_wait_domain_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point state machine: Wait for the domain attach to complete.
#define FC_GS_NAMESERVER_GA_NXT
void * __ocs_fabctl_wait_scr_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric controller node state machine: Wait for an SCR response from the fabric controller.
ocs_io_t * ocs_fdmi_send_rhba(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RHBA CT request.
ocs_io_t * ocs_send_scr(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send an SCR ELS command.
int ocs_fdmi_port_attr_fabric_wwpn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_active_fc4type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define FDMI_PORT_MASK_V2
#define OCS_PORTSPEED_2GFC
ocs_sport_t * ocs_sport_find(ocs_domain_t *domain, uint32_t d_id)
Find a SLI port object, given an FC_ID.
void * __ocs_p2p_wait_node_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point node state machine: Wait for a point-to-point node attach to complete.
int ocs_fdmi_hba_attr_num_ports(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_fdmi_dprt_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for DPRT response event.
int ocs_fdmi_hba_attr_bios_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static int32_t ocs_start_fabctl_node(ocs_sport_t *sport)
Start up the fabric controller node.
#define OCS_FDMI_PORTTYPE_NPORT
#define OCS_FDMI_PORTTYPE_UNKNOWN
int ocs_fdmi_hba_attr_model(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_ns_plogi_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Wait for a PLOGI response.
void * __ocs_ns_idle(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Idle state.
#define FC_GS_NAMESERVER_RFT_ID
void * __ocs_ns_wait_node_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Wait for a node attach completion.
#define OCS_PORTSPEED_16GFC
#define OCS_PORTSPEED_128GFC
#define enable_target_rscn(ocs)
#define RHBA_OPTION_ROM_VERSION
#define FC_ADDR_CONTROLLER
void * __ocs_fabctl_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric controller node state machine: Initial state.
uint32_t max_ct_payload_valid
fcct_fdmi_reg_port_list_t hba_list
uint32_t supported_cos_valid
uint8_t active_fc4_types[32]
#define FDMI_PORT_MASK_V1
int ocs_fdmi_port_attr_class(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define OCS_PORTSPEED_8GFC
#define FCCT_HDR_CMDRSP_ACCEPT
int32_t node_check_ct_req(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg, uint32_t cmd, ocs_node_common_func_t node_common_func, const char *funcname)
check CT request completion
#define OCS_NODEDB_PAUSE_NAMESERVER
#define RPRT_MAX_FRAME_SIZE
static void ocs_process_rscn(ocs_node_t *node, ocs_node_cb_t *cbdata)
Process the FABCTL node RSCN.
uint32_t supported_class_of_service
uint32_t node_symb_name_valid
#define FC_GS_NAMESERVER_GID_PT
int32_t ocs_sport_attach(ocs_sport_t *sport, uint32_t fc_id)
Request a SLI port attach.
void ocs_remote_node_group_free(ocs_remote_node_group_t *node_group)
Free a remote node group object.
int ocs_fdmi_hba_attr_fmw_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static int32_t ocs_process_gidpt_payload(ocs_node_t *node, fcct_gidpt_acc_t *gidpt, uint32_t gidpt_len)
Process the GIDPT payload.
static void gidpt_delay_timer_cb(void *arg)
Handle GIDPT delay timer callback.
void * __ocs_p2p_rnode_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point state machine: Remote node initialization state.
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
void * __ocs_fabric_flogi_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for an FLOGI response.
uint32_t supported_speed_valid
void * __ocs_ns_gidpt_delay(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Delayed GIDPT.
int32_t ocs_rnode_is_nport(fc_plogi_payload_t *remote_sparms)
Return TRUE if the remote node is an NPORT.
int ocs_fdmi_get_cmd(ocs_sport_t *sport, els_cb_t cb, void *cb_arg, ocs_fdmi_get_cmd_req_info_t *fdmi_cmd_req)
#define OCS_PORTSPEED_1GFC
#define RHBA_SERIAL_NUMBER
ocs_io_t * ocs_send_plogi_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a PLOGI accept response.
uint32_t max_frame_size_valid
static void ocs_node_accept_frames(ocs_node_t *node)
accept frames
static int32_t ocs_start_fdmi_node(ocs_sport_t *sport)
Start up the FDMI node.
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
#define RHBA_FIRMWARE_VERSION
#define FDMI_RHBA_MASK_V1
ocs_io_t * ocs_ns_send_rftid(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RFTID CT request.
int ocs_fdmi_port_attr_nportid(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static void * __ocs_fdmi_get_cmd_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for FDMI response event.
int ocs_fdmi_port_attr_wwpn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
uint32_t max_ct_payload_len
#define RPRT_SYM_PORTNAME
int ocs_fdmi_port_attr_os_devname(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int32_t ocs_node_attach(ocs_node_t *node)
Perform HAL call to attach a remote node.
#define RHBA_BIOS_VERSION
ocs_io_t * ocs_send_plogi(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, void(*cb)(ocs_node_t *node, ocs_node_cb_t *cbdata, void *arg), void *cbarg)
Format and send a PLOGI ELS command.
fcct_fdmi_reg_port_list_t port_list
void * __ocs_fdmi_wait_node_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
FDMI node state machine: Wait for a node attach completion.
void * __ocs_fabctl_wait_ls_acc_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric controller node state machine: Wait for LS_ACC.
int ocs_fdmi_hba_attr_bios_state(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams)
Display service parameters.
ocs_node_t * ocs_node_find(ocs_sport_t *sport, uint32_t port_id)
Find an FC node structure given the FC port ID.
fcct_fdmi_reg_port_list_t port_list
#define RHBA_MANUFACTURER
int ocs_fdmi_port_attr_max_frame(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_fdmi_idle(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
FDMI node state machine: FDMI node is idle.
ocs_io_t * ocs_fdmi_send_dereg_cmd(ocs_node_t *node, uint16_t dereg_code, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a FDMI dereg CT request.
uint64_t hba_identifier[MAX_FDMI_HBA_COUNT]
void ocs_node_init_device(ocs_node_t *node, int send_plogi)
Initialize device node.
#define FC_GS_NAMESERVER_RFF_ID
#define OCS_FDMI_PORTSTATE_ONLINE
void ocs_get_os_version_and_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
#define FCCT_GID_PT_LAST_ID
uint32_t os_name_ver_valid
ocs_io_t * ocs_fdmi_send_get_cmd(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg, ocs_fdmi_get_cmd_req_info_t *req_info)
Send a GHRL CT request.
void ocs_scsi_io_alloc_disable(ocs_node_t *node)
Disable IO allocation.
const char * ocs_sm_event_name(ocs_sm_event_t evt)
uint32_t num_disc_ports_valid
uint32_t num_port_entries
struct fcct_gidpt_acc_t::@7 port_list[1]
#define RHBA_DRIVER_VERSION
int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd,...)
Perform transport attach function.
ocs_hal_rtn_e ocs_hal_node_detach(ocs_hal_t *hal, ocs_remote_node_t *rnode)
Free a remote node object.
void * __ocs_ns_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Initialize.
int ocs_fdmi_hba_attr_ct_len(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void(* els_cb_t)(ocs_node_t *node, ocs_node_cb_t *cbdata, void *arg)
int32_t ocs_process_fdmi_grpl_payload(ocs_node_t *node, fcct_fdmi_grpl_rsp_t *grpl, uint32_t grpl_len, void *buf)
Process the GRPL acc payload.
uint64_t port_fabric_name
uint32_t num_port_attr_entries
#define OCS_FDMI_PORTSTATE_OFFLINE
#define FC_ADDR_IS_DOMAIN_CTRL(x)
uint32_t os_dev_name_valid
#define FDMI_RHBA_MASK_V2
#define RPRT_OS_DEVICE_NAME
void * __ocs_p2p_wait_plogi_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point node state machine: Wait for a PLOGI response as a point-to-point winner.
uint32_t vendor_info_valid
#define ocs_list_foreach_safe(list, item, nxt)
Iterate a linked list safely.
void ocs_d_send_prli_rsp(ocs_io_t *io, uint16_t ox_id, uint8_t fc_type)
Send response to PRLI.
int ocs_fdmi_hba_attr_symbolic_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_vport_fabric_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Initial state for a virtual port.
int ocs_fdmi_hba_attr_rom_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int32_t ocs_process_fdmi_ghat_payload(ocs_node_t *node, fcct_fdmi_ghat_rsp_t *ghat, uint32_t ghat_len, void *buf)
Process the GHAT acc payload.
int ocs_fdmi_hba_attr_drvr_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_ns_send_gidpt(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a GIDPT CT request.
int ocs_fdmi_hba_attr_fabric_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define OCS_PORTSPEED_4GFC
void * __ocs_fdmi_dhba_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for DHBA response event.
uint32_t serial_num_valid
static void * __ocs_fabric_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Handle the common fabric node events.
uint32_t model_name_valid
void * __ocs_fabctl_ready(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric controller node state machine: Ready.
void ocs_node_initiate_cleanup(ocs_node_t *node)
Initiate node IO cleanup.
void * __ocs_p2p_wait_flogi_acc_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point node state machine: Wait for the FLOGI accept completion.
uint64_t port_identifier[MAX_FDMI_PORT_COUNT]
void * __ocs_fabric_fdisc_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for an FDISC response.
int ocs_fdmi_hba_attr_vendor_info(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_fdmi_plogi_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
FDMI node state machine: Wait for a PLOGI response.
uint32_t active_fc_types_valid
void ocs_domain_attach(ocs_domain_t *domain, uint32_t s_id)
Initiator domain attach.
ocs_io_t * ocs_send_ls_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a generic LS_ACC response without a payload.
ocs_io_t * ocs_ns_send_rffid(ocs_node_t *node, uint8_t fc_type, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RFFID CT request.
void ocs_fabric_notify_topology(ocs_node_t *node)
Notify sport topology.
ocs_io_t * ocs_fdmi_send_reg_port(ocs_node_t *node, int req_code, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RPRT/RPA CT request.
#define RPRT_SUPPORTED_SPEED
uint32_t supported_fc_types_valid
static void ocs_sport_lock(ocs_sport_t *sport)
ocs_node_t * ocs_node_alloc(ocs_sport_t *sport, uint32_t port_id, uint8_t init, uint8_t targ)
Allocate an fc node structure and add to node list.
void ocs_node_pause(ocs_node_t *node, ocs_sm_function_t state)
Pause a node.
#define RHBA_MODEL_DESCRIPTION
int32_t ocs_process_fdmi_gpat_payload(ocs_node_t *node, fcct_fdmi_gpat_rsp_t *gpat, uint32_t gpat_len, void *buf)
Process the GPAT acc payload.
#define MAX_FDMI_HBA_COUNT
#define FCCT_CLASS_OF_SERVICE_3
#define RHBA_SYM_NODENAME
void * __ocs_fabric_idle(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Fabric node is idle.
void * __ocs_fabric_wait_attach_evt_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for a domain/sport/node attach completion, then shutdown.
int ocs_fdmi_hba_attr_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_sm_post_event(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *data)
Post an event to a context.
void * __ocs_ns_rffid_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for RFFID response event.
void * __ocs_fdmi_rhba_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for RHBA response event.
void * __ocs_fabctl_wait_node_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric controller node state machine: Wait for a node attach request to complete. ...
int32_t node_check_ct_resp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
int ocs_fdmi_port_attr_host_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
uint64_t port_identifier[MAX_FDMI_PORT_COUNT]
uint32_t boot_state_valid
void * __ocs_fdmi_reg_port_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
void * __ocs_fabric_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Initial state.
void * __ocs_ns_rftid_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Wait for an RFTID response event.
uint8_t port_symb_name[256]
static uint64_t ocs_get_wwpn(fc_plogi_payload_t *sp)
Return the node's WWPN as an uint64_t.
#define OCS_FC_ELS_DEFAULT_RETRIES
#define FCCT_HDR_CMDRSP_REJECT
void * __ocs_ns_nvme_rffid_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
#define RHBA_OS_NAME_VERSION
#define FC_ADDR_NAMESERVER
int ocs_fdmi_port_attr_speed(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_hba_attr_sn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define RPRT_SUPPORTED_CLASS
void * __ocs_fabric_wait_domain_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Wait for a domain/sport attach event.
#define FDMI_ATTR_TYPE_LEN_SIZE
uint8_t supported_fc4_types[32]
#define OCS_PORTSPEED_64GFC
ocs_io_t * ocs_bls_send_acc_hdr(ocs_io_t *io, fc_header_t *hdr)
Send a BA_ACC given the request's FC header.
int ocs_fdmi_hba_attr_description(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_node_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: common node event handler
#define std_node_state_decl(...)
void * __ocs_d_port_logged_in(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Port is logged in.
static void ocs_node_hold_frames(ocs_node_t *node)
hold frames in pending frame list
void ocs_fabric_set_topology(ocs_node_t *node, ocs_sport_topology_e topology)
Set sport topology.
uint8_t node_symb_name[256]
#define OCS_FDMI_PORTTYPE_NLPORT
#define RHBA_MAX_CT_PAYLOAD_LEN
uint32_t manufacturer_valid
int ocs_fdmi_port_attr_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_hba_attr_os_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_fdmi_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
FDMI node state machine: Initialize.
uint32_t port_symb_name_valid
uint32_t driver_ver_valid
uint32_t model_desc_valid
static void ocs_fabric_initiate_shutdown(ocs_node_t *node)
Initiate fabric node shutdown.
ocs_io_t * ocs_send_fdisc(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Format and send a FDISC ELS command.
#define RPRT_ACTIVE_FC4_TYPES
#define node_printf(node, fmt,...)
void ocs_domain_save_sparms(ocs_domain_t *domain, void *payload)
Save the port's service parameters.
int ocs_fdmi_hba_attr_vendor_id(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int32_t ocs_get_property(const char *prop_name, char *buffer, uint32_t buffer_len)
get driver wide property value
ocs_io_t * ocs_send_flogi(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Format and send a FLOGI ELS command.
uint32_t fabric_name_valid
#define ocs_assert(cond,...)
int ocs_fdmi_port_attr_fc4type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static uint32_t fc_be24toh(uint32_t x)
uint32_t opt_rom_ver_valid
int ocs_fdmi_port_attr_support_speed(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
uint32_t current_port_speed
void ocs_scsi_get_host_name(ocs_t *ocs, void *host_name, size_t size)
int ocs_fdmi_port_attr_symbolic_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int32_t ocs_xport_status(ocs_xport_t *xport, ocs_xport_status_e cmd, ocs_xport_stats_t *result)
Return status on a link.
#define OCS_PORTSPEED_UNKNOWN
#define ocs_list_foreach(list, item)
Iterate a linked list.
#define OCS_FC_ELS_CT_SEND_DEFAULT_TIMEOUT
void ocs_process_prli_payload(ocs_node_t *node, fc_prli_payload_t *prli)
Process the PRLI payload.
int32_t node_check_els_req(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg, uint8_t cmd, ocs_node_common_func_t node_common_func, const char *funcname)
check ELS request completion
#define OCS_FC_FLOGI_TIMEOUT_SEC
#define MAX_FDMI_PORT_COUNT
static int32_t ocs_rnode_is_winner(ocs_sport_t *sport)
Return TRUE if the remote node is the point-to-point winner.
uint32_t port_state_valid
static int32_t ocs_start_ns_node(ocs_sport_t *sport)
Start up the name services node.
void * ocs_scsi_get_property_ptr(ocs_t *ocs, ocs_scsi_property_e prop)
Return a property pointer.
void ocs_get_os_host_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
static void ocs_sport_unlock(ocs_sport_t *sport)
#define RHBA_HARDWARE_VERSION
void * __ocs_ns_gidpt_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Name services node state machine: Wait for a GIDPT response.
#define OCS_PORTSPEED_32GFC
void ocs_node_save_sparms(ocs_node_t *node, void *payload)
save node service parameters
#define RPRT_SUPPORTED_FC4_TYPES
void * __ocs_p2p_wait_plogi_rsp_recvd_prli(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point node state machine: Waiting on a response for a sent PLOGI.
uint32_t current_speed_valid
int ocs_fdmi_hba_attr_manufacturer(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_port_type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
uint32_t common_service_parameters[4]
#define OCS_FC_ELS_SEND_DEFAULT_TIMEOUT
void * __ocs_ns_ganxt_wait_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
int32_t ocs_p2p_setup(ocs_sport_t *sport)
Set up the domain point-to-point parameters.
int32_t ocs_process_fdmi_grhl_payload(ocs_node_t *node, fcct_fdmi_grhl_rsp_t *grhl, uint32_t grhl_len, void *buf)
Process the GRHL acc payload.
int ocs_fdmi_port_attr_port_state(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_send_ls_acc_after_attach(ocs_io_t *io, fc_header_t *hdr, ocs_node_send_ls_acc_e ls)
Save the OX_ID for sending LS_ACC sometime later.