chip.c 90.6 KB
Newer Older
1
/*
2 3
 * Marvell 88e6xxx Ethernet switch single-chip support
 *
4 5
 * Copyright (c) 2008 Marvell Semiconductor
 *
6 7 8
 * Copyright (c) 2015 CMC Electronics, Inc.
 *	Added support for VLAN Table Unit operations
 *
9 10
 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
 *
11 12 13 14 15 16
 * 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.
 */

17
#include <linux/delay.h>
18
#include <linux/etherdevice.h>
19
#include <linux/ethtool.h>
20
#include <linux/if_bridge.h>
21
#include <linux/jiffies.h>
22
#include <linux/list.h>
23
#include <linux/mdio.h>
24
#include <linux/module.h>
25
#include <linux/of_device.h>
26
#include <linux/of_mdio.h>
27
#include <linux/netdevice.h>
28
#include <linux/gpio/consumer.h>
29
#include <linux/phy.h>
30
#include <net/dsa.h>
31
#include <net/switchdev.h>
32

33
#include "mv88e6xxx.h"
34
#include "global2.h"
35

36
static void assert_reg_lock(struct mv88e6xxx_chip *chip)
37
{
38 39
	if (unlikely(!mutex_is_locked(&chip->reg_lock))) {
		dev_err(chip->dev, "Switch registers lock not held!\n");
40 41 42 43
		dump_stack();
	}
}

44 45 46 47 48 49 50 51 52 53
/* The switch ADDR[4:1] configuration pins define the chip SMI device address
 * (ADDR[0] is always zero, thus only even SMI addresses can be strapped).
 *
 * When ADDR is all zero, the chip uses Single-chip Addressing Mode, assuming it
 * is the only device connected to the SMI master. In this mode it responds to
 * all 32 possible SMI addresses, and thus maps directly the internal devices.
 *
 * When ADDR is non-zero, the chip uses Multi-chip Addressing Mode, allowing
 * multiple devices to share the SMI interface. In this mode it responds to only
 * 2 registers, used to indirectly access the internal SMI devices.
54
 */
55

56
static int mv88e6xxx_smi_read(struct mv88e6xxx_chip *chip,
57 58
			      int addr, int reg, u16 *val)
{
59
	if (!chip->smi_ops)
60 61
		return -EOPNOTSUPP;

62
	return chip->smi_ops->read(chip, addr, reg, val);
63 64
}

65
static int mv88e6xxx_smi_write(struct mv88e6xxx_chip *chip,
66 67
			       int addr, int reg, u16 val)
{
68
	if (!chip->smi_ops)
69 70
		return -EOPNOTSUPP;

71
	return chip->smi_ops->write(chip, addr, reg, val);
72 73
}

74
static int mv88e6xxx_smi_single_chip_read(struct mv88e6xxx_chip *chip,
75 76 77 78
					  int addr, int reg, u16 *val)
{
	int ret;

79
	ret = mdiobus_read_nested(chip->bus, addr, reg);
80 81 82 83 84 85 86 87
	if (ret < 0)
		return ret;

	*val = ret & 0xffff;

	return 0;
}

88
static int mv88e6xxx_smi_single_chip_write(struct mv88e6xxx_chip *chip,
89 90 91 92
					   int addr, int reg, u16 val)
{
	int ret;

93
	ret = mdiobus_write_nested(chip->bus, addr, reg, val);
94 95 96 97 98 99 100 101 102 103 104
	if (ret < 0)
		return ret;

	return 0;
}

static const struct mv88e6xxx_ops mv88e6xxx_smi_single_chip_ops = {
	.read = mv88e6xxx_smi_single_chip_read,
	.write = mv88e6xxx_smi_single_chip_write,
};

105
static int mv88e6xxx_smi_multi_chip_wait(struct mv88e6xxx_chip *chip)
106 107 108 109 110
{
	int ret;
	int i;

	for (i = 0; i < 16; i++) {
111
		ret = mdiobus_read_nested(chip->bus, chip->sw_addr, SMI_CMD);
112 113 114
		if (ret < 0)
			return ret;

115
		if ((ret & SMI_CMD_BUSY) == 0)
116 117 118 119 120 121
			return 0;
	}

	return -ETIMEDOUT;
}

122
static int mv88e6xxx_smi_multi_chip_read(struct mv88e6xxx_chip *chip,
123
					 int addr, int reg, u16 *val)
124 125 126
{
	int ret;

127
	/* Wait for the bus to become free. */
128
	ret = mv88e6xxx_smi_multi_chip_wait(chip);
129 130 131
	if (ret < 0)
		return ret;

132
	/* Transmit the read command. */
133
	ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_CMD,
134
				   SMI_CMD_OP_22_READ | (addr << 5) | reg);
135 136 137
	if (ret < 0)
		return ret;

138
	/* Wait for the read command to complete. */
139
	ret = mv88e6xxx_smi_multi_chip_wait(chip);
140 141 142
	if (ret < 0)
		return ret;

143
	/* Read the data. */
144
	ret = mdiobus_read_nested(chip->bus, chip->sw_addr, SMI_DATA);
145 146 147
	if (ret < 0)
		return ret;

148
	*val = ret & 0xffff;
149

150
	return 0;
151 152
}

153
static int mv88e6xxx_smi_multi_chip_write(struct mv88e6xxx_chip *chip,
154
					  int addr, int reg, u16 val)
155 156 157
{
	int ret;

158
	/* Wait for the bus to become free. */
159
	ret = mv88e6xxx_smi_multi_chip_wait(chip);
160 161 162
	if (ret < 0)
		return ret;

163
	/* Transmit the data to write. */
164
	ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_DATA, val);
165 166 167
	if (ret < 0)
		return ret;

168
	/* Transmit the write command. */
169
	ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_CMD,
170
				   SMI_CMD_OP_22_WRITE | (addr << 5) | reg);
171 172 173
	if (ret < 0)
		return ret;

174
	/* Wait for the write command to complete. */
175
	ret = mv88e6xxx_smi_multi_chip_wait(chip);
176 177 178 179 180 181
	if (ret < 0)
		return ret;

	return 0;
}

182 183 184 185 186
static const struct mv88e6xxx_ops mv88e6xxx_smi_multi_chip_ops = {
	.read = mv88e6xxx_smi_multi_chip_read,
	.write = mv88e6xxx_smi_multi_chip_write,
};

187
int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val)
188 189 190
{
	int err;

191
	assert_reg_lock(chip);
192

193
	err = mv88e6xxx_smi_read(chip, addr, reg, val);
194 195 196
	if (err)
		return err;

197
	dev_dbg(chip->dev, "<- addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n",
198 199 200 201 202
		addr, reg, *val);

	return 0;
}

203
int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val)
204
{
205 206
	int err;

207
	assert_reg_lock(chip);
208

209
	err = mv88e6xxx_smi_write(chip, addr, reg, val);
210 211 212
	if (err)
		return err;

213
	dev_dbg(chip->dev, "-> addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n",
214 215
		addr, reg, val);

216 217 218
	return 0;
}

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
static int mv88e6xxx_phy_read(struct mv88e6xxx_chip *chip, int phy,
			      int reg, u16 *val)
{
	int addr = phy; /* PHY devices addresses start at 0x0 */

	if (!chip->phy_ops)
		return -EOPNOTSUPP;

	return chip->phy_ops->read(chip, addr, reg, val);
}

static int mv88e6xxx_phy_write(struct mv88e6xxx_chip *chip, int phy,
			       int reg, u16 val)
{
	int addr = phy; /* PHY devices addresses start at 0x0 */

	if (!chip->phy_ops)
		return -EOPNOTSUPP;

	return chip->phy_ops->write(chip, addr, reg, val);
}

241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
static int mv88e6xxx_phy_page_get(struct mv88e6xxx_chip *chip, int phy, u8 page)
{
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_PHY_PAGE))
		return -EOPNOTSUPP;

	return mv88e6xxx_phy_write(chip, phy, PHY_PAGE, page);
}

static void mv88e6xxx_phy_page_put(struct mv88e6xxx_chip *chip, int phy)
{
	int err;

	/* Restore PHY page Copper 0x0 for access via the registered MDIO bus */
	err = mv88e6xxx_phy_write(chip, phy, PHY_PAGE, PHY_PAGE_COPPER);
	if (unlikely(err)) {
		dev_err(chip->dev, "failed to restore PHY %d page Copper (%d)\n",
			phy, err);
	}
}

static int mv88e6xxx_phy_page_read(struct mv88e6xxx_chip *chip, int phy,
				   u8 page, int reg, u16 *val)
{
	int err;

	/* There is no paging for registers 22 */
	if (reg == PHY_PAGE)
		return -EINVAL;

	err = mv88e6xxx_phy_page_get(chip, phy, page);
	if (!err) {
		err = mv88e6xxx_phy_read(chip, phy, reg, val);
		mv88e6xxx_phy_page_put(chip, phy);
	}

	return err;
}

static int mv88e6xxx_phy_page_write(struct mv88e6xxx_chip *chip, int phy,
				    u8 page, int reg, u16 val)
{
	int err;

	/* There is no paging for registers 22 */
	if (reg == PHY_PAGE)
		return -EINVAL;

	err = mv88e6xxx_phy_page_get(chip, phy, page);
	if (!err) {
		err = mv88e6xxx_phy_write(chip, phy, PHY_PAGE, page);
		mv88e6xxx_phy_page_put(chip, phy);
	}

	return err;
}

static int mv88e6xxx_serdes_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
{
	return mv88e6xxx_phy_page_read(chip, ADDR_SERDES, SERDES_PAGE_FIBER,
				       reg, val);
}

static int mv88e6xxx_serdes_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
{
	return mv88e6xxx_phy_page_write(chip, ADDR_SERDES, SERDES_PAGE_FIBER,
					reg, val);
}

309
int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, u16 mask)
310
{
311
	int i;
312

313
	for (i = 0; i < 16; i++) {
314 315 316 317 318 319 320 321 322 323 324 325 326
		u16 val;
		int err;

		err = mv88e6xxx_read(chip, addr, reg, &val);
		if (err)
			return err;

		if (!(val & mask))
			return 0;

		usleep_range(1000, 2000);
	}

327
	dev_err(chip->dev, "Timeout while waiting for switch\n");
328 329 330
	return -ETIMEDOUT;
}

331
/* Indirect write to single pointer-data register with an Update bit */
332
int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, u16 update)
333 334
{
	u16 val;
335
	int err;
336 337

	/* Wait until the previous operation is completed */
338 339 340
	err = mv88e6xxx_wait(chip, addr, reg, BIT(15));
	if (err)
		return err;
341 342 343 344 345 346 347

	/* Set the Update bit to trigger a write operation */
	val = BIT(15) | update;

	return mv88e6xxx_write(chip, addr, reg, val);
}

348
static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
349 350 351 352
{
	u16 val;
	int err;

353
	err = mv88e6xxx_read(chip, addr, reg, &val);
354 355 356 357 358 359
	if (err)
		return err;

	return val;
}

360
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
361 362
				int reg, u16 val)
{
363
	return mv88e6xxx_write(chip, addr, reg, val);
364 365
}

366
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
367 368
{
	int ret;
369
	int i;
370

371
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
372 373 374
	if (ret < 0)
		return ret;

375
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
376
				   ret & ~GLOBAL_CONTROL_PPU_ENABLE);
377 378
	if (ret)
		return ret;
379

380
	for (i = 0; i < 16; i++) {
381
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
382 383 384
		if (ret < 0)
			return ret;

385
		usleep_range(1000, 2000);
386 387
		if ((ret & GLOBAL_STATUS_PPU_MASK) !=
		    GLOBAL_STATUS_PPU_POLLING)
388
			return 0;
389 390 391 392 393
	}

	return -ETIMEDOUT;
}

394
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
395
{
396
	int ret, err, i;
397

398
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
399 400 401
	if (ret < 0)
		return ret;

402
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
403
				   ret | GLOBAL_CONTROL_PPU_ENABLE);
404 405
	if (err)
		return err;
406

407
	for (i = 0; i < 16; i++) {
408
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
409 410 411
		if (ret < 0)
			return ret;

412
		usleep_range(1000, 2000);
413 414
		if ((ret & GLOBAL_STATUS_PPU_MASK) ==
		    GLOBAL_STATUS_PPU_POLLING)
415
			return 0;
416 417 418 419 420 421 422
	}

	return -ETIMEDOUT;
}

static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
{
423
	struct mv88e6xxx_chip *chip;
424

425
	chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
426

427
	mutex_lock(&chip->reg_lock);
428

429 430 431 432
	if (mutex_trylock(&chip->ppu_mutex)) {
		if (mv88e6xxx_ppu_enable(chip) == 0)
			chip->ppu_disabled = 0;
		mutex_unlock(&chip->ppu_mutex);
433
	}
434

435
	mutex_unlock(&chip->reg_lock);
436 437 438 439
}

static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
{
440
	struct mv88e6xxx_chip *chip = (void *)_ps;
441

442
	schedule_work(&chip->ppu_work);
443 444
}

