dsa.c 22.2 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 13 14
#include <linux/ctype.h>
#include <linux/device.h>
#include <linux/hwmon.h>
15 16
#include <linux/list.h>
#include <linux/platform_device.h>
17
#include <linux/slab.h>
18
#include <linux/module.h>
19
#include <net/dsa.h>
20 21 22
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_platform.h>
23
#include <linux/of_net.h>
24
#include <linux/of_gpio.h>
25
#include <linux/sysfs.h>
26
#include <linux/phy_fixed.h>
27
#include <linux/gpio/consumer.h>
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
#include "dsa_priv.h"

char dsa_driver_version[] = "0.1";


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

void register_switch_driver(struct dsa_switch_driver *drv)
{
	mutex_lock(&dsa_switch_drivers_mutex);
	list_add_tail(&drv->list, &dsa_switch_drivers);
	mutex_unlock(&dsa_switch_drivers_mutex);
}
43
EXPORT_SYMBOL_GPL(register_switch_driver);
44 45 46 47 48 49 50

void unregister_switch_driver(struct dsa_switch_driver *drv)
{
	mutex_lock(&dsa_switch_drivers_mutex);
	list_del_init(&drv->list);
	mutex_unlock(&dsa_switch_drivers_mutex);
}
51
EXPORT_SYMBOL_GPL(unregister_switch_driver);
52 53

static struct dsa_switch_driver *
54
dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr,
V
Vivien Didelot 已提交
55
		 const char **_name, void **priv)
56 57 58
{
	struct dsa_switch_driver *ret;
	struct list_head *list;
V
Vivien Didelot 已提交
59
	const char *name;
60 61 62 63 64 65 66 67 68 69

	ret = NULL;
	name = NULL;

	mutex_lock(&dsa_switch_drivers_mutex);
	list_for_each(list, &dsa_switch_drivers) {
		struct dsa_switch_driver *drv;

		drv = list_entry(list, struct dsa_switch_driver, list);

70
		name = drv->probe(parent, host_dev, sw_addr, priv);
71 72 73 74 75 76 77 78 79 80 81 82
		if (name != NULL) {
			ret = drv;
			break;
		}
	}
	mutex_unlock(&dsa_switch_drivers_mutex);

	*_name = name;

	return ret;
}

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/* hwmon support ************************************************************/

#ifdef CONFIG_NET_DSA_HWMON

static ssize_t temp1_input_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	struct dsa_switch *ds = dev_get_drvdata(dev);
	int temp, ret;

	ret = ds->drv->get_temp(ds, &temp);
	if (ret < 0)
		return ret;

	return sprintf(buf, "%d\n", temp * 1000);
}
static DEVICE_ATTR_RO(temp1_input);

static ssize_t temp1_max_show(struct device *dev,
			      struct device_attribute *attr, char *buf)
{
	struct dsa_switch *ds = dev_get_drvdata(dev);
	int temp, ret;

	ret = ds->drv->get_temp_limit(ds, &temp);
	if (ret < 0)
		return ret;

	return sprintf(buf, "%d\n", temp * 1000);
}

static ssize_t temp1_max_store(struct device *dev,
			       struct device_attribute *attr, const char *buf,
			       size_t count)
{
	struct dsa_switch *ds = dev_get_drvdata(dev);
	int temp, ret;

	ret = kstrtoint(buf, 0, &temp);
	if (ret < 0)
		return ret;

	ret = ds->drv->set_temp_limit(ds, DIV_ROUND_CLOSEST(temp, 1000));
	if (ret < 0)
		return ret;

	return count;
}
131
static DEVICE_ATTR_RW(temp1_max);
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

static ssize_t temp1_max_alarm_show(struct device *dev,
				    struct device_attribute *attr, char *buf)
{
	struct dsa_switch *ds = dev_get_drvdata(dev);
	bool alarm;
	int ret;

	ret = ds->drv->get_temp_alarm(ds, &alarm);
	if (ret < 0)
		return ret;

	return sprintf(buf, "%d\n", alarm);
}
static DEVICE_ATTR_RO(temp1_max_alarm);

static struct attribute *dsa_hwmon_attrs[] = {
	&dev_attr_temp1_input.attr,	/* 0 */
	&dev_attr_temp1_max.attr,	/* 1 */
	&dev_attr_temp1_max_alarm.attr,	/* 2 */
	NULL
};

static umode_t dsa_hwmon_attrs_visible(struct kobject *kobj,
				       struct attribute *attr, int index)
{
	struct device *dev = container_of(kobj, struct device, kobj);
	struct dsa_switch *ds = dev_get_drvdata(dev);
	struct dsa_switch_driver *drv = ds->drv;
	umode_t mode = attr->mode;

	if (index == 1) {
		if (!drv->get_temp_limit)
			mode = 0;
166 167
		else if (!drv->set_temp_limit)
			mode &= ~S_IWUSR;
168 169 170 171 172 173 174 175 176 177 178 179 180
	} else if (index == 2 && !drv->get_temp_alarm) {
		mode = 0;
	}
	return mode;
}

static const struct attribute_group dsa_hwmon_group = {
	.attrs = dsa_hwmon_attrs,
	.is_visible = dsa_hwmon_attrs_visible,
};
__ATTRIBUTE_GROUPS(dsa_hwmon);

#endif /* CONFIG_NET_DSA_HWMON */
181 182

/* basic switch operations **************************************************/
183 184 185 186
static int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct net_device *master)
{
	struct device_node *port_dn;
	struct phy_device *phydev;
187
	int ret, port, mode;
188 189 190 191 192

	for (port = 0; port < DSA_MAX_PORTS; port++) {
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;

193
		port_dn = ds->ports[port].dn;
194 195 196 197 198 199 200 201
		if (of_phy_is_fixed_link(port_dn)) {
			ret = of_phy_register_fixed_link(port_dn);
			if (ret) {
				netdev_err(master,
					   "failed to register fixed PHY\n");
				return ret;
			}
			phydev = of_phy_find_device(port_dn);
202 203 204 205 206 207

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

208 209 210 211 212 213 214 215 216
			genphy_config_init(phydev);
			genphy_read_status(phydev);
			if (ds->drv->adjust_link)
				ds->drv->adjust_link(ds, port, phydev);
		}
	}
	return 0;
}

