dsa.c 21.1 KB
Newer Older
1 2
/*
 * net/dsa/dsa.c - Hardware switch handling
3
 * Copyright (c) 2008-2009 Marvell Semiconductor
4
 * Copyright (c) 2013 Florian Fainelli <florian@openwrt.org>
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.
 */

12
#include <linux/device.h>
13 14
#include <linux/list.h>
#include <linux/platform_device.h>
15
#include <linux/slab.h>
16
#include <linux/module.h>
17
#include <net/dsa.h>
18 19 20
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_platform.h>
21
#include <linux/of_net.h>
22
#include <linux/of_gpio.h>
23
#include <linux/sysfs.h>
24
#include <linux/phy_fixed.h>
25
#include <linux/gpio/consumer.h>
26 27
#include "dsa_priv.h"

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb,
					    struct net_device *dev)
{
	/* Just return the original SKB */
	return skb;
}

static const struct dsa_device_ops none_ops = {
	.xmit	= dsa_slave_notag_xmit,
	.rcv	= NULL,
};

const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = {
#ifdef CONFIG_NET_DSA_TAG_DSA
	[DSA_TAG_PROTO_DSA] = &dsa_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_EDSA
	[DSA_TAG_PROTO_EDSA] = &edsa_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_TRAILER
	[DSA_TAG_PROTO_TRAILER] = &trailer_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_BRCM
	[DSA_TAG_PROTO_BRCM] = &brcm_netdev_ops,
52 53 54
#endif
#ifdef CONFIG_NET_DSA_TAG_QCA
	[DSA_TAG_PROTO_QCA] = &qca_netdev_ops,
55 56 57
#endif
	[DSA_TAG_PROTO_NONE] = &none_ops,
};
58 59 60 61 62

/* switch driver registration ***********************************************/
static DEFINE_MUTEX(dsa_switch_drivers_mutex);
static LIST_HEAD(dsa_switch_drivers);

63
void register_switch_driver(struct dsa_switch_driver *drv)
64 65
{
	mutex_lock(&dsa_switch_drivers_mutex);
66
	list_add_tail(&drv->list, &dsa_switch_drivers);
67 68
	mutex_unlock(&dsa_switch_drivers_mutex);
}
69
EXPORT_SYMBOL_GPL(register_switch_driver);
70

71
void unregister_switch_driver(struct dsa_switch_driver *drv)
72 73
{
	mutex_lock(&dsa_switch_drivers_mutex);
74
	list_del_init(&drv->list);
75 76
	mutex_unlock(&dsa_switch_drivers_mutex);
}
77
EXPORT_SYMBOL_GPL(unregister_switch_driver);
78

79
static const struct dsa_switch_ops *
80
dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr,
V
Vivien Didelot 已提交
81
		 const char **_name, void **priv)
82
{
83
	const struct dsa_switch_ops *ret;
84
	struct list_head *list;
V
Vivien Didelot 已提交
85
	const char *name;
86 87 88 89 90 91

	ret = NULL;
	name = NULL;

	mutex_lock(&dsa_switch_drivers_mutex);
	list_for_each(list, &dsa_switch_drivers) {
92
		const struct dsa_switch_ops *ops;
93
		struct dsa_switch_driver *drv;
94

95 96
		drv = list_entry(list, struct dsa_switch_driver, list);
		ops = drv->ops;
97

98
		name = ops->probe(parent, host_dev, sw_addr, priv);
99
		if (name != NULL) {
100
			ret = ops;
101 102 103 104 105 106 107 108 109 110 111
			break;
		}
	}
	mutex_unlock(&dsa_switch_drivers_mutex);

	*_name = name;

	return ret;
}

/* basic switch operations **************************************************/
112
int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct device *dev,
113
		      struct dsa_port *dport, int port)
114
{
115
	struct device_node *port_dn = dport->dn;
116
	struct phy_device *phydev;
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
	int ret, mode;

	if (of_phy_is_fixed_link(port_dn)) {
		ret = of_phy_register_fixed_link(port_dn);
		if (ret) {
			dev_err(dev, "failed to register fixed PHY\n");
			return ret;
		}
		phydev = of_phy_find_device(port_dn);

		mode = of_get_phy_mode(port_dn);
		if (mode < 0)
			mode = PHY_INTERFACE_MODE_NA;
		phydev->interface = mode;

		genphy_config_init(phydev);
		genphy_read_status(phydev);
134 135
		if (ds->ops->adjust_link)
			ds->ops->adjust_link(ds, port, phydev);
136 137

		put_device(&phydev->mdio.dev);
138 139 140 141 142 143 144
	}

	return 0;
}

static int dsa_cpu_dsa_setups(struct dsa_switch *ds, struct device *dev)
{
145
	struct dsa_port *dport;
146
	int ret, port;
147

148
	for (port = 0; port < ds->num_ports; port++) {
149 150 151
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;

152 153
		dport = &ds->ports[port];
		ret = dsa_cpu_dsa_setup(ds, dev, dport, port);
154 155
		if (ret)
			return ret;
156 157 158 159
	}
	return 0;
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173
const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)
{
	const struct dsa_device_ops *ops;

	if (tag_protocol >= DSA_TAG_LAST)
		return ERR_PTR(-EINVAL);
	ops = dsa_device_ops[tag_protocol];

	if (!ops)
		return ERR_PTR(-ENOPROTOOPT);

	return ops;
}

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
int dsa_cpu_port_ethtool_setup(struct dsa_switch *ds)
{
	struct net_device *master;
	struct ethtool_ops *cpu_ops;

	master = ds->dst->master_netdev;
	if (ds->master_netdev)
		master = ds->master_netdev;

	cpu_ops = devm_kzalloc(ds->dev, sizeof(*cpu_ops), GFP_KERNEL);
	if (!cpu_ops)
		return -ENOMEM;

	memcpy(&ds->dst->master_ethtool_ops, master->ethtool_ops,
	       sizeof(struct ethtool_ops));
	ds->dst->master_orig_ethtool_ops = master->ethtool_ops;
	memcpy(cpu_ops, &ds->dst->master_ethtool_ops,
	       sizeof(struct ethtool_ops));
	dsa_cpu_port_ethtool_init(cpu_ops);
	master->ethtool_ops = cpu_ops;

	return 0;
}

void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds)
{
	struct net_device *master;

	master = ds->dst->master_netdev;
	if (ds->master_netdev)
		master = ds->master_netdev;

	master->ethtool_ops = ds->dst->master_orig_ethtool_ops;
}

209
static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
210
{
211
	const struct dsa_switch_ops *ops = ds->ops;
212
	struct dsa_switch_tree *dst = ds->dst;
A
Andrew Lunn 已提交
213
	struct dsa_chip_data *cd = ds->cd;
214
	bool valid_name_found = false;
215 216
	int index = ds->index;
	int i, ret;
217 218 219 220

	/*
	 * Validate supplied switch configuration.
	 */
221
	for (i = 0; i < ds->num_ports; i++) {
222 223
		char *name;

A
Andrew Lunn 已提交
224
		name = cd->port_names[i];
225 226 227 228
		if (name == NULL)
			continue;

		if (!strcmp(name, "cpu")) {
229
			if (dst->cpu_switch) {
230 231
				netdev_err(dst->master_netdev,
					   "multiple cpu ports?!\n");
232
				return -EINVAL;
233
			}
234
			dst->cpu_switch = ds;
235
			dst->cpu_port = i;
236
			ds->cpu_port_mask |= 1 << i;
237 238
		} else if (!strcmp(name, "dsa")) {
			ds->dsa_port_mask |= 1 << i;
239
		} else {
240
			ds->enabled_port_mask |= 1 << i;
241
		}
242
		valid_name_found = true;
243 244
	}

245
	if (!valid_name_found && i == ds->num_ports)
246
		return -EINVAL;
247

248 249 250
	/* Make the built-in MII bus mask match the number of ports,
	 * switch drivers can override this later
	 */
251
	ds->phys_mii_mask = ds->enabled_port_mask;
252

253
	/*
254 255 256
	 * If the CPU connects to this switch, set the switch tree
	 * tagging protocol to the preferred tagging format of this
	 * switch.
257
	 */
258
	if (dst->cpu_switch == ds) {
259 260
		enum dsa_tag_protocol tag_protocol;

261
		tag_protocol = ops->get_tag_protocol(ds);
262
		dst->tag_ops = dsa_resolve_tag_protocol(tag_protocol);
263 264
		if (IS_ERR(dst->tag_ops))
			return PTR_ERR(dst->tag_ops);
265

266
		dst->rcv = dst->tag_ops->rcv;
267
	}
268

269 270
	memcpy(ds->rtable, cd->rtable, sizeof(ds->rtable));

271 272 273
	/*
	 * Do basic register setup.
	 */
274
	ret = ops->setup(ds);
275
	if (ret < 0)
276
		return ret;
277

V
Vivien Didelot 已提交
278 279 280 281
	ret = dsa_switch_register_notifier(ds);
	if (ret)
		return ret;

282 283 284
	if (ops->set_addr) {
		ret = ops->set_addr(ds, dst->master_netdev->dev_addr);
		if (ret < 0)
285
			return ret;
286
	}
287

288
	if (!ds->slave_mii_bus && ops->phy_read) {
A
Andrew Lunn 已提交
289
		ds->slave_mii_bus = devm_mdiobus_alloc(parent);
290 291
		if (!ds->slave_mii_bus)
			return -ENOMEM;
A
Andrew Lunn 已提交
292
		dsa_slave_mii_bus_init(ds);
293

A
Andrew Lunn 已提交
294 295
		ret = mdiobus_register(ds->slave_mii_bus);
		if (ret < 0)
296
			return ret;
A
Andrew Lunn 已提交
297
	}
298 299 300 301

	/*
	 * Create network devices for physical switch ports.
	 */
302
	for (i = 0; i < ds->num_ports; i++) {
303 304
		ds->ports[i].dn = cd->port_dn[i];

305
		if (!(ds->enabled_port_mask & (1 << i)))
306 307
			continue;

A
Andrew Lunn 已提交
308
		ret = dsa_slave_create(ds, parent, i, cd->port_names[i]);
309
		if (ret < 0)
R
Russell King 已提交
310
			netdev_err(dst->master_netdev, "[%d]: can't create dsa slave device for port %d(%s): %d\n",
A
Andrew Lunn 已提交
311
				   index, i, cd->port_names[i], ret);
312 313
	}

314
	/* Perform configuration of the CPU and DSA ports */
315
	ret = dsa_cpu_dsa_setups(ds, parent);
316
	if (ret < 0)
317 318 319
		netdev_err(dst->master_netdev, "[%d] : can't configure CPU and DSA ports\n",
			   index);

320 321 322 323
	ret = dsa_cpu_port_ethtool_setup(ds);
	if (ret)
		return ret;

324
	return 0;
325 326 327 328 329 330
}

static struct dsa_switch *
dsa_switch_setup(struct dsa_switch_tree *dst, int index,
		 struct device *parent, struct device *host_dev)
{
A
Andrew Lunn 已提交
331
	struct dsa_chip_data *cd = dst->pd->chip + index;
332
	const struct dsa_switch_ops *ops;
333 334
	struct dsa_switch *ds;
	int ret;
V
Vivien Didelot 已提交
335
	const char *name;
336
	void *priv;
337 338 339 340

	/*
	 * Probe for switch model.
	 */
341 342
	ops = dsa_switch_probe(parent, host_dev, cd->sw_addr, &name, &priv);
	if (!ops) {
343 344 345 346 347 348 349 350 351 352 353
		netdev_err(dst->master_netdev, "[%d]: could not detect attached switch\n",
			   index);
		return ERR_PTR(-EINVAL);
	}
	netdev_info(dst->master_netdev, "[%d]: detected a %s switch\n",
		    index, name);


