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 <ajit.khaparde@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
d44517fde6
Коммит
d9d604f865
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче