be2net: Fix VLAN promiscuous mode programming
Subsystems (3)
PATCH 3/7 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 Ajit Khaparde <[email protected]>
--- drivers/net/ethernet/emulex/benet/be.h | 1 + drivers/net/ethernet/emulex/benet/be_cmds.c | 9 ++++++++ drivers/net/ethernet/emulex/benet/be_cmds.h | 2 ++ drivers/net/ethernet/emulex/benet/be_main.c | 34 ++++++++++++++++++++++++----- 4 files changed, 40 insertions(+), 6 deletions(-)
drivers/net/ethernet/emulex/benet/be.h +1 -0
@@ -333,6 +333,7 @@ enum vf_state {#define BE_FLAGS_LINK_STATUS_INIT 1#define BE_FLAGS_WORKER_SCHEDULED (1 << 3) +#define BE_FLAGS_VLAN_PROMISC (1 << 4)#define BE_FLAGS_NAPI_ENABLED (1 << 9)#define BE_UC_PMAC_COUNT 30#define BE_VF_UC_PMAC_COUNT 2
drivers/net/ethernet/emulex/benet/be_cmds.c +9 -0
@@ -180,6 +180,9 @@ static int be_mcc_compl_process(struct be_adapter *adapter,dev_err (&adapter->pdev->dev,"opcode %d-%d failed:status %d-%d\n" , opcode, subsystem, compl_status, extd_status); + +if (extd_status ==MCC_ADDL_STS_INSUFFICIENT_RESOURCES ) +return extd_status; } } done:
@@ -1812,6 +1815,12 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value) }else if (flags &IFF_ALLMULTI ) { req->if_flags_mask = req->if_flags =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 {struct netdev_hw_addr *ha;int i =0 ;
drivers/net/ethernet/emulex/benet/be_cmds.h +2 -0
@@ -60,6 +60,8 @@ enum { MCC_STATUS_NOT_SUPPORTED = 66 }; +#define MCC_ADDL_STS_INSUFFICIENT_RESOURCES 0x16 +#define CQE_STATUS_COMPL_MASK 0xFFFF#define CQE_STATUS_COMPL_SHIFT 0/* bits 0 - 15 */ #define CQE_STATUS_EXTD_MASK 0xFFFF
drivers/net/ethernet/emulex/benet/be_main.c +28 -6
@@ -1013,18 +1013,40 @@ static int be_vid_config(struct be_adapter *adapter) status =be_cmd_vlan_config (adapter, adapter->if_handle, vids, num,1 ,0 ); -/* Set to VLAN promisc mode as setting VLAN filter failed */ if (status) { -dev_info (&adapter->pdev->dev,"Exhausted VLAN HW filters.\n" ); -dev_info (&adapter->pdev->dev,"Disabling HW VLAN filtering.\n" ); - goto set_vlan_promisc; +/* Set to VLAN promisc mode as setting VLAN filter failed */ +if (status ==MCC_ADDL_STS_INSUFFICIENT_RESOURCES ) + 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; set_vlan_promisc: - status =be_cmd_vlan_config (adapter, adapter->if_handle, -NULL ,0 ,1 ,1 ); +dev_warn (&adapter->pdev->dev,"Exhausted VLAN HW filters.\n" ); + + 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; }
Signature · 1 line
1.8.1.2