Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7c8e00e authored by Sudarsana Reddy Kalluru's avatar Sudarsana Reddy Kalluru Committed by Greg Kroah-Hartman
Browse files

bnx2x: Remove configured vlans as part of unload sequence.



[ Upstream commit 04f05230c5c13b1384f66f5186a68d7499e34622 ]

Vlans are not getting removed when drivers are unloaded. The recent storm
firmware versions had added safeguards against re-configuring an already
configured vlan. As a result, PF inner reload flows (e.g., mtu change)
might trigger an assertion.
This change is going to remove vlans (same as we do for MACs) when doing
a chip cleanup during unload.

Signed-off-by: default avatarSudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: default avatarAriel Elior <ariel.elior@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 40790571
Loading
Loading
Loading
Loading
+27 −7
Original line number Original line Diff line number Diff line
@@ -8462,6 +8462,7 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan,
	/* Fill a user request section if needed */
	/* Fill a user request section if needed */
	if (!test_bit(RAMROD_CONT, ramrod_flags)) {
	if (!test_bit(RAMROD_CONT, ramrod_flags)) {
		ramrod_param.user_req.u.vlan.vlan = vlan;
		ramrod_param.user_req.u.vlan.vlan = vlan;
		__set_bit(BNX2X_VLAN, &ramrod_param.user_req.vlan_mac_flags);
		/* Set the command: ADD or DEL */
		/* Set the command: ADD or DEL */
		if (set)
		if (set)
			ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD;
			ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD;
@@ -8482,6 +8483,27 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan,
	return rc;
	return rc;
}
}


static int bnx2x_del_all_vlans(struct bnx2x *bp)
{
	struct bnx2x_vlan_mac_obj *vlan_obj = &bp->sp_objs[0].vlan_obj;
	unsigned long ramrod_flags = 0, vlan_flags = 0;
	struct bnx2x_vlan_entry *vlan;
	int rc;

	__set_bit(RAMROD_COMP_WAIT, &ramrod_flags);
	__set_bit(BNX2X_VLAN, &vlan_flags);
	rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_flags, &ramrod_flags);
	if (rc)
		return rc;

	/* Mark that hw forgot all entries */
	list_for_each_entry(vlan, &bp->vlan_reg, link)
		vlan->hw = false;
	bp->vlan_cnt = 0;

	return 0;
}

int bnx2x_del_all_macs(struct bnx2x *bp,
int bnx2x_del_all_macs(struct bnx2x *bp,
		       struct bnx2x_vlan_mac_obj *mac_obj,
		       struct bnx2x_vlan_mac_obj *mac_obj,
		       int mac_type, bool wait_for_comp)
		       int mac_type, bool wait_for_comp)
@@ -9320,6 +9342,11 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link)
		BNX2X_ERR("Failed to schedule DEL commands for UC MACs list: %d\n",
		BNX2X_ERR("Failed to schedule DEL commands for UC MACs list: %d\n",
			  rc);
			  rc);


	/* Remove all currently configured VLANs */
	rc = bnx2x_del_all_vlans(bp);
	if (rc < 0)
		BNX2X_ERR("Failed to delete all VLANs\n");

	/* Disable LLH */
	/* Disable LLH */
	if (!CHIP_IS_E1(bp))
	if (!CHIP_IS_E1(bp))
		REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 0);
		REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 0);
@@ -13007,13 +13034,6 @@ static void bnx2x_vlan_configure(struct bnx2x *bp, bool set_rx_mode)


int bnx2x_vlan_reconfigure_vid(struct bnx2x *bp)
int bnx2x_vlan_reconfigure_vid(struct bnx2x *bp)
{
{
	struct bnx2x_vlan_entry *vlan;

	/* The hw forgot all entries after reload */
	list_for_each_entry(vlan, &bp->vlan_reg, link)
		vlan->hw = false;
	bp->vlan_cnt = 0;

	/* Don't set rx mode here. Our caller will do it. */
	/* Don't set rx mode here. Our caller will do it. */
	bnx2x_vlan_configure(bp, false);
	bnx2x_vlan_configure(bp, false);


+3 −1
Original line number Original line Diff line number Diff line
@@ -265,6 +265,7 @@ enum {
	BNX2X_ETH_MAC,
	BNX2X_ETH_MAC,
	BNX2X_ISCSI_ETH_MAC,
	BNX2X_ISCSI_ETH_MAC,
	BNX2X_NETQ_ETH_MAC,
	BNX2X_NETQ_ETH_MAC,
	BNX2X_VLAN,
	BNX2X_DONT_CONSUME_CAM_CREDIT,
	BNX2X_DONT_CONSUME_CAM_CREDIT,
	BNX2X_DONT_CONSUME_CAM_CREDIT_DEST,
	BNX2X_DONT_CONSUME_CAM_CREDIT_DEST,
};
};
@@ -272,7 +273,8 @@ enum {
#define BNX2X_VLAN_MAC_CMP_MASK	(1 << BNX2X_UC_LIST_MAC | \
#define BNX2X_VLAN_MAC_CMP_MASK	(1 << BNX2X_UC_LIST_MAC | \
				 1 << BNX2X_ETH_MAC | \
				 1 << BNX2X_ETH_MAC | \
				 1 << BNX2X_ISCSI_ETH_MAC | \
				 1 << BNX2X_ISCSI_ETH_MAC | \
				 1 << BNX2X_NETQ_ETH_MAC)
				 1 << BNX2X_NETQ_ETH_MAC | \
				 1 << BNX2X_VLAN)
#define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \
#define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \
	((flags) & BNX2X_VLAN_MAC_CMP_MASK)
	((flags) & BNX2X_VLAN_MAC_CMP_MASK)