Пример #1
0
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 {
		
	}

}
Пример #2
0
/**
 *   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);
	}
}
Пример #3
0
/**
 *   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 ??
         */
    }

}
Пример #4
0
/*
 * 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;
	}
}