445
static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
446 447 448
{
	int ret;

449
	mutex_lock(&chip->ppu_mutex);
450

451
	/* If the PHY polling unit is enabled, disable it so that
452 453 454 455
	 * we can access the PHY registers.  If it was already
	 * disabled, cancel the timer that is going to re-enable
	 * it.
	 */
456 457
	if (!chip->ppu_disabled) {
		ret = mv88e6xxx_ppu_disable(chip);
458
		if (ret < 0) {
459
			mutex_unlock(&chip->ppu_mutex);
460 461
			return ret;
		}
462
		chip->ppu_disabled = 1;
463
	} else {
464
		del_timer(&chip->ppu_timer);
465
		ret = 0;
466 467 468 469 470
	}

	return ret;
}

471
static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
472
{
473
	/* Schedule a timer to re-enable the PHY polling unit. */
474 475
	mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
	mutex_unlock(&chip->ppu_mutex);
476 477
}

478
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
479
{
480 481 482 483 484
	mutex_init(&chip->ppu_mutex);
	INIT_WORK(&chip->ppu_work, mv88e6xxx_ppu_reenable_work);
	init_timer(&chip->ppu_timer);
	chip->ppu_timer.data = (unsigned long)chip;
	chip->ppu_timer.function = mv88e6xxx_ppu_reenable_timer;
485 486
}

487 488 489 490 491
static void mv88e6xxx_ppu_state_destroy(struct mv88e6xxx_chip *chip)
{
	del_timer_sync(&chip->ppu_timer);
}

492 493
static int mv88e6xxx_phy_ppu_read(struct mv88e6xxx_chip *chip, int addr,
				  int reg, u16 *val)
494
{
495
	int err;
496

497 498 499
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_read(chip, addr, reg, val);
500
		mv88e6xxx_ppu_access_put(chip);
501 502
	}

503
	return err;
504 505
}

506 507
static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
				   int reg, u16 val)
508
{
509
	int err;
510

511 512 513
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_write(chip, addr, reg, val);
514
		mv88e6xxx_ppu_access_put(chip);
515 516
	}

517
	return err;
518 519
}

520 521 522 523 524
static const struct mv88e6xxx_ops mv88e6xxx_phy_ppu_ops = {
	.read = mv88e6xxx_phy_ppu_read,
	.write = mv88e6xxx_phy_ppu_write,
};

525
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
526
{
527
	return chip->info->family == MV88E6XXX_FAMILY_6065;
528 529
}

530
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
531
{
532
	return chip->info->family == MV88E6XXX_FAMILY_6095;
533 534
}

535
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
536
{
537
	return chip->info->family == MV88E6XXX_FAMILY_6097;
538 539
}

540
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
541
{
542
	return chip->info->family == MV88E6XXX_FAMILY_6165;
543 544
}

545
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
546
{
547
	return chip->info->family == MV88E6XXX_FAMILY_6185;
548 549
}

550
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
551
{
552
	return chip->info->family == MV88E6XXX_FAMILY_6320;
553 554
}

555
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
556
{
557
	return chip->info->family == MV88E6XXX_FAMILY_6351;
558 559
}

560
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
561
{
562
	return chip->info->family == MV88E6XXX_FAMILY_6352;
563 564
}

565
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
566
{
567
	return chip->info->num_databases;
568 569
}

570
static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
571 572
{
	/* Does the device have dedicated FID registers for ATU and VTU ops? */
573 574
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
575 576 577 578 579
		return true;

	return false;
}

580 581 582 583
/* We expect the switch to perform auto negotiation if there is a real
 * phy. However, in the case of a fixed link phy, we force the port
 * settings from the fixed link settings.
 */
584 585
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
586
{
V
Vivien Didelot 已提交
587
	struct mv88e6xxx_chip *chip = ds->priv;
588 589
	u32 reg;
	int ret;
590 591 592 593

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

594
	mutex_lock(&chip->reg_lock);
595

596
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
597 598 599 600 601 602 603 604 605 606 607
	if (ret < 0)
		goto out;

	reg = ret & ~(PORT_PCS_CTRL_LINK_UP |
		      PORT_PCS_CTRL_FORCE_LINK |
		      PORT_PCS_CTRL_DUPLEX_FULL |
		      PORT_PCS_CTRL_FORCE_DUPLEX |
		      PORT_PCS_CTRL_UNFORCED);

	reg |= PORT_PCS_CTRL_FORCE_LINK;
	if (phydev->link)
608
		reg |= PORT_PCS_CTRL_LINK_UP;
609

610
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631
		goto out;

	switch (phydev->speed) {
	case SPEED_1000:
		reg |= PORT_PCS_CTRL_1000;
		break;
	case SPEED_100:
		reg |= PORT_PCS_CTRL_100;
		break;
	case SPEED_10:
		reg |= PORT_PCS_CTRL_10;
		break;
	default:
		pr_info("Unknown speed");
		goto out;
	}

	reg |= PORT_PCS_CTRL_FORCE_DUPLEX;
	if (phydev->duplex == DUPLEX_FULL)
		reg |= PORT_PCS_CTRL_DUPLEX_FULL;

632 633
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
634 635 636 637 638 639 640 641
		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
			reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK;
		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
			reg |= PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
			reg |= (PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
				PORT_PCS_CTRL_RGMII_DELAY_TXCLK);
	}
642
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
643 644

out:
645
	mutex_unlock(&chip->reg_lock);
646 647
}

648
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
649 650 651 652 653
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
654
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
655
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
656 657 658 659 660 661
			return 0;
	}

	return -ETIMEDOUT;
}

662
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
663 664 665
{
	int ret;

666
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
667 668
		port = (port + 1) << 5;

669
	/* Snapshot the hardware statistics counters for this port. */
670
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
671 672 673 674
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
675

676
	/* Wait for the snapshotting to complete. */
677
	ret = _mv88e6xxx_stats_wait(chip);
678 679 680 681 682 683
	if (ret < 0)
		return ret;

	return 0;
}

684
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
685
				  int stat, u32 *val)
686 687 688 689 690 691
{
	u32 _val;
	int ret;

	*val = 0;

692
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
693 694
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
695 696 697
	if (ret < 0)
		return;

698
	ret = _mv88e6xxx_stats_wait(chip);
699 700 701
	if (ret < 0)
		return;

702
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
703 704 705 706 707
	if (ret < 0)
		return;

	_val = ret << 16;

708
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
709 710 711 712 713 714
	if (ret < 0)
		return;

	*val = _val | ret;
}

715
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
	{ "in_good_octets",	8, 0x00, BANK0, },
	{ "in_bad_octets",	4, 0x02, BANK0, },
	{ "in_unicast",		4, 0x04, BANK0, },
	{ "in_broadcasts",	4, 0x06, BANK0, },
	{ "in_multicasts",	4, 0x07, BANK0, },
	{ "in_pause",		4, 0x16, BANK0, },
	{ "in_undersize",	4, 0x18, BANK0, },
	{ "in_fragments",	4, 0x19, BANK0, },
	{ "in_oversize",	4, 0x1a, BANK0, },
	{ "in_jabber",		4, 0x1b, BANK0, },
	{ "in_rx_error",	4, 0x1c, BANK0, },
	{ "in_fcs_error",	4, 0x1d, BANK0, },
	{ "out_octets",		8, 0x0e, BANK0, },
	{ "out_unicast",	4, 0x10, BANK0, },
	{ "out_broadcasts",	4, 0x13, BANK0, },
	{ "out_multicasts",	4, 0x12, BANK0, },
	{ "out_pause",		4, 0x15, BANK0, },
	{ "excessive",		4, 0x11, BANK0, },
	{ "collisions",		4, 0x1e, BANK0, },
	{ "deferred",		4, 0x05, BANK0, },
	{ "single",		4, 0x14, BANK0, },
	{ "multiple",		4, 0x17, BANK0, },
	{ "out_fcs_error",	4, 0x03, BANK0, },
	{ "late",		4, 0x1f, BANK0, },
	{ "hist_64bytes",	4, 0x08, BANK0, },
	{ "hist_65_127bytes",	4, 0x09, BANK0, },
	{ "hist_128_255bytes",	4, 0x0a, BANK0, },
	{ "hist_256_511bytes",	4, 0x0b, BANK0, },
	{ "hist_512_1023bytes", 4, 0x0c, BANK0, },
	{ "hist_1024_max_bytes", 4, 0x0d, BANK0, },
	{ "sw_in_discards",	4, 0x10, PORT, },
	{ "sw_in_filtered",	2, 0x12, PORT, },
	{ "sw_out_filtered",	2, 0x13, PORT, },
	{ "in_discards",	4, 0x00 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_filtered",	4, 0x01 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_accepted",	4, 0x02 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_bad_accepted",	4, 0x03 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_good_avb_class_a", 4, 0x04 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_good_avb_class_b", 4, 0x05 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_bad_avb_class_a", 4, 0x06 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_bad_avb_class_b", 4, 0x07 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "tcam_counter_0",	4, 0x08 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "tcam_counter_1",	4, 0x09 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "tcam_counter_2",	4, 0x0a | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "tcam_counter_3",	4, 0x0b | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_da_unknown",	4, 0x0e | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "in_management",	4, 0x0f | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_0",	4, 0x10 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_1",	4, 0x11 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_2",	4, 0x12 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_3",	4, 0x13 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_4",	4, 0x14 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_5",	4, 0x15 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_6",	4, 0x16 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_queue_7",	4, 0x17 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_cut_through",	4, 0x18 | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_octets_a",	4, 0x1a | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_octets_b",	4, 0x1b | GLOBAL_STATS_OP_BANK_1, BANK1, },
	{ "out_management",	4, 0x1f | GLOBAL_STATS_OP_BANK_1, BANK1, },
775 776
};

777
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
778
			       struct mv88e6xxx_hw_stat *stat)
779
{
780 781
	switch (stat->type) {
	case BANK0:
782
		return true;
783
	case BANK1:
784
		return mv88e6xxx_6320_family(chip);
785
	case PORT:
786 787 788 789 790 791
		return mv88e6xxx_6095_family(chip) ||
			mv88e6xxx_6185_family(chip) ||
			mv88e6xxx_6097_family(chip) ||
			mv88e6xxx_6165_family(chip) ||
			mv88e6xxx_6351_family(chip) ||
			mv88e6xxx_6352_family(chip);
792
	}
793
	return false;
794 795
}

796
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
797
					    struct mv88e6xxx_hw_stat *s,
798 799 800 801 802 803 804
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

805 806
	switch (s->type) {
	case PORT:
807
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
808 809 810 811 812
		if (ret < 0)
			return UINT64_MAX;

		low = ret;
		if (s->sizeof_stat == 4) {
813
			ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
814
						  s->reg + 1);
815 816 817 818
			if (ret < 0)
				return UINT64_MAX;
			high = ret;
		}
819 820 821
		break;
	case BANK0:
	case BANK1:
822
		_mv88e6xxx_stats_read(chip, s->reg, &low);
823
		if (s->sizeof_stat == 8)
824
			_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
825 826 827 828 829
	}
	value = (((u64)high) << 16) | low;
	return value;
}

830 831
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
832
{
V
Vivien Didelot 已提交
833
	struct mv88e6xxx_chip *chip = ds->priv;
834 835
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
836

837 838
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
839
		if (mv88e6xxx_has_stat(chip, stat)) {
840 841 842 843
			memcpy(data + j * ETH_GSTRING_LEN, stat->string,
			       ETH_GSTRING_LEN);
			j++;
		}
844
	}
845 846
}

847
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
848
{
V
Vivien Didelot 已提交
849
	struct mv88e6xxx_chip *chip = ds->priv;
850 851 852 853 854
	struct mv88e6xxx_hw_stat *stat;
	int i, j;

	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
855
		if (mv88e6xxx_has_stat(chip, stat))
856 857 858
			j++;
	}
	return j;
859 860
}

861 862
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
863
{
V
Vivien Didelot 已提交
864
	struct mv88e6xxx_chip *chip = ds->priv;
865 866 867 868
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

869
	mutex_lock(&chip->reg_lock);
870

871
	ret = _mv88e6xxx_stats_snapshot(chip, port);
872
	if (ret < 0) {
873
		mutex_unlock(&chip->reg_lock);
874 875 876 877
		return;
	}
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
878 879
		if (mv88e6xxx_has_stat(chip, stat)) {
			data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
880 881 882 883
			j++;
		}
	}

884
	mutex_unlock(&chip->reg_lock);
885 886
}

887
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
888 889 890 891
{
	return 32 * sizeof(u16);
}

892 893
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
894
{
V
Vivien Didelot 已提交
895
	struct mv88e6xxx_chip *chip = ds->priv;
896 897 898 899 900 901 902
	u16 *p = _p;
	int i;

	regs->version = 0;

	memset(p, 0xff, 32 * sizeof(u16));

903
	mutex_lock(&chip->reg_lock);
904

905 906 907
	for (i = 0; i < 32; i++) {
		int ret;

908
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
909 910 911
		if (ret >= 0)
			p[i] = ret;
	}
912

913
	mutex_unlock(&chip->reg_lock);
914 915
}

916
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
917
{
918 919
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
			      GLOBAL_ATU_OP_BUSY);
920 921
}

922 923
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
924
{
V
Vivien Didelot 已提交
925
	struct mv88e6xxx_chip *chip = ds->priv;
926 927
	u16 reg;
	int err;
928

929
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
930 931
		return -EOPNOTSUPP;

932
	mutex_lock(&chip->reg_lock);
933

934 935
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
936
		goto out;
937 938 939 940

	e->eee_enabled = !!(reg & 0x0200);
	e->tx_lpi_enabled = !!(reg & 0x0100);

941 942
	err = mv88e6xxx_read(chip, REG_PORT(port), PORT_STATUS, &reg);
	if (err)
943
		goto out;
944

945
	e->eee_active = !!(reg & PORT_STATUS_EEE);
946
out:
947
	mutex_unlock(&chip->reg_lock);
948 949

	return err;
950 951
}

952 953
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
954
{
V
Vivien Didelot 已提交
955
	struct mv88e6xxx_chip *chip = ds->priv;
956 957
	u16 reg;
	int err;
958

959
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
960 961
		return -EOPNOTSUPP;

962
	mutex_lock(&chip->reg_lock);
963

964 965
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
966 967
		goto out;

968
	reg &= ~0x0300;
969 970 971 972 973
	if (e->eee_enabled)
		reg |= 0x0200;
	if (e->tx_lpi_enabled)
		reg |= 0x0100;

974
	err = mv88e6xxx_phy_write(chip, port, 16, reg);
975
out:
976
	mutex_unlock(&chip->reg_lock);
977

978
	return err;
979 980
}

981
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
982 983 984
{
	int ret;

985 986 987
	if (mv88e6xxx_has_fid_reg(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID,
					   fid);
988 989
		if (ret < 0)
			return ret;
990
	} else if (mv88e6xxx_num_databases(chip) == 256) {
991
		/* ATU DBNum[7:4] are located in ATU Control 15:12 */
992
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL);
993 994 995
		if (ret < 0)
			return ret;

996
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
997 998 999 1000 1001 1002 1003
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

		/* ATU DBNum[3:0] are located in ATU Operation 3:0 */
		cmd |= fid & 0xf;
1004 1005
	}

1006
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
1007 1008 1009
	if (ret < 0)
		return ret;

1010
	return _mv88e6xxx_atu_wait(chip);
1011 1012
}

1013
static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
				     struct mv88e6xxx_atu_entry *entry)
{
	u16 data = entry->state & GLOBAL_ATU_DATA_STATE_MASK;

	if (entry->state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		unsigned int mask, shift;

		if (entry->trunk) {
			data |= GLOBAL_ATU_DATA_TRUNK;
			mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK;
			shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT;
		} else {
			mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK;
			shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT;
		}

		data |= (entry->portv_trunkid << shift) & mask;
	}

1033
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1034 1035
}

1036
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1037 1038
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1039
{
1040 1041
	int op;
	int err;
1042

1043
	err = _mv88e6xxx_atu_wait(chip);
1044 1045
	if (err)
		return err;
1046

1047
	err = _mv88e6xxx_atu_data_write(chip, entry);
1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
	if (err)
		return err;

	if (entry->fid) {
		op = static_too ? GLOBAL_ATU_OP_FLUSH_MOVE_ALL_DB :
			GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC_DB;
	} else {
		op = static_too ? GLOBAL_ATU_OP_FLUSH_MOVE_ALL :
			GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC;
	}

1059
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1060 1061
}

1062
static int _mv88e6xxx_atu_flush(struct mv88e6xxx_chip *chip,
1063
				u16 fid, bool static_too)
1064 1065 1066 1067 1068
{
	struct mv88e6xxx_atu_entry entry = {
		.fid = fid,
		.state = 0, /* EntryState bits must be 0 */
	};
1069

1070
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1071 1072
}

1073
static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
1074
			       int from_port, int to_port, bool static_too)
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
{
	struct mv88e6xxx_atu_entry entry = {
		.trunk = false,
		.fid = fid,
	};

	/* EntryState bits must be 0xF */
	entry.state = GLOBAL_ATU_DATA_STATE_MASK;

	/* ToPort and FromPort are respectively in PortVec bits 7:4 and 3:0 */
	entry.portv_trunkid = (to_port & 0x0f) << 4;
	entry.portv_trunkid |= from_port & 0x0f;

1088
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1089 1090
}

1091
static int _mv88e6xxx_atu_remove(struct mv88e6xxx_chip *chip, u16 fid,
1092
				 int port, bool static_too)
1093 1094
{
	/* Destination port 0xF means remove the entries */
1095
	return _mv88e6xxx_atu_move(chip, fid, port, 0x0f, static_too);
1096 1097
}

1098 1099 1100 1101 1102 1103 1104
static const char * const mv88e6xxx_port_state_names[] = {
	[PORT_CONTROL_STATE_DISABLED] = "Disabled",
	[PORT_CONTROL_STATE_BLOCKING] = "Blocking/Listening",
	[PORT_CONTROL_STATE_LEARNING] = "Learning",
	[PORT_CONTROL_STATE_FORWARDING] = "Forwarding",
};

1105
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1106
				 u8 state)
1107
{
1108
	struct dsa_switch *ds = chip->ds;
1109
	int reg, ret = 0;
1110 1111
	u8 oldstate;

1112
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1113 1114
	if (reg < 0)
		return reg;
1115

1116
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1117

1118 1119 1120 1121 1122
	if (oldstate != state) {
		/* Flush forwarding database if we're moving a port
		 * from Learning or Forwarding state to Disabled or
		 * Blocking or Listening state.
		 */
1123
		if ((oldstate == PORT_CONTROL_STATE_LEARNING ||
1124 1125 1126
		     oldstate == PORT_CONTROL_STATE_FORWARDING) &&
		    (state == PORT_CONTROL_STATE_DISABLED ||
		     state == PORT_CONTROL_STATE_BLOCKING)) {
1127
			ret = _mv88e6xxx_atu_remove(chip, 0, port, false);
1128
			if (ret)
1129
				return ret;
1130
		}
1131

1132
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1133
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1134
					   reg);
1135 1136 1137
		if (ret)
			return ret;

1138
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1139 1140
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1141 1142 1143 1144 1145
	}

	return ret;
}

1146
static int _mv88e6xxx_port_based_vlan_map(struct mv88e6xxx_chip *chip, int port)
1147
{
1148 1149 1150
	struct net_device *bridge = chip->ports[port].bridge_dev;
	const u16 mask = (1 << chip->info->num_ports) - 1;
	struct dsa_switch *ds = chip->ds;
1151
	u16 output_ports = 0;
1152
	int reg;
1153 1154 1155 1156 1157 1158
	int i;

	/* allow CPU port or DSA link(s) to send frames to every port */
	if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
		output_ports = mask;
	} else {
1159
		for (i = 0; i < chip->info->num_ports; ++i) {
1160
			/* allow sending frames to every group member */
1161
			if (bridge && chip->ports[i].bridge_dev == bridge)
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
				output_ports |= BIT(i);

			/* allow sending frames to CPU port and DSA link(s) */
			if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
				output_ports |= BIT(i);
		}
	}

	/* prevent frames from going back out of the port they came in on */
	output_ports &= ~BIT(port);
1172

1173
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1174 1175
	if (reg < 0)
		return reg;
1176

1177 1178
	reg &= ~mask;
	reg |= output_ports & mask;
1179

1180
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1181 1182
}

1183 1184
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1185
{
V
Vivien Didelot 已提交
1186
	struct mv88e6xxx_chip *chip = ds->priv;
1187
	int stp_state;
1188
	int err;
1189 1190 1191

	switch (state) {
	case BR_STATE_DISABLED:
1192
		stp_state = PORT_CONTROL_STATE_DISABLED;
1193 1194 1195
		break;
	case BR_STATE_BLOCKING:
	case BR_STATE_LISTENING:
1196
		stp_state = PORT_CONTROL_STATE_BLOCKING;
1197 1198
		break;
	case BR_STATE_LEARNING:
1199
		stp_state = PORT_CONTROL_STATE_LEARNING;
1200 1201 1202
		break;
	case BR_STATE_FORWARDING:
	default:
1203
		stp_state = PORT_CONTROL_STATE_FORWARDING;
1204 1205 1206
		break;
	}

1207 1208 1209
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1210 1211

	if (err)
1212 1213
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1214
			   mv88e6xxx_port_state_names[stp_state]);
1215 1216
}

1217
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1218
				u16 *new, u16 *old)
1219
{
1220
	struct dsa_switch *ds = chip->ds;
1221
	u16 pvid;
1222 1223
	int ret;

1224
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1225 1226 1227
	if (ret < 0)
		return ret;

1228 1229 1230 1231 1232 1233
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

	if (new) {
		ret &= ~PORT_DEFAULT_VLAN_MASK;
		ret |= *new & PORT_DEFAULT_VLAN_MASK;

1234
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1235 1236 1237 1238
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1239 1240
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1241 1242 1243 1244
	}

	if (old)
		*old = pvid;
1245 1246 1247 1248

	return 0;
}

1249
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1250
				    int port, u16 *pvid)
1251
{
1252
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1253 1254
}

1255
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1256
				    int port, u16 pvid)
1257
{
1258
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1259 1260
}

1261
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1262
{
1263 1264
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
			      GLOBAL_VTU_OP_BUSY);
1265 1266
}

1267
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1268 1269 1270
{
	int ret;

1271
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1272 1273 1274
	if (ret < 0)
		return ret;

1275
	return _mv88e6xxx_vtu_wait(chip);
1276 1277
}

1278
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1279 1280 1281
{
	int ret;

1282
	ret = _mv88e6xxx_vtu_wait(chip);
1283 1284 1285
	if (ret < 0)
		return ret;

1286
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1287 1288
}

1289
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1290 1291 1292 1293 1294 1295 1296 1297
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1298
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1299 1300 1301 1302 1303 1304 1305
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1306
	for (i = 0; i < chip->info->num_ports; ++i) {
1307 1308 1309 1310 1311 1312 1313 1314 1315
		unsigned int shift = (i % 4) * 4 + nibble_offset;
		u16 reg = regs[i / 4];

		entry->data[i] = (reg >> shift) & GLOBAL_VTU_STU_DATA_MASK;
	}

	return 0;
}

1316
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1317 1318
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1319
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1320 1321
}

1322
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1323 1324
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1325
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1326 1327
}

1328
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1329 1330 1331 1332 1333 1334 1335
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

1336
	for (i = 0; i < chip->info->num_ports; ++i) {
1337 1338 1339 1340 1341 1342 1343
		unsigned int shift = (i % 4) * 4 + nibble_offset;
		u8 data = entry->data[i];

		regs[i / 4] |= (data & GLOBAL_VTU_STU_DATA_MASK) << shift;
	}

	for (i = 0; i < 3; ++i) {
1344
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
1345 1346 1347 1348 1349 1350 1351 1352
					   GLOBAL_VTU_DATA_0_3 + i, regs[i]);
		if (ret < 0)
			return ret;
	}

	return 0;
}

1353
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1354 1355
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1356
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1357 1358
}

1359
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1360 1361
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1362
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1363 1364
}

1365
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1366
{
1367
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1368 1369 1370
				    vid & GLOBAL_VTU_VID_MASK);
}

1371
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1372 1373 1374 1375 1376
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1377
	ret = _mv88e6xxx_vtu_wait(chip);
1378 1379 1380
	if (ret < 0)
		return ret;

1381
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1382 1383 1384
	if (ret < 0)
		return ret;

1385
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1386 1387 1388 1389 1390 1391 1392
	if (ret < 0)
		return ret;

	next.vid = ret & GLOBAL_VTU_VID_MASK;
	next.valid = !!(ret & GLOBAL_VTU_VID_VALID);

	if (next.valid) {
1393
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1394 1395 1396
		if (ret < 0)
			return ret;

1397 1398
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1399 1400 1401 1402 1403
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

			next.fid = ret & GLOBAL_VTU_FID_MASK;
1404
		} else if (mv88e6xxx_num_databases(chip) == 256) {
1405 1406 1407
			/* VTU DBNum[7:4] are located in VTU Operation 11:8, and
			 * VTU DBNum[3:0] are located in VTU Operation 3:0
			 */
1408
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1409 1410 1411 1412 1413 1414
						  GLOBAL_VTU_OP);
			if (ret < 0)
				return ret;

			next.fid = (ret & 0xf00) >> 4;
			next.fid |= ret & 0xf;
1415
		}
1416

