[U-Boot] [PATCH v2 2/6] net: phy: mv88e61xx: add CPU port parameter init for 88E6071

Joe Hershberger joe.hershberger at ni.com
Tue Jul 23 04:05:56 UTC 2019


On Tue, Jul 9, 2019 at 6:25 PM Anatolij Gustschin <agust at denx.de> wrote:
>
> On 88E6071 chip the port status register bit field offsets
> for duplex and link bits differ. Extend the driver to use
> 88E6071 specific offset values. The width of bit fields for
> speed status differ, too. Adapt for proper port speed
> detection on 88E6071.
>
> Signed-off-by: Anatolij Gustschin <agust at denx.de>
> ---
>  drivers/net/phy/mv88e61xx.c | 41 +++++++++++++++++++++++++------------
>  1 file changed, 28 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/net/phy/mv88e61xx.c b/drivers/net/phy/mv88e61xx.c
> index 8f5da9486c..d38109b797 100644
> --- a/drivers/net/phy/mv88e61xx.c
> +++ b/drivers/net/phy/mv88e61xx.c
> @@ -85,9 +85,6 @@
>  #define GLOBAL1_MON_CTRL_CPUDEST_SHIFT 4
>  #define GLOBAL1_MON_CTRL_CPUDEST_WIDTH 4
>
> -#define PORT_REG_STATUS_LINK           BIT(11)
> -#define PORT_REG_STATUS_DUPLEX         BIT(10)
> -
>  #define PORT_REG_STATUS_SPEED_SHIFT    8
>  #define PORT_REG_STATUS_SPEED_WIDTH    2

Surprised this didn't go away.

>  #define PORT_REG_STATUS_SPEED_10       0
> @@ -108,6 +105,7 @@
>  #define PORT_REG_PHYS_CTRL_DUPLEX_VALUE        BIT(3)
>  #define PORT_REG_PHYS_CTRL_DUPLEX_FORCE        BIT(2)
>  #define PORT_REG_PHYS_CTRL_SPD1000     BIT(1)
> +#define PORT_REG_PHYS_CTRL_SPD100      BIT(0)
>  #define PORT_REG_PHYS_CTRL_SPD_MASK    (BIT(1) | BIT(0))
>
>  #define PORT_REG_CTRL_PSTATE_SHIFT     0
> @@ -193,6 +191,9 @@ struct mv88e61xx_phy_priv {
>         int id;
>         int port_count;
>         int port_reg_base;
> +       u16 port_stat_link_mask;
> +       u16 port_stat_dup_mask;
> +       u8 port_stat_speed_width;
>         u8 global1;
>         u8 global2;
>  };
> @@ -638,6 +639,7 @@ static int mv88e61xx_port_set_vlan(struct phy_device *phydev, u8 port,
>
>  static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
>  {
> +       struct mv88e61xx_phy_priv *priv = phydev->priv;
>         int res;
>         int val;
>         bool forced = false;
> @@ -645,7 +647,7 @@ static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
>         val = mv88e61xx_port_read(phydev, port, PORT_REG_STATUS);
>         if (val < 0)
>                 return val;
> -       if (!(val & PORT_REG_STATUS_LINK)) {
> +       if (!(val & priv->port_stat_link_mask)) {
>                 /* Temporarily force link to read port configuration */
>                 u32 timeout = 100;
>                 forced = true;
> @@ -668,7 +670,7 @@ static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
>                                 res = -EIO;
>                                 goto unforce;
>                         }
> -                       if (val & PORT_REG_STATUS_LINK)
> +                       if (val & priv->port_stat_link_mask)
>                                 break;
>                 } while (--timeout);
>
> @@ -678,13 +680,13 @@ static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
>                 }
>         }
>
> -       if (val & PORT_REG_STATUS_DUPLEX)
> +       if (val & priv->port_stat_dup_mask)
>                 phydev->duplex = DUPLEX_FULL;
>         else
>                 phydev->duplex = DUPLEX_HALF;
>
>         val = bitfield_extract(val, PORT_REG_STATUS_SPEED_SHIFT,
> -                              PORT_REG_STATUS_SPEED_WIDTH);
> +                              priv->port_stat_speed_width);
>         switch (val) {
>         case PORT_REG_STATUS_SPEED_1000:
>                 phydev->speed = SPEED_1000;
> @@ -717,6 +719,7 @@ unforce:
>
>  static int mv88e61xx_fixed_port_setup(struct phy_device *phydev, u8 port)
>  {
> +       struct mv88e61xx_phy_priv *priv = phydev->priv;
>         int val;
>
>         val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
> @@ -724,13 +727,19 @@ static int mv88e61xx_fixed_port_setup(struct phy_device *phydev, u8 port)
>                 return val;
>
>         val &= ~(PORT_REG_PHYS_CTRL_SPD_MASK |
> -                PORT_REG_PHYS_CTRL_FC_VALUE);
> -       val |= PORT_REG_PHYS_CTRL_PCS_AN_EN |
> -              PORT_REG_PHYS_CTRL_PCS_AN_RST |
> -              PORT_REG_PHYS_CTRL_FC_FORCE |
> +                PORT_REG_PHYS_CTRL_FC_VALUE |
> +                PORT_REG_PHYS_CTRL_FC_FORCE);
> +       val |= PORT_REG_PHYS_CTRL_FC_FORCE |
>                PORT_REG_PHYS_CTRL_DUPLEX_VALUE |
> -              PORT_REG_PHYS_CTRL_DUPLEX_FORCE |
> -              PORT_REG_PHYS_CTRL_SPD1000;
> +              PORT_REG_PHYS_CTRL_DUPLEX_FORCE;
> +
> +       if (priv->id == PORT_SWITCH_ID_6071) {
> +               val |= PORT_REG_PHYS_CTRL_SPD100;
> +       } else {
> +               val |= PORT_REG_PHYS_CTRL_PCS_AN_EN |
> +                      PORT_REG_PHYS_CTRL_PCS_AN_RST |
> +                      PORT_REG_PHYS_CTRL_SPD1000;
> +       }
>
>         if (port == CONFIG_MV88E61XX_CPU_PORT)
>                 val |= PORT_REG_PHYS_CTRL_LINK_VALUE |
> @@ -952,9 +961,15 @@ static int mv88e61xx_probe(struct phy_device *phydev)
>         case PORT_SWITCH_ID_6240:
>         case PORT_SWITCH_ID_6352:
>                 priv->port_count = 11;
> +               priv->port_stat_link_mask = BIT(11);
> +               priv->port_stat_dup_mask = BIT(10);
> +               priv->port_stat_speed_width = 2;
>                 break;
>         case PORT_SWITCH_ID_6071:
>                 priv->port_count = 7;
> +               priv->port_stat_link_mask = BIT(12);
> +               priv->port_stat_dup_mask = BIT(9);
> +               priv->port_stat_speed_width = 1;
>                 break;
>         default:
>                 free(priv);
> --
> 2.17.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list