• Niklas Cassel's avatar
    net: stmmac: fix LPI transitioning for dwmac4 · 4497478c
    Niklas Cassel authored
    The LPI transitioning logic in stmmac_main uses
    priv->tx_path_in_lpi_mode to enter/exit LPI.
    
    However, priv->tx_path_in_lpi_mode is assigned
    using the return value from host_irq_status().
    
    So for dwmac4, priv->tx_path_in_lpi_mode was always false,
    so stmmac_tx_clean() would always try to put us in eee mode,
    and stmmac_xmit() would never take us out of eee mode.
    
    To fix this, make host_irq_status() read and return the LPI
    irq status also for dwmac4.
    
    This also increments the existing LPI counters, so that
    ethtool --statistics shows LPI transitions also for dwmac4.
    
    For dwmac1000, irqs are enabled/disabled using the register
    named "Interrupt Mask Register", and thus setting a bit disables
    that specific irq.
    
    For dwmac4 the matching register is named "MAC_Interrupt_Enable",
    and thus setting a bit enables that specific irq.
    
    Looking at dwmac1000_core.c, the irqs that are always enabled are:
    LPI and PMT.
    
    Looking at dwmac4_core.c, the irqs that are always enabled are:
    PMT.
    
    To be able to read the LPI irq status, we need to enable the LPI
    irq also for dwmac4.
    Signed-off-by: default avatarNiklas Cassel <niklas.cassel@axis.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4497478c
dwmac4_core.c 21.9 KB