1417 1418
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1431 1432 1433
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1434
{
V
Vivien Didelot 已提交
1435
	struct mv88e6xxx_chip *chip = ds->priv;
1436 1437 1438 1439
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1440
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1441 1442
		return -EOPNOTSUPP;

1443
	mutex_lock(&chip->reg_lock);
1444

1445
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1446 1447 1448
	if (err)
		goto unlock;

1449
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1450 1451 1452 1453
	if (err)
		goto unlock;

	do {
1454
		err = _mv88e6xxx_vtu_getnext(chip, &next);
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
		if (err)
			break;

		if (!next.valid)
			break;

		if (next.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
			continue;

		/* reinit and dump this VLAN obj */
1465 1466
		vlan->vid_begin = next.vid;
		vlan->vid_end = next.vid;
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
		vlan->flags = 0;

		if (next.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED)
			vlan->flags |= BRIDGE_VLAN_INFO_UNTAGGED;

		if (next.vid == pvid)
			vlan->flags |= BRIDGE_VLAN_INFO_PVID;

		err = cb(&vlan->obj);
		if (err)
			break;
	} while (next.vid < GLOBAL_VTU_VID_MASK);

unlock:
1481
	mutex_unlock(&chip->reg_lock);
1482 1483 1484 1485

	return err;
}

1486
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1487 1488
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1489
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1490 1491 1492
	u16 reg = 0;
	int ret;

1493
	ret = _mv88e6xxx_vtu_wait(chip);
1494 1495 1496 1497 1498 1499 1500
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1501
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1502 1503 1504
	if (ret < 0)
		return ret;

1505
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1506
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1507 1508
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1509 1510
		if (ret < 0)
			return ret;
1511
	}
1512

1513
	if (mv88e6xxx_has_fid_reg(chip)) {
1514
		reg = entry->fid & GLOBAL_VTU_FID_MASK;
1515 1516
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
					   reg);
1517 1518
		if (ret < 0)
			return ret;
1519
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1520 1521 1522 1523 1524
		/* VTU DBNum[7:4] are located in VTU Operation 11:8, and
		 * VTU DBNum[3:0] are located in VTU Operation 3:0
		 */
		op |= (entry->fid & 0xf0) << 8;
		op |= entry->fid & 0xf;
1525 1526 1527 1528 1529
	}

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1530
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1531 1532 1533
	if (ret < 0)
		return ret;

1534
	return _mv88e6xxx_vtu_cmd(chip, op);
1535 1536
}

1537
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1538 1539 1540 1541 1542
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1543
	ret = _mv88e6xxx_vtu_wait(chip);
1544 1545 1546
	if (ret < 0)
		return ret;

1547
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1548 1549 1550 1551
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1552
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1553 1554 1555
	if (ret < 0)
		return ret;

1556
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1557 1558 1559 1560 1561
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1562
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1563 1564 1565 1566 1567 1568
	if (ret < 0)
		return ret;

	next.valid = !!(ret & GLOBAL_VTU_VID_VALID);

	if (next.valid) {
1569
		ret = mv88e6xxx_stu_data_read(chip, &next);
1570 1571 1572 1573 1574 1575 1576 1577
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1578
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1579 1580 1581 1582 1583
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1584
	ret = _mv88e6xxx_vtu_wait(chip);
1585 1586 1587 1588 1589 1590 1591
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1592
	ret = mv88e6xxx_stu_data_write(chip, entry);
1593 1594 1595 1596 1597
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1598
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1599 1600 1601 1602
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1603
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1604 1605 1606
	if (ret < 0)
		return ret;

1607
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1608 1609
}

1610
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1611
			       u16 *new, u16 *old)
1612
{
1613
	struct dsa_switch *ds = chip->ds;
1614
	u16 upper_mask;
1615 1616 1617
	u16 fid;
	int ret;

1618
	if (mv88e6xxx_num_databases(chip) == 4096)
1619
		upper_mask = 0xff;
1620
	else if (mv88e6xxx_num_databases(chip) == 256)
1621
		upper_mask = 0xf;
1622 1623 1624
	else
		return -EOPNOTSUPP;

1625
	/* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
1626
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1627 1628 1629 1630 1631 1632 1633 1634 1635
	if (ret < 0)
		return ret;

	fid = (ret & PORT_BASE_VLAN_FID_3_0_MASK) >> 12;

	if (new) {
		ret &= ~PORT_BASE_VLAN_FID_3_0_MASK;
		ret |= (*new << 12) & PORT_BASE_VLAN_FID_3_0_MASK;

1636
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1637 1638 1639 1640 1641 1642
					   ret);
		if (ret < 0)
			return ret;
	}

	/* Port's default FID bits 11:4 are located in reg 0x05, offset 0 */
1643
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_1);
1644 1645 1646
	if (ret < 0)
		return ret;

1647
	fid |= (ret & upper_mask) << 4;
1648 1649

	if (new) {
1650 1651
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1652

1653
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1654 1655 1656 1657
					   ret);
		if (ret < 0)
			return ret;

1658 1659
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1660 1661 1662 1663 1664 1665 1666 1667
	}

	if (old)
		*old = fid;

	return 0;
}

1668
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1669
				   int port, u16 *fid)
1670
{
1671
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1672 1673
}

1674
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1675
				   int port, u16 fid)
1676
{
1677
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1678 1679
}

1680
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1681 1682 1683
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1684
	int i, err;
1685 1686 1687

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

1688
	/* Set every FID bit used by the (un)bridged ports */
1689 1690
	for (i = 0; i < chip->info->num_ports; ++i) {
		err = _mv88e6xxx_port_fid_get(chip, i, fid);
1691 1692 1693 1694 1695 1696
		if (err)
			return err;

		set_bit(*fid, fid_bitmap);
	}

1697
	/* Set every FID bit used by the VLAN entries */
1698
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1699 1700 1701 1702
	if (err)
		return err;

	do {
1703
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
		if (err)
			return err;

		if (!vlan.valid)
			break;

		set_bit(vlan.fid, fid_bitmap);
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

	/* The reset value 0x000 is used to indicate that multiple address
	 * databases are not needed. Return the next positive available.
	 */
	*fid = find_next_zero_bit(fid_bitmap, MV88E6XXX_N_FID, 1);
1717
	if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
1718 1719 1720
		return -ENOSPC;

	/* Clear the database */
1721
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1722 1723
}

1724
static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
1725
			      struct mv88e6xxx_vtu_stu_entry *entry)
1726
{
1727
	struct dsa_switch *ds = chip->ds;
1728 1729 1730 1731
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.valid = true,
		.vid = vid,
	};
1732 1733
	int i, err;

1734
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1735 1736
	if (err)
		return err;
1737

1738
	/* exclude all ports except the CPU and DSA ports */
1739
	for (i = 0; i < chip->info->num_ports; ++i)
1740 1741 1742
		vlan.data[i] = dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i)
			? GLOBAL_VTU_DATA_MEMBER_TAG_UNMODIFIED
			: GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;
1743

1744 1745
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
1746 1747 1748 1749 1750 1751 1752
		struct mv88e6xxx_vtu_stu_entry vstp;

		/* Adding a VTU entry requires a valid STU entry. As VSTP is not
		 * implemented, only one STU entry is needed to cover all VTU
		 * entries. Thus, validate the SID 0.
		 */
		vlan.sid = 0;
1753
		err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
1754 1755 1756 1757 1758 1759 1760 1761
		if (err)
			return err;

		if (vstp.sid != vlan.sid || !vstp.valid) {
			memset(&vstp, 0, sizeof(vstp));
			vstp.valid = true;
			vstp.sid = vlan.sid;

1762
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1763 1764 1765 1766 1767 1768 1769 1770 1771
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

1772
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
1773 1774 1775 1776 1777 1778 1779
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

1780
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1781 1782 1783
	if (err)
		return err;

1784
	err = _mv88e6xxx_vtu_getnext(chip, entry);
1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
	if (err)
		return err;

	if (entry->vid != vid || !entry->valid) {
		if (!creat)
			return -EOPNOTSUPP;
		/* -ENOENT would've been more appropriate, but switchdev expects
		 * -EOPNOTSUPP to inform bridge about an eventual software VLAN.
		 */

1795
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1796 1797 1798 1799 1800
	}

	return err;
}

1801 1802 1803
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
V
Vivien Didelot 已提交
1804
	struct mv88e6xxx_chip *chip = ds->priv;
1805 1806 1807 1808 1809 1810
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

1811
	mutex_lock(&chip->reg_lock);
1812

1813
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1814 1815 1816 1817
	if (err)
		goto unlock;

	do {
1818
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1819 1820 1821 1822 1823 1824 1825 1826 1827
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

1828
		for (i = 0; i < chip->info->num_ports; ++i) {
1829 1830 1831 1832 1833 1834 1835
			if (dsa_is_dsa_port(ds, i) || dsa_is_cpu_port(ds, i))
				continue;

			if (vlan.data[i] ==
			    GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
				continue;

1836 1837
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
1838 1839
				break; /* same bridge, check next VLAN */

1840
			netdev_warn(ds->ports[port].netdev,
1841 1842
				    "hardware VLAN %d already used by %s\n",
				    vlan.vid,
1843
				    netdev_name(chip->ports[i].bridge_dev));
1844 1845 1846 1847 1848 1849
			err = -EOPNOTSUPP;
			goto unlock;
		}
	} while (vlan.vid < vid_end);

unlock:
1850
	mutex_unlock(&chip->reg_lock);
1851 1852 1853 1854

	return err;
}

1855 1856 1857 1858 1859 1860 1861
static const char * const mv88e6xxx_port_8021q_mode_names[] = {
	[PORT_CONTROL_2_8021Q_DISABLED] = "Disabled",
	[PORT_CONTROL_2_8021Q_FALLBACK] = "Fallback",
	[PORT_CONTROL_2_8021Q_CHECK] = "Check",
	[PORT_CONTROL_2_8021Q_SECURE] = "Secure",
};

1862 1863
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
1864
{
V
Vivien Didelot 已提交
1865
	struct mv88e6xxx_chip *chip = ds->priv;
1866 1867 1868 1869
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

1870
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1871 1872
		return -EOPNOTSUPP;

1873
	mutex_lock(&chip->reg_lock);
1874

1875
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1876 1877 1878 1879 1880
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1881 1882 1883
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1884

1885
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1886 1887 1888 1889
					   ret);
		if (ret < 0)
			goto unlock;

1890
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
1891 1892 1893
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
1894

1895
	ret = 0;
1896
unlock:
1897
	mutex_unlock(&chip->reg_lock);
1898 1899 1900 1901

	return ret;
}

1902 1903 1904 1905
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
1906
{
V
Vivien Didelot 已提交
1907
	struct mv88e6xxx_chip *chip = ds->priv;
1908 1909
	int err;

1910
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1911 1912
		return -EOPNOTSUPP;

1913 1914 1915 1916 1917 1918 1919 1920
	/* If the requested port doesn't belong to the same bridge as the VLAN
	 * members, do not support it (yet) and fallback to software VLAN.
	 */
	err = mv88e6xxx_port_check_hw_vlan(ds, port, vlan->vid_begin,
					   vlan->vid_end);
	if (err)
		return err;

1921 1922 1923 1924 1925 1926
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

1927
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1928
				    u16 vid, bool untagged)
1929 1930 1931 1932
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1933
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1934
	if (err)
1935
		return err;
1936 1937 1938 1939 1940

	vlan.data[port] = untagged ?
		GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED :
		GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED;

1941
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1942 1943
}

1944 1945 1946
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
1947
{
V
Vivien Didelot 已提交
1948
	struct mv88e6xxx_chip *chip = ds->priv;
1949 1950 1951 1952
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

1953
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1954 1955
		return;

1956
	mutex_lock(&chip->reg_lock);
1957

1958
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
1959
		if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
1960 1961
			netdev_err(ds->ports[port].netdev,
				   "failed to add VLAN %d%c\n",
1962
				   vid, untagged ? 'u' : 't');
1963

1964
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
1965
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
1966
			   vlan->vid_end);
1967

1968
	mutex_unlock(&chip->reg_lock);
1969 1970
}

1971
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
1972
				    int port, u16 vid)
1973
{
1974
	struct dsa_switch *ds = chip->ds;
1975 1976 1977
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

1978
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1979
	if (err)
1980
		return err;
1981

1982 1983
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
1984
		return -EOPNOTSUPP;
1985 1986 1987 1988

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

	/* keep the VLAN unless all ports are excluded */
1989
	vlan.valid = false;
1990
	for (i = 0; i < chip->info->num_ports; ++i) {
1991
		if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
1992 1993 1994
			continue;

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1995
			vlan.valid = true;
1996 1997 1998 1999
			break;
		}
	}

2000
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
2001 2002 2003
	if (err)
		return err;

2004
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
2005 2006
}

2007 2008
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
2009
{
V
Vivien Didelot 已提交
2010
	struct mv88e6xxx_chip *chip = ds->priv;
2011 2012 2013
	u16 pvid, vid;
	int err = 0;

2014
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2015 2016
		return -EOPNOTSUPP;

2017
	mutex_lock(&chip->reg_lock);
2018

2019
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
2020 2021 2022
	if (err)
		goto unlock;

2023
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
2024
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
2025 2026 2027 2028
		if (err)
			goto unlock;

		if (vid == pvid) {
2029
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2030 2031 2032 2033 2034
			if (err)
				goto unlock;
		}
	}

