mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 17:41:22 +00:00
bnx2x: Fix VF's VLAN reconfiguration in reload.
Commit04f05230c5
("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:04f05230c5
("bnx2x: Remove configured vlans as part of unload sequence.") Signed-off-by: Manish Chopra <manishc@marvell.com> Signed-off-by: Sudarsana Kalluru <skalluru@marvell.com> Signed-off-by: Shahed Shaikh <shshaikh@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
42eb455470
commit
4a4d2d372f
@ -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);
|
|||||||
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,
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user