	/*
	 * Allocate and initialise switch state.
	 */
354 355
	ds = dsa_switch_alloc(parent, DSA_MAX_PORTS);
	if (!ds)
356
		return ERR_PTR(-ENOMEM);
357 358 359

	ds->dst = dst;
	ds->index = index;
A
Andrew Lunn 已提交
360
	ds->cd = cd;
361
	ds->ops = ops;
362
	ds->priv = priv;
363 364 365

	ret = dsa_switch_setup_one(ds, parent);
	if (ret)
366
		return ERR_PTR(ret);
367 368

	return ds;
369 370
}

371
void dsa_cpu_dsa_destroy(struct dsa_port *port)
372
{
373 374
	struct device_node *port_dn = port->dn;

375 376
	if (of_phy_is_fixed_link(port_dn))
		of_phy_deregister_fixed_link(port_dn);
377 378 379 380
}

static void dsa_switch_destroy(struct dsa_switch *ds)
{
381 382
	int port;

383
	/* Destroy network devices for physical switch ports. */
384
	for (port = 0; port < ds->num_ports; port++) {
385
		if (!(ds->enabled_port_mask & (1 << port)))
386 387
			continue;

388
		if (!ds->ports[port].netdev)
389 390
			continue;

391
		dsa_slave_destroy(ds->ports[port].netdev);
392 393
	}

394
	/* Disable configuration of the CPU and DSA ports */
395
	for (port = 0; port < ds->num_ports; port++) {
396 397
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;
398
		dsa_cpu_dsa_destroy(&ds->ports[port]);
399 400 401 402

		/* Clearing a bit which is not set does no harm */
		ds->cpu_port_mask |= ~(1 << port);
		ds->dsa_port_mask |= ~(1 << port);
403 404
	}

405
	if (ds->slave_mii_bus && ds->ops->phy_read)
A
Andrew Lunn 已提交
406
		mdiobus_unregister(ds->slave_mii_bus);
V
Vivien Didelot 已提交
407 408

	dsa_switch_unregister_notifier(ds);
409 410
}

411
#ifdef CONFIG_PM_SLEEP
412
int dsa_switch_suspend(struct dsa_switch *ds)
413 414 415 416
{
	int i, ret = 0;

	/* Suspend slave network devices */
417
	for (i = 0; i < ds->num_ports; i++) {
418
		if (!dsa_is_port_initialized(ds, i))
419 420
			continue;

421
		ret = dsa_slave_suspend(ds->ports[i].netdev);
422 423 424 425
		if (ret)
			return ret;
	}

426 427
	if (ds->ops->suspend)
		ret = ds->ops->suspend(ds);
428 429 430

	return ret;
}
431
EXPORT_SYMBOL_GPL(dsa_switch_suspend);
432

433
int dsa_switch_resume(struct dsa_switch *ds)
434 435 436
{
	int i, ret = 0;

437 438
	if (ds->ops->resume)
		ret = ds->ops->resume(ds);
439 440 441 442 443

	if (ret)
		return ret;

	/* Resume slave network devices */
444
	for (i = 0; i < ds->num_ports; i++) {
445
		if (!dsa_is_port_initialized(ds, i))
446 447
			continue;

448
		ret = dsa_slave_resume(ds->ports[i].netdev);
449 450 451 452 453 454
		if (ret)
			return ret;
	}

	return 0;
}
455
EXPORT_SYMBOL_GPL(dsa_switch_resume);
456
#endif
457

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
/* platform driver init and cleanup *****************************************/
static int dev_is_class(struct device *dev, void *class)
{
	if (dev->class != NULL && !strcmp(dev->class->name, class))
		return 1;

	return 0;
}

static struct device *dev_find_class(struct device *parent, char *class)
{
	if (dev_is_class(parent, class)) {
		get_device(parent);
		return parent;
	}

	return device_find_child(parent, class, dev_is_class);
}

477
struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev)
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
{
	struct device *d;

	d = dev_find_class(dev, "mdio_bus");
	if (d != NULL) {
		struct mii_bus *bus;

		bus = to_mii_bus(d);
		put_device(d);

		return bus;
	}

	return NULL;
}
493
EXPORT_SYMBOL_GPL(dsa_host_dev_to_mii_bus);
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512

static struct net_device *dev_to_net_device(struct device *dev)
{
	struct device *d;

	d = dev_find_class(dev, "net");
	if (d != NULL) {
		struct net_device *nd;

		nd = to_net_dev(d);
		dev_hold(nd);
		put_device(d);

		return nd;
	}

	return NULL;
}

513 514 515
#ifdef CONFIG_OF
static int dsa_of_setup_routing_table(struct dsa_platform_data *pd,
					struct dsa_chip_data *cd,
516
					int chip_index, int port_index,
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
					struct device_node *link)
{
	const __be32 *reg;
	int link_sw_addr;
	struct device_node *parent_sw;
	int len;

	parent_sw = of_get_parent(link);
	if (!parent_sw)
		return -EINVAL;

	reg = of_get_property(parent_sw, "reg", &len);
	if (!reg || (len != sizeof(*reg) * 2))
		return -EINVAL;

532 533 534 535
	/*
	 * Get the destination switch number from the second field of its 'reg'
	 * property, i.e. for "reg = <0x19 1>" sw_addr is '1'.
	 */
536 537 538 539 540
	link_sw_addr = be32_to_cpup(reg + 1);

	if (link_sw_addr >= pd->nr_chips)
		return -EINVAL;

541
	cd->rtable[link_sw_addr] = port_index;
542 543 544 545

	return 0;
}

546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
static int dsa_of_probe_links(struct dsa_platform_data *pd,
			      struct dsa_chip_data *cd,
			      int chip_index, int port_index,
			      struct device_node *port,
			      const char *port_name)
{
	struct device_node *link;
	int link_index;
	int ret;

	for (link_index = 0;; link_index++) {
		link = of_parse_phandle(port, "link", link_index);
		if (!link)
			break;

		if (!strcmp(port_name, "dsa") && pd->nr_chips > 1) {
			ret = dsa_of_setup_routing_table(pd, cd, chip_index,
							 port_index, link);
			if (ret)
				return ret;
		}
	}
	return 0;
}

571 572 573 574 575 576 577
static void dsa_of_free_platform_data(struct dsa_platform_data *pd)
{
	int i;
	int port_index;

	for (i = 0; i < pd->nr_chips; i++) {
		port_index = 0;
578
		while (port_index < DSA_MAX_PORTS) {
579
			kfree(pd->chip[i].port_names[port_index]);
580 581
			port_index++;
		}
582 583 584 585

		/* Drop our reference to the MDIO bus device */
		if (pd->chip[i].host_dev)
			put_device(pd->chip[i].host_dev);
586 587 588 589
	}
	kfree(pd->chip);
}

