Commit 6ab930df authored by Ioana Ciornei's avatar Ioana Ciornei Committed by Jakub Kicinski

net: phy: aquantia: implement generic .handle_interrupt() callback

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.

Cc: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 30446ae4
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#define MDIO_AN_TX_VEND_INT_STATUS1_DOWNSHIFT BIT(1) #define MDIO_AN_TX_VEND_INT_STATUS1_DOWNSHIFT BIT(1)
#define MDIO_AN_TX_VEND_INT_STATUS2 0xcc01 #define MDIO_AN_TX_VEND_INT_STATUS2 0xcc01
#define MDIO_AN_TX_VEND_INT_STATUS2_MASK BIT(0)
#define MDIO_AN_TX_VEND_INT_MASK2 0xd401 #define MDIO_AN_TX_VEND_INT_MASK2 0xd401
#define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0) #define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0)
...@@ -270,6 +271,25 @@ static int aqr_ack_interrupt(struct phy_device *phydev) ...@@ -270,6 +271,25 @@ static int aqr_ack_interrupt(struct phy_device *phydev)
return (reg < 0) ? reg : 0; return (reg < 0) ? reg : 0;
} }
static irqreturn_t aqr_handle_interrupt(struct phy_device *phydev)
{
int irq_status;
irq_status = phy_read_mmd(phydev, MDIO_MMD_AN,
MDIO_AN_TX_VEND_INT_STATUS2);
if (irq_status < 0) {
phy_error(phydev);
return IRQ_NONE;
}
if (!(irq_status & MDIO_AN_TX_VEND_INT_STATUS2_MASK))
return IRQ_NONE;
phy_trigger_machine(phydev);
return IRQ_HANDLED;
}
static int aqr_read_status(struct phy_device *phydev) static int aqr_read_status(struct phy_device *phydev)
{ {
int val; int val;
...@@ -585,6 +605,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -585,6 +605,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status, .read_status = aqr_read_status,
}, },
{ {
...@@ -593,6 +614,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -593,6 +614,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status, .read_status = aqr_read_status,
}, },
{ {
...@@ -601,6 +623,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -601,6 +623,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status, .read_status = aqr_read_status,
.suspend = aqr107_suspend, .suspend = aqr107_suspend,
.resume = aqr107_resume, .resume = aqr107_resume,
...@@ -611,6 +634,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -611,6 +634,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status, .read_status = aqr_read_status,
}, },
{ {
...@@ -621,6 +645,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -621,6 +645,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr107_read_status, .read_status = aqr107_read_status,
.get_tunable = aqr107_get_tunable, .get_tunable = aqr107_get_tunable,
.set_tunable = aqr107_set_tunable, .set_tunable = aqr107_set_tunable,
...@@ -639,6 +664,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -639,6 +664,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr107_read_status, .read_status = aqr107_read_status,
.get_tunable = aqr107_get_tunable, .get_tunable = aqr107_get_tunable,
.set_tunable = aqr107_set_tunable, .set_tunable = aqr107_set_tunable,
...@@ -655,6 +681,7 @@ static struct phy_driver aqr_driver[] = { ...@@ -655,6 +681,7 @@ static struct phy_driver aqr_driver[] = {
.config_aneg = aqr_config_aneg, .config_aneg = aqr_config_aneg,
.config_intr = aqr_config_intr, .config_intr = aqr_config_intr,
.ack_interrupt = aqr_ack_interrupt, .ack_interrupt = aqr_ack_interrupt,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status, .read_status = aqr_read_status,
}, },
}; };
......
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