* Re: [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs
@ 2022-07-28 7:22 kernel test robot
2022-07-28 8:13 ` kernel test robot
0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2022-07-28 7:22 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 17305 bytes --]
::::::
:::::: Manual check reason: "commit no functional change"
::::::
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220727064321.2953971-4-mw@semihalf.com>
References: <20220727064321.2953971-4-mw@semihalf.com>
TO: Marcin Wojtas <mw@semihalf.com>
TO: linux-kernel(a)vger.kernel.org
TO: linux-acpi(a)vger.kernel.org
TO: netdev(a)vger.kernel.org
CC: rafael(a)kernel.org
CC: andriy.shevchenko(a)linux.intel.com
CC: sean.wang(a)mediatek.com
CC: Landen.Chao(a)mediatek.com
CC: linus.walleij(a)linaro.org
CC: andrew(a)lunn.ch
CC: vivien.didelot(a)gmail.com
CC: f.fainelli(a)gmail.com
CC: olteanv(a)gmail.com
CC: davem(a)davemloft.net
CC: edumazet(a)google.com
CC: kuba(a)kernel.org
CC: pabeni(a)redhat.com
CC: linux(a)armlinux.org.uk
CC: hkallweit1(a)gmail.com
CC: gjb(a)semihalf.com
CC: mw(a)semihalf.com
CC: jaz(a)semihalf.com
CC: tn(a)semihalf.com
CC: Samer.El-Haj-Mahmoud(a)arm.com
CC: upstream(a)semihalf.com
Hi Marcin,
I love your patch! Yet something to improve:
[auto build test ERROR on next-20220726]
[cannot apply to driver-core/driver-core-testing robh/for-next horms-ipvs/master linus/master v5.19-rc8 v5.19-rc7 v5.19-rc6 v5.19-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marcin-Wojtas/DSA-switch-to-fwnode_-device_/20220727-144515
base: 058affafc65a74cf54499fb578b66ad0b18f939b
:::::: branch date: 24 hours ago
:::::: commit date: 24 hours ago
config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20220728/202207281516.7lNRXIgu-lkp(a)intel.com/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/0cd0cba4df268433a47eb7d7e6c4b657dac14cbc
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Marcin-Wojtas/DSA-switch-to-fwnode_-device_/20220727-144515
git checkout 0cd0cba4df268433a47eb7d7e6c4b657dac14cbc
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/net/dsa/mt7530.c: In function 'mt7530_setup':
>> drivers/net/dsa/mt7530.c:2254:63: error: passing argument 2 of 'of_get_phy_mode' from incompatible pointer type [-Werror=incompatible-pointer-types]
2254 | ret = of_get_phy_mode(mac_np, &interface);
| ^~~~~~~~~~
| |
| int *
In file included from drivers/net/dsa/mt7530.c:15:
include/linux/of_net.h:15:69: note: expected 'phy_interface_t *' but argument is of type 'int *'
15 | extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~
cc1: some warnings being treated as errors
vim +/of_get_phy_mode +2254 drivers/net/dsa/mt7530.c
ba751e28d442557 DENG Qingfang 2021-05-19 2103
b8f126a8d54318b Sean Wang 2017-04-07 2104 static int
b8f126a8d54318b Sean Wang 2017-04-07 2105 mt7530_setup(struct dsa_switch *ds)
b8f126a8d54318b Sean Wang 2017-04-07 2106 {
b8f126a8d54318b Sean Wang 2017-04-07 2107 struct mt7530_priv *priv = ds->priv;
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2108 struct device_node *dn = NULL;
38f790a805609b2 René van Dorst 2019-09-02 2109 struct device_node *phy_node;
38f790a805609b2 René van Dorst 2019-09-02 2110 struct device_node *mac_np;
b8f126a8d54318b Sean Wang 2017-04-07 2111 struct mt7530_dummy_poll p;
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2112 struct dsa_port *cpu_dp;
0cd0cba4df26843 Marcin Wojtas 2022-07-27 2113 int interface;
ca366d6c889b5d3 René van Dorst 2019-09-02 2114 u32 id, val;
ca366d6c889b5d3 René van Dorst 2019-09-02 2115 int ret, i;
b8f126a8d54318b Sean Wang 2017-04-07 2116
0abfd494deefdba Vivien Didelot 2017-09-20 2117 /* The parent node of master netdev which holds the common system
b8f126a8d54318b Sean Wang 2017-04-07 2118 * controller also is the container for two GMACs nodes representing
b8f126a8d54318b Sean Wang 2017-04-07 2119 * as two netdev instances.
b8f126a8d54318b Sean Wang 2017-04-07 2120 */
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2121 dsa_switch_for_each_cpu_port(cpu_dp, ds) {
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2122 dn = cpu_dp->master->dev.of_node->parent;
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2123 /* It doesn't matter which CPU port is found first,
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2124 * their masters should share the same parent OF node
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2125 */
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2126 break;
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2127 }
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2128
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2129 if (!dn) {
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2130 dev_err(ds->dev, "parent OF node of DSA master not found");
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2131 return -EINVAL;
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2132 }
6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2133
0b69c54c74bcb60 DENG Qingfang 2021-08-04 2134 ds->assisted_learning_on_cpu_port = true;
771c8901568dd87 DENG Qingfang 2020-12-11 2135 ds->mtu_enforcement_ingress = true;
ddda1ac116c852b Greg Ungerer 2019-01-30 2136
ddda1ac116c852b Greg Ungerer 2019-01-30 2137 if (priv->id == ID_MT7530) {
b8f126a8d54318b Sean Wang 2017-04-07 2138 regulator_set_voltage(priv->core_pwr, 1000000, 1000000);
b8f126a8d54318b Sean Wang 2017-04-07 2139 ret = regulator_enable(priv->core_pwr);
b8f126a8d54318b Sean Wang 2017-04-07 2140 if (ret < 0) {
b8f126a8d54318b Sean Wang 2017-04-07 2141 dev_err(priv->dev,
b8f126a8d54318b Sean Wang 2017-04-07 2142 "Failed to enable core power: %d\n", ret);
b8f126a8d54318b Sean Wang 2017-04-07 2143 return ret;
b8f126a8d54318b Sean Wang 2017-04-07 2144 }
b8f126a8d54318b Sean Wang 2017-04-07 2145
b8f126a8d54318b Sean Wang 2017-04-07 2146 regulator_set_voltage(priv->io_pwr, 3300000, 3300000);
b8f126a8d54318b Sean Wang 2017-04-07 2147 ret = regulator_enable(priv->io_pwr);
b8f126a8d54318b Sean Wang 2017-04-07 2148 if (ret < 0) {
b8f126a8d54318b Sean Wang 2017-04-07 2149 dev_err(priv->dev, "Failed to enable io pwr: %d\n",
b8f126a8d54318b Sean Wang 2017-04-07 2150 ret);
b8f126a8d54318b Sean Wang 2017-04-07 2151 return ret;
b8f126a8d54318b Sean Wang 2017-04-07 2152 }
ddda1ac116c852b Greg Ungerer 2019-01-30 2153 }
b8f126a8d54318b Sean Wang 2017-04-07 2154
b8f126a8d54318b Sean Wang 2017-04-07 2155 /* Reset whole chip through gpio pin or memory-mapped registers for
b8f126a8d54318b Sean Wang 2017-04-07 2156 * different type of hardware
b8f126a8d54318b Sean Wang 2017-04-07 2157 */
b8f126a8d54318b Sean Wang 2017-04-07 2158 if (priv->mcm) {
b8f126a8d54318b Sean Wang 2017-04-07 2159 reset_control_assert(priv->rstc);
b8f126a8d54318b Sean Wang 2017-04-07 2160 usleep_range(1000, 1100);
b8f126a8d54318b Sean Wang 2017-04-07 2161 reset_control_deassert(priv->rstc);
b8f126a8d54318b Sean Wang 2017-04-07 2162 } else {
b8f126a8d54318b Sean Wang 2017-04-07 2163 gpiod_set_value_cansleep(priv->reset, 0);
b8f126a8d54318b Sean Wang 2017-04-07 2164 usleep_range(1000, 1100);
b8f126a8d54318b Sean Wang 2017-04-07 2165 gpiod_set_value_cansleep(priv->reset, 1);
b8f126a8d54318b Sean Wang 2017-04-07 2166 }
b8f126a8d54318b Sean Wang 2017-04-07 2167
b8f126a8d54318b Sean Wang 2017-04-07 2168 /* Waiting for MT7530 got to stable */
b8f126a8d54318b Sean Wang 2017-04-07 2169 INIT_MT7530_DUMMY_POLL(&p, priv, MT7530_HWTRAP);
b8f126a8d54318b Sean Wang 2017-04-07 2170 ret = readx_poll_timeout(_mt7530_read, &p, val, val != 0,
b8f126a8d54318b Sean Wang 2017-04-07 2171 20, 1000000);
b8f126a8d54318b Sean Wang 2017-04-07 2172 if (ret < 0) {
b8f126a8d54318b Sean Wang 2017-04-07 2173 dev_err(priv->dev, "reset timeout\n");
b8f126a8d54318b Sean Wang 2017-04-07 2174 return ret;
b8f126a8d54318b Sean Wang 2017-04-07 2175 }
b8f126a8d54318b Sean Wang 2017-04-07 2176
b8f126a8d54318b Sean Wang 2017-04-07 2177 id = mt7530_read(priv, MT7530_CREV);
b8f126a8d54318b Sean Wang 2017-04-07 2178 id >>= CHIP_NAME_SHIFT;
b8f126a8d54318b Sean Wang 2017-04-07 2179 if (id != MT7530_ID) {
b8f126a8d54318b Sean Wang 2017-04-07 2180 dev_err(priv->dev, "chip %x can't be supported\n", id);
b8f126a8d54318b Sean Wang 2017-04-07 2181 return -ENODEV;
b8f126a8d54318b Sean Wang 2017-04-07 2182 }
b8f126a8d54318b Sean Wang 2017-04-07 2183
b8f126a8d54318b Sean Wang 2017-04-07 2184 /* Reset the switch through internal reset */
b8f126a8d54318b Sean Wang 2017-04-07 2185 mt7530_write(priv, MT7530_SYS_CTRL,
b8f126a8d54318b Sean Wang 2017-04-07 2186 SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST |
b8f126a8d54318b Sean Wang 2017-04-07 2187 SYS_CTRL_REG_RST);
b8f126a8d54318b Sean Wang 2017-04-07 2188
b8f126a8d54318b Sean Wang 2017-04-07 2189 /* Enable Port 6 only; P5 as GMAC5 which currently is not supported */
b8f126a8d54318b Sean Wang 2017-04-07 2190 val = mt7530_read(priv, MT7530_MHWTRAP);
b8f126a8d54318b Sean Wang 2017-04-07 2191 val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
b8f126a8d54318b Sean Wang 2017-04-07 2192 val |= MHWTRAP_MANUAL;
b8f126a8d54318b Sean Wang 2017-04-07 2193 mt7530_write(priv, MT7530_MHWTRAP, val);
b8f126a8d54318b Sean Wang 2017-04-07 2194
ca366d6c889b5d3 René van Dorst 2019-09-02 2195 priv->p6_interface = PHY_INTERFACE_MODE_NA;
ca366d6c889b5d3 René van Dorst 2019-09-02 2196
b8f126a8d54318b Sean Wang 2017-04-07 2197 /* Enable and reset MIB counters */
b8f126a8d54318b Sean Wang 2017-04-07 2198 mt7530_mib_reset(ds);
b8f126a8d54318b Sean Wang 2017-04-07 2199
b8f126a8d54318b Sean Wang 2017-04-07 2200 for (i = 0; i < MT7530_NUM_PORTS; i++) {
b8f126a8d54318b Sean Wang 2017-04-07 2201 /* Disable forwarding by default on all ports */
b8f126a8d54318b Sean Wang 2017-04-07 2202 mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK,
b8f126a8d54318b Sean Wang 2017-04-07 2203 PCR_MATRIX_CLR);
b8f126a8d54318b Sean Wang 2017-04-07 2204
0b69c54c74bcb60 DENG Qingfang 2021-08-04 2205 /* Disable learning by default on all ports */
0b69c54c74bcb60 DENG Qingfang 2021-08-04 2206 mt7530_set(priv, MT7530_PSC_P(i), SA_DIS);
0b69c54c74bcb60 DENG Qingfang 2021-08-04 2207
0ce0c3cd2239502 Alex Dewar 2020-09-19 2208 if (dsa_is_cpu_port(ds, i)) {
0ce0c3cd2239502 Alex Dewar 2020-09-19 2209 ret = mt753x_cpu_port_enable(ds, i);
0ce0c3cd2239502 Alex Dewar 2020-09-19 2210 if (ret)
0ce0c3cd2239502 Alex Dewar 2020-09-19 2211 return ret;
5a30833b9a16f8d DENG Qingfang 2021-03-16 2212 } else {
75104db0cb353ec Andrew Lunn 2019-02-24 2213 mt7530_port_disable(ds, i);
6087175b7991a90 DENG Qingfang 2021-08-04 2214
6087175b7991a90 DENG Qingfang 2021-08-04 2215 /* Set default PVID to 0 on all user ports */
6087175b7991a90 DENG Qingfang 2021-08-04 2216 mt7530_rmw(priv, MT7530_PPBV1_P(i), G0_PORT_VID_MASK,
6087175b7991a90 DENG Qingfang 2021-08-04 2217 G0_PORT_VID_DEF);
5a30833b9a16f8d DENG Qingfang 2021-03-16 2218 }
e045124e93995fe DENG Qingfang 2020-04-14 2219 /* Enable consistent egress tag */
e045124e93995fe DENG Qingfang 2020-04-14 2220 mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK,
e045124e93995fe DENG Qingfang 2020-04-14 2221 PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
b8f126a8d54318b Sean Wang 2017-04-07 2222 }
b8f126a8d54318b Sean Wang 2017-04-07 2223
1ca8a193cade7f4 DENG Qingfang 2021-08-25 2224 /* Setup VLAN ID 0 for VLAN-unaware bridges */
1ca8a193cade7f4 DENG Qingfang 2021-08-25 2225 ret = mt7530_setup_vlan0(priv);
1ca8a193cade7f4 DENG Qingfang 2021-08-25 2226 if (ret)
1ca8a193cade7f4 DENG Qingfang 2021-08-25 2227 return ret;
1ca8a193cade7f4 DENG Qingfang 2021-08-25 2228
38f790a805609b2 René van Dorst 2019-09-02 2229 /* Setup port 5 */
38f790a805609b2 René van Dorst 2019-09-02 2230 priv->p5_intf_sel = P5_DISABLED;
38f790a805609b2 René van Dorst 2019-09-02 2231 interface = PHY_INTERFACE_MODE_NA;
38f790a805609b2 René van Dorst 2019-09-02 2232
38f790a805609b2 René van Dorst 2019-09-02 2233 if (!dsa_is_unused_port(ds, 5)) {
38f790a805609b2 René van Dorst 2019-09-02 2234 priv->p5_intf_sel = P5_INTF_SEL_GMAC5;
0cd0cba4df26843 Marcin Wojtas 2022-07-27 2235 interface = fwnode_get_phy_mode(dsa_to_port(ds, 5)->fwnode);
0cd0cba4df26843 Marcin Wojtas 2022-07-27 2236 if (interface < 0)
0c65b2b90d13c1d Andrew Lunn 2019-11-04 2237 return ret;
38f790a805609b2 René van Dorst 2019-09-02 2238 } else {
38f790a805609b2 René van Dorst 2019-09-02 2239 /* Scan the ethernet nodes. look for GMAC1, lookup used phy */
38f790a805609b2 René van Dorst 2019-09-02 2240 for_each_child_of_node(dn, mac_np) {
38f790a805609b2 René van Dorst 2019-09-02 2241 if (!of_device_is_compatible(mac_np,
38f790a805609b2 René van Dorst 2019-09-02 2242 "mediatek,eth-mac"))
38f790a805609b2 René van Dorst 2019-09-02 2243 continue;
38f790a805609b2 René van Dorst 2019-09-02 2244
38f790a805609b2 René van Dorst 2019-09-02 2245 ret = of_property_read_u32(mac_np, "reg", &id);
38f790a805609b2 René van Dorst 2019-09-02 2246 if (ret < 0 || id != 1)
38f790a805609b2 René van Dorst 2019-09-02 2247 continue;
38f790a805609b2 René van Dorst 2019-09-02 2248
38f790a805609b2 René van Dorst 2019-09-02 2249 phy_node = of_parse_phandle(mac_np, "phy-handle", 0);
0452800f6db4ed0 Chuanhong Guo 2020-04-03 2250 if (!phy_node)
0452800f6db4ed0 Chuanhong Guo 2020-04-03 2251 continue;
0452800f6db4ed0 Chuanhong Guo 2020-04-03 2252
38f790a805609b2 René van Dorst 2019-09-02 2253 if (phy_node->parent == priv->dev->of_node->parent) {
0c65b2b90d13c1d Andrew Lunn 2019-11-04 @2254 ret = of_get_phy_mode(mac_np, &interface);
8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2255 if (ret && ret != -ENODEV) {
8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2256 of_node_put(mac_np);
a9e9b091a1c14ec Yang Yingliang 2022-04-28 2257 of_node_put(phy_node);
0c65b2b90d13c1d Andrew Lunn 2019-11-04 2258 return ret;
8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2259 }
38f790a805609b2 René van Dorst 2019-09-02 2260 id = of_mdio_parse_addr(ds->dev, phy_node);
38f790a805609b2 René van Dorst 2019-09-02 2261 if (id == 0)
38f790a805609b2 René van Dorst 2019-09-02 2262 priv->p5_intf_sel = P5_INTF_SEL_PHY_P0;
38f790a805609b2 René van Dorst 2019-09-02 2263 if (id == 4)
38f790a805609b2 René van Dorst 2019-09-02 2264 priv->p5_intf_sel = P5_INTF_SEL_PHY_P4;
38f790a805609b2 René van Dorst 2019-09-02 2265 }
8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2266 of_node_put(mac_np);
38f790a805609b2 René van Dorst 2019-09-02 2267 of_node_put(phy_node);
38f790a805609b2 René van Dorst 2019-09-02 2268 break;
38f790a805609b2 René van Dorst 2019-09-02 2269 }
38f790a805609b2 René van Dorst 2019-09-02 2270 }
38f790a805609b2 René van Dorst 2019-09-02 2271
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs 2022-07-28 7:22 [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs kernel test robot @ 2022-07-28 8:13 ` kernel test robot 0 siblings, 0 replies; 4+ messages in thread From: kernel test robot @ 2022-07-28 8:13 UTC (permalink / raw) To: Marcin Wojtas, linux-kernel, linux-acpi, netdev Cc: rafael, andriy.shevchenko, sean.wang, Landen.Chao, linus.walleij, andrew, vivien.didelot, f.fainelli, olteanv, davem, edumazet, kuba, pabeni, linux, hkallweit1, gjb, mw, jaz, tn, Samer.El-Haj-Mahmoud, upstream, kbuild-all Hi Marcin, I love your patch! Yet something to improve: [auto build test ERROR on next-20220726] [cannot apply to driver-core/driver-core-testing robh/for-next horms-ipvs/master linus/master v5.19-rc8 v5.19-rc7 v5.19-rc6 v5.19-rc8] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Marcin-Wojtas/DSA-switch-to-fwnode_-device_/20220727-144515 base: 058affafc65a74cf54499fb578b66ad0b18f939b :::::: branch date: 24 hours ago :::::: commit date: 24 hours ago config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20220728/202207281516.7lNRXIgu-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-3) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/0cd0cba4df268433a47eb7d7e6c4b657dac14cbc git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Marcin-Wojtas/DSA-switch-to-fwnode_-device_/20220727-144515 git checkout 0cd0cba4df268433a47eb7d7e6c4b657dac14cbc # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): drivers/net/dsa/mt7530.c: In function 'mt7530_setup': >> drivers/net/dsa/mt7530.c:2254:63: error: passing argument 2 of 'of_get_phy_mode' from incompatible pointer type [-Werror=incompatible-pointer-types] 2254 | ret = of_get_phy_mode(mac_np, &interface); | ^~~~~~~~~~ | | | int * In file included from drivers/net/dsa/mt7530.c:15: include/linux/of_net.h:15:69: note: expected 'phy_interface_t *' but argument is of type 'int *' 15 | extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface); | ~~~~~~~~~~~~~~~~~^~~~~~~~~ cc1: some warnings being treated as errors vim +/of_get_phy_mode +2254 drivers/net/dsa/mt7530.c ba751e28d442557 DENG Qingfang 2021-05-19 2103 b8f126a8d54318b Sean Wang 2017-04-07 2104 static int b8f126a8d54318b Sean Wang 2017-04-07 2105 mt7530_setup(struct dsa_switch *ds) b8f126a8d54318b Sean Wang 2017-04-07 2106 { b8f126a8d54318b Sean Wang 2017-04-07 2107 struct mt7530_priv *priv = ds->priv; 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2108 struct device_node *dn = NULL; 38f790a805609b2 René van Dorst 2019-09-02 2109 struct device_node *phy_node; 38f790a805609b2 René van Dorst 2019-09-02 2110 struct device_node *mac_np; b8f126a8d54318b Sean Wang 2017-04-07 2111 struct mt7530_dummy_poll p; 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2112 struct dsa_port *cpu_dp; 0cd0cba4df26843 Marcin Wojtas 2022-07-27 2113 int interface; ca366d6c889b5d3 René van Dorst 2019-09-02 2114 u32 id, val; ca366d6c889b5d3 René van Dorst 2019-09-02 2115 int ret, i; b8f126a8d54318b Sean Wang 2017-04-07 2116 0abfd494deefdba Vivien Didelot 2017-09-20 2117 /* The parent node of master netdev which holds the common system b8f126a8d54318b Sean Wang 2017-04-07 2118 * controller also is the container for two GMACs nodes representing b8f126a8d54318b Sean Wang 2017-04-07 2119 * as two netdev instances. b8f126a8d54318b Sean Wang 2017-04-07 2120 */ 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2121 dsa_switch_for_each_cpu_port(cpu_dp, ds) { 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2122 dn = cpu_dp->master->dev.of_node->parent; 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2123 /* It doesn't matter which CPU port is found first, 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2124 * their masters should share the same parent OF node 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2125 */ 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2126 break; 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2127 } 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2128 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2129 if (!dn) { 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2130 dev_err(ds->dev, "parent OF node of DSA master not found"); 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2131 return -EINVAL; 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2132 } 6e19bc26cccdd34 Frank Wunderlich 2022-06-10 2133 0b69c54c74bcb60 DENG Qingfang 2021-08-04 2134 ds->assisted_learning_on_cpu_port = true; 771c8901568dd87 DENG Qingfang 2020-12-11 2135 ds->mtu_enforcement_ingress = true; ddda1ac116c852b Greg Ungerer 2019-01-30 2136 ddda1ac116c852b Greg Ungerer 2019-01-30 2137 if (priv->id == ID_MT7530) { b8f126a8d54318b Sean Wang 2017-04-07 2138 regulator_set_voltage(priv->core_pwr, 1000000, 1000000); b8f126a8d54318b Sean Wang 2017-04-07 2139 ret = regulator_enable(priv->core_pwr); b8f126a8d54318b Sean Wang 2017-04-07 2140 if (ret < 0) { b8f126a8d54318b Sean Wang 2017-04-07 2141 dev_err(priv->dev, b8f126a8d54318b Sean Wang 2017-04-07 2142 "Failed to enable core power: %d\n", ret); b8f126a8d54318b Sean Wang 2017-04-07 2143 return ret; b8f126a8d54318b Sean Wang 2017-04-07 2144 } b8f126a8d54318b Sean Wang 2017-04-07 2145 b8f126a8d54318b Sean Wang 2017-04-07 2146 regulator_set_voltage(priv->io_pwr, 3300000, 3300000); b8f126a8d54318b Sean Wang 2017-04-07 2147 ret = regulator_enable(priv->io_pwr); b8f126a8d54318b Sean Wang 2017-04-07 2148 if (ret < 0) { b8f126a8d54318b Sean Wang 2017-04-07 2149 dev_err(priv->dev, "Failed to enable io pwr: %d\n", b8f126a8d54318b Sean Wang 2017-04-07 2150 ret); b8f126a8d54318b Sean Wang 2017-04-07 2151 return ret; b8f126a8d54318b Sean Wang 2017-04-07 2152 } ddda1ac116c852b Greg Ungerer 2019-01-30 2153 } b8f126a8d54318b Sean Wang 2017-04-07 2154 b8f126a8d54318b Sean Wang 2017-04-07 2155 /* Reset whole chip through gpio pin or memory-mapped registers for b8f126a8d54318b Sean Wang 2017-04-07 2156 * different type of hardware b8f126a8d54318b Sean Wang 2017-04-07 2157 */ b8f126a8d54318b Sean Wang 2017-04-07 2158 if (priv->mcm) { b8f126a8d54318b Sean Wang 2017-04-07 2159 reset_control_assert(priv->rstc); b8f126a8d54318b Sean Wang 2017-04-07 2160 usleep_range(1000, 1100); b8f126a8d54318b Sean Wang 2017-04-07 2161 reset_control_deassert(priv->rstc); b8f126a8d54318b Sean Wang 2017-04-07 2162 } else { b8f126a8d54318b Sean Wang 2017-04-07 2163 gpiod_set_value_cansleep(priv->reset, 0); b8f126a8d54318b Sean Wang 2017-04-07 2164 usleep_range(1000, 1100); b8f126a8d54318b Sean Wang 2017-04-07 2165 gpiod_set_value_cansleep(priv->reset, 1); b8f126a8d54318b Sean Wang 2017-04-07 2166 } b8f126a8d54318b Sean Wang 2017-04-07 2167 b8f126a8d54318b Sean Wang 2017-04-07 2168 /* Waiting for MT7530 got to stable */ b8f126a8d54318b Sean Wang 2017-04-07 2169 INIT_MT7530_DUMMY_POLL(&p, priv, MT7530_HWTRAP); b8f126a8d54318b Sean Wang 2017-04-07 2170 ret = readx_poll_timeout(_mt7530_read, &p, val, val != 0, b8f126a8d54318b Sean Wang 2017-04-07 2171 20, 1000000); b8f126a8d54318b Sean Wang 2017-04-07 2172 if (ret < 0) { b8f126a8d54318b Sean Wang 2017-04-07 2173 dev_err(priv->dev, "reset timeout\n"); b8f126a8d54318b Sean Wang 2017-04-07 2174 return ret; b8f126a8d54318b Sean Wang 2017-04-07 2175 } b8f126a8d54318b Sean Wang 2017-04-07 2176 b8f126a8d54318b Sean Wang 2017-04-07 2177 id = mt7530_read(priv, MT7530_CREV); b8f126a8d54318b Sean Wang 2017-04-07 2178 id >>= CHIP_NAME_SHIFT; b8f126a8d54318b Sean Wang 2017-04-07 2179 if (id != MT7530_ID) { b8f126a8d54318b Sean Wang 2017-04-07 2180 dev_err(priv->dev, "chip %x can't be supported\n", id); b8f126a8d54318b Sean Wang 2017-04-07 2181 return -ENODEV; b8f126a8d54318b Sean Wang 2017-04-07 2182 } b8f126a8d54318b Sean Wang 2017-04-07 2183 b8f126a8d54318b Sean Wang 2017-04-07 2184 /* Reset the switch through internal reset */ b8f126a8d54318b Sean Wang 2017-04-07 2185 mt7530_write(priv, MT7530_SYS_CTRL, b8f126a8d54318b Sean Wang 2017-04-07 2186 SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST | b8f126a8d54318b Sean Wang 2017-04-07 2187 SYS_CTRL_REG_RST); b8f126a8d54318b Sean Wang 2017-04-07 2188 b8f126a8d54318b Sean Wang 2017-04-07 2189 /* Enable Port 6 only; P5 as GMAC5 which currently is not supported */ b8f126a8d54318b Sean Wang 2017-04-07 2190 val = mt7530_read(priv, MT7530_MHWTRAP); b8f126a8d54318b Sean Wang 2017-04-07 2191 val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS; b8f126a8d54318b Sean Wang 2017-04-07 2192 val |= MHWTRAP_MANUAL; b8f126a8d54318b Sean Wang 2017-04-07 2193 mt7530_write(priv, MT7530_MHWTRAP, val); b8f126a8d54318b Sean Wang 2017-04-07 2194 ca366d6c889b5d3 René van Dorst 2019-09-02 2195 priv->p6_interface = PHY_INTERFACE_MODE_NA; ca366d6c889b5d3 René van Dorst 2019-09-02 2196 b8f126a8d54318b Sean Wang 2017-04-07 2197 /* Enable and reset MIB counters */ b8f126a8d54318b Sean Wang 2017-04-07 2198 mt7530_mib_reset(ds); b8f126a8d54318b Sean Wang 2017-04-07 2199 b8f126a8d54318b Sean Wang 2017-04-07 2200 for (i = 0; i < MT7530_NUM_PORTS; i++) { b8f126a8d54318b Sean Wang 2017-04-07 2201 /* Disable forwarding by default on all ports */ b8f126a8d54318b Sean Wang 2017-04-07 2202 mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK, b8f126a8d54318b Sean Wang 2017-04-07 2203 PCR_MATRIX_CLR); b8f126a8d54318b Sean Wang 2017-04-07 2204 0b69c54c74bcb60 DENG Qingfang 2021-08-04 2205 /* Disable learning by default on all ports */ 0b69c54c74bcb60 DENG Qingfang 2021-08-04 2206 mt7530_set(priv, MT7530_PSC_P(i), SA_DIS); 0b69c54c74bcb60 DENG Qingfang 2021-08-04 2207 0ce0c3cd2239502 Alex Dewar 2020-09-19 2208 if (dsa_is_cpu_port(ds, i)) { 0ce0c3cd2239502 Alex Dewar 2020-09-19 2209 ret = mt753x_cpu_port_enable(ds, i); 0ce0c3cd2239502 Alex Dewar 2020-09-19 2210 if (ret) 0ce0c3cd2239502 Alex Dewar 2020-09-19 2211 return ret; 5a30833b9a16f8d DENG Qingfang 2021-03-16 2212 } else { 75104db0cb353ec Andrew Lunn 2019-02-24 2213 mt7530_port_disable(ds, i); 6087175b7991a90 DENG Qingfang 2021-08-04 2214 6087175b7991a90 DENG Qingfang 2021-08-04 2215 /* Set default PVID to 0 on all user ports */ 6087175b7991a90 DENG Qingfang 2021-08-04 2216 mt7530_rmw(priv, MT7530_PPBV1_P(i), G0_PORT_VID_MASK, 6087175b7991a90 DENG Qingfang 2021-08-04 2217 G0_PORT_VID_DEF); 5a30833b9a16f8d DENG Qingfang 2021-03-16 2218 } e045124e93995fe DENG Qingfang 2020-04-14 2219 /* Enable consistent egress tag */ e045124e93995fe DENG Qingfang 2020-04-14 2220 mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK, e045124e93995fe DENG Qingfang 2020-04-14 2221 PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); b8f126a8d54318b Sean Wang 2017-04-07 2222 } b8f126a8d54318b Sean Wang 2017-04-07 2223 1ca8a193cade7f4 DENG Qingfang 2021-08-25 2224 /* Setup VLAN ID 0 for VLAN-unaware bridges */ 1ca8a193cade7f4 DENG Qingfang 2021-08-25 2225 ret = mt7530_setup_vlan0(priv); 1ca8a193cade7f4 DENG Qingfang 2021-08-25 2226 if (ret) 1ca8a193cade7f4 DENG Qingfang 2021-08-25 2227 return ret; 1ca8a193cade7f4 DENG Qingfang 2021-08-25 2228 38f790a805609b2 René van Dorst 2019-09-02 2229 /* Setup port 5 */ 38f790a805609b2 René van Dorst 2019-09-02 2230 priv->p5_intf_sel = P5_DISABLED; 38f790a805609b2 René van Dorst 2019-09-02 2231 interface = PHY_INTERFACE_MODE_NA; 38f790a805609b2 René van Dorst 2019-09-02 2232 38f790a805609b2 René van Dorst 2019-09-02 2233 if (!dsa_is_unused_port(ds, 5)) { 38f790a805609b2 René van Dorst 2019-09-02 2234 priv->p5_intf_sel = P5_INTF_SEL_GMAC5; 0cd0cba4df26843 Marcin Wojtas 2022-07-27 2235 interface = fwnode_get_phy_mode(dsa_to_port(ds, 5)->fwnode); 0cd0cba4df26843 Marcin Wojtas 2022-07-27 2236 if (interface < 0) 0c65b2b90d13c1d Andrew Lunn 2019-11-04 2237 return ret; 38f790a805609b2 René van Dorst 2019-09-02 2238 } else { 38f790a805609b2 René van Dorst 2019-09-02 2239 /* Scan the ethernet nodes. look for GMAC1, lookup used phy */ 38f790a805609b2 René van Dorst 2019-09-02 2240 for_each_child_of_node(dn, mac_np) { 38f790a805609b2 René van Dorst 2019-09-02 2241 if (!of_device_is_compatible(mac_np, 38f790a805609b2 René van Dorst 2019-09-02 2242 "mediatek,eth-mac")) 38f790a805609b2 René van Dorst 2019-09-02 2243 continue; 38f790a805609b2 René van Dorst 2019-09-02 2244 38f790a805609b2 René van Dorst 2019-09-02 2245 ret = of_property_read_u32(mac_np, "reg", &id); 38f790a805609b2 René van Dorst 2019-09-02 2246 if (ret < 0 || id != 1) 38f790a805609b2 René van Dorst 2019-09-02 2247 continue; 38f790a805609b2 René van Dorst 2019-09-02 2248 38f790a805609b2 René van Dorst 2019-09-02 2249 phy_node = of_parse_phandle(mac_np, "phy-handle", 0); 0452800f6db4ed0 Chuanhong Guo 2020-04-03 2250 if (!phy_node) 0452800f6db4ed0 Chuanhong Guo 2020-04-03 2251 continue; 0452800f6db4ed0 Chuanhong Guo 2020-04-03 2252 38f790a805609b2 René van Dorst 2019-09-02 2253 if (phy_node->parent == priv->dev->of_node->parent) { 0c65b2b90d13c1d Andrew Lunn 2019-11-04 @2254 ret = of_get_phy_mode(mac_np, &interface); 8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2255 if (ret && ret != -ENODEV) { 8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2256 of_node_put(mac_np); a9e9b091a1c14ec Yang Yingliang 2022-04-28 2257 of_node_put(phy_node); 0c65b2b90d13c1d Andrew Lunn 2019-11-04 2258 return ret; 8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2259 } 38f790a805609b2 René van Dorst 2019-09-02 2260 id = of_mdio_parse_addr(ds->dev, phy_node); 38f790a805609b2 René van Dorst 2019-09-02 2261 if (id == 0) 38f790a805609b2 René van Dorst 2019-09-02 2262 priv->p5_intf_sel = P5_INTF_SEL_PHY_P0; 38f790a805609b2 René van Dorst 2019-09-02 2263 if (id == 4) 38f790a805609b2 René van Dorst 2019-09-02 2264 priv->p5_intf_sel = P5_INTF_SEL_PHY_P4; 38f790a805609b2 René van Dorst 2019-09-02 2265 } 8e4efd4706f77d7 Sumera Priyadarsini 2020-08-25 2266 of_node_put(mac_np); 38f790a805609b2 René van Dorst 2019-09-02 2267 of_node_put(phy_node); 38f790a805609b2 René van Dorst 2019-09-02 2268 break; 38f790a805609b2 René van Dorst 2019-09-02 2269 } 38f790a805609b2 René van Dorst 2019-09-02 2270 } 38f790a805609b2 René van Dorst 2019-09-02 2271 -- 0-DAY CI Kernel Test Service https://01.org/lkp ^ permalink raw reply [flat|nested] 4+ messages in thread
* [net-next: PATCH v3 0/8] DSA: switch to fwnode_/device_ @ 2022-07-27 6:43 Marcin Wojtas 2022-07-27 6:43 ` [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs Marcin Wojtas 0 siblings, 1 reply; 4+ messages in thread From: Marcin Wojtas @ 2022-07-27 6:43 UTC (permalink / raw) To: linux-kernel, linux-acpi, netdev Cc: rafael, andriy.shevchenko, sean.wang, Landen.Chao, linus.walleij, andrew, vivien.didelot, f.fainelli, olteanv, davem, edumazet, kuba, pabeni, linux, hkallweit1, gjb, mw, jaz, tn, Samer.El-Haj-Mahmoud, upstream Hi, This is a re-spin of the DSA migration to fwnode_/device_ API. It addresses all comments from the previous iteration - the details are summarized in the changelog section below. This time the patchset is based and tested on top of pure net-next/main branch. Each commit was checked on: * On EspressoBIN * On SolidRun CN913x CEx7 Eval Board Any comments or remarks will be appreciated. Best regards, Marcin Changelog v2 -> v3: 1/8: * Replace forward declaration s/device_node/fwnode_handle/ in include/linux/phy_fixed.h * Add Florian's RB * 3/8: * Extend lines width in the commit message. * While dropping dp->dn fields in the drivers, switch to fwnode_ API in the updated places. * 5/8: * Update routine name to fwnode_find_parent_dev_match() * Improve comment section * Move the definition adjacent to a group of fwnode APIs operating on parents Changelog v1 -> v2: 1/8 * Drop unnecessary check in fixed_phy_get_gpiod() * Improve line breaking * Use device_set_node & dev_fwnode 2/8 * Switch to fwnode_property_count_u32 and fix comparison in if statement. 3/8 * Drop dn usage entirely and use dp->fwnode only. Update all dependent drivers to use to_of_node. * Use device_set_node, dev_fwnode & device_get_named_child_node * Replace '_of' routines suffix with '_fw' 4/8 * Use device_set_node 5/8 * New patch 6/8 * Use device_match_fwnode * Restore EXPORT_SYMBOL() 7/8 * Get rid of of_mdiobus_register_device 8/8 * Use dev_fwnode in mv88e6xxx_probe * Simplify condition checks in mv88e6xxx_probe as suggested by Andy Marcin Wojtas (8): net: phy: fixed_phy: switch to fwnode_ API net: mdio: switch fixed-link PHYs API to fwnode_ net: dsa: switch to device_/fwnode_ APIs net: mvpp2: initialize port fwnode pointer device property: introduce fwnode_find_parent_dev_match net: core: switch to fwnode_find_net_device_by_node() net: mdio: introduce fwnode_mdiobus_register_device() net: dsa: mv88e6xxx: switch to device_/fwnode_ APIs include/linux/etherdevice.h | 1 + include/linux/fwnode_mdio.h | 22 ++++ include/linux/of_net.h | 6 - include/linux/phy_fixed.h | 6 +- include/linux/property.h | 1 + include/net/dsa.h | 2 +- net/dsa/dsa_priv.h | 4 +- drivers/base/property.c | 23 ++++ drivers/net/dsa/mt7530.c | 6 +- drivers/net/dsa/mv88e6xxx/chip.c | 57 ++++----- drivers/net/dsa/qca/qca8k.c | 2 +- drivers/net/dsa/realtek/rtl8365mb.c | 2 +- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 +- drivers/net/mdio/fwnode_mdio.c | 129 ++++++++++++++++++++ drivers/net/mdio/of_mdio.c | 111 +---------------- drivers/net/phy/fixed_phy.c | 39 +++--- net/core/net-sysfs.c | 25 ++-- net/dsa/dsa2.c | 101 ++++++++------- net/dsa/port.c | 68 +++++------ net/dsa/slave.c | 7 +- 20 files changed, 329 insertions(+), 285 deletions(-) -- 2.29.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs 2022-07-27 6:43 [net-next: PATCH v3 0/8] DSA: switch to fwnode_/device_ Marcin Wojtas @ 2022-07-27 6:43 ` Marcin Wojtas 2022-07-27 11:29 ` Andy Shevchenko 0 siblings, 1 reply; 4+ messages in thread From: Marcin Wojtas @ 2022-07-27 6:43 UTC (permalink / raw) To: linux-kernel, linux-acpi, netdev Cc: rafael, andriy.shevchenko, sean.wang, Landen.Chao, linus.walleij, andrew, vivien.didelot, f.fainelli, olteanv, davem, edumazet, kuba, pabeni, linux, hkallweit1, gjb, mw, jaz, tn, Samer.El-Haj-Mahmoud, upstream In order to support both DT and ACPI in future, modify the generic DSA code to use device_/fwnode_ equivalent routines. Drop using port's 'dn' field and use only fwnode - update all dependent drivers. Because support for more generic fwnode is added, replace '_of' suffix with '_fw' in related routines. No functional change is introduced by this patch. Signed-off-by: Marcin Wojtas <mw@semihalf.com> --- include/net/dsa.h | 2 +- net/dsa/dsa_priv.h | 4 +- drivers/net/dsa/mt7530.c | 6 +- drivers/net/dsa/mv88e6xxx/chip.c | 14 +-- drivers/net/dsa/qca/qca8k.c | 2 +- drivers/net/dsa/realtek/rtl8365mb.c | 2 +- net/dsa/dsa2.c | 100 +++++++++++--------- net/dsa/port.c | 68 +++++++------ net/dsa/slave.c | 7 +- 9 files changed, 103 insertions(+), 102 deletions(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index b902b31bebce..0a328c0073ec 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -302,7 +302,7 @@ struct dsa_port { u8 setup:1; - struct device_node *dn; + struct fwnode_handle *fwnode; unsigned int ageing_time; struct dsa_bridge *bridge; diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index d9722e49864b..2c0034a915ee 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -285,8 +285,8 @@ int dsa_port_mrp_add_ring_role(const struct dsa_port *dp, int dsa_port_mrp_del_ring_role(const struct dsa_port *dp, const struct switchdev_obj_ring_role_mrp *mrp); int dsa_port_phylink_create(struct dsa_port *dp); -int dsa_port_link_register_of(struct dsa_port *dp); -void dsa_port_link_unregister_of(struct dsa_port *dp); +int dsa_port_link_register_fw(struct dsa_port *dp); +void dsa_port_link_unregister_fw(struct dsa_port *dp); int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr); void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr); int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast); diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index 835807911be0..427b66342493 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -2109,8 +2109,8 @@ mt7530_setup(struct dsa_switch *ds) struct device_node *phy_node; struct device_node *mac_np; struct mt7530_dummy_poll p; - phy_interface_t interface; struct dsa_port *cpu_dp; + int interface; u32 id, val; int ret, i; @@ -2232,8 +2232,8 @@ mt7530_setup(struct dsa_switch *ds) if (!dsa_is_unused_port(ds, 5)) { priv->p5_intf_sel = P5_INTF_SEL_GMAC5; - ret = of_get_phy_mode(dsa_to_port(ds, 5)->dn, &interface); - if (ret && ret != -ENODEV) + interface = fwnode_get_phy_mode(dsa_to_port(ds, 5)->fwnode); + if (interface < 0) return ret; } else { /* Scan the ethernet nodes. look for GMAC1, lookup used phy */ diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index 07e9a4da924c..a46ebdfba1c3 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3275,7 +3275,7 @@ static int mv88e6xxx_setup_upstream_port(struct mv88e6xxx_chip *chip, int port) static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) { - struct device_node *phy_handle = NULL; + struct fwnode_handle *phy_handle = NULL; struct dsa_switch *ds = chip->ds; phy_interface_t mode; struct dsa_port *dp; @@ -3499,15 +3499,15 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) if (chip->info->ops->serdes_set_tx_amplitude) { if (dp) - phy_handle = of_parse_phandle(dp->dn, "phy-handle", 0); + phy_handle = fwnode_find_reference(dp->fwnode, "phy-handle", 0); - if (phy_handle && !of_property_read_u32(phy_handle, - "tx-p2p-microvolt", - &tx_amp)) + if (!IS_ERR(phy_handle) && !fwnode_property_read_u32(phy_handle, + "tx-p2p-microvolt", + &tx_amp)) err = chip->info->ops->serdes_set_tx_amplitude(chip, port, tx_amp); - if (phy_handle) { - of_node_put(phy_handle); + if (!IS_ERR(phy_handle)) { + fwnode_handle_put(phy_handle); if (err) return err; } diff --git a/drivers/net/dsa/qca/qca8k.c b/drivers/net/dsa/qca/qca8k.c index 1cbb05b0323f..77b14ade0828 100644 --- a/drivers/net/dsa/qca/qca8k.c +++ b/drivers/net/dsa/qca/qca8k.c @@ -1517,7 +1517,7 @@ qca8k_parse_port_config(struct qca8k_priv *priv) continue; dp = dsa_to_port(priv->ds, port); - port_dn = dp->dn; + port_dn = to_of_node(dp->fwnode); cpu_port_index++; if (!of_device_is_available(port_dn)) diff --git a/drivers/net/dsa/realtek/rtl8365mb.c b/drivers/net/dsa/realtek/rtl8365mb.c index da31d8b839ac..d61da012451f 100644 --- a/drivers/net/dsa/realtek/rtl8365mb.c +++ b/drivers/net/dsa/realtek/rtl8365mb.c @@ -887,7 +887,7 @@ static int rtl8365mb_ext_config_rgmii(struct realtek_priv *priv, int port, return -ENODEV; dp = dsa_to_port(priv->ds, port); - dn = dp->dn; + dn = to_of_node(dp->fwnode); /* Set the RGMII TX/RX delay * diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index cac48a741f27..82fb3b009fb4 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -296,12 +296,12 @@ static void dsa_tree_put(struct dsa_switch_tree *dst) } static struct dsa_port *dsa_tree_find_port_by_node(struct dsa_switch_tree *dst, - struct device_node *dn) + struct fwnode_handle *fwnode) { struct dsa_port *dp; list_for_each_entry(dp, &dst->ports, list) - if (dp->dn == dn) + if (dp->fwnode == fwnode) return dp; return NULL; @@ -337,14 +337,13 @@ static bool dsa_port_setup_routing_table(struct dsa_port *dp) { struct dsa_switch *ds = dp->ds; struct dsa_switch_tree *dst = ds->dst; - struct device_node *dn = dp->dn; struct of_phandle_iterator it; struct dsa_port *link_dp; struct dsa_link *dl; int err; - of_for_each_phandle(&it, err, dn, "link", NULL, 0) { - link_dp = dsa_tree_find_port_by_node(dst, it.node); + of_for_each_phandle(&it, err, to_of_node(dp->fwnode), "link", NULL, 0) { + link_dp = dsa_tree_find_port_by_node(dst, of_fwnode_handle(it.node)); if (!link_dp) { of_node_put(it.node); return false; @@ -469,7 +468,7 @@ static int dsa_port_setup(struct dsa_port *dp) dsa_port_disable(dp); break; case DSA_PORT_TYPE_CPU: - err = dsa_port_link_register_of(dp); + err = dsa_port_link_register_fw(dp); if (err) break; dsa_port_link_registered = true; @@ -481,7 +480,7 @@ static int dsa_port_setup(struct dsa_port *dp) break; case DSA_PORT_TYPE_DSA: - err = dsa_port_link_register_of(dp); + err = dsa_port_link_register_fw(dp); if (err) break; dsa_port_link_registered = true; @@ -493,7 +492,7 @@ static int dsa_port_setup(struct dsa_port *dp) break; case DSA_PORT_TYPE_USER: - of_get_mac_address(dp->dn, dp->mac); + fwnode_get_mac_address(dp->fwnode, dp->mac); err = dsa_slave_create(dp); if (err) break; @@ -505,7 +504,7 @@ static int dsa_port_setup(struct dsa_port *dp) if (err && dsa_port_enabled) dsa_port_disable(dp); if (err && dsa_port_link_registered) - dsa_port_link_unregister_of(dp); + dsa_port_link_unregister_fw(dp); if (err) { if (ds->ops->port_teardown) ds->ops->port_teardown(ds, dp->index); @@ -577,11 +576,11 @@ static void dsa_port_teardown(struct dsa_port *dp) break; case DSA_PORT_TYPE_CPU: dsa_port_disable(dp); - dsa_port_link_unregister_of(dp); + dsa_port_link_unregister_fw(dp); break; case DSA_PORT_TYPE_DSA: dsa_port_disable(dp); - dsa_port_link_unregister_of(dp); + dsa_port_link_unregister_fw(dp); break; case DSA_PORT_TYPE_USER: if (dp->slave) { @@ -853,7 +852,7 @@ static int dsa_switch_setup_tag_protocol(struct dsa_switch *ds) static int dsa_switch_setup(struct dsa_switch *ds) { struct dsa_devlink_priv *dl_priv; - struct device_node *dn; + struct fwnode_handle *fwnode; struct dsa_port *dp; int err; @@ -909,10 +908,10 @@ static int dsa_switch_setup(struct dsa_switch *ds) dsa_slave_mii_bus_init(ds); - dn = of_get_child_by_name(ds->dev->of_node, "mdio"); + fwnode = device_get_named_child_node(ds->dev, "mdio"); - err = of_mdiobus_register(ds->slave_mii_bus, dn); - of_node_put(dn); + err = of_mdiobus_register(ds->slave_mii_bus, to_of_node(fwnode)); + fwnode_handle_put(fwnode); if (err < 0) goto free_slave_mii_bus; } @@ -1482,24 +1481,33 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master, return 0; } -static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn) +static int dsa_port_parse_fw(struct dsa_port *dp, struct fwnode_handle *fwnode) { - struct device_node *ethernet = of_parse_phandle(dn, "ethernet", 0); - const char *name = of_get_property(dn, "label", NULL); - bool link = of_property_read_bool(dn, "link"); + struct fwnode_handle *ethernet = fwnode_find_reference(fwnode, "ethernet", 0); + bool link = fwnode_property_present(fwnode, "link"); + const char *name; + int ret; + + ret = fwnode_property_read_string(fwnode, "label", &name); + if (ret) + return ret; - dp->dn = dn; + dp->fwnode = fwnode; - if (ethernet) { + if (!IS_ERR(ethernet)) { struct net_device *master; const char *user_protocol; - master = of_find_net_device_by_node(ethernet); - of_node_put(ethernet); + master = of_find_net_device_by_node(to_of_node(ethernet)); + fwnode_handle_put(ethernet); if (!master) return -EPROBE_DEFER; - user_protocol = of_get_property(dn, "dsa-tag-protocol", NULL); + ret = fwnode_property_read_string(fwnode, "dsa-tag-protocol", + &user_protocol); + if (ret) + user_protocol = NULL; + return dsa_port_parse_cpu(dp, master, user_protocol); } @@ -1509,61 +1517,61 @@ static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn) return dsa_port_parse_user(dp, name); } -static int dsa_switch_parse_ports_of(struct dsa_switch *ds, - struct device_node *dn) +static int dsa_switch_parse_ports_fw(struct dsa_switch *ds, + struct fwnode_handle *fwnode) { - struct device_node *ports, *port; + struct fwnode_handle *ports, *port; struct dsa_port *dp; int err = 0; u32 reg; - ports = of_get_child_by_name(dn, "ports"); + ports = fwnode_get_named_child_node(fwnode, "ports"); if (!ports) { /* The second possibility is "ethernet-ports" */ - ports = of_get_child_by_name(dn, "ethernet-ports"); + ports = fwnode_get_named_child_node(fwnode, "ethernet-ports"); if (!ports) { dev_err(ds->dev, "no ports child node found\n"); return -EINVAL; } } - for_each_available_child_of_node(ports, port) { - err = of_property_read_u32(port, "reg", ®); + fwnode_for_each_available_child_node(ports, port) { + err = fwnode_property_read_u32(port, "reg", ®); if (err) { - of_node_put(port); + fwnode_handle_put(port); goto out_put_node; } if (reg >= ds->num_ports) { dev_err(ds->dev, "port %pOF index %u exceeds num_ports (%u)\n", port, reg, ds->num_ports); - of_node_put(port); + fwnode_handle_put(port); err = -EINVAL; goto out_put_node; } dp = dsa_to_port(ds, reg); - err = dsa_port_parse_of(dp, port); + err = dsa_port_parse_fw(dp, port); if (err) { - of_node_put(port); + fwnode_handle_put(port); goto out_put_node; } } out_put_node: - of_node_put(ports); + fwnode_handle_put(ports); return err; } -static int dsa_switch_parse_member_of(struct dsa_switch *ds, - struct device_node *dn) +static int dsa_switch_parse_member_fw(struct dsa_switch *ds, + struct fwnode_handle *fwnode) { u32 m[2] = { 0, 0 }; int sz; /* Don't error out if this optional property isn't found */ - sz = of_property_read_variable_u32_array(dn, "dsa,member", m, 2, 2); + sz = fwnode_property_read_u32_array(fwnode, "dsa,member", m, 2); if (sz < 0 && sz != -EINVAL) return sz; @@ -1600,11 +1608,11 @@ static int dsa_switch_touch_ports(struct dsa_switch *ds) return 0; } -static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) +static int dsa_switch_parse_fw(struct dsa_switch *ds, struct fwnode_handle *fwnode) { int err; - err = dsa_switch_parse_member_of(ds, dn); + err = dsa_switch_parse_member_fw(ds, fwnode); if (err) return err; @@ -1612,7 +1620,7 @@ static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) if (err) return err; - return dsa_switch_parse_ports_of(ds, dn); + return dsa_switch_parse_ports_fw(ds, fwnode); } static int dsa_port_parse(struct dsa_port *dp, const char *name, @@ -1705,20 +1713,20 @@ static int dsa_switch_probe(struct dsa_switch *ds) { struct dsa_switch_tree *dst; struct dsa_chip_data *pdata; - struct device_node *np; + struct fwnode_handle *fwnode; int err; if (!ds->dev) return -ENODEV; pdata = ds->dev->platform_data; - np = ds->dev->of_node; + fwnode = dev_fwnode(ds->dev); if (!ds->num_ports) return -EINVAL; - if (np) { - err = dsa_switch_parse_of(ds, np); + if (fwnode) { + err = dsa_switch_parse_fw(ds, fwnode); if (err) dsa_switch_release_ports(ds); } else if (pdata) { diff --git a/net/dsa/port.c b/net/dsa/port.c index 2dd76eb1621c..40c7d1d9b488 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -6,10 +6,9 @@ * Vivien Didelot <vivien.didelot@savoirfairelinux.com> */ +#include <linux/fwnode_mdio.h> #include <linux/if_bridge.h> #include <linux/notifier.h> -#include <linux/of_mdio.h> -#include <linux/of_net.h> #include "dsa_priv.h" @@ -1380,20 +1379,20 @@ void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp, static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp) { - struct device_node *phy_dn; + struct fwnode_handle *phy_handle; struct phy_device *phydev; - phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0); - if (!phy_dn) + phy_handle = fwnode_find_reference(dp->fwnode, "phy-handle", 0); + if (IS_ERR(phy_handle)) return NULL; - phydev = of_phy_find_device(phy_dn); + phydev = fwnode_phy_find_device(phy_handle); if (!phydev) { - of_node_put(phy_dn); + fwnode_handle_put(phy_handle); return ERR_PTR(-EPROBE_DEFER); } - of_node_put(phy_dn); + fwnode_handle_put(phy_handle); return phydev; } @@ -1525,11 +1524,10 @@ static const struct phylink_mac_ops dsa_port_phylink_mac_ops = { int dsa_port_phylink_create(struct dsa_port *dp) { struct dsa_switch *ds = dp->ds; - phy_interface_t mode; - int err; + int mode; - err = of_get_phy_mode(dp->dn, &mode); - if (err) + mode = fwnode_get_phy_mode(dp->fwnode); + if (mode < 0) mode = PHY_INTERFACE_MODE_NA; /* Presence of phylink_mac_link_state or phylink_mac_an_restart is @@ -1542,7 +1540,7 @@ int dsa_port_phylink_create(struct dsa_port *dp) if (ds->ops->phylink_get_caps) ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config); - dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn), + dp->pl = phylink_create(&dp->pl_config, dp->fwnode, mode, &dsa_port_phylink_mac_ops); if (IS_ERR(dp->pl)) { pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); @@ -1552,7 +1550,7 @@ int dsa_port_phylink_create(struct dsa_port *dp) return 0; } -static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) +static int dsa_port_setup_phy_fw(struct dsa_port *dp, bool enable) { struct dsa_switch *ds = dp->ds; struct phy_device *phydev; @@ -1590,16 +1588,15 @@ static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) return err; } -static int dsa_port_fixed_link_register_of(struct dsa_port *dp) +static int dsa_port_fixed_link_register_fw(struct dsa_port *dp) { - struct device_node *dn = dp->dn; struct dsa_switch *ds = dp->ds; struct phy_device *phydev; int port = dp->index; - phy_interface_t mode; + int mode; int err; - err = of_phy_register_fixed_link(dn); + err = fwnode_phy_register_fixed_link(dp->fwnode); if (err) { dev_err(ds->dev, "failed to register the fixed PHY of port %d\n", @@ -1607,10 +1604,10 @@ static int dsa_port_fixed_link_register_of(struct dsa_port *dp) return err; } - phydev = of_phy_find_device(dn); + phydev = fwnode_phy_find_device(dp->fwnode); - err = of_get_phy_mode(dn, &mode); - if (err) + mode = fwnode_get_phy_mode(dp->fwnode); + if (mode < 0) mode = PHY_INTERFACE_MODE_NA; phydev->interface = mode; @@ -1627,7 +1624,6 @@ static int dsa_port_fixed_link_register_of(struct dsa_port *dp) static int dsa_port_phylink_register(struct dsa_port *dp) { struct dsa_switch *ds = dp->ds; - struct device_node *port_dn = dp->dn; int err; dp->pl_config.dev = ds->dev; @@ -1637,7 +1633,7 @@ static int dsa_port_phylink_register(struct dsa_port *dp) if (err) return err; - err = phylink_of_phy_connect(dp->pl, port_dn, 0); + err = phylink_fwnode_phy_connect(dp->pl, dp->fwnode, 0); if (err && err != -ENODEV) { pr_err("could not attach to PHY: %d\n", err); goto err_phy_connect; @@ -1650,35 +1646,35 @@ static int dsa_port_phylink_register(struct dsa_port *dp) return err; } -int dsa_port_link_register_of(struct dsa_port *dp) +int dsa_port_link_register_fw(struct dsa_port *dp) { + struct fwnode_handle *phy_handle; struct dsa_switch *ds = dp->ds; - struct device_node *phy_np; int port = dp->index; if (!ds->ops->adjust_link) { - phy_np = of_parse_phandle(dp->dn, "phy-handle", 0); - if (of_phy_is_fixed_link(dp->dn) || phy_np) { + phy_handle = fwnode_find_reference(dp->fwnode, "phy-handle", 0); + if (fwnode_phy_is_fixed_link(dp->fwnode) || !IS_ERR(phy_handle)) { if (ds->ops->phylink_mac_link_down) ds->ops->phylink_mac_link_down(ds, port, MLO_AN_FIXED, PHY_INTERFACE_MODE_NA); - of_node_put(phy_np); + fwnode_handle_put(dp->fwnode); return dsa_port_phylink_register(dp); } - of_node_put(phy_np); + fwnode_handle_put(dp->fwnode); return 0; } dev_warn(ds->dev, "Using legacy PHYLIB callbacks. Please migrate to PHYLINK!\n"); - if (of_phy_is_fixed_link(dp->dn)) - return dsa_port_fixed_link_register_of(dp); + if (fwnode_phy_is_fixed_link(dp->fwnode)) + return dsa_port_fixed_link_register_fw(dp); else - return dsa_port_setup_phy_of(dp, true); + return dsa_port_setup_phy_fw(dp, true); } -void dsa_port_link_unregister_of(struct dsa_port *dp) +void dsa_port_link_unregister_fw(struct dsa_port *dp) { struct dsa_switch *ds = dp->ds; @@ -1691,10 +1687,10 @@ void dsa_port_link_unregister_of(struct dsa_port *dp) return; } - if (of_phy_is_fixed_link(dp->dn)) - of_phy_deregister_fixed_link(dp->dn); + if (fwnode_phy_is_fixed_link(dp->fwnode)) + fwnode_phy_deregister_fixed_link(dp->fwnode); else - dsa_port_setup_phy_of(dp, false); + dsa_port_setup_phy_fw(dp, false); } int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr) diff --git a/net/dsa/slave.c b/net/dsa/slave.c index ad6a6663feeb..209e24cb1477 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -10,8 +10,6 @@ #include <linux/phy.h> #include <linux/phy_fixed.h> #include <linux/phylink.h> -#include <linux/of_net.h> -#include <linux/of_mdio.h> #include <linux/mdio.h> #include <net/rtnetlink.h> #include <net/pkt_cls.h> @@ -2228,7 +2226,6 @@ static int dsa_slave_phy_connect(struct net_device *slave_dev, int addr, static int dsa_slave_phy_setup(struct net_device *slave_dev) { struct dsa_port *dp = dsa_slave_to_port(slave_dev); - struct device_node *port_dn = dp->dn; struct dsa_switch *ds = dp->ds; u32 phy_flags = 0; int ret; @@ -2252,7 +2249,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev) if (ds->ops->get_phy_flags) phy_flags = ds->ops->get_phy_flags(ds, dp->index); - ret = phylink_of_phy_connect(dp->pl, port_dn, phy_flags); + ret = phylink_fwnode_phy_connect(dp->pl, dp->fwnode, phy_flags); if (ret == -ENODEV && ds->slave_mii_bus) { /* We could not connect to a designated PHY or SFP, so try to * use the switch internal MDIO bus instead @@ -2364,7 +2361,7 @@ int dsa_slave_create(struct dsa_port *port) SET_NETDEV_DEVTYPE(slave_dev, &dsa_type); SET_NETDEV_DEV(slave_dev, port->ds->dev); - slave_dev->dev.of_node = port->dn; + device_set_node(&slave_dev->dev, port->fwnode); slave_dev->vlan_features = master->vlan_features; p = netdev_priv(slave_dev); -- 2.29.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs 2022-07-27 6:43 ` [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs Marcin Wojtas @ 2022-07-27 11:29 ` Andy Shevchenko 0 siblings, 0 replies; 4+ messages in thread From: Andy Shevchenko @ 2022-07-27 11:29 UTC (permalink / raw) To: Marcin Wojtas Cc: linux-kernel, linux-acpi, netdev, rafael, sean.wang, Landen.Chao, linus.walleij, andrew, vivien.didelot, f.fainelli, olteanv, davem, edumazet, kuba, pabeni, linux, hkallweit1, gjb, jaz, tn, Samer.El-Haj-Mahmoud, upstream On Wed, Jul 27, 2022 at 08:43:16AM +0200, Marcin Wojtas wrote: > In order to support both DT and ACPI in future, modify the generic DSA > code to use device_/fwnode_ equivalent routines. Drop using port's 'dn' > field and use only fwnode - update all dependent drivers. > > Because support for more generic fwnode is added, replace '_of' suffix > with '_fw' in related routines. No functional change is introduced by > this patch. ... > static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) > { > - struct device_node *phy_handle = NULL; > + struct fwnode_handle *phy_handle = NULL; > struct dsa_switch *ds = chip->ds; > phy_interface_t mode; > struct dsa_port *dp; > @@ -3499,15 +3499,15 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) > > if (chip->info->ops->serdes_set_tx_amplitude) { > if (dp) > - phy_handle = of_parse_phandle(dp->dn, "phy-handle", 0); > + phy_handle = fwnode_find_reference(dp->fwnode, "phy-handle", 0); > > - if (phy_handle && !of_property_read_u32(phy_handle, > - "tx-p2p-microvolt", > - &tx_amp)) > + if (!IS_ERR(phy_handle) && !fwnode_property_read_u32(phy_handle, > + "tx-p2p-microvolt", > + &tx_amp)) > err = chip->info->ops->serdes_set_tx_amplitude(chip, > port, tx_amp); > - if (phy_handle) { > - of_node_put(phy_handle); > + if (!IS_ERR(phy_handle)) { > + fwnode_handle_put(phy_handle); > if (err) > return err; > } I believe after 002752af7b89 ("device property: Allow error pointer to be passed to fwnode APIs") you may simplify above like: if (!fwnode_property_read_u32(phy_handle, "tx-p2p-microvolt", &tx_amp)) err = chip->info->ops->serdes_set_tx_amplitude(chip, port, tx_amp); else err = 0; fwnode_handle_put(phy_handle); if (err) return err; It also possible you can do refactoring before/after this one. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-07-28 8:13 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-07-28 7:22 [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs kernel test robot 2022-07-28 8:13 ` kernel test robot -- strict thread matches above, loose matches on Subject: below -- 2022-07-27 6:43 [net-next: PATCH v3 0/8] DSA: switch to fwnode_/device_ Marcin Wojtas 2022-07-27 6:43 ` [net-next: PATCH v3 3/8] net: dsa: switch to device_/fwnode_ APIs Marcin Wojtas 2022-07-27 11:29 ` Andy Shevchenko
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.