590
static int dsa_of_probe(struct device *dev)
591
{
592
	struct device_node *np = dev->of_node;
593
	struct device_node *child, *mdio, *ethernet, *port;
A
Andrew Lunn 已提交
594
	struct mii_bus *mdio_bus, *mdio_bus_switch;
595
	struct net_device *ethernet_dev;
596 597 598 599 600
	struct dsa_platform_data *pd;
	struct dsa_chip_data *cd;
	const char *port_name;
	int chip_index, port_index;
	const unsigned int *sw_addr, *port_reg;
601
	u32 eeprom_len;
602
	int ret;
603 604 605 606 607 608 609

	mdio = of_parse_phandle(np, "dsa,mii-bus", 0);
	if (!mdio)
		return -EINVAL;

	mdio_bus = of_mdio_find_bus(mdio);
	if (!mdio_bus)
610
		return -EPROBE_DEFER;
611 612

	ethernet = of_parse_phandle(np, "dsa,ethernet", 0);
613 614 615 616
	if (!ethernet) {
		ret = -EINVAL;
		goto out_put_mdio;
	}
617

618
	ethernet_dev = of_find_net_device_by_node(ethernet);
619 620 621 622
	if (!ethernet_dev) {
		ret = -EPROBE_DEFER;
		goto out_put_mdio;
	}
623 624

	pd = kzalloc(sizeof(*pd), GFP_KERNEL);
625 626
	if (!pd) {
		ret = -ENOMEM;
R
Russell King 已提交
627
		goto out_put_ethernet;
628
	}
629

630
	dev->platform_data = pd;
631
	pd->of_netdev = ethernet_dev;
632
	pd->nr_chips = of_get_available_child_count(np);
633 634 635
	if (pd->nr_chips > DSA_MAX_SWITCHES)
		pd->nr_chips = DSA_MAX_SWITCHES;

636 637
	pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
			   GFP_KERNEL);
638 639 640 641 642
	if (!pd->chip) {
		ret = -ENOMEM;
		goto out_free;
	}

643
	chip_index = -1;
644
	for_each_available_child_of_node(np, child) {
645 646
		int i;

647
		chip_index++;
648 649
		cd = &pd->chip[chip_index];

650
		cd->of_node = child;
651

652 653 654 655
		/* Initialize the routing table */
		for (i = 0; i < DSA_MAX_SWITCHES; ++i)
			cd->rtable[i] = DSA_RTABLE_NONE;

656 657
		/* When assigning the host device, increment its refcount */
		cd->host_dev = get_device(&mdio_bus->dev);
658 659 660 661 662 663

		sw_addr = of_get_property(child, "reg", NULL);
		if (!sw_addr)
			continue;

		cd->sw_addr = be32_to_cpup(sw_addr);
664
		if (cd->sw_addr >= PHY_MAX_ADDR)
665 666
			continue;

667
		if (!of_property_read_u32(child, "eeprom-length", &eeprom_len))
668 669
			cd->eeprom_len = eeprom_len;

A
Andrew Lunn 已提交
670 671 672 673 674 675 676
		mdio = of_parse_phandle(child, "mii-bus", 0);
		if (mdio) {
			mdio_bus_switch = of_mdio_find_bus(mdio);
			if (!mdio_bus_switch) {
				ret = -EPROBE_DEFER;
				goto out_free_chip;
			}
677 678 679 680 681 682

			/* Drop the mdio_bus device ref, replacing the host
			 * device with the mdio_bus_switch device, keeping
			 * the refcount from of_mdio_find_bus() above.
			 */
			put_device(cd->host_dev);
A
Andrew Lunn 已提交
683 684 685
			cd->host_dev = &mdio_bus_switch->dev;
		}

686 687 688 689 690 691
		for_each_available_child_of_node(child, port) {
			port_reg = of_get_property(port, "reg", NULL);
			if (!port_reg)
				continue;

			port_index = be32_to_cpup(port_reg);
692 693
			if (port_index >= DSA_MAX_PORTS)
				break;
694 695 696 697 698

			port_name = of_get_property(port, "label", NULL);
			if (!port_name)
				continue;

699 700
			cd->port_dn[port_index] = port;

701 702 703 704 705 706 707
			cd->port_names[port_index] = kstrdup(port_name,
					GFP_KERNEL);
			if (!cd->port_names[port_index]) {
				ret = -ENOMEM;
				goto out_free_chip;
			}

708 709 710 711
			ret = dsa_of_probe_links(pd, cd, chip_index,
						 port_index, port, port_name);
			if (ret)
				goto out_free_chip;
712 713 714 715

		}
	}

716 717 718 719
	/* The individual chips hold their own refcount on the mdio bus,
	 * so drop ours */
	put_device(&mdio_bus->dev);

720 721 722
	return 0;

out_free_chip:
723
	dsa_of_free_platform_data(pd);
