kernel: fix AT8032 PHY phy id mask
authorMathias Kresin <dev@kresin.me>
Mon, 2 Jul 2018 20:09:04 +0000 (22:09 +0200)
committerMathias Kresin <dev@kresin.me>
Tue, 3 Jul 2018 23:19:05 +0000 (01:19 +0200)
Don't mask bit 4 of the AT8022 phy id. If bit 4 of the AT8022 phy id
(0x004dd023) is masked, it will match the phy id of the AR8327 switch
(0x004dd033) as well.

It results in applied at803x driver settings/callbacks, which will at
least limit the AR8327 phys to 100MBit operation instead of the possible
1000MBit.

Signed-off-by: Mathias Kresin <dev@kresin.me>
target/linux/generic/pending-4.14/180-net-phy-at803x-add-support-for-AT8032.patch
target/linux/generic/pending-4.14/734-net-phy-at803x-allow-to-configure-via-pdata.patch
target/linux/generic/pending-4.14/735-net-phy-at803x-fix-at8033-sgmii-mode.patch

index 86a03f22568bbfa27587199325581a61ba2e936a..828b160be999573e30428224b4688f91bf4fbc79 100644 (file)
@@ -8,15 +8,18 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/drivers/net/phy/at803x.c
 +++ b/drivers/net/phy/at803x.c
 
 --- a/drivers/net/phy/at803x.c
 +++ b/drivers/net/phy/at803x.c
-@@ -62,6 +62,7 @@
+@@ -62,8 +62,10 @@
  
  #define ATH8030_PHY_ID 0x004dd076
  #define ATH8031_PHY_ID 0x004dd074
 +#define ATH8032_PHY_ID 0x004dd023
  #define ATH8035_PHY_ID 0x004dd072
  #define AT803X_PHY_ID_MASK                    0xffffffef
  
  #define ATH8030_PHY_ID 0x004dd076
  #define ATH8031_PHY_ID 0x004dd074
 +#define ATH8032_PHY_ID 0x004dd023
  #define ATH8035_PHY_ID 0x004dd072
  #define AT803X_PHY_ID_MASK                    0xffffffef
++#define AT8032_PHY_ID_MASK                    0xffffffff
  
  
-@@ -256,7 +257,8 @@ static int at803x_probe(struct phy_devic
+ MODULE_DESCRIPTION("Atheros 803x PHY driver");
+ MODULE_AUTHOR("Matus Ujhelyi");
+@@ -256,7 +258,8 @@ static int at803x_probe(struct phy_devic
        if (!priv)
                return -ENOMEM;
  
        if (!priv)
                return -ENOMEM;
  
@@ -26,7 +29,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                goto does_not_require_reset_workaround;
  
        gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
                goto does_not_require_reset_workaround;
  
        gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
-@@ -332,7 +334,7 @@ static void at803x_link_change_notify(st
+@@ -332,7 +335,7 @@ static void at803x_link_change_notify(st
        struct at803x_priv *priv = phydev->priv;
  
        /*
        struct at803x_priv *priv = phydev->priv;
  
        /*
@@ -35,7 +38,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
         * signalled. This is necessary to circumvent a hardware bug that
         * occurs when the cable is unplugged while TX packets are pending
         * in the FIFO. In such cases, the FIFO enters an error mode it
         * signalled. This is necessary to circumvent a hardware bug that
         * occurs when the cable is unplugged while TX packets are pending
         * in the FIFO. In such cases, the FIFO enters an error mode it
-@@ -444,6 +446,24 @@ static struct phy_driver at803x_driver[]
+@@ -444,6 +447,24 @@ static struct phy_driver at803x_driver[]
        .aneg_done              = at803x_aneg_done,
        .ack_interrupt          = &at803x_ack_interrupt,
        .config_intr            = &at803x_config_intr,
        .aneg_done              = at803x_aneg_done,
        .ack_interrupt          = &at803x_ack_interrupt,
        .config_intr            = &at803x_config_intr,
@@ -43,7 +46,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +      /* ATHEROS 8032 */
 +      .phy_id                 = ATH8032_PHY_ID,
 +      .name                   = "Atheros 8032 ethernet",
 +      /* ATHEROS 8032 */
 +      .phy_id                 = ATH8032_PHY_ID,
 +      .name                   = "Atheros 8032 ethernet",
-+      .phy_id_mask            = 0xffffffef,
++      .phy_id_mask            = AT8032_PHY_ID_MASK,
 +      .probe                  = at803x_probe,
 +      .config_init            = at803x_config_init,
 +      .link_change_notify     = at803x_link_change_notify,
 +      .probe                  = at803x_probe,
 +      .config_init            = at803x_config_init,
 +      .link_change_notify     = at803x_link_change_notify,
@@ -60,11 +63,11 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  } };
  
  module_phy_driver(at803x_driver);
  } };
  
  module_phy_driver(at803x_driver);
