From: Rakesh Kudurumalla <rkuduruma...@marvell.com>

reset pfc and flow control if pfc mode and flow
control are set respectively during unintilization
of pf or vf

Signed-off-by: Rakesh Kudurumalla <rkuduruma...@marvell.com>
---
 drivers/net/cnxk/cnxk_ethdev.c | 38 ++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c
index d711eb6b27..22072d29b0 100644
--- a/drivers/net/cnxk/cnxk_ethdev.c
+++ b/drivers/net/cnxk/cnxk_ethdev.c
@@ -1934,6 +1934,8 @@ cnxk_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool 
reset)
 {
        struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
        const struct eth_dev_ops *dev_ops = eth_dev->dev_ops;
+       struct cnxk_pfc_cfg *pfc_cfg = &dev->pfc_cfg;
+       struct cnxk_fc_cfg *fc_cfg = &dev->fc_cfg;
        struct rte_eth_pfc_queue_conf pfc_conf;
        struct roc_nix *nix = &dev->nix;
        struct rte_eth_fc_conf fc_conf;
@@ -1957,21 +1959,27 @@ cnxk_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool 
reset)
        /* Restore 802.3 Flow control configuration */
        memset(&pfc_conf, 0, sizeof(struct rte_eth_pfc_queue_conf));
        memset(&fc_conf, 0, sizeof(struct rte_eth_fc_conf));
-       fc_conf.mode = RTE_ETH_FC_NONE;
-       rc = cnxk_nix_flow_ctrl_set(eth_dev, &fc_conf);
-
-       pfc_conf.mode = RTE_ETH_FC_NONE;
-       for (i = 0; i < RTE_MAX(eth_dev->data->nb_rx_queues,
-                               eth_dev->data->nb_tx_queues);
-            i++) {
-               pfc_conf.rx_pause.tc = ROC_NIX_PFC_CLASS_INVALID;
-               pfc_conf.rx_pause.tx_qid = i;
-               pfc_conf.tx_pause.tc = ROC_NIX_PFC_CLASS_INVALID;
-               pfc_conf.tx_pause.rx_qid = i;
-               rc = cnxk_nix_priority_flow_ctrl_queue_config(eth_dev,
-                                                             &pfc_conf);
-               if (rc && rc != -ENOTSUP)
-                       plt_err("Failed to reset PFC. error code(%d)", rc);
+       if (fc_cfg->rx_pause || fc_cfg->tx_pause) {
+               fc_conf.mode = RTE_ETH_FC_NONE;
+               rc = cnxk_nix_flow_ctrl_set(eth_dev, &fc_conf);
+               if (rc < 0)
+                       plt_err("Failed to reset control flow. error code(%d)",
+                                       rc);
+       }
+       if (pfc_cfg->rx_pause_en || pfc_cfg->tx_pause_en) {
+               for (i = 0; i < RTE_MAX(eth_dev->data->nb_rx_queues,
+                                       eth_dev->data->nb_tx_queues);
+                    i++) {
+                       pfc_conf.mode = RTE_ETH_FC_NONE;
+                       pfc_conf.rx_pause.tc = ROC_NIX_PFC_CLASS_INVALID;
+                       pfc_conf.rx_pause.tx_qid = i;
+                       pfc_conf.tx_pause.tc = ROC_NIX_PFC_CLASS_INVALID;
+                       pfc_conf.tx_pause.rx_qid = i;
+                       rc = cnxk_nix_priority_flow_ctrl_queue_config(eth_dev,
+                                       &pfc_conf);
+                       if (rc && rc != -ENOTSUP)
+                               plt_err("Failed to reset PFC. error code(%d)", 
rc);
+               }
        }
 
        /* Disable and free rte_meter entries */
-- 
2.25.1

Reply via email to