static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, enum bfa_itnim_aen_event event) { struct bfa_fcs_rport_s *rport = itnim->rport; struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; struct bfa_aen_entry_s *aen_entry; /* Don't post events for well known addresses */ if (BFA_FCS_PID_IS_WKA(rport->pid)) return; bfad_get_aen_entry(bfad, aen_entry); if (!aen_entry) return; aen_entry->aen_data.itnim.vf_id = rport->port->fabric->vf_id; aen_entry->aen_data.itnim.ppwwn = bfa_fcs_lport_get_pwwn( bfa_fcs_get_base_port(itnim->fcs)); aen_entry->aen_data.itnim.lpwwn = bfa_fcs_lport_get_pwwn(rport->port); aen_entry->aen_data.itnim.rpwwn = rport->pwwn; /* Send the AEN notification */ bfad_im_post_vendor_event(aen_entry, bfad, ++rport->fcs->fcs_aen_seq, BFA_AEN_CAT_ITNIM, event); }
static u16 bfa_fcs_port_fdmi_build_rprt_pyld(struct bfa_fcs_port_fdmi_s *fdmi, u8 *pyld) { struct bfa_fcs_port_s *port = fdmi->ms->port; struct fdmi_rprt_s *rprt = (struct fdmi_rprt_s *) pyld; u16 len; rprt->hba_id = bfa_fcs_port_get_pwwn(bfa_fcs_get_base_port(port->fcs)); rprt->port_name = bfa_fcs_port_get_pwwn(port); len = bfa_fcs_port_fdmi_build_portattr_block(fdmi, (u8 *) &rprt->port_attr_blk); len += sizeof(rprt->hba_id) + sizeof(rprt->port_name); return len; }
static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, enum bfa_itnim_aen_event event) { struct bfa_fcs_rport_s *rport = itnim->rport; union bfa_aen_data_u aen_data; struct bfa_log_mod_s *logmod = rport->fcs->logm; wwn_t lpwwn = bfa_fcs_port_get_pwwn(rport->port); wwn_t rpwwn = rport->pwwn; char lpwwn_ptr[BFA_STRING_32]; char rpwwn_ptr[BFA_STRING_32]; /* * Don't post events for well known addresses */ if (BFA_FCS_PID_IS_WKA(rport->pid)) return; wwn2str(lpwwn_ptr, lpwwn); wwn2str(rpwwn_ptr, rpwwn); switch (event) { case BFA_ITNIM_AEN_ONLINE: bfa_log(logmod, BFA_AEN_ITNIM_ONLINE, rpwwn_ptr, lpwwn_ptr); break; case BFA_ITNIM_AEN_OFFLINE: bfa_log(logmod, BFA_AEN_ITNIM_OFFLINE, rpwwn_ptr, lpwwn_ptr); break; case BFA_ITNIM_AEN_DISCONNECT: bfa_log(logmod, BFA_AEN_ITNIM_DISCONNECT, rpwwn_ptr, lpwwn_ptr); break; default: break; } aen_data.itnim.vf_id = rport->port->fabric->vf_id; aen_data.itnim.ppwwn = bfa_fcs_port_get_pwwn(bfa_fcs_get_base_port(itnim->fcs)); aen_data.itnim.lpwwn = lpwwn; aen_data.itnim.rpwwn = rpwwn; }
/** * Send AEN notification */ static void bfa_fcs_vport_aen_post(bfa_fcs_lport_t *port, enum bfa_lport_aen_event event) { union bfa_aen_data_u aen_data; struct bfa_log_mod_s *logmod = port->fcs->logm; enum bfa_port_role role = port->port_cfg.roles; wwn_t lpwwn = bfa_fcs_port_get_pwwn(port); char lpwwn_ptr[BFA_STRING_32]; char *role_str[BFA_PORT_ROLE_FCP_MAX / 2 + 1] = { "Initiator", "Target", "IPFC" }; wwn2str(lpwwn_ptr, lpwwn); bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); switch (event) { case BFA_LPORT_AEN_NPIV_DUP_WWN: bfa_log(logmod, BFA_AEN_LPORT_NPIV_DUP_WWN, lpwwn_ptr, role_str[role / 2]); break; case BFA_LPORT_AEN_NPIV_FABRIC_MAX: bfa_log(logmod, BFA_AEN_LPORT_NPIV_FABRIC_MAX, lpwwn_ptr, role_str[role / 2]); break; case BFA_LPORT_AEN_NPIV_UNKNOWN: bfa_log(logmod, BFA_AEN_LPORT_NPIV_UNKNOWN, lpwwn_ptr, role_str[role / 2]); break; default: break; } aen_data.lport.vf_id = port->fabric->vf_id; aen_data.lport.roles = role; aen_data.lport.ppwwn = bfa_fcs_port_get_pwwn(bfa_fcs_get_base_port(port->fcs)); aen_data.lport.lpwwn = lpwwn; }
/** * Register the symbolic port name. */ static void bfa_fcs_port_ns_send_rspn_id(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced) { struct bfa_fcs_port_ns_s *ns = ns_cbarg; struct bfa_fcs_port_s *port = ns->port; struct fchs_s fchs; int len; struct bfa_fcxp_s *fcxp; u8 symbl[256]; u8 *psymbl = &symbl[0]; bfa_os_memset(symbl, 0, sizeof(symbl)); bfa_trc(port->fcs, port->port_cfg.pwwn); fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs); if (!fcxp) { port->stats.ns_rspnid_alloc_wait++; bfa_fcxp_alloc_wait(port->fcs->bfa, &ns->fcxp_wqe, bfa_fcs_port_ns_send_rspn_id, ns); return; } ns->fcxp = fcxp; /* * for V-Port, form a Port Symbolic Name */ if (port->vport) { /**For Vports, * we append the vport's port symbolic name to that of the base port. */ strncpy((char *)psymbl, (char *) &(bfa_fcs_port_get_psym_name (bfa_fcs_get_base_port(port->fcs))), strlen((char *) &bfa_fcs_port_get_psym_name(bfa_fcs_get_base_port (port->fcs)))); /* * Ensure we have a null terminating string. */ ((char *) psymbl)[strlen((char *) &bfa_fcs_port_get_psym_name (bfa_fcs_get_base_port(port->fcs)))] = 0; strncat((char *)psymbl, (char *)&(bfa_fcs_port_get_psym_name(port)), strlen((char *)&bfa_fcs_port_get_psym_name(port))); } else { psymbl = (u8 *) &(bfa_fcs_port_get_psym_name(port)); } len = fc_rspnid_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), bfa_fcs_port_get_fcid(port), 0, psymbl); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, bfa_fcs_port_ns_rspn_id_response, (void *)ns, FC_MAX_PDUSZ, FC_RA_TOV); port->stats.ns_rspnid_sent++; bfa_sm_send_event(ns, NSSM_EVENT_RSPNID_SENT); }