mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 05:33:09 +00:00
qed*: Allow unicast filtering
Apparently qede fails to set IFF_UNICAST_FLT, and as a result is not actually performing unicast MAC filtering. While we're at it - relax a hard-coded limitation that limits each interface into using at most 15 unicast MAC addresses before turning promiscuous. Instead utilize the HW resources to their limit. Signed-off-by: Yuval Mintz <Yuval.Mintz@caviumnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
256958538a
commit
7b7e70f979
@ -1652,6 +1652,7 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
|
||||
|
||||
if (IS_PF(cdev)) {
|
||||
int max_vf_vlan_filters = 0;
|
||||
int max_vf_mac_filters = 0;
|
||||
|
||||
if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
|
||||
for_each_hwfn(cdev, i)
|
||||
@ -1665,11 +1666,18 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
|
||||
info->num_queues = cdev->num_hwfns;
|
||||
}
|
||||
|
||||
if (IS_QED_SRIOV(cdev))
|
||||
if (IS_QED_SRIOV(cdev)) {
|
||||
max_vf_vlan_filters = cdev->p_iov_info->total_vfs *
|
||||
QED_ETH_VF_NUM_VLAN_FILTERS;
|
||||
info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN) -
|
||||
max_vf_mac_filters = cdev->p_iov_info->total_vfs *
|
||||
QED_ETH_VF_NUM_MAC_FILTERS;
|
||||
}
|
||||
info->num_vlan_filters = RESC_NUM(QED_LEADING_HWFN(cdev),
|
||||
QED_VLAN) -
|
||||
max_vf_vlan_filters;
|
||||
info->num_mac_filters = RESC_NUM(QED_LEADING_HWFN(cdev),
|
||||
QED_MAC) -
|
||||
max_vf_mac_filters;
|
||||
|
||||
ether_addr_copy(info->port_mac,
|
||||
cdev->hwfns[0].hw_info.hw_mac_addr);
|
||||
|
@ -2365,6 +2365,8 @@ static void qede_init_ndev(struct qede_dev *edev)
|
||||
|
||||
qede_set_ethtool_ops(ndev);
|
||||
|
||||
ndev->priv_flags = IFF_UNICAST_FLT;
|
||||
|
||||
/* user-changeble features */
|
||||
hw_features = NETIF_F_GRO | NETIF_F_SG |
|
||||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
@ -3937,7 +3939,7 @@ static void qede_config_rx_mode(struct net_device *ndev)
|
||||
|
||||
/* Check for promiscuous */
|
||||
if ((ndev->flags & IFF_PROMISC) ||
|
||||
(uc_count > 15)) { /* @@@TBD resource allocation - 1 */
|
||||
(uc_count > edev->dev_info.num_mac_filters - 1)) {
|
||||
accept_flags = QED_FILTER_RX_MODE_TYPE_PROMISC;
|
||||
} else {
|
||||
/* Add MAC filters according to the unicast secondary macs */
|
||||
|
@ -23,6 +23,7 @@ struct qed_dev_eth_info {
|
||||
|
||||
u8 port_mac[ETH_ALEN];
|
||||
u8 num_vlan_filters;
|
||||
u16 num_mac_filters;
|
||||
|
||||
/* Legacy VF - this affects the datapath, so qede has to know */
|
||||
bool is_legacy;
|
||||
|
Loading…
Reference in New Issue
Block a user