Commit 58aac3a2 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Jakub Kicinski

net: phy: smsc: fix link up detection in forced irq mode

Currently link up can't be detected in forced mode if polling
isn't used. Only link up interrupt source we have is aneg
complete which isn't applicable in forced mode. Therefore we
have to use energy-on as link up indicator.

Fixes: 73654945 ("net: phy: smsc: skip ENERGYON interrupt if disabled")
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 89b59a84
...@@ -44,7 +44,6 @@ static struct smsc_hw_stat smsc_hw_stats[] = { ...@@ -44,7 +44,6 @@ static struct smsc_hw_stat smsc_hw_stats[] = {
}; };
struct smsc_phy_priv { struct smsc_phy_priv {
u16 intmask;
bool energy_enable; bool energy_enable;
}; };
...@@ -57,7 +56,6 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev) ...@@ -57,7 +56,6 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev)
static int smsc_phy_config_intr(struct phy_device *phydev) static int smsc_phy_config_intr(struct phy_device *phydev)
{ {
struct smsc_phy_priv *priv = phydev->priv;
int rc; int rc;
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
...@@ -65,14 +63,9 @@ static int smsc_phy_config_intr(struct phy_device *phydev) ...@@ -65,14 +63,9 @@ static int smsc_phy_config_intr(struct phy_device *phydev)
if (rc) if (rc)
return rc; return rc;
priv->intmask = MII_LAN83C185_ISF_INT4 | MII_LAN83C185_ISF_INT6; rc = phy_write(phydev, MII_LAN83C185_IM,
if (priv->energy_enable) MII_LAN83C185_ISF_INT_PHYLIB_EVENTS);
priv->intmask |= MII_LAN83C185_ISF_INT7;
rc = phy_write(phydev, MII_LAN83C185_IM, priv->intmask);
} else { } else {
priv->intmask = 0;
rc = phy_write(phydev, MII_LAN83C185_IM, 0); rc = phy_write(phydev, MII_LAN83C185_IM, 0);
if (rc) if (rc)
return rc; return rc;
...@@ -85,7 +78,6 @@ static int smsc_phy_config_intr(struct phy_device *phydev) ...@@ -85,7 +78,6 @@ static int smsc_phy_config_intr(struct phy_device *phydev)
static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev) static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
{ {
struct smsc_phy_priv *priv = phydev->priv;
int irq_status; int irq_status;
irq_status = phy_read(phydev, MII_LAN83C185_ISF); irq_status = phy_read(phydev, MII_LAN83C185_ISF);
...@@ -96,7 +88,7 @@ static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev) ...@@ -96,7 +88,7 @@ static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
return IRQ_NONE; return IRQ_NONE;
} }
if (!(irq_status & priv->intmask)) if (!(irq_status & MII_LAN83C185_ISF_INT_PHYLIB_EVENTS))
return IRQ_NONE; return IRQ_NONE;
phy_trigger_machine(phydev); phy_trigger_machine(phydev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment