/* fcoe_syfs control interface handlers */
 static int fcoe_ctlr_alloc(struct net_device *netdev);
 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 *,
                                      u32 did, 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 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,
        .get_fcoe_ctlr_link_fail = fcoe_ctlr_get_lesb,
        .get_fcoe_ctlr_vlink_fail = fcoe_ctlr_get_lesb,
        };
 }
 
+/**
+ * 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
  * @netdev  : The net_device object the Ethernet interface to create on