Эх сурвалжийг харах

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>
Yuval Mintz 8 жил өмнө
parent
commit
7b7e70f979

+ 10 - 2
drivers/net/ethernet/qlogic/qed/qed_l2.c

@@ -1652,6 +1652,7 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
 
 
 	if (IS_PF(cdev)) {
 	if (IS_PF(cdev)) {
 		int max_vf_vlan_filters = 0;
 		int max_vf_vlan_filters = 0;
+		int max_vf_mac_filters = 0;
 
 
 		if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
 		if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
 			for_each_hwfn(cdev, i)
 			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;
 			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 *
 			max_vf_vlan_filters = cdev->p_iov_info->total_vfs *
 					      QED_ETH_VF_NUM_VLAN_FILTERS;
 					      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;
 					 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,
 		ether_addr_copy(info->port_mac,
 				cdev->hwfns[0].hw_info.hw_mac_addr);
 				cdev->hwfns[0].hw_info.hw_mac_addr);

+ 3 - 1
drivers/net/ethernet/qlogic/qede/qede_main.c

@@ -2365,6 +2365,8 @@ static void qede_init_ndev(struct qede_dev *edev)
 
 
 	qede_set_ethtool_ops(ndev);
 	qede_set_ethtool_ops(ndev);
 
 
+	ndev->priv_flags = IFF_UNICAST_FLT;
+
 	/* user-changeble features */
 	/* user-changeble features */
 	hw_features = NETIF_F_GRO | NETIF_F_SG |
 	hw_features = NETIF_F_GRO | NETIF_F_SG |
 		      NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
 		      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 */
 	/* Check for promiscuous */
 	if ((ndev->flags & IFF_PROMISC) ||
 	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;
 		accept_flags = QED_FILTER_RX_MODE_TYPE_PROMISC;
 	} else {
 	} else {
 		/* Add MAC filters according to the unicast secondary macs */
 		/* Add MAC filters according to the unicast secondary macs */

+ 1 - 0
include/linux/qed/qed_eth_if.h

@@ -23,6 +23,7 @@ struct qed_dev_eth_info {
 
 
 	u8	port_mac[ETH_ALEN];
 	u8	port_mac[ETH_ALEN];
 	u8	num_vlan_filters;
 	u8	num_vlan_filters;
+	u16	num_mac_filters;
 
 
 	/* Legacy VF - this affects the datapath, so qede has to know */
 	/* Legacy VF - this affects the datapath, so qede has to know */
 	bool is_legacy;
 	bool is_legacy;