void bfa_fcs_port_loop_online(struct bfa_fcs_port_s *port) { u8 num_alpa = port->port_topo.ploop.num_alpa; u8 *alpa_pos_map = port->port_topo.ploop.alpa_pos_map; struct bfa_fcs_rport_s *r_port; int ii = 0; if (port->port_cfg.roles == BFA_PORT_ROLE_FCP_IM) { if (num_alpa > 0) { for (ii = 0; ii < num_alpa; ii++) { if (alpa_pos_map[ii] != port->pid) { r_port = bfa_fcs_rport_create(port, alpa_pos_map[ii]); } } } else { for (ii = 0; ii < MAX_ALPA_COUNT; ii++) { if ((port_loop_alpa_map[ii] > 0) && (port_loop_alpa_map[ii] != port->pid)) bfa_fcs_port_loop_send_plogi(port, port_loop_alpa_map[ii]); } } } else { } }
/** * Called by fcs/port to notify transition to online state. */ void bfa_fcs_port_n2n_online(struct bfa_fcs_port_s *port) { struct bfa_fcs_port_n2n_s *n2n_port = &port->port_topo.pn2n; struct bfa_port_cfg_s *pcfg = &port->port_cfg; struct bfa_fcs_rport_s *rport; bfa_trc(port->fcs, pcfg->pwwn); /* * If our PWWN is > than that of the r-port, we have to initiate PLOGI * and assign an Address. if not, we need to wait for its PLOGI. * * If our PWWN is < than that of the remote port, it will send a PLOGI * with the PIDs assigned. The rport state machine take care of this * incoming PLOGI. */ if (memcmp ((void *)&pcfg->pwwn, (void *)&n2n_port->rem_port_wwn, sizeof(wwn_t)) > 0) { port->pid = N2N_LOCAL_PID; /** * First, check if we know the device by pwwn. */ rport = bfa_fcs_port_get_rport_by_pwwn(port, n2n_port->rem_port_wwn); if (rport) { bfa_trc(port->fcs, rport->pid); bfa_trc(port->fcs, rport->pwwn); rport->pid = N2N_REMOTE_PID; bfa_fcs_rport_online(rport); return; } /* * In n2n there can be only one rport. Delete the old one whose * pid should be zero, because it is offline. */ if (port->num_rports > 0) { rport = bfa_fcs_port_get_rport_by_pid(port, 0); bfa_assert(rport != NULL); if (rport) { bfa_trc(port->fcs, rport->pwwn); bfa_fcs_rport_delete(rport); } } bfa_fcs_rport_create(port, N2N_REMOTE_PID); } }
/** * Called by port to notify transition to online state. */ void bfa_fcs_port_loop_online(struct bfa_fcs_port_s *port) { u8 num_alpa = port->port_topo.ploop.num_alpa; u8 *alpa_pos_map = port->port_topo.ploop.alpa_pos_map; struct bfa_fcs_rport_s *r_port; int ii = 0; /* * If the port role is Initiator Mode, create Rports. */ if (port->port_cfg.roles == BFA_PORT_ROLE_FCP_IM) { /* * Check if the ALPA positional bitmap is available. * if not, we send PLOGI to all possible ALPAs. */ if (num_alpa > 0) { for (ii = 0; ii < num_alpa; ii++) { /* * ignore ALPA of bfa port */ if (alpa_pos_map[ii] != port->pid) { r_port = bfa_fcs_rport_create(port, alpa_pos_map[ii]); } } } else { for (ii = 0; ii < MAX_ALPA_COUNT; ii++) { /* * ignore ALPA of bfa port */ if ((port_loop_alpa_map[ii] > 0) && (port_loop_alpa_map[ii] != port->pid)) bfa_fcs_port_loop_send_plogi(port, port_loop_alpa_map[ii]); /**TBD */ } } } else { /* * TBD Target Mode ?? */ } }
/* * Process the PID list in GID_FT response */ static void bfa_fcs_port_ns_process_gidft_pids(struct bfa_fcs_port_s *port, u32 *pid_buf, u32 n_pids) { struct fcgs_gidft_resp_s *gidft_entry; struct bfa_fcs_rport_s *rport; u32 ii; for (ii = 0; ii < n_pids; ii++) { gidft_entry = (struct fcgs_gidft_resp_s *) &pid_buf[ii]; if (gidft_entry->pid == port->pid) continue; /* * Check if this rport already exists */ rport = bfa_fcs_port_get_rport_by_pid(port, gidft_entry->pid); if (rport == NULL) { /* * this is a new device. create rport */ rport = bfa_fcs_rport_create(port, gidft_entry->pid); } else { /* * this rport already exists */ bfa_fcs_rport_scn(rport); } bfa_trc(port->fcs, gidft_entry->pid); /* * if the last entry bit is set, bail out. */ if (gidft_entry->last) return; } }