mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-03 19:55:31 +00:00
net: phy: microchip_t1: Interrupt support for lan887x
Add support for link up and link down interrupts in lan887x. Signed-off-by: Divya Koppera <divya.koppera@microchip.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Link: https://patch.msgid.link/20241001144421.6661-1-divya.koppera@microchip.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
046e64f547
commit
5fad1c1a09
@ -226,6 +226,18 @@
|
|||||||
#define MICROCHIP_CABLE_MAX_TIME_DIFF \
|
#define MICROCHIP_CABLE_MAX_TIME_DIFF \
|
||||||
(MICROCHIP_CABLE_MIN_TIME_DIFF + MICROCHIP_CABLE_TIME_MARGIN)
|
(MICROCHIP_CABLE_MIN_TIME_DIFF + MICROCHIP_CABLE_TIME_MARGIN)
|
||||||
|
|
||||||
|
#define LAN887X_INT_STS 0xf000
|
||||||
|
#define LAN887X_INT_MSK 0xf001
|
||||||
|
#define LAN887X_INT_MSK_T1_PHY_INT_MSK BIT(2)
|
||||||
|
#define LAN887X_INT_MSK_LINK_UP_MSK BIT(1)
|
||||||
|
#define LAN887X_INT_MSK_LINK_DOWN_MSK BIT(0)
|
||||||
|
|
||||||
|
#define LAN887X_MX_CHIP_TOP_LINK_MSK (LAN887X_INT_MSK_LINK_UP_MSK |\
|
||||||
|
LAN887X_INT_MSK_LINK_DOWN_MSK)
|
||||||
|
|
||||||
|
#define LAN887X_MX_CHIP_TOP_ALL_MSK (LAN887X_INT_MSK_T1_PHY_INT_MSK |\
|
||||||
|
LAN887X_MX_CHIP_TOP_LINK_MSK)
|
||||||
|
|
||||||
#define DRIVER_AUTHOR "Nisar Sayed <nisar.sayed@microchip.com>"
|
#define DRIVER_AUTHOR "Nisar Sayed <nisar.sayed@microchip.com>"
|
||||||
#define DRIVER_DESC "Microchip LAN87XX/LAN937x/LAN887x T1 PHY driver"
|
#define DRIVER_DESC "Microchip LAN87XX/LAN937x/LAN887x T1 PHY driver"
|
||||||
|
|
||||||
@ -1474,6 +1486,49 @@ static void lan887x_get_strings(struct phy_device *phydev, u8 *data)
|
|||||||
ethtool_puts(&data, lan887x_hw_stats[i].string);
|
ethtool_puts(&data, lan887x_hw_stats[i].string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lan887x_config_intr(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
|
||||||
|
/* Clear the interrupt status before enabling interrupts */
|
||||||
|
rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/* Unmask for enabling interrupt */
|
||||||
|
rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_MSK,
|
||||||
|
(u16)~LAN887X_MX_CHIP_TOP_ALL_MSK);
|
||||||
|
} else {
|
||||||
|
rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_MSK,
|
||||||
|
GENMASK(15, 0));
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc < 0 ? rc : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static irqreturn_t lan887x_handle_interrupt(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int irq_status;
|
||||||
|
|
||||||
|
irq_status = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
|
||||||
|
if (irq_status < 0) {
|
||||||
|
phy_error(phydev);
|
||||||
|
return IRQ_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (irq_status & LAN887X_MX_CHIP_TOP_LINK_MSK) {
|
||||||
|
phy_trigger_machine(phydev);
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IRQ_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
static int lan887x_cd_reset(struct phy_device *phydev,
|
static int lan887x_cd_reset(struct phy_device *phydev,
|
||||||
enum cable_diag_state cd_done)
|
enum cable_diag_state cd_done)
|
||||||
{
|
{
|
||||||
@ -1504,6 +1559,10 @@ static int lan887x_cd_reset(struct phy_device *phydev,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
rc = lan887x_config_intr(phydev);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
rc = lan887x_phy_reconfig(phydev);
|
rc = lan887x_phy_reconfig(phydev);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
@ -1881,6 +1940,8 @@ static struct phy_driver microchip_t1_phy_driver[] = {
|
|||||||
.read_status = genphy_c45_read_status,
|
.read_status = genphy_c45_read_status,
|
||||||
.cable_test_start = lan887x_cable_test_start,
|
.cable_test_start = lan887x_cable_test_start,
|
||||||
.cable_test_get_status = lan887x_cable_test_get_status,
|
.cable_test_get_status = lan887x_cable_test_get_status,
|
||||||
|
.config_intr = lan887x_config_intr,
|
||||||
|
.handle_interrupt = lan887x_handle_interrupt,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user