diff options
Diffstat (limited to 'drivers/scsi/bnx2fc')
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 21 |
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h index 903e8f64980..02535e8d9e0 100644 --- a/drivers/scsi/bnx2fc/bnx2fc.h +++ b/drivers/scsi/bnx2fc/bnx2fc.h | |||
@@ -224,6 +224,7 @@ struct bnx2fc_interface { | |||
224 | struct fcoe_ctlr ctlr; | 224 | struct fcoe_ctlr ctlr; |
225 | u8 vlan_enabled; | 225 | u8 vlan_enabled; |
226 | int vlan_id; | 226 | int vlan_id; |
227 | bool enabled; | ||
227 | }; | 228 | }; |
228 | 229 | ||
229 | #define bnx2fc_from_ctlr(fip) container_of(fip, struct bnx2fc_interface, ctlr) | 230 | #define bnx2fc_from_ctlr(fip) container_of(fip, struct bnx2fc_interface, ctlr) |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index 6387067b91a..ba88ddb4580 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |||
@@ -865,8 +865,11 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event, | |||
865 | if (link_possible && !bnx2fc_link_ok(lport)) { | 865 | if (link_possible && !bnx2fc_link_ok(lport)) { |
866 | /* Reset max recv frame size to default */ | 866 | /* Reset max recv frame size to default */ |
867 | fc_set_mfs(lport, BNX2FC_MFS); | 867 | fc_set_mfs(lport, BNX2FC_MFS); |
868 | printk(KERN_ERR "indicate_netevent: ctlr_link_up\n"); | 868 | /* |
869 | fcoe_ctlr_link_up(&interface->ctlr); | 869 | * ctlr link up will only be handled during |
870 | * enable to avoid sending discovery solicitation | ||
871 | * on a stale vlan | ||
872 | */ | ||
870 | } else if (fcoe_ctlr_link_down(&interface->ctlr)) { | 873 | } else if (fcoe_ctlr_link_down(&interface->ctlr)) { |
871 | mutex_lock(&lport->lp_mutex); | 874 | mutex_lock(&lport->lp_mutex); |
872 | list_for_each_entry(vport, &lport->vports, list) | 875 | list_for_each_entry(vport, &lport->vports, list) |
@@ -1784,7 +1787,7 @@ static void bnx2fc_start_disc(struct bnx2fc_interface *interface) | |||
1784 | lport = interface->ctlr.lp; | 1787 | lport = interface->ctlr.lp; |
1785 | BNX2FC_HBA_DBG(lport, "calling fc_fabric_login\n"); | 1788 | BNX2FC_HBA_DBG(lport, "calling fc_fabric_login\n"); |
1786 | 1789 | ||
1787 | if (!bnx2fc_link_ok(lport)) { | 1790 | if (!bnx2fc_link_ok(lport) && interface->enabled) { |
1788 | BNX2FC_HBA_DBG(lport, "ctlr_link_up\n"); | 1791 | BNX2FC_HBA_DBG(lport, "ctlr_link_up\n"); |
1789 | fcoe_ctlr_link_up(&interface->ctlr); | 1792 | fcoe_ctlr_link_up(&interface->ctlr); |
1790 | fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT; | 1793 | fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT; |
@@ -1866,6 +1869,7 @@ static int bnx2fc_disable(struct net_device *netdev) | |||
1866 | rc = -ENODEV; | 1869 | rc = -ENODEV; |
1867 | printk(KERN_ERR PFX "bnx2fc_disable: interface or lport not found\n"); | 1870 | printk(KERN_ERR PFX "bnx2fc_disable: interface or lport not found\n"); |
1868 | } else { | 1871 | } else { |
1872 | interface->enabled = false; | ||
1869 | fcoe_ctlr_link_down(&interface->ctlr); | 1873 | fcoe_ctlr_link_down(&interface->ctlr); |
1870 | fcoe_clean_pending_queue(interface->ctlr.lp); | 1874 | fcoe_clean_pending_queue(interface->ctlr.lp); |
1871 | } | 1875 | } |
@@ -1888,8 +1892,10 @@ static int bnx2fc_enable(struct net_device *netdev) | |||
1888 | if (!interface || !interface->ctlr.lp) { | 1892 | if (!interface || !interface->ctlr.lp) { |
1889 | rc = -ENODEV; | 1893 | rc = -ENODEV; |
1890 | printk(KERN_ERR PFX "bnx2fc_enable: interface or lport not found\n"); | 1894 | printk(KERN_ERR PFX "bnx2fc_enable: interface or lport not found\n"); |
1891 | } else if (!bnx2fc_link_ok(interface->ctlr.lp)) | 1895 | } else if (!bnx2fc_link_ok(interface->ctlr.lp)) { |
1892 | fcoe_ctlr_link_up(&interface->ctlr); | 1896 | fcoe_ctlr_link_up(&interface->ctlr); |
1897 | interface->enabled = true; | ||
1898 | } | ||
1893 | 1899 | ||
1894 | mutex_unlock(&bnx2fc_dev_lock); | 1900 | mutex_unlock(&bnx2fc_dev_lock); |
1895 | rtnl_unlock(); | 1901 | rtnl_unlock(); |
@@ -2002,8 +2008,15 @@ static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode) | |||
2002 | /* Make this master N_port */ | 2008 | /* Make this master N_port */ |
2003 | interface->ctlr.lp = lport; | 2009 | interface->ctlr.lp = lport; |
2004 | 2010 | ||
2011 | if (!bnx2fc_link_ok(lport)) { | ||
2012 | fcoe_ctlr_link_up(&interface->ctlr); | ||
2013 | fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT; | ||
2014 | set_bit(ADAPTER_STATE_READY, &interface->hba->adapter_state); | ||
2015 | } | ||
2016 | |||
2005 | BNX2FC_HBA_DBG(lport, "create: START DISC\n"); | 2017 | BNX2FC_HBA_DBG(lport, "create: START DISC\n"); |
2006 | bnx2fc_start_disc(interface); | 2018 | bnx2fc_start_disc(interface); |
2019 | interface->enabled = true; | ||
2007 | /* | 2020 | /* |
2008 | * Release from kref_init in bnx2fc_interface_setup, on success | 2021 | * Release from kref_init in bnx2fc_interface_setup, on success |
2009 | * lport should be holding a reference taken in bnx2fc_if_create | 2022 | * lport should be holding a reference taken in bnx2fc_if_create |