summaryrefslogtreecommitdiffstats
path: root/net/dsa/dsa2.c
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@gmail.com>2019-08-19 16:00:48 -0400
committerDavid S. Miller <davem@davemloft.net>2019-08-20 15:33:49 -0400
commit955222ca5281ee7ded6b899605c055b147a15c73 (patch)
tree976d4c5e45c6d618865918a19e7ec8851fb89519 /net/dsa/dsa2.c
parentd2187f8e445403b7aeb08e64c1528761154e9ab3 (diff)
net: dsa: use a single switch statement for port setup
It is currently difficult to read the different steps involved in the setup and teardown of ports in the DSA code. Keep it simple with a single switch statement for each port type: UNUSED, CPU, DSA, or USER. Also no need to call devlink_port_unregister from within dsa_port_setup as this step is inconditionally handled by dsa_port_teardown on error. Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/dsa2.c')
-rw-r--r--net/dsa/dsa2.c87
1 files changed, 39 insertions, 48 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 3abd173ebacb..405552ac4c08 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -254,88 +254,79 @@ static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst)
254 254
255static int dsa_port_setup(struct dsa_port *dp) 255static int dsa_port_setup(struct dsa_port *dp)
256{ 256{
257 enum devlink_port_flavour flavour;
258 struct dsa_switch *ds = dp->ds; 257 struct dsa_switch *ds = dp->ds;
259 struct dsa_switch_tree *dst = ds->dst; 258 struct dsa_switch_tree *dst = ds->dst;
260 int err = 0; 259 const unsigned char *id = (const unsigned char *)&dst->index;
261 260 const unsigned char len = sizeof(dst->index);
262 if (dp->type == DSA_PORT_TYPE_UNUSED) 261 struct devlink_port *dlp = &dp->devlink_port;
263 return 0; 262 struct devlink *dl = ds->devlink;
264 263 int err;
265 memset(&dp->devlink_port, 0, sizeof(dp->devlink_port));
266 dp->mac = of_get_mac_address(dp->dn);
267
268 switch (dp->type) {
269 case DSA_PORT_TYPE_CPU:
270 flavour = DEVLINK_PORT_FLAVOUR_CPU;
271 break;
272 case DSA_PORT_TYPE_DSA:
273 flavour = DEVLINK_PORT_FLAVOUR_DSA;
274 break;
275 case DSA_PORT_TYPE_USER: /* fall-through */
276 default:
277 flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
278 break;
279 }
280
281 /* dp->index is used now as port_number. However
282 * CPU and DSA ports should have separate numbering
283 * independent from front panel port numbers.
284 */
285 devlink_port_attrs_set(&dp->devlink_port, flavour,
286 dp->index, false, 0,
287 (const char *) &dst->index, sizeof(dst->index));
288 err = devlink_port_register(ds->devlink, &dp->devlink_port,
289 dp->index);
290 if (err)
291 return err;
292 264
293 switch (dp->type) { 265 switch (dp->type) {
294 case DSA_PORT_TYPE_UNUSED: 266 case DSA_PORT_TYPE_UNUSED:
295 break; 267 break;
296 case DSA_PORT_TYPE_CPU: 268 case DSA_PORT_TYPE_CPU:
269 memset(dlp, 0, sizeof(*dlp));
270 devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_CPU,
271 dp->index, false, 0, id, len);
272 err = devlink_port_register(dl, dlp, dp->index);
273 if (err)
274 return err;
275
297 err = dsa_port_link_register_of(dp); 276 err = dsa_port_link_register_of(dp);
298 if (err) 277 if (err)
299 dev_err(ds->dev, "failed to setup link for port %d.%d\n", 278 return err;
300 ds->index, dp->index);
301 break; 279 break;
302 case DSA_PORT_TYPE_DSA: 280 case DSA_PORT_TYPE_DSA:
281 memset(dlp, 0, sizeof(*dlp));
282 devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_DSA,
283 dp->index, false, 0, id, len);
284 err = devlink_port_register(dl, dlp, dp->index);
285 if (err)
286 return err;
287
303 err = dsa_port_link_register_of(dp); 288 err = dsa_port_link_register_of(dp);
304 if (err) 289 if (err)
305 dev_err(ds->dev, "failed to setup link for port %d.%d\n", 290 return err;
306 ds->index, dp->index);
307 break; 291 break;
308 case DSA_PORT_TYPE_USER: 292 case DSA_PORT_TYPE_USER:
293 memset(dlp, 0, sizeof(*dlp));
294 devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_PHYSICAL,
295 dp->index, false, 0, id, len);
296 err = devlink_port_register(dl, dlp, dp->index);
297 if (err)
298 return err;
299
300 dp->mac = of_get_mac_address(dp->dn);
309 err = dsa_slave_create(dp); 301 err = dsa_slave_create(dp);
310 if (err) 302 if (err)
311 dev_err(ds->dev, "failed to create slave for port %d.%d\n", 303 return err;
312 ds->index, dp->index); 304
313 else 305 devlink_port_type_eth_set(dlp, dp->slave);
314 devlink_port_type_eth_set(&dp->devlink_port, dp->slave);
315 break; 306 break;
316 } 307 }
317 308
318 if (err) 309 return 0;
319 devlink_port_unregister(&dp->devlink_port);
320
321 return err;
322} 310}
323 311
324static void dsa_port_teardown(struct dsa_port *dp) 312static void dsa_port_teardown(struct dsa_port *dp)
325{ 313{
326 if (dp->type != DSA_PORT_TYPE_UNUSED) 314 struct devlink_port *dlp = &dp->devlink_port;
327 devlink_port_unregister(&dp->devlink_port);
328 315
329 switch (dp->type) { 316 switch (dp->type) {
330 case DSA_PORT_TYPE_UNUSED: 317 case DSA_PORT_TYPE_UNUSED:
331 break; 318 break;
332 case DSA_PORT_TYPE_CPU: 319 case DSA_PORT_TYPE_CPU:
333 dsa_tag_driver_put(dp->tag_ops); 320 dsa_tag_driver_put(dp->tag_ops);
334 /* fall-through */ 321 devlink_port_unregister(dlp);
322 dsa_port_link_unregister_of(dp);
323 break;
335 case DSA_PORT_TYPE_DSA: 324 case DSA_PORT_TYPE_DSA:
325 devlink_port_unregister(dlp);
336 dsa_port_link_unregister_of(dp); 326 dsa_port_link_unregister_of(dp);
337 break; 327 break;
338 case DSA_PORT_TYPE_USER: 328 case DSA_PORT_TYPE_USER:
329 devlink_port_unregister(dlp);
339 if (dp->slave) { 330 if (dp->slave) {
340 dsa_slave_destroy(dp->slave); 331 dsa_slave_destroy(dp->slave);
341 dp->slave = NULL; 332 dp->slave = NULL;