217
static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
218
{
219 220
	struct dsa_switch_driver *drv = ds->drv;
	struct dsa_switch_tree *dst = ds->dst;
A
Andrew Lunn 已提交
221
	struct dsa_chip_data *cd = ds->cd;
222
	bool valid_name_found = false;
223 224
	int index = ds->index;
	int i, ret;
225 226 227 228 229 230 231

	/*
	 * Validate supplied switch configuration.
	 */
	for (i = 0; i < DSA_MAX_PORTS; i++) {
		char *name;

A
Andrew Lunn 已提交
232
		name = cd->port_names[i];
233 234 235 236
		if (name == NULL)
			continue;

		if (!strcmp(name, "cpu")) {
237
			if (dst->cpu_switch != -1) {
238 239
				netdev_err(dst->master_netdev,
					   "multiple cpu ports?!\n");
240 241 242
				ret = -EINVAL;
				goto out;
			}
243 244 245 246
			dst->cpu_switch = index;
			dst->cpu_port = i;
		} else if (!strcmp(name, "dsa")) {
			ds->dsa_port_mask |= 1 << i;
247
		} else {
248
			ds->enabled_port_mask |= 1 << i;
249
		}
250
		valid_name_found = true;
251 252
	}

253 254 255 256
	if (!valid_name_found && i == DSA_MAX_PORTS) {
		ret = -EINVAL;
		goto out;
	}
257

258 259 260
	/* Make the built-in MII bus mask match the number of ports,
	 * switch drivers can override this later
	 */
261
	ds->phys_mii_mask = ds->enabled_port_mask;
262

263
	/*
264 265 266
	 * If the CPU connects to this switch, set the switch tree
	 * tagging protocol to the preferred tagging format of this
	 * switch.
267
	 */
268
	if (dst->cpu_switch == index) {
269
		switch (drv->tag_protocol) {
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
#ifdef CONFIG_NET_DSA_TAG_DSA
		case DSA_TAG_PROTO_DSA:
			dst->rcv = dsa_netdev_ops.rcv;
			break;
#endif
#ifdef CONFIG_NET_DSA_TAG_EDSA
		case DSA_TAG_PROTO_EDSA:
			dst->rcv = edsa_netdev_ops.rcv;
			break;
#endif
#ifdef CONFIG_NET_DSA_TAG_TRAILER
		case DSA_TAG_PROTO_TRAILER:
			dst->rcv = trailer_netdev_ops.rcv;
			break;
#endif
#ifdef CONFIG_NET_DSA_TAG_BRCM
		case DSA_TAG_PROTO_BRCM:
			dst->rcv = brcm_netdev_ops.rcv;
			break;
#endif
290
		case DSA_TAG_PROTO_NONE:
291
			break;
292 293 294
		default:
			ret = -ENOPROTOOPT;
			goto out;
295
		}
296

297
		dst->tag_protocol = drv->tag_protocol;
298
	}
299

300 301
	memcpy(ds->rtable, cd->rtable, sizeof(ds->rtable));

302 303 304 305 306 307 308
	/*
	 * Do basic register setup.
	 */
	ret = drv->setup(ds);
	if (ret < 0)
		goto out;

309
	ret = drv->set_addr(ds, dst->master_netdev->dev_addr);
310 311 312
	if (ret < 0)
		goto out;

313
	ds->slave_mii_bus = devm_mdiobus_alloc(parent);
314 315 316 317 318 319 320 321
	if (ds->slave_mii_bus == NULL) {
		ret = -ENOMEM;
		goto out;
	}
	dsa_slave_mii_bus_init(ds);

	ret = mdiobus_register(ds->slave_mii_bus);
	if (ret < 0)
322
		goto out;
323 324 325 326 327 328


	/*
	 * Create network devices for physical switch ports.
	 */
	for (i = 0; i < DSA_MAX_PORTS; i++) {
329 330
		ds->ports[i].dn = cd->port_dn[i];

331
		if (!(ds->enabled_port_mask & (1 << i)))
332 333
			continue;

A
Andrew Lunn 已提交
334
		ret = dsa_slave_create(ds, parent, i, cd->port_names[i]);
335
		if (ret < 0) {
R
Russell King 已提交
336
			netdev_err(dst->master_netdev, "[%d]: can't create dsa slave device for port %d(%s): %d\n",
A
Andrew Lunn 已提交
337
				   index, i, cd->port_names[i], ret);
338
			ret = 0;
339 340 341
		}
	}

342 343 344 345 346 347 348 349
	/* Perform configuration of the CPU and DSA ports */
	ret = dsa_cpu_dsa_setup(ds, dst->master_netdev);
	if (ret < 0) {
		netdev_err(dst->master_netdev, "[%d] : can't configure CPU and DSA ports\n",
			   index);
		ret = 0;
	}

350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
#ifdef CONFIG_NET_DSA_HWMON
	/* If the switch provides a temperature sensor,
	 * register with hardware monitoring subsystem.
	 * Treat registration error as non-fatal and ignore it.
	 */
	if (drv->get_temp) {
		const char *netname = netdev_name(dst->master_netdev);
		char hname[IFNAMSIZ + 1];
		int i, j;

		/* Create valid hwmon 'name' attribute */
		for (i = j = 0; i < IFNAMSIZ && netname[i]; i++) {
			if (isalnum(netname[i]))
				hname[j++] = netname[i];
		}
		hname[j] = '\0';
		scnprintf(ds->hwmon_name, sizeof(ds->hwmon_name), "%s_dsa%d",
			  hname, index);
		ds->hwmon_dev = hwmon_device_register_with_groups(NULL,
					ds->hwmon_name, ds, dsa_hwmon_groups);
		if (IS_ERR(ds->hwmon_dev))
			ds->hwmon_dev = NULL;
	}
#endif /* CONFIG_NET_DSA_HWMON */

375
	return ret;
376 377

out:
378 379 380 381 382 383 384
	return ret;
}

static struct dsa_switch *
dsa_switch_setup(struct dsa_switch_tree *dst, int index,
		 struct device *parent, struct device *host_dev)
{
A
Andrew Lunn 已提交
385
	struct dsa_chip_data *cd = dst->pd->chip + index;
386 387 388
	struct dsa_switch_driver *drv;
	struct dsa_switch *ds;
	int ret;
V
Vivien Didelot 已提交
389
	const char *name;
390
	void *priv;
391 392 393 394

