48 #define domain_sm_trace(domain) \
50 if (OCS_LOG_ENABLE_DOMAIN_SM_TRACE(domain->ocs)) \
51 ocs_log_info(domain->ocs, "[domain] %-20s %-20s\n", __func__, ocs_sm_event_name(evt)); \
54 #define domain_trace(domain, fmt, ...) \
56 if (OCS_LOG_ENABLE_DOMAIN_SM_TRACE(domain ? domain->ocs : NULL)) \
57 ocs_log_info(domain ? domain->ocs : NULL, fmt, ##__VA_ARGS__); \
60 #define domain_printf(domain, fmt, ...) \
62 ocs_log_info(domain ? domain->ocs : NULL, fmt, ##__VA_ARGS__); \
70 void *arg_out, uint32_t arg_out_length,
void *
object);
97 ocs_domain_t *domain = NULL;
108 uint64_t fcf_wwn = 0;
113 fcf_wwn = ocs_be64toh(*((uint64_t*)drec->
wwn));
117 if (domain == NULL) {
119 if (domain == NULL) {
120 ocs_log_err(ocs,
"ocs_domain_alloc() failed\n");
138 domain->instance_index = 0;
169 ocs_log_warn(ocs,
"unsupported event %#x\n", event);
191 ocs_domain_t *domain = NULL;
196 if (fcf_wwn == domain->fcf_wwn) {
220 ocs_domain_t *domain;
224 domain = ocs_malloc(ocs,
sizeof(*domain), OCS_M_NOWAIT | OCS_M_ZERO);
228 domain->instance_index = ocs->domain_instance_count++;
229 domain->drvsm.app = domain;
230 ocs_rlock_init(ocs, &domain->drvsm_lock,
"Domain SM lock");
232 ocs_lock_init(ocs, &domain->lookup_lock,
"Domain lookup[%d]", domain->instance_index);
236 if (domain->lookup == NULL) {
237 ocs_log_err(ocs,
"spv_new() failed\n");
238 ocs_free(ocs, domain,
sizeof(*domain));
243 domain->fcf_wwn = fcf_wwn;
244 ocs_log_debug(ocs,
"Domain allocated: wwn %016" PRIX64
"\n", domain->fcf_wwn);
246 #if defined(ENABLE_FABRIC_EMULATION)
247 domain->ocs_ns = ocs_ns_attach(domain, OCS_NS_MAX_RECORDS);
253 ocs->domain = domain;
260 ocs_log_err(ocs,
"domain allocation failed\n");
291 ocs_log_debug(ocs,
"Domain free: wwn %016" PRIX64
"\n", domain->fcf_wwn);
294 domain->lookup = NULL;
298 if (domain == ocs->domain) {
302 ocs_log_debug(ocs,
"setting new domain, old=%p new=%p\n",
303 domain, ocs->domain);
308 ocs_lock(&ocs->domain_list_empty_cb_lock);
309 if (ocs->domain_list_empty_cb &&
ocs_list_empty(&ocs->domain_list)) {
310 ocs_log_info(ocs,
"Domain list is empty. Release domain shutdown\n");
311 (*ocs->domain_list_empty_cb)(ocs, ocs->domain_list_empty_cb_arg);
313 ocs_unlock(&ocs->domain_list_empty_cb_lock);
315 ocs_rlock_free(&domain->drvsm_lock);
316 ocs_lock_free(&domain->lookup_lock);
318 #if defined(ENABLE_FABRIC_EMULATION)
320 ocs_ns_detach(domain->ocs_ns);
323 ocs_femul_shutdown(domain);
326 ocs_free(ocs, domain,
sizeof(*domain));
372 ocs_lock(&ocs->domain_list_empty_cb_lock);
373 ocs->domain_list_empty_cb_arg = NULL;
374 ocs->domain_list_empty_cb = NULL;
375 ocs_unlock(&ocs->domain_list_empty_cb_lock);
391 ocs_lock(&ocs->domain_list_empty_cb_lock);
392 if (ocs->domain_list_empty_cb == NULL) {
393 ocs_sem_init(&ocs->domain_list_empty_cb_sem, 0,
394 "domain_list_empty_cb_sem");
395 ocs->domain_list_empty_cb_arg = &ocs->domain_list_empty_cb_sem;
398 ocs_unlock(&ocs->domain_list_empty_cb_lock);
416 ocs_domain_t *domain = NULL;
418 if (index >= OCS_MAX_DOMAINS) {
419 ocs_log_err(ocs,
"invalid index: %d\n", index);
424 if (domain->instance_index == index) {
450 ocs_domain_t *domain = ctx->app;
460 ocs_log_warn(domain->ocs,
"%-20s %-20s not handled\n", funcname,
ocs_sm_event_name(evt));
485 ocs_domain_t *domain = ctx->app;
495 ocs_memcpy(&domain->pending_drec, arg,
sizeof(domain->pending_drec));
496 domain->domain_found_pending = TRUE;
500 domain->domain_found_pending = FALSE;
504 ocs_log_warn(domain->ocs,
"%-20s %-20s not handled\n", funcname,
ocs_sm_event_name(evt));
511 #define std_domain_state_decl(...) \
512 ocs_domain_t *domain = NULL; \
515 ocs_assert(ctx, NULL); \
516 ocs_assert(ctx->app, NULL); \
518 ocs_assert(domain->ocs, NULL); \
520 ocs_assert(ocs->xport, NULL);
546 domain->attached = 0;
555 uint64_t my_wwnn = ocs->xport->req_wwnn;
556 uint64_t my_wwpn = ocs->xport->req_wwpn;
563 if ((my_wwpn == 0) || (my_wwnn == 0)) {
564 ocs_log_debug(ocs,
"using default hardware WWN configuration \n");
569 ocs_log_debug(ocs,
"Creating base sport using WWPN %016" PRIx64
" WWNN %016" PRIx64
"\n",
573 sport =
ocs_sport_alloc(domain, my_wwpn, my_wwnn, UINT32_MAX, ocs->enable_ini, ocs->enable_tgt);
576 ocs_log_err(ocs,
"ocs_sport_alloc() failed\n");
583 vlan = ocs_bitmap_search((
void *)drec->
map.
vlan, TRUE, 512 * 8);
585 ocs_log_err(ocs,
"no VLAN id available (FCF=%d)\n",
591 be_wwpn = ocs_htobe64(sport->wwpn);
597 ocs_log_err(ocs,
"Can't allocate port\n");
603 domain->is_loop = drec->
is_loop;
604 domain->is_fc = drec->
is_fc;
611 domain->is_nlport = drec->
map.
loop[1] == 0x00;
613 if (domain->is_loop) {
614 ocs_log_debug(ocs,
"%s fc_id=%#x speed=%d\n",
615 drec->
is_loop ? (domain->is_nlport ?
"public-loop" :
"loop") :
"other",
618 sport->fc_id = drec->
fc_id;
620 ocs_snprintf(sport->display_name,
sizeof(sport->display_name),
"s%06x", drec->
fc_id);
622 if (ocs->enable_ini) {
623 uint32_t count = drec->
map.
loop[0];
624 ocs_log_debug(ocs,
"%d position map entries\n", count);
625 for (i = 1; i <= count; i++) {
629 ocs_log_debug(ocs,
"%#x -> %#x\n",
633 ocs_log_err(ocs,
"ocs_node_alloc() failed\n");
644 ocs_log_err(ocs,
"Failed to initiate HAL domain allocation\n");
685 uint64_t wwn_bump = 0;
689 wwn_bump = ocs_strtoull(prop_buf, 0, 0);
692 sport = domain->sport;
697 ocs_memcpy(domain->service_params + 4, domain->dma.virt,
sizeof(
fc_plogi_payload_t) - 4);
698 ocs_memcpy(sport->service_params + 4, domain->dma.virt,
sizeof(
fc_plogi_payload_t) - 4);
703 if (domain->femul_enable) {
704 ocs_memcpy(domain->flogi_service_params + 4, domain->service_params + 4,
sizeof(
fc_plogi_payload_t) - 4);
708 sp->
port_name_hi = ocs_htobe32((uint32_t) (sport->wwpn >> 32ll));
710 sp->
node_name_hi = ocs_htobe32((uint32_t) (sport->wwnn >> 32ll));
718 ocs_log_info(ocs,
"Overriding WWN\n");
722 if (domain->is_loop && !domain->is_nlport) {
736 #if defined(ENABLE_FABRIC_EMULATION)
738 if (domain->femul_enable) {
739 ocs_log_info(ocs,
"Starting Fabric Emulation operation\n");
741 ocs_femul_init(domain);
746 domain->req_accept_frames = 1;
754 ocs_log_err(ocs,
"Hmmmm ... Fabric Controller node already exists\n");
759 ocs_log_err(ocs,
"Error: ocs_node_alloc() failed\n");
768 domain->req_accept_frames = 1;
777 ocs_log_err(ocs,
"%s recv'd waiting for DOMAIN_ALLOC_OK; shutting down domain\n",
779 domain->req_domain_free = 1;
788 ocs_log_debug(ocs,
"%s received while waiting for ocs_hal_domain_alloc() to complete\n",
ocs_sm_event_name(evt));
830 fc_id = *((uint32_t*)arg);
831 ocs_log_debug(ocs,
"Requesting hal domain attach fc_id x%x\n", fc_id);
833 ocs_lock(&domain->lookup_lock);
834 spv_set(domain->lookup, fc_id, domain->sport);
835 ocs_unlock(&domain->lookup_lock);
843 ocs_log_err(ocs,
"ocs_hal_domain_attach failed: %d\n", rc);
858 ocs_log_debug(ocs,
"%s received while waiting for OCS_EVT_DOMAIN_REQ_ATTACH\n",
864 ocs_sport_t *sport = NULL;
865 ocs_sport_t *sport_next = NULL;
877 ocs_log_err(ocs,
"ocs_hal_domain_free() failed: %d\n", rc);
917 ocs_node_t *node = NULL;
918 ocs_node_t *next_node = NULL;
920 ocs_sport_t *next_sport;
923 domain->domain_notify_pend = 1;
926 domain->attached = 1;
939 domain->req_accept_frames = 1;
954 domain->domain_notify_pend = 0;
959 ocs_log_debug(ocs,
"%s received while waiting for hal attach to complete\n",
ocs_sm_event_name(evt));
1013 ocs_log_debug(domain->ocs,
"ocs_vport_start() did not start all vports\n");
1023 ocs_sport_t *sport = NULL;
1024 ocs_sport_t *sport_next = NULL;
1036 ocs_log_err(ocs,
"ocs_hal_domain_free() failed: %d\n", rc);
1053 fc_id = *((uint32_t*)arg);
1059 ocs_assert(domain->sport->fc_id == fc_id, NULL);
1102 ocs_log_err(ocs,
"ocs_hal_domain_free() failed: %d\n", rc);
1137 if (ocs->enable_ini)
1139 if (ocs->enable_tgt)
1143 if (domain->domain_found_pending) {
1148 uint64_t fcf_wwn = domain->fcf_wwn;
1151 ocs_log_debug(ocs,
"Reallocating domain\n");
1152 domain->req_domain_free = 1;
1155 if (domain == NULL) {
1156 ocs_log_err(ocs,
"ocs_domain_alloc() failed\n");
1168 domain->req_domain_free = 1;
1212 ocs_sport_t *sport = NULL;
1213 ocs_sport_t *sport_next = NULL;
1225 ocs_log_err(ocs,
"ocs_hal_domain_free() failed: %d\n", rc);
1282 ocs_memcpy(domain->dma.virt, ((uint8_t*)domain->flogi_service_params)+4, sizeof (
fc_plogi_payload_t) - 4);
1301 ocs_rlock_acquire(&domain->drvsm_lock);
1303 ocs_rlock_release(&domain->drvsm_lock);
1311 int req_domain_free;
1313 ocs_rlock_acquire(&domain->drvsm_lock);
1316 req_domain_free = domain->req_domain_free;
1317 domain->req_domain_free = 0;
1319 accept_frames = domain->req_accept_frames;
1320 domain->req_accept_frames = 0;
1321 ocs_rlock_release(&domain->drvsm_lock);
1323 if (accept_frames) {
1327 if (req_domain_free) {
1356 for (i = 0; i <
sizeof(value); i++) {
1357 value = (value << 8) | p[i];
1385 ocs_ddump_value(textbuf,
"fcf_indicator",
"%#x", domain->fcf_indicator);
1408 #if defined(ENABLE_FABRIC_EMULATION)
1409 ocs_ddump_ns(textbuf, domain->ocs_ns);
1424 ocs_domain_t *domain = (ocs_domain_t *)
object;
1437 #if defined(ENABLE_FABRIC_EMULATION)
1446 if ((sport->mgmt_functions) && (sport->mgmt_functions->get_list_handler)) {
1447 sport->mgmt_functions->get_list_handler(textbuf, sport);
1460 ocs_domain_t *domain = (ocs_domain_t *)
object;
1466 snprintf(qualifier,
sizeof(qualifier),
"%s/domain[%d]", parent, domain->instance_index);
1469 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
1470 char *unqualified_name = name + strlen(qualifier) +1;
1473 if (ocs_strcmp(unqualified_name,
"display_name") == 0) {
1476 }
else if (ocs_strcmp(unqualified_name,
"fcf") == 0) {
1479 }
else if (ocs_strcmp(unqualified_name,
"fcf_indicator") == 0) {
1482 }
else if (ocs_strcmp(unqualified_name,
"vlan_id") == 0) {
1485 }
else if (ocs_strcmp(unqualified_name,
"indicator") == 0) {
1488 }
else if (ocs_strcmp(unqualified_name,
"attached") == 0) {
1491 }
else if (ocs_strcmp(unqualified_name,
"is_loop") == 0) {
1494 }
else if (ocs_strcmp(unqualified_name,
"is_nlport") == 0) {
1497 }
else if (ocs_strcmp(unqualified_name,
"display_name") == 0) {
1500 #if defined(ENABLE_FABRIC_EMULATION)
1501 }
else if (ocs_strcmp(unqualified_name,
"femul_enable") == 0) {
1505 }
else if (ocs_strcmp(unqualified_name,
"num_sports") == 0) {
1513 if ((sport->mgmt_functions) && (sport->mgmt_functions->get_handler)) {
1514 retval = sport->mgmt_functions->get_handler(textbuf, qualifier, name, sport);
1534 ocs_domain_t *domain = (ocs_domain_t *)
object;
1546 #if defined(ENABLE_FABRIC_EMULATION)
1553 if ((sport->mgmt_functions) && (sport->mgmt_functions->get_all_handler)) {
1554 sport->mgmt_functions->get_all_handler(textbuf, sport);
1568 ocs_domain_t *domain = (ocs_domain_t *)
object;
1572 snprintf(qualifier,
sizeof(qualifier),
"%s/domain[%d]", parent, domain->instance_index);
1575 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
1587 if ((sport->mgmt_functions) && (sport->mgmt_functions->set_handler)) {
1588 retval = sport->mgmt_functions->set_handler(qualifier, name, value, sport);
1607 if (domain_exec_args) {
1608 if (ocs_atomic_sub_and_test(&domain_exec_args->
ref_cnt, 1)) {
1609 ocs_free(domain->ocs, domain_exec_args,
sizeof(*domain_exec_args));
1610 ocs_free(domain->ocs, domain_exec_args->
arg_out,
1613 ocs_sem_v(&domain_exec_args->
sem);
1618 void *arg_out, uint32_t arg_out_length,
void *
object)
1622 ocs_domain_t *domain = (ocs_domain_t *)
object;
1626 snprintf(qualifier,
sizeof(qualifier),
"%s/domain[%d]", parent, domain->instance_index);
1629 if (ocs_strncmp(action, qualifier, strlen(qualifier)) == 0) {
1635 if ((sport->mgmt_functions) && (sport->mgmt_functions->exec_handler)) {
1638 OCS_M_NOWAIT | OCS_M_ZERO);
1639 if (!sport_exec_args) {
1640 ocs_log_err(sport->ocs,
"Failed to allocate memory\n");
1651 retval = sport->mgmt_functions->exec_handler(qualifier, action,
void ocs_domain_accept_frames(ocs_domain_t *domain)
Clear hold on unsolicited frames.
ocs_hal_rtn_e ocs_hal_domain_attach(ocs_hal_t *hal, ocs_domain_t *domain, uint32_t fc_id)
Attach a SLI port to a domain.
void * __ocs_domain_allocated(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Wait for the domain attach request.
void * __ocs_domain_wait_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Wait for the HAL domain attach to complete.
void * __ocs_domain_wait_domain_lost(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Wait for the domain alloc/attach completion after receiving a domain lost...
static void ocs_scsi_notify_domain_force_free(ocs_domain_t *domain)
Notification from base driver that domain is in force-free path.
static void ocs_domain_lock_init(ocs_domain_t *domain)
void ocs_domain_force_free(ocs_domain_t *domain)
Free memory resources of a domain object.
void ocs_mgmt_sport_exec_cb(ocs_sport_t *sport, void *)
static int32_t ocs_list_empty(ocs_list_t *list)
Test if a list is empty.
void ocs_sport_free(ocs_sport_t *sport)
ocs_domain_t * ocs_domain_get_instance(ocs_t *ocs, uint32_t index)
Return a pointer to the domain, given the instance index.
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.
void * __ocs_domain_wait_alloc(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Wait for the domain allocation to complete.
ocs_domain_t * ocs_domain_alloc(ocs_t *ocs, uint64_t fcf_wwn)
Allocate a domain object.
static void * ocs_list_get_head(ocs_list_t *list)
Return the first item in the list.
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
static void * __ocs_domain_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Common event handler.
void ocs_domain_free(ocs_domain_t *domain)
Free a domain object.
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
void * __ocs_domain_wait_sports_free(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Wait for nodes to free prior to the domain shutdown.
void __ocs_domain_attach_internal(ocs_domain_t *domain, uint32_t s_id)
Initiator domain attach. (internal call only)
void ocs_scsi_tgt_del_domain(ocs_domain_t *domain)
Accept a domain lost notification.
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.
static ocs_mgmt_functions_t domain_mgmt_functions
int ocs_ddump_sport(ocs_textbuf_t *textbuf, ocs_sli_port_t *sport)
Generate a SLI port ddump.
ocs_hal_rtn_e ocs_hal_domain_force_free(ocs_hal_t *hal, ocs_domain_t *domain)
Free a fabric domain object.
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.
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_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.
union ocs_domain_record_t::@5 map
static void ocs_domain_unlock(ocs_domain_t *domain)
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
int ocs_domain_post_event(ocs_domain_t *domain, ocs_sm_event_t event, void *arg)
const char * ocs_sm_event_name(ocs_sm_event_t evt)
#define domain_trace(domain, fmt,...)
ocs_hal_rtn_e ocs_hal_domain_alloc(ocs_hal_t *hal, ocs_domain_t *domain, uint32_t fcf, uint32_t vlan)
Allocate a fabric domain object.
static int32_t ocs_domain_lock_try(ocs_domain_t *domain)
#define ocs_list_init(head, type, link)
int32_t ocs_scsi_ini_new_domain(ocs_domain_t *domain)
accept new domain notification
#define ocs_list_foreach_safe(list, item, nxt)
Iterate a linked list safely.
void ocs_mgmt_end_unnumbered_section(ocs_textbuf_t *textbuf, const char *name)
Generate the end of a section in a management XML document.
static void ocs_device_unlock(ocs_t *ocs)
void ocs_mgmt_domain_get_all(ocs_textbuf_t *textbuf, void *domain)
int32_t ocs_scsi_tgt_new_domain(ocs_domain_t *domain)
Accept a new domain notification.
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.
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_domain_attach(ocs_domain_t *domain, uint32_t s_id)
Initiator domain attach.
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)
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.
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
#define OCS_CTRLMASK_ENABLE_FABRIC_EMULATION
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_xport_domain_list_empty_cb(ocs_t *ocs, void *arg)
domain list empty callback
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
int32_t ocs_domain_cb(void *arg, ocs_hal_domain_event_e event, void *data)
Accept domain callback events from the HAL.
Description of discovered Fabric Domain.
void ocs_domain_hold_frames(ocs_domain_t *domain)
Globally (at xport level) hold unsolicited frames.
void * __ocs_d_wait_loop(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a domain-attach completion in loop topology.
void * __ocs_fabric_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Fabric node state machine: Initial state.
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
ocs_hal_rtn_e ocs_hal_domain_free(ocs_hal_t *hal, ocs_domain_t *domain)
Free a fabric domain object.
int32_t ocs_vport_start(ocs_domain_t *domain)
Start the vports on a domain.
void ocs_unregister_domain_list_empty_cb(ocs_t *ocs)
Unregister a callback for the domain_list empty cb.
#define std_domain_state_decl(...)
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_domain_event_e
Fabric/Domain events.
static void * __ocs_domain_common_shutdown(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Common shutdown.
uint64_t ocs_get_wwn(ocs_hal_t *hal, ocs_hal_property_e prop)
Return the WWN as a uint64_t.
void ocs_scsi_ini_del_domain(ocs_domain_t *domain)
accept domain lost notification
void * __ocs_sport_allocated(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
SLI port state machine: Physical sport allocated.
int ocs_mgmt_domain_get(ocs_textbuf_t *textbuf, char *parent, char *name, void *domain)
void ocs_domain_save_sparms(ocs_domain_t *domain, void *payload)
Save the port's service parameters.
void(* exec_cb)(ocs_sport_t *sport, void *arg)
int32_t ocs_get_property(const char *prop_name, char *buffer, uint32_t buffer_len)
get driver wide property value
void * __ocs_domain_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Initial state.
void spv_del(sparse_vector_t spv)
Delete a sparse vector.
#define ocs_assert(cond,...)
void ocs_mgmt_domain_list(ocs_textbuf_t *textbuf, void *domain)
int ocs_mgmt_domain_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_register_domain_list_empty_cb(ocs_t *ocs)
Register a callback when the domain_list goes empty.
void * ocs_hal_get_ptr(ocs_hal_t *hal, ocs_hal_property_e prop)
ocs_domain_exec_arg_t * domain_exec_args
int ocs_mgmt_domain_set(char *parent, char *name, char *value, void *domain)
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.
void ocs_mgmt_domain_exec_cb(ocs_domain_t *domain, void *)
#define domain_sm_trace(domain)
#define ocs_list_foreach(list, item)
Iterate a linked list.
#define OCS_NODEDB_PAUSE_FABRIC_LOGIN
int ocs_ddump_domain(ocs_textbuf_t *textbuf, ocs_domain_t *domain)
Generate a domain ddump.
void ocs_sm_disable(ocs_sm_ctx_t *ctx)
Disable further state machine processing.
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.
void * __ocs_domain_ready(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Ready state.
ocs_domain_t * ocs_domain_find(ocs_t *ocs, uint64_t fcf_wwn)
Find the domain, given its FCF_WWN.
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
void * __ocs_domain_wait_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Domain state machine: Complete the domain shutdown.