@@ -40,6 +40,9 @@
#define RTL8201F_ISR 0x1e
#define RTL8201F_IER 0x13
+#define RTL8211F_INTBCR 0x16
+#define RTL8211F_INTBCR_INTB_PMEB BIT(5)
+
MODULE_DESCRIPTION("Realtek PHY driver");
MODULE_AUTHOR("Johnson Leung");
MODULE_LICENSE("GPL");
@@ -161,12 +164,32 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
static int rtl8211f_config_intr(struct phy_device *phydev)
{
+ int err;
u16 val;
- if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
+ if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
+ /*
+ * The interrupt pin has two functions:
+ * 0: INTB: it acts as interrupt pin which can be configured
+ * through RTL821x_INER and the status can be read through
+ * RTL8211F_INSR
+ * 1: PMEB: a special "Power Management Event" mode for
+ * Wake-on-LAN operation (with support for a "pulse low"
+ * wave format). Interrupts configured through RTL821x_INER
+ * will not work in this mode
+ *
+ * select INTB mode in the "INTB pin control" register to
+ * ensure that the interrupt pin is in the correct mode.
+ */
+ err = rtl8211x_page_mask_bits(phydev, 0xd40, RTL8211F_INTBCR,
+ RTL8211F_INTBCR_INTB_PMEB, 0);
+ if (err)
+ return err;
+
val = RTL8211F_INER_LINK_STATUS;
- else
+ } else {
val = 0;
+ }
return rtl8211x_page_write(phydev, 0xa42, RTL821x_INER, val);
}
The interrupt pin on the RTL8211F PHY can be used in two different modes: INTB - the default mode of the PHY - interrupts can be configured through page 0xa42 register RTL821x_INER - interrupts can be ACK'ed through RTL8211F_INSR - it acts as a level-interrupt which is active low - Wake-on-LAN "wakeup" status is available in RTL8211F_INSR bit 7 PMEB: - special mode for Wake-on-LAN - interrupts configured through page 0xa42 register RTL821x_INER are disabled - it supports a "pulse low" waveform for the interrupt For now we simply force the pin into INTB mode since the PHY driver does not support Wake-on-LAN yet. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/net/phy/realtek.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)