slave.c 32.6 KB
Newer Older
1 2
/*
 * net/dsa/slave.c - Slave device handling
3
 * Copyright (c) 2008-2009 Marvell Semiconductor
4 5 6 7 8 9 10 11
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#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 17
#include <linux/of_net.h>
#include <linux/of_mdio.h>
18
#include <linux/mdio.h>
19
#include <linux/list.h>
20
#include <net/rtnetlink.h>
21 22
#include <net/pkt_cls.h>
#include <net/tc_act/tc_mirred.h>
23
#include <linux/if_bridge.h>
24
#include <linux/netpoll.h>
25

26 27
#include "dsa_priv.h"

28 29
static bool dsa_slave_dev_check(struct net_device *dev);

30 31 32 33 34
/* slave mii_bus handling ***************************************************/
static int dsa_slave_phy_read(struct mii_bus *bus, int addr, int reg)
{
	struct dsa_switch *ds = bus->priv;

35
	if (ds->phys_mii_mask & (1 << addr))
36
		return ds->ops->phy_read(ds, addr, reg);
37 38 39 40 41 42 43 44

	return 0xffff;
}

static int dsa_slave_phy_write(struct mii_bus *bus, int addr, int reg, u16 val)
{
	struct dsa_switch *ds = bus->priv;

45
	if (ds->phys_mii_mask & (1 << addr))
46
		return ds->ops->phy_write(ds, addr, reg, val);
47 48 49 50 51 52 53 54 55 56

	return 0;
}

void dsa_slave_mii_bus_init(struct dsa_switch *ds)
{
	ds->slave_mii_bus->priv = (void *)ds;
	ds->slave_mii_bus->name = "dsa slave smi";
	ds->slave_mii_bus->read = dsa_slave_phy_read;
	ds->slave_mii_bus->write = dsa_slave_phy_write;
57 58
	snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
		 ds->dst->tree, 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 ****************************************************/
N
Nicolas Dichtel 已提交
65
static int dsa_slave_get_iflink(const struct net_device *dev)
66 67 68
{
	struct dsa_slave_priv *p = netdev_priv(dev);

69
	return dsa_master_netdev(p)->ifindex;
70 71
}

72 73
static int dsa_slave_open(struct net_device *dev)
{
74
	struct dsa_slave_priv *p = netdev_priv(dev);
75 76
	struct dsa_port *dp = p->dp;
	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;
79 80 81 82 83
	int err;

	if (!(master->flags & IFF_UP))
		return -ENETDOWN;

84
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
85
		err = dev_uc_add(master, dev->dev_addr);
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
		if (err < 0)
			goto out;
	}

	if (dev->flags & IFF_ALLMULTI) {
		err = dev_set_allmulti(master, 1);
		if (err < 0)
			goto del_unicast;
	}
	if (dev->flags & IFF_PROMISC) {
		err = dev_set_promiscuity(master, 1);
		if (err < 0)
			goto clear_allmulti;
	}

101
	if (ds->ops->port_enable) {
102
		err = ds->ops->port_enable(ds, p->dp->index, p->phy);
103 104 105 106
		if (err)
			goto clear_promisc;
	}

107
	dsa_port_set_state_now(p->dp, stp_state);
108

109 110 111
	if (p->phy)
		phy_start(p->phy);

112
	return 0;
113

114 115
clear_promisc:
	if (dev->flags & IFF_PROMISC)
116
		dev_set_promiscuity(master, -1);
117 118 119 120
clear_allmulti:
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(master, -1);
del_unicast:
121
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
122
		dev_uc_del(master, dev->dev_addr);
123 124
out:
	return err;
125 126 127 128
}

static int dsa_slave_close(struct net_device *dev)
{
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;
132

133 134 135
	if (p->phy)
		phy_stop(p->phy);

136
	dev_mc_unsync(master, dev);
137
	dev_uc_unsync(master, dev);
138 139 140 141 142
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(master, -1);
	if (dev->flags & IFF_PROMISC)
		dev_set_promiscuity(master, -1);

143
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
144
		dev_uc_del(master, dev->dev_addr);
145

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 152 153 154 155 156
	return 0;
}

static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
157
	struct net_device *master = dsa_master_netdev(p);
158 159 160 161 162 163 164 165 166 167

	if (change & IFF_ALLMULTI)
		dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
	if (change & IFF_PROMISC)
		dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
}

static void dsa_slave_set_rx_mode(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
168
	struct net_device *master = dsa_master_netdev(p);
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 = dsa_master_netdev(p);
178 179 180 181 182 183 184 185 186
	struct sockaddr *addr = a;
	int err;

	if (!is_valid_ether_addr(addr->sa_data))
		return -EADDRNOTAVAIL;

	if (!(dev->flags & IFF_UP))
		goto out;

187
	if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
188
		err = dev_uc_add(master, addr->sa_data);
189 190 191 192
		if (err < 0)
			return err;
	}

193
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
194
		dev_uc_del(master, dev->dev_addr);
195 196

out:
J
Joe Perches 已提交
197
	ether_addr_copy(dev->dev_addr, addr->sa_data);
198 199 200 201 202 203 204 205 206

	return 0;
}

static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	struct dsa_slave_priv *p = netdev_priv(dev);

	if (p->phy != NULL)
207
		return phy_mii_ioctl(p->phy, ifr, cmd);
208 209 210 211

	return -EOPNOTSUPP;
}

212
static int dsa_slave_port_attr_set(struct net_device *dev,
213
				   const struct switchdev_attr *attr,
214
				   struct switchdev_trans *trans)
215
{
216 217
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
218
	int ret;
219 220

	switch (attr->id) {
221
	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
222
		ret = dsa_port_set_state(dp, attr->u.stp_state, trans);
223
		break;
224
	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
225 226
		ret = dsa_port_vlan_filtering(dp, attr->u.vlan_filtering,
					      trans);
227
		break;
228
	case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
229
		ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans);
230
		break;
231 232 233 234 235 236 237 238
	default:
		ret = -EOPNOTSUPP;
		break;
	}

	return ret;
}

239
static int dsa_slave_port_obj_add(struct net_device *dev,
240
				  const struct switchdev_obj *obj,
241
				  struct switchdev_trans *trans)
242
{
243 244
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
245 246 247 248 249 250 251
	int err;

	/* For the prepare phase, ensure the full set of changes is feasable in
	 * one go in order to signal a failure properly. If an operation is not
	 * supported, return -EOPNOTSUPP.
	 */

252
	switch (obj->id) {
253
	case SWITCHDEV_OBJ_ID_PORT_FDB:
254 255 256
		if (switchdev_trans_ph_prepare(trans))
			return 0;
		err = dsa_port_fdb_add(dp, SWITCHDEV_OBJ_PORT_FDB(obj));
257
		break;
V
Vivien Didelot 已提交
258
	case SWITCHDEV_OBJ_ID_PORT_MDB:
259
		err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj), trans);
V
Vivien Didelot 已提交
260
		break;
261
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
262 263
		err = dsa_port_vlan_add(dp, SWITCHDEV_OBJ_PORT_VLAN(obj),
					trans);
264
		break;
265 266 267 268 269 270 271 272 273
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

static int dsa_slave_port_obj_del(struct net_device *dev,
274
				  const struct switchdev_obj *obj)
275
{
276 277
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
278 279
	int err;

280
	switch (obj->id) {
281
	case SWITCHDEV_OBJ_ID_PORT_FDB:
282
		err = dsa_port_fdb_del(dp, SWITCHDEV_OBJ_PORT_FDB(obj));
283
		break;
V
Vivien Didelot 已提交
284
	case SWITCHDEV_OBJ_ID_PORT_MDB:
285
		err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
V
Vivien Didelot 已提交
286
		break;
287
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
288
		err = dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj));
289
		break;
290 291 292 293 294 295 296 297 298
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

static int dsa_slave_port_obj_dump(struct net_device *dev,
299 300
				   struct switchdev_obj *obj,
				   switchdev_obj_dump_cb_t *cb)
301
{
302 303
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
304 305
	int err;

306
	switch (obj->id) {
307
	case SWITCHDEV_OBJ_ID_PORT_FDB:
308
		err = dsa_port_fdb_dump(dp, SWITCHDEV_OBJ_PORT_FDB(obj), cb);
309
		break;
V
Vivien Didelot 已提交
310
	case SWITCHDEV_OBJ_ID_PORT_MDB:
311
		err = dsa_port_mdb_dump(dp, SWITCHDEV_OBJ_PORT_MDB(obj), cb);
V
Vivien Didelot 已提交
312
		break;
313
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
314
		err = dsa_port_vlan_dump(dp, SWITCHDEV_OBJ_PORT_VLAN(obj), cb);
315
		break;
316 317 318 319 320 321 322 323
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

324 325
static int dsa_slave_port_attr_get(struct net_device *dev,
				   struct switchdev_attr *attr)
326 327
{
	struct dsa_slave_priv *p = netdev_priv(dev);
328
	struct dsa_switch *ds = p->dp->ds;
329

330
	switch (attr->id) {
331
	case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
332 333
		attr->u.ppid.id_len = sizeof(ds->index);
		memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
334 335 336 337
		break;
	default:
		return -EOPNOTSUPP;
	}
338 339 340 341

	return 0;
}

342 343 344 345 346 347 348 349 350 351 352 353
static inline netdev_tx_t dsa_netpoll_send_skb(struct dsa_slave_priv *p,
					       struct sk_buff *skb)
{
#ifdef CONFIG_NET_POLL_CONTROLLER
	if (p->netpoll)
		netpoll_send_skb(p->netpoll, skb);
#else
	BUG();
#endif
	return NETDEV_TX_OK;
}

354 355 356
static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
357
	struct pcpu_sw_netstats *s;
358
	struct sk_buff *nskb;
359

360 361 362 363 364
	s = this_cpu_ptr(p->stats64);
	u64_stats_update_begin(&s->syncp);
	s->tx_packets++;
	s->tx_bytes += skb->len;
	u64_stats_update_end(&s->syncp);
365

366 367 368
	/* Transmit function may have to reallocate the original SKB,
	 * in which case it must have freed it. Only free it here on error.
	 */
369
	nskb = p->xmit(skb, dev);
370 371
	if (!nskb) {
		kfree_skb(skb);
372
		return NETDEV_TX_OK;
373
	}
374

375 376 377 378 379 380
	/* SKB for netpoll still need to be mangled with the protocol-specific
	 * tag to be successfully transmitted
	 */
	if (unlikely(netpoll_tx_running(dev)))
		return dsa_netpoll_send_skb(p, nskb);

381 382 383
	/* Queue the SKB for transmission on the parent interface, but
	 * do not modify its EtherType
	 */
384
	nskb->dev = dsa_master_netdev(p);
385
	dev_queue_xmit(nskb);
386 387 388 389

	return NETDEV_TX_OK;
}

390 391
/* ethtool operations *******************************************************/
static int
392 393
dsa_slave_get_link_ksettings(struct net_device *dev,
			     struct ethtool_link_ksettings *cmd)
394 395 396
{
	struct dsa_slave_priv *p = netdev_priv(dev);

397 398
	if (!p->phy)
		return -EOPNOTSUPP;
399

400 401 402
	phy_ethtool_ksettings_get(p->phy, cmd);

	return 0;
403 404 405
}

static int
406 407
dsa_slave_set_link_ksettings(struct net_device *dev,
			     const struct ethtool_link_ksettings *cmd)
408 409 410 411
{
	struct dsa_slave_priv *p = netdev_priv(dev);

	if (p->phy != NULL)
412
		return phy_ethtool_ksettings_set(p->phy, cmd);
413 414 415 416 417 418 419

	return -EOPNOTSUPP;
}

static void dsa_slave_get_drvinfo(struct net_device *dev,
				  struct ethtool_drvinfo *drvinfo)
{
420 421 422
	strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver));
	strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
	strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
423 424
}

425 426 427
static int dsa_slave_get_regs_len(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
428
	struct dsa_switch *ds = p->dp->ds;
429

430
	if (ds->ops->get_regs_len)
431
		return ds->ops->get_regs_len(ds, p->dp->index);
432 433 434 435 436 437 438 439

	return -EOPNOTSUPP;
}

static void
dsa_slave_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
440
	struct dsa_switch *ds = p->dp->ds;
441

442
	if (ds->ops->get_regs)
443
		ds->ops->get_regs(ds, p->dp->index, regs, _p);
444 445
}

446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
static int dsa_slave_nway_reset(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);

	if (p->phy != NULL)
		return genphy_restart_aneg(p->phy);

	return -EOPNOTSUPP;
}

static u32 dsa_slave_get_link(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);

	if (p->phy != NULL) {
		genphy_update_link(p->phy);
		return p->phy->link;
	}

	return -EOPNOTSUPP;
}

468 469 470
static int dsa_slave_get_eeprom_len(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
471
	struct dsa_switch *ds = p->dp->ds;
472

473
	if (ds->cd && ds->cd->eeprom_len)
A
Andrew Lunn 已提交
474
		return ds->cd->eeprom_len;
475

476 477
	if (ds->ops->get_eeprom_len)
		return ds->ops->get_eeprom_len(ds);
478 479 480 481 482 483 484 485

	return 0;
}

static int dsa_slave_get_eeprom(struct net_device *dev,
				struct ethtool_eeprom *eeprom, u8 *data)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
486
	struct dsa_switch *ds = p->dp->ds;
487

488 489
	if (ds->ops->get_eeprom)
		return ds->ops->get_eeprom(ds, eeprom, data);
490 491 492 493 494 495 496 497

	return -EOPNOTSUPP;
}

static int dsa_slave_set_eeprom(struct net_device *dev,
				struct ethtool_eeprom *eeprom, u8 *data)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
498
	struct dsa_switch *ds = p->dp->ds;
499

500 501
	if (ds->ops->set_eeprom)
		return ds->ops->set_eeprom(ds, eeprom, data);
502 503 504 505

	return -EOPNOTSUPP;
}

506 507 508 509
static void dsa_slave_get_strings(struct net_device *dev,
				  uint32_t stringset, uint8_t *data)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
510
	struct dsa_switch *ds = p->dp->ds;
511 512 513 514 515 516 517 518

	if (stringset == ETH_SS_STATS) {
		int len = ETH_GSTRING_LEN;

		strncpy(data, "tx_packets", len);
		strncpy(data + len, "tx_bytes", len);
		strncpy(data + 2 * len, "rx_packets", len);
		strncpy(data + 3 * len, "rx_bytes", len);
519
		if (ds->ops->get_strings)
520
			ds->ops->get_strings(ds, p->dp->index, data + 4 * len);
521 522 523
	}
}

524 525 526 527 528
static void dsa_cpu_port_get_ethtool_stats(struct net_device *dev,
					   struct ethtool_stats *stats,
					   uint64_t *data)
{
	struct dsa_switch_tree *dst = dev->dsa_ptr;
529 530 531
	struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
	struct dsa_switch *ds = cpu_dp->ds;
	s8 cpu_port = cpu_dp->index;
532 533
	int count = 0;

534 535 536
	if (cpu_dp->ethtool_ops.get_sset_count) {
		count = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);
		cpu_dp->ethtool_ops.get_ethtool_stats(dev, stats, data);
537 538
	}

539 540
	if (ds->ops->get_ethtool_stats)
		ds->ops->get_ethtool_stats(ds, cpu_port, data + count);
541 542 543 544 545
}

static int dsa_cpu_port_get_sset_count(struct net_device *dev, int sset)
{
	struct dsa_switch_tree *dst = dev->dsa_ptr;
546 547
	struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
	struct dsa_switch *ds = cpu_dp->ds;
548 549
	int count = 0;

550 551
	if (cpu_dp->ethtool_ops.get_sset_count)
		count += cpu_dp->ethtool_ops.get_sset_count(dev, sset);
552

553 554
	if (sset == ETH_SS_STATS && ds->ops->get_sset_count)
		count += ds->ops->get_sset_count(ds);
555 556 557 558 559 560 561 562

	return count;
}

static void dsa_cpu_port_get_strings(struct net_device *dev,
				     uint32_t stringset, uint8_t *data)
{
	struct dsa_switch_tree *dst = dev->dsa_ptr;
563 564 565
	struct dsa_port *cpu_dp = dsa_get_cpu_port(dst);
	struct dsa_switch *ds = cpu_dp->ds;
	s8 cpu_port = cpu_dp->index;
566 567 568 569 570 571 572 573 574 575
	int len = ETH_GSTRING_LEN;
	int mcount = 0, count;
	unsigned int i;
	uint8_t pfx[4];
	uint8_t *ndata;

	snprintf(pfx, sizeof(pfx), "p%.2d", cpu_port);
	/* We do not want to be NULL-terminated, since this is a prefix */
	pfx[sizeof(pfx) - 1] = '_';

576 577 578
	if (cpu_dp->ethtool_ops.get_sset_count) {
		mcount = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);
		cpu_dp->ethtool_ops.get_strings(dev, stringset, data);
579 580
	}

581
	if (stringset == ETH_SS_STATS && ds->ops->get_strings) {
582 583 584 585 586
		ndata = data + mcount * len;
		/* This function copies ETH_GSTRINGS_LEN bytes, we will mangle
		 * the output after to prepend our CPU port prefix we
		 * constructed earlier
		 */
587 588
		ds->ops->get_strings(ds, cpu_port, ndata);
		count = ds->ops->get_sset_count(ds);
589 590 591 592 593 594 595 596
		for (i = 0; i < count; i++) {
			memmove(ndata + (i * len + sizeof(pfx)),
				ndata + i * len, len - sizeof(pfx));
			memcpy(ndata + i * len, pfx, sizeof(pfx));
		}
	}
}

597 598 599 600 601
static void dsa_slave_get_ethtool_stats(struct net_device *dev,
					struct ethtool_stats *stats,
					uint64_t *data)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
602
	struct dsa_switch *ds = p->dp->ds;
603
	struct pcpu_sw_netstats *s;
604
	unsigned int start;
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
	int i;

	for_each_possible_cpu(i) {
		u64 tx_packets, tx_bytes, rx_packets, rx_bytes;

		s = per_cpu_ptr(p->stats64, i);
		do {
			start = u64_stats_fetch_begin_irq(&s->syncp);
			tx_packets = s->tx_packets;
			tx_bytes = s->tx_bytes;
			rx_packets = s->rx_packets;
			rx_bytes = s->rx_bytes;
		} while (u64_stats_fetch_retry_irq(&s->syncp, start));
		data[0] += tx_packets;
		data[1] += tx_bytes;
		data[2] += rx_packets;
		data[3] += rx_bytes;
	}
623
	if (ds->ops->get_ethtool_stats)
624
		ds->ops->get_ethtool_stats(ds, p->dp->index, data + 4);
625 626 627 628 629
}

static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
630
	struct dsa_switch *ds = p->dp->ds;
631 632 633 634 635

	if (sset == ETH_SS_STATS) {
		int count;

		count = 4;
636 637
		if (ds->ops->get_sset_count)
			count += ds->ops->get_sset_count(ds);
638 639 640 641 642 643 644

		return count;
	}

	return -EOPNOTSUPP;
}

645 646 647
static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
648
	struct dsa_switch *ds = p->dp->ds;
649

650
	if (ds->ops->get_wol)
651
		ds->ops->get_wol(ds, p->dp->index, w);
652 653 654 655 656
}

static int dsa_slave_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
657
	struct dsa_switch *ds = p->dp->ds;
658 659
	int ret = -EOPNOTSUPP;

660
	if (ds->ops->set_wol)
661
		ret = ds->ops->set_wol(ds, p->dp->index, w);
662 663 664 665

	return ret;
}

666 667 668
static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
669
	struct dsa_switch *ds = p->dp->ds;
670 671
	int ret;

672 673 674 675
	/* Port's PHY and MAC both need to be EEE capable */
	if (!p->phy)
		return -ENODEV;

V
Vivien Didelot 已提交
676
	if (!ds->ops->set_mac_eee)
677 678
		return -EOPNOTSUPP;

V
Vivien Didelot 已提交
679
	ret = ds->ops->set_mac_eee(ds, p->dp->index, e);
680 681 682
	if (ret)
		return ret;

683 684 685 686 687 688
	if (e->eee_enabled) {
		ret = phy_init_eee(p->phy, 0);
		if (ret)
			return ret;
	}

689
	return phy_ethtool_set_eee(p->phy, e);
690 691 692 693 694
}

static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
695
	struct dsa_switch *ds = p->dp->ds;
696 697
	int ret;

698 699 700 701
	/* Port's PHY and MAC both need to be EEE capable */
	if (!p->phy)
		return -ENODEV;

V
Vivien Didelot 已提交
702
	if (!ds->ops->get_mac_eee)
703 704
		return -EOPNOTSUPP;

V
Vivien Didelot 已提交
705
	ret = ds->ops->get_mac_eee(ds, p->dp->index, e);
706 707 708
	if (ret)
		return ret;

709
	return phy_ethtool_get_eee(p->phy, e);
710 711
}

712 713 714 715 716
#ifdef CONFIG_NET_POLL_CONTROLLER
static int dsa_slave_netpoll_setup(struct net_device *dev,
				   struct netpoll_info *ni)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
717
	struct net_device *master = dsa_master_netdev(p);
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
	struct netpoll *netpoll;
	int err = 0;

	netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
	if (!netpoll)
		return -ENOMEM;

	err = __netpoll_setup(netpoll, master);
	if (err) {
		kfree(netpoll);
		goto out;
	}

	p->netpoll = netpoll;
out:
	return err;
}

static void dsa_slave_netpoll_cleanup(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct netpoll *netpoll = p->netpoll;

	if (!netpoll)
		return;

	p->netpoll = NULL;

	__netpoll_free_async(netpoll);
}

static void dsa_slave_poll_controller(struct net_device *dev)
{
}
#endif

754 755 756 757 758
static int dsa_slave_get_phys_port_name(struct net_device *dev,
					char *name, size_t len)
{
	struct dsa_slave_priv *p = netdev_priv(dev);

759
	if (snprintf(name, len, "p%d", p->dp->index) >= len)
760
		return -EINVAL;
761 762 763 764

	return 0;
}

765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
static struct dsa_mall_tc_entry *
dsa_slave_mall_tc_entry_find(struct dsa_slave_priv *p,
			     unsigned long cookie)
{
	struct dsa_mall_tc_entry *mall_tc_entry;

	list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list)
		if (mall_tc_entry->cookie == cookie)
			return mall_tc_entry;

	return NULL;
}

static int dsa_slave_add_cls_matchall(struct net_device *dev,
				      struct tc_cls_matchall_offload *cls,
				      bool ingress)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_mall_tc_entry *mall_tc_entry;
784
	__be16 protocol = cls->common.protocol;
785 786 787 788 789 790 791 792 793 794 795 796
	struct dsa_switch *ds = p->dp->ds;
	struct net *net = dev_net(dev);
	struct dsa_slave_priv *to_p;
	struct net_device *to_dev;
	const struct tc_action *a;
	int err = -EOPNOTSUPP;
	LIST_HEAD(actions);
	int ifindex;

	if (!ds->ops->port_mirror_add)
		return err;

797
	if (!tcf_exts_has_one_action(cls->exts))
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
		return err;

	tcf_exts_to_list(cls->exts, &actions);
	a = list_first_entry(&actions, struct tc_action, list);

	if (is_tcf_mirred_egress_mirror(a) && protocol == htons(ETH_P_ALL)) {
		struct dsa_mall_mirror_tc_entry *mirror;

		ifindex = tcf_mirred_ifindex(a);
		to_dev = __dev_get_by_index(net, ifindex);
		if (!to_dev)
			return -EINVAL;

		if (!dsa_slave_dev_check(to_dev))
			return -EOPNOTSUPP;

		mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
		if (!mall_tc_entry)
			return -ENOMEM;

		mall_tc_entry->cookie = cls->cookie;
		mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
		mirror = &mall_tc_entry->mirror;

		to_p = netdev_priv(to_dev);

		mirror->to_local_port = to_p->dp->index;
		mirror->ingress = ingress;

		err = ds->ops->port_mirror_add(ds, p->dp->index, mirror,
					       ingress);
		if (err) {
			kfree(mall_tc_entry);
			return err;
		}

		list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);
	}

	return 0;
}

static void dsa_slave_del_cls_matchall(struct net_device *dev,
				       struct tc_cls_matchall_offload *cls)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_mall_tc_entry *mall_tc_entry;
	struct dsa_switch *ds = p->dp->ds;

	if (!ds->ops->port_mirror_del)
		return;

	mall_tc_entry = dsa_slave_mall_tc_entry_find(p, cls->cookie);
	if (!mall_tc_entry)
		return;

	list_del(&mall_tc_entry->list);

	switch (mall_tc_entry->type) {
	case DSA_PORT_MALL_MIRROR:
		ds->ops->port_mirror_del(ds, p->dp->index,
					 &mall_tc_entry->mirror);
		break;
	default:
		WARN_ON(1);
	}

	kfree(mall_tc_entry);
}

868 869
static int dsa_slave_setup_tc_cls_matchall(struct net_device *dev,
					   struct tc_cls_matchall_offload *cls)
870
{
871
	bool ingress = TC_H_MAJ(cls->common.handle) == TC_H_MAJ(TC_H_INGRESS);
872

873
	if (cls->common.chain_index)
874
		return -EOPNOTSUPP;
875

876 877
	switch (cls->command) {
	case TC_CLSMATCHALL_REPLACE:
878
		return dsa_slave_add_cls_matchall(dev, cls, ingress);
879 880 881 882 883 884 885 886 887
	case TC_CLSMATCHALL_DESTROY:
		dsa_slave_del_cls_matchall(dev, cls);
		return 0;
	default:
		return -EOPNOTSUPP;
	}
}

static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type,
888
			      void *type_data)
889
{
890
	switch (type) {
891
	case TC_SETUP_CLSMATCHALL:
892
		return dsa_slave_setup_tc_cls_matchall(dev, type_data);
893
	default:
894
		return -EOPNOTSUPP;
895 896 897
	}
}

898 899 900 901
static void dsa_slave_get_stats64(struct net_device *dev,
				  struct rtnl_link_stats64 *stats)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
902
	struct pcpu_sw_netstats *s;
903
	unsigned int start;
904
	int i;
905 906

	netdev_stats_to_stats64(stats, &dev->stats);
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923
	for_each_possible_cpu(i) {
		u64 tx_packets, tx_bytes, rx_packets, rx_bytes;

		s = per_cpu_ptr(p->stats64, i);
		do {
			start = u64_stats_fetch_begin_irq(&s->syncp);
			tx_packets = s->tx_packets;
			tx_bytes = s->tx_bytes;
			rx_packets = s->rx_packets;
			rx_bytes = s->rx_bytes;
		} while (u64_stats_fetch_retry_irq(&s->syncp, start));

		stats->tx_packets += tx_packets;
		stats->tx_bytes += tx_bytes;
		stats->rx_packets += rx_packets;
		stats->rx_bytes += rx_bytes;
	}
924 925
}

926 927 928 929 930 931 932
void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops)
{
	ops->get_sset_count = dsa_cpu_port_get_sset_count;
	ops->get_ethtool_stats = dsa_cpu_port_get_ethtool_stats;
	ops->get_strings = dsa_cpu_port_get_strings;
}

933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
static int dsa_slave_get_rxnfc(struct net_device *dev,
			       struct ethtool_rxnfc *nfc, u32 *rule_locs)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_switch *ds = p->dp->ds;

	if (!ds->ops->get_rxnfc)
		return -EOPNOTSUPP;

	return ds->ops->get_rxnfc(ds, p->dp->index, nfc, rule_locs);
}

static int dsa_slave_set_rxnfc(struct net_device *dev,
			       struct ethtool_rxnfc *nfc)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_switch *ds = p->dp->ds;

	if (!ds->ops->set_rxnfc)
		return -EOPNOTSUPP;

	return ds->ops->set_rxnfc(ds, p->dp->index, nfc);
}

957 958
static const struct ethtool_ops dsa_slave_ethtool_ops = {
	.get_drvinfo		= dsa_slave_get_drvinfo,
959 960
	.get_regs_len		= dsa_slave_get_regs_len,
	.get_regs		= dsa_slave_get_regs,
961 962
	.nway_reset		= dsa_slave_nway_reset,
	.get_link		= dsa_slave_get_link,
963 964 965
	.get_eeprom_len		= dsa_slave_get_eeprom_len,
	.get_eeprom		= dsa_slave_get_eeprom,
	.set_eeprom		= dsa_slave_set_eeprom,
966 967 968
	.get_strings		= dsa_slave_get_strings,
	.get_ethtool_stats	= dsa_slave_get_ethtool_stats,
	.get_sset_count		= dsa_slave_get_sset_count,
969 970
	.set_wol		= dsa_slave_set_wol,
	.get_wol		= dsa_slave_get_wol,
971 972
	.set_eee		= dsa_slave_set_eee,
	.get_eee		= dsa_slave_get_eee,
973 974
	.get_link_ksettings	= dsa_slave_get_link_ksettings,
	.set_link_ksettings	= dsa_slave_set_link_ksettings,
975 976
	.get_rxnfc		= dsa_slave_get_rxnfc,
	.set_rxnfc		= dsa_slave_set_rxnfc,
977 978
};

979
static const struct net_device_ops dsa_slave_netdev_ops = {
980 981
	.ndo_open	 	= dsa_slave_open,
	.ndo_stop		= dsa_slave_close,
982
	.ndo_start_xmit		= dsa_slave_xmit,
983 984 985
	.ndo_change_rx_flags	= dsa_slave_change_rx_flags,
	.ndo_set_rx_mode	= dsa_slave_set_rx_mode,
	.ndo_set_mac_address	= dsa_slave_set_mac_address,
986 987 988
	.ndo_fdb_add		= switchdev_port_fdb_add,
	.ndo_fdb_del		= switchdev_port_fdb_del,
	.ndo_fdb_dump		= switchdev_port_fdb_dump,
989
	.ndo_do_ioctl		= dsa_slave_ioctl,
N
Nicolas Dichtel 已提交
990
	.ndo_get_iflink		= dsa_slave_get_iflink,
991 992 993 994 995
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_netpoll_setup	= dsa_slave_netpoll_setup,
	.ndo_netpoll_cleanup	= dsa_slave_netpoll_cleanup,
	.ndo_poll_controller	= dsa_slave_poll_controller,
#endif
996 997 998
	.ndo_bridge_getlink	= switchdev_port_bridge_getlink,
	.ndo_bridge_setlink	= switchdev_port_bridge_setlink,
	.ndo_bridge_dellink	= switchdev_port_bridge_dellink,
999
	.ndo_get_phys_port_name	= dsa_slave_get_phys_port_name,
1000
	.ndo_setup_tc		= dsa_slave_setup_tc,
1001
	.ndo_get_stats64	= dsa_slave_get_stats64,
S
Scott Feldman 已提交
1002 1003
};

J
Jiri Pirko 已提交
1004
static const struct switchdev_ops dsa_slave_switchdev_ops = {
1005
	.switchdev_port_attr_get	= dsa_slave_port_attr_get,
1006
	.switchdev_port_attr_set	= dsa_slave_port_attr_set,
1007 1008 1009
	.switchdev_port_obj_add		= dsa_slave_port_obj_add,
	.switchdev_port_obj_del		= dsa_slave_port_obj_del,
	.switchdev_port_obj_dump	= dsa_slave_port_obj_dump,
1010
};
1011

1012 1013 1014 1015
static struct device_type dsa_type = {
	.name	= "dsa",
};

1016 1017 1018
static void dsa_slave_adjust_link(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
1019
	struct dsa_switch *ds = p->dp->ds;
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
	unsigned int status_changed = 0;

	if (p->old_link != p->phy->link) {
		status_changed = 1;
		p->old_link = p->phy->link;
	}

	if (p->old_duplex != p->phy->duplex) {
		status_changed = 1;
		p->old_duplex = p->phy->duplex;
	}

	if (p->old_pause != p->phy->pause) {
		status_changed = 1;
		p->old_pause = p->phy->pause;
	}

1037
	if (ds->ops->adjust_link && status_changed)
1038
		ds->ops->adjust_link(ds, p->dp->index, p->phy);
1039

1040 1041 1042 1043
	if (status_changed)
		phy_print_status(p->phy);
}

1044 1045 1046
static int dsa_slave_fixed_link_update(struct net_device *dev,
				       struct fixed_phy_status *status)
{
1047 1048 1049 1050 1051
	struct dsa_slave_priv *p;
	struct dsa_switch *ds;

	if (dev) {
		p = netdev_priv(dev);
1052
		ds = p->dp->ds;
1053
		if (ds->ops->fixed_link_update)
1054
			ds->ops->fixed_link_update(ds, p->dp->index, status);
1055
	}
1056 1057 1058 1059

	return 0;
}

1060
/* slave device setup *******************************************************/
1061
static int dsa_slave_phy_connect(struct dsa_slave_priv *p,
1062 1063
				 struct net_device *slave_dev,
				 int addr)
1064
{
1065
	struct dsa_switch *ds = p->dp->ds;
1066

1067
	p->phy = mdiobus_get_phy(ds->slave_mii_bus, addr);
R
Russell King 已提交
1068 1069
	if (!p->phy) {
		netdev_err(slave_dev, "no phy at %d\n", addr);
1070
		return -ENODEV;
R
Russell King 已提交
1071
	}
1072 1073

	/* Use already configured phy mode */
1074 1075
	if (p->phy_interface == PHY_INTERFACE_MODE_NA)
		p->phy_interface = p->phy->interface;
1076 1077
	return phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link,
				  p->phy_interface);
1078 1079
}

1080
static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1081 1082
				struct net_device *slave_dev)
{
1083
	struct dsa_switch *ds = p->dp->ds;
1084
	struct device_node *phy_dn, *port_dn;
1085
	bool phy_is_fixed = false;
1086
	u32 phy_flags = 0;
1087
	int mode, ret;
1088

1089
	port_dn = p->dp->dn;
1090 1091 1092 1093
	mode = of_get_phy_mode(port_dn);
	if (mode < 0)
		mode = PHY_INTERFACE_MODE_NA;
	p->phy_interface = mode;
1094 1095

	phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1096
	if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1097 1098 1099 1100 1101
		/* In the case of a fixed PHY, the DT node associated
		 * to the fixed PHY is the Port DT node
		 */
		ret = of_phy_register_fixed_link(port_dn);
		if (ret) {
R
Russell King 已提交
1102
			netdev_err(slave_dev, "failed to register fixed PHY: %d\n", ret);
1103
			return ret;
1104
		}
1105
		phy_is_fixed = true;
1106
		phy_dn = of_node_get(port_dn);
1107 1108
	}

1109
	if (ds->ops->get_phy_flags)
1110
		phy_flags = ds->ops->get_phy_flags(ds, p->dp->index);
1111

1112
	if (phy_dn) {
R
Russell King 已提交
1113 1114
		int phy_id = of_mdio_parse_addr(&slave_dev->dev, phy_dn);

1115 1116 1117 1118 1119
		/* If this PHY address is part of phys_mii_mask, which means
		 * that we need to divert reads and writes to/from it, then we
		 * want to bind this device using the slave MII bus created by
		 * DSA to make that happen.
		 */
R
Russell King 已提交
1120 1121 1122 1123 1124
		if (!phy_is_fixed && phy_id >= 0 &&
		    (ds->phys_mii_mask & (1 << phy_id))) {
			ret = dsa_slave_phy_connect(p, slave_dev, phy_id);
			if (ret) {
				netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret);
1125
				of_node_put(phy_dn);
1126
				return ret;
R
Russell King 已提交
1127
			}
1128 1129 1130 1131 1132 1133
		} else {
			p->phy = of_phy_connect(slave_dev, phy_dn,
						dsa_slave_adjust_link,
						phy_flags,
						p->phy_interface);
		}
1134 1135

		of_node_put(phy_dn);
1136
	}
1137

1138 1139 1140
	if (p->phy && phy_is_fixed)
		fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);

1141 1142 1143
	/* We could not connect to a designated PHY, so use the switch internal
	 * MDIO bus instead
	 */
1144
	if (!p->phy) {
1145
		ret = dsa_slave_phy_connect(p, slave_dev, p->dp->index);
R
Russell King 已提交
1146
		if (ret) {
1147 1148
			netdev_err(slave_dev, "failed to connect to port %d: %d\n",
				   p->dp->index, ret);
1149 1150
			if (phy_is_fixed)
				of_phy_deregister_fixed_link(port_dn);
1151
			return ret;
R
Russell King 已提交
1152
		}
1153
	}
1154

1155 1156
	phy_attached_info(p->phy);

1157
	return 0;
1158 1159
}

1160 1161 1162 1163 1164 1165 1166 1167 1168
static struct lock_class_key dsa_slave_netdev_xmit_lock_key;
static void dsa_slave_set_lockdep_class_one(struct net_device *dev,
					    struct netdev_queue *txq,
					    void *_unused)
{
	lockdep_set_class(&txq->_xmit_lock,
			  &dsa_slave_netdev_xmit_lock_key);
}

1169 1170 1171 1172
int dsa_slave_suspend(struct net_device *slave_dev)
{
	struct dsa_slave_priv *p = netdev_priv(slave_dev);

1173 1174
	netif_device_detach(slave_dev);

1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
	if (p->phy) {
		phy_stop(p->phy);
		p->old_pause = -1;
		p->old_link = -1;
		p->old_duplex = -1;
		phy_suspend(p->phy);
	}

	return 0;
}

int dsa_slave_resume(struct net_device *slave_dev)
{
	struct dsa_slave_priv *p = netdev_priv(slave_dev);

	netif_device_attach(slave_dev);

	if (p->phy) {
		phy_resume(p->phy);
		phy_start(p->phy);
	}

	return 0;
}

1200
int dsa_slave_create(struct dsa_port *port, const char *name)
1201
{
1202
	struct dsa_switch *ds = port->ds;
1203
	struct dsa_switch_tree *dst = ds->dst;
1204
	struct net_device *master;
1205 1206
	struct net_device *slave_dev;
	struct dsa_slave_priv *p;
1207
	struct dsa_port *cpu_dp;
1208 1209
	int ret;

1210 1211
	cpu_dp = ds->dst->cpu_dp;
	master = cpu_dp->netdev;
1212

1213 1214
	slave_dev = alloc_netdev(sizeof(struct dsa_slave_priv), name,
				 NET_NAME_UNKNOWN, ether_setup);
1215
	if (slave_dev == NULL)
1216
		return -ENOMEM;
1217

1218 1219
	slave_dev->features = master->vlan_features | NETIF_F_HW_TC;
	slave_dev->hw_features |= NETIF_F_HW_TC;
1220
	slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
1221
	eth_hw_addr_inherit(slave_dev, master);
1222
	slave_dev->priv_flags |= IFF_NO_QUEUE;
1223
	slave_dev->netdev_ops = &dsa_slave_netdev_ops;
J
Jiri Pirko 已提交
1224
	slave_dev->switchdev_ops = &dsa_slave_switchdev_ops;
1225 1226
	slave_dev->min_mtu = 0;
	slave_dev->max_mtu = ETH_MAX_MTU;
1227
	SET_NETDEV_DEVTYPE(slave_dev, &dsa_type);
1228

1229 1230 1231
	netdev_for_each_tx_queue(slave_dev, dsa_slave_set_lockdep_class_one,
				 NULL);

1232 1233
	SET_NETDEV_DEV(slave_dev, port->ds->dev);
	slave_dev->dev.of_node = port->dn;
1234 1235 1236
	slave_dev->vlan_features = master->vlan_features;

	p = netdev_priv(slave_dev);
1237 1238 1239 1240 1241
	p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
	if (!p->stats64) {
		free_netdev(slave_dev);
		return -ENOMEM;
	}
1242
	p->dp = port;
1243
	INIT_LIST_HEAD(&p->mall_tc_list);
1244
	p->xmit = dst->tag_ops->xmit;
1245

1246 1247 1248 1249
	p->old_pause = -1;
	p->old_link = -1;
	p->old_duplex = -1;

1250
	port->netdev = slave_dev;
1251 1252
	ret = register_netdev(slave_dev);
	if (ret) {
1253 1254
		netdev_err(master, "error %d registering interface %s\n",
			   ret, slave_dev->name);
1255
		port->netdev = NULL;
1256
		free_percpu(p->stats64);
1257
		free_netdev(slave_dev);
1258
		return ret;
1259 1260 1261 1262
	}

	netif_carrier_off(slave_dev);

A
Andrew Lunn 已提交
1263 1264 1265
	ret = dsa_slave_phy_setup(p, slave_dev);
	if (ret) {
		netdev_err(master, "error %d setting up slave phy\n", ret);
1266
		unregister_netdev(slave_dev);
1267
		free_percpu(p->stats64);
A
Andrew Lunn 已提交
1268 1269 1270 1271
		free_netdev(slave_dev);
		return ret;
	}

1272
	return 0;
1273
}
1274

1275 1276 1277
void dsa_slave_destroy(struct net_device *slave_dev)
{
	struct dsa_slave_priv *p = netdev_priv(slave_dev);
1278 1279
	struct device_node *port_dn;

1280
	port_dn = p->dp->dn;
1281 1282

	netif_carrier_off(slave_dev);
1283
	if (p->phy) {
1284
		phy_disconnect(p->phy);
1285 1286 1287 1288

		if (of_phy_is_fixed_link(port_dn))
			of_phy_deregister_fixed_link(port_dn);
	}
1289
	unregister_netdev(slave_dev);
1290
	free_percpu(p->stats64);
1291 1292 1293
	free_netdev(slave_dev);
}

1294 1295 1296 1297 1298
static bool dsa_slave_dev_check(struct net_device *dev)
{
	return dev->netdev_ops == &dsa_slave_netdev_ops;
}

1299 1300
static int dsa_slave_changeupper(struct net_device *dev,
				 struct netdev_notifier_changeupper_info *info)
1301
{
1302 1303
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
1304
	int err = NOTIFY_DONE;
1305

1306 1307
	if (netif_is_bridge_master(info->upper_dev)) {
		if (info->linking) {
1308
			err = dsa_port_bridge_join(dp, info->upper_dev);
1309 1310
			err = notifier_from_errno(err);
		} else {
1311
			dsa_port_bridge_leave(dp, info->upper_dev);
1312
			err = NOTIFY_OK;
1313 1314
		}
	}
1315

1316
	return err;
1317
}
1318

1319 1320
static int dsa_slave_netdevice_event(struct notifier_block *nb,
				     unsigned long event, void *ptr)
1321 1322 1323
{
	struct net_device *dev = netdev_notifier_info_to_dev(ptr);

1324 1325 1326 1327 1328
	if (dev->netdev_ops != &dsa_slave_netdev_ops)
		return NOTIFY_DONE;

	if (event == NETDEV_CHANGEUPPER)
		return dsa_slave_changeupper(dev, ptr);
1329 1330 1331

	return NOTIFY_DONE;
}
1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349

static struct notifier_block dsa_slave_nb __read_mostly = {
	.notifier_call	= dsa_slave_netdevice_event,
};

int dsa_slave_register_notifier(void)
{
	return register_netdevice_notifier(&dsa_slave_nb);
}

void dsa_slave_unregister_notifier(void)
{
	int err;

	err = unregister_netdevice_notifier(&dsa_slave_nb);
	if (err)
		pr_err("DSA: failed to unregister slave notifier (%d)\n", err);
}