Skip to content

Commit

Permalink
switchdev: use new swdev ops
Browse files Browse the repository at this point in the history
Move swdev wrappers over to new swdev ops (from previous ndo ops).  No
functional changes to the implementation.

Signed-off-by: Scott Feldman <sfeldma@gmail.com>

rocker: move to new swdev ops

Signed-off-by: Scott Feldman <sfeldma@gmail.com>

dsa: move to new swdev ops

Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
scottfeldman authored and davem330 committed Mar 16, 2015
1 parent 4170604 commit 98237d4
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 51 deletions.
64 changes: 36 additions & 28 deletions drivers/net/ethernet/rocker/rocker.c
Original file line number Diff line number Diff line change
Expand Up @@ -4131,8 +4131,26 @@ static int rocker_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
rocker_port->brport_flags, mask);
}

static int rocker_port_switch_parent_id_get(struct net_device *dev,
struct netdev_phys_item_id *psid)
static const struct net_device_ops rocker_port_netdev_ops = {
.ndo_open = rocker_port_open,
.ndo_stop = rocker_port_stop,
.ndo_start_xmit = rocker_port_xmit,
.ndo_set_mac_address = rocker_port_set_mac_address,
.ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid,
.ndo_fdb_add = rocker_port_fdb_add,
.ndo_fdb_del = rocker_port_fdb_del,
.ndo_fdb_dump = rocker_port_fdb_dump,
.ndo_bridge_setlink = rocker_port_bridge_setlink,
.ndo_bridge_getlink = rocker_port_bridge_getlink,
};

/********************
* swdev interface
********************/

