]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: phy: aquantia: autodetect if firmware needs to be loaded
authorJeremy Gebben <jgebben@sweptlaser.com>
Tue, 18 Sep 2018 21:49:37 +0000 (15:49 -0600)
committerJoe Hershberger <joe.hershberger@ni.com>
Wed, 24 Oct 2018 19:45:37 +0000 (14:45 -0500)
If the phy reports a valid firmware version and doesn't indicate
a fault, skip loading the firmware.  This allows the same image
to be used on boards that have firmware storage and those that do not.

Signed-off-by: Jeremy Gebben <jgebben@sweptlaser.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/aquantia.c

index cbd70120d19f34ef9c4c1b1b9821b7dd780ff5b4..37749e01852833ba12e02e33a2d16d21bb3b399c 100644 (file)
@@ -236,18 +236,34 @@ done:
 #else
 static int aquantia_upload_firmware(struct phy_device *phydev)
 {
-       return 0;
+       printf("ERROR %s firmware loading disabled.\n", phydev->dev->name);
+       return -1;
 }
 #endif
 
 int aquantia_config(struct phy_device *phydev)
 {
-       u32 val;
-       int ret;
+       u32 val, id, rstatus, fault;
 
-       ret = aquantia_upload_firmware(phydev);
-       if (ret != 0)
-               return ret;
+       id = phy_read(phydev, MDIO_MMD_VEND1, GLOBAL_FIRMWARE_ID);
+       rstatus = phy_read(phydev, MDIO_MMD_VEND1, GLOBAL_RSTATUS_1);
+       fault = phy_read(phydev, MDIO_MMD_VEND1, GLOBAL_FAULT);
+
+       if (id != 0)
+               printf("%s running firmware version %X.%X.%X\n",
+                      phydev->dev->name, (id >> 8), id & 0xff,
+                      (rstatus >> 4) & 0xf);
+
+       if (fault != 0)
+               printf("%s fault 0x%04x detected\n", phydev->dev->name, fault);
+
+       if (id == 0 || fault != 0) {
+               int ret;
+
+               ret = aquantia_upload_firmware(phydev);
+               if (ret != 0)
+                       return ret;
+       }
 
        val = phy_read(phydev, MDIO_MMD_PMAPMD, MII_BMCR);