@@ -965,7 +965,8 @@ int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
return rc;
phy_prepare_link(phydev, handler);
- if (phy_interrupt_is_valid(phydev))
+ if (phy_interrupt_is_valid(phydev)
+ && !(phydev->drv->flags & PHY_HAS_OWN_IRQ_HANDLER))
phy_request_interrupt(phydev);
return 0;
@@ -2411,7 +2412,8 @@ EXPORT_SYMBOL(phy_validate_pause);
static bool phy_drv_supports_irq(struct phy_driver *phydrv)
{
- return phydrv->config_intr && phydrv->ack_interrupt;
+ return ((phydrv->config_intr && phydrv->ack_interrupt)
+ || phydrv->flags & PHY_HAS_OWN_IRQ_HANDLER);
}
/**
@@ -75,6 +75,7 @@ extern const int phy_10gbit_features_array[1];
#define PHY_IS_INTERNAL 0x00000001
#define PHY_RST_AFTER_CLK_EN 0x00000002
+#define PHY_HAS_OWN_IRQ_HANDLER 0x00000004
#define MDIO_DEVICE_IS_PHY 0x80000000
/* Interface Mode definitions */
There are more and more PHY drivers which has more than just the PHY link change interrupts. For example, temperature thresholds or PTP interrupts. At the moment it is not possible to correctly handle interrupts for PHYs which has a clear-on-read interrupt status register. It is also likely that the current approach of the phylib isn't working for all PHYs out there. Therefore, this patch let the PHY driver register its own interrupt handler. To notify the phylib about a link change, the interrupt handler has to call the new function phy_drv_interrupt(). Signed-off-by: Michael Walle <michael@walle.cc> --- drivers/net/phy/phy_device.c | 6 ++++-- include/linux/phy.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-)