net/octeontx: handle port reconfiguration
[dpdk.git] / drivers / net / nfb / nfb_rxmode.c
index 17708c8..ca6e4d5 100644 (file)
@@ -14,8 +14,6 @@ nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
                dev->data->dev_private;
        uint16_t i;
 
-       internals->rx_filter_original = RXMAC_MAC_FILTER_PROMISCUOUS;
-
        for (i = 0; i < internals->max_rxmac; ++i) {
                nc_rxmac_mac_filter_enable(internals->rxmac[i],
                        RXMAC_MAC_FILTER_PROMISCUOUS);
@@ -30,16 +28,13 @@ nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
        struct pmd_internals *internals = (struct pmd_internals *)
                dev->data->dev_private;
        uint16_t i;
+       enum nc_rxmac_mac_filter filter = RXMAC_MAC_FILTER_TABLE_BCAST;
 
-       internals->rx_filter_original = RXMAC_MAC_FILTER_TABLE;
-
-       /* if promisc is not enabled, do nothing */
-       if (!nfb_eth_promiscuous_get(dev))
-               return 0;
+       if (dev->data->all_multicast)
+               filter = RXMAC_MAC_FILTER_TABLE_BCAST_MCAST;
 
        for (i = 0; i < internals->max_rxmac; ++i) {
-               nc_rxmac_mac_filter_enable(internals->rxmac[i],
-                       RXMAC_MAC_FILTER_TABLE);
+               nc_rxmac_mac_filter_enable(internals->rxmac[i], filter);
        }
 
        return 0;
@@ -54,25 +49,30 @@ nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
        struct nc_rxmac_status status;
        status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
 
-       nc_rxmac_read_status(internals->rxmac[0], &status);
+       if (internals->max_rxmac > 0)
+               nc_rxmac_read_status(internals->rxmac[0], &status);
 
        return (status.mac_filter == RXMAC_MAC_FILTER_PROMISCUOUS);
 }
 
-void
+int
 nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
 {
        struct pmd_internals *internals = (struct pmd_internals *)
                dev->data->dev_private;
 
        uint16_t i;
+       if (dev->data->promiscuous)
+               return 0;
        for (i = 0; i < internals->max_rxmac; ++i) {
                nc_rxmac_mac_filter_enable(internals->rxmac[i],
                        RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
        }
+
+       return 0;
 }
 
-void
+int
 nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
 {
        struct pmd_internals *internals = (struct pmd_internals *)
@@ -80,14 +80,15 @@ nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
 
        uint16_t i;
 
-       /* if multicast is not enabled do nothing */
-       if (!nfb_eth_allmulticast_get(dev))
-               return;
+       if (dev->data->promiscuous)
+               return 0;
 
        for (i = 0; i < internals->max_rxmac; ++i) {
                nc_rxmac_mac_filter_enable(internals->rxmac[i],
-                       internals->rx_filter_original);
+                       RXMAC_MAC_FILTER_TABLE_BCAST);
        }
+
+       return 0;
 }
 
 int
@@ -98,7 +99,9 @@ nfb_eth_allmulticast_get(struct rte_eth_dev *dev)
 
        struct nc_rxmac_status status;
        status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
-       nc_rxmac_read_status(internals->rxmac[0], &status);
+
+       if (internals->max_rxmac > 0)
+               nc_rxmac_read_status(internals->rxmac[0], &status);
 
        return (status.mac_filter == RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
 }