When the port is closed, hardware is reset to power on. And
txgbe_dev_stop() is just returned 0 to avoid secondary calls,
so that the link led remains on. Fix this bug by adding to turn
off the copper/laser.

Fixes: e0d876ef6bbc ("net/txgbe: support device stop and close")
Cc: sta...@dpdk.org

Signed-off-by: Jiawen Wu <jiawe...@trustnetic.com>
---
 drivers/net/txgbe/txgbe_ethdev.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index e789e34c01..2dad820cb5 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -1929,7 +1929,7 @@ txgbe_dev_stop(struct rte_eth_dev *dev)
        struct txgbe_tm_conf *tm_conf = TXGBE_DEV_TM_CONF(dev);
 
        if (hw->adapter_stopped)
-               return 0;
+               goto out;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -1953,14 +1953,6 @@ txgbe_dev_stop(struct rte_eth_dev *dev)
        for (vf = 0; vfinfo != NULL && vf < pci_dev->max_vfs; vf++)
                vfinfo[vf].clear_to_send = false;
 
-       if (hw->phy.media_type == txgbe_media_type_copper) {
-               /* Turn off the copper */
-               hw->phy.set_phy_power(hw, false);
-       } else {
-               /* Turn off the laser */
-               hw->mac.disable_tx_laser(hw);
-       }
-
        txgbe_dev_clear_queues(dev);
 
        /* Clear stored conf */
@@ -1991,6 +1983,16 @@ txgbe_dev_stop(struct rte_eth_dev *dev)
        dev->data->dev_started = 0;
        hw->dev_start = false;
 
+out:
+       /* close phy to prevent reset in dev_close from restarting physical 
link */
+       if (hw->phy.media_type == txgbe_media_type_copper) {
+               /* Turn off the copper */
+               hw->phy.set_phy_power(hw, false);
+       } else {
+               /* Turn off the laser */
+               hw->mac.disable_tx_laser(hw);
+       }
+
        return 0;
 }
 
-- 
2.27.0

Reply via email to