RE: [PATCH RESEND net-next 17/18] net: phy: adin: implement generic .handle_interrupt() callback

From: Ardelean, Alexandru
Date: Sat Nov 14 2020 - 01:42:07 EST




> -----Original Message-----
> From: Ioana Ciornei <ciorneiioana@xxxxxxxxx>
> Sent: Friday, November 13, 2020 6:52 PM
> To: Andrew Lunn <andrew@xxxxxxx>; Heiner Kallweit <hkallweit1@xxxxxxxxx>;
> Russell King <linux@xxxxxxxxxxxxxxx>; Florian Fainelli <f.fainelli@xxxxxxxxx>;
> Jakub Kicinski <kuba@xxxxxxxxxx>; netdev@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx
> Cc: Ioana Ciornei <ioana.ciornei@xxxxxxx>; Ardelean, Alexandru
> <alexandru.Ardelean@xxxxxxxxxx>
> Subject: [PATCH RESEND net-next 17/18] net: phy: adin: implement generic
> .handle_interrupt() callback
>
> [External]
>
> From: Ioana Ciornei <ioana.ciornei@xxxxxxx>
>
> In an attempt to actually support shared IRQs in phylib, we now move the
> responsibility of triggering the phylib state machine or just returning IRQ_NONE,
> based on the IRQ status register, to the PHY driver. Having
> 3 different IRQ handling callbacks (.handle_interrupt(),
> .did_interrupt() and .ack_interrupt() ) is confusing so let the PHY driver
> implement directly an IRQ handler like any other device driver.
> Make this driver follow the new convention.
>

Acked-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx>

> Cc: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx>
> Signed-off-by: Ioana Ciornei <ioana.ciornei@xxxxxxx>
> ---
> drivers/net/phy/adin.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/net/phy/adin.c b/drivers/net/phy/adin.c index
> 3727b38addf7..ba24434b867d 100644
> --- a/drivers/net/phy/adin.c
> +++ b/drivers/net/phy/adin.c
> @@ -479,6 +479,24 @@ static int adin_phy_config_intr(struct phy_device
> *phydev)
> ADIN1300_INT_MASK_EN);
> }
>
> +static irqreturn_t adin_phy_handle_interrupt(struct phy_device *phydev)
> +{
> + int irq_status;
> +
> + irq_status = phy_read(phydev, ADIN1300_INT_STATUS_REG);
> + if (irq_status < 0) {
> + phy_error(phydev);
> + return IRQ_NONE;
> + }
> +
> + if (!(irq_status & ADIN1300_INT_LINK_STAT_CHNG_EN))
> + return IRQ_NONE;
> +
> + phy_trigger_machine(phydev);
> +
> + return IRQ_HANDLED;
> +}
> +
> static int adin_cl45_to_adin_reg(struct phy_device *phydev, int devad,
> u16 cl45_regnum)
> {
> @@ -879,6 +897,7 @@ static struct phy_driver adin_driver[] = {
> .set_tunable = adin_set_tunable,
> .ack_interrupt = adin_phy_ack_intr,
> .config_intr = adin_phy_config_intr,
> + .handle_interrupt = adin_phy_handle_interrupt,
> .get_sset_count = adin_get_sset_count,
> .get_strings = adin_get_strings,
> .get_stats = adin_get_stats,
> @@ -902,6 +921,7 @@ static struct phy_driver adin_driver[] = {
> .set_tunable = adin_set_tunable,
> .ack_interrupt = adin_phy_ack_intr,
> .config_intr = adin_phy_config_intr,
> + .handle_interrupt = adin_phy_handle_interrupt,
> .get_sset_count = adin_get_sset_count,
> .get_strings = adin_get_strings,
> .get_stats = adin_get_stats,
> --
> 2.28.0