mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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:
parent
d44517fde6
commit
d9d604f865
4 changed files with 40 additions and 6 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue