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

Commit a87dccc7 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen
Browse files

fcoe: Update multicast addresses on FIP mode change



When the FIP mode is changed we need to update the multicast addresses
to ensure we get the correct frames.

Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Acked-by: default avatarJohannes Thumshirn <jth@kernel.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent eb44c4e2
Loading
Loading
Loading
Loading
+29 −2
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@ static int fcoe_disable(struct net_device *netdev);
/* fcoe_syfs control interface handlers */
/* fcoe_syfs control interface handlers */
static int fcoe_ctlr_alloc(struct net_device *netdev);
static int fcoe_ctlr_alloc(struct net_device *netdev);
static int fcoe_ctlr_enabled(struct fcoe_ctlr_device *cdev);
static int fcoe_ctlr_enabled(struct fcoe_ctlr_device *cdev);

static void fcoe_ctlr_mode(struct fcoe_ctlr_device *ctlr_dev);


static struct fc_seq *fcoe_elsct_send(struct fc_lport *,
static struct fc_seq *fcoe_elsct_send(struct fc_lport *,
				      u32 did, struct fc_frame *,
				      u32 did, struct fc_frame *,
@@ -146,8 +146,9 @@ static void fcoe_set_vport_symbolic_name(struct fc_vport *);
static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
static void fcoe_fcf_get_vlan_id(struct fcoe_fcf_device *);
static void fcoe_fcf_get_vlan_id(struct fcoe_fcf_device *);



static struct fcoe_sysfs_function_template fcoe_sysfs_templ = {
static struct fcoe_sysfs_function_template fcoe_sysfs_templ = {
	.set_fcoe_ctlr_mode = fcoe_ctlr_set_fip_mode,
	.set_fcoe_ctlr_mode = fcoe_ctlr_mode,
	.set_fcoe_ctlr_enabled = fcoe_ctlr_enabled,
	.set_fcoe_ctlr_enabled = fcoe_ctlr_enabled,
	.get_fcoe_ctlr_link_fail = fcoe_ctlr_get_lesb,
	.get_fcoe_ctlr_link_fail = fcoe_ctlr_get_lesb,
	.get_fcoe_ctlr_vlink_fail = fcoe_ctlr_get_lesb,
	.get_fcoe_ctlr_vlink_fail = fcoe_ctlr_get_lesb,
@@ -1975,6 +1976,32 @@ static int fcoe_ctlr_enabled(struct fcoe_ctlr_device *cdev)
	};
	};
}
}


/**
 * fcoe_ctlr_mode() - Switch FIP mode
 * @cdev: The FCoE Controller that is being modified
 *
 * When the FIP mode has been changed we need to update
 * the multicast addresses to ensure we get the correct
 * frames.
 */
static void fcoe_ctlr_mode(struct fcoe_ctlr_device *ctlr_dev)
{
	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
	struct fcoe_interface *fcoe = fcoe_ctlr_priv(ctlr);

	if (ctlr_dev->mode == FIP_CONN_TYPE_VN2VN &&
	    ctlr->mode != FIP_MODE_VN2VN) {
		dev_mc_del(fcoe->netdev, FIP_ALL_ENODE_MACS);
		dev_mc_add(fcoe->netdev, FIP_ALL_VN2VN_MACS);
		dev_mc_add(fcoe->netdev, FIP_ALL_P2P_MACS);
	} else if (ctlr->mode != FIP_MODE_FABRIC) {
		dev_mc_del(fcoe->netdev, FIP_ALL_VN2VN_MACS);
		dev_mc_del(fcoe->netdev, FIP_ALL_P2P_MACS);
		dev_mc_add(fcoe->netdev, FIP_ALL_ENODE_MACS);
	}
	fcoe_ctlr_set_fip_mode(ctlr_dev);
}

/**
/**
 * fcoe_destroy() - Destroy a FCoE interface
 * fcoe_destroy() - Destroy a FCoE interface
 * @netdev  : The net_device object the Ethernet interface to create on
 * @netdev  : The net_device object the Ethernet interface to create on