net/bnx2x: fix Rx mode configuration
authorRasesh Mody <rasesh.mody@cavium.com>
Tue, 24 Jan 2017 05:38:33 +0000 (21:38 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 30 Jan 2017 21:18:26 +0000 (22:18 +0100)
Check if promisc mode was set when setting allmulti mode and vice-versa.
Introduced BNX2X_RX_MODE_ALLMULTI_PROMISC for the same. If check is
absent the filter configuration gets over written.

Fixes: 540a211084a7 ("bnx2x: driver core")
Fixes: 5dbc53d7e5a2 ("net/bnx2x: restrict Rx mask flags sent to the PF")
Cc: stable@dpdk.org
Signed-off-by: Rasesh Mody <rasesh.mody@cavium.com>
drivers/net/bnx2x/bnx2x.c
drivers/net/bnx2x/bnx2x.h
drivers/net/bnx2x/bnx2x_ethdev.c
drivers/net/bnx2x/bnx2x_vfpf.c

index 2856630..0d16a73 100644 (file)
@@ -1438,6 +1438,7 @@ bnx2x_fill_accept_flags(struct bnx2x_softc *sc, uint32_t rx_mode,
 
                break;
 
+       case BNX2X_RX_MODE_ALLMULTI_PROMISC:
        case BNX2X_RX_MODE_PROMISC:
                /*
                 * According to deffinition of SI mode, iface in promisc mode
index 59064d8..b3cd5fc 100644 (file)
@@ -1147,11 +1147,12 @@ struct bnx2x_softc {
 #define BNX2X_RECOVERY_NIC_LOADING 5
 
        uint32_t rx_mode;
-#define BNX2X_RX_MODE_NONE     0
-#define BNX2X_RX_MODE_NORMAL   1
-#define BNX2X_RX_MODE_ALLMULTI 2
-#define BNX2X_RX_MODE_PROMISC  3
-#define BNX2X_MAX_MULTICAST    64
+#define BNX2X_RX_MODE_NONE             0
+#define BNX2X_RX_MODE_NORMAL           1
+#define BNX2X_RX_MODE_ALLMULTI         2
+#define BNX2X_RX_MODE_ALLMULTI_PROMISC 3
+#define BNX2X_RX_MODE_PROMISC          4
+#define BNX2X_MAX_MULTICAST            64
 
        struct bnx2x_port port;
 
index 7140118..d149468 100644 (file)
@@ -256,6 +256,8 @@ bnx2x_promisc_enable(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
        sc->rx_mode = BNX2X_RX_MODE_PROMISC;
+       if (rte_eth_allmulticast_get(dev->data->port_id) == 1)
+               sc->rx_mode = BNX2X_RX_MODE_ALLMULTI_PROMISC;
        bnx2x_set_rx_mode(sc);
 }
 
@@ -266,6 +268,8 @@ bnx2x_promisc_disable(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
        sc->rx_mode = BNX2X_RX_MODE_NORMAL;
+       if (rte_eth_allmulticast_get(dev->data->port_id) == 1)
+               sc->rx_mode = BNX2X_RX_MODE_ALLMULTI;
        bnx2x_set_rx_mode(sc);
 }
 
@@ -276,6 +280,8 @@ bnx2x_dev_allmulticast_enable(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
        sc->rx_mode = BNX2X_RX_MODE_ALLMULTI;
+       if (rte_eth_promiscuous_get(dev->data->port_id) == 1)
+               sc->rx_mode = BNX2X_RX_MODE_ALLMULTI_PROMISC;
        bnx2x_set_rx_mode(sc);
 }
 
@@ -286,6 +292,8 @@ bnx2x_dev_allmulticast_disable(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
        sc->rx_mode = BNX2X_RX_MODE_NORMAL;
+       if (rte_eth_promiscuous_get(dev->data->port_id) == 1)
+               sc->rx_mode = BNX2X_RX_MODE_PROMISC;
        bnx2x_set_rx_mode(sc);
 }
 
index c47beb0..0ca0df8 100644 (file)
@@ -648,6 +648,7 @@ bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc)
                query->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST;
                query->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
                break;
+       case BNX2X_RX_MODE_ALLMULTI_PROMISC:
        case BNX2X_RX_MODE_PROMISC:
                query->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_UNICAST;
                query->rx_mask |= VFPF_RX_MASK_ACCEPT_ALL_MULTICAST;