net: phy: micrel: lan8814 led errata
[linux-2.6-microblaze.git] / drivers / net / phy / micrel.c
index 9b69735..88cc039 100644 (file)
 #define LAN8814_INTR_CTRL_REG_POLARITY         BIT(1)
 #define LAN8814_INTR_CTRL_REG_INTR_ENABLE      BIT(0)
 
+#define LAN8814_EEE_STATE                      0x38
+#define LAN8814_EEE_STATE_MASK2P5P             BIT(10)
+
 /* Represents 1ppm adjustment in 2^32 format with
  * each nsec contains 4 clock cycles.
  * The value is calculated as following: (1/1000000)/((2^-32)/4)
@@ -3288,6 +3291,19 @@ static int lan8814_release_coma_mode(struct phy_device *phydev)
        return 0;
 }
 
+static void lan8814_clear_2psp_bit(struct phy_device *phydev)
+{
+       u16 val;
+
+       /* It was noticed that when traffic is passing through the PHY and the
+        * cable is removed then the LED was still one even though there is no
+        * link
+        */
+       val = lanphy_read_page_reg(phydev, 2, LAN8814_EEE_STATE);
+       val &= ~LAN8814_EEE_STATE_MASK2P5P;
+       lanphy_write_page_reg(phydev, 2, LAN8814_EEE_STATE, val);
+}
+
 static int lan8814_probe(struct phy_device *phydev)
 {
        const struct kszphy_type *type = phydev->drv->driver_data;
@@ -3324,6 +3340,9 @@ static int lan8814_probe(struct phy_device *phydev)
 
        lan8814_ptp_init(phydev);
 
+       /* Errata workarounds */
+       lan8814_clear_2psp_bit(phydev);
+
        return 0;
 }