724 725
out_free:
	kfree(pd);
726
	dev->platform_data = NULL;
R
Russell King 已提交
727 728
out_put_ethernet:
	put_device(&ethernet_dev->dev);
729 730
out_put_mdio:
	put_device(&mdio_bus->dev);
731 732 733
	return ret;
}

734
static void dsa_of_remove(struct device *dev)
735
{
736
	struct dsa_platform_data *pd = dev->platform_data;
737

738
	if (!dev->of_node)
739 740
		return;

741
	dsa_of_free_platform_data(pd);
R
Russell King 已提交
742
	put_device(&pd->of_netdev->dev);
743 744 745
	kfree(pd);
}
#else
746
static inline int dsa_of_probe(struct device *dev)
747 748 749 750
{
	return 0;
}

751
static inline void dsa_of_remove(struct device *dev)
752 753 754 755
{
}
#endif

756 757
static int dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev,
			 struct device *parent, struct dsa_platform_data *pd)
758 759
{
	int i;
760
	unsigned configured = 0;
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776

	dst->pd = pd;
	dst->master_netdev = dev;
	dst->cpu_port = -1;

	for (i = 0; i < pd->nr_chips; i++) {
		struct dsa_switch *ds;

		ds = dsa_switch_setup(dst, i, parent, pd->chip[i].host_dev);
		if (IS_ERR(ds)) {
			netdev_err(dev, "[%d]: couldn't create dsa switch instance (error %ld)\n",
				   i, PTR_ERR(ds));
			continue;
		}

		dst->ds[i] = ds;
777 778

		++configured;
779 780
	}

781 782 783 784 785 786
	/*
	 * If no switch was found, exit cleanly
	 */
	if (!configured)
		return -EPROBE_DEFER;

787 788 789 790 791 792 793 794
	/*
	 * If we use a tagging format that doesn't have an ethertype
	 * field, make sure that all packets from this point on get
	 * sent to the tag format's receive function.
	 */
	wmb();
	dev->dsa_ptr = (void *)dst;

795
	return 0;
796 797
}

798 799 800 801
static int dsa_probe(struct platform_device *pdev)
{
	struct dsa_platform_data *pd = pdev->dev.platform_data;
	struct net_device *dev;
802
	struct dsa_switch_tree *dst;
803
	int ret;
804

805
	if (pdev->dev.of_node) {
806
		ret = dsa_of_probe(&pdev->dev);
807 808 809 810 811 812
		if (ret)
			return ret;

		pd = pdev->dev.platform_data;
	}

813
	if (pd == NULL || (pd->netdev == NULL && pd->of_netdev == NULL))
814 815
		return -EINVAL;

816 817 818 819 820 821
	if (pd->of_netdev) {
		dev = pd->of_netdev;
		dev_hold(dev);
	} else {
		dev = dev_to_net_device(pd->netdev);
	}
822
	if (dev == NULL) {
823
		ret = -EPROBE_DEFER;
824 825
		goto out;
	}
826 827 828

	if (dev->dsa_ptr != NULL) {
		dev_put(dev);
829 830
		ret = -EEXIST;
		goto out;
831 832
	}

833
	dst = devm_kzalloc(&pdev->dev, sizeof(*dst), GFP_KERNEL);
834
	if (dst == NULL) {
835
		dev_put(dev);
836 837
		ret = -ENOMEM;
		goto out;
838 839
	}

840 841
	platform_set_drvdata(pdev, dst);

842
	ret = dsa_setup_dst(dst, dev, &pdev->dev, pd);
843 844
	if (ret) {
		dev_put(dev);
845
		goto out;
846
	}
847 848

	return 0;
849 850

out:
851
	dsa_of_remove(&pdev->dev);
852 853

	return ret;
854 855
}

