diff options
| -rw-r--r-- | drivers/net/ethernet/rocker/rocker.c | 64 | ||||
| -rw-r--r-- | net/dsa/slave.c | 9 | ||||
| -rw-r--r-- | net/switchdev/switchdev.c | 42 |
3 files changed, 64 insertions, 51 deletions
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c index 223348d8cc07..bc5f27aa3131 100644 --- a/drivers/net/ethernet/rocker/rocker.c +++ b/drivers/net/ethernet/rocker/rocker.c | |||
| @@ -4131,8 +4131,26 @@ static int rocker_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
| 4131 | rocker_port->brport_flags, mask); | 4131 | rocker_port->brport_flags, mask); |
| 4132 | } | 4132 | } |
| 4133 | 4133 | ||
| 4134 | static int rocker_port_switch_parent_id_get(struct net_device *dev, | 4134 | static const struct net_device_ops rocker_port_netdev_ops = { |
| 4135 | struct netdev_phys_item_id *psid) | 4135 | .ndo_open = rocker_port_open, |
| 4136 | .ndo_stop = rocker_port_stop, | ||
| 4137 | .ndo_start_xmit = rocker_port_xmit, | ||
| 4138 | .ndo_set_mac_address = rocker_port_set_mac_address, | ||
| 4139 | .ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid, | ||
| 4140 | .ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid, | ||
| 4141 | .ndo_fdb_add = rocker_port_fdb_add, | ||
| 4142 | .ndo_fdb_del = rocker_port_fdb_del, | ||
| 4143 | .ndo_fdb_dump = rocker_port_fdb_dump, | ||
| 4144 | .ndo_bridge_setlink = rocker_port_bridge_setlink, | ||
| 4145 | .ndo_bridge_getlink = rocker_port_bridge_getlink, | ||
| 4146 | }; | ||
| 4147 | |||
| 4148 | /******************** | ||
| 4149 | * swdev interface | ||
| 4150 | ********************/ | ||
| 4151 | |||
| 4152 | static int rocker_port_swdev_parent_id_get(struct net_device *dev, | ||
| 4153 | struct netdev_phys_item_id *psid) | ||
| 4136 | { | 4154 | { |
| 4137 | struct rocker_port *rocker_port = netdev_priv(dev); | 4155 | struct rocker_port *rocker_port = netdev_priv(dev); |
| 4138 | struct rocker *rocker = rocker_port->rocker; | 4156 | struct rocker *rocker = rocker_port->rocker; |
| @@ -4142,18 +4160,18 @@ static int rocker_port_switch_parent_id_get(struct net_device *dev, | |||
| 4142 | return 0; | 4160 | return 0; |
| 4143 | } | 4161 | } |
| 4144 | 4162 | ||
| 4145 | static int rocker_port_switch_port_stp_update(struct net_device *dev, u8 state) | 4163 | static int rocker_port_swdev_port_stp_update(struct net_device *dev, u8 state) |
| 4146 | { | 4164 | { |
| 4147 | struct rocker_port *rocker_port = netdev_priv(dev); | 4165 | struct rocker_port *rocker_port = netdev_priv(dev); |
| 4148 | 4166 | ||
| 4149 | return rocker_port_stp_update(rocker_port, state); | 4167 | return rocker_port_stp_update(rocker_port, state); |
| 4150 | } | 4168 | } |
| 4151 | 4169 | ||
| 4152 | static int rocker_port_switch_fib_ipv4_add(struct net_device *dev, | 4170 | static int rocker_port_swdev_fib_ipv4_add(struct net_device *dev, |
| 4153 | __be32 dst, int dst_len, | 4171 | __be32 dst, int dst_len, |
| 4154 | struct fib_info *fi, | 4172 | struct fib_info *fi, |
| 4155 | u8 tos, u8 type, | 4173 | u8 tos, u8 type, |
| 4156 | u32 nlflags, u32 tb_id) | 4174 | u32 nlflags, u32 tb_id) |
| 4157 | { | 4175 | { |
| 4158 | struct rocker_port *rocker_port = netdev_priv(dev); | 4176 | struct rocker_port *rocker_port = netdev_priv(dev); |
| 4159 | int flags = 0; | 4177 | int flags = 0; |
| @@ -4162,10 +4180,10 @@ static int rocker_port_switch_fib_ipv4_add(struct net_device *dev, | |||
| 4162 | fi, tb_id, flags); | 4180 | fi, tb_id, flags); |
| 4163 | } | 4181 | } |
| 4164 | 4182 | ||
| 4165 | static int rocker_port_switch_fib_ipv4_del(struct net_device *dev, | 4183 | static int rocker_port_swdev_fib_ipv4_del(struct net_device *dev, |
| 4166 | __be32 dst, int dst_len, | 4184 | __be32 dst, int dst_len, |
| 4167 | struct fib_info *fi, | 4185 | struct fib_info *fi, |
| 4168 | u8 tos, u8 type, u32 tb_id) | 4186 | u8 tos, u8 type, u32 tb_id) |
| 4169 | { | 4187 | { |
| 4170 | struct rocker_port *rocker_port = netdev_priv(dev); | 4188 | struct rocker_port *rocker_port = netdev_priv(dev); |
| 4171 | int flags = ROCKER_OP_FLAG_REMOVE; | 4189 | int flags = ROCKER_OP_FLAG_REMOVE; |
| @@ -4174,22 +4192,11 @@ static int rocker_port_switch_fib_ipv4_del(struct net_device *dev, | |||
| 4174 | fi, tb_id, flags); | 4192 | fi, tb_id, flags); |
| 4175 | } | 4193 | } |
| 4176 | 4194 | ||
| 4177 | static const struct net_device_ops rocker_port_netdev_ops = { | 4195 | static const struct swdev_ops rocker_port_swdev_ops = { |
| 4178 | .ndo_open = rocker_port_open, | 4196 | .swdev_parent_id_get = rocker_port_swdev_parent_id_get, |
| 4179 | .ndo_stop = rocker_port_stop, | 4197 | .swdev_port_stp_update = rocker_port_swdev_port_stp_update, |
| 4180 | .ndo_start_xmit = rocker_port_xmit, | 4198 | .swdev_fib_ipv4_add = rocker_port_swdev_fib_ipv4_add, |
| 4181 | .ndo_set_mac_address = rocker_port_set_mac_address, | 4199 | .swdev_fib_ipv4_del = rocker_port_swdev_fib_ipv4_del, |
| 4182 | .ndo_vlan_rx_add_vid = rocker_port_vlan_rx_add_vid, | ||
| 4183 | .ndo_vlan_rx_kill_vid = rocker_port_vlan_rx_kill_vid, | ||
| 4184 | .ndo_fdb_add = rocker_port_fdb_add, | ||
| 4185 | .ndo_fdb_del = rocker_port_fdb_del, | ||
| 4186 | .ndo_fdb_dump = rocker_port_fdb_dump, | ||
| 4187 | .ndo_bridge_setlink = rocker_port_bridge_setlink, | ||
| 4188 | .ndo_bridge_getlink = rocker_port_bridge_getlink, | ||
| 4189 | .ndo_switch_parent_id_get = rocker_port_switch_parent_id_get, | ||
| 4190 | .ndo_switch_port_stp_update = rocker_port_switch_port_stp_update, | ||
| 4191 | .ndo_switch_fib_ipv4_add = rocker_port_switch_fib_ipv4_add, | ||
| 4192 | .ndo_switch_fib_ipv4_del = rocker_port_switch_fib_ipv4_del, | ||
| 4193 | }; | 4200 | }; |
| 4194 | 4201 | ||
| 4195 | /******************** | 4202 | /******************** |
| @@ -4544,6 +4551,7 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number) | |||
| 4544 | rocker_port_dev_addr_init(rocker, rocker_port); | 4551 | rocker_port_dev_addr_init(rocker, rocker_port); |
| 4545 | dev->netdev_ops = &rocker_port_netdev_ops; | 4552 | dev->netdev_ops = &rocker_port_netdev_ops; |
| 4546 | dev->ethtool_ops = &rocker_port_ethtool_ops; | 4553 | dev->ethtool_ops = &rocker_port_ethtool_ops; |
| 4554 | dev->swdev_ops = &rocker_port_swdev_ops; | ||
| 4547 | netif_napi_add(dev, &rocker_port->napi_tx, rocker_port_poll_tx, | 4555 | netif_napi_add(dev, &rocker_port->napi_tx, rocker_port_poll_tx, |
| 4548 | NAPI_POLL_WEIGHT); | 4556 | NAPI_POLL_WEIGHT); |
| 4549 | netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx, | 4557 | netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx, |
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 6511552039d6..f0af7aa331c1 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/of_net.h> | 16 | #include <linux/of_net.h> |
| 17 | #include <linux/of_mdio.h> | 17 | #include <linux/of_mdio.h> |
| 18 | #include <net/rtnetlink.h> | 18 | #include <net/rtnetlink.h> |
| 19 | #include <net/switchdev.h> | ||
| 19 | #include <linux/if_bridge.h> | 20 | #include <linux/if_bridge.h> |
| 20 | #include "dsa_priv.h" | 21 | #include "dsa_priv.h" |
| 21 | 22 | ||
| @@ -572,8 +573,11 @@ static const struct net_device_ops dsa_slave_netdev_ops = { | |||
| 572 | .ndo_set_rx_mode = dsa_slave_set_rx_mode, | 573 | .ndo_set_rx_mode = dsa_slave_set_rx_mode, |
| 573 | .ndo_set_mac_address = dsa_slave_set_mac_address, | 574 | .ndo_set_mac_address = dsa_slave_set_mac_address, |
| 574 | .ndo_do_ioctl = dsa_slave_ioctl, | 575 | .ndo_do_ioctl = dsa_slave_ioctl, |
| 575 | .ndo_switch_parent_id_get = dsa_slave_parent_id_get, | 576 | }; |
| 576 | .ndo_switch_port_stp_update = dsa_slave_stp_update, | 577 | |
| 578 | static const struct swdev_ops dsa_slave_swdev_ops = { | ||
| 579 | .swdev_parent_id_get = dsa_slave_parent_id_get, | ||
| 580 | .swdev_port_stp_update = dsa_slave_stp_update, | ||
| 577 | }; | 581 | }; |
| 578 | 582 | ||
| 579 | static void dsa_slave_adjust_link(struct net_device *dev) | 583 | static void dsa_slave_adjust_link(struct net_device *dev) |
| @@ -755,6 +759,7 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent, | |||
| 755 | eth_hw_addr_inherit(slave_dev, master); | 759 | eth_hw_addr_inherit(slave_dev, master); |
| 756 | slave_dev->tx_queue_len = 0; | 760 | slave_dev->tx_queue_len = 0; |
| 757 | slave_dev->netdev_ops = &dsa_slave_netdev_ops; | 761 | slave_dev->netdev_ops = &dsa_slave_netdev_ops; |
| 762 | slave_dev->swdev_ops = &dsa_slave_swdev_ops; | ||
| 758 | 763 | ||
| 759 | SET_NETDEV_DEV(slave_dev, parent); | 764 | SET_NETDEV_DEV(slave_dev, parent); |
| 760 | slave_dev->dev.of_node = ds->pd->port_dn[port]; | 765 | slave_dev->dev.of_node = ds->pd->port_dn[port]; |
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index b7a23132c610..c9bfa004abed 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
| @@ -28,11 +28,11 @@ | |||
| 28 | int netdev_switch_parent_id_get(struct net_device *dev, | 28 | int netdev_switch_parent_id_get(struct net_device *dev, |
| 29 | struct netdev_phys_item_id *psid) | 29 | struct netdev_phys_item_id *psid) |
| 30 | { | 30 | { |
| 31 | const struct net_device_ops *ops = dev->netdev_ops; | 31 | const struct swdev_ops *ops = dev->swdev_ops; |
| 32 | 32 | ||
| 33 | if (!ops->ndo_switch_parent_id_get) | 33 | if (!ops || !ops->swdev_parent_id_get) |
| 34 | return -EOPNOTSUPP; | 34 | return -EOPNOTSUPP; |
| 35 | return ops->ndo_switch_parent_id_get(dev, psid); | 35 | return ops->swdev_parent_id_get(dev, psid); |
| 36 | } | 36 | } |
| 37 | EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get); | 37 | EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get); |
| 38 | 38 | ||
| @@ -46,12 +46,12 @@ EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get); | |||
| 46 | */ | 46 | */ |
| 47 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state) | 47 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state) |
| 48 | { | 48 | { |
| 49 | const struct net_device_ops *ops = dev->netdev_ops; | 49 | const struct swdev_ops *ops = dev->swdev_ops; |
| 50 | 50 | ||
| 51 | if (!ops->ndo_switch_port_stp_update) | ||
