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

Commit d9d604f8 authored by Ajit Khaparde's avatar Ajit Khaparde Committed by David S. Miller
Browse files

be2net: Fix VLAN promiscuous mode programming



When the interface runs out of the allocated entries in VLAN table,
we program the interface in VLAN promiscuous mode.
Use OPCODE_COMMON_NTWK_RX_FILTER to set VLAN Promiscuous mode
instead of OPCODE_COMMON_NTWK_VLAN_CONFIG.

Signed-off-by: default avatarAjit Khaparde <ajit.khaparde@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d44517fd
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -333,6 +333,7 @@ enum vf_state {


#define BE_FLAGS_LINK_STATUS_INIT		1
#define BE_FLAGS_LINK_STATUS_INIT		1
#define BE_FLAGS_WORKER_SCHEDULED		(1 << 3)
#define BE_FLAGS_WORKER_SCHEDULED		(1 << 3)
#define BE_FLAGS_VLAN_PROMISC			(1 << 4)
#define BE_FLAGS_NAPI_ENABLED			(1 << 9)
#define BE_FLAGS_NAPI_ENABLED			(1 << 9)
#define BE_UC_PMAC_COUNT		30
#define BE_UC_PMAC_COUNT		30
#define BE_VF_UC_PMAC_COUNT		2
#define BE_VF_UC_PMAC_COUNT		2
+9 −0
Original line number Original line Diff line number Diff line
@@ -180,6 +180,9 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
			dev_err(&adapter->pdev->dev,
			dev_err(&adapter->pdev->dev,
				"opcode %d-%d failed:status %d-%d\n",
				"opcode %d-%d failed:status %d-%d\n",
				opcode, subsystem, compl_status, extd_status);
				opcode, subsystem, compl_status, extd_status);

			if (extd_status == MCC_ADDL_STS_INSUFFICIENT_RESOURCES)
				return extd_status;
		}
		}
	}
	}
done:
done:
@@ -1812,6 +1815,12 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
	} else if (flags & IFF_ALLMULTI) {
	} else if (flags & IFF_ALLMULTI) {
		req->if_flags_mask = req->if_flags =
		req->if_flags_mask = req->if_flags =
				cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
				cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
	} else if (flags & BE_FLAGS_VLAN_PROMISC) {
		req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_VLAN_PROMISCUOUS);

		if (value == ON)
			req->if_flags =
				cpu_to_le32(BE_IF_FLAGS_VLAN_PROMISCUOUS);
	} else {
	} else {
		struct netdev_hw_addr *ha;
		struct netdev_hw_addr *ha;
		int i = 0;
		int i = 0;
+2 −0
Original line number Original line Diff line number Diff line
@@ -60,6 +60,8 @@ enum {
	MCC_STATUS_NOT_SUPPORTED = 66
	MCC_STATUS_NOT_SUPPORTED = 66
};
};


#define MCC_ADDL_STS_INSUFFICIENT_RESOURCES	0x16

#define CQE_STATUS_COMPL_MASK		0xFFFF
#define CQE_STATUS_COMPL_MASK		0xFFFF
#define CQE_STATUS_COMPL_SHIFT		0	/* bits 0 - 15 */
#define CQE_STATUS_COMPL_SHIFT		0	/* bits 0 - 15 */
#define CQE_STATUS_EXTD_MASK		0xFFFF
#define CQE_STATUS_EXTD_MASK		0xFFFF
+28 −6
Original line number Original line Diff line number Diff line
@@ -1013,18 +1013,40 @@ static int be_vid_config(struct be_adapter *adapter)
	status = be_cmd_vlan_config(adapter, adapter->if_handle,
	status = be_cmd_vlan_config(adapter, adapter->if_handle,
				    vids, num, 1, 0);
				    vids, num, 1, 0);


	/* Set to VLAN promisc mode as setting VLAN filter failed */
	if (status) {
	if (status) {
		dev_info(&adapter->pdev->dev, "Exhausted VLAN HW filters.\n");
		/* Set to VLAN promisc mode as setting VLAN filter failed */
		dev_info(&adapter->pdev->dev, "Disabling HW VLAN filtering.\n");
		if (status == MCC_ADDL_STS_INSUFFICIENT_RESOURCES)
			goto set_vlan_promisc;
			goto set_vlan_promisc;
		dev_err(&adapter->pdev->dev,
			"Setting HW VLAN filtering failed.\n");
	} else {
		if (adapter->flags & BE_FLAGS_VLAN_PROMISC) {
			/* hw VLAN filtering re-enabled. */
			status = be_cmd_rx_filter(adapter,
						  BE_FLAGS_VLAN_PROMISC, OFF);
			if (!status) {
				dev_info(&adapter->pdev->dev,
					 "Disabling VLAN Promiscuous mode.\n");
				adapter->flags &= ~BE_FLAGS_VLAN_PROMISC;
				dev_info(&adapter->pdev->dev,
					 "Re-Enabling HW VLAN filtering\n");
			}
		}
	}
	}


	return status;
	return status;


set_vlan_promisc:
set_vlan_promisc:
	status = be_cmd_vlan_config(adapter, adapter->if_handle,
	dev_warn(&adapter->pdev->dev, "Exhausted VLAN HW filters.\n");
				    NULL, 0, 1, 1);

	status = be_cmd_rx_filter(adapter, BE_FLAGS_VLAN_PROMISC, ON);
	if (!status) {
		dev_info(&adapter->pdev->dev, "Enable VLAN Promiscuous mode\n");
		dev_info(&adapter->pdev->dev, "Disabling HW VLAN filtering\n");
		adapter->flags |= BE_FLAGS_VLAN_PROMISC;
	} else
		dev_err(&adapter->pdev->dev,
			"Failed to enable VLAN Promiscuous mode.\n");
	return status;
	return status;
}
}