Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: add interrupt support for aquantia phy

By implementing config_intr & ack_interrupt, now the phy can support
link connect/disconnect interrupt.

Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Shaohui Xie and committed by
David S. Miller
54cf7be9 d9893d13

+49
+49
drivers/net/phy/aquantia.c
··· 44 44 return (reg < 0) ? reg : (reg & BMSR_ANEGCOMPLETE); 45 45 } 46 46 47 + static int aquantia_config_intr(struct phy_device *phydev) 48 + { 49 + int err; 50 + 51 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { 52 + err = phy_write_mmd(phydev, MDIO_MMD_AN, 0xd401, 1); 53 + if (err < 0) 54 + return err; 55 + 56 + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xff00, 1); 57 + if (err < 0) 58 + return err; 59 + 60 + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xff01, 0x1001); 61 + } else { 62 + err = phy_write_mmd(phydev, MDIO_MMD_AN, 0xd401, 0); 63 + if (err < 0) 64 + return err; 65 + 66 + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xff00, 0); 67 + if (err < 0) 68 + return err; 69 + 70 + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xff01, 0); 71 + } 72 + 73 + return err; 74 + } 75 + 76 + static int aquantia_ack_interrupt(struct phy_device *phydev) 77 + { 78 + int reg; 79 + 80 + reg = phy_read_mmd(phydev, MDIO_MMD_AN, 0xcc01); 81 + return (reg < 0) ? reg : 0; 82 + } 83 + 47 84 static int aquantia_read_status(struct phy_device *phydev) 48 85 { 49 86 int reg; ··· 122 85 .phy_id_mask = 0xfffffff0, 123 86 .name = "Aquantia AQ1202", 124 87 .features = PHY_AQUANTIA_FEATURES, 88 + .flags = PHY_HAS_INTERRUPT, 125 89 .aneg_done = aquantia_aneg_done, 126 90 .config_aneg = aquantia_config_aneg, 91 + .config_intr = aquantia_config_intr, 92 + .ack_interrupt = aquantia_ack_interrupt, 127 93 .read_status = aquantia_read_status, 128 94 .driver = { .owner = THIS_MODULE,}, 129 95 }, ··· 135 95 .phy_id_mask = 0xfffffff0, 136 96 .name = "Aquantia AQ2104", 137 97 .features = PHY_AQUANTIA_FEATURES, 98 + .flags = PHY_HAS_INTERRUPT, 138 99 .aneg_done = aquantia_aneg_done, 139 100 .config_aneg = aquantia_config_aneg, 101 + .config_intr = aquantia_config_intr, 102 + .ack_interrupt = aquantia_ack_interrupt, 140 103 .read_status = aquantia_read_status, 141 104 .driver = { .owner = THIS_MODULE,}, 142 105 }, ··· 148 105 .phy_id_mask = 0xfffffff0, 149 106 .name = "Aquantia AQR105", 150 107 .features = PHY_AQUANTIA_FEATURES, 108 + .flags = PHY_HAS_INTERRUPT, 151 109 .aneg_done = aquantia_aneg_done, 152 110 .config_aneg = aquantia_config_aneg, 111 + .config_intr = aquantia_config_intr, 112 + .ack_interrupt = aquantia_ack_interrupt, 153 113 .read_status = aquantia_read_status, 154 114 .driver = { .owner = THIS_MODULE,}, 155 115 }, ··· 161 115 .phy_id_mask = 0xfffffff0, 162 116 .name = "Aquantia AQR405", 163 117 .features = PHY_AQUANTIA_FEATURES, 118 + .flags = PHY_HAS_INTERRUPT, 164 119 .aneg_done = aquantia_aneg_done, 165 120 .config_aneg = aquantia_config_aneg, 121 + .config_intr = aquantia_config_intr, 122 + .ack_interrupt = aquantia_ack_interrupt, 166 123 .read_status = aquantia_read_status, 167 124 .driver = { .owner = THIS_MODULE,}, 168 125 },