slave.c 38.3 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/dsa.h>
21
#include <net/rtnetlink.h>
S
Scott Feldman 已提交
22
#include <net/switchdev.h>
23 24
#include <net/pkt_cls.h>
#include <net/tc_act/tc_mirred.h>
25
#include <linux/if_bridge.h>
26
#include <linux/netpoll.h>
27 28
#include "dsa_priv.h"

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

31 32 33 34 35 36 37 38 39 40 41
static int dsa_slave_notify(struct net_device *dev, unsigned long e, void *v)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct raw_notifier_head *nh = &p->dp->ds->dst->nh;
	int err;

	err = raw_notifier_call_chain(nh, e, v);

	return notifier_to_errno(err);
}

42 43 44 45 46
/* slave mii_bus handling ***************************************************/
static int dsa_slave_phy_read(struct mii_bus *bus, int addr, int reg)
{
	struct dsa_switch *ds = bus->priv;

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

	return 0xffff;
}

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

57
	if (ds->phys_mii_mask & (1 << addr))
58
		return ds->ops->phy_write(ds, addr, reg, val);
59 60 61 62 63 64 65 66 67 68

	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;
69 70
	snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
		 ds->dst->tree, ds->index);
71
	ds->slave_mii_bus->parent = ds->dev;
72
	ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
73 74 75 76
}


/* slave device handling ****************************************************/
N
Nicolas Dichtel 已提交
77
static int dsa_slave_get_iflink(const struct net_device *dev)
78 79 80
{
	struct dsa_slave_priv *p = netdev_priv(dev);

81
	return p->dp->ds->dst->master_netdev->ifindex;
82 83
}

84
static inline bool dsa_port_is_bridged(struct dsa_port *dp)
85
{
86
	return !!dp->bridge_dev;
87 88
}

89
static void dsa_slave_set_state(struct net_device *dev, u8 state)
90
{
91 92 93 94
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_port *dp = p->dp;
	struct dsa_switch *ds = dp->ds;
	int port = dp->index;
V
Vivien Didelot 已提交
95

96 97
	if (ds->ops->port_stp_state_set)
		ds->ops->port_stp_state_set(ds, port, state);
V
Vivien Didelot 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

	if (ds->ops->port_fast_age) {
		/* Fast age FDB entries or flush appropriate forwarding database
		 * for the given port, if we are moving it from Learning or
		 * Forwarding state, to Disabled or Blocking or Listening state.
		 */

		if ((dp->stp_state == BR_STATE_LEARNING ||
		     dp->stp_state == BR_STATE_FORWARDING) &&
		    (state == BR_STATE_DISABLED ||
		     state == BR_STATE_BLOCKING ||
		     state == BR_STATE_LISTENING))
			ds->ops->port_fast_age(ds, port);
	}

	dp->stp_state = state;
114 115
}

116 117
static int dsa_slave_open(struct net_device *dev)
{
118
	struct dsa_slave_priv *p = netdev_priv(dev);
119 120
	struct net_device *master = p->dp->ds->dst->master_netdev;
	struct dsa_switch *ds = p->dp->ds;
121
	u8 stp_state = dsa_port_is_bridged(p->dp) ?
122
			BR_STATE_BLOCKING : BR_STATE_FORWARDING;
123 124 125 126 127
	int err;

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

128
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
129
		err = dev_uc_add(master, dev->dev_addr);
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
		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;
	}

145
	if (ds->ops->port_enable) {
146
		err = ds->ops->port_enable(ds, p->dp->index, p->phy);
147 148 149 150
		if (err)
			goto clear_promisc;
	}

151
	dsa_slave_set_state(dev, stp_state);
152

153 154 155
	if (p->phy)
		phy_start(p->phy);

156
	return 0;
157

158 159
clear_promisc:
	if (dev->flags & IFF_PROMISC)
160
		dev_set_promiscuity(master, -1);
161 162 163 164
clear_allmulti:
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(master, -1);
del_unicast:
165
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
166
		dev_uc_del(master, dev->dev_addr);
167 168
out:
	return err;
169 170 171 172
}

static int dsa_slave_close(struct net_device *dev)
{
173
	struct dsa_slave_priv *p = netdev_priv(dev);
174 175
	struct net_device *master = p->dp->ds->dst->master_netdev;
	struct dsa_switch *ds = p->dp->ds;
176

177 178 179
	if (p->phy)
		phy_stop(p->phy);

180
	dev_mc_unsync(master, dev);
181
	dev_uc_unsync(master, dev);
182 183 184 185 186
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(master, -1);
	if (dev->flags & IFF_PROMISC)
		dev_set_promiscuity(master, -1);

187
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
188
		dev_uc_del(master, dev->dev_addr);
189

190
	if (ds->ops->port_disable)
191
		ds->ops->port_disable(ds, p->dp->index, p->phy);
192

193
	dsa_slave_set_state(dev, BR_STATE_DISABLED);
194

195 196 197 198 199 200
	return 0;
}

static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
201
	struct net_device *master = p->dp->ds->dst->master_netdev;
202 203 204 205 206 207 208 209 210 211

	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);
212
	struct net_device *master = p->dp->ds->dst->master_netdev;
213 214

	dev_mc_sync(master, dev);
215
	dev_uc_sync(master, dev);
216 217
}

218
static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
219
{
220
	struct dsa_slave_priv *p = netdev_priv(dev);
221
	struct net_device *master = p->dp->ds->dst->master_netdev;
222 223 224 225 226 227 228 229 230
	struct sockaddr *addr = a;
	int err;

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

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

231
	if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
232
		err = dev_uc_add(master, addr->sa_data);
233 234 235 236
		if (err < 0)
			return err;
	}

237
	if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
238
		dev_uc_del(master, dev->dev_addr);
239 240

out:
J
Joe Perches 已提交
241
	ether_addr_copy(dev->dev_addr, addr->sa_data);
242 243 244 245

	return 0;
}

246
static int dsa_slave_port_vlan_add(struct net_device *dev,
247
				   const struct switchdev_obj_port_vlan *vlan,
248
				   struct switchdev_trans *trans)
249 250
{
	struct dsa_slave_priv *p = netdev_priv(dev);
251 252
	struct dsa_port *dp = p->dp;
	struct dsa_switch *ds = dp->ds;
253

254
	if (switchdev_trans_ph_prepare(trans)) {
255
		if (!ds->ops->port_vlan_prepare || !ds->ops->port_vlan_add)
256 257
			return -EOPNOTSUPP;

258
		return ds->ops->port_vlan_prepare(ds, dp->index, vlan, trans);
259 260
	}

261
	ds->ops->port_vlan_add(ds, dp->index, vlan, trans);
262

263 264 265 266
	return 0;
}

static int dsa_slave_port_vlan_del(struct net_device *dev,
267
				   const struct switchdev_obj_port_vlan *vlan)
268 269
{
	struct dsa_slave_priv *p = netdev_priv(dev);
270
	struct dsa_switch *ds = p->dp->ds;
271

272
	if (!ds->ops->port_vlan_del)
273 274
		return -EOPNOTSUPP;

275
	return ds->ops->port_vlan_del(ds, p->dp->index, vlan);
276 277 278
}

static int dsa_slave_port_vlan_dump(struct net_device *dev,
279
				    struct switchdev_obj_port_vlan *vlan,
280
				    switchdev_obj_dump_cb_t *cb)
281 282
{
	struct dsa_slave_priv *p = netdev_priv(dev);
283
	struct dsa_switch *ds = p->dp->ds;
284

285
	if (ds->ops->port_vlan_dump)
286
		return ds->ops->port_vlan_dump(ds, p->dp->index, vlan, cb);
287

V
Vivien Didelot 已提交
288
	return -EOPNOTSUPP;
289 290
}

291
static int dsa_slave_port_fdb_add(struct net_device *dev,
292
				  const struct switchdev_obj_port_fdb *fdb,
293
				  struct switchdev_trans *trans)
294 295
{
	struct dsa_slave_priv *p = netdev_priv(dev);
296
	struct dsa_switch *ds = p->dp->ds;
V
Vivien Didelot 已提交
297

298
	if (switchdev_trans_ph_prepare(trans)) {
299
		if (!ds->ops->port_fdb_prepare || !ds->ops->port_fdb_add)
300
			return -EOPNOTSUPP;
301

302
		return ds->ops->port_fdb_prepare(ds, p->dp->index, fdb, trans);
303 304
	}

305
	ds->ops->port_fdb_add(ds, p->dp->index, fdb, trans);
306

307
	return 0;
308 309
}

310
static int dsa_slave_port_fdb_del(struct net_device *dev,
311
				  const struct switchdev_obj_port_fdb *fdb)
312 313
{
	struct dsa_slave_priv *p = netdev_priv(dev);
314
	struct dsa_switch *ds = p->dp->ds;
315 316
	int ret = -EOPNOTSUPP;

317
	if (ds->ops->port_fdb_del)
318
		ret = ds->ops->port_fdb_del(ds, p->dp->index, fdb);
319 320 321 322

	return ret;
}

323
static int dsa_slave_port_fdb_dump(struct net_device *dev,
324
				   struct switchdev_obj_port_fdb *fdb,
325
				   switchdev_obj_dump_cb_t *cb)
326 327
{
	struct dsa_slave_priv *p = netdev_priv(dev);
328
	struct dsa_switch *ds = p->dp->ds;
329

330
	if (ds->ops->port_fdb_dump)
331
		return ds->ops->port_fdb_dump(ds, p->dp->index, fdb, cb);
332

V
Vivien Didelot 已提交
333
	return -EOPNOTSUPP;
334 335
}

V
Vivien Didelot 已提交
336 337 338 339 340
static int dsa_slave_port_mdb_add(struct net_device *dev,
				  const struct switchdev_obj_port_mdb *mdb,
				  struct switchdev_trans *trans)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
341
	struct dsa_switch *ds = p->dp->ds;
V
Vivien Didelot 已提交
342 343 344 345 346

	if (switchdev_trans_ph_prepare(trans)) {
		if (!ds->ops->port_mdb_prepare || !ds->ops->port_mdb_add)
			return -EOPNOTSUPP;

347
		return ds->ops->port_mdb_prepare(ds, p->dp->index, mdb, trans);
V
Vivien Didelot 已提交
348 349
	}

350
	ds->ops->port_mdb_add(ds, p->dp->index, mdb, trans);
V
Vivien Didelot 已提交
351 352 353 354 355 356 357 358

	return 0;
}

static int dsa_slave_port_mdb_del(struct net_device *dev,
				  const struct switchdev_obj_port_mdb *mdb)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
359
	struct dsa_switch *ds = p->dp->ds;
V
Vivien Didelot 已提交
360 361

	if (ds->ops->port_mdb_del)
362
		return ds->ops->port_mdb_del(ds, p->dp->index, mdb);
V
Vivien Didelot 已提交
363 364 365 366 367 368 369 370 371

	return -EOPNOTSUPP;
}

static int dsa_slave_port_mdb_dump(struct net_device *dev,
				   struct switchdev_obj_port_mdb *mdb,
				   switchdev_obj_dump_cb_t *cb)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
372
	struct dsa_switch *ds = p->dp->ds;
V
Vivien Didelot 已提交
373 374

	if (ds->ops->port_mdb_dump)
375
		return ds->ops->port_mdb_dump(ds, p->dp->index, mdb, cb);
V
Vivien Didelot 已提交
376 377 378 379

	return -EOPNOTSUPP;
}

380 381 382 383 384
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)
385
		return phy_mii_ioctl(p->phy, ifr, cmd);
386 387 388 389

	return -EOPNOTSUPP;
}

390 391 392
static int dsa_slave_stp_state_set(struct net_device *dev,
				   const struct switchdev_attr *attr,
				   struct switchdev_trans *trans)
393 394
{
	struct dsa_slave_priv *p = netdev_priv(dev);
395
	struct dsa_switch *ds = p->dp->ds;
396

397
	if (switchdev_trans_ph_prepare(trans))
398
		return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP;
399

400
	dsa_slave_set_state(dev, attr->u.stp_state);
401 402

	return 0;
403 404
}

405 406 407 408 409
static int dsa_slave_vlan_filtering(struct net_device *dev,
				    const struct switchdev_attr *attr,
				    struct switchdev_trans *trans)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
410
	struct dsa_switch *ds = p->dp->ds;
411 412 413 414 415

	/* bridge skips -EOPNOTSUPP, so skip the prepare phase */
	if (switchdev_trans_ph_prepare(trans))
		return 0;

416
	if (ds->ops->port_vlan_filtering)
417
		return ds->ops->port_vlan_filtering(ds, p->dp->index,
418 419 420 421 422
						    attr->u.vlan_filtering);

	return 0;
}

423 424
static unsigned int dsa_fastest_ageing_time(struct dsa_switch *ds,
					    unsigned int ageing_time)
425 426 427
{
	int i;

428
	for (i = 0; i < ds->num_ports; ++i) {
429 430 431 432 433 434 435 436 437 438 439 440 441 442
		struct dsa_port *dp = &ds->ports[i];

		if (dp && dp->ageing_time && dp->ageing_time < ageing_time)
			ageing_time = dp->ageing_time;
	}

	return ageing_time;
}

static int dsa_slave_ageing_time(struct net_device *dev,
				 const struct switchdev_attr *attr,
				 struct switchdev_trans *trans)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
443
	struct dsa_switch *ds = p->dp->ds;
444 445 446
	unsigned long ageing_jiffies = clock_t_to_jiffies(attr->u.ageing_time);
	unsigned int ageing_time = jiffies_to_msecs(ageing_jiffies);

447 448 449 450 451
	if (switchdev_trans_ph_prepare(trans)) {
		if (ds->ageing_time_min && ageing_time < ds->ageing_time_min)
			return -ERANGE;
		if (ds->ageing_time_max && ageing_time > ds->ageing_time_max)
			return -ERANGE;
452
		return 0;
453
	}
454 455

	/* Keep the fastest ageing time in case of multiple bridges */
456
	p->dp->ageing_time = ageing_time;
457 458
	ageing_time = dsa_fastest_ageing_time(ds, ageing_time);

459 460
	if (ds->ops->set_ageing_time)
		return ds->ops->set_ageing_time(ds, ageing_time);
461 462 463 464

	return 0;
}

465
static int dsa_slave_port_attr_set(struct net_device *dev,
466
				   const struct switchdev_attr *attr,
467
				   struct switchdev_trans *trans)
468
{
469
	int ret;
470 471

	switch (attr->id) {
472
	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
473
		ret = dsa_slave_stp_state_set(dev, attr, trans);
474
		break;
475 476 477
	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
		ret = dsa_slave_vlan_filtering(dev, attr, trans);
		break;
478 479 480
	case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
		ret = dsa_slave_ageing_time(dev, attr, trans);
		break;
481 482 483 484 485 486 487 488
	default:
		ret = -EOPNOTSUPP;
		break;
	}

	return ret;
}

489
static int dsa_slave_port_obj_add(struct net_device *dev,
490
				  const struct switchdev_obj *obj,
491
				  struct switchdev_trans *trans)
