]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - net/dsa/slave.c
net: dsa: add slave notify helper
[mirror_ubuntu-hirsute-kernel.git] / net / dsa / slave.c
CommitLineData
91da11f8
LB
1/*
2 * net/dsa/slave.c - Slave device handling
e84665c9 3 * Copyright (c) 2008-2009 Marvell Semiconductor
91da11f8
LB
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 */
10
11#include <linux/list.h>
df02c6ff 12#include <linux/etherdevice.h>
b73adef6 13#include <linux/netdevice.h>
91da11f8 14#include <linux/phy.h>
a2820543 15#include <linux/phy_fixed.h>
0d8bcdd3
FF
16#include <linux/of_net.h>
17#include <linux/of_mdio.h>
7f854420 18#include <linux/mdio.h>
f50f2127 19#include <linux/list.h>
b73adef6 20#include <net/rtnetlink.h>
f50f2127
FF
21#include <net/pkt_cls.h>
22#include <net/tc_act/tc_mirred.h>
b73adef6 23#include <linux/if_bridge.h>
04ff53f9 24#include <linux/netpoll.h>
ea5dd34b 25
91da11f8
LB
26#include "dsa_priv.h"
27
f50f2127
FF
28static bool dsa_slave_dev_check(struct net_device *dev);
29
91da11f8
LB
30/* slave mii_bus handling ***************************************************/
31static int dsa_slave_phy_read(struct mii_bus *bus, int addr, int reg)
32{
33 struct dsa_switch *ds = bus->priv;
34
0d8bcdd3 35 if (ds->phys_mii_mask & (1 << addr))
9d490b4e 36 return ds->ops->phy_read(ds, addr, reg);
91da11f8
LB
37
38 return 0xffff;
39}
40
41static int dsa_slave_phy_write(struct mii_bus *bus, int addr, int reg, u16 val)
42{
43 struct dsa_switch *ds = bus->priv;
44
0d8bcdd3 45 if (ds->phys_mii_mask & (1 << addr))
9d490b4e 46 return ds->ops->phy_write(ds, addr, reg, val);
91da11f8
LB
47
48 return 0;
49}
50
51void dsa_slave_mii_bus_init(struct dsa_switch *ds)
52{
53 ds->slave_mii_bus->priv = (void *)ds;
54 ds->slave_mii_bus->name = "dsa slave smi";
55 ds->slave_mii_bus->read = dsa_slave_phy_read;
56 ds->slave_mii_bus->write = dsa_slave_phy_write;
0b7b498d
FF
57 snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
58 ds->dst->tree, ds->index);
c33063d6 59 ds->slave_mii_bus->parent = ds->dev;
24df8986 60 ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
91da11f8
LB
61}
62
63
64/* slave device handling ****************************************************/
abd2be00 65static int dsa_slave_get_iflink(const struct net_device *dev)
c0840801
LB
66{
67 struct dsa_slave_priv *p = netdev_priv(dev);
c0840801 68
6d3c8c0d 69 return dsa_master_netdev(p)->ifindex;
c0840801
LB
70}
71
91da11f8
LB
72static int dsa_slave_open(struct net_device *dev)
73{
df02c6ff 74 struct dsa_slave_priv *p = netdev_priv(dev);
f3d736c4 75 struct dsa_port *dp = p->dp;
6d3c8c0d 76 struct net_device *master = dsa_master_netdev(p);
df02c6ff
LB
77 int err;
78
79 if (!(master->flags & IFF_UP))
80 return -ENETDOWN;
81
8feedbb4 82 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
a748ee24 83 err = dev_uc_add(master, dev->dev_addr);
df02c6ff
LB
84 if (err < 0)
85 goto out;
86 }
87
88 if (dev->flags & IFF_ALLMULTI) {
89 err = dev_set_allmulti(master, 1);
90 if (err < 0)
91 goto del_unicast;
92 }
93 if (dev->flags & IFF_PROMISC) {
94 err = dev_set_promiscuity(master, 1);
95 if (err < 0)
96 goto clear_allmulti;
97 }
98
0115dcd1 99 err = dsa_port_enable(dp, dev->phydev);
fb8a6a2b
VD
100 if (err)
101 goto clear_promisc;
b73adef6 102
0115dcd1
VD
103 if (dev->phydev)
104 phy_start(dev->phydev);
f7f1de51 105
91da11f8 106 return 0;
df02c6ff 107
b2f2af21
FF
108clear_promisc:
109 if (dev->flags & IFF_PROMISC)
4fdeddfe 110 dev_set_promiscuity(master, -1);
df02c6ff
LB
111clear_allmulti:
112 if (dev->flags & IFF_ALLMULTI)
113 dev_set_allmulti(master, -1);
114del_unicast:
8feedbb4 115 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
a748ee24 116 dev_uc_del(master, dev->dev_addr);
df02c6ff
LB
117out:
118 return err;
91da11f8
LB
119}
120
121static int dsa_slave_close(struct net_device *dev)
122{
df02c6ff 123 struct dsa_slave_priv *p = netdev_priv(dev);
6d3c8c0d 124 struct net_device *master = dsa_master_netdev(p);
fb8a6a2b 125 struct dsa_port *dp = p->dp;
df02c6ff 126
0115dcd1
VD
127 if (dev->phydev)
128 phy_stop(dev->phydev);
f7f1de51 129
0115dcd1 130 dsa_port_disable(dp, dev->phydev);
6457edfe 131
df02c6ff 132 dev_mc_unsync(master, dev);
a748ee24 133 dev_uc_unsync(master, dev);
df02c6ff
LB
134 if (dev->flags & IFF_ALLMULTI)
135 dev_set_allmulti(master, -1);
136 if (dev->flags & IFF_PROMISC)
137 dev_set_promiscuity(master, -1);
138
8feedbb4 139 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
a748ee24 140 dev_uc_del(master, dev->dev_addr);
df02c6ff 141
91da11f8
LB
142 return 0;
143}
144
145static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
146{
147 struct dsa_slave_priv *p = netdev_priv(dev);
6d3c8c0d 148 struct net_device *master = dsa_master_netdev(p);
91da11f8
LB
149
150 if (change & IFF_ALLMULTI)
151 dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
152 if (change & IFF_PROMISC)
153 dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
154}
155
156static void dsa_slave_set_rx_mode(struct net_device *dev)
157{
158 struct dsa_slave_priv *p = netdev_priv(dev);
6d3c8c0d 159 struct net_device *master = dsa_master_netdev(p);
91da11f8
LB
160
161 dev_mc_sync(master, dev);
a748ee24 162 dev_uc_sync(master, dev);
91da11f8
LB
163}
164
df02c6ff 165static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
91da11f8 166{
df02c6ff 167 struct dsa_slave_priv *p = netdev_priv(dev);
6d3c8c0d 168 struct net_device *master = dsa_master_netdev(p);
df02c6ff
LB
169 struct sockaddr *addr = a;
170 int err;
171
172 if (!is_valid_ether_addr(addr->sa_data))
173 return -EADDRNOTAVAIL;
174
175 if (!(dev->flags & IFF_UP))
176 goto out;
177
8feedbb4 178 if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
a748ee24 179 err = dev_uc_add(master, addr->sa_data);
df02c6ff
LB
180 if (err < 0)
181 return err;
182 }
183
8feedbb4 184 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
a748ee24 185 dev_uc_del(master, dev->dev_addr);
df02c6ff
LB
186
187out:
d08f161a 188 ether_addr_copy(dev->dev_addr, addr->sa_data);
91da11f8
LB
189
190 return 0;
191}
192
2bedde1a
AS
193struct dsa_slave_dump_ctx {
194 struct net_device *dev;
195 struct sk_buff *skb;
196 struct netlink_callback *cb;
197 int idx;
198};
199
200static int
201dsa_slave_port_fdb_do_dump(const unsigned char *addr, u16 vid,
202 bool is_static, void *data)
203{
204 struct dsa_slave_dump_ctx *dump = data;
205 u32 portid = NETLINK_CB(dump->cb->skb).portid;
206 u32 seq = dump->cb->nlh->nlmsg_seq;
207 struct nlmsghdr *nlh;
208 struct ndmsg *ndm;
209
210 if (dump->idx < dump->cb->args[2])
211 goto skip;
212
213 nlh = nlmsg_put(dump->skb, portid, seq, RTM_NEWNEIGH,
214 sizeof(*ndm), NLM_F_MULTI);
215 if (!nlh)
216 return -EMSGSIZE;
217
218 ndm = nlmsg_data(nlh);
219 ndm->ndm_family = AF_BRIDGE;
220 ndm->ndm_pad1 = 0;
221 ndm->ndm_pad2 = 0;
222 ndm->ndm_flags = NTF_SELF;
223 ndm->ndm_type = 0;
224 ndm->ndm_ifindex = dump->dev->ifindex;
225 ndm->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;
226
227 if (nla_put(dump->skb, NDA_LLADDR, ETH_ALEN, addr))
228 goto nla_put_failure;
229
230 if (vid && nla_put_u16(dump->skb, NDA_VLAN, vid))
231 goto nla_put_failure;
232
233 nlmsg_end(dump->skb, nlh);
234
235skip:
236 dump->idx++;
237 return 0;
238
239nla_put_failure:
240 nlmsg_cancel(dump->skb, nlh);
241 return -EMSGSIZE;
242}
243
244static int
245dsa_slave_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
246 struct net_device *dev, struct net_device *filter_dev,
247 int *idx)
248{
249 struct dsa_slave_dump_ctx dump = {
250 .dev = dev,
251 .skb = skb,
252 .cb = cb,
253 .idx = *idx,
254 };
255 struct dsa_slave_priv *p = netdev_priv(dev);
256 struct dsa_port *dp = p->dp;
2bedde1a
AS
257 int err;
258
de40fc5d 259 err = dsa_port_fdb_dump(dp, dsa_slave_port_fdb_do_dump, &dump);
2bedde1a 260 *idx = dump.idx;
de40fc5d 261
2bedde1a
AS
262 return err;
263}
264
91da11f8
LB
265static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
266{
0115dcd1 267 if (!dev->phydev)
f4344e0a 268 return -ENODEV;
91da11f8 269
0115dcd1 270 return phy_mii_ioctl(dev->phydev, ifr, cmd);
91da11f8
LB
271}
272
35636062 273static int dsa_slave_port_attr_set(struct net_device *dev,
f7fadf30 274 const struct switchdev_attr *attr,
7ea6eb3f 275 struct switchdev_trans *trans)
35636062 276{
fd364541
VD
277 struct dsa_slave_priv *p = netdev_priv(dev);
278 struct dsa_port *dp = p->dp;
b8d866ac 279 int ret;
35636062
SF
280
281 switch (attr->id) {
1f868398 282 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
fd364541 283 ret = dsa_port_set_state(dp, attr->u.stp_state, trans);
35636062 284 break;
fb2dabad 285 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
c02c4175
VD
286 ret = dsa_port_vlan_filtering(dp, attr->u.vlan_filtering,
287 trans);
fb2dabad 288 break;
34a79f63 289 case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
072bb190 290 ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans);
34a79f63 291 break;
35636062
SF
292 default:
293 ret = -EOPNOTSUPP;
294 break;
295 }
296
297 return ret;
298}
299
ba14d9eb 300static int dsa_slave_port_obj_add(struct net_device *dev,
648b4a99 301 const struct switchdev_obj *obj,
7ea6eb3f 302 struct switchdev_trans *trans)
ba14d9eb 303{
3fdb023b
VD
304 struct dsa_slave_priv *p = netdev_priv(dev);
305 struct dsa_port *dp = p->dp;
ba14d9eb
VD
306 int err;
307
308 /* For the prepare phase, ensure the full set of changes is feasable in
309 * one go in order to signal a failure properly. If an operation is not
310 * supported, return -EOPNOTSUPP.
311 */
312
9e8f4a54 313 switch (obj->id) {
8df30255 314 case SWITCHDEV_OBJ_ID_PORT_MDB:
bcebb976 315 err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj), trans);
8df30255 316 break;
57d80838 317 case SWITCHDEV_OBJ_ID_PORT_VLAN:
01676d12
VD
318 err = dsa_port_vlan_add(dp, SWITCHDEV_OBJ_PORT_VLAN(obj),
319 trans);
11149536 320 break;
ba14d9eb
VD
321 default:
322 err = -EOPNOTSUPP;
323 break;
324 }
325
326 return err;
327}
328
329static int dsa_slave_port_obj_del(struct net_device *dev,
648b4a99 330 const struct switchdev_obj *obj)
ba14d9eb 331{
3fdb023b
VD
332 struct dsa_slave_priv *p = netdev_priv(dev);
333 struct dsa_port *dp = p->dp;
ba14d9eb
VD
334 int err;
335
9e8f4a54 336 switch (obj->id) {
8df30255 337 case SWITCHDEV_OBJ_ID_PORT_MDB:
bcebb976 338 err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
8df30255 339 break;
57d80838 340 case SWITCHDEV_OBJ_ID_PORT_VLAN:
01676d12 341 err = dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj));
11149536 342 break;
ba14d9eb
VD
343 default:
344 err = -EOPNOTSUPP;
345 break;
346 }
347
348 return err;
349}
350
f8e20a9f
SF
351static int dsa_slave_port_attr_get(struct net_device *dev,
352 struct switchdev_attr *attr)
b73adef6
FF
353{
354 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 355 struct dsa_switch *ds = p->dp->ds;
b73adef6 356
f8e20a9f 357 switch (attr->id) {
1f868398 358 case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
42275bd8
SF
359 attr->u.ppid.id_len = sizeof(ds->index);
360 memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
f8e20a9f 361 break;
c9e2105e
AS
362 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT:
363 attr->u.brport_flags_support = 0;
364 break;
f8e20a9f
SF
365 default:
366 return -EOPNOTSUPP;
367 }
b73adef6
FF
368
369 return 0;
370}
371
4fa7b718
VD
372static inline netdev_tx_t dsa_slave_netpoll_send_skb(struct net_device *dev,
373 struct sk_buff *skb)
04ff53f9
FF
374{
375#ifdef CONFIG_NET_POLL_CONTROLLER
4fa7b718
VD
376 struct dsa_slave_priv *p = netdev_priv(dev);
377
04ff53f9
FF
378 if (p->netpoll)
379 netpoll_send_skb(p->netpoll, skb);
380#else
381 BUG();
382#endif
383 return NETDEV_TX_OK;
384}
385
3e8a72d1
FF
386static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
387{
388 struct dsa_slave_priv *p = netdev_priv(dev);
5f6b4e14 389 struct pcpu_sw_netstats *s;
4ed70ce9 390 struct sk_buff *nskb;
3e8a72d1 391
5f6b4e14
FF
392 s = this_cpu_ptr(p->stats64);
393 u64_stats_update_begin(&s->syncp);
394 s->tx_packets++;
395 s->tx_bytes += skb->len;
396 u64_stats_update_end(&s->syncp);
3e8a72d1 397
fe47d563
VD
398 /* Transmit function may have to reallocate the original SKB,
399 * in which case it must have freed it. Only free it here on error.
400 */
4ed70ce9 401 nskb = p->xmit(skb, dev);
fe47d563
VD
402 if (!nskb) {
403 kfree_skb(skb);
4ed70ce9 404 return NETDEV_TX_OK;
fe47d563 405 }
5aed85ce 406
04ff53f9
FF
407 /* SKB for netpoll still need to be mangled with the protocol-specific
408 * tag to be successfully transmitted
409 */
410 if (unlikely(netpoll_tx_running(dev)))
4fa7b718 411 return dsa_slave_netpoll_send_skb(dev, nskb);
04ff53f9 412
4ed70ce9
FF
413 /* Queue the SKB for transmission on the parent interface, but
414 * do not modify its EtherType
415 */
6d3c8c0d 416 nskb->dev = dsa_master_netdev(p);
4ed70ce9 417 dev_queue_xmit(nskb);
5aed85ce
FF
418
419 return NETDEV_TX_OK;
420}
421
91da11f8 422/* ethtool operations *******************************************************/
91da11f8 423
91da11f8
LB
424static void dsa_slave_get_drvinfo(struct net_device *dev,
425 struct ethtool_drvinfo *drvinfo)
426{
7826d43f 427 strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver));
7826d43f
JP
428 strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
429 strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
91da11f8
LB
430}
431
3d762a0f
GR
432static int dsa_slave_get_regs_len(struct net_device *dev)
433{
434 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 435 struct dsa_switch *ds = p->dp->ds;
3d762a0f 436
9d490b4e 437 if (ds->ops->get_regs_len)
afdcf151 438 return ds->ops->get_regs_len(ds, p->dp->index);
3d762a0f
GR
439
440 return -EOPNOTSUPP;
441}
442
443static void
444dsa_slave_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
445{
446 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 447 struct dsa_switch *ds = p->dp->ds;
3d762a0f 448
9d490b4e 449 if (ds->ops->get_regs)
afdcf151 450 ds->ops->get_regs(ds, p->dp->index, regs, _p);
3d762a0f
GR
451}
452
91da11f8
LB
453static u32 dsa_slave_get_link(struct net_device *dev)
454{
0115dcd1 455 if (!dev->phydev)
f4344e0a 456 return -ENODEV;
91da11f8 457
0115dcd1 458 genphy_update_link(dev->phydev);
f4344e0a 459
0115dcd1 460 return dev->phydev->link;
91da11f8
LB
461}
462
6793abb4
GR
463static int dsa_slave_get_eeprom_len(struct net_device *dev)
464{
465 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 466 struct dsa_switch *ds = p->dp->ds;
6793abb4 467
0e576044 468 if (ds->cd && ds->cd->eeprom_len)
ff04955c 469 return ds->cd->eeprom_len;
6793abb4 470
9d490b4e
VD
471 if (ds->ops->get_eeprom_len)
472 return ds->ops->get_eeprom_len(ds);
6793abb4
GR
473
474 return 0;
475}
476
477static int dsa_slave_get_eeprom(struct net_device *dev,
478 struct ethtool_eeprom *eeprom, u8 *data)
479{
480 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 481 struct dsa_switch *ds = p->dp->ds;
6793abb4 482
9d490b4e
VD
483 if (ds->ops->get_eeprom)
484 return ds->ops->get_eeprom(ds, eeprom, data);
6793abb4
GR
485
486 return -EOPNOTSUPP;
487}
488
489static int dsa_slave_set_eeprom(struct net_device *dev,
490 struct ethtool_eeprom *eeprom, u8 *data)
491{
492 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 493 struct dsa_switch *ds = p->dp->ds;
6793abb4 494
9d490b4e
VD
495 if (ds->ops->set_eeprom)
496 return ds->ops->set_eeprom(ds, eeprom, data);
6793abb4
GR
497
498 return -EOPNOTSUPP;
499}
500
91da11f8
LB
501static void dsa_slave_get_strings(struct net_device *dev,
502 uint32_t stringset, uint8_t *data)
503{
504 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 505 struct dsa_switch *ds = p->dp->ds;
91da11f8
LB
506
507 if (stringset == ETH_SS_STATS) {
508 int len = ETH_GSTRING_LEN;
509
510 strncpy(data, "tx_packets", len);
511 strncpy(data + len, "tx_bytes", len);
512 strncpy(data + 2 * len, "rx_packets", len);
513 strncpy(data + 3 * len, "rx_bytes", len);
9d490b4e 514 if (ds->ops->get_strings)
afdcf151 515 ds->ops->get_strings(ds, p->dp->index, data + 4 * len);
91da11f8
LB
516 }
517}
518
519static void dsa_slave_get_ethtool_stats(struct net_device *dev,
520 struct ethtool_stats *stats,
521 uint64_t *data)
522{
523 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 524 struct dsa_switch *ds = p->dp->ds;
5f6b4e14 525 struct pcpu_sw_netstats *s;
f613ed66 526 unsigned int start;
5f6b4e14
FF
527 int i;
528
529 for_each_possible_cpu(i) {
530 u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
531
532 s = per_cpu_ptr(p->stats64, i);
533 do {
534 start = u64_stats_fetch_begin_irq(&s->syncp);
535 tx_packets = s->tx_packets;
536 tx_bytes = s->tx_bytes;
537 rx_packets = s->rx_packets;
538 rx_bytes = s->rx_bytes;
539 } while (u64_stats_fetch_retry_irq(&s->syncp, start));
540 data[0] += tx_packets;
541 data[1] += tx_bytes;
542 data[2] += rx_packets;
543 data[3] += rx_bytes;
544 }
9d490b4e 545 if (ds->ops->get_ethtool_stats)
afdcf151 546 ds->ops->get_ethtool_stats(ds, p->dp->index, data + 4);
91da11f8
LB
547}
548
549static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
550{
551 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 552 struct dsa_switch *ds = p->dp->ds;
91da11f8
LB
553
554 if (sset == ETH_SS_STATS) {
555 int count;
556
557 count = 4;
9d490b4e
VD
558 if (ds->ops->get_sset_count)
559 count += ds->ops->get_sset_count(ds);
91da11f8
LB
560
561 return count;
562 }
563
564 return -EOPNOTSUPP;
565}
566
19e57c4e
FF
567static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
568{
569 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 570 struct dsa_switch *ds = p->dp->ds;
19e57c4e 571
9d490b4e 572 if (ds->ops->get_wol)
afdcf151 573 ds->ops->get_wol(ds, p->dp->index, w);
19e57c4e
FF
574}
575
576static int dsa_slave_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
577{
578 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 579 struct dsa_switch *ds = p->dp->ds;
19e57c4e
FF
580 int ret = -EOPNOTSUPP;
581
9d490b4e 582 if (ds->ops->set_wol)
afdcf151 583 ret = ds->ops->set_wol(ds, p->dp->index, w);
19e57c4e
FF
584
585 return ret;
586}
587
7905288f
FF
588static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
589{
590 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 591 struct dsa_switch *ds = p->dp->ds;
7905288f
FF
592 int ret;
593
7b9cc738 594 /* Port's PHY and MAC both need to be EEE capable */
0115dcd1 595 if (!dev->phydev)
7b9cc738
VD
596 return -ENODEV;
597
08f50061 598 if (!ds->ops->set_mac_eee)
7905288f
FF
599 return -EOPNOTSUPP;
600
08f50061 601 ret = ds->ops->set_mac_eee(ds, p->dp->index, e);
7905288f
FF
602 if (ret)
603 return ret;
604
c48f7eb3 605 if (e->eee_enabled) {
0115dcd1 606 ret = phy_init_eee(dev->phydev, 0);
c48f7eb3
VD
607 if (ret)
608 return ret;
609 }
610
0115dcd1 611 return phy_ethtool_set_eee(dev->phydev, e);
7905288f
FF
612}
613
614static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
615{
616 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 617 struct dsa_switch *ds = p->dp->ds;
7905288f
FF
618 int ret;
619
7b9cc738 620 /* Port's PHY and MAC both need to be EEE capable */
0115dcd1 621 if (!dev->phydev)
7b9cc738
VD
622 return -ENODEV;
623
08f50061 624 if (!ds->ops->get_mac_eee)
7905288f
FF
625 return -EOPNOTSUPP;
626
08f50061 627 ret = ds->ops->get_mac_eee(ds, p->dp->index, e);
7905288f
FF
628 if (ret)
629 return ret;
630
0115dcd1 631 return phy_ethtool_get_eee(dev->phydev, e);
7905288f
FF
632}
633
04ff53f9
FF
634#ifdef CONFIG_NET_POLL_CONTROLLER
635static int dsa_slave_netpoll_setup(struct net_device *dev,
636 struct netpoll_info *ni)
637{
638 struct dsa_slave_priv *p = netdev_priv(dev);
6d3c8c0d 639 struct net_device *master = dsa_master_netdev(p);
04ff53f9
FF
640 struct netpoll *netpoll;
641 int err = 0;
642
643 netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
644 if (!netpoll)
645 return -ENOMEM;
646
647 err = __netpoll_setup(netpoll, master);
648 if (err) {
649 kfree(netpoll);
650 goto out;
651 }
652
653 p->netpoll = netpoll;
654out:
655 return err;
656}
657
658static void dsa_slave_netpoll_cleanup(struct net_device *dev)
659{
660 struct dsa_slave_priv *p = netdev_priv(dev);
661 struct netpoll *netpoll = p->netpoll;
662
663 if (!netpoll)
664 return;
665
666 p->netpoll = NULL;
667
668 __netpoll_free_async(netpoll);
669}
670
671static void dsa_slave_poll_controller(struct net_device *dev)
672{
673}
674#endif
675
44bb765c
FF
676static int dsa_slave_get_phys_port_name(struct net_device *dev,
677 char *name, size_t len)
678{
679 struct dsa_slave_priv *p = netdev_priv(dev);
680
afdcf151 681 if (snprintf(name, len, "p%d", p->dp->index) >= len)
44bb765c 682 return -EINVAL;
3a543ef4
FF
683
684 return 0;
685}
686
f50f2127 687static struct dsa_mall_tc_entry *
4fa7b718 688dsa_slave_mall_tc_entry_find(struct net_device *dev, unsigned long cookie)
f50f2127 689{
4fa7b718 690 struct dsa_slave_priv *p = netdev_priv(dev);
f50f2127
FF
691 struct dsa_mall_tc_entry *mall_tc_entry;
692
693 list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list)
694 if (mall_tc_entry->cookie == cookie)
695 return mall_tc_entry;
696
697 return NULL;
698}
699
700static int dsa_slave_add_cls_matchall(struct net_device *dev,
f50f2127
FF
701 struct tc_cls_matchall_offload *cls,
702 bool ingress)
703{
704 struct dsa_slave_priv *p = netdev_priv(dev);
705 struct dsa_mall_tc_entry *mall_tc_entry;
5fd9fc4e 706 __be16 protocol = cls->common.protocol;
f50f2127
FF
707 struct dsa_switch *ds = p->dp->ds;
708 struct net *net = dev_net(dev);
709 struct dsa_slave_priv *to_p;
710 struct net_device *to_dev;
711 const struct tc_action *a;
712 int err = -EOPNOTSUPP;
713 LIST_HEAD(actions);
714 int ifindex;
715
716 if (!ds->ops->port_mirror_add)
717 return err;
718
3bcc0cec 719 if (!tcf_exts_has_one_action(cls->exts))
f50f2127
FF
720 return err;
721
722 tcf_exts_to_list(cls->exts, &actions);
723 a = list_first_entry(&actions, struct tc_action, list);
724
725 if (is_tcf_mirred_egress_mirror(a) && protocol == htons(ETH_P_ALL)) {
726 struct dsa_mall_mirror_tc_entry *mirror;
727
728 ifindex = tcf_mirred_ifindex(a);
729 to_dev = __dev_get_by_index(net, ifindex);
730 if (!to_dev)
731 return -EINVAL;
732
733 if (!dsa_slave_dev_check(to_dev))
734 return -EOPNOTSUPP;
735
736 mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
737 if (!mall_tc_entry)
738 return -ENOMEM;
739
740 mall_tc_entry->cookie = cls->cookie;
741 mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
742 mirror = &mall_tc_entry->mirror;
743
744 to_p = netdev_priv(to_dev);
745
746 mirror->to_local_port = to_p->dp->index;
747 mirror->ingress = ingress;
748
749 err = ds->ops->port_mirror_add(ds, p->dp->index, mirror,
750 ingress);
751 if (err) {
752 kfree(mall_tc_entry);
753 return err;
754 }
755
756 list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);
757 }
758
759 return 0;
760}
761
762static void dsa_slave_del_cls_matchall(struct net_device *dev,
763 struct tc_cls_matchall_offload *cls)
764{
765 struct dsa_slave_priv *p = netdev_priv(dev);
766 struct dsa_mall_tc_entry *mall_tc_entry;
767 struct dsa_switch *ds = p->dp->ds;
768
769 if (!ds->ops->port_mirror_del)
770 return;
771
4fa7b718 772 mall_tc_entry = dsa_slave_mall_tc_entry_find(dev, cls->cookie);
f50f2127
FF
773 if (!mall_tc_entry)
774 return;
775
776 list_del(&mall_tc_entry->list);
777
778 switch (mall_tc_entry->type) {
779 case DSA_PORT_MALL_MIRROR:
780 ds->ops->port_mirror_del(ds, p->dp->index,
781 &mall_tc_entry->mirror);
782 break;
783 default:
784 WARN_ON(1);
785 }
786
787 kfree(mall_tc_entry);
788}
789
3fbae382 790static int dsa_slave_setup_tc_cls_matchall(struct net_device *dev,
3fbae382 791 struct tc_cls_matchall_offload *cls)
f50f2127 792{
a2e8da93
JP
793 bool ingress;
794
795 if (is_classid_clsact_ingress(cls->common.classid))
796 ingress = true;
797 else if (is_classid_clsact_egress(cls->common.classid))
798 ingress = false;
799 else
800 return -EOPNOTSUPP;
a5fcf8a6 801
5fd9fc4e 802 if (cls->common.chain_index)
a5fcf8a6 803 return -EOPNOTSUPP;
f50f2127 804
3fbae382
JP
805 switch (cls->command) {
806 case TC_CLSMATCHALL_REPLACE:
5fd9fc4e 807 return dsa_slave_add_cls_matchall(dev, cls, ingress);
3fbae382
JP
808 case TC_CLSMATCHALL_DESTROY:
809 dsa_slave_del_cls_matchall(dev, cls);
810 return 0;
811 default:
812 return -EOPNOTSUPP;
813 }
814}
815
816static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type,
de4784ca 817 void *type_data)
3fbae382 818{
2572ac53 819 switch (type) {
ade9b658 820 case TC_SETUP_CLSMATCHALL:
de4784ca 821 return dsa_slave_setup_tc_cls_matchall(dev, type_data);
f50f2127 822 default:
a5fcf8a6 823 return -EOPNOTSUPP;
f50f2127 824 }
f50f2127
FF
825}
826
f613ed66
FF
827static void dsa_slave_get_stats64(struct net_device *dev,
828 struct rtnl_link_stats64 *stats)
829{
830 struct dsa_slave_priv *p = netdev_priv(dev);
5f6b4e14 831 struct pcpu_sw_netstats *s;
f613ed66 832 unsigned int start;
5f6b4e14 833 int i;
f613ed66
FF
834
835 netdev_stats_to_stats64(stats, &dev->stats);
5f6b4e14
FF
836 for_each_possible_cpu(i) {
837 u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
838
839 s = per_cpu_ptr(p->stats64, i);
840 do {
841 start = u64_stats_fetch_begin_irq(&s->syncp);
842 tx_packets = s->tx_packets;
843 tx_bytes = s->tx_bytes;
844 rx_packets = s->rx_packets;
845 rx_bytes = s->rx_bytes;
846 } while (u64_stats_fetch_retry_irq(&s->syncp, start));
847
848 stats->tx_packets += tx_packets;
849 stats->tx_bytes += tx_bytes;
850 stats->rx_packets += rx_packets;
851 stats->rx_bytes += rx_bytes;
852 }
f613ed66
FF
853}
854
bf9f2648
FF
855static int dsa_slave_get_rxnfc(struct net_device *dev,
856 struct ethtool_rxnfc *nfc, u32 *rule_locs)
857{
858 struct dsa_slave_priv *p = netdev_priv(dev);
859 struct dsa_switch *ds = p->dp->ds;
860
861 if (!ds->ops->get_rxnfc)
862 return -EOPNOTSUPP;
863
864 return ds->ops->get_rxnfc(ds, p->dp->index, nfc, rule_locs);
865}
866
867static int dsa_slave_set_rxnfc(struct net_device *dev,
868 struct ethtool_rxnfc *nfc)
869{
870 struct dsa_slave_priv *p = netdev_priv(dev);
871 struct dsa_switch *ds = p->dp->ds;
872
873 if (!ds->ops->set_rxnfc)
874 return -EOPNOTSUPP;
875
876 return ds->ops->set_rxnfc(ds, p->dp->index, nfc);
877}
878
91da11f8 879static const struct ethtool_ops dsa_slave_ethtool_ops = {
91da11f8 880 .get_drvinfo = dsa_slave_get_drvinfo,
3d762a0f
GR
881 .get_regs_len = dsa_slave_get_regs_len,
882 .get_regs = dsa_slave_get_regs,
69b2c162 883 .nway_reset = phy_ethtool_nway_reset,
91da11f8 884 .get_link = dsa_slave_get_link,
6793abb4
GR
885 .get_eeprom_len = dsa_slave_get_eeprom_len,
886 .get_eeprom = dsa_slave_get_eeprom,
887 .set_eeprom = dsa_slave_set_eeprom,
91da11f8
LB
888 .get_strings = dsa_slave_get_strings,
889 .get_ethtool_stats = dsa_slave_get_ethtool_stats,
890 .get_sset_count = dsa_slave_get_sset_count,
19e57c4e
FF
891 .set_wol = dsa_slave_set_wol,
892 .get_wol = dsa_slave_get_wol,
7905288f
FF
893 .set_eee = dsa_slave_set_eee,
894 .get_eee = dsa_slave_get_eee,
771df31a 895 .get_link_ksettings = phy_ethtool_get_link_ksettings,
aa62a8ca 896 .set_link_ksettings = phy_ethtool_set_link_ksettings,
bf9f2648
FF
897 .get_rxnfc = dsa_slave_get_rxnfc,
898 .set_rxnfc = dsa_slave_set_rxnfc,
91da11f8
LB
899};
900
3e8a72d1 901static const struct net_device_ops dsa_slave_netdev_ops = {
d442ad4a
SH
902 .ndo_open = dsa_slave_open,
903 .ndo_stop = dsa_slave_close,
3e8a72d1 904 .ndo_start_xmit = dsa_slave_xmit,
d442ad4a
SH
905 .ndo_change_rx_flags = dsa_slave_change_rx_flags,
906 .ndo_set_rx_mode = dsa_slave_set_rx_mode,
d442ad4a 907 .ndo_set_mac_address = dsa_slave_set_mac_address,
37b8da1a
AS
908 .ndo_fdb_add = dsa_legacy_fdb_add,
909 .ndo_fdb_del = dsa_legacy_fdb_del,
2bedde1a 910 .ndo_fdb_dump = dsa_slave_fdb_dump,
d442ad4a 911 .ndo_do_ioctl = dsa_slave_ioctl,
abd2be00 912 .ndo_get_iflink = dsa_slave_get_iflink,
04ff53f9
FF
913#ifdef CONFIG_NET_POLL_CONTROLLER
914 .ndo_netpoll_setup = dsa_slave_netpoll_setup,
915 .ndo_netpoll_cleanup = dsa_slave_netpoll_cleanup,
916 .ndo_poll_controller = dsa_slave_poll_controller,
917#endif
44bb765c 918 .ndo_get_phys_port_name = dsa_slave_get_phys_port_name,
f50f2127 919 .ndo_setup_tc = dsa_slave_setup_tc,
f613ed66 920 .ndo_get_stats64 = dsa_slave_get_stats64,
98237d43
SF
921};
922
9d47c0a2 923static const struct switchdev_ops dsa_slave_switchdev_ops = {
f8e20a9f 924 .switchdev_port_attr_get = dsa_slave_port_attr_get,
35636062 925 .switchdev_port_attr_set = dsa_slave_port_attr_set,
ba14d9eb
VD
926 .switchdev_port_obj_add = dsa_slave_port_obj_add,
927 .switchdev_port_obj_del = dsa_slave_port_obj_del,
d442ad4a 928};
91da11f8 929
f37db85d
FF
930static struct device_type dsa_type = {
931 .name = "dsa",
932};
933
0d8bcdd3
FF
934static void dsa_slave_adjust_link(struct net_device *dev)
935{
936 struct dsa_slave_priv *p = netdev_priv(dev);
afdcf151 937 struct dsa_switch *ds = p->dp->ds;
0d8bcdd3
FF
938 unsigned int status_changed = 0;
939
0115dcd1 940 if (p->old_link != dev->phydev->link) {
0d8bcdd3 941 status_changed = 1;
0115dcd1 942 p->old_link = dev->phydev->link;
0d8bcdd3
FF
943 }
944
0115dcd1 945 if (p->old_duplex != dev->phydev->duplex) {
0d8bcdd3 946 status_changed = 1;
0115dcd1 947 p->old_duplex = dev->phydev->duplex;
0d8bcdd3
FF
948 }
949
0115dcd1 950 if (p->old_pause != dev->phydev->pause) {
0d8bcdd3 951 status_changed = 1;
0115dcd1 952 p->old_pause = dev->phydev->pause;
0d8bcdd3
FF
953 }
954
9d490b4e 955 if (ds->ops->adjust_link && status_changed)
0115dcd1 956 ds->ops->adjust_link(ds, p->dp->index, dev->phydev);
ec9436ba 957
0d8bcdd3 958 if (status_changed)
0115dcd1 959 phy_print_status(dev->phydev);
0d8bcdd3
FF
960}
961
ce31b31c
FF
962static int dsa_slave_fixed_link_update(struct net_device *dev,
963 struct fixed_phy_status *status)
964{
b71be352
AL
965 struct dsa_slave_priv *p;
966 struct dsa_switch *ds;
967
968 if (dev) {
969 p = netdev_priv(dev);
afdcf151 970 ds = p->dp->ds;
9d490b4e 971 if (ds->ops->fixed_link_update)
afdcf151 972 ds->ops->fixed_link_update(ds, p->dp->index, status);
b71be352 973 }
ce31b31c
FF
974
975 return 0;
976}
977
91da11f8 978/* slave device setup *******************************************************/
4fa7b718 979static int dsa_slave_phy_connect(struct net_device *slave_dev, int addr)
c305c165 980{
4fa7b718 981 struct dsa_slave_priv *p = netdev_priv(slave_dev);
afdcf151 982 struct dsa_switch *ds = p->dp->ds;
c305c165 983
0115dcd1
VD
984 slave_dev->phydev = mdiobus_get_phy(ds->slave_mii_bus, addr);
985 if (!slave_dev->phydev) {
d25b8e74 986 netdev_err(slave_dev, "no phy at %d\n", addr);
c305c165 987 return -ENODEV;
d25b8e74 988 }
c305c165
FF
989
990 /* Use already configured phy mode */
211c504a 991 if (p->phy_interface == PHY_INTERFACE_MODE_NA)
0115dcd1
VD
992 p->phy_interface = slave_dev->phydev->interface;
993
994 return phy_connect_direct(slave_dev, slave_dev->phydev,
995 dsa_slave_adjust_link, p->phy_interface);
c305c165
FF
996}
997
4fa7b718 998static int dsa_slave_phy_setup(struct net_device *slave_dev)
0d8bcdd3 999{
4fa7b718 1000 struct dsa_slave_priv *p = netdev_priv(slave_dev);
afdcf151 1001 struct dsa_switch *ds = p->dp->ds;
0d8bcdd3 1002 struct device_node *phy_dn, *port_dn;
ce31b31c 1003 bool phy_is_fixed = false;
6819563e 1004 u32 phy_flags = 0;
19334920 1005 int mode, ret;
0d8bcdd3 1006
afdcf151 1007 port_dn = p->dp->dn;
19334920
GR
1008 mode = of_get_phy_mode(port_dn);
1009 if (mode < 0)
1010 mode = PHY_INTERFACE_MODE_NA;
1011 p->phy_interface = mode;
0d8bcdd3
FF
1012
1013 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
0d8f3c67 1014 if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
0d8bcdd3
FF
1015 /* In the case of a fixed PHY, the DT node associated
1016 * to the fixed PHY is the Port DT node
1017 */
1018 ret = of_phy_register_fixed_link(port_dn);
1019 if (ret) {
d25b8e74 1020 netdev_err(slave_dev, "failed to register fixed PHY: %d\n", ret);
9697f1cd 1021 return ret;
0d8bcdd3 1022 }
ce31b31c 1023 phy_is_fixed = true;
0d8f3c67 1024 phy_dn = of_node_get(port_dn);
0d8bcdd3
FF
1025 }
1026
9d490b4e 1027 if (ds->ops->get_phy_flags)
afdcf151 1028 phy_flags = ds->ops->get_phy_flags(ds, p->dp->index);
6819563e 1029
cd28a1a9 1030 if (phy_dn) {
d25b8e74
RK
1031 int phy_id = of_mdio_parse_addr(&slave_dev->dev, phy_dn);
1032
cd28a1a9
FF
1033 /* If this PHY address is part of phys_mii_mask, which means
1034 * that we need to divert reads and writes to/from it, then we
1035 * want to bind this device using the slave MII bus created by
1036 * DSA to make that happen.
1037 */
d25b8e74
RK
1038 if (!phy_is_fixed && phy_id >= 0 &&
1039 (ds->phys_mii_mask & (1 << phy_id))) {
4fa7b718 1040 ret = dsa_slave_phy_connect(slave_dev, phy_id);
d25b8e74
RK
1041 if (ret) {
1042 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret);
0d8f3c67 1043 of_node_put(phy_dn);
cd28a1a9 1044 return ret;
d25b8e74 1045 }
cd28a1a9 1046 } else {
0115dcd1
VD
1047 slave_dev->phydev = of_phy_connect(slave_dev, phy_dn,
1048 dsa_slave_adjust_link,
1049 phy_flags,
1050 p->phy_interface);
cd28a1a9 1051 }
0d8f3c67
JH
1052
1053 of_node_put(phy_dn);
cd28a1a9 1054 }
0d8bcdd3 1055
0115dcd1
VD
1056 if (slave_dev->phydev && phy_is_fixed)
1057 fixed_phy_set_link_update(slave_dev->phydev,
1058 dsa_slave_fixed_link_update);
ce31b31c 1059
0d8bcdd3
FF
1060 /* We could not connect to a designated PHY, so use the switch internal
1061 * MDIO bus instead
1062 */
0115dcd1 1063 if (!slave_dev->phydev) {
4fa7b718 1064 ret = dsa_slave_phy_connect(slave_dev, p->dp->index);
d25b8e74 1065 if (ret) {
afdcf151
VD
1066 netdev_err(slave_dev, "failed to connect to port %d: %d\n",
1067 p->dp->index, ret);
881eadab
JH
1068 if (phy_is_fixed)
1069 of_phy_deregister_fixed_link(port_dn);
c305c165 1070 return ret;
d25b8e74 1071 }
b31f65fb 1072 }
9697f1cd 1073
0115dcd1 1074 phy_attached_info(slave_dev->phydev);
2220943a 1075
9697f1cd 1076 return 0;
0d8bcdd3
FF
1077}
1078
448b4482
AL
1079static struct lock_class_key dsa_slave_netdev_xmit_lock_key;
1080static void dsa_slave_set_lockdep_class_one(struct net_device *dev,
1081 struct netdev_queue *txq,
1082 void *_unused)
1083{
1084 lockdep_set_class(&txq->_xmit_lock,
1085 &dsa_slave_netdev_xmit_lock_key);
1086}
1087
24462549
FF
1088int dsa_slave_suspend(struct net_device *slave_dev)
1089{
1090 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1091
f154be24
FF
1092 netif_device_detach(slave_dev);
1093
0115dcd1
VD
1094 if (slave_dev->phydev) {
1095 phy_stop(slave_dev->phydev);
24462549
FF
1096 p->old_pause = -1;
1097 p->old_link = -1;
1098 p->old_duplex = -1;
0115dcd1 1099 phy_suspend(slave_dev->phydev);
24462549
FF
1100 }
1101
1102 return 0;
1103}
1104
1105int dsa_slave_resume(struct net_device *slave_dev)
1106{
24462549
FF
1107 netif_device_attach(slave_dev);
1108
0115dcd1
VD
1109 if (slave_dev->phydev) {
1110 phy_resume(slave_dev->phydev);
1111 phy_start(slave_dev->phydev);
24462549
FF
1112 }
1113
1114 return 0;
1115}
1116
6158eaa7
VD
1117static void dsa_slave_notify(struct net_device *dev, unsigned long val)
1118{
1119 struct dsa_slave_priv *p = netdev_priv(dev);
1120 struct net_device *master = dsa_master_netdev(p);
1121 struct dsa_port *dp = p->dp;
1122 struct dsa_notifier_register_info rinfo = {
1123 .switch_number = dp->ds->index,
1124 .port_number = dp->index,
1125 .master = master,
1126 .info.dev = dev,
1127 };
1128
1129 call_dsa_notifiers(val, dev, &rinfo.info);
1130}
1131
4cfbf09c 1132int dsa_slave_create(struct dsa_port *port, const char *name)
91da11f8 1133{
a5b930e0
VD
1134 struct dsa_port *cpu_dp = port->cpu_dp;
1135 struct net_device *master = cpu_dp->netdev;
4cfbf09c 1136 struct dsa_switch *ds = port->ds;
91da11f8
LB
1137 struct net_device *slave_dev;
1138 struct dsa_slave_priv *p;
1139 int ret;
1140
55199df6
FF
1141 if (!ds->num_tx_queues)
1142 ds->num_tx_queues = 1;
1143
1144 slave_dev = alloc_netdev_mqs(sizeof(struct dsa_slave_priv), name,
1145 NET_NAME_UNKNOWN, ether_setup,
1146 ds->num_tx_queues, 1);
91da11f8 1147 if (slave_dev == NULL)
d87d6f44 1148 return -ENOMEM;
91da11f8 1149
f50f2127
FF
1150 slave_dev->features = master->vlan_features | NETIF_F_HW_TC;
1151 slave_dev->hw_features |= NETIF_F_HW_TC;
7ad24ea4 1152 slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
2fcc8005 1153 eth_hw_addr_inherit(slave_dev, master);
0a5f107b 1154 slave_dev->priv_flags |= IFF_NO_QUEUE;
3e8a72d1 1155 slave_dev->netdev_ops = &dsa_slave_netdev_ops;
9d47c0a2 1156 slave_dev->switchdev_ops = &dsa_slave_switchdev_ops;
8b1efc0f
JW
1157 slave_dev->min_mtu = 0;
1158 slave_dev->max_mtu = ETH_MAX_MTU;
f37db85d 1159 SET_NETDEV_DEVTYPE(slave_dev, &dsa_type);
d442ad4a 1160
448b4482
AL
1161 netdev_for_each_tx_queue(slave_dev, dsa_slave_set_lockdep_class_one,
1162 NULL);
1163
4cfbf09c
VD
1164 SET_NETDEV_DEV(slave_dev, port->ds->dev);
1165 slave_dev->dev.of_node = port->dn;
5075314e
AD
1166 slave_dev->vlan_features = master->vlan_features;
1167
1168 p = netdev_priv(slave_dev);
5f6b4e14
FF
1169 p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
1170 if (!p->stats64) {
1171 free_netdev(slave_dev);
1172 return -ENOMEM;
1173 }
4cfbf09c 1174 p->dp = port;
f50f2127 1175 INIT_LIST_HEAD(&p->mall_tc_list);
15240248 1176 p->xmit = cpu_dp->tag_ops->xmit;
d442ad4a 1177
0d8bcdd3
FF
1178 p->old_pause = -1;
1179 p->old_link = -1;
1180 p->old_duplex = -1;
1181
4cfbf09c 1182 port->netdev = slave_dev;
91da11f8
LB
1183
1184 netif_carrier_off(slave_dev);
1185
4fa7b718 1186 ret = dsa_slave_phy_setup(slave_dev);
0071f56e
AL
1187 if (ret) {
1188 netdev_err(master, "error %d setting up slave phy\n", ret);
e804441c
FF
1189 goto out_free;
1190 }
1191
6158eaa7 1192 dsa_slave_notify(slave_dev, DSA_PORT_REGISTER);
60724d4b 1193
e804441c
FF
1194 ret = register_netdev(slave_dev);
1195 if (ret) {
1196 netdev_err(master, "error %d registering interface %s\n",
1197 ret, slave_dev->name);
1198 goto out_phy;
0071f56e
AL
1199 }
1200
d87d6f44 1201 return 0;
e804441c
FF
1202
1203out_phy:
53954cf8 1204 phy_disconnect(slave_dev->phydev);
e804441c
FF
1205 if (of_phy_is_fixed_link(p->dp->dn))
1206 of_phy_deregister_fixed_link(p->dp->dn);
1207out_free:
1208 free_percpu(p->stats64);
1209 free_netdev(slave_dev);
1210 port->netdev = NULL;
1211 return ret;
91da11f8 1212}
b73adef6 1213
cda5c15b
NA
1214void dsa_slave_destroy(struct net_device *slave_dev)
1215{
1216 struct dsa_slave_priv *p = netdev_priv(slave_dev);
881eadab
JH
1217 struct device_node *port_dn;
1218
afdcf151 1219 port_dn = p->dp->dn;
cda5c15b
NA
1220
1221 netif_carrier_off(slave_dev);
0115dcd1
VD
1222 if (slave_dev->phydev) {
1223 phy_disconnect(slave_dev->phydev);
881eadab
JH
1224
1225 if (of_phy_is_fixed_link(port_dn))
1226 of_phy_deregister_fixed_link(port_dn);
1227 }
6158eaa7 1228 dsa_slave_notify(slave_dev, DSA_PORT_UNREGISTER);
cda5c15b 1229 unregister_netdev(slave_dev);
5f6b4e14 1230 free_percpu(p->stats64);
cda5c15b
NA
1231 free_netdev(slave_dev);
1232}
1233
b73adef6
FF
1234static bool dsa_slave_dev_check(struct net_device *dev)
1235{
1236 return dev->netdev_ops == &dsa_slave_netdev_ops;
1237}
1238
8e92ab3a
VD
1239static int dsa_slave_changeupper(struct net_device *dev,
1240 struct netdev_notifier_changeupper_info *info)
b73adef6 1241{
17d7802b
VD
1242 struct dsa_slave_priv *p = netdev_priv(dev);
1243 struct dsa_port *dp = p->dp;
8e92ab3a 1244 int err = NOTIFY_DONE;
b73adef6 1245
8e92ab3a
VD
1246 if (netif_is_bridge_master(info->upper_dev)) {
1247 if (info->linking) {
17d7802b 1248 err = dsa_port_bridge_join(dp, info->upper_dev);
8e92ab3a
VD
1249 err = notifier_from_errno(err);
1250 } else {
17d7802b 1251 dsa_port_bridge_leave(dp, info->upper_dev);
8e92ab3a 1252 err = NOTIFY_OK;
6debb68a 1253 }
6debb68a 1254 }
b73adef6 1255
8e92ab3a 1256 return err;
6debb68a 1257}
b73adef6 1258
88e4f0ca
VD
1259static int dsa_slave_netdevice_event(struct notifier_block *nb,
1260 unsigned long event, void *ptr)
6debb68a
VD
1261{
1262 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1263
53bade8a 1264 if (!dsa_slave_dev_check(dev))
8e92ab3a
VD
1265 return NOTIFY_DONE;
1266
1267 if (event == NETDEV_CHANGEUPPER)
1268 return dsa_slave_changeupper(dev, ptr);
b73adef6 1269
b73adef6
FF
1270 return NOTIFY_DONE;
1271}
88e4f0ca 1272
c9eb3e0f
AS
1273struct dsa_switchdev_event_work {
1274 struct work_struct work;
1275 struct switchdev_notifier_fdb_info fdb_info;
1276 struct net_device *dev;
1277 unsigned long event;
1278};
1279
1280static void dsa_slave_switchdev_event_work(struct work_struct *work)
1281{
1282 struct dsa_switchdev_event_work *switchdev_work =
1283 container_of(work, struct dsa_switchdev_event_work, work);
1284 struct net_device *dev = switchdev_work->dev;
1285 struct switchdev_notifier_fdb_info *fdb_info;
1286 struct dsa_slave_priv *p = netdev_priv(dev);
1287 int err;
1288
1289 rtnl_lock();
1290 switch (switchdev_work->event) {
1291 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1292 fdb_info = &switchdev_work->fdb_info;
1293 err = dsa_port_fdb_add(p->dp, fdb_info->addr, fdb_info->vid);
1294 if (err) {
1295 netdev_dbg(dev, "fdb add failed err=%d\n", err);
1296 break;
1297 }
1298 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, dev,
1299 &fdb_info->info);
1300 break;
1301
1302 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1303 fdb_info = &switchdev_work->fdb_info;
1304 err = dsa_port_fdb_del(p->dp, fdb_info->addr, fdb_info->vid);
1305 if (err) {
1306 netdev_dbg(dev, "fdb del failed err=%d\n", err);
1307 dev_close(dev);
1308 }
1309 break;
1310 }
1311 rtnl_unlock();
1312
1313 kfree(switchdev_work->fdb_info.addr);
1314 kfree(switchdev_work);
1315 dev_put(dev);
1316}
1317
1318static int
1319dsa_slave_switchdev_fdb_work_init(struct dsa_switchdev_event_work *
1320 switchdev_work,
1321 const struct switchdev_notifier_fdb_info *
1322 fdb_info)
1323{
1324 memcpy(&switchdev_work->fdb_info, fdb_info,
1325 sizeof(switchdev_work->fdb_info));
1326 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1327 if (!switchdev_work->fdb_info.addr)
1328 return -ENOMEM;
1329 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
1330 fdb_info->addr);
1331 return 0;
1332}
1333
1334/* Called under rcu_read_lock() */
1335static int dsa_slave_switchdev_event(struct notifier_block *unused,
1336 unsigned long event, void *ptr)
1337{
1338 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1339 struct dsa_switchdev_event_work *switchdev_work;
1340
1341 if (!dsa_slave_dev_check(dev))
1342 return NOTIFY_DONE;
1343
1344 switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
1345 if (!switchdev_work)
1346 return NOTIFY_BAD;
1347
1348 INIT_WORK(&switchdev_work->work,
1349 dsa_slave_switchdev_event_work);
1350 switchdev_work->dev = dev;
1351 switchdev_work->event = event;
1352
1353 switch (event) {
1354 case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */
1355 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1356 if (dsa_slave_switchdev_fdb_work_init(switchdev_work,
1357 ptr))
1358 goto err_fdb_work_init;
1359 dev_hold(dev);
1360 break;
1361 default:
1362 kfree(switchdev_work);
1363 return NOTIFY_DONE;
1364 }
1365
1366 dsa_schedule_work(&switchdev_work->work);
1367 return NOTIFY_OK;
1368
1369err_fdb_work_init:
1370 kfree(switchdev_work);
1371 return NOTIFY_BAD;
1372}
1373
88e4f0ca 1374static struct notifier_block dsa_slave_nb __read_mostly = {
c9eb3e0f
AS
1375 .notifier_call = dsa_slave_netdevice_event,
1376};
1377
1378static struct notifier_block dsa_slave_switchdev_notifier = {
1379 .notifier_call = dsa_slave_switchdev_event,
88e4f0ca
VD
1380};
1381
1382int dsa_slave_register_notifier(void)
1383{
c9eb3e0f
AS
1384 int err;
1385
1386 err = register_netdevice_notifier(&dsa_slave_nb);
1387 if (err)
1388 return err;
1389
1390 err = register_switchdev_notifier(&dsa_slave_switchdev_notifier);
1391 if (err)
1392 goto err_switchdev_nb;
1393
1394 return 0;
1395
1396err_switchdev_nb:
1397 unregister_netdevice_notifier(&dsa_slave_nb);
1398 return err;
88e4f0ca
VD
1399}
1400
1401void dsa_slave_unregister_notifier(void)
1402{
1403 int err;
1404
c9eb3e0f
AS
1405 err = unregister_switchdev_notifier(&dsa_slave_switchdev_notifier);
1406 if (err)
1407 pr_err("DSA: failed to unregister switchdev notifier (%d)\n", err);
1408
88e4f0ca
VD
1409 err = unregister_netdevice_notifier(&dsa_slave_nb);
1410 if (err)
1411 pr_err("DSA: failed to unregister slave notifier (%d)\n", err);
1412}