static int rocker_port_swdev_parent_id_get(struct net_device *dev,
struct netdev_phys_item_id *psid)
{
struct rocker_port *rocker_port = netdev_priv(dev);
struct rocker *rocker = rocker_port->rocker;
Expand All @@ -4142,18 +4160,18 @@ static int rocker_port_switch_parent_id_get(struct net_device *dev,
return 0;
}

static int rocker_port_switch_port_stp_update(struct net_device *dev, u8 state)
static int rocker_port_swdev_port_stp_update(struct net_device *dev, u8 state)
{
struct rocker_port *rocker_port = netdev_priv(dev);

return rocker_port_stp_update(rocker_port, state);
}

static int rocker_port_switch_fib_ipv4_add(struct net_device *dev,
__be32 dst, int dst_len,
struct fib_info *fi,
u8 tos, u8 type,
u32 nlflags, u32 tb_id)
static int rocker_port_swdev_fib_ipv4_add(struct net_device *dev,
__be32 dst, int dst_len,
struct fib_info *fi,
u8 tos, u8 type,
u32 nlflags, u32 tb_id)
{
struct rocker_port *rocker_port = netdev_priv(dev);
int flags = 0;
Expand All @@ -4162,10 +4180,10 @@ static int rocker_port_switch_fib_ipv4_add(struct net_device *dev,
fi, tb_id, flags);
}

static int rocker_port_switch_fib_ipv4_del(struct net_device *dev,
__be32 dst, int dst_len,
struct fib_info *fi,
u8 tos, u8 type, u32 tb_id)
static int rocker_port_swdev_fib_ipv4_del(struct net_device *dev,
__be32 dst, int dst_len,
struct fib_info *fi,
u8 tos, u8 type, u32 tb_id)
{
struct rocker_port *rocker_port = netdev_priv(dev);
int flags = ROCKER_OP_FLAG_REMOVE;
Expand All @@ -4174,22 +4192,11 @@ static int rocker_port_switch_fib_ipv4_del(struct net_device *dev,
fi, tb_id, flags);
}

static const struct net_device_ops rocker_port_netdev_ops = {
.ndo_open = rocker_port_open,
.ndo_stop = rocker_port_stop,
.ndo_start_xmit = rocker_port_xmit,
.ndo_set_mac_address = rocker_port_set_mac_address,
.ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid,
.ndo_fdb_add = rocker_port_fdb_add,
.ndo_fdb_del = rocker_port_fdb_del,
.ndo_fdb_dump = rocker_port_fdb_dump,
.ndo_bridge_setlink = rocker_port_bridge_setlink,
.ndo_bridge_getlink = rocker_port_bridge_getlink,
.ndo_switch_parent_id_get = rocker_port_switch_parent_id_get,
.ndo_switch_port_stp_update = rocker_port_switch_port_stp_update,
.ndo_switch_fib_ipv4_add = rocker_port_switch_fib_ipv4_add,
.ndo_switch_fib_ipv4_del = rocker_port_switch_fib_ipv4_del,
static const struct swdev_ops rocker_port_swdev_ops = {
.swdev_parent_id_get = rocker_port_swdev_parent_id_get,
.swdev_port_stp_update = rocker_port_swdev_port_stp_update,
.swdev_fib_ipv4_add = rocker_port_swdev_fib_ipv4_add,
.swdev_fib_ipv4_del = rocker_port_swdev_fib_ipv4_del,
};

/********************
Expand Down Expand Up @@ -4544,6 +4551,7 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
rocker_port_dev_addr_init(rocker, rocker_port);
dev->netdev_ops = &rocker_port_netdev_ops;
dev->ethtool_ops = &rocker_port_ethtool_ops;
dev->swdev_ops = &rocker_port_swdev_ops;
netif_napi_add(dev, &rocker_port->napi_tx, rocker_port_poll_tx,
NAPI_POLL_WEIGHT);
netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx,
Expand Down
9 changes: 7 additions & 2 deletions net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/of_net.h>
#include <linux/of_mdio.h>
#include <net/rtnetlink.h>
#include <net/switchdev.h>
#include <linux/if_bridge.h>
#include "dsa_priv.h"

Expand Down Expand Up @@ -572,8 +573,11 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
.ndo_set_rx_mode = dsa_slave_set_rx_mode,
.ndo_set_mac_address = dsa_slave_set_mac_address,
.ndo_do_ioctl = dsa_slave_ioctl,
.ndo_switch_parent_id_get = dsa_slave_parent_id_get,
.ndo_switch_port_stp_update = dsa_slave_stp_update,
};

static const struct swdev_ops dsa_slave_swdev_ops = {
.swdev_parent_id_get = dsa_slave_parent_id_get,
.swdev_port_stp_update = dsa_slave_stp_update,
};

static void dsa_slave_adjust_link(struct net_device *dev)
Expand Down Expand Up @@ -755,6 +759,7 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
eth_hw_addr_inherit(slave_dev, master);
slave_dev->tx_queue_len = 0;
slave_dev->netdev_ops = &dsa_slave_netdev_ops;
slave_dev->swdev_ops = &dsa_slave_swdev_ops;

SET_NETDEV_DEV(slave_dev, parent);
slave_dev->dev.of_node = ds->pd->port_dn[port];
Expand Down
42 changes: 21 additions & 21 deletions net/switchdev/switchdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@
int netdev_switch_parent_id_get(struct net_device *dev,
struct netdev_phys_item_id *psid)
{
const struct net_device_ops *ops = dev->netdev_ops;
const struct swdev_ops *ops = dev->swdev_ops;

if (!ops->ndo_switch_parent_id_get)
if (!ops || !ops->swdev_parent_id_get)
return -EOPNOTSUPP;
return ops->ndo_switch_parent_id_get(dev, psid);
return ops->swdev_parent_id_get(dev, psid);
}
EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get);

Expand All @@ -46,12 +46,12 @@ EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get);
*/
int netdev_switch_port_stp_update(struct net_device *dev, u8 state)
{
const struct net_device_ops *ops = dev->netdev_ops;
const struct swdev_ops *ops = dev->swdev_ops;

if (!ops->ndo_switch_port_stp_update)
if (!ops || !ops->swdev_port_stp_update)
return -EOPNOTSUPP;
WARN_ON(!ops->ndo_switch_parent_id_get);
return ops->ndo_switch_port_stp_update(dev, state);
WARN_ON(!ops->swdev_parent_id_get);
return ops->swdev_port_stp_update(dev, state);
}
EXPORT_SYMBOL_GPL(netdev_switch_port_stp_update);

Expand Down Expand Up @@ -230,17 +230,17 @@ EXPORT_SYMBOL_GPL(ndo_dflt_netdev_switch_port_bridge_dellink);

static struct net_device *netdev_switch_get_lowest_dev(struct net_device *dev)
{
const struct net_device_ops *ops = dev->netdev_ops;
const struct swdev_ops *ops = dev->swdev_ops;
struct net_device *lower_dev;
struct net_device *port_dev;
struct list_head *iter;

/* Recusively search down until we find a sw port dev.
* (A sw port dev supports ndo_switch_parent_id_get).
* (A sw port dev supports swdev_parent_id_get).
*/

if (dev->features & NETIF_F_HW_SWITCH_OFFLOAD &&
ops->ndo_switch_parent_id_get)
ops && ops->swdev_parent_id_get)
return dev;

netdev_for_each_lower_dev(dev, lower_dev, iter) {
Expand Down Expand Up @@ -304,7 +304,7 @@ int netdev_switch_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
u8 tos, u8 type, u32 nlflags, u32 tb_id)
{
struct net_device *dev;
const struct net_device_ops *ops;
const struct swdev_ops *ops;
int err = 0;

/* Don't offload route if using custom ip rules or if
Expand All @@ -322,12 +322,12 @@ int netdev_switch_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
dev = netdev_switch_get_dev_by_nhs(fi);
if (!dev)
return 0;
ops = dev->netdev_ops;
ops = dev->swdev_ops;

if (ops->ndo_switch_fib_ipv4_add) {
err = ops->ndo_switch_fib_ipv4_add(dev, htonl(dst), dst_len,
fi, tos, type, nlflags,
tb_id);
if (ops->swdev_fib_ipv4_add) {
err = ops->swdev_fib_ipv4_add(dev, htonl(dst), dst_len,
fi, tos, type, nlflags,
tb_id);
if (!err)
fi->fib_flags |= RTNH_F_EXTERNAL;
}
Expand All @@ -352,7 +352,7 @@ int netdev_switch_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
u8 tos, u8 type, u32 tb_id)
{
struct net_device *dev;
const struct net_device_ops *ops;
const struct swdev_ops *ops;
int err = 0;

if (!(fi->fib_flags & RTNH_F_EXTERNAL))
Expand All @@ -361,11 +361,11 @@ int netdev_switch_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
dev = netdev_switch_get_dev_by_nhs(fi);
if (!dev)
return 0;
ops = dev->netdev_ops;
ops = dev->swdev_ops;

if (ops->ndo_switch_fib_ipv4_del) {
err = ops->ndo_switch_fib_ipv4_del(dev, htonl(dst), dst_len,
fi, tos, type, tb_id);
if (ops->swdev_fib_ipv4_del) {
err = ops->swdev_fib_ipv4_del(dev, htonl(dst), dst_len,
fi, tos, type, tb_id);
if (!err)
fi->fib_flags &= ~RTNH_F_EXTERNAL;
}
Expand Down

0 comments on commit 98237d4

Please sign in to comment.