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
struct net_device *dsa_dev_to_net_device(struct device *dev)
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
{
	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;
}
512
EXPORT_SYMBOL_GPL(dsa_dev_to_net_device);
513

514 515 516
#ifdef CONFIG_OF
static int dsa_of_setup_routing_table(struct dsa_platform_data *pd,
					struct dsa_chip_data *cd,
517
					int chip_index, int port_index,
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
					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;

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

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

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

	return 0;
}

547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
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;
}

572 573 574 575 576 577 578
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;
579
		while (port_index < DSA_MAX_PORTS) {
580
			kfree(pd->chip[i].port_names[port_index]);
581 582
			port_index++;
		}
583 584 585 586

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

591
static int dsa_of_probe(struct device *dev)
592
{
593
	struct device_node *np = dev->of_node;
594
	struct device_node *child, *mdio, *ethernet, *port;
A
Andrew Lunn 已提交
595
	struct mii_bus *mdio_bus, *mdio_bus_switch;
596
	struct net_device *ethernet_dev;
597 598 599 600 601
	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;
602
	u32 eeprom_len;
603
	int ret;
604 605 606 607 608 609 610

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

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

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

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

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

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

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

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

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

651
		cd->of_node = child;
652

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

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

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

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

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

A
Andrew Lunn 已提交
671 672 673 674 675 676 677
		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;
			}
678 679 680 681 682 683

			/* 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 已提交
684 685 686
			cd->host_dev = &mdio_bus_switch->dev;
		}

687 688 689 690 691 692
		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);
693 694
			if (port_index >= DSA_MAX_PORTS)
				break;
695 696 697 698 699

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

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

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

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

		}
	}

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

721 722 723
	return 0;

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

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

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

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

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

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

	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;
778 779

		++configured;
780 781
	}

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

788 789 790 791 792 793 794 795
	/*
	 * 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;

796
	return 0;
797 798
}

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

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

		pd = pdev->dev.platform_data;
	}

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

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

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

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

841 842
	platform_set_drvdata(pdev, dst);

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

	return 0;
850 851

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

	return ret;
855 856
}

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

861 862 863 864 865 866 867 868
	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();

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

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

876
	dsa_cpu_port_ethtool_restore(dst->cpu_switch);
877

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

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

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

888 889 890 891 892 893 894
	return 0;
}

static void dsa_shutdown(struct platform_device *pdev)
{
}

895 896 897 898 899 900 901 902 903 904
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;
	}

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

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

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 948
#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);

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

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

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

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

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

978 979
	dev_add_pack(&dsa_pack_type);

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

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

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