5fc87ee539052eea4c6ec3335218074c9313f76f
[cascardo/linux.git] / net / dsa / slave.c
1 /*
2  * net/dsa/slave.c - Slave device handling
3  * Copyright (c) 2008-2009 Marvell Semiconductor
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>
12 #include <linux/etherdevice.h>
13 #include <linux/netdevice.h>
14 #include <linux/phy.h>
15 #include <linux/phy_fixed.h>
16 #include <linux/of_net.h>
17 #include <linux/of_mdio.h>
18 #include <net/rtnetlink.h>
19 #include <net/switchdev.h>
20 #include <linux/if_bridge.h>
21 #include "dsa_priv.h"
22
23 /* slave mii_bus handling ***************************************************/
24 static int dsa_slave_phy_read(struct mii_bus *bus, int addr, int reg)
25 {
26         struct dsa_switch *ds = bus->priv;
27
28         if (ds->phys_mii_mask & (1 << addr))
29                 return ds->drv->phy_read(ds, addr, reg);
30
31         return 0xffff;
32 }
33
34 static int dsa_slave_phy_write(struct mii_bus *bus, int addr, int reg, u16 val)
35 {
36         struct dsa_switch *ds = bus->priv;
37
38         if (ds->phys_mii_mask & (1 << addr))
39                 return ds->drv->phy_write(ds, addr, reg, val);
40
41         return 0;
42 }
43
44 void dsa_slave_mii_bus_init(struct dsa_switch *ds)
45 {
46         ds->slave_mii_bus->priv = (void *)ds;
47         ds->slave_mii_bus->name = "dsa slave smi";
48         ds->slave_mii_bus->read = dsa_slave_phy_read;
49         ds->slave_mii_bus->write = dsa_slave_phy_write;
50         snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x",
51                         ds->index, ds->pd->sw_addr);
52         ds->slave_mii_bus->parent = ds->master_dev;
53         ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
54 }
55
56
57 /* slave device handling ****************************************************/
58 static int dsa_slave_get_iflink(const struct net_device *dev)
59 {
60         struct dsa_slave_priv *p = netdev_priv(dev);
61
62         return p->parent->dst->master_netdev->ifindex;
63 }
64
65 static inline bool dsa_port_is_bridged(struct dsa_slave_priv *p)
66 {
67         return !!p->bridge_dev;
68 }
69
70 static int dsa_slave_open(struct net_device *dev)
71 {
72         struct dsa_slave_priv *p = netdev_priv(dev);
73         struct net_device *master = p->parent->dst->master_netdev;
74         struct dsa_switch *ds = p->parent;
75         u8 stp_state = dsa_port_is_bridged(p) ?
76                         BR_STATE_BLOCKING : BR_STATE_FORWARDING;
77         int err;
78
79         if (!(master->flags & IFF_UP))
80                 return -ENETDOWN;
81
82         if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
83                 err = dev_uc_add(master, dev->dev_addr);
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
99         if (ds->drv->port_enable) {
100                 err = ds->drv->port_enable(ds, p->port, p->phy);
101                 if (err)
102                         goto clear_promisc;
103         }
104
105         if (ds->drv->port_stp_update)
106                 ds->drv->port_stp_update(ds, p->port, stp_state);
107
108         if (p->phy)
109                 phy_start(p->phy);
110
111         return 0;
112
113 clear_promisc:
114         if (dev->flags & IFF_PROMISC)
115                 dev_set_promiscuity(master, -1);
116 clear_allmulti:
117         if (dev->flags & IFF_ALLMULTI)
118                 dev_set_allmulti(master, -1);
119 del_unicast:
120         if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
121                 dev_uc_del(master, dev->dev_addr);
122 out:
123         return err;
124 }
125
126 static int dsa_slave_close(struct net_device *dev)
127 {
128         struct dsa_slave_priv *p = netdev_priv(dev);
129         struct net_device *master = p->parent->dst->master_netdev;
130         struct dsa_switch *ds = p->parent;
131
132         if (p->phy)
133                 phy_stop(p->phy);
134
135         dev_mc_unsync(master, dev);
136         dev_uc_unsync(master, dev);
137         if (dev->flags & IFF_ALLMULTI)
138                 dev_set_allmulti(master, -1);
139         if (dev->flags & IFF_PROMISC)
140                 dev_set_promiscuity(master, -1);
141
142         if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
143                 dev_uc_del(master, dev->dev_addr);
144
145         if (ds->drv->port_disable)
146                 ds->drv->port_disable(ds, p->port, p->phy);
147
148         if (ds->drv->port_stp_update)
149                 ds->drv->port_stp_update(ds, p->port, BR_STATE_DISABLED);
150
151         return 0;
152 }
153
154 static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
155 {
156         struct dsa_slave_priv *p = netdev_priv(dev);
157         struct net_device *master = p->parent->dst->master_netdev;
158
159         if (change & IFF_ALLMULTI)
160                 dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
161         if (change & IFF_PROMISC)
162                 dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
163 }
164
165 static void dsa_slave_set_rx_mode(struct net_device *dev)
166 {
167         struct dsa_slave_priv *p = netdev_priv(dev);
168         struct net_device *master = p->parent->dst->master_netdev;
169
170         dev_mc_sync(master, dev);
171         dev_uc_sync(master, dev);
172 }
173
174 static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
175 {
176         struct dsa_slave_priv *p = netdev_priv(dev);
177         struct net_device *master = p->parent->dst->master_netdev;
178         struct sockaddr *addr = a;
179         int err;
180
181         if (!is_valid_ether_addr(addr->sa_data))
182                 return -EADDRNOTAVAIL;
183
184         if (!(dev->flags & IFF_UP))
185                 goto out;
186
187         if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
188                 err = dev_uc_add(master, addr->sa_data);
189                 if (err < 0)
190                         return err;
191         }
192
193         if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
194                 dev_uc_del(master, dev->dev_addr);
195
196 out:
197         ether_addr_copy(dev->dev_addr, addr->sa_data);
198
199         return 0;
200 }
201
202 static int dsa_slave_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
203                              struct net_device *dev,
204                              const unsigned char *addr, u16 vid, u16 nlm_flags)
205 {
206         struct dsa_slave_priv *p = netdev_priv(dev);
207         struct dsa_switch *ds = p->parent;
208         int ret = -EOPNOTSUPP;
209
210         if (ds->drv->fdb_add)
211                 ret = ds->drv->fdb_add(ds, p->port, addr, vid);
212
213         return ret;
214 }
215
216 static int dsa_slave_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
217                              struct net_device *dev,
218                              const unsigned char *addr, u16 vid)
219 {
220         struct dsa_slave_priv *p = netdev_priv(dev);
221         struct dsa_switch *ds = p->parent;
222         int ret = -EOPNOTSUPP;
223
224         if (ds->drv->fdb_del)
225                 ret = ds->drv->fdb_del(ds, p->port, addr, vid);
226
227         return ret;
228 }
229
230 static int dsa_slave_fill_info(struct net_device *dev, struct sk_buff *skb,
231                                const unsigned char *addr, u16 vid,
232                                bool is_static,
233                                u32 portid, u32 seq, int type,
234                                unsigned int flags)
235 {
236         struct nlmsghdr *nlh;
237         struct ndmsg *ndm;
238
239         nlh = nlmsg_put(skb, portid, seq, type, sizeof(*ndm), flags);
240         if (!nlh)
241                 return -EMSGSIZE;
242
243         ndm = nlmsg_data(nlh);
244         ndm->ndm_family  = AF_BRIDGE;
245         ndm->ndm_pad1    = 0;
246         ndm->ndm_pad2    = 0;
247         ndm->ndm_flags   = NTF_EXT_LEARNED;
248         ndm->ndm_type    = 0;
249         ndm->ndm_ifindex = dev->ifindex;
250         ndm->ndm_state   = is_static ? NUD_NOARP : NUD_REACHABLE;
251
252         if (nla_put(skb, NDA_LLADDR, ETH_ALEN, addr))
253                 goto nla_put_failure;
254
255         if (vid && nla_put_u16(skb, NDA_VLAN, vid))
256                 goto nla_put_failure;
257
258         nlmsg_end(skb, nlh);
259         return 0;
260
261 nla_put_failure:
262         nlmsg_cancel(skb, nlh);
263         return -EMSGSIZE;
264 }
265
266 /* Dump information about entries, in response to GETNEIGH */
267 static int dsa_slave_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
268                               struct net_device *dev,
269                               struct net_device *filter_dev, int idx)
270 {
271         struct dsa_slave_priv *p = netdev_priv(dev);
272         struct dsa_switch *ds = p->parent;
273         unsigned char addr[ETH_ALEN] = { 0 };
274         int ret;
275
276         if (!ds->drv->fdb_getnext)
277                 return -EOPNOTSUPP;
278
279         for (; ; idx++) {
280                 bool is_static;
281
282                 ret = ds->drv->fdb_getnext(ds, p->port, addr, &is_static);
283                 if (ret < 0)
284                         break;
285
286                 if (idx < cb->args[0])
287                         continue;
288
289                 ret = dsa_slave_fill_info(dev, skb, addr, 0,
290                                           is_static,
291                                           NETLINK_CB(cb->skb).portid,
292                                           cb->nlh->nlmsg_seq,
293                                           RTM_NEWNEIGH, NLM_F_MULTI);
294                 if (ret < 0)
295                         break;
296         }
297
298         return idx;
299 }
300
301 static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
302 {
303         struct dsa_slave_priv *p = netdev_priv(dev);
304
305         if (p->phy != NULL)
306                 return phy_mii_ioctl(p->phy, ifr, cmd);
307
308         return -EOPNOTSUPP;
309 }
310
311 /* Return a bitmask of all ports being currently bridged within a given bridge
312  * device. Note that on leave, the mask will still return the bitmask of ports
313  * currently bridged, prior to port removal, and this is exactly what we want.
314  */
315 static u32 dsa_slave_br_port_mask(struct dsa_switch *ds,
316                                   struct net_device *bridge)
317 {
318         struct dsa_slave_priv *p;
319         unsigned int port;
320         u32 mask = 0;
321
322         for (port = 0; port < DSA_MAX_PORTS; port++) {
323                 if (!dsa_is_port_initialized(ds, port))
324                         continue;
325
326                 p = netdev_priv(ds->ports[port]);
327
328                 if (ds->ports[port]->priv_flags & IFF_BRIDGE_PORT &&
329                     p->bridge_dev == bridge)
330                         mask |= 1 << port;
331         }
332
333         return mask;
334 }
335
336 static int dsa_slave_stp_update(struct net_device *dev, u8 state)
337 {
338         struct dsa_slave_priv *p = netdev_priv(dev);
339         struct dsa_switch *ds = p->parent;
340         int ret = -EOPNOTSUPP;
341
342         if (ds->drv->port_stp_update)
343                 ret = ds->drv->port_stp_update(ds, p->port, state);
344
345         return ret;
346 }
347
348 static int dsa_slave_port_attr_set(struct net_device *dev,
349                                    struct switchdev_attr *attr)
350 {
351         int ret = 0;
352
353         switch (attr->id) {
354         case SWITCHDEV_ATTR_PORT_STP_STATE:
355                 if (attr->trans == SWITCHDEV_TRANS_COMMIT)
356                         ret = dsa_slave_stp_update(dev, attr->u.stp_state);
357                 break;
358         default:
359                 ret = -EOPNOTSUPP;
360                 break;
361         }
362
363         return ret;
364 }
365
366 static int dsa_slave_bridge_port_join(struct net_device *dev,
367                                       struct net_device *br)
368 {
369         struct dsa_slave_priv *p = netdev_priv(dev);
370         struct dsa_switch *ds = p->parent;
371         int ret = -EOPNOTSUPP;
372
373         p->bridge_dev = br;
374
375         if (ds->drv->port_join_bridge)
376                 ret = ds->drv->port_join_bridge(ds, p->port,
377                                                 dsa_slave_br_port_mask(ds, br));
378
379         return ret;
380 }
381
382 static int dsa_slave_bridge_port_leave(struct net_device *dev)
383 {
384         struct dsa_slave_priv *p = netdev_priv(dev);
385         struct dsa_switch *ds = p->parent;
386         int ret = -EOPNOTSUPP;
387
388
389         if (ds->drv->port_leave_bridge)
390                 ret = ds->drv->port_leave_bridge(ds, p->port,
391                                                  dsa_slave_br_port_mask(ds, p->bridge_dev));
392
393         p->bridge_dev = NULL;
394
395         /* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
396          * so allow it to be in BR_STATE_FORWARDING to be kept functional
397          */
398         dsa_slave_stp_update(dev, BR_STATE_FORWARDING);
399
400         return ret;
401 }
402
403 static int dsa_slave_port_attr_get(struct net_device *dev,
404                                    struct switchdev_attr *attr)
405 {
406         struct dsa_slave_priv *p = netdev_priv(dev);
407         struct dsa_switch *ds = p->parent;
408
409         switch (attr->id) {
410         case SWITCHDEV_ATTR_PORT_PARENT_ID:
411                 attr->u.ppid.id_len = sizeof(ds->index);
412                 memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
413                 break;
414         default:
415                 return -EOPNOTSUPP;
416         }
417
418         return 0;
419 }
420
421 static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
422 {
423         struct dsa_slave_priv *p = netdev_priv(dev);
424         struct sk_buff *nskb;
425
426         dev->stats.tx_packets++;
427         dev->stats.tx_bytes += skb->len;
428
429         /* Transmit function may have to reallocate the original SKB */
430         nskb = p->xmit(skb, dev);
431         if (!nskb)
432                 return NETDEV_TX_OK;
433
434         /* Queue the SKB for transmission on the parent interface, but
435          * do not modify its EtherType
436          */
437         nskb->dev = p->parent->dst->master_netdev;
438         dev_queue_xmit(nskb);
439
440         return NETDEV_TX_OK;
441 }
442
443 static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb,
444                                             struct net_device *dev)
445 {
446         /* Just return the original SKB */
447         return skb;
448 }
449
450
451 /* ethtool operations *******************************************************/
452 static int
453 dsa_slave_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
454 {
455         struct dsa_slave_priv *p = netdev_priv(dev);
456         int err;
457
458         err = -EOPNOTSUPP;
459         if (p->phy != NULL) {
460                 err = phy_read_status(p->phy);
461                 if (err == 0)
462                         err = phy_ethtool_gset(p->phy, cmd);
463         }
464
465         return err;
466 }
467
468 static int
469 dsa_slave_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
470 {
471         struct dsa_slave_priv *p = netdev_priv(dev);
472
473         if (p->phy != NULL)
474                 return phy_ethtool_sset(p->phy, cmd);
475
476         return -EOPNOTSUPP;
477 }
478
479 static void dsa_slave_get_drvinfo(struct net_device *dev,
480                                   struct ethtool_drvinfo *drvinfo)
481 {
482         strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver));
483         strlcpy(drvinfo->version, dsa_driver_version, sizeof(drvinfo->version));
484         strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
485         strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
486 }
487
488 static int dsa_slave_get_regs_len(struct net_device *dev)
489 {
490         struct dsa_slave_priv *p = netdev_priv(dev);
491         struct dsa_switch *ds = p->parent;
492
493         if (ds->drv->get_regs_len)
494                 return ds->drv->get_regs_len(ds, p->port);
495
496         return -EOPNOTSUPP;
497 }
498
499 static void
500 dsa_slave_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
501 {
502         struct dsa_slave_priv *p = netdev_priv(dev);
503         struct dsa_switch *ds = p->parent;
504
505         if (ds->drv->get_regs)
506                 ds->drv->get_regs(ds, p->port, regs, _p);
507 }
508
509 static int dsa_slave_nway_reset(struct net_device *dev)
510 {
511         struct dsa_slave_priv *p = netdev_priv(dev);
512
513         if (p->phy != NULL)
514                 return genphy_restart_aneg(p->phy);
515
516         return -EOPNOTSUPP;
517 }
518
519 static u32 dsa_slave_get_link(struct net_device *dev)
520 {
521         struct dsa_slave_priv *p = netdev_priv(dev);
522
523         if (p->phy != NULL) {
524                 genphy_update_link(p->phy);
525                 return p->phy->link;
526         }
527
528         return -EOPNOTSUPP;
529 }
530
531 static int dsa_slave_get_eeprom_len(struct net_device *dev)
532 {
533         struct dsa_slave_priv *p = netdev_priv(dev);
534         struct dsa_switch *ds = p->parent;
535
536         if (ds->pd->eeprom_len)
537                 return ds->pd->eeprom_len;
538
539         if (ds->drv->get_eeprom_len)
540                 return ds->drv->get_eeprom_len(ds);
541
542         return 0;
543 }
544
545 static int dsa_slave_get_eeprom(struct net_device *dev,
546                                 struct ethtool_eeprom *eeprom, u8 *data)
547 {
548         struct dsa_slave_priv *p = netdev_priv(dev);
549         struct dsa_switch *ds = p->parent;
550
551         if (ds->drv->get_eeprom)
552                 return ds->drv->get_eeprom(ds, eeprom, data);
553
554         return -EOPNOTSUPP;
555 }
556
557 static int dsa_slave_set_eeprom(struct net_device *dev,
558                                 struct ethtool_eeprom *eeprom, u8 *data)
559 {
560         struct dsa_slave_priv *p = netdev_priv(dev);
561         struct dsa_switch *ds = p->parent;
562
563         if (ds->drv->set_eeprom)
564                 return ds->drv->set_eeprom(ds, eeprom, data);
565
566         return -EOPNOTSUPP;
567 }
568
569 static void dsa_slave_get_strings(struct net_device *dev,
570                                   uint32_t stringset, uint8_t *data)
571 {
572         struct dsa_slave_priv *p = netdev_priv(dev);
573         struct dsa_switch *ds = p->parent;
574
575         if (stringset == ETH_SS_STATS) {
576                 int len = ETH_GSTRING_LEN;
577
578                 strncpy(data, "tx_packets", len);
579                 strncpy(data + len, "tx_bytes", len);
580                 strncpy(data + 2 * len, "rx_packets", len);
581                 strncpy(data + 3 * len, "rx_bytes", len);
582                 if (ds->drv->get_strings != NULL)
583                         ds->drv->get_strings(ds, p->port, data + 4 * len);
584         }
585 }
586
587 static void dsa_slave_get_ethtool_stats(struct net_device *dev,
588                                         struct ethtool_stats *stats,
589                                         uint64_t *data)
590 {
591         struct dsa_slave_priv *p = netdev_priv(dev);
592         struct dsa_switch *ds = p->parent;
593
594         data[0] = p->dev->stats.tx_packets;
595         data[1] = p->dev->stats.tx_bytes;
596         data[2] = p->dev->stats.rx_packets;
597         data[3] = p->dev->stats.rx_bytes;
598         if (ds->drv->get_ethtool_stats != NULL)
599                 ds->drv->get_ethtool_stats(ds, p->port, data + 4);
600 }
601
602 static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
603 {
604         struct dsa_slave_priv *p = netdev_priv(dev);
605         struct dsa_switch *ds = p->parent;
606
607         if (sset == ETH_SS_STATS) {
608                 int count;
609
610                 count = 4;
611                 if (ds->drv->get_sset_count != NULL)
612                         count += ds->drv->get_sset_count(ds);
613
614                 return count;
615         }
616
617         return -EOPNOTSUPP;
618 }
619
620 static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
621 {
622         struct dsa_slave_priv *p = netdev_priv(dev);
623         struct dsa_switch *ds = p->parent;
624
625         if (ds->drv->get_wol)
626                 ds->drv->get_wol(ds, p->port, w);
627 }
628
629 static int dsa_slave_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
630 {
631         struct dsa_slave_priv *p = netdev_priv(dev);
632         struct dsa_switch *ds = p->parent;
633         int ret = -EOPNOTSUPP;
634
635         if (ds->drv->set_wol)
636                 ret = ds->drv->set_wol(ds, p->port, w);
637
638         return ret;
639 }
640
641 static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
642 {
643         struct dsa_slave_priv *p = netdev_priv(dev);
644         struct dsa_switch *ds = p->parent;
645         int ret;
646
647         if (!ds->drv->set_eee)
648                 return -EOPNOTSUPP;
649
650         ret = ds->drv->set_eee(ds, p->port, p->phy, e);
651         if (ret)
652                 return ret;
653
654         if (p->phy)
655                 ret = phy_ethtool_set_eee(p->phy, e);
656
657         return ret;
658 }
659
660 static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
661 {
662         struct dsa_slave_priv *p = netdev_priv(dev);
663         struct dsa_switch *ds = p->parent;
664         int ret;
665
666         if (!ds->drv->get_eee)
667                 return -EOPNOTSUPP;
668
669         ret = ds->drv->get_eee(ds, p->port, e);
670         if (ret)
671                 return ret;
672
673         if (p->phy)
674                 ret = phy_ethtool_get_eee(p->phy, e);
675
676         return ret;
677 }
678
679 static const struct ethtool_ops dsa_slave_ethtool_ops = {
680         .get_settings           = dsa_slave_get_settings,
681         .set_settings           = dsa_slave_set_settings,
682         .get_drvinfo            = dsa_slave_get_drvinfo,
683         .get_regs_len           = dsa_slave_get_regs_len,
684         .get_regs               = dsa_slave_get_regs,
685         .nway_reset             = dsa_slave_nway_reset,
686         .get_link               = dsa_slave_get_link,
687         .get_eeprom_len         = dsa_slave_get_eeprom_len,
688         .get_eeprom             = dsa_slave_get_eeprom,
689         .set_eeprom             = dsa_slave_set_eeprom,
690         .get_strings            = dsa_slave_get_strings,
691         .get_ethtool_stats      = dsa_slave_get_ethtool_stats,
692         .get_sset_count         = dsa_slave_get_sset_count,
693         .set_wol                = dsa_slave_set_wol,
694         .get_wol                = dsa_slave_get_wol,
695         .set_eee                = dsa_slave_set_eee,
696         .get_eee                = dsa_slave_get_eee,
697 };
698
699 static const struct net_device_ops dsa_slave_netdev_ops = {
700         .ndo_open               = dsa_slave_open,
701         .ndo_stop               = dsa_slave_close,
702         .ndo_start_xmit         = dsa_slave_xmit,
703         .ndo_change_rx_flags    = dsa_slave_change_rx_flags,
704         .ndo_set_rx_mode        = dsa_slave_set_rx_mode,
705         .ndo_set_mac_address    = dsa_slave_set_mac_address,
706         .ndo_fdb_add            = dsa_slave_fdb_add,
707         .ndo_fdb_del            = dsa_slave_fdb_del,
708         .ndo_fdb_dump           = dsa_slave_fdb_dump,
709         .ndo_do_ioctl           = dsa_slave_ioctl,
710         .ndo_get_iflink         = dsa_slave_get_iflink,
711 };
712
713 static const struct switchdev_ops dsa_slave_switchdev_ops = {
714         .switchdev_port_attr_get        = dsa_slave_port_attr_get,
715         .switchdev_port_attr_set        = dsa_slave_port_attr_set,
716 };
717
718 static void dsa_slave_adjust_link(struct net_device *dev)
719 {
720         struct dsa_slave_priv *p = netdev_priv(dev);
721         struct dsa_switch *ds = p->parent;
722         unsigned int status_changed = 0;
723
724         if (p->old_link != p->phy->link) {
725                 status_changed = 1;
726                 p->old_link = p->phy->link;
727         }
728
729         if (p->old_duplex != p->phy->duplex) {
730                 status_changed = 1;
731                 p->old_duplex = p->phy->duplex;
732         }
733
734         if (p->old_pause != p->phy->pause) {
735                 status_changed = 1;
736                 p->old_pause = p->phy->pause;
737         }
738
739         if (ds->drv->adjust_link && status_changed)
740                 ds->drv->adjust_link(ds, p->port, p->phy);
741
742         if (status_changed)
743                 phy_print_status(p->phy);
744 }
745
746 static int dsa_slave_fixed_link_update(struct net_device *dev,
747                                        struct fixed_phy_status *status)
748 {
749         struct dsa_slave_priv *p = netdev_priv(dev);
750         struct dsa_switch *ds = p->parent;
751
752         if (ds->drv->fixed_link_update)
753                 ds->drv->fixed_link_update(ds, p->port, status);
754
755         return 0;
756 }
757
758 /* slave device setup *******************************************************/
759 static int dsa_slave_phy_connect(struct dsa_slave_priv *p,
760                                  struct net_device *slave_dev,
761                                  int addr)
762 {
763         struct dsa_switch *ds = p->parent;
764
765         p->phy = ds->slave_mii_bus->phy_map[addr];
766         if (!p->phy)
767                 return -ENODEV;
768
769         /* Use already configured phy mode */
770         p->phy_interface = p->phy->interface;
771         phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link,
772                            p->phy_interface);
773
774         return 0;
775 }
776
777 static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
778                                 struct net_device *slave_dev)
779 {
780         struct dsa_switch *ds = p->parent;
781         struct dsa_chip_data *cd = ds->pd;
782         struct device_node *phy_dn, *port_dn;
783         bool phy_is_fixed = false;
784         u32 phy_flags = 0;
785         int mode, ret;
786
787         port_dn = cd->port_dn[p->port];
788         mode = of_get_phy_mode(port_dn);
789         if (mode < 0)
790                 mode = PHY_INTERFACE_MODE_NA;
791         p->phy_interface = mode;
792
793         phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
794         if (of_phy_is_fixed_link(port_dn)) {
795                 /* In the case of a fixed PHY, the DT node associated
796                  * to the fixed PHY is the Port DT node
797                  */
798                 ret = of_phy_register_fixed_link(port_dn);
799                 if (ret) {
800                         netdev_err(slave_dev, "failed to register fixed PHY\n");
801                         return ret;
802                 }
803                 phy_is_fixed = true;
804                 phy_dn = port_dn;
805         }
806
807         if (ds->drv->get_phy_flags)
808                 phy_flags = ds->drv->get_phy_flags(ds, p->port);
809
810         if (phy_dn) {
811                 ret = of_mdio_parse_addr(&slave_dev->dev, phy_dn);
812                 /* If this PHY address is part of phys_mii_mask, which means
813                  * that we need to divert reads and writes to/from it, then we
814                  * want to bind this device using the slave MII bus created by
815                  * DSA to make that happen.
816                  */
817                 if (!phy_is_fixed && ret >= 0 &&
818                     (ds->phys_mii_mask & (1 << ret))) {
819                         ret = dsa_slave_phy_connect(p, slave_dev, ret);
820                         if (ret)
821                                 return ret;
822                 } else {
823                         p->phy = of_phy_connect(slave_dev, phy_dn,
824                                                 dsa_slave_adjust_link,
825                                                 phy_flags,
826                                                 p->phy_interface);
827                 }
828         }
829
830         if (p->phy && phy_is_fixed)
831                 fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);
832
833         /* We could not connect to a designated PHY, so use the switch internal
834          * MDIO bus instead
835          */
836         if (!p->phy) {
837                 ret = dsa_slave_phy_connect(p, slave_dev, p->port);
838                 if (ret)
839                         return ret;
840         } else {
841                 netdev_info(slave_dev, "attached PHY at address %d [%s]\n",
842                             p->phy->addr, p->phy->drv->name);
843         }
844
845         return 0;
846 }
847
848 static struct lock_class_key dsa_slave_netdev_xmit_lock_key;
849 static void dsa_slave_set_lockdep_class_one(struct net_device *dev,
850                                             struct netdev_queue *txq,
851                                             void *_unused)
852 {
853         lockdep_set_class(&txq->_xmit_lock,
854                           &dsa_slave_netdev_xmit_lock_key);
855 }
856
857 int dsa_slave_suspend(struct net_device *slave_dev)
858 {
859         struct dsa_slave_priv *p = netdev_priv(slave_dev);
860
861         if (p->phy) {
862                 phy_stop(p->phy);
863                 p->old_pause = -1;
864                 p->old_link = -1;
865                 p->old_duplex = -1;
866                 phy_suspend(p->phy);
867         }
868
869         return 0;
870 }
871
872 int dsa_slave_resume(struct net_device *slave_dev)
873 {
874         struct dsa_slave_priv *p = netdev_priv(slave_dev);
875
876         netif_device_attach(slave_dev);
877
878         if (p->phy) {
879                 phy_resume(p->phy);
880                 phy_start(p->phy);
881         }
882
883         return 0;
884 }
885
886 int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
887                      int port, char *name)
888 {
889         struct net_device *master = ds->dst->master_netdev;
890         struct net_device *slave_dev;
891         struct dsa_slave_priv *p;
892         int ret;
893
894         slave_dev = alloc_netdev(sizeof(struct dsa_slave_priv), name,
895                                  NET_NAME_UNKNOWN, ether_setup);
896         if (slave_dev == NULL)
897                 return -ENOMEM;
898
899         slave_dev->features = master->vlan_features;
900         slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
901         eth_hw_addr_inherit(slave_dev, master);
902         slave_dev->tx_queue_len = 0;
903         slave_dev->netdev_ops = &dsa_slave_netdev_ops;
904         slave_dev->switchdev_ops = &dsa_slave_switchdev_ops;
905
906         netdev_for_each_tx_queue(slave_dev, dsa_slave_set_lockdep_class_one,
907                                  NULL);
908
909         SET_NETDEV_DEV(slave_dev, parent);
910         slave_dev->dev.of_node = ds->pd->port_dn[port];
911         slave_dev->vlan_features = master->vlan_features;
912
913         p = netdev_priv(slave_dev);
914         p->dev = slave_dev;
915         p->parent = ds;
916         p->port = port;
917
918         switch (ds->dst->tag_protocol) {
919 #ifdef CONFIG_NET_DSA_TAG_DSA
920         case DSA_TAG_PROTO_DSA:
921                 p->xmit = dsa_netdev_ops.xmit;
922                 break;
923 #endif
924 #ifdef CONFIG_NET_DSA_TAG_EDSA
925         case DSA_TAG_PROTO_EDSA:
926                 p->xmit = edsa_netdev_ops.xmit;
927                 break;
928 #endif
929 #ifdef CONFIG_NET_DSA_TAG_TRAILER
930         case DSA_TAG_PROTO_TRAILER:
931                 p->xmit = trailer_netdev_ops.xmit;
932                 break;
933 #endif
934 #ifdef CONFIG_NET_DSA_TAG_BRCM
935         case DSA_TAG_PROTO_BRCM:
936                 p->xmit = brcm_netdev_ops.xmit;
937                 break;
938 #endif
939         default:
940                 p->xmit = dsa_slave_notag_xmit;
941                 break;
942         }
943
944         p->old_pause = -1;
945         p->old_link = -1;
946         p->old_duplex = -1;
947
948         ret = dsa_slave_phy_setup(p, slave_dev);
949         if (ret) {
950                 free_netdev(slave_dev);
951                 return ret;
952         }
953
954         ds->ports[port] = slave_dev;
955         ret = register_netdev(slave_dev);
956         if (ret) {
957                 netdev_err(master, "error %d registering interface %s\n",
958                            ret, slave_dev->name);
959                 phy_disconnect(p->phy);
960                 ds->ports[port] = NULL;
961                 free_netdev(slave_dev);
962                 return ret;
963         }
964
965         netif_carrier_off(slave_dev);
966
967         return 0;
968 }
969
970 static bool dsa_slave_dev_check(struct net_device *dev)
971 {
972         return dev->netdev_ops == &dsa_slave_netdev_ops;
973 }
974
975 static int dsa_slave_master_changed(struct net_device *dev)
976 {
977         struct net_device *master = netdev_master_upper_dev_get(dev);
978         struct dsa_slave_priv *p = netdev_priv(dev);
979         int err = 0;
980
981         if (master && master->rtnl_link_ops &&
982             !strcmp(master->rtnl_link_ops->kind, "bridge"))
983                 err = dsa_slave_bridge_port_join(dev, master);
984         else if (dsa_port_is_bridged(p))
985                 err = dsa_slave_bridge_port_leave(dev);
986
987         return err;
988 }
989
990 int dsa_slave_netdevice_event(struct notifier_block *unused,
991                               unsigned long event, void *ptr)
992 {
993         struct net_device *dev;
994         int err = 0;
995
996         switch (event) {
997         case NETDEV_CHANGEUPPER:
998                 dev = netdev_notifier_info_to_dev(ptr);
999                 if (!dsa_slave_dev_check(dev))
1000                         goto out;
1001
1002                 err = dsa_slave_master_changed(dev);
1003                 if (err)
1004                         netdev_warn(dev, "failed to reflect master change\n");
1005
1006                 break;
1007         }
1008
1009 out:
1010         return NOTIFY_DONE;
1011 }