Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0db0e377 authored by Robert Love's avatar Robert Love
Browse files

libfcoe: Fix fcoe_sysfs VN2VN mode



The libfc discovery layer is being initialized in the
'create' paths for both legacy libfcoe module parameters
and fcoe_sysfs control interfaces. The problem is that
for VN2VN mode the discovery layer is initialized as if
it were in 'fabric' mode and it is not re-configured when
the mode is changed to 'vn2vn'.

This patch splits out code that needs to be initialized
once and code that can, and should be, re-configured when
the mode changes. Additionally this patch makes that change
so that the discovery layer can be reconfigured to the
libfcoe implementation when in 'vn2vn' mode.

Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Tested-by: default avatarJack Morgan <jack.morgan@intel.com>
Reviewed-by: default avatarBhanu Prakash Gollapudi <bprakash@broadcom.com>
parent 0807619d
Loading
Loading
Loading
Loading
+45 −15
Original line number Original line Diff line number Diff line
@@ -2814,6 +2814,47 @@ unlock:
		fc_lport_set_local_id(fip->lp, new_port_id);
		fc_lport_set_local_id(fip->lp, new_port_id);
}
}


/**
 * fcoe_ctlr_mode_set() - Set or reset the ctlr's mode
 * @lport: The local port to be (re)configured
 * @fip:   The FCoE controller whose mode is changing
 * @fip_mode: The new fip mode
 *
 * Note that the we shouldn't be changing the libfc discovery settings
 * (fc_disc_config) while an lport is going through the libfc state
 * machine. The mode can only be changed when a fcoe_ctlr device is
 * disabled, so that should ensure that this routine is only called
 * when nothing is happening.
 */
void fcoe_ctlr_mode_set(struct fc_lport *lport, struct fcoe_ctlr *fip,
			enum fip_state fip_mode)
{
	void *priv;

	WARN_ON(lport->state != LPORT_ST_RESET &&
		lport->state != LPORT_ST_DISABLED);

	if (fip_mode == FIP_MODE_VN2VN) {
		lport->rport_priv_size = sizeof(struct fcoe_rport);
		lport->point_to_multipoint = 1;
		lport->tt.disc_recv_req = fcoe_ctlr_disc_recv;
		lport->tt.disc_start = fcoe_ctlr_disc_start;
		lport->tt.disc_stop = fcoe_ctlr_disc_stop;
		lport->tt.disc_stop_final = fcoe_ctlr_disc_stop_final;
		priv = fip;
	} else {
		lport->rport_priv_size = 0;
		lport->point_to_multipoint = 0;
		lport->tt.disc_recv_req = NULL;
		lport->tt.disc_start = NULL;
		lport->tt.disc_stop = NULL;
		lport->tt.disc_stop_final = NULL;
		priv = lport;
	}

	fc_disc_config(lport, priv);
}

/**
/**
 * fcoe_libfc_config() - Sets up libfc related properties for local port
 * fcoe_libfc_config() - Sets up libfc related properties for local port
 * @lport:    The local port to configure libfc for
 * @lport:    The local port to configure libfc for
@@ -2826,8 +2867,6 @@ unlock:
int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip,
int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip,
		      const struct libfc_function_template *tt, int init_fcp)
		      const struct libfc_function_template *tt, int init_fcp)
{
{
	void *priv = lport;

	/* Set the function pointers set by the LLDD */
	/* Set the function pointers set by the LLDD */
	memcpy(&lport->tt, tt, sizeof(*tt));
	memcpy(&lport->tt, tt, sizeof(*tt));
	if (init_fcp && fc_fcp_init(lport))
	if (init_fcp && fc_fcp_init(lport))
@@ -2835,21 +2874,9 @@ int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip,
	fc_exch_init(lport);
	fc_exch_init(lport);
	fc_elsct_init(lport);
	fc_elsct_init(lport);
	fc_lport_init(lport);
	fc_lport_init(lport);
	if (fip->mode == FIP_MODE_VN2VN)
		lport->rport_priv_size = sizeof(struct fcoe_rport);
	fc_rport_init(lport);
	fc_rport_init(lport);
	if (fip->mode == FIP_MODE_VN2VN) {
		lport->point_to_multipoint = 1;
		lport->tt.disc_recv_req = fcoe_ctlr_disc_recv;
		lport->tt.disc_start = fcoe_ctlr_disc_start;
		lport->tt.disc_stop = fcoe_ctlr_disc_stop;
		lport->tt.disc_stop_final = fcoe_ctlr_disc_stop_final;
		priv = fip;
	}

	fc_disc_init(lport);
	fc_disc_init(lport);
	fc_disc_config(lport, priv);
	fcoe_ctlr_mode_set(lport, fip, fip->mode);

	return 0;
	return 0;
}
}
EXPORT_SYMBOL_GPL(fcoe_libfc_config);
EXPORT_SYMBOL_GPL(fcoe_libfc_config);
@@ -2877,6 +2904,7 @@ EXPORT_SYMBOL(fcoe_fcf_get_selected);
void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *ctlr_dev)
void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *ctlr_dev)
{
{
	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
	struct fc_lport *lport = ctlr->lp;


	mutex_lock(&ctlr->ctlr_mutex);
	mutex_lock(&ctlr->ctlr_mutex);
	switch (ctlr_dev->mode) {
	switch (ctlr_dev->mode) {
@@ -2890,5 +2918,7 @@ void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *ctlr_dev)
	}
	}


	mutex_unlock(&ctlr->ctlr_mutex);
	mutex_unlock(&ctlr->ctlr_mutex);

	fcoe_ctlr_mode_set(lport, ctlr, ctlr->mode);
}
}
EXPORT_SYMBOL(fcoe_ctlr_set_fip_mode);
EXPORT_SYMBOL(fcoe_ctlr_set_fip_mode);