/* Default LPI timers */
 #define STMMAC_DEFAULT_LIT_LS  0x3E8
 #define STMMAC_DEFAULT_TWT_LS  0x1E
+#define STMMAC_ET_MAX          0xFFFFF
 
 #define STMMAC_CHAIN_MODE      0x1
 #define STMMAC_RING_MODE       0x2
 
  */
 #define GMAC4_LPI_CTRL_STATUS  0xd0
 #define GMAC4_LPI_TIMER_CTRL   0xd4
+#define GMAC4_LPI_ENTRY_TIMER  0xd8
 
 /* LPI control and status defines */
 #define GMAC4_LPI_CTRL_STATUS_LPITCSE  BIT(21) /* LPI Tx Clock Stop Enable */
+#define GMAC4_LPI_CTRL_STATUS_LPIATE   BIT(20) /* LPI Timer Enable */
 #define GMAC4_LPI_CTRL_STATUS_LPITXA   BIT(19) /* Enable LPI TX Automate */
 #define GMAC4_LPI_CTRL_STATUS_PLS      BIT(17) /* PHY Link Status */
 #define GMAC4_LPI_CTRL_STATUS_LPIEN    BIT(16) /* LPI Enable */
 
        writel(value, ioaddr + GMAC4_LPI_CTRL_STATUS);
 }
 
+static void dwmac4_set_eee_lpi_entry_timer(struct mac_device_info *hw, int et)
+{
+       void __iomem *ioaddr = hw->pcsr;
+       int value = et & STMMAC_ET_MAX;
+       int regval;
+
+       /* Program LPI entry timer value into register */
+       writel(value, ioaddr + GMAC4_LPI_ENTRY_TIMER);
+
+       /* Enable/disable LPI entry timer */
+       regval = readl(ioaddr + GMAC4_LPI_CTRL_STATUS);
+       regval |= GMAC4_LPI_CTRL_STATUS_LPIEN | GMAC4_LPI_CTRL_STATUS_LPITXA;
+
+       if (et)
+               regval |= GMAC4_LPI_CTRL_STATUS_LPIATE;
+       else
+               regval &= ~GMAC4_LPI_CTRL_STATUS_LPIATE;
+
+       writel(regval, ioaddr + GMAC4_LPI_CTRL_STATUS);
+}
+
 static void dwmac4_set_eee_timer(struct mac_device_info *hw, int ls, int tw)
 {
        void __iomem *ioaddr = hw->pcsr;
        .get_umac_addr = dwmac4_get_umac_addr,
        .set_eee_mode = dwmac4_set_eee_mode,
        .reset_eee_mode = dwmac4_reset_eee_mode,
+       .set_eee_lpi_entry_timer = dwmac4_set_eee_lpi_entry_timer,
        .set_eee_timer = dwmac4_set_eee_timer,
        .set_eee_pls = dwmac4_set_eee_pls,
        .pcs_ctrl_ane = dwmac4_ctrl_ane,
        .get_umac_addr = dwmac4_get_umac_addr,
        .set_eee_mode = dwmac4_set_eee_mode,
        .reset_eee_mode = dwmac4_reset_eee_mode,
+       .set_eee_lpi_entry_timer = dwmac4_set_eee_lpi_entry_timer,
        .set_eee_timer = dwmac4_set_eee_timer,
        .set_eee_pls = dwmac4_set_eee_pls,
        .pcs_ctrl_ane = dwmac4_ctrl_ane,
        .get_umac_addr = dwmac4_get_umac_addr,
        .set_eee_mode = dwmac4_set_eee_mode,
        .reset_eee_mode = dwmac4_reset_eee_mode,
+       .set_eee_lpi_entry_timer = dwmac4_set_eee_lpi_entry_timer,
        .set_eee_timer = dwmac4_set_eee_timer,
        .set_eee_pls = dwmac4_set_eee_pls,
        .pcs_ctrl_ane = dwmac4_ctrl_ane,
 
        void (*set_eee_mode)(struct mac_device_info *hw,
                             bool en_tx_lpi_clockgating);
        void (*reset_eee_mode)(struct mac_device_info *hw);
+       void (*set_eee_lpi_entry_timer)(struct mac_device_info *hw, int et);
        void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
        void (*set_eee_pls)(struct mac_device_info *hw, int link);
        void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
        stmmac_do_void_callback(__priv, mac, set_eee_mode, __args)
 #define stmmac_reset_eee_mode(__priv, __args...) \
        stmmac_do_void_callback(__priv, mac, reset_eee_mode, __args)
+#define stmmac_set_eee_lpi_timer(__priv, __args...) \
+       stmmac_do_void_callback(__priv, mac, set_eee_lpi_entry_timer, __args)
 #define stmmac_set_eee_timer(__priv, __args...) \
        stmmac_do_void_callback(__priv, mac, set_eee_timer, __args)
 #define stmmac_set_eee_pls(__priv, __args...) \
 
        int tx_lpi_timer;
        int tx_lpi_enabled;
        int eee_tw_timer;
+       bool eee_sw_timer_en;
        unsigned int mode;
        unsigned int chain_mode;
        int extend_desc;
 
        return dirty;
 }
 
+static void stmmac_lpi_entry_timer_config(struct stmmac_priv *priv, bool en)
+{
+       int tx_lpi_timer;
+
+       /* Clear/set the SW EEE timer flag based on LPI ET enablement */
+       priv->eee_sw_timer_en = en ? 0 : 1;
+       tx_lpi_timer  = en ? priv->tx_lpi_timer : 0;
+       stmmac_set_eee_lpi_timer(priv, priv->hw, tx_lpi_timer);
+}
+
 /**
  * stmmac_enable_eee_mode - check and enter in LPI mode
  * @priv: driver private structure
  */
 void stmmac_disable_eee_mode(struct stmmac_priv *priv)
 {
+       if (!priv->eee_sw_timer_en) {
+               stmmac_lpi_entry_timer_config(priv, 0);
+               return;
+       }
+
        stmmac_reset_eee_mode(priv, priv->hw);
        del_timer_sync(&priv->eee_ctrl_timer);
        priv->tx_path_in_lpi_mode = false;
        if (!priv->eee_active) {
                if (priv->eee_enabled) {
                        netdev_dbg(priv->dev, "disable EEE\n");
+                       stmmac_lpi_entry_timer_config(priv, 0);
                        del_timer_sync(&priv->eee_ctrl_timer);
                        stmmac_set_eee_timer(priv, priv->hw, 0, eee_tw_timer);
                }
                                     eee_tw_timer);
        }
 
-       mod_timer(&priv->eee_ctrl_timer, STMMAC_LPI_T(priv->tx_lpi_timer));
+       if (priv->plat->has_gmac4 && priv->tx_lpi_timer <= STMMAC_ET_MAX) {
+               del_timer_sync(&priv->eee_ctrl_timer);
+               priv->tx_path_in_lpi_mode = false;
+               stmmac_lpi_entry_timer_config(priv, 1);
+       } else {
+               stmmac_lpi_entry_timer_config(priv, 0);
+               mod_timer(&priv->eee_ctrl_timer,
+                         STMMAC_LPI_T(priv->tx_lpi_timer));
+       }
 
        mutex_unlock(&priv->lock);
        netdev_dbg(priv->dev, "Energy-Efficient Ethernet initialized\n");
                netif_tx_wake_queue(netdev_get_tx_queue(priv->dev, queue));
        }
 
-       if ((priv->eee_enabled) && (!priv->tx_path_in_lpi_mode)) {
+       if (priv->eee_enabled && !priv->tx_path_in_lpi_mode &&
+           priv->eee_sw_timer_en) {
                stmmac_enable_eee_mode(priv);
                mod_timer(&priv->eee_ctrl_timer, STMMAC_LPI_T(priv->tx_lpi_timer));
        }
        tx_q = &priv->tx_queue[queue];
        first_tx = tx_q->cur_tx;
 
-       if (priv->tx_path_in_lpi_mode)
+       if (priv->tx_path_in_lpi_mode && priv->eee_sw_timer_en)
                stmmac_disable_eee_mode(priv);
 
        /* Manage oversized TCP frames for GMAC4 device */