net/phy: fix DP83865 phy interrupt handler

According to the DP83865 datasheet we need to clear
the interrupt status bit by writing a 1 to the
corresponding bit in INT_CLEAR (2:0 are reserved).

Proposed and tested by Thorsten.

Signed-off-by: Thorsten Schubert <tshu@msc-ge.com>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Giuseppe CAVALLARO 2011-08-22 21:07:14 +00:00 committed by David S. Miller
parent e2e6be56df
commit 6e6f400f53

View File

@ -25,8 +25,9 @@
/* DP83865 phy identifier values */ /* DP83865 phy identifier values */
#define DP83865_PHY_ID 0x20005c7a #define DP83865_PHY_ID 0x20005c7a
#define DP83865_INT_MASK_REG 0x15 #define DP83865_INT_STATUS 0x14
#define DP83865_INT_MASK_STATUS 0x14 #define DP83865_INT_MASK 0x15
#define DP83865_INT_CLEAR 0x17
#define DP83865_INT_REMOTE_FAULT 0x0008 #define DP83865_INT_REMOTE_FAULT 0x0008
#define DP83865_INT_ANE_COMPLETED 0x0010 #define DP83865_INT_ANE_COMPLETED 0x0010
@ -68,21 +69,25 @@ static int ns_config_intr(struct phy_device *phydev)
int err; int err;
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
err = phy_write(phydev, DP83865_INT_MASK_REG, err = phy_write(phydev, DP83865_INT_MASK,
DP83865_INT_MASK_DEFAULT); DP83865_INT_MASK_DEFAULT);
else else
err = phy_write(phydev, DP83865_INT_MASK_REG, 0); err = phy_write(phydev, DP83865_INT_MASK, 0);
return err; return err;
} }
static int ns_ack_interrupt(struct phy_device *phydev) static int ns_ack_interrupt(struct phy_device *phydev)
{ {
int ret = phy_read(phydev, DP83865_INT_MASK_STATUS); int ret = phy_read(phydev, DP83865_INT_STATUS);
if (ret < 0) if (ret < 0)
return ret; return ret;
return 0; /* Clear the interrupt status bit by writing a “1”
* to the corresponding bit in INT_CLEAR (2:0 are reserved) */
ret = phy_write(phydev, DP83865_INT_CLEAR, ret & ~0x7);
return ret;
} }
static void ns_giga_speed_fallback(struct phy_device *phydev, int mode) static void ns_giga_speed_fallback(struct phy_device *phydev, int mode)