	/*
	 * Probe for switch model.
	 */
A
Andrew Lunn 已提交
395
	drv = dsa_switch_probe(parent, host_dev, cd->sw_addr, &name, &priv);
396 397 398 399 400 401 402 403 404 405 406 407
	if (drv == NULL) {
		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.
	 */
408
	ds = devm_kzalloc(parent, sizeof(*ds), GFP_KERNEL);
409
	if (ds == NULL)
410
		return ERR_PTR(-ENOMEM);
411 412 413

	ds->dst = dst;
	ds->index = index;
A
Andrew Lunn 已提交
414
	ds->cd = cd;
415
	ds->drv = drv;
416
	ds->priv = priv;
417
	ds->dev = parent;
418 419 420

	ret = dsa_switch_setup_one(ds, parent);
	if (ret)
421
		return ERR_PTR(ret);
422 423

	return ds;
424 425 426 427
}

static void dsa_switch_destroy(struct dsa_switch *ds)
{
428 429 430 431
	struct device_node *port_dn;
	struct phy_device *phydev;
	int port;

432 433 434 435
#ifdef CONFIG_NET_DSA_HWMON
	if (ds->hwmon_dev)
		hwmon_device_unregister(ds->hwmon_dev);
#endif
436

437 438
	/* Destroy network devices for physical switch ports. */
	for (port = 0; port < DSA_MAX_PORTS; port++) {
439
		if (!(ds->enabled_port_mask & (1 << port)))
440 441
			continue;

442
		if (!ds->ports[port].netdev)
443 444
			continue;

445
		dsa_slave_destroy(ds->ports[port].netdev);
446 447 448
	}

	/* Remove any fixed link PHYs */
449
	for (port = 0; port < DSA_MAX_PORTS; port++) {
450
		port_dn = ds->ports[port].dn;
451 452 453 454 455
		if (of_phy_is_fixed_link(port_dn)) {
			phydev = of_phy_find_device(port_dn);
			if (phydev) {
				phy_device_free(phydev);
				of_node_put(port_dn);
A
Andrew Lunn 已提交
456
				fixed_phy_unregister(phydev);
457 458 459 460
			}
		}
	}

461
	mdiobus_unregister(ds->slave_mii_bus);
462 463
}

464
#ifdef CONFIG_PM_SLEEP
465 466 467 468 469 470
static int dsa_switch_suspend(struct dsa_switch *ds)
{
	int i, ret = 0;

	/* Suspend slave network devices */
	for (i = 0; i < DSA_MAX_PORTS; i++) {
471
		if (!dsa_is_port_initialized(ds, i))
472 473
			continue;

474
		ret = dsa_slave_suspend(ds->ports[i].netdev);
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
		if (ret)
			return ret;
	}

	if (ds->drv->suspend)
		ret = ds->drv->suspend(ds);

	return ret;
}

static int dsa_switch_resume(struct dsa_switch *ds)
{
	int i, ret = 0;

	if (ds->drv->resume)
		ret = ds->drv->resume(ds);

	if (ret)
		return ret;

	/* Resume slave network devices */
	for (i = 0; i < DSA_MAX_PORTS; i++) {
497
		if (!dsa_is_port_initialized(ds, i))
498 499
			continue;

500
		ret = dsa_slave_resume(ds->ports[i].netdev);
501 502 503 504 505 506
		if (ret)
			return ret;
	}

	return 0;
}
507
#endif
508

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
/* 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);
}

528
struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev)
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
{
	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;
}
544
EXPORT_SYMBOL_GPL(dsa_host_dev_to_mii_bus);
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563

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

564 565 566
#ifdef CONFIG_OF
static int dsa_of_setup_routing_table(struct dsa_platform_data *pd,
					struct dsa_chip_data *cd,
567
					int chip_index, int port_index,
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
					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;

583 584 585 586
	/*
	 * Get the destination switch number from the second field of its 'reg'
	 * property, i.e. for "reg = <0x19 1>" sw_addr is '1'.
	 */
587 588 589 590 591
	link_sw_addr = be32_to_cpup(reg + 1);

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

592
	cd->rtable[link_sw_addr] = port_index;
593 594 595 596

	return 0;
}

597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
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;
}

622 623 624 625 626 627 628
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;
629
		while (port_index < DSA_MAX_PORTS) {
630
			kfree(pd->chip[i].port_names[port_index]);
631 632
			port_index++;
		}
633 634 635 636

		/* Drop our reference to the MDIO bus device */
		if (pd->chip[i].host_dev)
			put_device(pd->chip[i].host_dev);
637 638 639 640
	}
	kfree(pd->chip);
}

641
static int dsa_of_probe(struct device *dev)
642
{
643
	struct device_node *np = dev->of_node;
644
	struct device_node *child, *mdio, *ethernet, *port;
A
Andrew Lunn 已提交
645
	struct mii_bus *mdio_bus, *mdio_bus_switch;
646
	struct net_device *ethernet_dev;
647 648 649 650 651
	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;
652
	u32 eeprom_len;
653
	int ret;
654 655 656 657 658 659 660

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

	mdio_bus = of_mdio_find_bus(mdio);
	if (!mdio_bus)
661
		return -EPROBE_DEFER;
662 663

	ethernet = of_parse_phandle(np, "dsa,ethernet", 0);
664 665 666 667
	if (!ethernet) {
		ret = -EINVAL;
		goto out_put_mdio;
	}
668

669
	ethernet_dev = of_find_net_device_by_node(ethernet);
670 671 672 673
	if (!ethernet_dev) {
		ret = -EPROBE_DEFER;
		goto out_put_mdio;
	}
674 675

	pd = kzalloc(sizeof(*pd), GFP_KERNEL);
676 677
	if (!pd) {
		ret = -ENOMEM;
R
Russell King 已提交
678
		goto out_put_ethernet;
679
	}
680

681
	dev->platform_data = pd;
682
	pd->of_netdev = ethernet_dev;
683
	pd->nr_chips = of_get_available_child_count(np);
684 685 686
	if (pd->nr_chips > DSA_MAX_SWITCHES)
		pd->nr_chips = DSA_MAX_SWITCHES;

687 688
	pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
			   GFP_KERNEL);
689 690 691 692 693
	if (!pd->chip) {
		ret = -ENOMEM;
		goto out_free;
	}

694
	chip_index = -1;
695
	for_each_available_child_of_node(np, child) {
696
		chip_index++;
697 698
		cd = &pd->chip[chip_index];

699
		cd->of_node = child;
700 701 702

		/* When assigning the host device, increment its refcount */
		cd->host_dev = get_device(&mdio_bus->dev);
703 704 705 706 707 708

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

		cd->sw_addr = be32_to_cpup(sw_addr);
709
		if (cd->sw_addr >= PHY_MAX_ADDR)
710 711
			continue;

712
		if (!of_property_read_u32(child, "eeprom-length", &eeprom_len))
713 714
			cd->eeprom_len = eeprom_len;

A
Andrew Lunn 已提交
715 716 717 718 719 720 721
		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;
			}
722 723 724 725 726 727

			/* 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 已提交
728 729 730
			cd->host_dev = &mdio_bus_switch->dev;
		}

731 732 733 734 735 736
		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);
737 738
			if (port_index >= DSA_MAX_PORTS)
				break;
739 740 741 742 743

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

744 745
			cd->port_dn[port_index] = port;

746 747 748 749 750 751 752
			cd->port_names[port_index] = kstrdup(port_name,
					GFP_KERNEL);
			if (!cd->port_names[port_index]) {
				ret = -ENOMEM;
				goto out_free_chip;
			}

753 754 755 756
			ret = dsa_of_probe_links(pd, cd, chip_index,
						 port_index, port, port_name);
			if (ret)
				goto out_free_chip;
757 758 759 760

		}
	}

761 762 763 764
	/* The individual chips hold their own refcount on the mdio bus,
	 * so drop ours */
	put_device(&mdio_bus->dev);

765 766 767
	return 0;

out_free_chip:
768
	dsa_of_free_platform_data(pd);
769 770
out_free:
	kfree(pd);
771
	dev->platform_data = NULL;
R
Russell King 已提交
772 773
out_put_ethernet:
	put_device(&ethernet_dev->dev);
774 775
out_put_mdio:
	put_device(&mdio_bus->dev);
776 777 778
	return ret;
}

779
static void dsa_of_remove(struct device *dev)
780
{
781
	struct dsa_platform_data *pd = dev->platform_data;
782

783
	if (!dev->of_node)
784 785
		return;

786
	dsa_of_free_platform_data(pd);
R
Russell King 已提交
787
	put_device(&pd->of_netdev->dev);
788 789 790
	kfree(pd);
}
#else
791
static inline int dsa_of_probe(struct device *dev)
792 793 794 795
{
	return 0;
}

796
static inline void dsa_of_remove(struct device *dev)
797 798 799 800
{
}
#endif

801 802
static int dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev,
			 struct device *parent, struct dsa_platform_data *pd)
803 804
{
	int i;
805
	unsigned configured = 0;
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822

	dst->pd = pd;
	dst->master_netdev = dev;
	dst->cpu_switch = -1;
	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;
823 824

		++configured;
825 826
	}

827 828 829 830 831 832
	/*
	 * If no switch was found, exit cleanly
	 */
	if (!configured)
		return -EPROBE_DEFER;

833 834 835 836 837 838 839 840
	/*
	 * 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;

841
	return 0;
842 843
}

844 845 846 847
static int dsa_probe(struct platform_device *pdev)
{
	struct dsa_platform_data *pd = pdev->dev.platform_data;
	struct net_device *dev;
848
	struct dsa_switch_tree *dst;
849
	int ret;
850

851 852
	pr_notice_once("Distributed Switch Architecture driver version %s\n",
		       dsa_driver_version);
853

854
	if (pdev->dev.of_node) {
855
		ret = dsa_of_probe(&pdev->dev);
856 857 858 859 860 861
		if (ret)
			return ret;

		pd = pdev->dev.platform_data;
	}

862
	if (pd == NULL || (pd->netdev == NULL && pd->of_netdev == NULL))
863 864
		return -EINVAL;

865 866 867 868 869 870
	if (pd->of_netdev) {
		dev = pd->of_netdev;
		dev_hold(dev);
	} else {
		dev = dev_to_net_device(pd->netdev);
	}
871
	if (dev == NULL) {
872
		ret = -EPROBE_DEFER;
873 874
		goto out;
	}
875 876 877

	if (dev->dsa_ptr != NULL) {
		dev_put(dev);
878 879
		ret = -EEXIST;
		goto out;
880 881
	}

882
	dst = devm_kzalloc(&pdev->dev, sizeof(*dst), GFP_KERNEL);
883
	if (dst == NULL) {
884
		dev_put(dev);
885 886
		ret = -ENOMEM;
		goto out;
887 888
	}

889 890
	platform_set_drvdata(pdev, dst);

891
	ret = dsa_setup_dst(dst, dev, &pdev->dev, pd);
892 893
	if (ret) {
		dev_put(dev);
894
		goto out;
895
	}
896 897

	return 0;
898 899

out:
900
	dsa_of_remove(&pdev->dev);
901 902

	return ret;
903 904
}

905
static void dsa_remove_dst(struct dsa_switch_tree *dst)
906
{
907
	int i;
908

909 910 911 912 913 914 915 916
	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();

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

920
		if (ds)
921 922
			dsa_switch_destroy(ds);
	}
923 924

	dev_put(dst->master_netdev);
925 926 927 928 929
}

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

931
	dsa_remove_dst(dst);
932
	dsa_of_remove(&pdev->dev);
933

934 935 936 937 938 939 940
	return 0;
}

static void dsa_shutdown(struct platform_device *pdev)
{
}

941 942 943 944 945 946 947 948 949 950
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;
	}

951
	return dst->rcv(skb, dev, pt, orig_dev);
952 953
}

954
static struct packet_type dsa_pack_type __read_mostly = {
955 956 957 958
	.type	= cpu_to_be16(ETH_P_XDSA),
	.func	= dsa_switch_rcv,
};

959 960 961 962
static struct notifier_block dsa_netdevice_nb __read_mostly = {
	.notifier_call	= dsa_slave_netdevice_event,
};

963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
#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);

999
static const struct of_device_id dsa_of_match_table[] = {
1000
	{ .compatible = "brcm,bcm7445-switch-v4.0" },
1001 1002 1003 1004 1005
	{ .compatible = "marvell,dsa", },
	{}
};
MODULE_DEVICE_TABLE(of, dsa_of_match_table);

1006 1007 1008 1009 1010 1011
static struct platform_driver dsa_driver = {
	.probe		= dsa_probe,
	.remove		= dsa_remove,
	.shutdown	= dsa_shutdown,
	.driver = {
		.name	= "dsa",
1012
		.of_match_table = dsa_of_match_table,
1013
		.pm	= &dsa_pm_ops,
1014 1015 1016 1017 1018
	},
};

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

1021 1022
	register_netdevice_notifier(&dsa_netdevice_nb);

B
Ben Hutchings 已提交
1023 1024 1025 1026
	rc = platform_driver_register(&dsa_driver);
	if (rc)
		return rc;

1027 1028
	dev_add_pack(&dsa_pack_type);

B
Ben Hutchings 已提交
1029
	return 0;
1030 1031 1032 1033 1034
}
module_init(dsa_init_module);

static void __exit dsa_cleanup_module(void)
{
1035
	unregister_netdevice_notifier(&dsa_netdevice_nb);
1036
	dev_remove_pack(&dsa_pack_type);
1037 1038 1039 1040
	platform_driver_unregister(&dsa_driver);
}
module_exit(dsa_cleanup_module);

1041
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
1042 1043 1044
MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:dsa");