53 void *arg_out, uint32_t arg_out_length,
void *
object);
56 uint32_t fdmi_cmd_code);
91 ocs_sli_port_t *sport = data;
95 ocs_log_debug(ocs,
"OCS_HAL_PORT_ALLOC_OK\n");
99 ocs_log_debug(ocs,
"OCS_HAL_PORT_ALLOC_FAIL\n");
103 ocs_log_debug(ocs,
"OCS_HAL_PORT_ATTACH_OK\n");
107 ocs_log_debug(ocs,
"OCS_HAL_PORT_ATTACH_FAIL\n");
111 ocs_log_debug(ocs,
"OCS_HAL_PORT_FREE_OK\n");
115 ocs_log_debug(ocs,
"OCS_HAL_PORT_FREE_FAIL\n");
119 ocs_log_test(ocs,
"unknown event %#x\n", event);
144 ocs_sport_alloc(ocs_domain_t *domain, uint64_t wwpn, uint64_t wwnn, uint32_t fc_id, uint8_t enable_ini, uint8_t enable_tgt)
156 ocs_log_test(domain->ocs,
"Failed: SPORT %016" PRIx64
" %016" PRIx64
" already allocated\n",
162 sport = ocs_malloc(domain->ocs,
sizeof(*sport), OCS_M_NOWAIT | OCS_M_ZERO);
164 sport->ocs = domain->ocs;
165 ocs_snprintf(sport->display_name,
sizeof(sport->display_name),
"------");
166 sport->domain = domain;
167 sport->lookup =
spv_new(domain->ocs);
168 sport->instance_index = domain->sport_instance_count++;
171 sport->sm.app = sport;
172 sport->enable_ini = enable_ini;
173 sport->enable_tgt = enable_tgt;
174 sport->enable_rscn = (sport->enable_ini || (sport->enable_tgt &&
enable_target_rscn(sport->ocs)));
175 sport->unreg_rpi_all = FALSE;
178 ocs_memcpy(sport->service_params, domain->service_params,
sizeof(
fc_plogi_payload_t));
181 sport->fc_id = fc_id;
186 ocs_snprintf(sport->wwnn_str,
sizeof(sport->wwnn_str),
"%016" PRIX64, wwnn);
189 ocs_lock_init(sport->ocs, &sport->node_group_lock,
"node_group_lock[%d]", sport->instance_index);
190 ocs_list_init(&sport->node_group_dir_list, ocs_node_group_dir_t, link);
195 domain->sport = sport;
204 ocs_log_debug(domain->ocs,
"[%s] allocate sport\n", sport->display_name);
224 ocs_sport_t *sport = (ocs_sport_t *)arg;
225 ocs_domain_t *domain;
226 ocs_node_group_dir_t *node_group_dir;
227 ocs_node_group_dir_t *node_group_dir_next;
228 int post_all_free = FALSE;
231 domain = sport->domain;
232 ocs_log_debug(domain->ocs,
"[%s] free sport\n", sport->display_name);
237 sport->lookup = NULL;
239 ocs_lock(&domain->lookup_lock);
241 spv_set(domain->lookup, sport->fc_id, NULL);
242 ocs_unlock(&domain->lookup_lock);
245 if (sport == domain->sport) {
246 domain->sport = NULL;
254 post_all_free = TRUE;
258 ocs_lock(&sport->node_group_lock);
260 ocs_unlock(&sport->node_group_lock);
262 ocs_lock(&sport->node_group_lock);
264 ocs_unlock(&sport->node_group_lock);
273 ocs_lock_free(&sport->node_group_lock);
275 ocs_free(domain->ocs, sport,
sizeof(*sport));
283 ocs_assert(ocs_ref_read_count(&sport->ref) > 0);
284 ocs_ref_put(&sport->ref);
315 if (sport->is_vport) {
342 if (sport->instance_index == index) {
370 ocs_lock(&domain->lookup_lock);
371 if (domain->lookup == NULL) {
372 ocs_log_test(domain->ocs,
"assertion failed: domain->lookup is not valid\n");
373 ocs_unlock(&domain->lookup_lock);
377 sport =
spv_get(domain->lookup, d_id);
378 ocs_unlock(&domain->lookup_lock);
399 ocs_sport_t *sport = NULL;
403 if ((sport->wwnn == wwnn) && (sport->wwpn == wwpn)) {
432 ocs_lock(&sport->domain->lookup_lock);
433 spv_set(sport->domain->lookup, fc_id, sport);
434 ocs_unlock(&sport->domain->lookup_lock);
443 ocs_log_debug(sport->ocs,
"[%s] attach sport: fc_id x%06x\n", sport->display_name, fc_id);
447 ocs_log_err(sport->ocs,
"ocs_hal_port_attach failed: %d\n", rc);
456 #define std_sport_state_decl() \
457 ocs_sport_t *sport = NULL; \
458 ocs_domain_t *domain = NULL; \
461 ocs_assert(ctx, NULL); \
463 ocs_assert(sport, NULL); \
465 domain = sport->domain; \
466 ocs_assert(domain, NULL); \
468 ocs_assert(ocs, NULL);
473 #define sport_sm_trace(sport) \
475 if (OCS_LOG_ENABLE_DOMAIN_SM_TRACE(ocs)) \
476 ocs_log_debug(ocs, "[%s] %-20s\n", sport->display_name, ocs_sm_event_name(evt)); \
510 ocs_node_t *node_next;
514 sport->shutting_down = 1;
523 if (node_list_empty) {
526 ocs_lock(&domain->lookup_lock);
527 spv_set(domain->lookup, sport->fc_id, NULL);
528 ocs_unlock(&domain->lookup_lock);
532 ocs_log_err(ocs,
"ocs_hal_port_free failed\n");
534 bool unreg_rpi_all_now = TRUE;
543 if (node->attached && !node->unreg_rpi) {
544 node->unreg_rpi = TRUE;
545 sport->unreg_rpi_all = TRUE;
558 ocs_log_debug(ocs,
"[%s] sport shutdown vport, sending logo to node\n",
562 0, NULL, NULL) == NULL) {
568 unreg_rpi_all_now = FALSE;
577 if (sport->unreg_rpi_all && unreg_rpi_all_now)
585 ocs_log_test(sport->ocs,
"[%s] %-20s %-20s not handled\n", sport->display_name, funcname,
ocs_sm_event_name(evt));
653 uint64_t be_wwpn = ocs_htobe64(sport->wwpn);
655 if (sport->wwpn == 0) {
656 ocs_log_debug(ocs,
"vport: letting f/w select WWN\n");
659 if (sport->fc_id != UINT32_MAX) {
660 ocs_log_debug(ocs,
"vport: hard coding port id: %x\n", sport->fc_id);
666 (sport->wwpn == 0) ? NULL : (uint8_t *)&be_wwpn)) {
667 ocs_log_err(ocs,
"Can't allocate port\n");
708 if (sport->wwnn == 0) {
709 sport->wwnn = ocs_be64toh(sport->sli_wwnn);
710 sport->wwpn = ocs_be64toh(sport->sli_wwpn);
711 ocs_snprintf(sport->wwnn_str,
sizeof(sport->wwnn_str),
"%016" PRIX64, sport->wwpn);
715 sp->
port_name_hi = ocs_htobe32((uint32_t) (sport->wwpn >> 32ll));
717 sp->
node_name_hi = ocs_htobe32((uint32_t) (sport->wwnn >> 32ll));
724 if (sport->fc_id == UINT32_MAX) {
726 if (fabric == NULL) {
727 ocs_log_err(ocs,
"ocs_node_alloc() failed\n");
732 ocs_snprintf(sport->wwnn_str,
sizeof(sport->wwnn_str),
"%016" PRIX64, sport->wwpn);
772 if (!(domain->femul_enable)) {
817 ocs_log_debug(ocs,
"[%s] SPORT attached WWPN %016" PRIx64
" WWNN %016" PRIx64
"\n", sport->display_name,
818 sport->wwpn, sport->wwnn);
824 sport->tgt_id = sport->fc_id;
825 if (ocs->enable_ini) {
828 if (ocs->enable_tgt) {
832 if (sport->is_vport) {
836 #if defined(ENABLE_FABRIC_EMULATION)
838 if (domain->femul_enable) {
839 ocs_femul_sport_attach(sport);
842 if (ocs_atomic_read(&domain->femul_count)) {
843 if (ocs_atomic_sub_return(&domain->femul_count, 1) == 1) {
844 ocs_femul_ports_attached(domain);
854 ocs_log_debug(ocs,
"[%s] SPORT deattached WWPN %016" PRIx64
" WWNN %016" PRIx64
"\n", sport->display_name,
855 sport->wwpn, sport->wwnn);
856 if (ocs->enable_ini) {
859 if (ocs->enable_tgt) {
902 ocs_lock(&domain->lookup_lock);
903 spv_set(domain->lookup, sport->fc_id, NULL);
904 ocs_unlock(&domain->lookup_lock);
908 ocs_log_err(ocs,
"ocs_hal_port_free failed\n");
971 ocs_t *ocs = domain->ocs;
972 ocs_xport_t *xport = ocs->xport;
973 ocs_vport_spec_t *vport;
974 ocs_vport_spec_t *next;
980 if (vport->domain_instance == domain->instance_index &&
981 vport->sport == NULL) {
982 #if defined(ENABLE_FABRIC_EMULATION)
983 if (domain->femul_enable) {
984 vport->fc_id = ocs_femul_portid_alloc(domain);
988 vport->sport = sport =
ocs_sport_alloc(domain, vport->wwpn, vport->wwnn, vport->fc_id,
989 vport->enable_ini, vport->enable_tgt);
994 sport->tgt_data = vport->tgt_data;
995 sport->ini_data = vport->ini_data;
1019 ocs_t *ocs = sport->ocs;
1020 ocs_xport_t *xport = ocs->xport;
1021 ocs_vport_spec_t *vport;
1025 if (vport->sport == sport) {
1026 vport->sport = NULL;
1058 uint32_t fc_id, uint8_t ini, uint8_t tgt,
void *tgt_data,
1059 void *ini_data, uint8_t restore_vport)
1063 if (ini && (domain->ocs->enable_ini == 0)) {
1064 ocs_log_test(domain->ocs,
"driver initiator functionality not enabled\n");
1068 if (tgt && (domain->ocs->enable_tgt == 0)) {
1069 ocs_log_test(domain->ocs,
"driver target functionality not enabled\n");
1074 if (restore_vport) {
1076 ocs_log_test(domain->ocs,
"failed to create vport object entry\n");
1085 if (sport == NULL) {
1089 sport->is_vport = 1;
1090 sport->tgt_data = tgt_data;
1091 sport->ini_data = ini_data;
1117 ocs_xport_t *xport = ocs->xport;
1120 ocs_vport_spec_t *vport;
1121 ocs_vport_spec_t *next;
1125 if (domain == NULL) {
1128 instance = domain->instance_index;
1134 if ((vport->domain_instance == instance) &&
1135 (vport->wwpn == wwpn) && (vport->wwnn == wwnn)) {
1137 ocs_free(ocs, vport,
sizeof(*vport));
1143 if (domain == NULL) {
1150 if ((sport->wwpn == wwpn) && (sport->wwnn == wwnn)) {
1177 ocs_xport_t *xport = ocs->xport;
1178 ocs_vport_spec_t *vport;
1179 ocs_vport_spec_t *next;
1184 ocs_free(ocs, vport,
sizeof(*vport));
1206 ocs_node_group_dir_t *node_group_dir;
1215 ocs_ddump_value(textbuf,
"shutting_down",
"%d", sport->shutting_down);
1219 ocs_ddump_value(textbuf,
"p2p_remote_port_id",
"%06x", sport->p2p_remote_port_id);
1232 ocs_lock(&sport->node_group_lock);
1234 ocs_remote_node_group_t *remote_node_group;
1238 ocs_ddump_value(textbuf,
"node_group_list_count",
"%d", node_group_dir->node_group_list_count);
1242 ocs_ddump_value(textbuf,
"indicator",
"x%x", remote_node_group->indicator);
1244 ocs_ddump_value(textbuf,
"instance_index",
"x%x", remote_node_group->instance_index);
1249 ocs_unlock(&sport->node_group_lock);
1279 ocs_sport_t *sport = (ocs_sport_t *)
object;
1302 if ((node->mgmt_functions) && (node->mgmt_functions->get_list_handler)) {
1303 node->mgmt_functions->get_list_handler(textbuf, node);
1317 ocs_sport_t *sport = (ocs_sport_t *)
object;
1323 snprintf(qualifier,
sizeof(qualifier),
"%s/sport[%d]", parent, sport->instance_index);
1326 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
1327 char *unqualified_name = name + strlen(qualifier) +1;
1330 if (ocs_strcmp(unqualified_name,
"indicator") == 0) {
1333 }
else if (ocs_strcmp(unqualified_name,
"fc_id") == 0) {
1336 }
else if (ocs_strcmp(unqualified_name,
"index") == 0) {
1339 }
else if (ocs_strcmp(unqualified_name,
"display_name") == 0) {
1342 }
else if (ocs_strcmp(unqualified_name,
"is_vport") == 0) {
1345 }
else if (ocs_strcmp(unqualified_name,
"enable_ini") == 0) {
1348 }
else if (ocs_strcmp(unqualified_name,
"enable_tgt") == 0) {
1351 }
else if (ocs_strcmp(unqualified_name,
"p2p_winner") == 0) {
1354 }
else if (ocs_strcmp(unqualified_name,
"p2p_port_id") == 0) {
1357 }
else if (ocs_strcmp(unqualified_name,
"p2p_remote_port_id") == 0) {
1360 }
else if (ocs_strcmp(unqualified_name,
"wwpn") == 0) {
1363 }
else if (ocs_strcmp(unqualified_name,
"wwnn") == 0) {
1370 if ((node->mgmt_functions) && (node->mgmt_functions->get_handler)) {
1371 retval = node->mgmt_functions->get_handler(textbuf, qualifier, name, node);
1391 ocs_sport_t *sport = (ocs_sport_t *)
object;
1410 if ((node->mgmt_functions) && (node->mgmt_functions->get_all_handler)) {
1411 node->mgmt_functions->get_all_handler(textbuf, node);
1423 ocs_sport_t *sport = (ocs_sport_t *)
object;
1427 snprintf(qualifier,
sizeof(qualifier),
"%s/sport[%d]", parent, sport->instance_index);
1430 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
1435 if ((node->mgmt_functions) && (node->mgmt_functions->set_handler)) {
1436 retval = node->mgmt_functions->set_handler(qualifier, name, value, node);
1448 typedef struct ocs_fdmi_get_cmd_results_s {
1464 ocs_t *ocs = node->ocs;
1488 ocs_log_err(ocs,
"Unsupported FDMI command code(0x%x)\n", result->
fdmi_cmd_code);
1491 ocs_log_err(ocs,
"failed to process FDMI response payload\n");
1494 if (sport_exec_args) {
1497 ocs_log_err(ocs,
"Failed to copy resp to user buffer\n");
1501 sport_exec_args->
exec_cb(node->sport, sport_exec_args);
1504 ocs_free(ocs, result,
sizeof(*result));
1521 uint32_t fdmi_cmd_code)
1526 ocs_t *ocs = sport->ocs;
1527 uint64_t identifier = 0;
1528 void *in_buf = sport_exec_args->
arg_in;
1533 wwpn = ocs_malloc(sport->ocs, in_buf_len, OCS_M_ZERO | OCS_M_NOWAIT);
1535 ocs_log_err(sport->ocs,
"failed to allocate memory\n");
1539 if (ocs_copy_from_user(wwpn, (uint8_t *)in_buf, in_buf_len)) {
1540 ocs_log_err(ocs,
"copy from user is failed\n");
1541 ocs_free(ocs, wwpn, in_buf_len);
1546 result = ocs_malloc(ocs,
sizeof(*result),
1547 OCS_M_ZERO | OCS_M_NOWAIT);
1548 if (result == NULL) {
1549 ocs_log_err(ocs,
"failed to allocate memory\n");
1550 ocs_free(ocs, wwpn, in_buf_len);
1555 switch (fdmi_cmd_code) {
1576 ocs_log_err(ocs,
"Unsupported FDMI cmd code: 0x%x\n", fdmi_cmd_code);
1577 ocs_free(ocs, wwpn, in_buf_len);
1578 ocs_free(ocs, result,
sizeof(*result));
1583 OCS_M_ZERO | OCS_M_NOWAIT);
1585 ocs_log_err(ocs,
"failed to allocate memory for fdmi_get_cmd_rsp_buf\n");
1586 ocs_free(ocs, wwpn, in_buf_len);
1587 ocs_free(ocs, result,
sizeof(*result));
1593 fdmi_cmd_req.
cmd_code = fdmi_cmd_code;
1598 ocs_log_err(ocs,
"Failed to submit FDMI get cmd(0x%x) ELS IO\n", fdmi_cmd_code);
1604 ocs_free(ocs, wwpn, in_buf_len);
1612 if (sport_exec_args) {
1614 ocs_free(sport->ocs, sport_exec_args,
sizeof(*sport_exec_args));
1615 domain_exec_args->
exec_cb(sport->domain, domain_exec_args);
1621 void *arg_out, uint32_t arg_out_length,
void *
object)
1624 ocs_sport_t *sport = (ocs_sport_t *)
object;
1629 snprintf(qualifier,
sizeof(qualifier),
"%s/sport[%d]", parent, sport->instance_index);
1632 if (ocs_strncmp(action, qualifier, strlen(qualifier)) == 0) {
1633 char *unqualified_name = action + strlen(qualifier) + 1;
1636 if (ocs_strcmp(unqualified_name,
"get_fdmi_hba_list") == 0) {
1638 }
else if (ocs_strcmp(unqualified_name,
"get_fdmi_hba_info") == 0) {
1640 }
else if (ocs_strcmp(unqualified_name,
"get_fdmi_port_list") == 0) {
1642 }
else if (ocs_strcmp(unqualified_name,
"get_fdmi_port_info") == 0) {
1648 if ((node->mgmt_functions) && (node->mgmt_functions->exec_handler)) {
1649 retval = node->mgmt_functions->exec_handler(qualifier, action, arg_in, arg_in_length,
1650 arg_out, arg_out_length, node);
1679 ocs_t *ocs = sport->ocs;
1680 ocs_xport_t *xport = ocs->xport;
1681 ocs_vport_spec_t *vport;
1685 if (vport->sport == sport) {
1686 vport->wwnn = sport->wwnn;
1687 vport->wwpn = sport->wwpn;
1688 vport->tgt_data = sport->tgt_data;
1689 vport->ini_data = sport->ini_data;
1716 ocs_vport_create_spec(ocs_t *ocs, uint64_t wwnn, uint64_t wwpn, uint32_t fc_id, uint32_t enable_ini, uint32_t enable_tgt,
void *tgt_data,
void *ini_data)
1718 ocs_xport_t *xport = ocs->xport;
1719 ocs_vport_spec_t *vport;
1724 if ((wwpn && (vport->wwpn == wwpn)) && (wwnn && (vport->wwnn == wwnn))) {
1725 ocs_log_test(ocs,
"Failed: VPORT %016" PRIx64
" %016" PRIx64
" already allocated\n",
1731 vport = ocs_malloc(ocs,
sizeof(*vport), OCS_M_ZERO | OCS_M_NOWAIT);
1732 if (vport == NULL) {
1733 ocs_log_err(ocs,
"ocs_malloc failed\n");
1739 vport->fc_id = fc_id;
1740 vport->domain_instance = 0;
1741 vport->enable_tgt = enable_tgt;
1742 vport->enable_ini = enable_ini;
1743 vport->tgt_data = tgt_data;
1744 vport->ini_data = ini_data;
1770 and8(uint8_t *a, uint8_t *b, uint8_t *c, uint32_t n)
1774 for (i = 0; i < n; i ++) {
1818 uint8_t *sp3 = (uint8_t*) &sparms_cmp_mask;
1821 v = ((int)(sp1[i] & sp3[i])) - ((
int)(sp2[i] & sp3[i]));
1842 ocs_node_group_dir_t *
1845 ocs_node_group_dir_t *node_group_dir;
1847 node_group_dir = ocs_malloc(sport->ocs,
sizeof(*node_group_dir), OCS_M_ZERO | OCS_M_NOWAIT);
1848 if (node_group_dir != NULL) {
1849 node_group_dir->sport = sport;
1851 ocs_lock(&sport->node_group_lock);
1852 node_group_dir->instance_index = sport->node_group_dir_next_instance++;
1854 ocs_list_init(&node_group_dir->node_group_list, ocs_remote_node_group_t, link);
1856 node_group_dir->node_group_list_count = 0;
1857 node_group_dir->next_idx = 0;
1859 ocs_unlock(&sport->node_group_lock);
1861 ocs_log_debug(sport->ocs,
"[%s] [%d] allocating node group directory\n", sport->display_name,
1862 node_group_dir->instance_index);
1864 return node_group_dir;
1883 if (node_group_dir != NULL) {
1884 sport = node_group_dir->sport;
1885 ocs_log_debug(sport->ocs,
"[%s] [%d] freeing node group directory\n", sport->display_name,
1886 node_group_dir->instance_index);
1887 ocs_lock(&sport->node_group_lock);
1889 ocs_log_test(sport->ocs,
"[%s] WARNING: node group list not empty\n", sport->display_name);
1892 ocs_unlock(&sport->node_group_lock);
1893 ocs_free(sport->ocs, node_group_dir,
sizeof(*node_group_dir));
1911 ocs_node_group_dir_t *
1914 ocs_node_group_dir_t *node_dir = NULL;
1916 ocs_lock(&sport->node_group_lock);
1919 ocs_unlock(&sport->node_group_lock);
1923 ocs_unlock(&sport->node_group_lock);
1939 ocs_remote_node_group_t *
1944 ocs_remote_node_group_t *node_group;
1949 ocs_assert(node_group_dir->sport->ocs, NULL);
1951 sport = node_group_dir->sport;
1955 node_group = ocs_malloc(ocs,
sizeof(*node_group), OCS_M_ZERO | OCS_M_NOWAIT);
1956 if (node_group != NULL) {
1959 node_group->node_group_dir = node_group_dir;
1964 ocs_log_err(ocs,
"ocs_hal_node_group_alloc() failed: %d\n", hrc);
1965 ocs_free(ocs, node_group,
sizeof(*node_group));
1970 ocs_lock(&node_group_dir->sport->node_group_lock);
1971 node_group->instance_index = sport->node_group_next_instance++;
1973 node_group_dir->node_group_list_count ++;
1974 ocs_unlock(&node_group_dir->sport->node_group_lock);
1976 ocs_log_debug(ocs,
"[%s] [%d] indicator x%03x allocating node group\n", sport->display_name,
1977 node_group->indicator, node_group->instance_index);
1999 ocs_node_group_dir_t *node_group_dir;
2001 if (node_group != NULL) {
2002 node_group_dir = node_group->node_group_dir;
2005 sport = node_group_dir->sport;
2011 ocs_log_debug(ocs,
"[%s] [%d] indicator x%03x freeing node group\n",
2012 sport->display_name, node_group->indicator, node_group->instance_index);
2015 ocs_lock(&sport->node_group_lock);
2017 node_group_dir->node_group_list_count --;
2020 ocs_unlock(&sport->node_group_lock);
2021 ocs_free(sport->ocs, node_group,
sizeof(*node_group));
2046 ocs_node_group_dir_t *node_group_dir;
2047 ocs_remote_node_group_t *node_group;
2055 sport = node->sport;
2061 if (node_group_dir == NULL) {
2064 if (node_group_dir == NULL) {
2068 ocs_log_err(ocs,
"ocs_node_group_dir_alloc() failed\n");
2076 ocs_lock(&node->sport->node_group_lock);
2077 if (node_group_dir->node_group_list_count < ocs->hlm_group_size) {
2078 ocs_unlock(&node->sport->node_group_lock);
2080 if (node_group == NULL) {
2081 ocs_log_err(ocs,
"ocs_remote_node_group_alloc() failed\n");
2084 ocs_lock(&node->sport->node_group_lock);
2089 if (idx >= ocs->hlm_group_size) {
2090 ocs_log_err(node->ocs,
"assertion failed: idx >= ocs->hlm_group_size\n");
2091 ocs_unlock(&node->sport->node_group_lock);
2095 if (idx == node_group_dir->next_idx) {
2100 if (idx == ocs->hlm_group_size) {
2103 if (++node_group_dir->next_idx >= node_group_dir->node_group_list_count) {
2104 node_group_dir->next_idx = 0;
2107 ocs_unlock(&node->sport->node_group_lock);
2110 node->node_group = node_group;
2118 #if !defined(OCSU_FC_RAMD) && !defined(OCSU_FC_WORKLOAD) && !defined(OCS_USPACE_SPDK)
2127 ocs_node_t *node_next;
ocs_sport_t * ocs_sport_get_instance(ocs_domain_t *domain, uint32_t index)
Return a SLI port object, given an instance index.
static void _ocs_sport_free(void *arg)
Free a SLI port object.
ocs_sport_t * ocs_sport_find(ocs_domain_t *domain, uint32_t d_id)
Find a SLI port object, given an FC_ID.
ocs_sport_exec_arg_t * sport_exec_args
void * fdmi_get_cmd_rsp_buf
int32_t ocs_sport_vport_del(ocs_t *ocs, ocs_domain_t *domain, uint64_t wwpn, uint64_t wwnn)
Remove a previously-allocated virtual port.
#define std_sport_state_decl()
Common SLI port state machine declarations and initialization.
void ocs_mgmt_sport_exec_cb(ocs_sport_t *sport, void *)
#define enable_target_rscn(ocs)
int parse_wwn(char *wwn_in, uint64_t *wwn_out)
parse a WWN from a string into a 64-bit value
static int32_t ocs_list_empty(ocs_list_t *list)
Test if a list is empty.
void ocs_sport_free(ocs_sport_t *sport)
int ocs_mgmt_sport_set(char *parent, char *name, char *value, void *sport)
void ocs_mgmt_emit_int(ocs_textbuf_t *textbuf, int mode, const char *name, const char *fmt,...)
Generate a property with an integer value in a management XML document.
static void ocs_vport_update_spec(ocs_sport_t *sport)
Save the virtual port's parameters.
void ocs_scsi_tgt_count_sessions(ocs_t *ocs, uint64_t wwpn)
void ocs_node_force_free(ocs_node_t *node)
free memory resources of a node object
ocs_hal_rtn_e ocs_hal_unreg_rpi_all(ocs_hal_t *hal, ocs_sport_t *sport)
Free all remote node objects.
static void * ocs_list_get_head(ocs_list_t *list)
Return the first item in the list.
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.
ocs_hal_rtn_e ocs_hal_port_attach(ocs_hal_t *hal, ocs_sli_port_t *sport, uint32_t fc_id)
Attach a physical/virtual SLI port to a domain.
int32_t ocs_scsi_tgt_new_sport(ocs_sport_t *sport)
Accept a new SLI Port notification.
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
ocs_hal_rtn_e ocs_hal_node_group_attach(ocs_hal_t *hal, ocs_remote_node_group_t *ngroup, ocs_remote_node_t *rnode)
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)
size_t fdmi_get_cmd_rsp_buf_len
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
void ocs_mgmt_sport_get_all(ocs_textbuf_t *textbuf, void *sport)
ocs_node_group_dir_t * ocs_node_group_dir_alloc(ocs_sport_t *sport, uint8_t *sparms)
Allocate a node group directory entry.
int32_t ocs_port_cb(void *arg, ocs_hal_port_event_e event, void *data)
SLI port HAL callback.
static void ocs_device_lock(ocs_t *ocs)
void ocs_sport_force_free(ocs_sport_t *sport)
Free memory resources of a SLI port object.
int ocs_ddump_sport(ocs_textbuf_t *textbuf, ocs_sli_port_t *sport)
Generate a SLI port ddump.
void ocs_vport_del_all(ocs_t *ocs)
Force free all saved vports.
void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams)
Display service parameters.
static ocs_mgmt_functions_t sport_mgmt_functions
ocs_node_t * ocs_node_find(ocs_sport_t *sport, uint32_t port_id)
Find an FC node structure given the FC port ID.
void * __ocs_sport_attached(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Attached.
void ocs_node_fcid_display(uint32_t fc_id, char *buffer, uint32_t buffer_length)
Generate text for a node's fc_id.
void * __ocs_d_wait_logo_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for the LOGO response.
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
void ocs_mgmt_start_section(ocs_textbuf_t *textbuf, const char *name, int index)
Generate the beginning of a numbered section in a management XML document.
int const char const char void ocs_mgmt_emit_boolean(ocs_textbuf_t *textbuf, int access, const char *name, const int value)
Generate a property with a boolean value in a management XML document.
void ocs_node_group_dir_free(ocs_node_group_dir_t *node_group_dir)
Free a node group directory entry.
static void ocs_domain_unlock(ocs_domain_t *domain)
static void ocs_sport_lock_free(ocs_sport_t *sport)
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
void * __ocs_sport_vport_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Handle initial virtual port events.
int ocs_sparm_cmp(uint8_t *sp1, uint8_t *sp2)
Compare service parameters.
static int32_t ocs_sport_fdmi_get_cmd(ocs_sport_t *sport, ocs_sport_exec_arg_t *sport_exec_args, uint32_t fdmi_cmd_code)
send FDMI get command.
ocs_remote_node_group_t * ocs_remote_node_group_alloc(ocs_node_group_dir_t *node_group_dir)
Allocate a remote node group object.
int ocs_domain_post_event(ocs_domain_t *domain, ocs_sm_event_t event, void *arg)
int ocs_mgmt_sport_exec(char *parent, char *action, void *arg_in, uint32_t arg_in_length, void *arg_out, uint32_t arg_out_length, void *object)
void ocs_scsi_tgt_del_sport(ocs_sport_t *sport)
Accept a SLI Port gone notification.
const char * ocs_sm_event_name(ocs_sm_event_t evt)
#define OCS_SERVICE_PARMS_LENGTH
#define ocs_list_init(head, type, link)
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.
void ocs_node_update_display_name(ocs_node_t *node)
update the node's display name
void ocs_scsi_ini_del_sport(ocs_sport_t *sport)
#define ocs_list_foreach_safe(list, item, nxt)
Iterate a linked list safely.
static void ocs_device_unlock(ocs_t *ocs)
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.
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.
ocs_hal_rtn_e ocs_hal_port_free(ocs_hal_t *hal, ocs_sli_port_t *sport)
Free port resources.
int32_t ocs_sport_vport_new(ocs_domain_t *domain, uint64_t wwpn, uint64_t wwnn, uint32_t fc_id, uint8_t ini, uint8_t tgt, void *tgt_data, void *ini_data, uint8_t restore_vport)
Allocate a new virtual SLI port.
void ocs_mgmt_end_section(ocs_textbuf_t *textbuf, const char *name, int index)
Generate the indexed end of a section in a management XML document.
void(* exec_cb)(ocs_domain_t *, void *arg)
void * __ocs_sport_vport_wait_alloc(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Wait for the HAL SLI port allocation to complete.
int ocs_mgmt_sport_get(ocs_textbuf_t *textbuf, char *parent, char *name, void *sport)
ocs_hal_rtn_e ocs_hal_port_alloc(ocs_hal_t *hal, ocs_sli_port_t *sport, ocs_domain_t *domain, uint8_t *wwpn)
Allocate a port object.
void ocs_sm_transition(ocs_sm_ctx_t *ctx, ocs_sm_function_t state, void *data)
Transition to a new state.
ocs_sport_t * ocs_sport_alloc(ocs_domain_t *domain, uint64_t wwpn, uint64_t wwnn, uint32_t fc_id, uint8_t enable_ini, uint8_t enable_tgt)
Allocate a SLI port object.
static void ocs_sport_lock(ocs_sport_t *sport)
void ocs_mgmt_sport_list(ocs_textbuf_t *textbuf, void *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.
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.
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
ocs_mgmt_get_list_handler get_list_handler
int32_t ocs_scsi_ini_new_sport(ocs_sport_t *sport)
int8_t ocs_vport_create_spec(ocs_t *ocs, uint64_t wwnn, uint64_t wwpn, uint32_t fc_id, uint32_t enable_ini, uint32_t enable_tgt, void *tgt_data, void *ini_data)
Create a saved vport entry.
static void ocs_scsi_notify_sport_force_free(ocs_sport_t *sport)
Notification from base driver that sport is in force-free path.
int ocs_sm_post_event(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *data)
Post an event to a context.
static void ocs_node_lock(ocs_node_t *node)
static void * __ocs_sport_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Common event handler.
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
void * __ocs_sport_vport_allocated(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: virtual sport allocated.
void * __ocs_sport_wait_port_free(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Wait for the HAL's port free to complete.
static void ocs_fdmi_get_cmd_cb(ocs_node_t *node, ocs_node_cb_t *node_data, void *cb_data)
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
void * spv_get(sparse_vector_t sv, uint32_t idx)
Return the sparse vector cell value.
static void ocs_sport_lock_init(ocs_sport_t *sport)
#define OCS_CTRLMASK_INHIBIT_INITIATOR
void * __ocs_sport_wait_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Wait for the node shutdowns to complete.
int32_t ocs_vport_start(ocs_domain_t *domain)
Start the vports on a domain.
int ocs_ddump_node(ocs_textbuf_t *textbuf, ocs_node_t *node)
Generate node ddump data.
static int32_t ocs_sport_lock_try(ocs_sport_t *sport)
static void ocs_domain_lock(ocs_domain_t *domain)
sparse_vector_t spv_new(ocs_os_handle_t os)
Instantiate a new sparse vector object.
ocs_hal_rtn_e ocs_hal_node_group_alloc(ocs_hal_t *hal, ocs_remote_node_group_t *ngroup)
ocs_node_group_dir_t * ocs_node_group_dir_find(ocs_sport_t *sport, uint8_t *sparms)
Find a matching node group directory entry.
void * __ocs_sport_allocated(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Physical sport allocated.
static void and8(uint8_t *a, uint8_t *b, uint8_t *c, uint32_t n)
Perform the AND operation on source vectors.
void ocs_scsi_tgt_sess_del_wait(ocs_sport_t *sport)
#define node_printf(node, fmt,...)
void(* exec_cb)(ocs_sport_t *sport, void *arg)
void spv_del(sparse_vector_t spv)
Delete a sparse vector.
#define ocs_assert(cond,...)
ocs_io_t * ocs_send_logo(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a LOGO ELS command.
#define sport_sm_trace(sport)
Common SLI port state machine trace logging.
ocs_domain_exec_arg_t * domain_exec_args
void ocs_mgmt_emit_string(ocs_textbuf_t *textbuf, int access, const char *name, const char *value)
Generate a property with a string value in a management XML document.
#define ocs_list_foreach(list, item)
Iterate a linked list.
void ocs_sport_nodes_shutdown(ocs_t *ocs, ocs_sport_t *sport)
Shutdown all remote nodes of sport.
ocs_sport_t * ocs_sport_find_wwn(ocs_domain_t *domain, uint64_t wwnn, uint64_t wwpn)
Find a SLI port, given the WWNN and WWPN.
static void ocs_node_unlock(ocs_node_t *node)
int ocs_node_group_init(ocs_node_t *node)
Initialize a node for high login mode.
void ocs_sm_disable(ocs_sm_ctx_t *ctx)
Disable further state machine processing.
static fc_sparms_t sparms_cmp_mask
Service parameters mask data.
static void ocs_vport_link_down(ocs_sport_t *sport)
Clear the sport reference in the vport specification.
static void ocs_sport_unlock(ocs_sport_t *sport)
void ocs_mgmt_emit_property_name(ocs_textbuf_t *textbuf, int access, const char *name)
Generate a property, with no value, in a management XML document.
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.
void spv_set(sparse_vector_t sv, uint32_t idx, void *value)
Set the sparse vector cell value.
#define OCS_FC_ELS_SEND_DEFAULT_TIMEOUT
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.
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)