Commit 4a4d2d37 authored by Manish Chopra's avatar Manish Chopra Committed by David S. Miller

bnx2x: Fix VF's VLAN reconfiguration in reload.

Commit 04f05230 ("bnx2x: Remove configured vlans as
part of unload sequence."), introduced a regression in driver
that as a part of VF's reload flow, VLANs created on the VF
doesn't get re-configured in hardware as vlan metadata/info
was not getting cleared for the VFs which causes vlan PING to stop.

This patch clears the vlan metadata/info so that VLANs gets
re-configured back in the hardware in VF's reload flow and
PING/traffic continues for VLANs created over the VFs.

Fixes: 04f05230 ("bnx2x: Remove configured vlans as part of unload sequence.")
Signed-off-by: default avatarManish Chopra <manishc@marvell.com>
Signed-off-by: default avatarSudarsana Kalluru <skalluru@marvell.com>
Signed-off-by: default avatarShahed Shaikh <shshaikh@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42eb4554
...@@ -3057,12 +3057,13 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) ...@@ -3057,12 +3057,13 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
/* if VF indicate to PF this function is going down (PF will delete sp /* if VF indicate to PF this function is going down (PF will delete sp
* elements and clear initializations * elements and clear initializations
*/ */
if (IS_VF(bp)) if (IS_VF(bp)) {
bnx2x_clear_vlan_info(bp);
bnx2x_vfpf_close_vf(bp); bnx2x_vfpf_close_vf(bp);
else if (unload_mode != UNLOAD_RECOVERY) } else if (unload_mode != UNLOAD_RECOVERY) {
/* if this is a normal/close unload need to clean up chip*/ /* if this is a normal/close unload need to clean up chip*/
bnx2x_chip_cleanup(bp, unload_mode, keep_link); bnx2x_chip_cleanup(bp, unload_mode, keep_link);
else { } else {
/* Send the UNLOAD_REQUEST to the MCP */ /* Send the UNLOAD_REQUEST to the MCP */
bnx2x_send_unload_req(bp, unload_mode); bnx2x_send_unload_req(bp, unload_mode);
......
...@@ -425,6 +425,8 @@ void bnx2x_set_reset_global(struct bnx2x *bp); ...@@ -425,6 +425,8 @@ void bnx2x_set_reset_global(struct bnx2x *bp);
void bnx2x_disable_close_the_gate(struct bnx2x *bp); void bnx2x_disable_close_the_gate(struct bnx2x *bp);
int bnx2x_init_hw_func_cnic(struct bnx2x *bp); int bnx2x_init_hw_func_cnic(struct bnx2x *bp);
void bnx2x_clear_vlan_info(struct bnx2x *bp);
/** /**
* bnx2x_sp_event - handle ramrods completion. * bnx2x_sp_event - handle ramrods completion.
* *
......
...@@ -8482,11 +8482,21 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan, ...@@ -8482,11 +8482,21 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan,
return rc; return rc;
} }
void bnx2x_clear_vlan_info(struct bnx2x *bp)
{
struct bnx2x_vlan_entry *vlan;
/* Mark that hw forgot all entries */
list_for_each_entry(vlan, &bp->vlan_reg, link)
vlan->hw = false;
bp->vlan_cnt = 0;
}
static int bnx2x_del_all_vlans(struct bnx2x *bp) static int bnx2x_del_all_vlans(struct bnx2x *bp)
{ {
struct bnx2x_vlan_mac_obj *vlan_obj = &bp->sp_objs[0].vlan_obj; struct bnx2x_vlan_mac_obj *vlan_obj = &bp->sp_objs[0].vlan_obj;
unsigned long ramrod_flags = 0, vlan_flags = 0; unsigned long ramrod_flags = 0, vlan_flags = 0;
struct bnx2x_vlan_entry *vlan;
int rc; int rc;
__set_bit(RAMROD_COMP_WAIT, &ramrod_flags); __set_bit(RAMROD_COMP_WAIT, &ramrod_flags);
...@@ -8495,10 +8505,7 @@ static int bnx2x_del_all_vlans(struct bnx2x *bp) ...@@ -8495,10 +8505,7 @@ static int bnx2x_del_all_vlans(struct bnx2x *bp)
if (rc) if (rc)
return rc; return rc;
/* Mark that hw forgot all entries */ bnx2x_clear_vlan_info(bp);
list_for_each_entry(vlan, &bp->vlan_reg, link)
vlan->hw = false;
bp->vlan_cnt = 0;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment