Skip to content

Commit

Permalink
net: dsa: move port state setters
Browse files Browse the repository at this point in the history
Add a new port.c file to hold all DSA port-wide logic. This patch moves
in the code which sets a port state.

Signed-off-by: Vivien Didelot <[email protected]>
Reviewed-by: Florian Fainelli <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
vivien authored and davem330 committed May 22, 2017
1 parent 072bb19 commit a40c175
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 41 deletions.
2 changes: 1 addition & 1 deletion net/dsa/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# the core
obj-$(CONFIG_NET_DSA) += dsa_core.o
dsa_core-y += dsa.o slave.o dsa2.o switch.o legacy.o
dsa_core-y += dsa.o dsa2.o legacy.o port.o slave.o switch.o

# tagging formats
dsa_core-$(CONFIG_NET_DSA_TAG_BRCM) += tag_brcm.o
Expand Down
5 changes: 5 additions & 0 deletions net/dsa/dsa_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds);
int dsa_legacy_register(void);
void dsa_legacy_unregister(void);

/* port.c */
int dsa_port_set_state(struct dsa_port *dp, u8 state,
struct switchdev_trans *trans);
void dsa_port_set_state_now(struct dsa_port *dp, u8 state);

/* slave.c */
extern const struct dsa_device_ops notag_netdev_ops;
void dsa_slave_mii_bus_init(struct dsa_switch *ds);
Expand Down
55 changes: 55 additions & 0 deletions net/dsa/port.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Handling of a single switch port
*
* Copyright (c) 2017 Savoir-faire Linux Inc.
* Vivien Didelot <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/

#include <linux/if_bridge.h>

#include "dsa_priv.h"

int dsa_port_set_state(struct dsa_port *dp, u8 state,
struct switchdev_trans *trans)
{
struct dsa_switch *ds = dp->ds;
int port = dp->index;

if (switchdev_trans_ph_prepare(trans))
return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP;

if (ds->ops->port_stp_state_set)
ds->ops->port_stp_state_set(ds, port, state);

if (ds->ops->port_fast_age) {
/* Fast age FDB entries or flush appropriate forwarding database
* for the given port, if we are moving it from Learning or
* Forwarding state, to Disabled or Blocking or Listening state.
*/

if ((dp->stp_state == BR_STATE_LEARNING ||
dp->stp_state == BR_STATE_FORWARDING) &&
(state == BR_STATE_DISABLED ||
state == BR_STATE_BLOCKING ||
state == BR_STATE_LISTENING))
ds->ops->port_fast_age(ds, port);
}

dp->stp_state = state;

return 0;
}

void dsa_port_set_state_now(struct dsa_port *dp, u8 state)
{
int err;

err = dsa_port_set_state(dp, state, NULL);
if (err)
pr_err("DSA: failed to set STP state %u (%d)\n", state, err);
}
40 changes: 0 additions & 40 deletions net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,46 +84,6 @@ static inline bool dsa_port_is_bridged(struct dsa_port *dp)
return !!dp->bridge_dev;
}

static int dsa_port_set_state(struct dsa_port *dp, u8 state,
struct switchdev_trans *trans)
{
struct dsa_switch *ds = dp->ds;
int port = dp->index;

if (switchdev_trans_ph_prepare(trans))
return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP;

if (ds->ops->port_stp_state_set)
ds->ops->port_stp_state_set(ds, port, state);

if (ds->ops->port_fast_age) {
/* Fast age FDB entries or flush appropriate forwarding database
* for the given port, if we are moving it from Learning or
* Forwarding state, to Disabled or Blocking or Listening state.
*/

if ((dp->stp_state == BR_STATE_LEARNING ||
dp->stp_state == BR_STATE_FORWARDING) &&
(state == BR_STATE_DISABLED ||
state == BR_STATE_BLOCKING ||
state == BR_STATE_LISTENING))
ds->ops->port_fast_age(ds, port);
}

dp->stp_state = state;

return 0;
}

static void dsa_port_set_state_now(struct dsa_port *dp, u8 state)
{
int err;

err = dsa_port_set_state(dp, state, NULL);
if (err)
pr_err("DSA: failed to set STP state %u (%d)\n", state, err);
}

static int dsa_slave_open(struct net_device *dev)
{
struct dsa_slave_priv *p = netdev_priv(dev);
Expand Down

0 comments on commit a40c175

Please sign in to comment.