856
static void dsa_remove_dst(struct dsa_switch_tree *dst)
857
{
858
	int i;
859

860 861 862 863 864 865 866 867
	dst->master_netdev->dsa_ptr = NULL;

	/* If we used a tagging format that doesn't have an ethertype
	 * field, make sure that all packets from this point get sent
	 * without the tag and go through the regular receive path.
	 */
	wmb();

868 869 870
	for (i = 0; i < dst->pd->nr_chips; i++) {
		struct dsa_switch *ds = dst->ds[i];

871
		if (ds)
872 873
			dsa_switch_destroy(ds);
	}
874

875
	dsa_cpu_port_ethtool_restore(dst->cpu_switch);
876

877
	dev_put(dst->master_netdev);
878 879 880 881 882
}

static int dsa_remove(struct platform_device *pdev)
{
	struct dsa_switch_tree *dst = platform_get_drvdata(pdev);
883

884
	dsa_remove_dst(dst);
885
	dsa_of_remove(&pdev->dev);
886

887 888 889 890 891 892 893
	return 0;
}

static void dsa_shutdown(struct platform_device *pdev)
{
}

894 895 896 897 898 899 900 901 902 903
static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
			  struct packet_type *pt, struct net_device *orig_dev)
{
	struct dsa_switch_tree *dst = dev->dsa_ptr;

	if (unlikely(dst == NULL)) {
		kfree_skb(skb);
		return 0;
	}

904
	return dst->rcv(skb, dev, pt, orig_dev);
905 906
}

907
static struct packet_type dsa_pack_type __read_mostly = {
908 909 910 911
	.type	= cpu_to_be16(ETH_P_XDSA),
	.func	= dsa_switch_rcv,
};

912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
#ifdef CONFIG_PM_SLEEP
static int dsa_suspend(struct device *d)
{
	struct platform_device *pdev = to_platform_device(d);
	struct dsa_switch_tree *dst = platform_get_drvdata(pdev);
	int i, ret = 0;

	for (i = 0; i < dst->pd->nr_chips; i++) {
		struct dsa_switch *ds = dst->ds[i];

		if (ds != NULL)
			ret = dsa_switch_suspend(ds);
	}

	return ret;
}

static int dsa_resume(struct device *d)
{
	struct platform_device *pdev = to_platform_device(d);
	struct dsa_switch_tree *dst = platform_get_drvdata(pdev);
	int i, ret = 0;

	for (i = 0; i < dst->pd->nr_chips; i++) {
		struct dsa_switch *ds = dst->ds[i];

		if (ds != NULL)
			ret = dsa_switch_resume(ds);
	}

	return ret;
}
#endif

static SIMPLE_DEV_PM_OPS(dsa_pm_ops, dsa_suspend, dsa_resume);

948 949 950 951 952 953
static const struct of_device_id dsa_of_match_table[] = {
	{ .compatible = "marvell,dsa", },
	{}
};
MODULE_DEVICE_TABLE(of, dsa_of_match_table);

954 955 956 957 958 959
static struct platform_driver dsa_driver = {
	.probe		= dsa_probe,
	.remove		= dsa_remove,
	.shutdown	= dsa_shutdown,
	.driver = {
		.name	= "dsa",
960
		.of_match_table = dsa_of_match_table,
961
		.pm	= &dsa_pm_ops,
962 963 964 965 966
	},
};

static int __init dsa_init_module(void)
{
B
Ben Hutchings 已提交
967 968
	int rc;

969 970 971
	rc = dsa_slave_register_notifier();
	if (rc)
		return rc;
972

B
Ben Hutchings 已提交
973 974 975 976
	rc = platform_driver_register(&dsa_driver);
	if (rc)
		return rc;

977 978
	dev_add_pack(&dsa_pack_type);

B
Ben Hutchings 已提交
979
	return 0;
980 981 982 983 984
}
module_init(dsa_init_module);

static void __exit dsa_cleanup_module(void)
{
985
	dsa_slave_unregister_notifier();
986
	dev_remove_pack(&dsa_pack_type);
987 988 989 990
	platform_driver_unregister(&dsa_driver);
}
module_exit(dsa_cleanup_module);

991
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
992 993 994
MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:dsa");