-@@ -451,6 +471,7 @@ module_phy_driver(at803x_driver);
+@@ -451,6 +472,7 @@ module_phy_driver(at803x_driver);
  static struct mdio_device_id __maybe_unused atheros_tbl[] = {
        { ATH8030_PHY_ID, AT803X_PHY_ID_MASK },
        { ATH8031_PHY_ID, AT803X_PHY_ID_MASK },
  static struct mdio_device_id __maybe_unused atheros_tbl[] = {
        { ATH8030_PHY_ID, AT803X_PHY_ID_MASK },
        { ATH8031_PHY_ID, AT803X_PHY_ID_MASK },
-+      { ATH8032_PHY_ID, AT803X_PHY_ID_MASK },
++      { ATH8032_PHY_ID, AT8032_PHY_ID_MASK },
        { ATH8035_PHY_ID, AT803X_PHY_ID_MASK },
        { }
  };
        { ATH8035_PHY_ID, AT803X_PHY_ID_MASK },
        { }
  };
index a217f750bc4e9647a19ac1da09e9b7197b77c4e5..27bbf572e982ac7232ba1a7483738ad019506d1c 100644 (file)
@@ -40,7 +40,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #define AT803X_DEBUG_ADDR                     0x1D
  #define AT803X_DEBUG_DATA                     0x1E
  
  #define AT803X_DEBUG_ADDR                     0x1D
  #define AT803X_DEBUG_DATA                     0x1E
  
-@@ -73,6 +80,7 @@ MODULE_LICENSE("GPL");
+@@ -74,6 +81,7 @@ MODULE_LICENSE("GPL");
  struct at803x_priv {
        bool phy_reset:1;
        struct gpio_desc *gpiod_reset;
  struct at803x_priv {
        bool phy_reset:1;
        struct gpio_desc *gpiod_reset;
@@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  };
  
  struct at803x_context {
  };
  
  struct at803x_context {
-@@ -273,8 +281,16 @@ does_not_require_reset_workaround:
+@@ -274,8 +282,16 @@ does_not_require_reset_workaround:
        return 0;
  }
  
        return 0;
  }
  
@@ -65,7 +65,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
        int ret;
  
        ret = genphy_config_init(phydev);
        int ret;
  
        ret = genphy_config_init(phydev);
-@@ -295,6 +311,26 @@ static int at803x_config_init(struct phy
+@@ -296,6 +312,26 @@ static int at803x_config_init(struct phy
                        return ret;
        }
  
                        return ret;
        }
  
@@ -92,7 +92,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
        return 0;
  }
  
        return 0;
  }
  
-@@ -332,6 +368,8 @@ static int at803x_config_intr(struct phy
+@@ -333,6 +369,8 @@ static int at803x_config_intr(struct phy
  static void at803x_link_change_notify(struct phy_device *phydev)
  {
        struct at803x_priv *priv = phydev->priv;
  static void at803x_link_change_notify(struct phy_device *phydev)
  {
        struct at803x_priv *priv = phydev->priv;
@@ -101,7 +101,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  
        /*
         * Conduct a hardware reset for AT8030/2 every time a link loss is
  
        /*
         * Conduct a hardware reset for AT8030/2 every time a link loss is
-@@ -360,6 +398,24 @@ static void at803x_link_change_notify(st
+@@ -361,6 +399,24 @@ static void at803x_link_change_notify(st
        } else {
                priv->phy_reset = false;
        }
        } else {
                priv->phy_reset = false;
        }
index 9a2f93a6f21df541a7da40f2d4105e5173c71894..1f689850bd73d0f25a4f33a2293a447eb51bf12e 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Roman Yeryomin <roman@advem.lv>
  #define AT803X_MODE_CFG_MASK                  0x0F
  #define AT803X_MODE_CFG_SGMII                 0x01
  
  #define AT803X_MODE_CFG_MASK                  0x0F
  #define AT803X_MODE_CFG_SGMII                 0x01
  
-@@ -292,6 +296,27 @@ static int at803x_config_init(struct phy
+@@ -293,6 +297,27 @@ static int at803x_config_init(struct phy
  {
        struct at803x_platform_data *pdata;
        int ret;
  {
        struct at803x_platform_data *pdata;
        int ret;