2035
unlock:
2036
	mutex_unlock(&chip->reg_lock);
2037 2038 2039 2040

	return err;
}

2041
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2042
				    const unsigned char *addr)
2043 2044 2045 2046
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2047
		ret = _mv88e6xxx_reg_write(
2048
			chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i,
2049
			(addr[i * 2] << 8) | addr[i * 2 + 1]);
2050 2051 2052 2053 2054 2055 2056
		if (ret < 0)
			return ret;
	}

	return 0;
}

2057
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2058
				   unsigned char *addr)
2059 2060 2061 2062
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2063
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
2064
					  GLOBAL_ATU_MAC_01 + i);
2065 2066 2067 2068 2069 2070 2071 2072 2073
		if (ret < 0)
			return ret;
		addr[i * 2] = ret >> 8;
		addr[i * 2 + 1] = ret & 0xff;
	}

	return 0;
}

2074
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2075
			       struct mv88e6xxx_atu_entry *entry)
2076
{
2077 2078
	int ret;

2079
	ret = _mv88e6xxx_atu_wait(chip);
2080 2081 2082
	if (ret < 0)
		return ret;

2083
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2084 2085 2086
	if (ret < 0)
		return ret;

2087
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2088
	if (ret < 0)
2089 2090
		return ret;

2091
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2092
}
2093

2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
				  struct mv88e6xxx_atu_entry *entry);

static int mv88e6xxx_atu_get(struct mv88e6xxx_chip *chip, int fid,
			     const u8 *addr, struct mv88e6xxx_atu_entry *entry)
{
	struct mv88e6xxx_atu_entry next;
	int err;

	eth_broadcast_addr(next.mac);

	err = _mv88e6xxx_atu_mac_write(chip, next.mac);
	if (err)
		return err;

	do {
		err = _mv88e6xxx_atu_getnext(chip, fid, &next);
		if (err)
			return err;

		if (next.state == GLOBAL_ATU_DATA_STATE_UNUSED)
			break;

		if (ether_addr_equal(next.mac, addr)) {
			*entry = next;
			return 0;
		}
	} while (!is_broadcast_ether_addr(next.mac));

	memset(entry, 0, sizeof(*entry));
	entry->fid = fid;
	ether_addr_copy(entry->mac, addr);

	return 0;
}

2130 2131 2132
static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
					const unsigned char *addr, u16 vid,
					u8 state)
2133
{
2134
	struct mv88e6xxx_vtu_stu_entry vlan;
2135
	struct mv88e6xxx_atu_entry entry;
2136 2137
	int err;

2138 2139
	/* Null VLAN ID corresponds to the port private database */
	if (vid == 0)
2140
		err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
2141
	else
2142
		err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2143 2144
	if (err)
		return err;
2145

2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157
	err = mv88e6xxx_atu_get(chip, vlan.fid, addr, &entry);
	if (err)
		return err;

	/* Purge the ATU entry only if no port is using it anymore */
	if (state == GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.portv_trunkid &= ~BIT(port);
		if (!entry.portv_trunkid)
			entry.state = GLOBAL_ATU_DATA_STATE_UNUSED;
	} else {
		entry.portv_trunkid |= BIT(port);
		entry.state = state;
2158 2159
	}

2160
	return _mv88e6xxx_atu_load(chip, &entry);
2161 2162
}

2163 2164 2165
static int mv88e6xxx_port_fdb_prepare(struct dsa_switch *ds, int port,
				      const struct switchdev_obj_port_fdb *fdb,
				      struct switchdev_trans *trans)
V
Vivien Didelot 已提交
2166 2167 2168 2169 2170 2171 2172
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2173 2174 2175
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2176
{
V
Vivien Didelot 已提交
2177
	struct mv88e6xxx_chip *chip = ds->priv;
2178

2179
	mutex_lock(&chip->reg_lock);
2180 2181 2182
	if (mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
					 GLOBAL_ATU_DATA_STATE_UC_STATIC))
		netdev_err(ds->ports[port].netdev, "failed to load unicast MAC address\n");
2183
	mutex_unlock(&chip->reg_lock);
2184 2185
}

2186 2187
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2188
{
V
Vivien Didelot 已提交
2189
	struct mv88e6xxx_chip *chip = ds->priv;
2190
	int err;
2191

2192
	mutex_lock(&chip->reg_lock);
2193 2194
	err = mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
					   GLOBAL_ATU_DATA_STATE_UNUSED);
2195
	mutex_unlock(&chip->reg_lock);
2196

2197
	return err;
2198 2199
}

2200
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2201
				  struct mv88e6xxx_atu_entry *entry)
2202
{
2203 2204 2205 2206
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2207

2208
	ret = _mv88e6xxx_atu_wait(chip);
2209 2210
	if (ret < 0)
		return ret;
2211

2212
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2213 2214
	if (ret < 0)
		return ret;
2215

2216
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2217 2218
	if (ret < 0)
		return ret;
2219

2220
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2221 2222
	if (ret < 0)
		return ret;
2223

2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239
	next.state = ret & GLOBAL_ATU_DATA_STATE_MASK;
	if (next.state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		unsigned int mask, shift;

		if (ret & GLOBAL_ATU_DATA_TRUNK) {
			next.trunk = true;
			mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK;
			shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT;
		} else {
			next.trunk = false;
			mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK;
			shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT;
		}

		next.portv_trunkid = (ret & mask) >> shift;
	}
2240

2241
	*entry = next;
2242 2243 2244
	return 0;
}

2245 2246 2247 2248
static int mv88e6xxx_port_db_dump_fid(struct mv88e6xxx_chip *chip,
				      u16 fid, u16 vid, int port,
				      struct switchdev_obj *obj,
				      int (*cb)(struct switchdev_obj *obj))
2249 2250 2251 2252 2253 2254
{
	struct mv88e6xxx_atu_entry addr = {
		.mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
	};
	int err;

2255
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2256 2257 2258 2259
	if (err)
		return err;

	do {
2260
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2261
		if (err)
2262
			return err;
2263 2264 2265 2266

		if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED)
			break;

2267 2268 2269 2270 2271
		if (addr.trunk || (addr.portv_trunkid & BIT(port)) == 0)
			continue;

		if (obj->id == SWITCHDEV_OBJ_ID_PORT_FDB) {
			struct switchdev_obj_port_fdb *fdb;
2272

2273 2274 2275 2276
			if (!is_unicast_ether_addr(addr.mac))
				continue;

			fdb = SWITCHDEV_OBJ_PORT_FDB(obj);
2277 2278
			fdb->vid = vid;
			ether_addr_copy(fdb->addr, addr.mac);
2279 2280 2281 2282
			if (addr.state == GLOBAL_ATU_DATA_STATE_UC_STATIC)
				fdb->ndm_state = NUD_NOARP;
			else
				fdb->ndm_state = NUD_REACHABLE;
2283 2284 2285 2286 2287 2288 2289 2290 2291
		} else if (obj->id == SWITCHDEV_OBJ_ID_PORT_MDB) {
			struct switchdev_obj_port_mdb *mdb;

			if (!is_multicast_ether_addr(addr.mac))
				continue;

			mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
			mdb->vid = vid;
			ether_addr_copy(mdb->addr, addr.mac);
2292 2293
		} else {
			return -EOPNOTSUPP;
2294
		}
2295 2296 2297 2298

		err = cb(obj);
		if (err)
			return err;
2299 2300 2301 2302 2303
	} while (!is_broadcast_ether_addr(addr.mac));

	return err;
}

2304 2305 2306
static int mv88e6xxx_port_db_dump(struct mv88e6xxx_chip *chip, int port,
				  struct switchdev_obj *obj,
				  int (*cb)(struct switchdev_obj *obj))
2307 2308 2309 2310
{
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2311
	u16 fid;
2312 2313
	int err;

2314
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2315
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2316
	if (err)
2317
		return err;
2318

2319
	err = mv88e6xxx_port_db_dump_fid(chip, fid, 0, port, obj, cb);
2320
	if (err)
2321
		return err;
2322

2323
	/* Dump VLANs' Filtering Information Databases */
2324
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2325
	if (err)
2326
		return err;
2327 2328

	do {
2329
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2330
		if (err)
2331
			return err;
2332 2333 2334 2335

		if (!vlan.valid)
			break;

2336 2337
		err = mv88e6xxx_port_db_dump_fid(chip, vlan.fid, vlan.vid, port,
						 obj, cb);
2338
		if (err)
2339
			return err;
2340 2341
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

2342 2343 2344 2345 2346 2347 2348
	return err;
}

static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
{
V
Vivien Didelot 已提交
2349
	struct mv88e6xxx_chip *chip = ds->priv;
2350 2351 2352 2353
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_dump(chip, port, &fdb->obj, cb);
2354
	mutex_unlock(&chip->reg_lock);
2355 2356 2357 2358

	return err;
}

2359 2360
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2361
{
V
Vivien Didelot 已提交
2362
	struct mv88e6xxx_chip *chip = ds->priv;
2363
	int i, err = 0;
2364

2365
	mutex_lock(&chip->reg_lock);
2366

2367
	/* Assign the bridge and remap each port's VLANTable */
2368
	chip->ports[port].bridge_dev = bridge;
2369

2370 2371 2372
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2373 2374 2375 2376 2377
			if (err)
				break;
		}
	}

2378
	mutex_unlock(&chip->reg_lock);
2379

2380
	return err;
2381 2382
}

2383
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2384
{
V
Vivien Didelot 已提交
2385
	struct mv88e6xxx_chip *chip = ds->priv;
2386
	struct net_device *bridge = chip->ports[port].bridge_dev;
2387
	int i;
2388

2389
	mutex_lock(&chip->reg_lock);
2390

2391
	/* Unassign the bridge and remap each port's VLANTable */
2392
	chip->ports[port].bridge_dev = NULL;
2393

2394 2395 2396
	for (i = 0; i < chip->info->num_ports; ++i)
		if (i == port || chip->ports[i].bridge_dev == bridge)
			if (_mv88e6xxx_port_based_vlan_map(chip, i))
2397 2398
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2399

2400
	mutex_unlock(&chip->reg_lock);
2401 2402
}

2403
static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2404
{
2405
	bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
2406
	u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2407
	struct gpio_desc *gpiod = chip->reset;
2408 2409 2410 2411 2412
	unsigned long timeout;
	int ret;
	int i;

	/* Set all ports to the disabled state. */
2413 2414
	for (i = 0; i < chip->info->num_ports; i++) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
2415 2416 2417
		if (ret < 0)
			return ret;

2418
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439
					   ret & 0xfffc);
		if (ret)
			return ret;
	}

	/* Wait for transmit queues to drain. */
	usleep_range(2000, 4000);

	/* If there is a gpio connected to the reset pin, toggle it */
	if (gpiod) {
		gpiod_set_value_cansleep(gpiod, 1);
		usleep_range(10000, 20000);
		gpiod_set_value_cansleep(gpiod, 0);
		usleep_range(10000, 20000);
	}

	/* Reset the switch. Keep the PPU active if requested. The PPU
	 * needs to be active to support indirect phy register access
	 * through global registers 0x18 and 0x19.
	 */
	if (ppu_active)
2440
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
2441
	else
2442
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
2443 2444 2445 2446 2447 2448
	if (ret)
		return ret;

	/* Wait up to one second for reset to complete. */
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
2449
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464
		if (ret < 0)
			return ret;

		if ((ret & is_reset) == is_reset)
			break;
		usleep_range(1000, 2000);
	}
	if (time_after(jiffies, timeout))
		ret = -ETIMEDOUT;
	else
		ret = 0;

	return ret;
}

2465
static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
2466
{
2467 2468
	u16 val;
	int err;
2469

2470 2471 2472 2473
	/* Clear Power Down bit */
	err = mv88e6xxx_serdes_read(chip, MII_BMCR, &val);
	if (err)
		return err;
2474

2475 2476 2477
	if (val & BMCR_PDOWN) {
		val &= ~BMCR_PDOWN;
		err = mv88e6xxx_serdes_write(chip, MII_BMCR, val);
2478 2479
	}

2480
	return err;
2481 2482
}

2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493
static int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port,
			       int reg, u16 *val)
{
	int addr = chip->info->port_base_addr + port;

	if (port >= chip->info->num_ports)
		return -EINVAL;

	return mv88e6xxx_read(chip, addr, reg, val);
}

2494
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
2495
{
2496
	struct dsa_switch *ds = chip->ds;
2497
	int ret;
2498
	u16 reg;
2499

2500 2501 2502 2503
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip) ||
	    mv88e6xxx_6065_family(chip) || mv88e6xxx_6320_family(chip)) {
2504 2505 2506 2507 2508 2509
		/* MAC Forcing register: don't force link, speed,
		 * duplex or flow control state to any particular
		 * values on physical ports, but force the CPU port
		 * and all DSA ports to their maximum bandwidth and
		 * full duplex.
		 */
2510
		reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
2511
		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
2512
			reg &= ~PORT_PCS_CTRL_UNFORCED;
2513 2514 2515 2516
			reg |= PORT_PCS_CTRL_FORCE_LINK |
				PORT_PCS_CTRL_LINK_UP |
				PORT_PCS_CTRL_DUPLEX_FULL |
				PORT_PCS_CTRL_FORCE_DUPLEX;
2517
			if (mv88e6xxx_6065_family(chip))
2518 2519 2520 2521 2522 2523 2524
				reg |= PORT_PCS_CTRL_100;
			else
				reg |= PORT_PCS_CTRL_1000;
		} else {
			reg |= PORT_PCS_CTRL_UNFORCED;
		}

2525
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2526 2527
					   PORT_PCS_CTRL, reg);
		if (ret)
2528
			return ret;
2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545
	}

	/* Port Control: disable Drop-on-Unlock, disable Drop-on-Lock,
	 * disable Header mode, enable IGMP/MLD snooping, disable VLAN
	 * tunneling, determine priority by looking at 802.1p and IP
	 * priority fields (IP prio has precedence), and set STP state
	 * to Forwarding.
	 *
	 * If this is the CPU link, use DSA or EDSA tagging depending
	 * on which tagging mode was configured.
	 *
	 * If this is a link to another switch, use DSA tagging mode.
	 *
	 * If this is the upstream port for this switch, enable
	 * forwarding of unknown unicasts and multicasts.
	 */
	reg = 0;
2546 2547 2548 2549
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6095_family(chip) || mv88e6xxx_6065_family(chip) ||
	    mv88e6xxx_6185_family(chip) || mv88e6xxx_6320_family(chip))
2550 2551 2552 2553
		reg = PORT_CONTROL_IGMP_MLD_SNOOP |
		PORT_CONTROL_USE_TAG | PORT_CONTROL_USE_IP |
		PORT_CONTROL_STATE_FORWARDING;
	if (dsa_is_cpu_port(ds, port)) {
2554
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA))
2555
			reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
2556
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
2557 2558
		else
			reg |= PORT_CONTROL_DSA_TAG;
2559 2560
		reg |= PORT_CONTROL_EGRESS_ADD_TAG |
			PORT_CONTROL_FORWARD_UNKNOWN;
2561
	}
2562
	if (dsa_is_dsa_port(ds, port)) {
2563 2564
		if (mv88e6xxx_6095_family(chip) ||
		    mv88e6xxx_6185_family(chip))
2565
			reg |= PORT_CONTROL_DSA_TAG;
2566 2567 2568 2569 2570
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2571
			reg |= PORT_CONTROL_FRAME_MODE_DSA;
2572 2573
		}

2574 2575 2576 2577 2578
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_FORWARD_UNKNOWN |
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
	}
	if (reg) {
2579
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2580 2581
					   PORT_CONTROL, reg);
		if (ret)
2582
			return ret;
2583 2584
	}

2585 2586 2587
	/* If this port is connected to a SerDes, make sure the SerDes is not
	 * powered down.
	 */
2588
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_SERDES)) {
2589
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
2590
		if (ret < 0)
2591
			return ret;
2592 2593 2594 2595
		ret &= PORT_STATUS_CMODE_MASK;
		if ((ret == PORT_STATUS_CMODE_100BASE_X) ||
		    (ret == PORT_STATUS_CMODE_1000BASE_X) ||
		    (ret == PORT_STATUS_CMODE_SGMII)) {
2596
			ret = mv88e6xxx_serdes_power_on(chip);
2597
			if (ret < 0)
2598
				return ret;
2599 2600 2601
		}
	}

2602
	/* Port Control 2: don't force a good FCS, set the maximum frame size to
2603
	 * 10240 bytes, disable 802.1q tags checking, don't discard tagged or
2604 2605 2606
	 * untagged frames on this port, do a destination address lookup on all
	 * received packets as usual, disable ARP mirroring and don't send a
	 * copy of all transmitted/received frames on this port to the CPU.
2607 2608
	 */
	reg = 0;
2609 2610 2611 2612
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6095_family(chip) || mv88e6xxx_6320_family(chip) ||
	    mv88e6xxx_6185_family(chip))
2613 2614
		reg = PORT_CONTROL_2_MAP_DA;

2615 2616
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
2617 2618
		reg |= PORT_CONTROL_2_JUMBO_10240;

2619
	if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
2620 2621 2622 2623 2624 2625 2626 2627 2628
		/* Set the upstream port this port should use */
		reg |= dsa_upstream_port(ds);
		/* enable forwarding of unknown multicast addresses to
		 * the upstream port
		 */
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_2_FORWARD_UNKNOWN;
	}

2629
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2630

2631
	if (reg) {
2632
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2633 2634
					   PORT_CONTROL_2, reg);
		if (ret)
2635
			return ret;
2636 2637 2638 2639 2640 2641 2642
	}

	/* Port Association Vector: when learning source addresses
	 * of packets, add the address to the address database using
	 * a port bitmap that has only the bit for this port set and
	 * the other bits clear.
	 */
2643
	reg = 1 << port;
2644 2645
	/* Disable learning for CPU port */
	if (dsa_is_cpu_port(ds, port))
2646
		reg = 0;
2647

2648 2649
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
				   reg);
2650
	if (ret)
2651
		return ret;
2652 2653

	/* Egress rate control 2: disable egress rate control. */
2654
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_RATE_CONTROL_2,
2655 2656
				   0x0000);
	if (ret)
2657
		return ret;
2658

2659 2660 2661
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
2662 2663 2664 2665
		/* Do not limit the period of time that this port can
		 * be paused for by the remote end or the period of
		 * time that this port can pause the remote end.
		 */
2666
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2667 2668
					   PORT_PAUSE_CTRL, 0x0000);
		if (ret)
2669
			return ret;
2670 2671 2672 2673 2674

		/* Port ATU control: disable limiting the number of
		 * address database entries that this port is allowed
		 * to use.
		 */
2675
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2676 2677 2678 2679
					   PORT_ATU_CONTROL, 0x0000);
		/* Priority Override: disable DA, SA and VTU priority
		 * override.
		 */
2680
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2681 2682
					   PORT_PRI_OVERRIDE, 0x0000);
		if (ret)
2683
			return ret;
2684 2685 2686 2687

		/* Port Ethertype: use the Ethertype DSA Ethertype
		 * value.
		 */
2688 2689 2690 2691 2692 2693 2694
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA)) {
			ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
						   PORT_ETH_TYPE, ETH_P_EDSA);
			if (ret)
				return ret;
		}

2695 2696 2697
		/* Tag Remap: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2698
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2699 2700
					   PORT_TAG_REGMAP_0123, 0x3210);
		if (ret)
2701
			return ret;
2702 2703 2704 2705

		/* Tag Remap 2: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2706
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2707 2708
					   PORT_TAG_REGMAP_4567, 0x7654);
		if (ret)
2709
			return ret;
2710 2711
	}

2712
	/* Rate Control: disable ingress rate limiting. */
2713 2714 2715 2716
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2717 2718
					   PORT_RATE_CONTROL, 0x0001);
		if (ret)
2719
			return ret;
2720 2721 2722 2723 2724
	} else if (mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
					   PORT_RATE_CONTROL, 0x0000);
		if (ret)
			return ret;
2725 2726
	}

2727 2728
	/* Port Control 1: disable trunking, disable sending
	 * learning messages to this port.
2729
	 */
2730 2731
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
				   0x0000);
2732
	if (ret)
2733
		return ret;
2734

2735
	/* Port based VLAN map: give each port the same default address
2736 2737
	 * database, and allow bidirectional communication between the
	 * CPU and DSA port(s), and the other ports.
2738
	 */
2739
	ret = _mv88e6xxx_port_fid_set(chip, port, 0);
2740
	if (ret)
2741
		return ret;
2742

2743
	ret = _mv88e6xxx_port_based_vlan_map(chip, port);
2744
	if (ret)
2745
		return ret;
2746 2747 2748 2749

	/* Default VLAN ID and priority: don't set a default VLAN
	 * ID, and set the default packet priority to zero.
	 */
2750
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_DEFAULT_VLAN,
2751
				   0x0000);
2752 2753
	if (ret)
		return ret;
2754 2755 2756 2757

	return 0;
}

2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775
static int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
{
	int err;

	err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_01,
			      (addr[0] << 8) | addr[1]);
	if (err)
		return err;

	err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_23,
			      (addr[2] << 8) | addr[3]);
	if (err)
		return err;

	return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_45,
			       (addr[4] << 8) | addr[5]);
}

2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802
static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
				     unsigned int msecs)
{
	const unsigned int coeff = chip->info->age_time_coeff;
	const unsigned int min = 0x01 * coeff;
	const unsigned int max = 0xff * coeff;
	u8 age_time;
	u16 val;
	int err;

	if (msecs < min || msecs > max)
		return -ERANGE;

	/* Round to nearest multiple of coeff */
	age_time = (msecs + coeff / 2) / coeff;

	err = mv88e6xxx_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, &val);
	if (err)
		return err;

	/* AgeTime is 11:4 bits */
	val &= ~0xff0;
	val |= age_time << 4;

	return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, val);
}

2803 2804 2805
static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
				     unsigned int ageing_time)
{
V
Vivien Didelot 已提交
2806
	struct mv88e6xxx_chip *chip = ds->priv;
2807 2808 2809 2810 2811 2812 2813 2814 2815
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_g1_set_age_time(chip, ageing_time);
	mutex_unlock(&chip->reg_lock);

	return err;
}

2816
static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2817
{
2818
	struct dsa_switch *ds = chip->ds;
2819
	u32 upstream_port = dsa_upstream_port(ds);
2820
	u16 reg;
2821
	int err;
2822

2823 2824 2825 2826
	/* Enable the PHY Polling Unit if present, don't discard any packets,
	 * and mask all interrupt sources.
	 */
	reg = 0;
2827 2828
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
2829 2830
		reg |= GLOBAL_CONTROL_PPU_ENABLE;

2831
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
2832 2833 2834
	if (err)
		return err;

2835 2836 2837 2838 2839 2840
	/* Configure the upstream port, and configure it as the port to which
	 * ingress and egress and ARP monitor frames are to be sent.
	 */
	reg = upstream_port << GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT |
		upstream_port << GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT |
		upstream_port << GLOBAL_MONITOR_CONTROL_ARP_SHIFT;
2841 2842
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
				   reg);
2843 2844 2845
	if (err)
		return err;

2846
	/* Disable remote management, and set the switch's DSA device number. */
2847
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2,
2848 2849 2850 2851 2852
				   GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
				   (ds->index & 0x1f));
	if (err)
		return err;

2853 2854 2855 2856 2857
	/* Clear all the VTU and STU entries */
	err = _mv88e6xxx_vtu_stu_flush(chip);
	if (err < 0)
		return err;

2858 2859 2860 2861
	/* Set the default address aging time to 5 minutes, and
	 * enable address learn messages to be sent to all message
	 * ports.
	 */
2862 2863
	err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
			      GLOBAL_ATU_CONTROL_LEARN2ALL);
2864
	if (err)
2865
		return err;
2866

2867 2868
	err = mv88e6xxx_g1_set_age_time(chip, 300000);
	if (err)
2869 2870 2871 2872 2873 2874 2875
		return err;

	/* Clear all ATU entries */
	err = _mv88e6xxx_atu_flush(chip, 0, true);
	if (err)
		return err;

2876
	/* Configure the IP ToS mapping registers. */
2877
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000);
2878
	if (err)
2879
		return err;
2880
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000);
2881
	if (err)
2882
		return err;
2883
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555);
2884
	if (err)
2885
		return err;
2886
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555);
2887
	if (err)
2888
		return err;
2889
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa);
2890
	if (err)
2891
		return err;
2892
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa);
2893
	if (err)
2894
		return err;
2895
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff);
2896
	if (err)
2897
		return err;
2898
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff);
2899
	if (err)
2900
		return err;
2901 2902

	/* Configure the IEEE 802.1p priority mapping register. */
2903
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41);
2904
	if (err)
2905
		return err;
2906

2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920
	/* Clear the statistics counters for all ports */
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
				   GLOBAL_STATS_OP_FLUSH_ALL);
	if (err)
		return err;

	/* Wait for the flush to complete. */
	err = _mv88e6xxx_stats_wait(chip);
	if (err)
		return err;

	return 0;
}

2921
static int mv88e6xxx_setup(struct dsa_switch *ds)
2922
{
V
Vivien Didelot 已提交
2923
	struct mv88e6xxx_chip *chip = ds->priv;
2924
	int err;
2925 2926
	int i;

2927 2928
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
2929

2930
	mutex_lock(&chip->reg_lock);
2931

2932
	err = mv88e6xxx_switch_reset(chip);
2933 2934 2935
	if (err)
		goto unlock;

2936 2937 2938 2939 2940 2941 2942 2943 2944
	/* Setup Switch Port Registers */
	for (i = 0; i < chip->info->num_ports; i++) {
		err = mv88e6xxx_setup_port(chip, i);
		if (err)
			goto unlock;
	}

	/* Setup Switch Global 1 Registers */
	err = mv88e6xxx_g1_setup(chip);
2945 2946 2947
	if (err)
		goto unlock;

2948 2949 2950
	/* Setup Switch Global 2 Registers */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
		err = mv88e6xxx_g2_setup(chip);
2951 2952 2953
		if (err)
			goto unlock;
	}
