slave.c (7d9a6ef558f6ff375aab9e29f08124cb0daa9bc5) slave.c (49463b7f2da1a115404b02c5533bc2c2125833a3)
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.

--- 41 unchanged lines hidden (view full) ---

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;
57 snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
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.

--- 41 unchanged lines hidden (view full) ---

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;
57 snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
58 ds->dst->tree, ds->index);
58 ds->dst->index, ds->index);
59 ds->slave_mii_bus->parent = ds->dev;
60 ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
61}
62
63
64/* slave device handling ****************************************************/
65static int dsa_slave_get_iflink(const struct net_device *dev)
66{
59 ds->slave_mii_bus->parent = ds->dev;
60 ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
61}
62
63
64/* slave device handling ****************************************************/
65static int dsa_slave_get_iflink(const struct net_device *dev)
66{
67 struct dsa_slave_priv *p = netdev_priv(dev);
68
69 return dsa_master_netdev(p)->ifindex;
67 return dsa_slave_to_master(dev)->ifindex;
70}
71
72static int dsa_slave_open(struct net_device *dev)
73{
68}
69
70static int dsa_slave_open(struct net_device *dev)
71{
74 struct dsa_slave_priv *p = netdev_priv(dev);
75 struct dsa_port *dp = p->dp;
76 struct dsa_switch *ds = dp->ds;
77 struct net_device *master = dsa_master_netdev(p);
78 u8 stp_state = dp->bridge_dev ? BR_STATE_BLOCKING : BR_STATE_FORWARDING;
72 struct net_device *master = dsa_slave_to_master(dev);
73 struct dsa_port *dp = dsa_slave_to_port(dev);
79 int err;
80
81 if (!(master->flags & IFF_UP))
82 return -ENETDOWN;
83
84 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
85 err = dev_uc_add(master, dev->dev_addr);
86 if (err < 0)

--- 6 unchanged lines hidden (view full) ---

93 goto del_unicast;
94 }
95 if (dev->flags & IFF_PROMISC) {
96 err = dev_set_promiscuity(master, 1);
97 if (err < 0)
98 goto clear_allmulti;
99 }
100
74 int err;
75
76 if (!(master->flags & IFF_UP))
77 return -ENETDOWN;
78
79 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
80 err = dev_uc_add(master, dev->dev_addr);
81 if (err < 0)

--- 6 unchanged lines hidden (view full) ---

88 goto del_unicast;
89 }
90 if (dev->flags & IFF_PROMISC) {
91 err = dev_set_promiscuity(master, 1);
92 if (err < 0)
93 goto clear_allmulti;
94 }
95
101 if (ds->ops->port_enable) {
102 err = ds->ops->port_enable(ds, p->dp->index, p->phy);
103 if (err)
104 goto clear_promisc;
105 }
96 err = dsa_port_enable(dp, dev->phydev);
97 if (err)
98 goto clear_promisc;
106
99
107 dsa_port_set_state_now(p->dp, stp_state);
100 if (dev->phydev)
101 phy_start(dev->phydev);
108
102
109 if (p->phy)
110 phy_start(p->phy);
111
112 return 0;
113
114clear_promisc:
115 if (dev->flags & IFF_PROMISC)
116 dev_set_promiscuity(master, -1);
117clear_allmulti:
118 if (dev->flags & IFF_ALLMULTI)
119 dev_set_allmulti(master, -1);
120del_unicast:
121 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
122 dev_uc_del(master, dev->dev_addr);
123out:
124 return err;
125}
126
127static int dsa_slave_close(struct net_device *dev)
128{
103 return 0;
104
105clear_promisc:
106 if (dev->flags & IFF_PROMISC)
107 dev_set_promiscuity(master, -1);
108clear_allmulti:
109 if (dev->flags & IFF_ALLMULTI)
110 dev_set_allmulti(master, -1);
111del_unicast:
112 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
113 dev_uc_del(master, dev->dev_addr);
114out:
115 return err;
116}
117
118static int dsa_slave_close(struct net_device *dev)
119{
129 struct dsa_slave_priv *p = netdev_priv(dev);
130 struct net_device *master = dsa_master_netdev(p);
131 struct dsa_switch *ds = p->dp->ds;
120 struct net_device *master = dsa_slave_to_master(dev);
121 struct dsa_port *dp = dsa_slave_to_port(dev);
132
122
133 if (p->phy)
134 phy_stop(p->phy);
123 if (dev->phydev)
124 phy_stop(dev->phydev);
135
125
126 dsa_port_disable(dp, dev->phydev);
127
136 dev_mc_unsync(master, dev);
137 dev_uc_unsync(master, dev);
138 if (dev->flags & IFF_ALLMULTI)
139 dev_set_allmulti(master, -1);
140 if (dev->flags & IFF_PROMISC)
141 dev_set_promiscuity(master, -1);
142
143 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
144 dev_uc_del(master, dev->dev_addr);
145
128 dev_mc_unsync(master, dev);
129 dev_uc_unsync(master, dev);
130 if (dev->flags & IFF_ALLMULTI)
131 dev_set_allmulti(master, -1);
132 if (dev->flags & IFF_PROMISC)
133 dev_set_promiscuity(master, -1);
134
135 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
136 dev_uc_del(master, dev->dev_addr);
137
146 if (ds->ops->port_disable)
147 ds->ops->port_disable(ds, p->dp->index, p->phy);
148
149 dsa_port_set_state_now(p->dp, BR_STATE_DISABLED);
150
151 return 0;
152}
153
154static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
155{
138 return 0;
139}
140
141static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
142{
156 struct dsa_slave_priv *p = netdev_priv(dev);
157 struct net_device *master = dsa_master_netdev(p);
143 struct net_device *master = dsa_slave_to_master(dev);
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
165static void dsa_slave_set_rx_mode(struct net_device *dev)
166{
144
145 if (change & IFF_ALLMULTI)
146 dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
147 if (change & IFF_PROMISC)
148 dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
149}
150
151static void dsa_slave_set_rx_mode(struct net_device *dev)
152{
167 struct dsa_slave_priv *p = netdev_priv(dev);
168 struct net_device *master = dsa_master_netdev(p);
153 struct net_device *master = dsa_slave_to_master(dev);
169
170 dev_mc_sync(master, dev);
171 dev_uc_sync(master, dev);
172}
173
174static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
175{
154
155 dev_mc_sync(master, dev);
156 dev_uc_sync(master, dev);
157}
158
159static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
160{
176 struct dsa_slave_priv *p = netdev_priv(dev);
177 struct net_device *master = dsa_master_netdev(p);
161 struct net_device *master = dsa_slave_to_master(dev);
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;

--- 64 unchanged lines hidden (view full) ---

250 return -EMSGSIZE;
251}
252
253static int
254dsa_slave_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
255 struct net_device *dev, struct net_device *filter_dev,
256 int *idx)
257{
162 struct sockaddr *addr = a;
163 int err;
164
165 if (!is_valid_ether_addr(addr->sa_data))
166 return -EADDRNOTAVAIL;
167
168 if (!(dev->flags & IFF_UP))
169 goto out;

--- 64 unchanged lines hidden (view full) ---

234 return -EMSGSIZE;
235}
236
237static int
238dsa_slave_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
239 struct net_device *dev, struct net_device *filter_dev,
240 int *idx)
241{
242 struct dsa_port *dp = dsa_slave_to_port(dev);
258 struct dsa_slave_dump_ctx dump = {
259 .dev = dev,
260 .skb = skb,
261 .cb = cb,
262 .idx = *idx,
263 };
243 struct dsa_slave_dump_ctx dump = {
244 .dev = dev,
245 .skb = skb,
246 .cb = cb,
247 .idx = *idx,
248 };
264 struct dsa_slave_priv *p = netdev_priv(dev);
265 struct dsa_port *dp = p->dp;
266 struct dsa_switch *ds = dp->ds;
267 int err;
268
249 int err;
250
269 if (!ds->ops->port_fdb_dump)
270 return -EOPNOTSUPP;
271
272 err = ds->ops->port_fdb_dump(ds, dp->index,
273 dsa_slave_port_fdb_do_dump,
274 &dump);
251 err = dsa_port_fdb_dump(dp, dsa_slave_port_fdb_do_dump, &dump);
275 *idx = dump.idx;
252 *idx = dump.idx;
253
276 return err;
277}
278
279static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
280{
254 return err;
255}
256
257static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
258{
281 struct dsa_slave_priv *p = netdev_priv(dev);
259 if (!dev->phydev)
260 return -ENODEV;
282
261
283 if (p->phy != NULL)
284 return phy_mii_ioctl(p->phy, ifr, cmd);
285
286 return -EOPNOTSUPP;
262 return phy_mii_ioctl(dev->phydev, ifr, cmd);
287}
288
289static int dsa_slave_port_attr_set(struct net_device *dev,
290 const struct switchdev_attr *attr,
291 struct switchdev_trans *trans)
292{
263}
264
265static int dsa_slave_port_attr_set(struct net_device *dev,
266 const struct switchdev_attr *attr,
267 struct switchdev_trans *trans)
268{
293 struct dsa_slave_priv *p = netdev_priv(dev);
294 struct dsa_port *dp = p->dp;
269 struct dsa_port *dp = dsa_slave_to_port(dev);
295 int ret;
296
297 switch (attr->id) {
298 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
299 ret = dsa_port_set_state(dp, attr->u.stp_state, trans);
300 break;
301 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
302 ret = dsa_port_vlan_filtering(dp, attr->u.vlan_filtering,

--- 9 unchanged lines hidden (view full) ---

312
313 return ret;
314}
315
316static int dsa_slave_port_obj_add(struct net_device *dev,
317 const struct switchdev_obj *obj,
318 struct switchdev_trans *trans)
319{
270 int ret;
271
272 switch (attr->id) {
273 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
274 ret = dsa_port_set_state(dp, attr->u.stp_state, trans);
275 break;
276 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
277 ret = dsa_port_vlan_filtering(dp, attr->u.vlan_filtering,

--- 9 unchanged lines hidden (view full) ---

287
288 return ret;
289}
290
291static int dsa_slave_port_obj_add(struct net_device *dev,
292 const struct switchdev_obj *obj,
293 struct switchdev_trans *trans)
294{
320 struct dsa_slave_priv *p = netdev_priv(dev);
321 struct dsa_port *dp = p->dp;
295 struct dsa_port *dp = dsa_slave_to_port(dev);
322 int err;
323
324 /* For the prepare phase, ensure the full set of changes is feasable in
325 * one go in order to signal a failure properly. If an operation is not
326 * supported, return -EOPNOTSUPP.
327 */
328
329 switch (obj->id) {

--- 10 unchanged lines hidden (view full) ---

340 }
341
342 return err;
343}
344
345static int dsa_slave_port_obj_del(struct net_device *dev,
346 const struct switchdev_obj *obj)
347{
296 int err;
297
298 /* For the prepare phase, ensure the full set of changes is feasable in
299 * one go in order to signal a failure properly. If an operation is not
300 * supported, return -EOPNOTSUPP.
301 */
302
303 switch (obj->id) {

--- 10 unchanged lines hidden (view full) ---

314 }
315
316 return err;
317}
318
319static int dsa_slave_port_obj_del(struct net_device *dev,
320 const struct switchdev_obj *obj)
321{
348 struct dsa_slave_priv *p = netdev_priv(dev);
349 struct dsa_port *dp = p->dp;
322 struct dsa_port *dp = dsa_slave_to_port(dev);
350 int err;
351
352 switch (obj->id) {
353 case SWITCHDEV_OBJ_ID_PORT_MDB:
354 err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
355 break;
356 case SWITCHDEV_OBJ_ID_PORT_VLAN:
357 err = dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj));

--- 4 unchanged lines hidden (view full) ---

362 }
363
364 return err;
365}
366
367static int dsa_slave_port_attr_get(struct net_device *dev,
368 struct switchdev_attr *attr)
369{
323 int err;
324
325 switch (obj->id) {
326 case SWITCHDEV_OBJ_ID_PORT_MDB:
327 err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
328 break;
329 case SWITCHDEV_OBJ_ID_PORT_VLAN:
330 err = dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj));

--- 4 unchanged lines hidden (view full) ---

335 }
336
337 return err;
338}
339
340static int dsa_slave_port_attr_get(struct net_device *dev,
341 struct switchdev_attr *attr)
342{
370 struct dsa_slave_priv *p = netdev_priv(dev);
371 struct dsa_switch *ds = p->dp->ds;
343 struct dsa_port *dp = dsa_slave_to_port(dev);
344 struct dsa_switch *ds = dp->ds;
372
373 switch (attr->id) {
374 case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
375 attr->u.ppid.id_len = sizeof(ds->index);
376 memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
377 break;
378 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT:
379 attr->u.brport_flags_support = 0;
380 break;
381 default:
382 return -EOPNOTSUPP;
383 }
384
385 return 0;
386}
387
345
346 switch (attr->id) {
347 case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
348 attr->u.ppid.id_len = sizeof(ds->index);
349 memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
350 break;
351 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT:
352 attr->u.brport_flags_support = 0;
353 break;
354 default:
355 return -EOPNOTSUPP;
356 }
357
358 return 0;
359}
360
388static inline netdev_tx_t dsa_netpoll_send_skb(struct dsa_slave_priv *p,
389 struct sk_buff *skb)
361static inline netdev_tx_t dsa_slave_netpoll_send_skb(struct net_device *dev,
362 struct sk_buff *skb)
390{
391#ifdef CONFIG_NET_POLL_CONTROLLER
363{
364#ifdef CONFIG_NET_POLL_CONTROLLER
365 struct dsa_slave_priv *p = netdev_priv(dev);
366
392 if (p->netpoll)
393 netpoll_send_skb(p->netpoll, skb);
394#else
395 BUG();
396#endif
397 return NETDEV_TX_OK;
398}
399

--- 17 unchanged lines hidden (view full) ---

417 kfree_skb(skb);
418 return NETDEV_TX_OK;
419 }
420
421 /* SKB for netpoll still need to be mangled with the protocol-specific
422 * tag to be successfully transmitted
423 */
424 if (unlikely(netpoll_tx_running(dev)))
367 if (p->netpoll)
368 netpoll_send_skb(p->netpoll, skb);
369#else
370 BUG();
371#endif
372 return NETDEV_TX_OK;
373}
374

--- 17 unchanged lines hidden (view full) ---

392 kfree_skb(skb);
393 return NETDEV_TX_OK;
394 }
395
396 /* SKB for netpoll still need to be mangled with the protocol-specific
397 * tag to be successfully transmitted
398 */
399 if (unlikely(netpoll_tx_running(dev)))
425 return dsa_netpoll_send_skb(p, nskb);
400 return dsa_slave_netpoll_send_skb(dev, nskb);
426
427 /* Queue the SKB for transmission on the parent interface, but
428 * do not modify its EtherType
429 */
401
402 /* Queue the SKB for transmission on the parent interface, but
403 * do not modify its EtherType
404 */
430 nskb->dev = dsa_master_netdev(p);
405 nskb->dev = dsa_slave_to_master(dev);
431 dev_queue_xmit(nskb);
432
433 return NETDEV_TX_OK;
434}
435
436/* ethtool operations *******************************************************/
406 dev_queue_xmit(nskb);
407
408 return NETDEV_TX_OK;
409}
410
411/* ethtool operations *******************************************************/
437static int
438dsa_slave_get_link_ksettings(struct net_device *dev,
439 struct ethtool_link_ksettings *cmd)
440{
441 struct dsa_slave_priv *p = netdev_priv(dev);
442
412
443 if (!p->phy)
444 return -EOPNOTSUPP;
445
446 phy_ethtool_ksettings_get(p->phy, cmd);
447
448 return 0;
449}
450
451static int
452dsa_slave_set_link_ksettings(struct net_device *dev,
453 const struct ethtool_link_ksettings *cmd)
454{
455 struct dsa_slave_priv *p = netdev_priv(dev);
456
457 if (p->phy != NULL)
458 return phy_ethtool_ksettings_set(p->phy, cmd);
459
460 return -EOPNOTSUPP;
461}
462
463static void dsa_slave_get_drvinfo(struct net_device *dev,
464 struct ethtool_drvinfo *drvinfo)
465{
466 strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver));
467 strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
468 strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
469}
470
471static int dsa_slave_get_regs_len(struct net_device *dev)
472{
413static void dsa_slave_get_drvinfo(struct net_device *dev,
414 struct ethtool_drvinfo *drvinfo)
415{
416 strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver));
417 strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
418 strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
419}
420
421static int dsa_slave_get_regs_len(struct net_device *dev)
422{
473 struct dsa_slave_priv *p = netdev_priv(dev);
474 struct dsa_switch *ds = p->dp->ds;
423 struct dsa_port *dp = dsa_slave_to_port(dev);
424 struct dsa_switch *ds = dp->ds;
475
476 if (ds->ops->get_regs_len)
425
426 if (ds->ops->get_regs_len)
477 return ds->ops->get_regs_len(ds, p->dp->index);
427 return ds->ops->get_regs_len(ds, dp->index);
478
479 return -EOPNOTSUPP;
480}
481
482static void
483dsa_slave_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
484{
428
429 return -EOPNOTSUPP;
430}
431
432static void
433dsa_slave_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
434{
485 struct dsa_slave_priv *p = netdev_priv(dev);
486 struct dsa_switch *ds = p->dp->ds;
435 struct dsa_port *dp = dsa_slave_to_port(dev);
436 struct dsa_switch *ds = dp->ds;
487
488 if (ds->ops->get_regs)
437
438 if (ds->ops->get_regs)
489 ds->ops->get_regs(ds, p->dp->index, regs, _p);
439 ds->ops->get_regs(ds, dp->index, regs, _p);
490}
491
440}
441
492static int dsa_slave_nway_reset(struct net_device *dev)
493{
494 struct dsa_slave_priv *p = netdev_priv(dev);
495
496 if (p->phy != NULL)
497 return genphy_restart_aneg(p->phy);
498
499 return -EOPNOTSUPP;
500}
501
502static u32 dsa_slave_get_link(struct net_device *dev)
503{
442static u32 dsa_slave_get_link(struct net_device *dev)
443{
504 struct dsa_slave_priv *p = netdev_priv(dev);
444 if (!dev->phydev)
445 return -ENODEV;
505
446
506 if (p->phy != NULL) {
507 genphy_update_link(p->phy);
508 return p->phy->link;
509 }
447 genphy_update_link(dev->phydev);
510
448
511 return -EOPNOTSUPP;
449 return dev->phydev->link;
512}
513
514static int dsa_slave_get_eeprom_len(struct net_device *dev)
515{
450}
451
452static int dsa_slave_get_eeprom_len(struct net_device *dev)
453{
516 struct dsa_slave_priv *p = netdev_priv(dev);
517 struct dsa_switch *ds = p->dp->ds;
454 struct dsa_port *dp = dsa_slave_to_port(dev);
455 struct dsa_switch *ds = dp->ds;
518
519 if (ds->cd && ds->cd->eeprom_len)
520 return ds->cd->eeprom_len;
521
522 if (ds->ops->get_eeprom_len)
523 return ds->ops->get_eeprom_len(ds);
524
525 return 0;
526}
527
528static int dsa_slave_get_eeprom(struct net_device *dev,
529 struct ethtool_eeprom *eeprom, u8 *data)
530{
456
457 if (ds->cd && ds->cd->eeprom_len)
458 return ds->cd->eeprom_len;
459
460 if (ds->ops->get_eeprom_len)
461 return ds->ops->get_eeprom_len(ds);
462
463 return 0;
464}
465
466static int dsa_slave_get_eeprom(struct net_device *dev,
467 struct ethtool_eeprom *eeprom, u8 *data)
468{
531 struct dsa_slave_priv *p = netdev_priv(dev);
532 struct dsa_switch *ds = p->dp->ds;
469 struct dsa_port *dp = dsa_slave_to_port(dev);
470 struct dsa_switch *ds = dp->ds;
533
534 if (ds->ops->get_eeprom)
535 return ds->ops->get_eeprom(ds, eeprom, data);
536
537 return -EOPNOTSUPP;
538}
539
540static int dsa_slave_set_eeprom(struct net_device *dev,
541 struct ethtool_eeprom *eeprom, u8 *data)
542{
471
472 if (ds->ops->get_eeprom)
473 return ds->ops->get_eeprom(ds, eeprom, data);
474
475 return -EOPNOTSUPP;
476}
477
478static int dsa_slave_set_eeprom(struct net_device *dev,
479 struct ethtool_eeprom *eeprom, u8 *data)
480{
543 struct dsa_slave_priv *p = netdev_priv(dev);
544 struct dsa_switch *ds = p->dp->ds;
481 struct dsa_port *dp = dsa_slave_to_port(dev);
482 struct dsa_switch *ds = dp->ds;
545
546 if (ds->ops->set_eeprom)
547 return ds->ops->set_eeprom(ds, eeprom, data);
548
549 return -EOPNOTSUPP;
550}
551
552static void dsa_slave_get_strings(struct net_device *dev,
553 uint32_t stringset, uint8_t *data)
554{
483
484 if (ds->ops->set_eeprom)
485 return ds->ops->set_eeprom(ds, eeprom, data);
486
487 return -EOPNOTSUPP;
488}
489
490static void dsa_slave_get_strings(struct net_device *dev,
491 uint32_t stringset, uint8_t *data)
492{
555 struct dsa_slave_priv *p = netdev_priv(dev);
556 struct dsa_switch *ds = p->dp->ds;
493 struct dsa_port *dp = dsa_slave_to_port(dev);
494 struct dsa_switch *ds = dp->ds;
557
558 if (stringset == ETH_SS_STATS) {
559 int len = ETH_GSTRING_LEN;
560
561 strncpy(data, "tx_packets", len);
562 strncpy(data + len, "tx_bytes", len);
563 strncpy(data + 2 * len, "rx_packets", len);
564 strncpy(data + 3 * len, "rx_bytes", len);
565 if (ds->ops->get_strings)
495
496 if (stringset == ETH_SS_STATS) {
497 int len = ETH_GSTRING_LEN;
498
499 strncpy(data, "tx_packets", len);
500 strncpy(data + len, "tx_bytes", len);
501 strncpy(data + 2 * len, "rx_packets", len);
502 strncpy(data + 3 * len, "rx_bytes", len);
503 if (ds->ops->get_strings)
566 ds->ops->get_strings(ds, p->dp->index, data + 4 * len);
504 ds->ops->get_strings(ds, dp->index, data + 4 * len);
567 }
568}
569
505 }
506}
507
570static void dsa_cpu_port_get_ethtool_stats(struct net_device *dev,
571 struct ethtool_stats *stats,
572 uint64_t *data)
573{
574 struct dsa_switch_tree *dst = dev->dsa_ptr;
575 struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
576 struct dsa_switch *ds = cpu_dp->ds;
577 s8 cpu_port = cpu_dp->index;
578 int count = 0;
579
580 if (cpu_dp->ethtool_ops.get_sset_count) {
581 count = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);
582 cpu_dp->ethtool_ops.get_ethtool_stats(dev, stats, data);
583 }
584
585 if (ds->ops->get_ethtool_stats)
586 ds->ops->get_ethtool_stats(ds, cpu_port, data + count);
587}
588
589static int dsa_cpu_port_get_sset_count(struct net_device *dev, int sset)
590{
591 struct dsa_switch_tree *dst = dev->dsa_ptr;
592 struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
593 struct dsa_switch *ds = cpu_dp->ds;
594 int count = 0;
595
596 if (cpu_dp->ethtool_ops.get_sset_count)
597 count += cpu_dp->ethtool_ops.get_sset_count(dev, sset);
598
599 if (sset == ETH_SS_STATS && ds->ops->get_sset_count)
600 count += ds->ops->get_sset_count(ds);
601
602 return count;
603}
604
605static void dsa_cpu_port_get_strings(struct net_device *dev,
606 uint32_t stringset, uint8_t *data)
607{
608 struct dsa_switch_tree *dst = dev->dsa_ptr;
609 struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
610 struct dsa_switch *ds = cpu_dp->ds;
611 s8 cpu_port = cpu_dp->index;
612 int len = ETH_GSTRING_LEN;
613 int mcount = 0, count;
614 unsigned int i;
615 uint8_t pfx[4];
616 uint8_t *ndata;
617
618 snprintf(pfx, sizeof(pfx), "p%.2d", cpu_port);
619 /* We do not want to be NULL-terminated, since this is a prefix */
620 pfx[sizeof(pfx) - 1] = '_';
621
622 if (cpu_dp->ethtool_ops.get_sset_count) {
623 mcount = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);
624 cpu_dp->ethtool_ops.get_strings(dev, stringset, data);
625 }
626
627 if (stringset == ETH_SS_STATS && ds->ops->get_strings) {
628 ndata = data + mcount * len;
629 /* This function copies ETH_GSTRINGS_LEN bytes, we will mangle
630 * the output after to prepend our CPU port prefix we
631 * constructed earlier
632 */
633 ds->ops->get_strings(ds, cpu_port, ndata);
634 count = ds->ops->get_sset_count(ds);
635 for (i = 0; i < count; i++) {
636 memmove(ndata + (i * len + sizeof(pfx)),
637 ndata + i * len, len - sizeof(pfx));
638 memcpy(ndata + i * len, pfx, sizeof(pfx));
639 }
640 }
641}
642
643static void dsa_slave_get_ethtool_stats(struct net_device *dev,
644 struct ethtool_stats *stats,
645 uint64_t *data)
646{
508static void dsa_slave_get_ethtool_stats(struct net_device *dev,
509 struct ethtool_stats *stats,
510 uint64_t *data)
511{
512 struct dsa_port *dp = dsa_slave_to_port(dev);
647 struct dsa_slave_priv *p = netdev_priv(dev);
513 struct dsa_slave_priv *p = netdev_priv(dev);
648 struct dsa_switch *ds = p->dp->ds;
514 struct dsa_switch *ds = dp->ds;
649 struct pcpu_sw_netstats *s;
650 unsigned int start;
651 int i;
652
653 for_each_possible_cpu(i) {
654 u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
655
656 s = per_cpu_ptr(p->stats64, i);

--- 5 unchanged lines hidden (view full) ---

662 rx_bytes = s->rx_bytes;
663 } while (u64_stats_fetch_retry_irq(&s->syncp, start));
664 data[0] += tx_packets;
665 data[1] += tx_bytes;
666 data[2] += rx_packets;
667 data[3] += rx_bytes;
668 }
669 if (ds->ops->get_ethtool_stats)
515 struct pcpu_sw_netstats *s;
516 unsigned int start;
517 int i;
518
519 for_each_possible_cpu(i) {
520 u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
521
522 s = per_cpu_ptr(p->stats64, i);

--- 5 unchanged lines hidden (view full) ---

528 rx_bytes = s->rx_bytes;
529 } while (u64_stats_fetch_retry_irq(&s->syncp, start));
530 data[0] += tx_packets;
531 data[1] += tx_bytes;
532 data[2] += rx_packets;
533 data[3] += rx_bytes;
534 }
535 if (ds->ops->get_ethtool_stats)
670 ds->ops->get_ethtool_stats(ds, p->dp->index, data + 4);
536 ds->ops->get_ethtool_stats(ds, dp->index, data + 4);
671}
672
673static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
674{
537}
538
539static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
540{
675 struct dsa_slave_priv *p = netdev_priv(dev);
676 struct dsa_switch *ds = p->dp->ds;
541 struct dsa_port *dp = dsa_slave_to_port(dev);
542 struct dsa_switch *ds = dp->ds;
677
678 if (sset == ETH_SS_STATS) {
679 int count;
680
681 count = 4;
682 if (ds->ops->get_sset_count)
683 count += ds->ops->get_sset_count(ds);
684
685 return count;
686 }
687
688 return -EOPNOTSUPP;
689}
690
691static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
692{
543
544 if (sset == ETH_SS_STATS) {
545 int count;
546
547 count = 4;
548 if (ds->ops->get_sset_count)
549 count += ds->ops->get_sset_count(ds);
550
551 return count;
552 }
553
554 return -EOPNOTSUPP;
555}
556
557static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
558{
693 struct dsa_slave_priv *p = netdev_priv(dev);
694 struct dsa_switch *ds = p->dp->ds;
559 struct dsa_port *dp = dsa_slave_to_port(dev);
560 struct dsa_switch *ds = dp->ds;
695
696 if (ds->ops->get_wol)
561
562 if (ds->ops->get_wol)
697 ds->ops->get_wol(ds, p->dp->index, w);
563 ds->ops->get_wol(ds, dp->index, w);
698}
699
700static int dsa_slave_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
701{
564}
565
566static int dsa_slave_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
567{
702 struct dsa_slave_priv *p = netdev_priv(dev);
703 struct dsa_switch *ds = p->dp->ds;
568 struct dsa_port *dp = dsa_slave_to_port(dev);
569 struct dsa_switch *ds = dp->ds;
704 int ret = -EOPNOTSUPP;
705
706 if (ds->ops->set_wol)
570 int ret = -EOPNOTSUPP;
571
572 if (ds->ops->set_wol)
707 ret = ds->ops->set_wol(ds, p->dp->index, w);
573 ret = ds->ops->set_wol(ds, dp->index, w);
708
709 return ret;
710}
711
712static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
713{
574
575 return ret;
576}
577
578static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
579{
714 struct dsa_slave_priv *p = netdev_priv(dev);
715 struct dsa_switch *ds = p->dp->ds;
580 struct dsa_port *dp = dsa_slave_to_port(dev);
581 struct dsa_switch *ds = dp->ds;
716 int ret;
717
718 /* Port's PHY and MAC both need to be EEE capable */
582 int ret;
583
584 /* Port's PHY and MAC both need to be EEE capable */
719 if (!p->phy)
585 if (!dev->phydev)
720 return -ENODEV;
721
722 if (!ds->ops->set_mac_eee)
723 return -EOPNOTSUPP;
724
586 return -ENODEV;
587
588 if (!ds->ops->set_mac_eee)
589 return -EOPNOTSUPP;
590
725 ret = ds->ops->set_mac_eee(ds, p->dp->index, e);
591 ret = ds->ops->set_mac_eee(ds, dp->index, e);
726 if (ret)
727 return ret;
728
729 if (e->eee_enabled) {
592 if (ret)
593 return ret;
594
595 if (e->eee_enabled) {
730 ret = phy_init_eee(p->phy, 0);
596 ret = phy_init_eee(dev->phydev, 0);
731 if (ret)
732 return ret;
733 }
734
597 if (ret)
598 return ret;
599 }
600
735 return phy_ethtool_set_eee(p->phy, e);
601 return phy_ethtool_set_eee(dev->phydev, e);
736}
737
738static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
739{
602}
603
604static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
605{
740 struct dsa_slave_priv *p = netdev_priv(dev);
741 struct dsa_switch *ds = p->dp->ds;
606 struct dsa_port *dp = dsa_slave_to_port(dev);
607 struct dsa_switch *ds = dp->ds;
742 int ret;
743
744 /* Port's PHY and MAC both need to be EEE capable */
608 int ret;
609
610 /* Port's PHY and MAC both need to be EEE capable */
745 if (!p->phy)
611 if (!dev->phydev)
746 return -ENODEV;
747
748 if (!ds->ops->get_mac_eee)
749 return -EOPNOTSUPP;
750
612 return -ENODEV;
613
614 if (!ds->ops->get_mac_eee)
615 return -EOPNOTSUPP;
616
751 ret = ds->ops->get_mac_eee(ds, p->dp->index, e);
617 ret = ds->ops->get_mac_eee(ds, dp->index, e);
752 if (ret)
753 return ret;
754
618 if (ret)
619 return ret;
620
755 return phy_ethtool_get_eee(p->phy, e);
621 return phy_ethtool_get_eee(dev->phydev, e);
756}
757
758#ifdef CONFIG_NET_POLL_CONTROLLER
759static int dsa_slave_netpoll_setup(struct net_device *dev,
760 struct netpoll_info *ni)
761{
622}
623
624#ifdef CONFIG_NET_POLL_CONTROLLER
625static int dsa_slave_netpoll_setup(struct net_device *dev,
626 struct netpoll_info *ni)
627{
628 struct net_device *master = dsa_slave_to_master(dev);
762 struct dsa_slave_priv *p = netdev_priv(dev);
629 struct dsa_slave_priv *p = netdev_priv(dev);
763 struct net_device *master = dsa_master_netdev(p);
764 struct netpoll *netpoll;
765 int err = 0;
766
767 netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
768 if (!netpoll)
769 return -ENOMEM;
770
771 err = __netpoll_setup(netpoll, master);

--- 23 unchanged lines hidden (view full) ---

795static void dsa_slave_poll_controller(struct net_device *dev)
796{
797}
798#endif
799
800static int dsa_slave_get_phys_port_name(struct net_device *dev,
801 char *name, size_t len)
802{
630 struct netpoll *netpoll;
631 int err = 0;
632
633 netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
634 if (!netpoll)
635 return -ENOMEM;
636
637 err = __netpoll_setup(netpoll, master);

--- 23 unchanged lines hidden (view full) ---

661static void dsa_slave_poll_controller(struct net_device *dev)
662{
663}
664#endif
665
666static int dsa_slave_get_phys_port_name(struct net_device *dev,
667 char *name, size_t len)
668{
803 struct dsa_slave_priv *p = netdev_priv(dev);
669 struct dsa_port *dp = dsa_slave_to_port(dev);
804
670
805 if (snprintf(name, len, "p%d", p->dp->index) >= len)
671 if (snprintf(name, len, "p%d", dp->index) >= len)
806 return -EINVAL;
807
808 return 0;
809}
810
811static struct dsa_mall_tc_entry *
672 return -EINVAL;
673
674 return 0;
675}
676
677static struct dsa_mall_tc_entry *
812dsa_slave_mall_tc_entry_find(struct dsa_slave_priv *p,
813 unsigned long cookie)
678dsa_slave_mall_tc_entry_find(struct net_device *dev, unsigned long cookie)
814{
679{
680 struct dsa_slave_priv *p = netdev_priv(dev);
815 struct dsa_mall_tc_entry *mall_tc_entry;
816
817 list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list)
818 if (mall_tc_entry->cookie == cookie)
819 return mall_tc_entry;
820
821 return NULL;
822}
823
824static int dsa_slave_add_cls_matchall(struct net_device *dev,
825 struct tc_cls_matchall_offload *cls,
826 bool ingress)
827{
681 struct dsa_mall_tc_entry *mall_tc_entry;
682
683 list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list)
684 if (mall_tc_entry->cookie == cookie)
685 return mall_tc_entry;
686
687 return NULL;
688}
689
690static int dsa_slave_add_cls_matchall(struct net_device *dev,
691 struct tc_cls_matchall_offload *cls,
692 bool ingress)
693{
694 struct dsa_port *dp = dsa_slave_to_port(dev);
828 struct dsa_slave_priv *p = netdev_priv(dev);
829 struct dsa_mall_tc_entry *mall_tc_entry;
830 __be16 protocol = cls->common.protocol;
695 struct dsa_slave_priv *p = netdev_priv(dev);
696 struct dsa_mall_tc_entry *mall_tc_entry;
697 __be16 protocol = cls->common.protocol;
831 struct dsa_switch *ds = p->dp->ds;
832 struct net *net = dev_net(dev);
698 struct net *net = dev_net(dev);
833 struct dsa_slave_priv *to_p;
699 struct dsa_switch *ds = dp->ds;
834 struct net_device *to_dev;
835 const struct tc_action *a;
700 struct net_device *to_dev;
701 const struct tc_action *a;
702 struct dsa_port *to_dp;
836 int err = -EOPNOTSUPP;
837 LIST_HEAD(actions);
838 int ifindex;
839
840 if (!ds->ops->port_mirror_add)
841 return err;
842
843 if (!tcf_exts_has_one_action(cls->exts))

--- 16 unchanged lines hidden (view full) ---

860 mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
861 if (!mall_tc_entry)
862 return -ENOMEM;
863
864 mall_tc_entry->cookie = cls->cookie;
865 mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
866 mirror = &mall_tc_entry->mirror;
867
703 int err = -EOPNOTSUPP;
704 LIST_HEAD(actions);
705 int ifindex;
706
707 if (!ds->ops->port_mirror_add)
708 return err;
709
710 if (!tcf_exts_has_one_action(cls->exts))

--- 16 unchanged lines hidden (view full) ---

727 mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
728 if (!mall_tc_entry)
729 return -ENOMEM;
730
731 mall_tc_entry->cookie = cls->cookie;
732 mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
733 mirror = &mall_tc_entry->mirror;
734
868 to_p = netdev_priv(to_dev);
735 to_dp = dsa_slave_to_port(to_dev);
869
736
870 mirror->to_local_port = to_p->dp->index;
737 mirror->to_local_port = to_dp->index;
871 mirror->ingress = ingress;
872
738 mirror->ingress = ingress;
739
873 err = ds->ops->port_mirror_add(ds, p->dp->index, mirror,
874 ingress);
740 err = ds->ops->port_mirror_add(ds, dp->index, mirror, ingress);
875 if (err) {
876 kfree(mall_tc_entry);
877 return err;
878 }
879
880 list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);
881 }
882
883 return 0;
884}
885
886static void dsa_slave_del_cls_matchall(struct net_device *dev,
887 struct tc_cls_matchall_offload *cls)
888{
741 if (err) {
742 kfree(mall_tc_entry);
743 return err;
744 }
745
746 list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);
747 }
748
749 return 0;
750}
751
752static void dsa_slave_del_cls_matchall(struct net_device *dev,
753 struct tc_cls_matchall_offload *cls)
754{
889 struct dsa_slave_priv *p = netdev_priv(dev);
755 struct dsa_port *dp = dsa_slave_to_port(dev);
890 struct dsa_mall_tc_entry *mall_tc_entry;
756 struct dsa_mall_tc_entry *mall_tc_entry;
891 struct dsa_switch *ds = p->dp->ds;
757 struct dsa_switch *ds = dp->ds;
892
893 if (!ds->ops->port_mirror_del)
894 return;
895
758
759 if (!ds->ops->port_mirror_del)
760 return;
761
896 mall_tc_entry = dsa_slave_mall_tc_entry_find(p, cls->cookie);
762 mall_tc_entry = dsa_slave_mall_tc_entry_find(dev, cls->cookie);
897 if (!mall_tc_entry)
898 return;
899
900 list_del(&mall_tc_entry->list);
901
902 switch (mall_tc_entry->type) {
903 case DSA_PORT_MALL_MIRROR:
763 if (!mall_tc_entry)
764 return;
765
766 list_del(&mall_tc_entry->list);
767
768 switch (mall_tc_entry->type) {
769 case DSA_PORT_MALL_MIRROR:
904 ds->ops->port_mirror_del(ds, p->dp->index,
905 &mall_tc_entry->mirror);
770 ds->ops->port_mirror_del(ds, dp->index, &mall_tc_entry->mirror);
906 break;
907 default:
908 WARN_ON(1);
909 }
910
911 kfree(mall_tc_entry);
912}
913
914static int dsa_slave_setup_tc_cls_matchall(struct net_device *dev,
771 break;
772 default:
773 WARN_ON(1);
774 }
775
776 kfree(mall_tc_entry);
777}
778
779static int dsa_slave_setup_tc_cls_matchall(struct net_device *dev,
915 struct tc_cls_matchall_offload *cls)
780 struct tc_cls_matchall_offload *cls,
781 bool ingress)
916{
782{
917 bool ingress;
918
919 if (is_classid_clsact_ingress(cls->common.classid))
920 ingress = true;
921 else if (is_classid_clsact_egress(cls->common.classid))
922 ingress = false;
923 else
924 return -EOPNOTSUPP;
925
926 if (cls->common.chain_index)
927 return -EOPNOTSUPP;
928
929 switch (cls->command) {
930 case TC_CLSMATCHALL_REPLACE:
931 return dsa_slave_add_cls_matchall(dev, cls, ingress);
932 case TC_CLSMATCHALL_DESTROY:
933 dsa_slave_del_cls_matchall(dev, cls);
934 return 0;
935 default:
936 return -EOPNOTSUPP;
937 }
938}
939
783 if (cls->common.chain_index)
784 return -EOPNOTSUPP;
785
786 switch (cls->command) {
787 case TC_CLSMATCHALL_REPLACE:
788 return dsa_slave_add_cls_matchall(dev, cls, ingress);
789 case TC_CLSMATCHALL_DESTROY:
790 dsa_slave_del_cls_matchall(dev, cls);
791 return 0;
792 default:
793 return -EOPNOTSUPP;
794 }
795}
796
797static int dsa_slave_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
798 void *cb_priv, bool ingress)
799{
800 struct net_device *dev = cb_priv;
801
802 if (!tc_can_offload(dev))
803 return -EOPNOTSUPP;
804
805 switch (type) {
806 case TC_SETUP_CLSMATCHALL:
807 return dsa_slave_setup_tc_cls_matchall(dev, type_data, ingress);
808 default:
809 return -EOPNOTSUPP;
810 }
811}
812
813static int dsa_slave_setup_tc_block_cb_ig(enum tc_setup_type type,
814 void *type_data, void *cb_priv)
815{
816 return dsa_slave_setup_tc_block_cb(type, type_data, cb_priv, true);
817}
818
819static int dsa_slave_setup_tc_block_cb_eg(enum tc_setup_type type,
820 void *type_data, void *cb_priv)
821{
822 return dsa_slave_setup_tc_block_cb(type, type_data, cb_priv, false);
823}
824
825static int dsa_slave_setup_tc_block(struct net_device *dev,
826 struct tc_block_offload *f)
827{
828 tc_setup_cb_t *cb;
829
830 if (f->binder_type == TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
831 cb = dsa_slave_setup_tc_block_cb_ig;
832 else if (f->binder_type == TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS)
833 cb = dsa_slave_setup_tc_block_cb_eg;
834 else
835 return -EOPNOTSUPP;
836
837 switch (f->command) {
838 case TC_BLOCK_BIND:
839 return tcf_block_cb_register(f->block, cb, dev, dev);
840 case TC_BLOCK_UNBIND:
841 tcf_block_cb_unregister(f->block, cb, dev);
842 return 0;
843 default:
844 return -EOPNOTSUPP;
845 }
846}
847
940static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type,
941 void *type_data)
942{
943 switch (type) {
848static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type,
849 void *type_data)
850{
851 switch (type) {
944 case TC_SETUP_CLSMATCHALL:
945 return dsa_slave_setup_tc_cls_matchall(dev, type_data);
852 case TC_SETUP_BLOCK:
853 return dsa_slave_setup_tc_block(dev, type_data);
946 default:
947 return -EOPNOTSUPP;
948 }
949}
950
951static void dsa_slave_get_stats64(struct net_device *dev,
952 struct rtnl_link_stats64 *stats)
953{

--- 17 unchanged lines hidden (view full) ---

971
972 stats->tx_packets += tx_packets;
973 stats->tx_bytes += tx_bytes;
974 stats->rx_packets += rx_packets;
975 stats->rx_bytes += rx_bytes;
976 }
977}
978
854 default:
855 return -EOPNOTSUPP;
856 }
857}
858
859static void dsa_slave_get_stats64(struct net_device *dev,
860 struct rtnl_link_stats64 *stats)
861{

--- 17 unchanged lines hidden (view full) ---

879
880 stats->tx_packets += tx_packets;
881 stats->tx_bytes += tx_bytes;
882 stats->rx_packets += rx_packets;
883 stats->rx_bytes += rx_bytes;
884 }
885}
886
979void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops)
980{
981 ops->get_sset_count = dsa_cpu_port_get_sset_count;
982 ops->get_ethtool_stats = dsa_cpu_port_get_ethtool_stats;
983 ops->get_strings = dsa_cpu_port_get_strings;
984}
985
986static int dsa_slave_get_rxnfc(struct net_device *dev,
987 struct ethtool_rxnfc *nfc, u32 *rule_locs)
988{
887static int dsa_slave_get_rxnfc(struct net_device *dev,
888 struct ethtool_rxnfc *nfc, u32 *rule_locs)
889{
989 struct dsa_slave_priv *p = netdev_priv(dev);
990 struct dsa_switch *ds = p->dp->ds;
890 struct dsa_port *dp = dsa_slave_to_port(dev);
891 struct dsa_switch *ds = dp->ds;
991
992 if (!ds->ops->get_rxnfc)
993 return -EOPNOTSUPP;
994
892
893 if (!ds->ops->get_rxnfc)
894 return -EOPNOTSUPP;
895
995 return ds->ops->get_rxnfc(ds, p->dp->index, nfc, rule_locs);
896 return ds->ops->get_rxnfc(ds, dp->index, nfc, rule_locs);
996}
997
998static int dsa_slave_set_rxnfc(struct net_device *dev,
999 struct ethtool_rxnfc *nfc)
1000{
897}
898
899static int dsa_slave_set_rxnfc(struct net_device *dev,
900 struct ethtool_rxnfc *nfc)
901{
1001 struct dsa_slave_priv *p = netdev_priv(dev);
1002 struct dsa_switch *ds = p->dp->ds;
902 struct dsa_port *dp = dsa_slave_to_port(dev);
903 struct dsa_switch *ds = dp->ds;
1003
1004 if (!ds->ops->set_rxnfc)
1005 return -EOPNOTSUPP;
1006
904
905 if (!ds->ops->set_rxnfc)
906 return -EOPNOTSUPP;
907
1007 return ds->ops->set_rxnfc(ds, p->dp->index, nfc);
908 return ds->ops->set_rxnfc(ds, dp->index, nfc);
1008}
1009
1010static const struct ethtool_ops dsa_slave_ethtool_ops = {
1011 .get_drvinfo = dsa_slave_get_drvinfo,
1012 .get_regs_len = dsa_slave_get_regs_len,
1013 .get_regs = dsa_slave_get_regs,
909}
910
911static const struct ethtool_ops dsa_slave_ethtool_ops = {
912 .get_drvinfo = dsa_slave_get_drvinfo,
913 .get_regs_len = dsa_slave_get_regs_len,
914 .get_regs = dsa_slave_get_regs,
1014 .nway_reset = dsa_slave_nway_reset,
915 .nway_reset = phy_ethtool_nway_reset,
1015 .get_link = dsa_slave_get_link,
1016 .get_eeprom_len = dsa_slave_get_eeprom_len,
1017 .get_eeprom = dsa_slave_get_eeprom,
1018 .set_eeprom = dsa_slave_set_eeprom,
1019 .get_strings = dsa_slave_get_strings,
1020 .get_ethtool_stats = dsa_slave_get_ethtool_stats,
1021 .get_sset_count = dsa_slave_get_sset_count,
1022 .set_wol = dsa_slave_set_wol,
1023 .get_wol = dsa_slave_get_wol,
1024 .set_eee = dsa_slave_set_eee,
1025 .get_eee = dsa_slave_get_eee,
916 .get_link = dsa_slave_get_link,
917 .get_eeprom_len = dsa_slave_get_eeprom_len,
918 .get_eeprom = dsa_slave_get_eeprom,
919 .set_eeprom = dsa_slave_set_eeprom,
920 .get_strings = dsa_slave_get_strings,
921 .get_ethtool_stats = dsa_slave_get_ethtool_stats,
922 .get_sset_count = dsa_slave_get_sset_count,
923 .set_wol = dsa_slave_set_wol,
924 .get_wol = dsa_slave_get_wol,
925 .set_eee = dsa_slave_set_eee,
926 .get_eee = dsa_slave_get_eee,
1026 .get_link_ksettings = dsa_slave_get_link_ksettings,
1027 .set_link_ksettings = dsa_slave_set_link_ksettings,
927 .get_link_ksettings = phy_ethtool_get_link_ksettings,
928 .set_link_ksettings = phy_ethtool_set_link_ksettings,
1028 .get_rxnfc = dsa_slave_get_rxnfc,
1029 .set_rxnfc = dsa_slave_set_rxnfc,
1030};
1031
1032static const struct net_device_ops dsa_slave_netdev_ops = {
1033 .ndo_open = dsa_slave_open,
1034 .ndo_stop = dsa_slave_close,
1035 .ndo_start_xmit = dsa_slave_xmit,

--- 23 unchanged lines hidden (view full) ---

1059};
1060
1061static struct device_type dsa_type = {
1062 .name = "dsa",
1063};
1064
1065static void dsa_slave_adjust_link(struct net_device *dev)
1066{
929 .get_rxnfc = dsa_slave_get_rxnfc,
930 .set_rxnfc = dsa_slave_set_rxnfc,
931};
932
933static const struct net_device_ops dsa_slave_netdev_ops = {
934 .ndo_open = dsa_slave_open,
935 .ndo_stop = dsa_slave_close,
936 .ndo_start_xmit = dsa_slave_xmit,

--- 23 unchanged lines hidden (view full) ---

960};
961
962static struct device_type dsa_type = {
963 .name = "dsa",
964};
965
966static void dsa_slave_adjust_link(struct net_device *dev)
967{
968 struct dsa_port *dp = dsa_slave_to_port(dev);
1067 struct dsa_slave_priv *p = netdev_priv(dev);
969 struct dsa_slave_priv *p = netdev_priv(dev);
1068 struct dsa_switch *ds = p->dp->ds;
970 struct dsa_switch *ds = dp->ds;
1069 unsigned int status_changed = 0;
1070
971 unsigned int status_changed = 0;
972
1071 if (p->old_link != p->phy->link) {
973 if (p->old_link != dev->phydev->link) {
1072 status_changed = 1;
974 status_changed = 1;
1073 p->old_link = p->phy->link;
975 p->old_link = dev->phydev->link;
1074 }
1075
976 }
977
1076 if (p->old_duplex != p->phy->duplex) {
978 if (p->old_duplex != dev->phydev->duplex) {
1077 status_changed = 1;
979 status_changed = 1;
1078 p->old_duplex = p->phy->duplex;
980 p->old_duplex = dev->phydev->duplex;
1079 }
1080
981 }
982
1081 if (p->old_pause != p->phy->pause) {
983 if (p->old_pause != dev->phydev->pause) {
1082 status_changed = 1;
984 status_changed = 1;
1083 p->old_pause = p->phy->pause;
985 p->old_pause = dev->phydev->pause;
1084 }
1085
1086 if (ds->ops->adjust_link && status_changed)
986 }
987
988 if (ds->ops->adjust_link && status_changed)
1087 ds->ops->adjust_link(ds, p->dp->index, p->phy);
989 ds->ops->adjust_link(ds, dp->index, dev->phydev);
1088
1089 if (status_changed)
990
991 if (status_changed)
1090 phy_print_status(p->phy);
992 phy_print_status(dev->phydev);
1091}
1092
1093static int dsa_slave_fixed_link_update(struct net_device *dev,
1094 struct fixed_phy_status *status)
1095{
993}
994
995static int dsa_slave_fixed_link_update(struct net_device *dev,
996 struct fixed_phy_status *status)
997{
1096 struct dsa_slave_priv *p;
1097 struct dsa_switch *ds;
998 struct dsa_switch *ds;
999 struct dsa_port *dp;
1098
1099 if (dev) {
1000
1001 if (dev) {
1100 p = netdev_priv(dev);
1101 ds = p->dp->ds;
1002 dp = dsa_slave_to_port(dev);
1003 ds = dp->ds;
1102 if (ds->ops->fixed_link_update)
1004 if (ds->ops->fixed_link_update)
1103 ds->ops->fixed_link_update(ds, p->dp->index, status);
1005 ds->ops->fixed_link_update(ds, dp->index, status);
1104 }
1105
1106 return 0;
1107}
1108
1109/* slave device setup *******************************************************/
1006 }
1007
1008 return 0;
1009}
1010
1011/* slave device setup *******************************************************/
1110static int dsa_slave_phy_connect(struct dsa_slave_priv *p,
1111 struct net_device *slave_dev,
1112 int addr)
1012static int dsa_slave_phy_connect(struct net_device *slave_dev, int addr)
1113{
1013{
1114 struct dsa_switch *ds = p->dp->ds;
1014 struct dsa_port *dp = dsa_slave_to_port(slave_dev);
1015 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1016 struct dsa_switch *ds = dp->ds;
1115
1017
1116 p->phy = mdiobus_get_phy(ds->slave_mii_bus, addr);
1117 if (!p->phy) {
1018 slave_dev->phydev = mdiobus_get_phy(ds->slave_mii_bus, addr);
1019 if (!slave_dev->phydev) {
1118 netdev_err(slave_dev, "no phy at %d\n", addr);
1119 return -ENODEV;
1120 }
1121
1122 /* Use already configured phy mode */
1123 if (p->phy_interface == PHY_INTERFACE_MODE_NA)
1020 netdev_err(slave_dev, "no phy at %d\n", addr);
1021 return -ENODEV;
1022 }
1023
1024 /* Use already configured phy mode */
1025 if (p->phy_interface == PHY_INTERFACE_MODE_NA)
1124 p->phy_interface = p->phy->interface;
1125 return phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link,
1126 p->phy_interface);
1026 p->phy_interface = slave_dev->phydev->interface;
1027
1028 return phy_connect_direct(slave_dev, slave_dev->phydev,
1029 dsa_slave_adjust_link, p->phy_interface);
1127}
1128
1030}
1031
1129static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1130 struct net_device *slave_dev)
1032static int dsa_slave_phy_setup(struct net_device *slave_dev)
1131{
1033{
1132 struct dsa_switch *ds = p->dp->ds;
1133 struct device_node *phy_dn, *port_dn;
1034 struct dsa_port *dp = dsa_slave_to_port(slave_dev);
1035 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1036 struct device_node *port_dn = dp->dn;
1037 struct dsa_switch *ds = dp->ds;
1038 struct device_node *phy_dn;
1134 bool phy_is_fixed = false;
1135 u32 phy_flags = 0;
1136 int mode, ret;
1137
1039 bool phy_is_fixed = false;
1040 u32 phy_flags = 0;
1041 int mode, ret;
1042
1138 port_dn = p->dp->dn;
1139 mode = of_get_phy_mode(port_dn);
1140 if (mode < 0)
1141 mode = PHY_INTERFACE_MODE_NA;
1142 p->phy_interface = mode;
1143
1144 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1145 if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1146 /* In the case of a fixed PHY, the DT node associated

--- 4 unchanged lines hidden (view full) ---

1151 netdev_err(slave_dev, "failed to register fixed PHY: %d\n", ret);
1152 return ret;
1153 }
1154 phy_is_fixed = true;
1155 phy_dn = of_node_get(port_dn);
1156 }
1157
1158 if (ds->ops->get_phy_flags)
1043 mode = of_get_phy_mode(port_dn);
1044 if (mode < 0)
1045 mode = PHY_INTERFACE_MODE_NA;
1046 p->phy_interface = mode;
1047
1048 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1049 if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1050 /* In the case of a fixed PHY, the DT node associated

--- 4 unchanged lines hidden (view full) ---

1055 netdev_err(slave_dev, "failed to register fixed PHY: %d\n", ret);
1056 return ret;
1057 }
1058 phy_is_fixed = true;
1059 phy_dn = of_node_get(port_dn);
1060 }
1061
1062 if (ds->ops->get_phy_flags)
1159 phy_flags = ds->ops->get_phy_flags(ds, p->dp->index);
1063 phy_flags = ds->ops->get_phy_flags(ds, dp->index);
1160
1161 if (phy_dn) {
1064
1065 if (phy_dn) {
1162 int phy_id = of_mdio_parse_addr(&slave_dev->dev, phy_dn);
1163
1164 /* If this PHY address is part of phys_mii_mask, which means
1165 * that we need to divert reads and writes to/from it, then we
1166 * want to bind this device using the slave MII bus created by
1167 * DSA to make that happen.
1168 */
1169 if (!phy_is_fixed && phy_id >= 0 &&
1170 (ds->phys_mii_mask & (1 << phy_id))) {
1171 ret = dsa_slave_phy_connect(p, slave_dev, phy_id);
1172 if (ret) {
1173 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret);
1174 of_node_put(phy_dn);
1175 return ret;
1176 }
1177 } else {
1178 p->phy = of_phy_connect(slave_dev, phy_dn,
1179 dsa_slave_adjust_link,
1180 phy_flags,
1181 p->phy_interface);
1182 }
1183
1066 slave_dev->phydev = of_phy_connect(slave_dev, phy_dn,
1067 dsa_slave_adjust_link,
1068 phy_flags,
1069 p->phy_interface);
1184 of_node_put(phy_dn);
1185 }
1186
1070 of_node_put(phy_dn);
1071 }
1072
1187 if (p->phy && phy_is_fixed)
1188 fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);
1073 if (slave_dev->phydev && phy_is_fixed)
1074 fixed_phy_set_link_update(slave_dev->phydev,
1075 dsa_slave_fixed_link_update);
1189
1190 /* We could not connect to a designated PHY, so use the switch internal
1191 * MDIO bus instead
1192 */
1076
1077 /* We could not connect to a designated PHY, so use the switch internal
1078 * MDIO bus instead
1079 */
1193 if (!p->phy) {
1194 ret = dsa_slave_phy_connect(p, slave_dev, p->dp->index);
1080 if (!slave_dev->phydev) {
1081 ret = dsa_slave_phy_connect(slave_dev, dp->index);
1195 if (ret) {
1196 netdev_err(slave_dev, "failed to connect to port %d: %d\n",
1082 if (ret) {
1083 netdev_err(slave_dev, "failed to connect to port %d: %d\n",
1197 p->dp->index, ret);
1084 dp->index, ret);
1198 if (phy_is_fixed)
1199 of_phy_deregister_fixed_link(port_dn);
1200 return ret;
1201 }
1202 }
1203
1085 if (phy_is_fixed)
1086 of_phy_deregister_fixed_link(port_dn);
1087 return ret;
1088 }
1089 }
1090
1204 phy_attached_info(p->phy);
1091 phy_attached_info(slave_dev->phydev);
1205
1206 return 0;
1207}
1208
1209static struct lock_class_key dsa_slave_netdev_xmit_lock_key;
1210static void dsa_slave_set_lockdep_class_one(struct net_device *dev,
1211 struct netdev_queue *txq,
1212 void *_unused)
1213{
1214 lockdep_set_class(&txq->_xmit_lock,
1215 &dsa_slave_netdev_xmit_lock_key);
1216}
1217
1218int dsa_slave_suspend(struct net_device *slave_dev)
1219{
1220 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1221
1222 netif_device_detach(slave_dev);
1223
1092
1093 return 0;
1094}
1095
1096static struct lock_class_key dsa_slave_netdev_xmit_lock_key;
1097static void dsa_slave_set_lockdep_class_one(struct net_device *dev,
1098 struct netdev_queue *txq,
1099 void *_unused)
1100{
1101 lockdep_set_class(&txq->_xmit_lock,
1102 &dsa_slave_netdev_xmit_lock_key);
1103}
1104
1105int dsa_slave_suspend(struct net_device *slave_dev)
1106{
1107 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1108
1109 netif_device_detach(slave_dev);
1110
1224 if (p->phy) {
1225 phy_stop(p->phy);
1111 if (slave_dev->phydev) {
1112 phy_stop(slave_dev->phydev);
1226 p->old_pause = -1;
1227 p->old_link = -1;
1228 p->old_duplex = -1;
1113 p->old_pause = -1;
1114 p->old_link = -1;
1115 p->old_duplex = -1;
1229 phy_suspend(p->phy);
1116 phy_suspend(slave_dev->phydev);
1230 }
1231
1232 return 0;
1233}
1234
1235int dsa_slave_resume(struct net_device *slave_dev)
1236{
1117 }
1118
1119 return 0;
1120}
1121
1122int dsa_slave_resume(struct net_device *slave_dev)
1123{
1237 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1238
1239 netif_device_attach(slave_dev);
1240
1124 netif_device_attach(slave_dev);
1125
1241 if (p->phy) {
1242 phy_resume(p->phy);
1243 phy_start(p->phy);
1126 if (slave_dev->phydev) {
1127 phy_resume(slave_dev->phydev);
1128 phy_start(slave_dev->phydev);
1244 }
1245
1246 return 0;
1247}
1248
1129 }
1130
1131 return 0;
1132}
1133
1249int dsa_slave_create(struct dsa_port *port, const char *name)
1134static void dsa_slave_notify(struct net_device *dev, unsigned long val)
1250{
1135{
1136 struct net_device *master = dsa_slave_to_master(dev);
1137 struct dsa_port *dp = dsa_slave_to_port(dev);
1138 struct dsa_notifier_register_info rinfo = {
1139 .switch_number = dp->ds->index,
1140 .port_number = dp->index,
1141 .master = master,
1142 .info.dev = dev,
1143 };
1144
1145 call_dsa_notifiers(val, dev, &rinfo.info);
1146}
1147
1148int dsa_slave_create(struct dsa_port *port)
1149{
1150 struct dsa_port *cpu_dp = port->cpu_dp;
1151 struct net_device *master = cpu_dp->master;
1251 struct dsa_switch *ds = port->ds;
1152 struct dsa_switch *ds = port->ds;
1252 struct dsa_switch_tree *dst = ds->dst;
1253 struct net_device *master;
1153 const char *name = port->name;
1254 struct net_device *slave_dev;
1255 struct dsa_slave_priv *p;
1154 struct net_device *slave_dev;
1155 struct dsa_slave_priv *p;
1256 struct dsa_port *cpu_dp;
1257 int ret;
1258
1156 int ret;
1157
1259 cpu_dp = ds->dst->cpu_dp;
1260 master = cpu_dp->netdev;
1261
1262 if (!ds->num_tx_queues)
1263 ds->num_tx_queues = 1;
1264
1265 slave_dev = alloc_netdev_mqs(sizeof(struct dsa_slave_priv), name,
1266 NET_NAME_UNKNOWN, ether_setup,
1267 ds->num_tx_queues, 1);
1268 if (slave_dev == NULL)
1269 return -ENOMEM;

--- 19 unchanged lines hidden (view full) ---

1289 p = netdev_priv(slave_dev);
1290 p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
1291 if (!p->stats64) {
1292 free_netdev(slave_dev);
1293 return -ENOMEM;
1294 }
1295 p->dp = port;
1296 INIT_LIST_HEAD(&p->mall_tc_list);
1158 if (!ds->num_tx_queues)
1159 ds->num_tx_queues = 1;
1160
1161 slave_dev = alloc_netdev_mqs(sizeof(struct dsa_slave_priv), name,
1162 NET_NAME_UNKNOWN, ether_setup,
1163 ds->num_tx_queues, 1);
1164 if (slave_dev == NULL)
1165 return -ENOMEM;

--- 19 unchanged lines hidden (view full) ---

1185 p = netdev_priv(slave_dev);
1186 p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
1187 if (!p->stats64) {
1188 free_netdev(slave_dev);
1189 return -ENOMEM;
1190 }
1191 p->dp = port;
1192 INIT_LIST_HEAD(&p->mall_tc_list);
1297 p->xmit = dst->tag_ops->xmit;
1193 p->xmit = cpu_dp->tag_ops->xmit;
1298
1299 p->old_pause = -1;
1300 p->old_link = -1;
1301 p->old_duplex = -1;
1302
1194
1195 p->old_pause = -1;
1196 p->old_link = -1;
1197 p->old_duplex = -1;
1198
1303 port->netdev = slave_dev;
1199 port->slave = slave_dev;
1304
1305 netif_carrier_off(slave_dev);
1306
1200
1201 netif_carrier_off(slave_dev);
1202
1307 ret = dsa_slave_phy_setup(p, slave_dev);
1203 ret = dsa_slave_phy_setup(slave_dev);
1308 if (ret) {
1309 netdev_err(master, "error %d setting up slave phy\n", ret);
1310 goto out_free;
1311 }
1312
1204 if (ret) {
1205 netdev_err(master, "error %d setting up slave phy\n", ret);
1206 goto out_free;
1207 }
1208
1209 dsa_slave_notify(slave_dev, DSA_PORT_REGISTER);
1210
1313 ret = register_netdev(slave_dev);
1314 if (ret) {
1315 netdev_err(master, "error %d registering interface %s\n",
1316 ret, slave_dev->name);
1317 goto out_phy;
1318 }
1319
1320 return 0;
1321
1322out_phy:
1211 ret = register_netdev(slave_dev);
1212 if (ret) {
1213 netdev_err(master, "error %d registering interface %s\n",
1214 ret, slave_dev->name);
1215 goto out_phy;
1216 }
1217
1218 return 0;
1219
1220out_phy:
1323 phy_disconnect(p->phy);
1324 if (of_phy_is_fixed_link(p->dp->dn))
1325 of_phy_deregister_fixed_link(p->dp->dn);
1221 phy_disconnect(slave_dev->phydev);
1222 if (of_phy_is_fixed_link(port->dn))
1223 of_phy_deregister_fixed_link(port->dn);
1326out_free:
1327 free_percpu(p->stats64);
1328 free_netdev(slave_dev);
1224out_free:
1225 free_percpu(p->stats64);
1226 free_netdev(slave_dev);
1329 port->netdev = NULL;
1227 port->slave = NULL;
1330 return ret;
1331}
1332
1333void dsa_slave_destroy(struct net_device *slave_dev)
1334{
1228 return ret;
1229}
1230
1231void dsa_slave_destroy(struct net_device *slave_dev)
1232{
1233 struct dsa_port *dp = dsa_slave_to_port(slave_dev);
1335 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1234 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1336 struct device_node *port_dn;
1235 struct device_node *port_dn = dp->dn;
1337
1236
1338 port_dn = p->dp->dn;
1339
1340 netif_carrier_off(slave_dev);
1237 netif_carrier_off(slave_dev);
1341 if (p->phy) {
1342 phy_disconnect(p->phy);
1238 if (slave_dev->phydev) {
1239 phy_disconnect(slave_dev->phydev);
1343
1344 if (of_phy_is_fixed_link(port_dn))
1345 of_phy_deregister_fixed_link(port_dn);
1346 }
1240
1241 if (of_phy_is_fixed_link(port_dn))
1242 of_phy_deregister_fixed_link(port_dn);
1243 }
1244 dsa_slave_notify(slave_dev, DSA_PORT_UNREGISTER);
1347 unregister_netdev(slave_dev);
1348 free_percpu(p->stats64);
1349 free_netdev(slave_dev);
1350}
1351
1352static bool dsa_slave_dev_check(struct net_device *dev)
1353{
1354 return dev->netdev_ops == &dsa_slave_netdev_ops;
1355}
1356
1357static int dsa_slave_changeupper(struct net_device *dev,
1358 struct netdev_notifier_changeupper_info *info)
1359{
1245 unregister_netdev(slave_dev);
1246 free_percpu(p->stats64);
1247 free_netdev(slave_dev);
1248}
1249
1250static bool dsa_slave_dev_check(struct net_device *dev)
1251{
1252 return dev->netdev_ops == &dsa_slave_netdev_ops;
1253}
1254
1255static int dsa_slave_changeupper(struct net_device *dev,
1256 struct netdev_notifier_changeupper_info *info)
1257{
1360 struct dsa_slave_priv *p = netdev_priv(dev);
1361 struct dsa_port *dp = p->dp;
1258 struct dsa_port *dp = dsa_slave_to_port(dev);
1362 int err = NOTIFY_DONE;
1363
1364 if (netif_is_bridge_master(info->upper_dev)) {
1365 if (info->linking) {
1366 err = dsa_port_bridge_join(dp, info->upper_dev);
1367 err = notifier_from_errno(err);
1368 } else {
1369 dsa_port_bridge_leave(dp, info->upper_dev);

--- 4 unchanged lines hidden (view full) ---

1374 return err;
1375}
1376
1377static int dsa_slave_netdevice_event(struct notifier_block *nb,
1378 unsigned long event, void *ptr)
1379{
1380 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1381
1259 int err = NOTIFY_DONE;
1260
1261 if (netif_is_bridge_master(info->upper_dev)) {
1262 if (info->linking) {
1263 err = dsa_port_bridge_join(dp, info->upper_dev);
1264 err = notifier_from_errno(err);
1265 } else {
1266 dsa_port_bridge_leave(dp, info->upper_dev);

--- 4 unchanged lines hidden (view full) ---

1271 return err;
1272}
1273
1274static int dsa_slave_netdevice_event(struct notifier_block *nb,
1275 unsigned long event, void *ptr)
1276{
1277 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1278
1382 if (dev->netdev_ops != &dsa_slave_netdev_ops)
1279 if (!dsa_slave_dev_check(dev))
1383 return NOTIFY_DONE;
1384
1385 if (event == NETDEV_CHANGEUPPER)
1386 return dsa_slave_changeupper(dev, ptr);
1387
1388 return NOTIFY_DONE;
1389}
1390

--- 5 unchanged lines hidden (view full) ---

1396};
1397
1398static void dsa_slave_switchdev_event_work(struct work_struct *work)
1399{
1400 struct dsa_switchdev_event_work *switchdev_work =
1401 container_of(work, struct dsa_switchdev_event_work, work);
1402 struct net_device *dev = switchdev_work->dev;
1403 struct switchdev_notifier_fdb_info *fdb_info;
1280 return NOTIFY_DONE;
1281
1282 if (event == NETDEV_CHANGEUPPER)
1283 return dsa_slave_changeupper(dev, ptr);
1284
1285 return NOTIFY_DONE;
1286}
1287

--- 5 unchanged lines hidden (view full) ---

1293};
1294
1295static void dsa_slave_switchdev_event_work(struct work_struct *work)
1296{
1297 struct dsa_switchdev_event_work *switchdev_work =
1298 container_of(work, struct dsa_switchdev_event_work, work);
1299 struct net_device *dev = switchdev_work->dev;
1300 struct switchdev_notifier_fdb_info *fdb_info;
1404 struct dsa_slave_priv *p = netdev_priv(dev);
1301 struct dsa_port *dp = dsa_slave_to_port(dev);
1405 int err;
1406
1407 rtnl_lock();
1408 switch (switchdev_work->event) {
1409 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1410 fdb_info = &switchdev_work->fdb_info;
1302 int err;
1303
1304 rtnl_lock();
1305 switch (switchdev_work->event) {
1306 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1307 fdb_info = &switchdev_work->fdb_info;
1411 err = dsa_port_fdb_add(p->dp, fdb_info->addr, fdb_info->vid);
1308 err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid);
1412 if (err) {
1413 netdev_dbg(dev, "fdb add failed err=%d\n", err);
1414 break;
1415 }
1416 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, dev,
1417 &fdb_info->info);
1418 break;
1419
1420 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1421 fdb_info = &switchdev_work->fdb_info;
1309 if (err) {
1310 netdev_dbg(dev, "fdb add failed err=%d\n", err);
1311 break;
1312 }
1313 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, dev,
1314 &fdb_info->info);
1315 break;
1316
1317 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1318 fdb_info = &switchdev_work->fdb_info;
1422 err = dsa_port_fdb_del(p->dp, fdb_info->addr, fdb_info->vid);
1319 err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid);
1423 if (err) {
1424 netdev_dbg(dev, "fdb del failed err=%d\n", err);
1425 dev_close(dev);
1426 }
1427 break;
1428 }
1429 rtnl_unlock();
1430

--- 100 unchanged lines hidden ---
1320 if (err) {
1321 netdev_dbg(dev, "fdb del failed err=%d\n", err);
1322 dev_close(dev);
1323 }
1324 break;
1325 }
1326 rtnl_unlock();
1327

--- 100 unchanged lines hidden ---