]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[SCSI] bnx2fc: Send solicitation only after vlan discovery is complete
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Tue, 30 Aug 2011 22:54:48 +0000 (15:54 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 17 Sep 2011 14:01:58 +0000 (18:01 +0400)
Link up event is generated to the driver even before vlan discovery has
started. Because of this driver can send discovery solicitation on a stale
vlan. Call fcoe_ctlr_link_up() only when the driver is in enabled state, which
implies the vlan discovery is complete before sending solicitation.

Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bnx2fc/bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc_fcoe.c

index 903e8f64980ec04f14e64312d020a321a74ab3d3..02535e8d9e0045aa9c951953743275444fcdcab6 100644 (file)
@@ -224,6 +224,7 @@ struct bnx2fc_interface {
        struct fcoe_ctlr ctlr;
        u8 vlan_enabled;
        int vlan_id;
+       bool enabled;
 };
 
 #define bnx2fc_from_ctlr(fip) container_of(fip, struct bnx2fc_interface, ctlr)
index 6387067b91a6e9f0f19704aeba410f6d1ad6643c..ba88ddb4580bd43686381c5aa6f3e91ccda884c3 100644 (file)
@@ -865,8 +865,11 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event,
                if (link_possible && !bnx2fc_link_ok(lport)) {
                        /* Reset max recv frame size to default */
                        fc_set_mfs(lport, BNX2FC_MFS);
-                       printk(KERN_ERR "indicate_netevent: ctlr_link_up\n");
-                       fcoe_ctlr_link_up(&interface->ctlr);
+                       /*
+                        * ctlr link up will only be handled during
+                        * enable to avoid sending discovery solicitation
+                        * on a stale vlan
+                        */
                } else if (fcoe_ctlr_link_down(&interface->ctlr)) {
                        mutex_lock(&lport->lp_mutex);
                        list_for_each_entry(vport, &lport->vports, list)
@@ -1784,7 +1787,7 @@ static void bnx2fc_start_disc(struct bnx2fc_interface *interface)
        lport = interface->ctlr.lp;
        BNX2FC_HBA_DBG(lport, "calling fc_fabric_login\n");
 
-       if (!bnx2fc_link_ok(lport)) {
+       if (!bnx2fc_link_ok(lport) && interface->enabled) {
                BNX2FC_HBA_DBG(lport, "ctlr_link_up\n");
                fcoe_ctlr_link_up(&interface->ctlr);
                fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT;
@@ -1866,6 +1869,7 @@ static int bnx2fc_disable(struct net_device *netdev)
                rc = -ENODEV;
                printk(KERN_ERR PFX "bnx2fc_disable: interface or lport not found\n");
        } else {
+               interface->enabled = false;
                fcoe_ctlr_link_down(&interface->ctlr);
                fcoe_clean_pending_queue(interface->ctlr.lp);
        }
@@ -1888,8 +1892,10 @@ static int bnx2fc_enable(struct net_device *netdev)
        if (!interface || !interface->ctlr.lp) {
                rc = -ENODEV;
                printk(KERN_ERR PFX "bnx2fc_enable: interface or lport not found\n");
-       } else if (!bnx2fc_link_ok(interface->ctlr.lp))
+       } else if (!bnx2fc_link_ok(interface->ctlr.lp)) {
                fcoe_ctlr_link_up(&interface->ctlr);
+               interface->enabled = true;
+       }
 
        mutex_unlock(&bnx2fc_dev_lock);
        rtnl_unlock();
@@ -2002,8 +2008,15 @@ static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode)
        /* Make this master N_port */
        interface->ctlr.lp = lport;
 
+       if (!bnx2fc_link_ok(lport)) {
+               fcoe_ctlr_link_up(&interface->ctlr);
+               fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT;
+               set_bit(ADAPTER_STATE_READY, &interface->hba->adapter_state);
+       }
+
        BNX2FC_HBA_DBG(lport, "create: START DISC\n");
        bnx2fc_start_disc(interface);
+       interface->enabled = true;
        /*
         * Release from kref_init in bnx2fc_interface_setup, on success
         * lport should be holding a reference taken in bnx2fc_if_create