2954

2955
unlock:
2956
	mutex_unlock(&chip->reg_lock);
2957

2958
	return err;
2959 2960
}

2961 2962
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
V
Vivien Didelot 已提交
2963
	struct mv88e6xxx_chip *chip = ds->priv;
2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978
	int err;

	mutex_lock(&chip->reg_lock);

	/* Has an indirect Switch MAC/WoL/WoF register in Global 2? */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_SWITCH_MAC))
		err = mv88e6xxx_g2_set_switch_mac(chip, addr);
	else
		err = mv88e6xxx_g1_set_switch_mac(chip, addr);

	mutex_unlock(&chip->reg_lock);

	return err;
}

2979
static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg)
2980
{
2981
	struct mv88e6xxx_chip *chip = bus->priv;
2982 2983
	u16 val;
	int err;
2984

2985
	if (phy >= chip->info->num_ports)
2986
		return 0xffff;
2987

2988
	mutex_lock(&chip->reg_lock);
2989
	err = mv88e6xxx_phy_read(chip, phy, reg, &val);
2990
	mutex_unlock(&chip->reg_lock);
2991 2992

	return err ? err : val;
2993 2994
}

2995
static int mv88e6xxx_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val)
2996
{
2997
	struct mv88e6xxx_chip *chip = bus->priv;
2998
	int err;
2999

3000
	if (phy >= chip->info->num_ports)
3001
		return 0xffff;
3002

3003
	mutex_lock(&chip->reg_lock);
3004
	err = mv88e6xxx_phy_write(chip, phy, reg, val);
3005
	mutex_unlock(&chip->reg_lock);
3006 3007

	return err;
3008 3009
}

3010
static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
3011 3012 3013 3014 3015 3016 3017
				   struct device_node *np)
{
	static int index;
	struct mii_bus *bus;
	int err;

	if (np)
3018
		chip->mdio_np = of_get_child_by_name(np, "mdio");
3019

3020
	bus = devm_mdiobus_alloc(chip->dev);
3021 3022 3023
	if (!bus)
		return -ENOMEM;

3024
	bus->priv = (void *)chip;
3025 3026 3027 3028 3029 3030 3031 3032 3033 3034
	if (np) {
		bus->name = np->full_name;
		snprintf(bus->id, MII_BUS_ID_SIZE, "%s", np->full_name);
	} else {
		bus->name = "mv88e6xxx SMI";
		snprintf(bus->id, MII_BUS_ID_SIZE, "mv88e6xxx-%d", index++);
	}

	bus->read = mv88e6xxx_mdio_read;
	bus->write = mv88e6xxx_mdio_write;
3035
	bus->parent = chip->dev;
3036

3037 3038
	if (chip->mdio_np)
		err = of_mdiobus_register(bus, chip->mdio_np);
3039 3040 3041
	else
		err = mdiobus_register(bus);
	if (err) {
3042
		dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
3043 3044
		goto out;
	}
3045
	chip->mdio_bus = bus;
3046 3047 3048 3049

	return 0;

out:
3050 3051
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3052 3053 3054 3055

	return err;
}

3056
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3057 3058

{
3059
	struct mii_bus *bus = chip->mdio_bus;
3060 3061 3062

	mdiobus_unregister(bus);

3063 3064
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3065 3066
}

3067 3068 3069 3070
#ifdef CONFIG_NET_DSA_HWMON

static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
{
V
Vivien Didelot 已提交
3071
	struct mv88e6xxx_chip *chip = ds->priv;
3072
	u16 val;
3073 3074 3075 3076
	int ret;

	*temp = 0;

3077
	mutex_lock(&chip->reg_lock);
3078

3079
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
3080 3081 3082 3083
	if (ret < 0)
		goto error;

	/* Enable temperature sensor */
3084
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
3085 3086 3087
	if (ret < 0)
		goto error;

3088
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
3089 3090 3091 3092 3093 3094
	if (ret < 0)
		goto error;

	/* Wait for temperature to stabilize */
	usleep_range(10000, 12000);

3095 3096
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
	if (ret < 0)
3097 3098 3099
		goto error;

	/* Disable temperature sensor */
3100
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
3101 3102 3103 3104 3105 3106
	if (ret < 0)
		goto error;

	*temp = ((val & 0x1f) - 5) * 5;

error:
3107
	mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
3108
	mutex_unlock(&chip->reg_lock);
3109 3110 3111 3112 3113
	return ret;
}

static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
{
V
Vivien Didelot 已提交
3114
	struct mv88e6xxx_chip *chip = ds->priv;
3115
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3116
	u16 val;
3117 3118 3119 3120
	int ret;

	*temp = 0;

3121 3122 3123
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
	mutex_unlock(&chip->reg_lock);
3124 3125 3126
	if (ret < 0)
		return ret;

3127
	*temp = (val & 0xff) - 25;
3128 3129 3130 3131

	return 0;
}

3132
static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
3133
{
V
Vivien Didelot 已提交
3134
	struct mv88e6xxx_chip *chip = ds->priv;
3135

3136
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3137 3138
		return -EOPNOTSUPP;

3139
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
3140 3141 3142 3143 3144
		return mv88e63xx_get_temp(ds, temp);

	return mv88e61xx_get_temp(ds, temp);
}

3145
static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3146
{
V
Vivien Didelot 已提交
3147
	struct mv88e6xxx_chip *chip = ds->priv;
3148
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3149
	u16 val;
3150 3151
	int ret;

3152
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3153 3154 3155 3156
		return -EOPNOTSUPP;

	*temp = 0;

3157 3158 3159
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3160 3161 3162
	if (ret < 0)
		return ret;

3163
	*temp = (((val >> 8) & 0x1f) * 5) - 25;
3164 3165 3166 3167

	return 0;
}

3168
static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3169
{
V
Vivien Didelot 已提交
3170
	struct mv88e6xxx_chip *chip = ds->priv;
3171
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3172 3173
	u16 val;
	int err;
3174

3175
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3176 3177
		return -EOPNOTSUPP;

3178 3179 3180 3181
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	if (err)
		goto unlock;
3182
	temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3183 3184 3185 3186 3187 3188
	err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
				       (val & 0xe0ff) | (temp << 8));
unlock:
	mutex_unlock(&chip->reg_lock);

	return err;
3189 3190
}

3191
static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3192
{
V
Vivien Didelot 已提交
3193
	struct mv88e6xxx_chip *chip = ds->priv;
3194
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3195
	u16 val;
3196 3197
	int ret;

3198
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3199 3200 3201 3202
		return -EOPNOTSUPP;

	*alarm = false;

3203 3204 3205
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3206 3207 3208
	if (ret < 0)
		return ret;

3209
	*alarm = !!(val & 0x40);
3210 3211 3212 3213 3214

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

3215 3216
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
V
Vivien Didelot 已提交
3217
	struct mv88e6xxx_chip *chip = ds->priv;
3218 3219 3220 3221 3222 3223 3224

	return chip->eeprom_len;
}

static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
V
Vivien Didelot 已提交
3225
	struct mv88e6xxx_chip *chip = ds->priv;
3226 3227 3228 3229 3230
	int err;

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
3231
		err = mv88e6xxx_g2_get_eeprom16(chip, eeprom, data);
3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	if (err)
		return err;

	eeprom->magic = 0xc3ec4951;

	return 0;
}

static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
V
Vivien Didelot 已提交
3248
	struct mv88e6xxx_chip *chip = ds->priv;
3249 3250 3251 3252 3253 3254 3255 3256
	int err;

	if (eeprom->magic != 0xc3ec4951)
		return -EINVAL;

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
3257
		err = mv88e6xxx_g2_set_eeprom16(chip, eeprom, data);
3258 3259 3260 3261 3262 3263 3264 3265
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	return err;
}

3266 3267 3268 3269 3270 3271 3272
static const struct mv88e6xxx_info mv88e6xxx_table[] = {
	[MV88E6085] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6085,
		.family = MV88E6XXX_FAMILY_6097,
		.name = "Marvell 88E6085",
		.num_databases = 4096,
		.num_ports = 10,
3273
		.port_base_addr = 0x10,
3274
		.age_time_coeff = 15000,
3275 3276 3277 3278 3279 3280 3281 3282 3283
		.flags = MV88E6XXX_FLAGS_FAMILY_6097,
	},

	[MV88E6095] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6095,
		.family = MV88E6XXX_FAMILY_6095,
		.name = "Marvell 88E6095/88E6095F",
		.num_databases = 256,
		.num_ports = 11,
3284
		.port_base_addr = 0x10,
3285
		.age_time_coeff = 15000,
3286 3287 3288 3289 3290 3291 3292 3293 3294
		.flags = MV88E6XXX_FLAGS_FAMILY_6095,
	},

	[MV88E6123] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6123,
		.family = MV88E6XXX_FAMILY_6165,
		.name = "Marvell 88E6123",
		.num_databases = 4096,
		.num_ports = 3,
3295
		.port_base_addr = 0x10,
3296
		.age_time_coeff = 15000,
3297 3298 3299 3300 3301 3302 3303 3304 3305
		.flags = MV88E6XXX_FLAGS_FAMILY_6165,
	},

	[MV88E6131] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6131,
		.family = MV88E6XXX_FAMILY_6185,
		.name = "Marvell 88E6131",
		.num_databases = 256,
		.num_ports = 8,
3306
		.port_base_addr = 0x10,
3307
		.age_time_coeff = 15000,
3308 3309 3310 3311 3312 3313 3314 3315 3316
		.flags = MV88E6XXX_FLAGS_FAMILY_6185,
	},

	[MV88E6161] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6161,
		.family = MV88E6XXX_FAMILY_6165,
		.name = "Marvell 88E6161",
		.num_databases = 4096,
		.num_ports = 6,
3317
		.port_base_addr = 0x10,
3318
		.age_time_coeff = 15000,
3319 3320 3321 3322 3323 3324 3325 3326 3327
		.flags = MV88E6XXX_FLAGS_FAMILY_6165,
	},

	[MV88E6165] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6165,
		.family = MV88E6XXX_FAMILY_6165,
		.name = "Marvell 88E6165",
		.num_databases = 4096,
		.num_ports = 6,
3328
		.port_base_addr = 0x10,
3329
		.age_time_coeff = 15000,
3330 3331 3332 3333 3334 3335 3336 3337 3338
		.flags = MV88E6XXX_FLAGS_FAMILY_6165,
	},

	[MV88E6171] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6171,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6171",
		.num_databases = 4096,
		.num_ports = 7,
3339
		.port_base_addr = 0x10,
3340
		.age_time_coeff = 15000,
3341 3342 3343 3344 3345 3346 3347 3348 3349
		.flags = MV88E6XXX_FLAGS_FAMILY_6351,
	},

	[MV88E6172] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6172,
		.family = MV88E6XXX_FAMILY_6352,
		.name = "Marvell 88E6172",
		.num_databases = 4096,
		.num_ports = 7,
3350
		.port_base_addr = 0x10,
3351
		.age_time_coeff = 15000,
3352 3353 3354 3355 3356 3357 3358 3359 3360
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},

	[MV88E6175] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6175,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6175",
		.num_databases = 4096,
		.num_ports = 7,
3361
		.port_base_addr = 0x10,
3362
		.age_time_coeff = 15000,
3363 3364 3365 3366 3367 3368 3369 3370 3371
		.flags = MV88E6XXX_FLAGS_FAMILY_6351,
	},

	[MV88E6176] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6176,
		.family = MV88E6XXX_FAMILY_6352,
		.name = "Marvell 88E6176",
		.num_databases = 4096,
		.num_ports = 7,
3372
		.port_base_addr = 0x10,
3373
		.age_time_coeff = 15000,
3374 3375 3376 3377 3378 3379 3380 3381 3382
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},

	[MV88E6185] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6185,
		.family = MV88E6XXX_FAMILY_6185,
		.name = "Marvell 88E6185",
		.num_databases = 256,
		.num_ports = 10,
3383
		.port_base_addr = 0x10,
3384
		.age_time_coeff = 15000,
3385 3386 3387 3388 3389 3390 3391 3392 3393
		.flags = MV88E6XXX_FLAGS_FAMILY_6185,
	},

	[MV88E6240] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6240,
		.family = MV88E6XXX_FAMILY_6352,
		.name = "Marvell 88E6240",
		.num_databases = 4096,
		.num_ports = 7,
3394
		.port_base_addr = 0x10,
3395
		.age_time_coeff = 15000,
3396 3397 3398 3399 3400 3401 3402 3403 3404
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},

	[MV88E6320] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6320,
		.family = MV88E6XXX_FAMILY_6320,
		.name = "Marvell 88E6320",
		.num_databases = 4096,
		.num_ports = 7,
3405
		.port_base_addr = 0x10,
3406
		.age_time_coeff = 15000,
3407 3408 3409 3410 3411 3412 3413 3414 3415
		.flags = MV88E6XXX_FLAGS_FAMILY_6320,
	},

	[MV88E6321] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6321,
		.family = MV88E6XXX_FAMILY_6320,
		.name = "Marvell 88E6321",
		.num_databases = 4096,
		.num_ports = 7,
3416
		.port_base_addr = 0x10,
3417
		.age_time_coeff = 15000,
3418 3419 3420 3421 3422 3423 3424 3425 3426
		.flags = MV88E6XXX_FLAGS_FAMILY_6320,
	},

	[MV88E6350] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6350,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6350",
		.num_databases = 4096,
		.num_ports = 7,
3427
		.port_base_addr = 0x10,
3428
		.age_time_coeff = 15000,
3429 3430 3431 3432 3433 3434 3435 3436 3437
		.flags = MV88E6XXX_FLAGS_FAMILY_6351,
	},

	[MV88E6351] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6351,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6351",
		.num_databases = 4096,
		.num_ports = 7,
3438
		.port_base_addr = 0x10,
3439
		.age_time_coeff = 15000,
3440 3441 3442 3443 3444 3445 3446 3447 3448
		.flags = MV88E6XXX_FLAGS_FAMILY_6351,
	},

	[MV88E6352] = {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6352,
		.family = MV88E6XXX_FAMILY_6352,
		.name = "Marvell 88E6352",
		.num_databases = 4096,
		.num_ports = 7,
3449
		.port_base_addr = 0x10,
3450
		.age_time_coeff = 15000,
3451 3452 3453 3454
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},
};

3455
static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
3456
{
3457
	int i;
3458

3459 3460 3461
	for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
		if (mv88e6xxx_table[i].prod_num == prod_num)
			return &mv88e6xxx_table[i];
3462 3463 3464 3465

	return NULL;
}

3466
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3467 3468
{
	const struct mv88e6xxx_info *info;
3469 3470 3471
	unsigned int prod_num, rev;
	u16 id;
	int err;
3472

3473 3474 3475 3476 3477
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_read(chip, 0, PORT_SWITCH_ID, &id);
	mutex_unlock(&chip->reg_lock);
	if (err)
		return err;
3478 3479 3480 3481 3482 3483 3484 3485

	prod_num = (id & 0xfff0) >> 4;
	rev = id & 0x000f;

	info = mv88e6xxx_lookup_info(prod_num);
	if (!info)
		return -ENODEV;

3486
	/* Update the compatible info with the probed one */
3487
	chip->info = info;
3488

3489 3490 3491 3492
	err = mv88e6xxx_g2_require(chip);
	if (err)
		return err;

3493 3494
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3495 3496 3497 3498

	return 0;
}

3499
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3500
{
3501
	struct mv88e6xxx_chip *chip;
3502

3503 3504
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3505 3506
		return NULL;

3507
	chip->dev = dev;
3508

3509
	mutex_init(&chip->reg_lock);
3510

3511
	return chip;
3512 3513
}

3514 3515 3516 3517 3518
static const struct mv88e6xxx_ops mv88e6xxx_g2_smi_phy_ops = {
	.read = mv88e6xxx_g2_smi_phy_read,
	.write = mv88e6xxx_g2_smi_phy_write,
};

3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535
static const struct mv88e6xxx_ops mv88e6xxx_phy_ops = {
	.read = mv88e6xxx_read,
	.write = mv88e6xxx_write,
};

static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip)
{
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_SMI_PHY)) {
		chip->phy_ops = &mv88e6xxx_g2_smi_phy_ops;
	} else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
		chip->phy_ops = &mv88e6xxx_phy_ppu_ops;
		mv88e6xxx_ppu_state_init(chip);
	} else {
		chip->phy_ops = &mv88e6xxx_phy_ops;
	}
}

3536 3537 3538 3539 3540 3541 3542
static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
{
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
		mv88e6xxx_ppu_state_destroy(chip);
	}
}

3543
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3544 3545 3546 3547 3548 3549
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3550
	if (sw_addr == 0)
3551
		chip->smi_ops = &mv88e6xxx_smi_single_chip_ops;
3552
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_MULTI_CHIP))
3553
		chip->smi_ops = &mv88e6xxx_smi_multi_chip_ops;
3554 3555 3556
	else
		return -EINVAL;

3557 3558
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3559 3560 3561 3562

	return 0;
}

3563 3564
static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds)
{
V
Vivien Didelot 已提交
3565
	struct mv88e6xxx_chip *chip = ds->priv;
3566 3567 3568 3569 3570

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA))
		return DSA_TAG_PROTO_EDSA;

	return DSA_TAG_PROTO_DSA;
3571 3572
}

3573 3574 3575
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3576
{
3577
	struct mv88e6xxx_chip *chip;
3578
	struct mii_bus *bus;
3579
	int err;
3580

3581
	bus = dsa_host_dev_to_mii_bus(host_dev);
3582 3583 3584
	if (!bus)
		return NULL;

3585 3586
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3587 3588
		return NULL;

3589
	/* Legacy SMI probing will only support chips similar to 88E6085 */
3590
	chip->info = &mv88e6xxx_table[MV88E6085];
3591

3592
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3593 3594 3595
	if (err)
		goto free;

3596
	err = mv88e6xxx_detect(chip);
3597
	if (err)
3598
		goto free;
3599

3600 3601
	mv88e6xxx_phy_init(chip);

3602
	err = mv88e6xxx_mdio_register(chip, NULL);
3603
	if (err)
3604
		goto free;
3605

3606
	*priv = chip;
3607

3608
	return chip->info->name;
3609
free:
3610
	devm_kfree(dsa_dev, chip);
3611 3612

	return NULL;
3613 3614
}

3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629
static int mv88e6xxx_port_mdb_prepare(struct dsa_switch *ds, int port,
				      const struct switchdev_obj_port_mdb *mdb,
				      struct switchdev_trans *trans)
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */

	return 0;
}

static void mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_mdb *mdb,
				   struct switchdev_trans *trans)
{
V
Vivien Didelot 已提交
3630
	struct mv88e6xxx_chip *chip = ds->priv;
3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641

	mutex_lock(&chip->reg_lock);
	if (mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
					 GLOBAL_ATU_DATA_STATE_MC_STATIC))
		netdev_err(ds->ports[port].netdev, "failed to load multicast MAC address\n");
	mutex_unlock(&chip->reg_lock);
}

static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_mdb *mdb)
{
V
Vivien Didelot 已提交
3642
	struct mv88e6xxx_chip *chip = ds->priv;
3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
					   GLOBAL_ATU_DATA_STATE_UNUSED);
	mutex_unlock(&chip->reg_lock);

	return err;
}

static int mv88e6xxx_port_mdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_mdb *mdb,
				   int (*cb)(struct switchdev_obj *obj))
{
V
Vivien Didelot 已提交
3657
	struct mv88e6xxx_chip *chip = ds->priv;
3658 3659 3660 3661 3662 3663 3664 3665 3666
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_dump(chip, port, &mdb->obj, cb);
	mutex_unlock(&chip->reg_lock);

	return err;
}

3667
static struct dsa_switch_ops mv88e6xxx_switch_ops = {
3668
	.probe			= mv88e6xxx_drv_probe,
3669
	.get_tag_protocol	= mv88e6xxx_get_tag_protocol,
3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683
	.setup			= mv88e6xxx_setup,
	.set_addr		= mv88e6xxx_set_addr,
	.adjust_link		= mv88e6xxx_adjust_link,
	.get_strings		= mv88e6xxx_get_strings,
	.get_ethtool_stats	= mv88e6xxx_get_ethtool_stats,
	.get_sset_count		= mv88e6xxx_get_sset_count,
	.set_eee		= mv88e6xxx_set_eee,
	.get_eee		= mv88e6xxx_get_eee,
#ifdef CONFIG_NET_DSA_HWMON
	.get_temp		= mv88e6xxx_get_temp,
	.get_temp_limit		= mv88e6xxx_get_temp_limit,
	.set_temp_limit		= mv88e6xxx_set_temp_limit,
	.get_temp_alarm		= mv88e6xxx_get_temp_alarm,
#endif
3684
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
3685 3686 3687 3688
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
	.get_regs_len		= mv88e6xxx_get_regs_len,
	.get_regs		= mv88e6xxx_get_regs,
3689
	.set_ageing_time	= mv88e6xxx_set_ageing_time,
3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701
	.port_bridge_join	= mv88e6xxx_port_bridge_join,
	.port_bridge_leave	= mv88e6xxx_port_bridge_leave,
	.port_stp_state_set	= mv88e6xxx_port_stp_state_set,
	.port_vlan_filtering	= mv88e6xxx_port_vlan_filtering,
	.port_vlan_prepare	= mv88e6xxx_port_vlan_prepare,
	.port_vlan_add		= mv88e6xxx_port_vlan_add,
	.port_vlan_del		= mv88e6xxx_port_vlan_del,
	.port_vlan_dump		= mv88e6xxx_port_vlan_dump,
	.port_fdb_prepare       = mv88e6xxx_port_fdb_prepare,
	.port_fdb_add           = mv88e6xxx_port_fdb_add,
	.port_fdb_del           = mv88e6xxx_port_fdb_del,
	.port_fdb_dump          = mv88e6xxx_port_fdb_dump,
3702 3703 3704 3705
	.port_mdb_prepare       = mv88e6xxx_port_mdb_prepare,
	.port_mdb_add           = mv88e6xxx_port_mdb_add,
	.port_mdb_del           = mv88e6xxx_port_mdb_del,
	.port_mdb_dump          = mv88e6xxx_port_mdb_dump,
3706 3707
};

3708
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
3709 3710
				     struct device_node *np)
{
3711
	struct device *dev = chip->dev;
3712 3713 3714 3715 3716 3717 3718
	struct dsa_switch *ds;

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

	ds->dev = dev;
3719
	ds->priv = chip;
3720
	ds->ops = &mv88e6xxx_switch_ops;
3721 3722 3723 3724 3725 3726

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

3727
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
3728
{
3729
	dsa_unregister_switch(chip->ds);
3730 3731
}

3732
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
3733
{
3734
	struct device *dev = &mdiodev->dev;
3735
	struct device_node *np = dev->of_node;
3736
	const struct mv88e6xxx_info *compat_info;
3737
	struct mv88e6xxx_chip *chip;
3738
	u32 eeprom_len;
3739
	int err;
3740

3741 3742 3743 3744
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

3745 3746
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
3747 3748
		return -ENOMEM;

3749
	chip->info = compat_info;
3750

3751
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
3752 3753
	if (err)
		return err;
3754

3755
	err = mv88e6xxx_detect(chip);
3756 3757
	if (err)
		return err;
3758

3759 3760
	mv88e6xxx_phy_init(chip);

3761 3762 3763
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
3764

3765
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
3766
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
3767
		chip->eeprom_len = eeprom_len;
3768

3769
	err = mv88e6xxx_mdio_register(chip, np);
3770 3771 3772
	if (err)
		return err;

3773
	err = mv88e6xxx_register_switch(chip, np);
3774
	if (err) {
3775
		mv88e6xxx_mdio_unregister(chip);
3776 3777 3778
		return err;
	}

3779 3780
	return 0;
}
3781 3782 3783 3784

static void mv88e6xxx_remove(struct mdio_device *mdiodev)
{
	struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev);
V
Vivien Didelot 已提交
3785
	struct mv88e6xxx_chip *chip = ds->priv;
3786

3787
	mv88e6xxx_phy_destroy(chip);
3788 3789
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
3790 3791 3792
}

static const struct of_device_id mv88e6xxx_of_match[] = {
3793 3794 3795 3796
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812
	{ /* sentinel */ },
};

MODULE_DEVICE_TABLE(of, mv88e6xxx_of_match);

static struct mdio_driver mv88e6xxx_driver = {
	.probe	= mv88e6xxx_probe,
	.remove = mv88e6xxx_remove,
	.mdiodrv.driver = {
		.name = "mv88e6085",
		.of_match_table = mv88e6xxx_of_match,
	},
};

static int __init mv88e6xxx_init(void)
{
3813
	register_switch_driver(&mv88e6xxx_switch_ops);
3814 3815
	return mdio_driver_register(&mv88e6xxx_driver);
}
3816 3817 3818 3819
module_init(mv88e6xxx_init);

static void __exit mv88e6xxx_cleanup(void)
{
3820
	mdio_driver_unregister(&mv88e6xxx_driver);
3821
	unregister_switch_driver(&mv88e6xxx_switch_ops);
3822 3823
}
module_exit(mv88e6xxx_cleanup);
3824 3825 3826 3827

MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
MODULE_DESCRIPTION("Driver for Marvell 88E6XXX ethernet switch chips");
MODULE_LICENSE("GPL");