492 493 494 495 496 497 498 499
{
	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.
	 */

500
	switch (obj->id) {
501
	case SWITCHDEV_OBJ_ID_PORT_FDB:
502 503 504
		err = dsa_slave_port_fdb_add(dev,
					     SWITCHDEV_OBJ_PORT_FDB(obj),
					     trans);
505
		break;
V
Vivien Didelot 已提交
506 507 508 509
	case SWITCHDEV_OBJ_ID_PORT_MDB:
		err = dsa_slave_port_mdb_add(dev, SWITCHDEV_OBJ_PORT_MDB(obj),
					     trans);
		break;
510
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
511 512 513
		err = dsa_slave_port_vlan_add(dev,
					      SWITCHDEV_OBJ_PORT_VLAN(obj),
					      trans);
514
		break;
515 516 517 518 519 520 521 522 523
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

static int dsa_slave_port_obj_del(struct net_device *dev,
524
				  const struct switchdev_obj *obj)
525 526 527
{
	int err;

528
	switch (obj->id) {
529
	case SWITCHDEV_OBJ_ID_PORT_FDB:
530 531
		err = dsa_slave_port_fdb_del(dev,
					     SWITCHDEV_OBJ_PORT_FDB(obj));
532
		break;
V
Vivien Didelot 已提交
533 534 535
	case SWITCHDEV_OBJ_ID_PORT_MDB:
		err = dsa_slave_port_mdb_del(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
		break;
536
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
537 538
		err = dsa_slave_port_vlan_del(dev,
					      SWITCHDEV_OBJ_PORT_VLAN(obj));
539
		break;
540 541 542 543 544 545 546 547 548
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

static int dsa_slave_port_obj_dump(struct net_device *dev,
549 550
				   struct switchdev_obj *obj,
				   switchdev_obj_dump_cb_t *cb)
551 552 553
{
	int err;

554
	switch (obj->id) {
555
	case SWITCHDEV_OBJ_ID_PORT_FDB:
556 557 558
		err = dsa_slave_port_fdb_dump(dev,
					      SWITCHDEV_OBJ_PORT_FDB(obj),
					      cb);
559
		break;
V
Vivien Didelot 已提交
560 561 562 563
	case SWITCHDEV_OBJ_ID_PORT_MDB:
		err = dsa_slave_port_mdb_dump(dev, SWITCHDEV_OBJ_PORT_MDB(obj),
					      cb);
		break;
564
	case SWITCHDEV_OBJ_ID_PORT_VLAN:
565 566 567
		err = dsa_slave_port_vlan_dump(dev,
					       SWITCHDEV_OBJ_PORT_VLAN(obj),
					       cb);
568
		break;
569 570 571 572 573 574 575 576
	default:
		err = -EOPNOTSUPP;
		break;
	}

	return err;
}

577 578 579 580
static int dsa_slave_bridge_port_join(struct net_device *dev,
				      struct net_device *br)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
581 582 583 584 585 586
	struct dsa_notifier_bridge_info info = {
		.sw_index = p->dp->ds->index,
		.port = p->dp->index,
		.br = br,
	};
	int err;
587

588 589 590
	/* Here the port is already bridged. Reflect the current configuration
	 * so that drivers can program their chips accordingly.
	 */
591
	p->dp->bridge_dev = br;
592

593
	err = dsa_slave_notify(dev, DSA_NOTIFIER_BRIDGE_JOIN, &info);
594

595
	/* The bridging is rolled back on error */
596
	if (err)
597 598
		p->dp->bridge_dev = NULL;

599
	return err;
600 601
}

602 603
static void dsa_slave_bridge_port_leave(struct net_device *dev,
					struct net_device *br)
604 605
{
	struct dsa_slave_priv *p = netdev_priv(dev);
606 607 608 609 610 611
	struct dsa_notifier_bridge_info info = {
		.sw_index = p->dp->ds->index,
		.port = p->dp->index,
		.br = br,
	};
	int err;
612

613 614 615
	/* Here the port is already unbridged. Reflect the current configuration
	 * so that drivers can program their chips accordingly.
	 */
616
	p->dp->bridge_dev = NULL;
617

618 619 620
	err = dsa_slave_notify(dev, DSA_NOTIFIER_BRIDGE_LEAVE, &info);
	if (err)
		netdev_err(dev, "failed to notify DSA_NOTIFIER_BRIDGE_LEAVE\n");
621 622 623 624

	/* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
	 * so allow it to be in BR_STATE_FORWARDING to be kept functional
	 */
625
	dsa_slave_set_state(dev, BR_STATE_FORWARDING);
626 627
}

628 629
static int dsa_slave_port_attr_get(struct net_device *dev,
				   struct switchdev_attr *attr)
630 631
{
	struct dsa_slave_priv *p = netdev_priv(dev);
632
	struct dsa_switch *ds = p->dp->ds;
633

634
	switch (attr->id) {
635
	case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
636 637
		attr->u.ppid.id_len = sizeof(ds->index);
		memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
638 639 640 641
		break;
	default:
		return -EOPNOTSUPP;
	}
642 643 644 645

	return 0;
}

646 647 648 649 650 651 652 653 654 655 656 657
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;
}

658 659 660
static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
661
	struct sk_buff *nskb;
662

663 664
	dev->stats.tx_packets++;
	dev->stats.tx_bytes += skb->len;
665

666 667 668 669
	/* Transmit function may have to reallocate the original SKB */
	nskb = p->xmit(skb, dev);
	if (!nskb)
		return NETDEV_TX_OK;
670

671 672 673 674 675 676
	/* 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);

677 678 679
	/* Queue the SKB for transmission on the parent interface, but
	 * do not modify its EtherType
	 */
680
	nskb->dev = p->dp->ds->dst->master_netdev;
681
	dev_queue_xmit(nskb);
682 683 684 685

	return NETDEV_TX_OK;
}

686 687
/* ethtool operations *******************************************************/
static int
688 689
dsa_slave_get_link_ksettings(struct net_device *dev,
			     struct ethtool_link_ksettings *cmd)
690 691
{
	struct dsa_slave_priv *p = netdev_priv(dev);
692
	int err = -EOPNOTSUPP;
693

694 695
	if (p->phy != NULL)
		err = phy_ethtool_ksettings_get(p->phy, cmd);
696 697 698 699 700

	return err;
}

static int
701 702
dsa_slave_set_link_ksettings(struct net_device *dev,
			     const struct ethtool_link_ksettings *cmd)
703 704 705 706
{
	struct dsa_slave_priv *p = netdev_priv(dev);

	if (p->phy != NULL)
707
		return phy_ethtool_ksettings_set(p->phy, cmd);
708 709 710 711 712 713 714

	return -EOPNOTSUPP;
}

static void dsa_slave_get_drvinfo(struct net_device *dev,
				  struct ethtool_drvinfo *drvinfo)
{
715 716 717
	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));
718 719
}

720 721 722
static int dsa_slave_get_regs_len(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
723
	struct dsa_switch *ds = p->dp->ds;
724

725
	if (ds->ops->get_regs_len)
726
		return ds->ops->get_regs_len(ds, p->dp->index);
727 728 729 730 731 732 733 734

	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);
735
	struct dsa_switch *ds = p->dp->ds;
736

737
	if (ds->ops->get_regs)
738
		ds->ops->get_regs(ds, p->dp->index, regs, _p);
739 740
}

741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
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;
}

763 764 765
static int dsa_slave_get_eeprom_len(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
766
	struct dsa_switch *ds = p->dp->ds;
767

768
	if (ds->cd && ds->cd->eeprom_len)
A
Andrew Lunn 已提交
769
		return ds->cd->eeprom_len;
770

771 772
	if (ds->ops->get_eeprom_len)
		return ds->ops->get_eeprom_len(ds);
773 774 775 776 777 778 779 780

	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);
781
	struct dsa_switch *ds = p->dp->ds;
782

783 784
	if (ds->ops->get_eeprom)
		return ds->ops->get_eeprom(ds, eeprom, data);
785 786 787 788 789 790 791 792

	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);
793
	struct dsa_switch *ds = p->dp->ds;
794

795 796
	if (ds->ops->set_eeprom)
		return ds->ops->set_eeprom(ds, eeprom, data);
797 798 799 800

	return -EOPNOTSUPP;
}

801 802 803 804
static void dsa_slave_get_strings(struct net_device *dev,
				  uint32_t stringset, uint8_t *data)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
805
	struct dsa_switch *ds = p->dp->ds;
806 807 808 809 810 811 812 813

	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);
814
		if (ds->ops->get_strings)
815
			ds->ops->get_strings(ds, p->dp->index, data + 4 * len);
816 817 818
	}
}

819 820 821 822 823
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;
824
	struct dsa_switch *ds = dst->cpu_switch;
825 826 827 828 829 830 831 832 833
	s8 cpu_port = dst->cpu_port;
	int count = 0;

	if (dst->master_ethtool_ops.get_sset_count) {
		count = dst->master_ethtool_ops.get_sset_count(dev,
							       ETH_SS_STATS);
		dst->master_ethtool_ops.get_ethtool_stats(dev, stats, data);
	}

834 835
	if (ds->ops->get_ethtool_stats)
		ds->ops->get_ethtool_stats(ds, cpu_port, data + count);
836 837 838 839 840
}

static int dsa_cpu_port_get_sset_count(struct net_device *dev, int sset)
{
	struct dsa_switch_tree *dst = dev->dsa_ptr;
841
	struct dsa_switch *ds = dst->cpu_switch;
842 843 844 845 846
	int count = 0;

	if (dst->master_ethtool_ops.get_sset_count)
		count += dst->master_ethtool_ops.get_sset_count(dev, sset);

847 848
	if (sset == ETH_SS_STATS && ds->ops->get_sset_count)
		count += ds->ops->get_sset_count(ds);
849 850 851 852 853 854 855 856

	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;
857
	struct dsa_switch *ds = dst->cpu_switch;
858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874
	s8 cpu_port = dst->cpu_port;
	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] = '_';

	if (dst->master_ethtool_ops.get_sset_count) {
		mcount = dst->master_ethtool_ops.get_sset_count(dev,
								ETH_SS_STATS);
		dst->master_ethtool_ops.get_strings(dev, stringset, data);
	}

875
	if (stringset == ETH_SS_STATS && ds->ops->get_strings) {
876 877 878 879 880
		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
		 */
881 882
		ds->ops->get_strings(ds, cpu_port, ndata);
		count = ds->ops->get_sset_count(ds);
883 884 885 886 887 888 889 890
		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));
		}
	}
}

891 892 893 894 895
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);
896
	struct dsa_switch *ds = p->dp->ds;
897

898 899 900 901
	data[0] = dev->stats.tx_packets;
	data[1] = dev->stats.tx_bytes;
	data[2] = dev->stats.rx_packets;
	data[3] = dev->stats.rx_bytes;
902
	if (ds->ops->get_ethtool_stats)
903
		ds->ops->get_ethtool_stats(ds, p->dp->index, data + 4);
904 905 906 907 908
}

static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
909
	struct dsa_switch *ds = p->dp->ds;
910 911 912 913 914

	if (sset == ETH_SS_STATS) {
		int count;

		count = 4;
915 916
		if (ds->ops->get_sset_count)
			count += ds->ops->get_sset_count(ds);
917 918 919 920 921 922 923

		return count;
	}

	return -EOPNOTSUPP;
}

924 925 926
static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
927
	struct dsa_switch *ds = p->dp->ds;
928

929
	if (ds->ops->get_wol)
930
		ds->ops->get_wol(ds, p->dp->index, w);
931 932 933 934 935
}

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

939
	if (ds->ops->set_wol)
940
		ret = ds->ops->set_wol(ds, p->dp->index, w);
941 942 943 944

	return ret;
}

945 946 947
static int dsa_slave_set_eee(struct net_device *dev, struct ethtool_eee *e)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
948
	struct dsa_switch *ds = p->dp->ds;
949 950
	int ret;

951
	if (!ds->ops->set_eee)
952 953
		return -EOPNOTSUPP;

954
	ret = ds->ops->set_eee(ds, p->dp->index, p->phy, e);
955 956 957 958 959 960 961 962 963 964 965 966
	if (ret)
		return ret;

	if (p->phy)
		ret = phy_ethtool_set_eee(p->phy, e);

	return ret;
}

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

970
	if (!ds->ops->get_eee)
971 972
		return -EOPNOTSUPP;

973
	ret = ds->ops->get_eee(ds, p->dp->index, e);
974 975 976 977 978 979 980 981 982
	if (ret)
		return ret;

	if (p->phy)
		ret = phy_ethtool_get_eee(p->phy, e);

	return ret;
}

983 984 985 986 987
#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);
988
	struct dsa_switch *ds = p->dp->ds;
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
	struct net_device *master = ds->dst->master_netdev;
	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

1026 1027 1028 1029 1030
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);

1031
	if (snprintf(name, len, "p%d", p->dp->index) >= len)
1032
		return -EINVAL;
1033 1034 1035 1036

	return 0;
}

1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
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,
				      __be16 protocol,
				      struct tc_cls_matchall_offload *cls,
				      bool ingress)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
	struct dsa_mall_tc_entry *mall_tc_entry;
	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;

	if (!tc_single_action(cls->exts))
		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);
}

static int dsa_slave_setup_tc(struct net_device *dev, u32 handle,
			      __be16 protocol, struct tc_to_netdev *tc)
{
	bool ingress = TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS);
	int ret = -EOPNOTSUPP;

	switch (tc->type) {
	case TC_SETUP_MATCHALL:
		switch (tc->cls_mall->command) {
		case TC_CLSMATCHALL_REPLACE:
			return dsa_slave_add_cls_matchall(dev, protocol,
							  tc->cls_mall,
							  ingress);
		case TC_CLSMATCHALL_DESTROY:
			dsa_slave_del_cls_matchall(dev, tc->cls_mall);
			return 0;
		}
	default:
		break;
	}

	return ret;
}

1164 1165 1166 1167 1168 1169 1170
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;
}

1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
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);
}

1195 1196
static const struct ethtool_ops dsa_slave_ethtool_ops = {
	.get_drvinfo		= dsa_slave_get_drvinfo,
1197 1198
	.get_regs_len		= dsa_slave_get_regs_len,
	.get_regs		= dsa_slave_get_regs,
1199 1200
	.nway_reset		= dsa_slave_nway_reset,
	.get_link		= dsa_slave_get_link,
1201 1202 1203
	.get_eeprom_len		= dsa_slave_get_eeprom_len,
	.get_eeprom		= dsa_slave_get_eeprom,
	.set_eeprom		= dsa_slave_set_eeprom,
1204 1205 1206
	.get_strings		= dsa_slave_get_strings,
	.get_ethtool_stats	= dsa_slave_get_ethtool_stats,
	.get_sset_count		= dsa_slave_get_sset_count,
1207 1208
	.set_wol		= dsa_slave_set_wol,
	.get_wol		= dsa_slave_get_wol,
1209 1210
	.set_eee		= dsa_slave_set_eee,
	.get_eee		= dsa_slave_get_eee,
1211 1212
	.get_link_ksettings	= dsa_slave_get_link_ksettings,
	.set_link_ksettings	= dsa_slave_set_link_ksettings,
1213 1214
	.get_rxnfc		= dsa_slave_get_rxnfc,
	.set_rxnfc		= dsa_slave_set_rxnfc,
1215 1216
};

1217
static const struct net_device_ops dsa_slave_netdev_ops = {
1218 1219
	.ndo_open	 	= dsa_slave_open,
	.ndo_stop		= dsa_slave_close,
1220
	.ndo_start_xmit		= dsa_slave_xmit,
1221 1222 1223
	.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,
1224 1225 1226
	.ndo_fdb_add		= switchdev_port_fdb_add,
	.ndo_fdb_del		= switchdev_port_fdb_del,
	.ndo_fdb_dump		= switchdev_port_fdb_dump,
1227
	.ndo_do_ioctl		= dsa_slave_ioctl,
N
Nicolas Dichtel 已提交
1228
	.ndo_get_iflink		= dsa_slave_get_iflink,
1229 1230 1231 1232 1233
#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
1234 1235 1236
	.ndo_bridge_getlink	= switchdev_port_bridge_getlink,
	.ndo_bridge_setlink	= switchdev_port_bridge_setlink,
	.ndo_bridge_dellink	= switchdev_port_bridge_dellink,
1237
	.ndo_get_phys_port_name	= dsa_slave_get_phys_port_name,
1238
	.ndo_setup_tc		= dsa_slave_setup_tc,
S
Scott Feldman 已提交
1239 1240
};

J
Jiri Pirko 已提交
1241
static const struct switchdev_ops dsa_slave_switchdev_ops = {
1242
	.switchdev_port_attr_get	= dsa_slave_port_attr_get,
1243
	.switchdev_port_attr_set	= dsa_slave_port_attr_set,
1244 1245 1246
	.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,
1247
};
1248

1249 1250 1251 1252
static struct device_type dsa_type = {
	.name	= "dsa",
};

1253 1254 1255
static void dsa_slave_adjust_link(struct net_device *dev)
{
	struct dsa_slave_priv *p = netdev_priv(dev);
1256
	struct dsa_switch *ds = p->dp->ds;
1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273
	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;
	}

1274
	if (ds->ops->adjust_link && status_changed)
1275
		ds->ops->adjust_link(ds, p->dp->index, p->phy);
1276

1277 1278 1279 1280
	if (status_changed)
		phy_print_status(p->phy);
}

1281 1282 1283
static int dsa_slave_fixed_link_update(struct net_device *dev,
				       struct fixed_phy_status *status)
{
1284 1285 1286 1287 1288
	struct dsa_slave_priv *p;
	struct dsa_switch *ds;

	if (dev) {
		p = netdev_priv(dev);
1289
		ds = p->dp->ds;
1290
		if (ds->ops->fixed_link_update)
1291
			ds->ops->fixed_link_update(ds, p->dp->index, status);
1292
	}
1293 1294 1295 1296

	return 0;
}

1297
/* slave device setup *******************************************************/
1298
static int dsa_slave_phy_connect(struct dsa_slave_priv *p,
1299 1300
				 struct net_device *slave_dev,
				 int addr)
1301
{
1302
	struct dsa_switch *ds = p->dp->ds;
1303

1304
	p->phy = mdiobus_get_phy(ds->slave_mii_bus, addr);
R
Russell King 已提交
1305 1306
	if (!p->phy) {
		netdev_err(slave_dev, "no phy at %d\n", addr);
1307
		return -ENODEV;
R
Russell King 已提交
1308
	}
1309 1310

	/* Use already configured phy mode */
1311 1312
	if (p->phy_interface == PHY_INTERFACE_MODE_NA)
		p->phy_interface = p->phy->interface;
1313 1314
	return phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link,
				  p->phy_interface);
1315 1316
}

1317
static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1318 1319
				struct net_device *slave_dev)
{
1320
	struct dsa_switch *ds = p->dp->ds;
1321
	struct device_node *phy_dn, *port_dn;
1322
	bool phy_is_fixed = false;
1323
	u32 phy_flags = 0;
1324
	int mode, ret;
1325

1326
	port_dn = p->dp->dn;
1327 1328 1329 1330
	mode = of_get_phy_mode(port_dn);
	if (mode < 0)
		mode = PHY_INTERFACE_MODE_NA;
	p->phy_interface = mode;
1331 1332

	phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1333
	if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1334 1335 1336 1337 1338
		/* 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 已提交
1339
			netdev_err(slave_dev, "failed to register fixed PHY: %d\n", ret);
1340
			return ret;
1341
		}
1342
		phy_is_fixed = true;
1343
		phy_dn = of_node_get(port_dn);
1344 1345
	}

1346
	if (ds->ops->get_phy_flags)
1347
		phy_flags = ds->ops->get_phy_flags(ds, p->dp->index);
1348

1349
	if (phy_dn) {
R
Russell King 已提交
1350 1351
		int phy_id = of_mdio_parse_addr(&slave_dev->dev, phy_dn);

1352 1353 1354 1355 1356
		/* 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 已提交
1357 1358 1359 1360 1361
		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);
1362
				of_node_put(phy_dn);
1363
				return ret;
R
Russell King 已提交
1364
			}
1365 1366 1367 1368 1369 1370
		} else {
			p->phy = of_phy_connect(slave_dev, phy_dn,
						dsa_slave_adjust_link,
						phy_flags,
						p->phy_interface);
		}
1371 1372

		of_node_put(phy_dn);
1373
	}
1374

1375 1376 1377
	if (p->phy && phy_is_fixed)
		fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);

1378 1379 1380
	/* We could not connect to a designated PHY, so use the switch internal
	 * MDIO bus instead
	 */
1381
	if (!p->phy) {
1382
		ret = dsa_slave_phy_connect(p, slave_dev, p->dp->index);
R
Russell King 已提交
1383
		if (ret) {
1384 1385
			netdev_err(slave_dev, "failed to connect to port %d: %d\n",
				   p->dp->index, ret);
1386 1387
			if (phy_is_fixed)
				of_phy_deregister_fixed_link(port_dn);
1388
			return ret;
R
Russell King 已提交
1389
		}
1390
	}
1391

1392 1393
	phy_attached_info(p->phy);

1394
	return 0;
1395 1396
}

1397 1398 1399 1400 1401 1402 1403 1404 1405
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);
}

1406 1407 1408 1409
int dsa_slave_suspend(struct net_device *slave_dev)
{
	struct dsa_slave_priv *p = netdev_priv(slave_dev);

1410 1411
	netif_device_detach(slave_dev);

1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
	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;
}

1437
int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1438
		     int port, const char *name)
1439
{
1440
	struct dsa_switch_tree *dst = ds->dst;
1441
	struct net_device *master;
1442 1443 1444 1445
	struct net_device *slave_dev;
	struct dsa_slave_priv *p;
	int ret;

1446 1447 1448 1449
	master = ds->dst->master_netdev;
	if (ds->master_netdev)
		master = ds->master_netdev;

1450 1451
	slave_dev = alloc_netdev(sizeof(struct dsa_slave_priv), name,
				 NET_NAME_UNKNOWN, ether_setup);
1452
	if (slave_dev == NULL)
1453
		return -ENOMEM;
1454

1455 1456
	slave_dev->features = master->vlan_features | NETIF_F_HW_TC;
	slave_dev->hw_features |= NETIF_F_HW_TC;
1457
	slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
1458
	eth_hw_addr_inherit(slave_dev, master);
1459
	slave_dev->priv_flags |= IFF_NO_QUEUE;
1460
	slave_dev->netdev_ops = &dsa_slave_netdev_ops;
J
Jiri Pirko 已提交
1461
	slave_dev->switchdev_ops = &dsa_slave_switchdev_ops;
1462 1463
	slave_dev->min_mtu = 0;
	slave_dev->max_mtu = ETH_MAX_MTU;
1464
	SET_NETDEV_DEVTYPE(slave_dev, &dsa_type);
1465

1466 1467 1468
	netdev_for_each_tx_queue(slave_dev, dsa_slave_set_lockdep_class_one,
				 NULL);

1469
	SET_NETDEV_DEV(slave_dev, parent);
1470
	slave_dev->dev.of_node = ds->ports[port].dn;
1471 1472 1473
	slave_dev->vlan_features = master->vlan_features;

	p = netdev_priv(slave_dev);
1474
	p->dp = &ds->ports[port];
1475
	INIT_LIST_HEAD(&p->mall_tc_list);
1476
	p->xmit = dst->tag_ops->xmit;
1477

1478 1479 1480 1481
	p->old_pause = -1;
	p->old_link = -1;
	p->old_duplex = -1;

1482
	ds->ports[port].netdev = slave_dev;
1483 1484
	ret = register_netdev(slave_dev);
	if (ret) {
1485 1486
		netdev_err(master, "error %d registering interface %s\n",
			   ret, slave_dev->name);
1487
		ds->ports[port].netdev = NULL;
1488
		free_netdev(slave_dev);
1489
		return ret;
1490 1491 1492 1493
	}

	netif_carrier_off(slave_dev);

A
Andrew Lunn 已提交
1494 1495 1496
	ret = dsa_slave_phy_setup(p, slave_dev);
	if (ret) {
		netdev_err(master, "error %d setting up slave phy\n", ret);
1497
		unregister_netdev(slave_dev);
A
Andrew Lunn 已提交
1498 1499 1500 1501
		free_netdev(slave_dev);
		return ret;
	}

1502
	return 0;
1503
}
1504

1505 1506 1507
void dsa_slave_destroy(struct net_device *slave_dev)
{
	struct dsa_slave_priv *p = netdev_priv(slave_dev);
1508 1509
	struct device_node *port_dn;

1510
	port_dn = p->dp->dn;
1511 1512

	netif_carrier_off(slave_dev);
1513
	if (p->phy) {
1514
		phy_disconnect(p->phy);
1515 1516 1517 1518

		if (of_phy_is_fixed_link(port_dn))
			of_phy_deregister_fixed_link(port_dn);
	}
1519 1520 1521 1522
	unregister_netdev(slave_dev);
	free_netdev(slave_dev);
}

1523 1524 1525 1526 1527
static bool dsa_slave_dev_check(struct net_device *dev)
{
	return dev->netdev_ops == &dsa_slave_netdev_ops;
}

1528 1529
static int dsa_slave_changeupper(struct net_device *dev,
				 struct netdev_notifier_changeupper_info *info)
1530
{
1531
	int err = NOTIFY_DONE;
1532

1533 1534 1535 1536 1537 1538 1539
	if (netif_is_bridge_master(info->upper_dev)) {
		if (info->linking) {
			err = dsa_slave_bridge_port_join(dev, info->upper_dev);
			err = notifier_from_errno(err);
		} else {
			dsa_slave_bridge_port_leave(dev, info->upper_dev);
			err = NOTIFY_OK;
1540 1541
		}
	}
1542

1543
	return err;
1544
}
1545

1546 1547
static int dsa_slave_netdevice_event(struct notifier_block *nb,
				     unsigned long event, void *ptr)
1548 1549 1550
{
	struct net_device *dev = netdev_notifier_info_to_dev(ptr);

1551 1552 1553 1554 1555
	if (dev->netdev_ops != &dsa_slave_netdev_ops)
		return NOTIFY_DONE;

	if (event == NETDEV_CHANGEUPPER)
		return dsa_slave_changeupper(dev, ptr);
1556 1557 1558

	return NOTIFY_DONE;
}
1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576

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);
}