ath79/mikrotik: use routerbootpart partitions
[oweals/openwrt.git] / target / linux / layerscape / patches-5.4 / 701-net-0174-staging-fsl-dpaa2-mac-Add-autoneg-support.patch
1 From 52ab0053f3f8ab374c48630dd03e44fec8138113 Mon Sep 17 00:00:00 2001
2 From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
3 Date: Thu, 18 Oct 2018 18:59:41 +0300
4 Subject: [PATCH] staging: fsl-dpaa2/mac: Add autoneg support
5
6 For MC versions that support it, use the new DPMAC link APIs, which
7 allow setting/getting of advertised and supported link modes.
8
9 A mapping between DPMAC link modes and phydev ones is created to
10 help converting from one to the other.
11
12 Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
13 Signed-off-by: Valentin Catalin Neacsu <valentin-catalin.neacsu@nxp.com>
14 ---
15  drivers/staging/fsl-dpaa2/mac/mac.c | 78 +++++++++++++++++++++++++++++++------
16  1 file changed, 67 insertions(+), 11 deletions(-)
17
18 --- a/drivers/staging/fsl-dpaa2/mac/mac.c
19 +++ b/drivers/staging/fsl-dpaa2/mac/mac.c
20 @@ -1,4 +1,5 @@
21  /* Copyright 2015 Freescale Semiconductor Inc.
22 + * Copyright 2018 NXP
23   *
24   * Redistribution and use in source and binary forms, with or without
25   * modification, are permitted provided that the following conditions are met:
26 @@ -91,6 +92,43 @@ static int cmp_dpmac_ver(struct dpaa2_ma
27         return priv->dpmac_ver_major - ver_major;
28  }
29  
30 +#define DPMAC_LINK_AUTONEG_VER_MAJOR           4
31 +#define DPMAC_LINK_AUTONEG_VER_MINOR           3
32 +
33 +struct dpaa2_mac_link_mode_map {
34 +       u64 dpmac_lm;
35 +       u64 ethtool_lm;
36 +};
37 +
38 +static const struct dpaa2_mac_link_mode_map dpaa2_mac_lm_map[] = {
39 +       {DPMAC_ADVERTISED_10BASET_FULL, ETHTOOL_LINK_MODE_10baseT_Full_BIT},
40 +       {DPMAC_ADVERTISED_100BASET_FULL, ETHTOOL_LINK_MODE_100baseT_Full_BIT},
41 +       {DPMAC_ADVERTISED_1000BASET_FULL, ETHTOOL_LINK_MODE_1000baseT_Full_BIT},
42 +       {DPMAC_ADVERTISED_10000BASET_FULL, ETHTOOL_LINK_MODE_10000baseT_Full_BIT},
43 +       {DPMAC_ADVERTISED_2500BASEX_FULL, ETHTOOL_LINK_MODE_2500baseT_Full_BIT},
44 +       {DPMAC_ADVERTISED_AUTONEG, ETHTOOL_LINK_MODE_Autoneg_BIT},
45 +};
46 +
47 +static void link_mode_dpmac2phydev(u64 dpmac_lm, unsigned long *phydev_lm)
48 +{
49 +       int i;
50 +
51 +       for (i = 0; i < ARRAY_SIZE(dpaa2_mac_lm_map); i++) {
52 +               if (dpmac_lm & dpaa2_mac_lm_map[i].dpmac_lm)
53 +                       linkmode_set_bit(dpaa2_mac_lm_map[i].ethtool_lm, phydev_lm);
54 +       }
55 +}
56 +
57 +static void link_mode_phydev2dpmac(unsigned long *phydev_lm, u64 *dpni_lm)
58 +{
59 +       int i;
60 +
61 +       for (i = 0; i < ARRAY_SIZE(dpaa2_mac_lm_map); i++) {
62 +               if (linkmode_test_bit(dpaa2_mac_lm_map[i].ethtool_lm, phydev_lm))
63 +                       *dpni_lm |= dpaa2_mac_lm_map[i].dpmac_lm;
64 +       }
65 +}
66 +
67  static void dpaa2_mac_link_changed(struct net_device *netdev)
68  {
69         struct phy_device       *phydev;
70 @@ -122,11 +160,18 @@ static void dpaa2_mac_link_changed(struc
71                 phy_print_status(phydev);
72         }
73  
74 -       /* We must interrogate MC at all times, because we don't know
75 -        * when and whether a potential DPNI may have read the link state.
76 -        */
77 -       err = dpmac_set_link_state(priv->mc_dev->mc_io, 0,
78 -                                  priv->mc_dev->mc_handle, &state);
79 +       if (cmp_dpmac_ver(priv, DPMAC_LINK_AUTONEG_VER_MAJOR,
80 +                         DPMAC_LINK_AUTONEG_VER_MINOR) < 0) {
81 +               err = dpmac_set_link_state(priv->mc_dev->mc_io, 0,
82 +                                          priv->mc_dev->mc_handle, &state);
83 +       } else {
84 +               link_mode_phydev2dpmac(phydev->supported, &state.supported);
85 +               link_mode_phydev2dpmac(phydev->advertising, &state.advertising);
86 +               state.state_valid = 1;
87 +
88 +               err = dpmac_set_link_state_v2(priv->mc_dev->mc_io, 0,
89 +                                             priv->mc_dev->mc_handle, &state);
90 +       }
91         if (unlikely(err))
92                 dev_err(&priv->mc_dev->dev, "dpmac_set_link_state: %d\n", err);
93  }
94 @@ -365,12 +410,17 @@ static void configure_link(struct dpaa2_
95         phydev->speed = cfg->rate;
96         phydev->duplex  = !!(cfg->options & DPMAC_LINK_OPT_HALF_DUPLEX);
97  
98 +       if (cfg->advertising != 0) {
99 +               linkmode_zero(phydev->advertising);
100 +               link_mode_dpmac2phydev(cfg->advertising, phydev->advertising);
101 +       }
102 +
103         if (cfg->options & DPMAC_LINK_OPT_AUTONEG) {
104 -               phydev->autoneg = 1;
105 -               phydev->advertising |= ADVERTISED_Autoneg;
106 +               phydev->autoneg = AUTONEG_ENABLE;
107 +               linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->advertising);
108         } else {
109 -               phydev->autoneg = 0;
110 -               phydev->advertising &= ~ADVERTISED_Autoneg;
111 +               phydev->autoneg = AUTONEG_DISABLE;
112 +               linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->advertising);
113         }
114  
115         phy_start_aneg(phydev);
116 @@ -392,8 +442,14 @@ static irqreturn_t dpaa2_mac_irq_handler
117  
118         /* DPNI-initiated link configuration; 'ifconfig up' also calls this */
119         if (status & DPMAC_IRQ_EVENT_LINK_CFG_REQ) {
120 -               err = dpmac_get_link_cfg(mc_dev->mc_io, 0, mc_dev->mc_handle,
121 -                                        &link_cfg);
122 +               if (cmp_dpmac_ver(priv, DPMAC_LINK_AUTONEG_VER_MAJOR,
123 +                                 DPMAC_LINK_AUTONEG_VER_MINOR) < 0)
124 +                       err = dpmac_get_link_cfg(mc_dev->mc_io, 0,
125 +                                                mc_dev->mc_handle, &link_cfg);
126 +               else
127 +                       err = dpmac_get_link_cfg_v2(mc_dev->mc_io, 0,
128 +                                                   mc_dev->mc_handle,
129 +                                                   &link_cfg);
130                 if (unlikely(err))
131                         goto out;
132