[SCSI] bnx2fc: Send solicitation only after vlan discovery is complete
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>
This commit is contained in:
parent
c780673cfb
commit
8a5badf1ea
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue