chip.c 96.4 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
static void assert_reg_lock(struct mv88e6xxx_chip *chip)
35
{
36 37
	if (unlikely(!mutex_is_locked(&chip->reg_lock))) {
		dev_err(chip->dev, "Switch registers lock not held!\n");
38 39 40 41
		dump_stack();
	}
}

42 43 44 45 46 47 48 49 50 51
/* 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.
52
 */
53

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

60
	return chip->smi_ops->read(chip, addr, reg, val);
61 62
}

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

69
	return chip->smi_ops->write(chip, addr, reg, val);
70 71
}

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

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

	*val = ret & 0xffff;

	return 0;
}

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

91
	ret = mdiobus_write_nested(chip->bus, addr, reg, val);
92 93 94 95 96 97 98 99 100 101 102
	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,
};

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

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

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

	return -ETIMEDOUT;
}

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

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

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

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

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

146
	*val = ret & 0xffff;
147

148
	return 0;
149 150
}

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

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

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

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

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

	return 0;
}

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

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

190
	assert_reg_lock(chip);
191

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

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

	return 0;
}

202
static int mv88e6xxx_write(struct mv88e6xxx_chip *chip,
203
			   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 241 242 243 244
/* Indirect write to single pointer-data register with an Update bit */
static int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,
			    u16 update)
{
	u16 val;
	int i, err;

	/* Wait until the previous operation is completed */
	for (i = 0; i < 16; ++i) {
		err = mv88e6xxx_read(chip, addr, reg, &val);
		if (err)
			return err;

		if (!(val & BIT(15)))
			break;
	}

	if (i == 16)
		return -ETIMEDOUT;

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

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

245
static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
246 247 248 249
{
	u16 val;
	int err;

250
	err = mv88e6xxx_read(chip, addr, reg, &val);
251 252 253 254 255 256
	if (err)
		return err;

	return val;
}

257
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
258 259
				int reg, u16 val)
{
260
	return mv88e6xxx_write(chip, addr, reg, val);
261 262
}

263
static int mv88e6xxx_mdio_read_direct(struct mv88e6xxx_chip *chip,
264
				      int addr, int regnum)
265 266
{
	if (addr >= 0)
267
		return _mv88e6xxx_reg_read(chip, addr, regnum);
268 269 270
	return 0xffff;
}

271
static int mv88e6xxx_mdio_write_direct(struct mv88e6xxx_chip *chip,
272
				       int addr, int regnum, u16 val)
273 274
{
	if (addr >= 0)
275
		return _mv88e6xxx_reg_write(chip, addr, regnum, val);
276 277 278
	return 0;
}

279
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
280 281
{
	int ret;
282
	unsigned long timeout;
283

284
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
285 286 287
	if (ret < 0)
		return ret;

288
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
289
				   ret & ~GLOBAL_CONTROL_PPU_ENABLE);
290 291
	if (ret)
		return ret;
292

293 294
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
295
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
296 297 298
		if (ret < 0)
			return ret;

299
		usleep_range(1000, 2000);
300 301
		if ((ret & GLOBAL_STATUS_PPU_MASK) !=
		    GLOBAL_STATUS_PPU_POLLING)
302
			return 0;
303 304 305 306 307
	}

	return -ETIMEDOUT;
}

308
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
309
{
310
	int ret, err;
311
	unsigned long timeout;
312

313
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
314 315 316
	if (ret < 0)
		return ret;

317
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
318
				   ret | GLOBAL_CONTROL_PPU_ENABLE);
319 320
	if (err)
		return err;
321

322 323
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
324
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
325 326 327
		if (ret < 0)
			return ret;

328
		usleep_range(1000, 2000);
329 330
		if ((ret & GLOBAL_STATUS_PPU_MASK) ==
		    GLOBAL_STATUS_PPU_POLLING)
331
			return 0;
332 333 334 335 336 337 338
	}

	return -ETIMEDOUT;
}

static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
{
339
	struct mv88e6xxx_chip *chip;
340

341
	chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
342

343
	mutex_lock(&chip->reg_lock);
344

345 346 347 348
	if (mutex_trylock(&chip->ppu_mutex)) {
		if (mv88e6xxx_ppu_enable(chip) == 0)
			chip->ppu_disabled = 0;
		mutex_unlock(&chip->ppu_mutex);
349
	}
350

351
	mutex_unlock(&chip->reg_lock);
352 353 354 355
}

static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
{
356
	struct mv88e6xxx_chip *chip = (void *)_ps;
357

358
	schedule_work(&chip->ppu_work);
359 360
}

361
static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
362 363 364
{
	int ret;

365
	mutex_lock(&chip->ppu_mutex);
366

367
	/* If the PHY polling unit is enabled, disable it so that
368 369 370 371
	 * we can access the PHY registers.  If it was already
	 * disabled, cancel the timer that is going to re-enable
	 * it.
	 */
372 373
	if (!chip->ppu_disabled) {
		ret = mv88e6xxx_ppu_disable(chip);
374
		if (ret < 0) {
375
			mutex_unlock(&chip->ppu_mutex);
376 377
			return ret;
		}
378
		chip->ppu_disabled = 1;
379
	} else {
380
		del_timer(&chip->ppu_timer);
381
		ret = 0;
382 383 384 385 386
	}

	return ret;
}

387
static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
388
{
389
	/* Schedule a timer to re-enable the PHY polling unit. */
390 391
	mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
	mutex_unlock(&chip->ppu_mutex);
392 393
}

394
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
395
{
396 397 398 399 400
	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;
401 402
}

403
static int mv88e6xxx_mdio_read_ppu(struct mv88e6xxx_chip *chip, int addr,
404
				   int regnum)
405 406 407
{
	int ret;

408
	ret = mv88e6xxx_ppu_access_get(chip);
409
	if (ret >= 0) {
410 411
		ret = _mv88e6xxx_reg_read(chip, addr, regnum);
		mv88e6xxx_ppu_access_put(chip);
412 413 414 415 416
	}

	return ret;
}

417
static int mv88e6xxx_mdio_write_ppu(struct mv88e6xxx_chip *chip, int addr,
418
				    int regnum, u16 val)
419 420 421
{
	int ret;

422
	ret = mv88e6xxx_ppu_access_get(chip);
423
	if (ret >= 0) {
424 425
		ret = _mv88e6xxx_reg_write(chip, addr, regnum, val);
		mv88e6xxx_ppu_access_put(chip);
426 427 428 429 430
	}

	return ret;
}

431
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
432
{
433
	return chip->info->family == MV88E6XXX_FAMILY_6065;
434 435
}

436
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
437
{
438
	return chip->info->family == MV88E6XXX_FAMILY_6095;
439 440
}

441
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
442
{
443
	return chip->info->family == MV88E6XXX_FAMILY_6097;
444 445
}

446
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
447
{
448
	return chip->info->family == MV88E6XXX_FAMILY_6165;
449 450
}

451
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
452
{
453
	return chip->info->family == MV88E6XXX_FAMILY_6185;
454 455
}

456
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
457
{
458
	return chip->info->family == MV88E6XXX_FAMILY_6320;
459 460
}

461
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
462
{
463
	return chip->info->family == MV88E6XXX_FAMILY_6351;
464 465
}

466
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
467
{
468
	return chip->info->family == MV88E6XXX_FAMILY_6352;
469 470
}

471
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
472
{
473
	return chip->info->num_databases;
474 475
}

476
static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
477 478
{
	/* Does the device have dedicated FID registers for ATU and VTU ops? */
479 480
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
481 482 483 484 485
		return true;

	return false;
}

486 487 488 489
/* 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.
 */
490 491
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
492
{
493
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
494 495
	u32 reg;
	int ret;
496 497 498 499

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

500
	mutex_lock(&chip->reg_lock);
501

502
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
503 504 505 506 507 508 509 510 511 512 513
	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)
514
		reg |= PORT_PCS_CTRL_LINK_UP;
515

516
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
		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;

538 539
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
540 541 542 543 544 545 546 547
		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);
	}
548
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
549 550

out:
551
	mutex_unlock(&chip->reg_lock);
552 553
}

554
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
555 556 557 558 559
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
560
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
561
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
562 563 564 565 566 567
			return 0;
	}

	return -ETIMEDOUT;
}

568
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
569 570 571
{
	int ret;

572
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
573 574
		port = (port + 1) << 5;

575
	/* Snapshot the hardware statistics counters for this port. */
576
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
577 578 579 580
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
581

582
	/* Wait for the snapshotting to complete. */
583
	ret = _mv88e6xxx_stats_wait(chip);
584 585 586 587 588 589
	if (ret < 0)
		return ret;

	return 0;
}

590
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
591
				  int stat, u32 *val)
592 593 594 595 596 597
{
	u32 _val;
	int ret;

	*val = 0;

598
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
599 600
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
601 602 603
	if (ret < 0)
		return;

604
	ret = _mv88e6xxx_stats_wait(chip);
605 606 607
	if (ret < 0)
		return;

608
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
609 610 611 612 613
	if (ret < 0)
		return;

	_val = ret << 16;

614
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
615 616 617 618 619 620
	if (ret < 0)
		return;

	*val = _val | ret;
}

621
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
	{ "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, },
681 682
};

683
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
684
			       struct mv88e6xxx_hw_stat *stat)
685
{
686 687
	switch (stat->type) {
	case BANK0:
688
		return true;
689
	case BANK1:
690
		return mv88e6xxx_6320_family(chip);
691
	case PORT:
692 693 694 695 696 697
		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);
698
	}
699
	return false;
700 701
}

702
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
703
					    struct mv88e6xxx_hw_stat *s,
704 705 706 707 708 709 710
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

711 712
	switch (s->type) {
	case PORT:
713
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
714 715 716 717 718
		if (ret < 0)
			return UINT64_MAX;

		low = ret;
		if (s->sizeof_stat == 4) {
719
			ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
720
						  s->reg + 1);
721 722 723 724
			if (ret < 0)
				return UINT64_MAX;
			high = ret;
		}
725 726 727
		break;
	case BANK0:
	case BANK1:
728
		_mv88e6xxx_stats_read(chip, s->reg, &low);
729
		if (s->sizeof_stat == 8)
730
			_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
731 732 733 734 735
	}
	value = (((u64)high) << 16) | low;
	return value;
}

736 737
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
738
{
739
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
740 741
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
742

743 744
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
745
		if (mv88e6xxx_has_stat(chip, stat)) {
746 747 748 749
			memcpy(data + j * ETH_GSTRING_LEN, stat->string,
			       ETH_GSTRING_LEN);
			j++;
		}
750
	}
751 752
}

753
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
754
{
755
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
756 757 758 759 760
	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];
761
		if (mv88e6xxx_has_stat(chip, stat))
762 763 764
			j++;
	}
	return j;
765 766
}

767 768
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
769
{
770
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
771 772 773 774
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

775
	mutex_lock(&chip->reg_lock);
776

777
	ret = _mv88e6xxx_stats_snapshot(chip, port);
778
	if (ret < 0) {
779
		mutex_unlock(&chip->reg_lock);
780 781 782 783
		return;
	}
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
784 785
		if (mv88e6xxx_has_stat(chip, stat)) {
			data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
786 787 788 789
			j++;
		}
	}

790
	mutex_unlock(&chip->reg_lock);
791 792
}

793
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
794 795 796 797
{
	return 32 * sizeof(u16);
}

798 799
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
800
{
801
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
802 803 804 805 806 807 808
	u16 *p = _p;
	int i;

	regs->version = 0;

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

809
	mutex_lock(&chip->reg_lock);
810

811 812 813
	for (i = 0; i < 32; i++) {
		int ret;

814
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
815 816 817
		if (ret >= 0)
			p[i] = ret;
	}
818

819
	mutex_unlock(&chip->reg_lock);
820 821
}

822
static int _mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int reg, int offset,
823
			   u16 mask)
824 825 826 827 828 829
{
	unsigned long timeout = jiffies + HZ / 10;

	while (time_before(jiffies, timeout)) {
		int ret;

830
		ret = _mv88e6xxx_reg_read(chip, reg, offset);
831 832
		if (ret < 0)
			return ret;
833 834 835 836 837 838 839 840
		if (!(ret & mask))
			return 0;

		usleep_range(1000, 2000);
	}
	return -ETIMEDOUT;
}

841
static int mv88e6xxx_mdio_wait(struct mv88e6xxx_chip *chip)
842
{
843
	return _mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
844
			       GLOBAL2_SMI_OP_BUSY);
845 846
}

847
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
848
{
849
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
850
			       GLOBAL_ATU_OP_BUSY);
851 852
}

853
static int mv88e6xxx_mdio_read_indirect(struct mv88e6xxx_chip *chip,
854
					int addr, int regnum)
855 856 857
{
	int ret;

858
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
859 860 861 862
				   GLOBAL2_SMI_OP_22_READ | (addr << 5) |
				   regnum);
	if (ret < 0)
		return ret;
863

864
	ret = mv88e6xxx_mdio_wait(chip);
865 866 867
	if (ret < 0)
		return ret;

868
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA);
869 870

	return ret;
871 872
}

873
static int mv88e6xxx_mdio_write_indirect(struct mv88e6xxx_chip *chip,
874
					 int addr, int regnum, u16 val)
875
{
876 877
	int ret;

878
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA, val);
879 880
	if (ret < 0)
		return ret;
881

882
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
883 884 885
				   GLOBAL2_SMI_OP_22_WRITE | (addr << 5) |
				   regnum);

886
	return mv88e6xxx_mdio_wait(chip);
887 888
}

889 890
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
891
{
892
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
893 894
	int reg;

895
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
896 897
		return -EOPNOTSUPP;

898
	mutex_lock(&chip->reg_lock);
899

900
	reg = mv88e6xxx_mdio_read_indirect(chip, port, 16);
901
	if (reg < 0)
902
		goto out;
903 904 905 906

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

907
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
908
	if (reg < 0)
909
		goto out;
910

911
	e->eee_active = !!(reg & PORT_STATUS_EEE);
912
	reg = 0;
913

914
out:
915
	mutex_unlock(&chip->reg_lock);
916
	return reg;
917 918
}

919 920
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
921
{
922
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
923
	int reg;
924 925
	int ret;

926
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
927 928
		return -EOPNOTSUPP;

929
	mutex_lock(&chip->reg_lock);
930

931
	ret = mv88e6xxx_mdio_read_indirect(chip, port, 16);
932 933 934 935 936 937 938 939 940
	if (ret < 0)
		goto out;

	reg = ret & ~0x0300;
	if (e->eee_enabled)
		reg |= 0x0200;
	if (e->tx_lpi_enabled)
		reg |= 0x0100;

941
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 16, reg);
942
out:
943
	mutex_unlock(&chip->reg_lock);
944 945

	return ret;
946 947
}

948
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
949 950 951
{
	int ret;

952 953 954
	if (mv88e6xxx_has_fid_reg(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID,
					   fid);
955 956
		if (ret < 0)
			return ret;
957
	} else if (mv88e6xxx_num_databases(chip) == 256) {
958
		/* ATU DBNum[7:4] are located in ATU Control 15:12 */
959
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL);
960 961 962
		if (ret < 0)
			return ret;

963
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
964 965 966 967 968 969 970
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

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

973
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
974 975 976
	if (ret < 0)
		return ret;

977
	return _mv88e6xxx_atu_wait(chip);
978 979
}

980
static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
				     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;
	}

1000
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1001 1002
}

1003
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1004 1005
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1006
{
1007 1008
	int op;
	int err;
1009

1010
	err = _mv88e6xxx_atu_wait(chip);
1011 1012
	if (err)
		return err;
1013

1014
	err = _mv88e6xxx_atu_data_write(chip, entry);
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
	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;
	}

1026
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1027 1028
}

1029
static int _mv88e6xxx_atu_flush(struct mv88e6xxx_chip *chip,
1030
				u16 fid, bool static_too)
1031 1032 1033 1034 1035
{
	struct mv88e6xxx_atu_entry entry = {
		.fid = fid,
		.state = 0, /* EntryState bits must be 0 */
	};
1036

1037
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1038 1039
}

1040
static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
1041
			       int from_port, int to_port, bool static_too)
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
{
	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;

1055
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1056 1057
}

1058
static int _mv88e6xxx_atu_remove(struct mv88e6xxx_chip *chip, u16 fid,
1059
				 int port, bool static_too)
1060 1061
{
	/* Destination port 0xF means remove the entries */
1062
	return _mv88e6xxx_atu_move(chip, fid, port, 0x0f, static_too);
1063 1064
}

1065 1066 1067 1068 1069 1070 1071
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",
};

1072
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1073
				 u8 state)
1074
{
1075
	struct dsa_switch *ds = chip->ds;
1076
	int reg, ret = 0;
1077 1078
	u8 oldstate;

1079
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1080 1081
	if (reg < 0)
		return reg;
1082

1083
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1084

1085 1086 1087 1088 1089
	if (oldstate != state) {
		/* Flush forwarding database if we're moving a port
		 * from Learning or Forwarding state to Disabled or
		 * Blocking or Listening state.
		 */
1090
		if ((oldstate == PORT_CONTROL_STATE_LEARNING ||
1091 1092 1093
		     oldstate == PORT_CONTROL_STATE_FORWARDING) &&
		    (state == PORT_CONTROL_STATE_DISABLED ||
		     state == PORT_CONTROL_STATE_BLOCKING)) {
1094
			ret = _mv88e6xxx_atu_remove(chip, 0, port, false);
1095
			if (ret)
1096
				return ret;
1097
		}
1098

1099
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1100
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1101
					   reg);
1102 1103 1104
		if (ret)
			return ret;

1105
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1106 1107
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1108 1109 1110 1111 1112
	}

	return ret;
}

1113
static int _mv88e6xxx_port_based_vlan_map(struct mv88e6xxx_chip *chip, int port)
1114
{
1115 1116 1117
	struct net_device *bridge = chip->ports[port].bridge_dev;
	const u16 mask = (1 << chip->info->num_ports) - 1;
	struct dsa_switch *ds = chip->ds;
1118
	u16 output_ports = 0;
1119
	int reg;
1120 1121 1122 1123 1124 1125
	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 {
1126
		for (i = 0; i < chip->info->num_ports; ++i) {
1127
			/* allow sending frames to every group member */
1128
			if (bridge && chip->ports[i].bridge_dev == bridge)
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
				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);
1139

1140
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1141 1142
	if (reg < 0)
		return reg;
1143

1144 1145
	reg &= ~mask;
	reg |= output_ports & mask;
1146

1147
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1148 1149
}

1150 1151
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1152
{
1153
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1154
	int stp_state;
1155
	int err;
1156 1157 1158

	switch (state) {
	case BR_STATE_DISABLED:
1159
		stp_state = PORT_CONTROL_STATE_DISABLED;
1160 1161 1162
		break;
	case BR_STATE_BLOCKING:
	case BR_STATE_LISTENING:
1163
		stp_state = PORT_CONTROL_STATE_BLOCKING;
1164 1165
		break;
	case BR_STATE_LEARNING:
1166
		stp_state = PORT_CONTROL_STATE_LEARNING;
1167 1168 1169
		break;
	case BR_STATE_FORWARDING:
	default:
1170
		stp_state = PORT_CONTROL_STATE_FORWARDING;
1171 1172 1173
		break;
	}

1174 1175 1176
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1177 1178

	if (err)
1179 1180
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1181
			   mv88e6xxx_port_state_names[stp_state]);
1182 1183
}

1184
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1185
				u16 *new, u16 *old)
1186
{
1187
	struct dsa_switch *ds = chip->ds;
1188
	u16 pvid;
1189 1190
	int ret;

1191
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1192 1193 1194
	if (ret < 0)
		return ret;

1195 1196 1197 1198 1199 1200
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1201
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1202 1203 1204 1205
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1206 1207
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1208 1209 1210 1211
	}

	if (old)
		*old = pvid;
1212 1213 1214 1215

	return 0;
}

1216
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1217
				    int port, u16 *pvid)
1218
{
1219
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1220 1221
}

1222
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1223
				    int port, u16 pvid)
1224
{
1225
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1226 1227
}

1228
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1229
{
1230
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
1231 1232 1233
			       GLOBAL_VTU_OP_BUSY);
}

1234
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1235 1236 1237
{
	int ret;

1238
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1239 1240 1241
	if (ret < 0)
		return ret;

1242
	return _mv88e6xxx_vtu_wait(chip);
1243 1244
}

1245
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1246 1247 1248
{
	int ret;

1249
	ret = _mv88e6xxx_vtu_wait(chip);
1250 1251 1252
	if (ret < 0)
		return ret;

1253
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1254 1255
}

1256
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1257 1258 1259 1260 1261 1262 1263 1264
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1265
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1266 1267 1268 1269 1270 1271 1272
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1273
	for (i = 0; i < chip->info->num_ports; ++i) {
1274 1275 1276 1277 1278 1279 1280 1281 1282
		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;
}

1283
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1284 1285
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1286
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1287 1288
}

1289
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1290 1291
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1292
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1293 1294
}

1295
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1296 1297 1298 1299 1300 1301 1302
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

1303
	for (i = 0; i < chip->info->num_ports; ++i) {
1304 1305 1306 1307 1308 1309 1310
		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) {
1311
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
1312 1313 1314 1315 1316 1317 1318 1319
					   GLOBAL_VTU_DATA_0_3 + i, regs[i]);
		if (ret < 0)
			return ret;
	}

	return 0;
}

1320
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1321 1322
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1323
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1324 1325
}

1326
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1327 1328
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1329
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1330 1331
}

1332
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1333
{
1334
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1335 1336 1337
				    vid & GLOBAL_VTU_VID_MASK);
}

1338
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1339 1340 1341 1342 1343
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1344
	ret = _mv88e6xxx_vtu_wait(chip);
1345 1346 1347
	if (ret < 0)
		return ret;

1348
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1349 1350 1351
	if (ret < 0)
		return ret;

1352
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1353 1354 1355 1356 1357 1358 1359
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1360
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1361 1362 1363
		if (ret < 0)
			return ret;

1364 1365
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1366 1367 1368 1369 1370
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

			next.fid = ret & GLOBAL_VTU_FID_MASK;
1371
		} else if (mv88e6xxx_num_databases(chip) == 256) {
1372 1373 1374
			/* VTU DBNum[7:4] are located in VTU Operation 11:8, and
			 * VTU DBNum[3:0] are located in VTU Operation 3:0
			 */
1375
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1376 1377 1378 1379 1380 1381
						  GLOBAL_VTU_OP);
			if (ret < 0)
				return ret;

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

1384 1385
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1398 1399 1400
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1401
{
1402
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1403 1404 1405 1406
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1407
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1408 1409
		return -EOPNOTSUPP;

1410
	mutex_lock(&chip->reg_lock);
1411

1412
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1413 1414 1415
	if (err)
		goto unlock;

1416
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1417 1418 1419 1420
	if (err)
		goto unlock;

	do {
1421
		err = _mv88e6xxx_vtu_getnext(chip, &next);
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
		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 */
1432 1433
		vlan->vid_begin = next.vid;
		vlan->vid_end = next.vid;
1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
		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:
1448
	mutex_unlock(&chip->reg_lock);
1449 1450 1451 1452

	return err;
}

1453
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1454 1455
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1456
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1457 1458 1459
	u16 reg = 0;
	int ret;

1460
	ret = _mv88e6xxx_vtu_wait(chip);
1461 1462 1463 1464 1465 1466 1467
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1468
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1469 1470 1471
	if (ret < 0)
		return ret;

1472
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1473
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1474 1475
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1476 1477
		if (ret < 0)
			return ret;
1478
	}
1479

1480
	if (mv88e6xxx_has_fid_reg(chip)) {
1481
		reg = entry->fid & GLOBAL_VTU_FID_MASK;
1482 1483
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
					   reg);
1484 1485
		if (ret < 0)
			return ret;
1486
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1487 1488 1489 1490 1491
		/* 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;
1492 1493 1494 1495 1496
	}

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1497
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1498 1499 1500
	if (ret < 0)
		return ret;

1501
	return _mv88e6xxx_vtu_cmd(chip, op);
1502 1503
}

1504
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1505 1506 1507 1508 1509
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1510
	ret = _mv88e6xxx_vtu_wait(chip);
1511 1512 1513
	if (ret < 0)
		return ret;

1514
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1515 1516 1517 1518
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1519
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1520 1521 1522
	if (ret < 0)
		return ret;

1523
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1524 1525 1526 1527 1528
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1529
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1530 1531 1532 1533 1534 1535
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1536
		ret = mv88e6xxx_stu_data_read(chip, &next);
1537 1538 1539 1540 1541 1542 1543 1544
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1545
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1546 1547 1548 1549 1550
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1551
	ret = _mv88e6xxx_vtu_wait(chip);
1552 1553 1554 1555 1556 1557 1558
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1559
	ret = mv88e6xxx_stu_data_write(chip, entry);
1560 1561 1562 1563 1564
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1565
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1566 1567 1568 1569
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1570
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1571 1572 1573
	if (ret < 0)
		return ret;

1574
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1575 1576
}

1577
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1578
			       u16 *new, u16 *old)
1579
{
1580
	struct dsa_switch *ds = chip->ds;
1581
	u16 upper_mask;
1582 1583 1584
	u16 fid;
	int ret;

1585
	if (mv88e6xxx_num_databases(chip) == 4096)
1586
		upper_mask = 0xff;
1587
	else if (mv88e6xxx_num_databases(chip) == 256)
1588
		upper_mask = 0xf;
1589 1590 1591
	else
		return -EOPNOTSUPP;

1592
	/* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
1593
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1594 1595 1596 1597 1598 1599 1600 1601 1602
	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;

1603
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1604 1605 1606 1607 1608 1609
					   ret);
		if (ret < 0)
			return ret;
	}

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

1614
	fid |= (ret & upper_mask) << 4;
1615 1616

	if (new) {
1617 1618
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1619

1620
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1621 1622 1623 1624
					   ret);
		if (ret < 0)
			return ret;

1625 1626
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1627 1628 1629 1630 1631 1632 1633 1634
	}

	if (old)
		*old = fid;

	return 0;
}

1635
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1636
				   int port, u16 *fid)
1637
{
1638
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1639 1640
}

1641
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1642
				   int port, u16 fid)
1643
{
1644
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1645 1646
}

1647
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1648 1649 1650
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1651
	int i, err;
1652 1653 1654

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

1655
	/* Set every FID bit used by the (un)bridged ports */
1656 1657
	for (i = 0; i < chip->info->num_ports; ++i) {
		err = _mv88e6xxx_port_fid_get(chip, i, fid);
1658 1659 1660 1661 1662 1663
		if (err)
			return err;

		set_bit(*fid, fid_bitmap);
	}

1664
	/* Set every FID bit used by the VLAN entries */
1665
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1666 1667 1668 1669
	if (err)
		return err;

	do {
1670
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683
		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);
1684
	if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
1685 1686 1687
		return -ENOSPC;

	/* Clear the database */
1688
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1689 1690
}

1691
static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
1692
			      struct mv88e6xxx_vtu_stu_entry *entry)
1693
{
1694
	struct dsa_switch *ds = chip->ds;
1695 1696 1697 1698
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.valid = true,
		.vid = vid,
	};
1699 1700
	int i, err;

1701
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1702 1703
	if (err)
		return err;
1704

1705
	/* exclude all ports except the CPU and DSA ports */
1706
	for (i = 0; i < chip->info->num_ports; ++i)
1707 1708 1709
		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;
1710

1711 1712
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
1713 1714 1715 1716 1717 1718 1719
		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;
1720
		err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
1721 1722 1723 1724 1725 1726 1727 1728
		if (err)
			return err;

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

1729
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1730 1731 1732 1733 1734 1735 1736 1737 1738
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

1739
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
1740 1741 1742 1743 1744 1745 1746
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

1747
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1748 1749 1750
	if (err)
		return err;

1751
	err = _mv88e6xxx_vtu_getnext(chip, entry);
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761
	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.
		 */

1762
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1763 1764 1765 1766 1767
	}

	return err;
}

1768 1769 1770
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
1771
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1772 1773 1774 1775 1776 1777
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

1778
	mutex_lock(&chip->reg_lock);
1779

1780
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1781 1782 1783 1784
	if (err)
		goto unlock;

	do {
1785
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1786 1787 1788 1789 1790 1791 1792 1793 1794
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

1795
		for (i = 0; i < chip->info->num_ports; ++i) {
1796 1797 1798 1799 1800 1801 1802
			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;

1803 1804
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
1805 1806
				break; /* same bridge, check next VLAN */

1807
			netdev_warn(ds->ports[port].netdev,
1808 1809
				    "hardware VLAN %d already used by %s\n",
				    vlan.vid,
1810
				    netdev_name(chip->ports[i].bridge_dev));
1811 1812 1813 1814 1815 1816
			err = -EOPNOTSUPP;
			goto unlock;
		}
	} while (vlan.vid < vid_end);

unlock:
1817
	mutex_unlock(&chip->reg_lock);
1818 1819 1820 1821

	return err;
}

1822 1823 1824 1825 1826 1827 1828
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",
};

1829 1830
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
1831
{
1832
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1833 1834 1835 1836
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

1837
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1838 1839
		return -EOPNOTSUPP;

1840
	mutex_lock(&chip->reg_lock);
1841

1842
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1843 1844 1845 1846 1847
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1848 1849 1850
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1851

1852
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1853 1854 1855 1856
					   ret);
		if (ret < 0)
			goto unlock;

1857
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
1858 1859 1860
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
1861

1862
	ret = 0;
1863
unlock:
1864
	mutex_unlock(&chip->reg_lock);
1865 1866 1867 1868

	return ret;
}

1869 1870 1871 1872
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
1873
{
1874
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1875 1876
	int err;

1877
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1878 1879
		return -EOPNOTSUPP;

1880 1881 1882 1883 1884 1885 1886 1887
	/* 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;

1888 1889 1890 1891 1892 1893
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

1894
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1895
				    u16 vid, bool untagged)
1896 1897 1898 1899
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1900
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1901
	if (err)
1902
		return err;
1903 1904 1905 1906 1907

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

1908
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1909 1910
}

1911 1912 1913
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
1914
{
1915
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1916 1917 1918 1919
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

1920
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1921 1922
		return;

1923
	mutex_lock(&chip->reg_lock);
1924

1925
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
1926
		if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
1927 1928
			netdev_err(ds->ports[port].netdev,
				   "failed to add VLAN %d%c\n",
1929
				   vid, untagged ? 'u' : 't');
1930

1931
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
1932
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
1933
			   vlan->vid_end);
1934

1935
	mutex_unlock(&chip->reg_lock);
1936 1937
}

1938
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
1939
				    int port, u16 vid)
1940
{
1941
	struct dsa_switch *ds = chip->ds;
1942 1943 1944
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

1945
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1946
	if (err)
1947
		return err;
1948

1949 1950
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
1951
		return -EOPNOTSUPP;
1952 1953 1954 1955

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

	/* keep the VLAN unless all ports are excluded */
1956
	vlan.valid = false;
1957
	for (i = 0; i < chip->info->num_ports; ++i) {
1958
		if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
1959 1960 1961
			continue;

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1962
			vlan.valid = true;
1963 1964 1965 1966
			break;
		}
	}

1967
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1968 1969 1970
	if (err)
		return err;

1971
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
1972 1973
}

1974 1975
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
1976
{
1977
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1978 1979 1980
	u16 pvid, vid;
	int err = 0;

1981
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1982 1983
		return -EOPNOTSUPP;

1984
	mutex_lock(&chip->reg_lock);
1985

1986
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1987 1988 1989
	if (err)
		goto unlock;

1990
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
1991
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
1992 1993 1994 1995
		if (err)
			goto unlock;

		if (vid == pvid) {
1996
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
1997 1998 1999 2000 2001
			if (err)
				goto unlock;
		}
	}

2002
unlock:
2003
	mutex_unlock(&chip->reg_lock);
2004 2005 2006 2007

	return err;
}

2008
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2009
				    const unsigned char *addr)
2010 2011 2012 2013
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2014
		ret = _mv88e6xxx_reg_write(
2015
			chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i,
2016
			(addr[i * 2] << 8) | addr[i * 2 + 1]);
2017 2018 2019 2020 2021 2022 2023
		if (ret < 0)
			return ret;
	}

	return 0;
}

2024
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2025
				   unsigned char *addr)
2026 2027 2028 2029
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2030
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
2031
					  GLOBAL_ATU_MAC_01 + i);
2032 2033 2034 2035 2036 2037 2038 2039 2040
		if (ret < 0)
			return ret;
		addr[i * 2] = ret >> 8;
		addr[i * 2 + 1] = ret & 0xff;
	}

	return 0;
}

2041
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2042
			       struct mv88e6xxx_atu_entry *entry)
2043
{
2044 2045
	int ret;

2046
	ret = _mv88e6xxx_atu_wait(chip);
2047 2048 2049
	if (ret < 0)
		return ret;

2050
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2051 2052 2053
	if (ret < 0)
		return ret;

2054
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2055
	if (ret < 0)
2056 2057
		return ret;

2058
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2059
}
2060

2061
static int _mv88e6xxx_port_fdb_load(struct mv88e6xxx_chip *chip, int port,
2062 2063 2064 2065
				    const unsigned char *addr, u16 vid,
				    u8 state)
{
	struct mv88e6xxx_atu_entry entry = { 0 };
2066 2067 2068
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

2069 2070
	/* Null VLAN ID corresponds to the port private database */
	if (vid == 0)
2071
		err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
2072
	else
2073
		err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2074 2075
	if (err)
		return err;
2076

2077
	entry.fid = vlan.fid;
2078 2079 2080 2081 2082 2083 2084
	entry.state = state;
	ether_addr_copy(entry.mac, addr);
	if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.trunk = false;
		entry.portv_trunkid = BIT(port);
	}

2085
	return _mv88e6xxx_atu_load(chip, &entry);
2086 2087
}

2088 2089 2090
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 已提交
2091 2092 2093 2094 2095 2096 2097
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2098 2099 2100
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2101
{
2102
	int state = is_multicast_ether_addr(fdb->addr) ?
2103 2104
		GLOBAL_ATU_DATA_STATE_MC_STATIC :
		GLOBAL_ATU_DATA_STATE_UC_STATIC;
2105
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2106

2107 2108
	mutex_lock(&chip->reg_lock);
	if (_mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid, state))
2109 2110
		netdev_err(ds->ports[port].netdev,
			   "failed to load MAC address\n");
2111
	mutex_unlock(&chip->reg_lock);
2112 2113
}

2114 2115
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2116
{
2117
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2118 2119
	int ret;

2120 2121
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid,
2122
				       GLOBAL_ATU_DATA_STATE_UNUSED);
2123
	mutex_unlock(&chip->reg_lock);
2124 2125 2126 2127

	return ret;
}

2128
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2129
				  struct mv88e6xxx_atu_entry *entry)
2130
{
2131 2132 2133 2134
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2135

2136
	ret = _mv88e6xxx_atu_wait(chip);
2137 2138
	if (ret < 0)
		return ret;
2139

2140
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2141 2142
	if (ret < 0)
		return ret;
2143

2144
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2145 2146
	if (ret < 0)
		return ret;
2147

2148
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2149 2150
	if (ret < 0)
		return ret;
2151

2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
	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;
	}
2168

2169
	*entry = next;
2170 2171 2172
	return 0;
}

2173
static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2174
					u16 fid, u16 vid, int port,
2175 2176 2177 2178 2179 2180 2181 2182
					struct switchdev_obj_port_fdb *fdb,
					int (*cb)(struct switchdev_obj *obj))
{
	struct mv88e6xxx_atu_entry addr = {
		.mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
	};
	int err;

2183
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2184 2185 2186 2187
	if (err)
		return err;

	do {
2188
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213
		if (err)
			break;

		if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED)
			break;

		if (!addr.trunk && addr.portv_trunkid & BIT(port)) {
			bool is_static = addr.state ==
				(is_multicast_ether_addr(addr.mac) ?
				 GLOBAL_ATU_DATA_STATE_MC_STATIC :
				 GLOBAL_ATU_DATA_STATE_UC_STATIC);

			fdb->vid = vid;
			ether_addr_copy(fdb->addr, addr.mac);
			fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;

			err = cb(&fdb->obj);
			if (err)
				break;
		}
	} while (!is_broadcast_ether_addr(addr.mac));

	return err;
}

2214 2215 2216
static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
2217
{
2218
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2219 2220 2221
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2222
	u16 fid;
2223 2224
	int err;

2225
	mutex_lock(&chip->reg_lock);
2226

2227
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2228
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2229 2230 2231
	if (err)
		goto unlock;

2232
	err = _mv88e6xxx_port_fdb_dump_one(chip, fid, 0, port, fdb, cb);
2233 2234 2235
	if (err)
		goto unlock;

2236
	/* Dump VLANs' Filtering Information Databases */
2237
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2238 2239 2240 2241
	if (err)
		goto unlock;

	do {
2242
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2243
		if (err)
2244
			break;
2245 2246 2247 2248

		if (!vlan.valid)
			break;

2249 2250
		err = _mv88e6xxx_port_fdb_dump_one(chip, vlan.fid, vlan.vid,
						   port, fdb, cb);
2251
		if (err)
2252
			break;
2253 2254 2255
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

unlock:
2256
	mutex_unlock(&chip->reg_lock);
2257 2258 2259 2260

	return err;
}

2261 2262
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2263
{
2264
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2265
	int i, err = 0;
2266

2267
	mutex_lock(&chip->reg_lock);
2268

2269
	/* Assign the bridge and remap each port's VLANTable */
2270
	chip->ports[port].bridge_dev = bridge;
2271

2272 2273 2274
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2275 2276 2277 2278 2279
			if (err)
				break;
		}
	}

2280
	mutex_unlock(&chip->reg_lock);
2281

2282
	return err;
2283 2284
}

2285
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2286
{
2287 2288
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	struct net_device *bridge = chip->ports[port].bridge_dev;
2289
	int i;
2290

2291
	mutex_lock(&chip->reg_lock);
2292

2293
	/* Unassign the bridge and remap each port's VLANTable */
2294
	chip->ports[port].bridge_dev = NULL;
2295

2296 2297 2298
	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))
2299 2300
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2301

2302
	mutex_unlock(&chip->reg_lock);
2303 2304
}

2305
static int _mv88e6xxx_mdio_page_write(struct mv88e6xxx_chip *chip,
2306
				      int port, int page, int reg, int val)
2307 2308 2309
{
	int ret;

2310
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2311 2312 2313
	if (ret < 0)
		goto restore_page_0;

2314
	ret = mv88e6xxx_mdio_write_indirect(chip, port, reg, val);
2315
restore_page_0:
2316
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2317 2318 2319 2320

	return ret;
}

2321
static int _mv88e6xxx_mdio_page_read(struct mv88e6xxx_chip *chip,
2322
				     int port, int page, int reg)
2323 2324 2325
{
	int ret;

2326
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2327 2328 2329
	if (ret < 0)
		goto restore_page_0;

2330
	ret = mv88e6xxx_mdio_read_indirect(chip, port, reg);
2331
restore_page_0:
2332
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2333 2334 2335 2336

	return ret;
}

2337
static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2338
{
2339
	bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
2340
	u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2341
	struct gpio_desc *gpiod = chip->reset;
2342 2343 2344 2345 2346
	unsigned long timeout;
	int ret;
	int i;

	/* Set all ports to the disabled state. */
2347 2348
	for (i = 0; i < chip->info->num_ports; i++) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
2349 2350 2351
		if (ret < 0)
			return ret;

2352
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373
					   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)
2374
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
2375
	else
2376
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
2377 2378 2379 2380 2381 2382
	if (ret)
		return ret;

	/* Wait up to one second for reset to complete. */
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
2383
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398
		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;
}

2399
static int mv88e6xxx_power_on_serdes(struct mv88e6xxx_chip *chip)
2400 2401 2402
{
	int ret;

2403
	ret = _mv88e6xxx_mdio_page_read(chip, REG_FIBER_SERDES,
2404
					PAGE_FIBER_SERDES, MII_BMCR);
2405 2406 2407 2408 2409
	if (ret < 0)
		return ret;

	if (ret & BMCR_PDOWN) {
		ret &= ~BMCR_PDOWN;
2410
		ret = _mv88e6xxx_mdio_page_write(chip, REG_FIBER_SERDES,
2411 2412
						 PAGE_FIBER_SERDES, MII_BMCR,
						 ret);
2413 2414 2415 2416 2417
	}

	return ret;
}

2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428
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);
}

2429
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
2430
{
2431
	struct dsa_switch *ds = chip->ds;
2432
	int ret;
2433
	u16 reg;
2434

2435 2436 2437 2438
	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)) {
2439 2440 2441 2442 2443 2444
		/* 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.
		 */
2445
		reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
2446
		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
2447
			reg &= ~PORT_PCS_CTRL_UNFORCED;
2448 2449 2450 2451
			reg |= PORT_PCS_CTRL_FORCE_LINK |
				PORT_PCS_CTRL_LINK_UP |
				PORT_PCS_CTRL_DUPLEX_FULL |
				PORT_PCS_CTRL_FORCE_DUPLEX;
2452
			if (mv88e6xxx_6065_family(chip))
2453 2454 2455 2456 2457 2458 2459
				reg |= PORT_PCS_CTRL_100;
			else
				reg |= PORT_PCS_CTRL_1000;
		} else {
			reg |= PORT_PCS_CTRL_UNFORCED;
		}

2460
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2461 2462
					   PORT_PCS_CTRL, reg);
		if (ret)
2463
			return ret;
2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480
	}

	/* 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;
2481 2482 2483 2484
	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))
2485 2486 2487 2488
		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)) {
2489
		if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip))
2490
			reg |= PORT_CONTROL_DSA_TAG;
2491 2492 2493 2494 2495
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2496 2497
			reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
				PORT_CONTROL_FORWARD_UNKNOWN |
2498
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
2499 2500
		}

2501 2502 2503 2504 2505 2506 2507 2508
		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)) {
2509
			reg |= PORT_CONTROL_EGRESS_ADD_TAG;
2510 2511
		}
	}
2512
	if (dsa_is_dsa_port(ds, port)) {
2513 2514
		if (mv88e6xxx_6095_family(chip) ||
		    mv88e6xxx_6185_family(chip))
2515
			reg |= PORT_CONTROL_DSA_TAG;
2516 2517 2518 2519 2520
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2521
			reg |= PORT_CONTROL_FRAME_MODE_DSA;
2522 2523
		}

2524 2525 2526 2527 2528
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_FORWARD_UNKNOWN |
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
	}
	if (reg) {
2529
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2530 2531
					   PORT_CONTROL, reg);
		if (ret)
2532
			return ret;
2533 2534
	}

2535 2536 2537
	/* If this port is connected to a SerDes, make sure the SerDes is not
	 * powered down.
	 */
2538 2539
	if (mv88e6xxx_6352_family(chip)) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
2540
		if (ret < 0)
2541
			return ret;
2542 2543 2544 2545
		ret &= PORT_STATUS_CMODE_MASK;
		if ((ret == PORT_STATUS_CMODE_100BASE_X) ||
		    (ret == PORT_STATUS_CMODE_1000BASE_X) ||
		    (ret == PORT_STATUS_CMODE_SGMII)) {
2546
			ret = mv88e6xxx_power_on_serdes(chip);
2547
			if (ret < 0)
2548
				return ret;
2549 2550 2551
		}
	}

2552
	/* Port Control 2: don't force a good FCS, set the maximum frame size to
2553
	 * 10240 bytes, disable 802.1q tags checking, don't discard tagged or
2554 2555 2556
	 * 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.
2557 2558
	 */
	reg = 0;
2559 2560 2561 2562
	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))
2563 2564
		reg = PORT_CONTROL_2_MAP_DA;

2565 2566
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
2567 2568
		reg |= PORT_CONTROL_2_JUMBO_10240;

2569
	if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
2570 2571 2572 2573 2574 2575 2576 2577 2578
		/* 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;
	}

2579
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2580

2581
	if (reg) {
2582
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2583 2584
					   PORT_CONTROL_2, reg);
		if (ret)
2585
			return ret;
2586 2587 2588 2589 2590 2591 2592
	}

	/* 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.
	 */
2593
	reg = 1 << port;
2594 2595
	/* Disable learning for CPU port */
	if (dsa_is_cpu_port(ds, port))
2596
		reg = 0;
2597

2598 2599
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
				   reg);
2600
	if (ret)
2601
		return ret;
2602 2603

	/* Egress rate control 2: disable egress rate control. */
2604
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_RATE_CONTROL_2,
2605 2606
				   0x0000);
	if (ret)
2607
		return ret;
2608

2609 2610 2611
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
2612 2613 2614 2615
		/* 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.
		 */
2616
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2617 2618
					   PORT_PAUSE_CTRL, 0x0000);
		if (ret)
2619
			return ret;
2620 2621 2622 2623 2624

		/* Port ATU control: disable limiting the number of
		 * address database entries that this port is allowed
		 * to use.
		 */
2625
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2626 2627 2628 2629
					   PORT_ATU_CONTROL, 0x0000);
		/* Priority Override: disable DA, SA and VTU priority
		 * override.
		 */
2630
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2631 2632
					   PORT_PRI_OVERRIDE, 0x0000);
		if (ret)
2633
			return ret;
2634 2635 2636 2637

		/* Port Ethertype: use the Ethertype DSA Ethertype
		 * value.
		 */
2638
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2639 2640
					   PORT_ETH_TYPE, ETH_P_EDSA);
		if (ret)
2641
			return ret;
2642 2643 2644
		/* Tag Remap: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2645
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2646 2647
					   PORT_TAG_REGMAP_0123, 0x3210);
		if (ret)
2648
			return ret;
2649 2650 2651 2652

		/* Tag Remap 2: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2653
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2654 2655
					   PORT_TAG_REGMAP_4567, 0x7654);
		if (ret)
2656
			return ret;
2657 2658
	}

2659 2660 2661 2662
	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_6320_family(chip)) {
2663
		/* Rate Control: disable ingress rate limiting. */
2664
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2665 2666
					   PORT_RATE_CONTROL, 0x0001);
		if (ret)
2667
			return ret;
2668 2669
	}

2670 2671
	/* Port Control 1: disable trunking, disable sending
	 * learning messages to this port.
2672
	 */
2673 2674
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
				   0x0000);
2675
	if (ret)
2676
		return ret;
2677

2678
	/* Port based VLAN map: give each port the same default address
2679 2680
	 * database, and allow bidirectional communication between the
	 * CPU and DSA port(s), and the other ports.
2681
	 */
2682
	ret = _mv88e6xxx_port_fid_set(chip, port, 0);
2683
	if (ret)
2684
		return ret;
2685

2686
	ret = _mv88e6xxx_port_based_vlan_map(chip, port);
2687
	if (ret)
2688
		return ret;
2689 2690 2691 2692

	/* Default VLAN ID and priority: don't set a default VLAN
	 * ID, and set the default packet priority to zero.
	 */
2693
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_DEFAULT_VLAN,
2694
				   0x0000);
2695 2696
	if (ret)
		return ret;
2697 2698 2699 2700

	return 0;
}

2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718
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]);
}

2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745
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);
}

2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758
static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
				     unsigned int ageing_time)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

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

	return err;
}

2759
static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2760
{
2761
	struct dsa_switch *ds = chip->ds;
2762
	u32 upstream_port = dsa_upstream_port(ds);
2763
	u16 reg;
2764
	int err;
2765

2766 2767 2768 2769
	/* Enable the PHY Polling Unit if present, don't discard any packets,
	 * and mask all interrupt sources.
	 */
	reg = 0;
2770 2771
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
2772 2773
		reg |= GLOBAL_CONTROL_PPU_ENABLE;

2774
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
2775 2776 2777
	if (err)
		return err;

2778 2779 2780 2781 2782 2783
	/* 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;
2784 2785
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
				   reg);
2786 2787 2788
	if (err)
		return err;

2789
	/* Disable remote management, and set the switch's DSA device number. */
2790
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2,
2791 2792 2793 2794 2795
				   GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
				   (ds->index & 0x1f));
	if (err)
		return err;

2796 2797 2798 2799 2800
	/* Clear all the VTU and STU entries */
	err = _mv88e6xxx_vtu_stu_flush(chip);
	if (err < 0)
		return err;

2801 2802 2803 2804
	/* Set the default address aging time to 5 minutes, and
	 * enable address learn messages to be sent to all message
	 * ports.
	 */
2805 2806
	err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
			      GLOBAL_ATU_CONTROL_LEARN2ALL);
2807
	if (err)
2808
		return err;
2809

2810 2811
	err = mv88e6xxx_g1_set_age_time(chip, 300000);
	if (err)
2812 2813 2814 2815 2816 2817 2818
		return err;

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

2819
	/* Configure the IP ToS mapping registers. */
2820
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000);
2821
	if (err)
2822
		return err;
2823
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000);
2824
	if (err)
2825
		return err;
2826
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555);
2827
	if (err)
2828
		return err;
2829
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555);
2830
	if (err)
2831
		return err;
2832
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa);
2833
	if (err)
2834
		return err;
2835
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa);
2836
	if (err)
2837
		return err;
2838
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff);
2839
	if (err)
2840
		return err;
2841
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff);
2842
	if (err)
2843
		return err;
2844 2845

	/* Configure the IEEE 802.1p priority mapping register. */
2846
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41);
2847
	if (err)
2848
		return err;
2849

2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
	/* 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;
}

2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894
static int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
					     int target, int port)
{
	u16 val = (target << 8) | (port & 0xf);

	return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_DEVICE_MAPPING, val);
}

static int mv88e6xxx_g2_set_device_mapping(struct mv88e6xxx_chip *chip)
{
	int target, port;
	int err;

	/* Initialize the routing port to the 32 possible target devices */
	for (target = 0; target < 32; ++target) {
		port = 0xf;

		if (target < DSA_MAX_SWITCHES) {
			port = chip->ds->rtable[target];
			if (port == DSA_RTABLE_NONE)
				port = 0xf;
		}

		err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
		if (err)
			break;
	}

	return err;
}

2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937
static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
					 bool hask, u16 mask)
{
	const u16 port_mask = BIT(chip->info->num_ports) - 1;
	u16 val = (num << 12) | (mask & port_mask);

	if (hask)
		val |= GLOBAL2_TRUNK_MASK_HASK;

	return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_TRUNK_MASK, val);
}

static int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
					    u16 map)
{
	const u16 port_mask = BIT(chip->info->num_ports) - 1;
	u16 val = (id << 11) | (map & port_mask);

	return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_TRUNK_MAPPING, val);
}

static int mv88e6xxx_g2_clear_trunk(struct mv88e6xxx_chip *chip)
{
	const u16 port_mask = BIT(chip->info->num_ports) - 1;
	int i, err;

	/* Clear all eight possible Trunk Mask vectors */
	for (i = 0; i < 8; ++i) {
		err = mv88e6xxx_g2_trunk_mask_write(chip, i, false, port_mask);
		if (err)
			return err;
	}

	/* Clear all sixteen possible Trunk ID routing vectors */
	for (i = 0; i < 16; ++i) {
		err = mv88e6xxx_g2_trunk_mapping_write(chip, i, 0);
		if (err)
			return err;
	}

	return 0;
}

2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960
static int mv88e6xxx_g2_clear_irl(struct mv88e6xxx_chip *chip)
{
	int port, err;

	/* Init all Ingress Rate Limit resources of all ports */
	for (port = 0; port < chip->info->num_ports; ++port) {
		/* XXX newer chips (like 88E6390) have different 2-bit ops */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_IRL_CMD,
				      GLOBAL2_IRL_CMD_OP_INIT_ALL |
				      (port << 8));
		if (err)
			break;

		/* Wait for the operation to complete */
		err = _mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_IRL_CMD,
				      GLOBAL2_IRL_CMD_BUSY);
		if (err)
			break;
	}

	return err;
}

2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982
/* Indirect write to the Switch MAC/WoL/WoF register */
static int mv88e6xxx_g2_switch_mac_write(struct mv88e6xxx_chip *chip,
					 unsigned int pointer, u8 data)
{
	u16 val = (pointer << 8) | data;

	return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MAC, val);
}

static int mv88e6xxx_g2_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
{
	int i, err;

	for (i = 0; i < 6; i++) {
		err = mv88e6xxx_g2_switch_mac_write(chip, i, addr[i]);
		if (err)
			break;
	}

	return err;
}

2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004
static int mv88e6xxx_g2_pot_write(struct mv88e6xxx_chip *chip, int pointer,
				  u8 data)
{
	u16 val = (pointer << 8) | (data & 0x7);

	return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_PRIO_OVERRIDE, val);
}

static int mv88e6xxx_g2_clear_pot(struct mv88e6xxx_chip *chip)
{
	int i, err;

	/* Clear all sixteen possible Priority Override entries */
	for (i = 0; i < 16; i++) {
		err = mv88e6xxx_g2_pot_write(chip, i, 0);
		if (err)
			break;
	}

	return err;
}

3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056
static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
{
	return _mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_EEPROM_CMD,
			       GLOBAL2_EEPROM_CMD_BUSY |
			       GLOBAL2_EEPROM_CMD_RUNNING);
}

static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
{
	int err;

	err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_EEPROM_CMD, cmd);
	if (err)
		return err;

	return mv88e6xxx_g2_eeprom_wait(chip);
}

static int mv88e6xxx_g2_eeprom_read16(struct mv88e6xxx_chip *chip,
				      u8 addr, u16 *data)
{
	u16 cmd = GLOBAL2_EEPROM_CMD_OP_READ | addr;
	int err;

	err = mv88e6xxx_g2_eeprom_wait(chip);
	if (err)
		return err;

	err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
	if (err)
		return err;

	return mv88e6xxx_read(chip, REG_GLOBAL2, GLOBAL2_EEPROM_DATA, data);
}

static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip,
				       u8 addr, u16 data)
{
	u16 cmd = GLOBAL2_EEPROM_CMD_OP_WRITE | addr;
	int err;

	err = mv88e6xxx_g2_eeprom_wait(chip);
	if (err)
		return err;

	err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_EEPROM_DATA, data);
	if (err)
		return err;

	return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
}

3057 3058
static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
{
3059
	u16 reg;
3060 3061
	int err;

3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X)) {
		/* Consider the frames with reserved multicast destination
		 * addresses matching 01:80:c2:00:00:2x as MGMT.
		 */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_2X,
				      0xffff);
		if (err)
			return err;
	}

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X)) {
		/* Consider the frames with reserved multicast destination
		 * addresses matching 01:80:c2:00:00:0x as MGMT.
		 */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_0X,
				      0xffff);
		if (err)
			return err;
	}
3081 3082 3083 3084 3085 3086

	/* Ignore removed tag data on doubly tagged packets, disable
	 * flow control messages, force flow control priority to the
	 * highest, and send all special multicast frames to the CPU
	 * port at the highest priority.
	 */
3087 3088 3089 3090 3091
	reg = GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI | (0x7 << 4);
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X))
		reg |= GLOBAL2_SWITCH_MGMT_RSVD2CPU | 0x7;
	err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MGMT, reg);
3092
	if (err)
3093
		return err;
3094 3095

	/* Program the DSA routing table. */
3096 3097 3098
	err = mv88e6xxx_g2_set_device_mapping(chip);
	if (err)
		return err;
3099

3100 3101 3102 3103
	/* Clear all trunk masks and mapping. */
	err = mv88e6xxx_g2_clear_trunk(chip);
	if (err)
		return err;
3104

3105 3106 3107 3108 3109 3110 3111 3112 3113
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_IRL)) {
		/* Disable ingress rate limiting by resetting all per port
		 * ingress rate limit resources to their initial state.
		 */
		err = mv88e6xxx_g2_clear_irl(chip);
			if (err)
				return err;
	}

3114 3115 3116 3117
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_PVT)) {
		/* Initialize Cross-chip Port VLAN Table to reset defaults */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_PVT_ADDR,
				      GLOBAL2_PVT_ADDR_OP_INIT_ONES);
3118
		if (err)
3119
			return err;
3120
	}
3121

3122
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_POT)) {
3123
		/* Clear the priority override table. */
3124 3125 3126
		err = mv88e6xxx_g2_clear_pot(chip);
		if (err)
			return err;
3127 3128
	}

3129
	return 0;
3130 3131
}

3132
static int mv88e6xxx_setup(struct dsa_switch *ds)
3133
{
3134
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3135
	int err;
3136 3137
	int i;

3138 3139
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
3140

3141
	mutex_lock(&chip->reg_lock);
3142

3143
	err = mv88e6xxx_switch_reset(chip);
3144 3145 3146
	if (err)
		goto unlock;

3147 3148 3149 3150 3151 3152 3153 3154 3155
	/* 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);
3156 3157 3158
	if (err)
		goto unlock;

3159 3160 3161
	/* Setup Switch Global 2 Registers */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
		err = mv88e6xxx_g2_setup(chip);
3162 3163 3164
		if (err)
			goto unlock;
	}
3165

3166
unlock:
3167
	mutex_unlock(&chip->reg_lock);
3168

3169
	return err;
3170 3171
}

3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	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;
}

3190
#ifdef CONFIG_NET_DSA_HWMON
3191 3192
static int mv88e6xxx_mdio_page_read(struct dsa_switch *ds, int port, int page,
				    int reg)
3193
{
3194
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3195 3196
	int ret;

3197 3198 3199
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_mdio_page_read(chip, port, page, reg);
	mutex_unlock(&chip->reg_lock);
3200

3201 3202 3203
	return ret;
}

3204 3205
static int mv88e6xxx_mdio_page_write(struct dsa_switch *ds, int port, int page,
				     int reg, int val)
3206
{
3207
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3208 3209
	int ret;

3210 3211 3212
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_mdio_page_write(chip, port, page, reg, val);
	mutex_unlock(&chip->reg_lock);
3213

3214 3215
	return ret;
}
3216
#endif
3217

3218
static int mv88e6xxx_port_to_mdio_addr(struct mv88e6xxx_chip *chip, int port)
3219
{
3220
	if (port >= 0 && port < chip->info->num_ports)
3221 3222 3223 3224
		return port;
	return -EINVAL;
}

3225
static int mv88e6xxx_mdio_read(struct mii_bus *bus, int port, int regnum)
3226
{
3227 3228
	struct mv88e6xxx_chip *chip = bus->priv;
	int addr = mv88e6xxx_port_to_mdio_addr(chip, port);
3229 3230 3231
	int ret;

	if (addr < 0)
3232
		return 0xffff;
3233

3234
	mutex_lock(&chip->reg_lock);
3235

3236 3237 3238 3239
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
		ret = mv88e6xxx_mdio_read_ppu(chip, addr, regnum);
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_SMI_PHY))
		ret = mv88e6xxx_mdio_read_indirect(chip, addr, regnum);
3240
	else
3241
		ret = mv88e6xxx_mdio_read_direct(chip, addr, regnum);
3242

3243
	mutex_unlock(&chip->reg_lock);
3244 3245 3246
	return ret;
}

3247
static int mv88e6xxx_mdio_write(struct mii_bus *bus, int port, int regnum,
3248
				u16 val)
3249
{
3250 3251
	struct mv88e6xxx_chip *chip = bus->priv;
	int addr = mv88e6xxx_port_to_mdio_addr(chip, port);
3252 3253 3254
	int ret;

	if (addr < 0)
3255
		return 0xffff;
3256

3257
	mutex_lock(&chip->reg_lock);
3258

3259 3260 3261 3262
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
		ret = mv88e6xxx_mdio_write_ppu(chip, addr, regnum, val);
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_SMI_PHY))
		ret = mv88e6xxx_mdio_write_indirect(chip, addr, regnum, val);
3263
	else
3264
		ret = mv88e6xxx_mdio_write_direct(chip, addr, regnum, val);
3265

3266
	mutex_unlock(&chip->reg_lock);
3267 3268 3269
	return ret;
}

3270
static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
3271 3272 3273 3274 3275 3276
				   struct device_node *np)
{
	static int index;
	struct mii_bus *bus;
	int err;

3277 3278
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
		mv88e6xxx_ppu_state_init(chip);
3279 3280

	if (np)
3281
		chip->mdio_np = of_get_child_by_name(np, "mdio");
3282

3283
	bus = devm_mdiobus_alloc(chip->dev);
3284 3285 3286
	if (!bus)
		return -ENOMEM;

3287
	bus->priv = (void *)chip;
3288 3289 3290 3291 3292 3293 3294 3295 3296 3297
	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;
3298
	bus->parent = chip->dev;
3299

3300 3301
	if (chip->mdio_np)
		err = of_mdiobus_register(bus, chip->mdio_np);
3302 3303 3304
	else
		err = mdiobus_register(bus);
	if (err) {
3305
		dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
3306 3307
		goto out;
	}
3308
	chip->mdio_bus = bus;
3309 3310 3311 3312

	return 0;

out:
3313 3314
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3315 3316 3317 3318

	return err;
}

3319
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3320 3321

{
3322
	struct mii_bus *bus = chip->mdio_bus;
3323 3324 3325

	mdiobus_unregister(bus);

3326 3327
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3328 3329
}

3330 3331 3332 3333
#ifdef CONFIG_NET_DSA_HWMON

static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
{
3334
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3335 3336 3337 3338 3339
	int ret;
	int val;

	*temp = 0;

3340
	mutex_lock(&chip->reg_lock);
3341

3342
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x6);
3343 3344 3345 3346
	if (ret < 0)
		goto error;

	/* Enable temperature sensor */
3347
	ret = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a);
3348 3349 3350
	if (ret < 0)
		goto error;

3351
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret | (1 << 5));
3352 3353 3354 3355 3356 3357
	if (ret < 0)
		goto error;

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

3358
	val = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a);
3359 3360 3361 3362 3363 3364
	if (val < 0) {
		ret = val;
		goto error;
	}

	/* Disable temperature sensor */
3365
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret & ~(1 << 5));
3366 3367 3368 3369 3370 3371
	if (ret < 0)
		goto error;

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

error:
3372 3373
	mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x0);
	mutex_unlock(&chip->reg_lock);
3374 3375 3376 3377 3378
	return ret;
}

static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
{
3379 3380
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3381 3382 3383 3384
	int ret;

	*temp = 0;

3385
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 27);
3386 3387 3388 3389 3390 3391 3392 3393
	if (ret < 0)
		return ret;

	*temp = (ret & 0xff) - 25;

	return 0;
}

3394
static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
3395
{
3396
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3397

3398
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3399 3400
		return -EOPNOTSUPP;

3401
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
3402 3403 3404 3405 3406
		return mv88e63xx_get_temp(ds, temp);

	return mv88e61xx_get_temp(ds, temp);
}

3407
static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3408
{
3409 3410
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3411 3412
	int ret;

3413
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3414 3415 3416 3417
		return -EOPNOTSUPP;

	*temp = 0;

3418
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3419 3420 3421 3422 3423 3424 3425 3426
	if (ret < 0)
		return ret;

	*temp = (((ret >> 8) & 0x1f) * 5) - 25;

	return 0;
}

3427
static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3428
{
3429 3430
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3431 3432
	int ret;

3433
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3434 3435
		return -EOPNOTSUPP;

3436
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3437 3438 3439
	if (ret < 0)
		return ret;
	temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3440 3441
	return mv88e6xxx_mdio_page_write(ds, phy, 6, 26,
					 (ret & 0xe0ff) | (temp << 8));
3442 3443
}

3444
static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3445
{
3446 3447
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3448 3449
	int ret;

3450
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3451 3452 3453 3454
		return -EOPNOTSUPP;

	*alarm = false;

3455
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3456 3457 3458 3459 3460 3461 3462 3463 3464
	if (ret < 0)
		return ret;

	*alarm = !!(ret & 0x40);

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);

	return chip->eeprom_len;
}

static int mv88e6xxx_get_eeprom16(struct mv88e6xxx_chip *chip,
				  struct ethtool_eeprom *eeprom, u8 *data)
{
	unsigned int offset = eeprom->offset;
	unsigned int len = eeprom->len;
	u16 val;
	int err;

	eeprom->len = 0;

	if (offset & 1) {
		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
		if (err)
			return err;

		*data++ = (val >> 8) & 0xff;

		offset++;
		len--;
		eeprom->len++;
	}

	while (len >= 2) {
		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
		if (err)
			return err;

		*data++ = val & 0xff;
		*data++ = (val >> 8) & 0xff;

		offset += 2;
		len -= 2;
		eeprom->len += 2;
	}

	if (len) {
		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
		if (err)
			return err;

		*data++ = val & 0xff;

		offset++;
		len--;
		eeprom->len++;
	}

	return 0;
}

static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
		err = mv88e6xxx_get_eeprom16(chip, eeprom, data);
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	if (err)
		return err;

	eeprom->magic = 0xc3ec4951;

	return 0;
}

static int mv88e6xxx_set_eeprom16(struct mv88e6xxx_chip *chip,
				  struct ethtool_eeprom *eeprom, u8 *data)
{
	unsigned int offset = eeprom->offset;
	unsigned int len = eeprom->len;
	u16 val;
	int err;

	/* Ensure the RO WriteEn bit is set */
	err = mv88e6xxx_read(chip, REG_GLOBAL2, GLOBAL2_EEPROM_CMD, &val);
	if (err)
		return err;

	if (!(val & GLOBAL2_EEPROM_CMD_WRITE_EN))
		return -EROFS;

	eeprom->len = 0;

	if (offset & 1) {
		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
		if (err)
			return err;

		val = (*data++ << 8) | (val & 0xff);

		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
		if (err)
			return err;

		offset++;
		len--;
		eeprom->len++;
	}

	while (len >= 2) {
		val = *data++;
		val |= *data++ << 8;

		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
		if (err)
			return err;

		offset += 2;
		len -= 2;
		eeprom->len += 2;
	}

	if (len) {
		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
		if (err)
			return err;

		val = (val & 0xff00) | *data++;

		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
		if (err)
			return err;

		offset++;
		len--;
		eeprom->len++;
	}

	return 0;
}

static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

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

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
		err = mv88e6xxx_set_eeprom16(chip, eeprom, data);
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	return err;
}

3632 3633 3634 3635 3636 3637 3638
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,
3639
		.port_base_addr = 0x10,
3640
		.age_time_coeff = 15000,
3641 3642 3643 3644 3645 3646 3647 3648 3649
		.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,
3650
		.port_base_addr = 0x10,
3651
		.age_time_coeff = 15000,
3652 3653 3654 3655 3656 3657 3658 3659 3660
		.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,
3661
		.port_base_addr = 0x10,
3662
		.age_time_coeff = 15000,
3663 3664 3665 3666 3667 3668 3669 3670 3671
		.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,
3672
		.port_base_addr = 0x10,
3673
		.age_time_coeff = 15000,
3674 3675 3676 3677 3678 3679 3680 3681 3682
		.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,
3683
		.port_base_addr = 0x10,
3684
		.age_time_coeff = 15000,
3685 3686 3687 3688 3689 3690 3691 3692 3693
		.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,
3694
		.port_base_addr = 0x10,
3695
		.age_time_coeff = 15000,
3696 3697 3698 3699 3700 3701 3702 3703 3704
		.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,
3705
		.port_base_addr = 0x10,
3706
		.age_time_coeff = 15000,
3707 3708 3709 3710 3711 3712 3713 3714 3715
		.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,
3716
		.port_base_addr = 0x10,
3717
		.age_time_coeff = 15000,
3718 3719 3720 3721 3722 3723 3724 3725 3726
		.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,
3727
		.port_base_addr = 0x10,
3728
		.age_time_coeff = 15000,
3729 3730 3731 3732 3733 3734 3735 3736 3737
		.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,
3738
		.port_base_addr = 0x10,
3739
		.age_time_coeff = 15000,
3740 3741 3742 3743 3744 3745 3746 3747 3748
		.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,
3749
		.port_base_addr = 0x10,
3750
		.age_time_coeff = 15000,
3751 3752 3753 3754 3755 3756 3757 3758 3759
		.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,
3760
		.port_base_addr = 0x10,
3761
		.age_time_coeff = 15000,
3762 3763 3764 3765 3766 3767 3768 3769 3770
		.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,
3771
		.port_base_addr = 0x10,
3772
		.age_time_coeff = 15000,
3773 3774 3775 3776 3777 3778 3779 3780 3781
		.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,
3782
		.port_base_addr = 0x10,
3783
		.age_time_coeff = 15000,
3784 3785 3786 3787 3788 3789 3790 3791 3792
		.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,
3793
		.port_base_addr = 0x10,
3794
		.age_time_coeff = 15000,
3795 3796 3797 3798 3799 3800 3801 3802 3803
		.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,
3804
		.port_base_addr = 0x10,
3805
		.age_time_coeff = 15000,
3806 3807 3808 3809 3810 3811 3812 3813 3814
		.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,
3815
		.port_base_addr = 0x10,
3816
		.age_time_coeff = 15000,
3817 3818 3819 3820
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},
};

3821
static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
3822
{
3823
	int i;
3824

3825 3826 3827
	for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
		if (mv88e6xxx_table[i].prod_num == prod_num)
			return &mv88e6xxx_table[i];
3828 3829 3830 3831

	return NULL;
}

3832
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3833 3834
{
	const struct mv88e6xxx_info *info;
3835 3836 3837
	unsigned int prod_num, rev;
	u16 id;
	int err;
3838

3839 3840 3841 3842 3843
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_read(chip, 0, PORT_SWITCH_ID, &id);
	mutex_unlock(&chip->reg_lock);
	if (err)
		return err;
3844 3845 3846 3847 3848 3849 3850 3851

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

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

3852
	/* Update the compatible info with the probed one */
3853
	chip->info = info;
3854

3855 3856
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3857 3858 3859 3860

	return 0;
}

3861
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3862
{
3863
	struct mv88e6xxx_chip *chip;
3864

3865 3866
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3867 3868
		return NULL;

3869
	chip->dev = dev;
3870

3871
	mutex_init(&chip->reg_lock);
3872

3873
	return chip;
3874 3875
}

3876
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3877 3878 3879 3880 3881 3882
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3883
	if (sw_addr == 0)
3884 3885 3886
		chip->smi_ops = &mv88e6xxx_smi_single_chip_ops;
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_MULTI_CHIP))
		chip->smi_ops = &mv88e6xxx_smi_multi_chip_ops;
3887 3888 3889
	else
		return -EINVAL;

3890 3891
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3892 3893 3894 3895

	return 0;
}

3896 3897 3898
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3899
{
3900
	struct mv88e6xxx_chip *chip;
3901
	struct mii_bus *bus;
3902
	int err;
3903

3904
	bus = dsa_host_dev_to_mii_bus(host_dev);
3905 3906 3907
	if (!bus)
		return NULL;

3908 3909
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3910 3911
		return NULL;

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

3915
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3916 3917 3918
	if (err)
		goto free;

3919
	err = mv88e6xxx_detect(chip);
3920
	if (err)
3921
		goto free;
3922

3923
	err = mv88e6xxx_mdio_register(chip, NULL);
3924
	if (err)
3925
		goto free;
3926

3927
	*priv = chip;
3928

3929
	return chip->info->name;
3930
free:
3931
	devm_kfree(dsa_dev, chip);
3932 3933

	return NULL;
3934 3935
}

3936
static struct dsa_switch_driver mv88e6xxx_switch_driver = {
3937
	.tag_protocol		= DSA_TAG_PROTO_EDSA,
3938
	.probe			= mv88e6xxx_drv_probe,
3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952
	.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
3953
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
3954 3955 3956 3957
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
	.get_regs_len		= mv88e6xxx_get_regs_len,
	.get_regs		= mv88e6xxx_get_regs,
3958
	.set_ageing_time	= mv88e6xxx_set_ageing_time,
3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972
	.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,
};

3973
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
3974 3975
				     struct device_node *np)
{
3976
	struct device *dev = chip->dev;
3977 3978 3979 3980 3981 3982 3983
	struct dsa_switch *ds;

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

	ds->dev = dev;
3984
	ds->priv = chip;
3985 3986 3987 3988 3989 3990 3991
	ds->drv = &mv88e6xxx_switch_driver;

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

3992
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
3993
{
3994
	dsa_unregister_switch(chip->ds);
3995 3996
}

3997
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
3998
{
3999
	struct device *dev = &mdiodev->dev;
4000
	struct device_node *np = dev->of_node;
4001
	const struct mv88e6xxx_info *compat_info;
4002
	struct mv88e6xxx_chip *chip;
4003
	u32 eeprom_len;
4004
	int err;
4005

4006 4007 4008 4009
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

4010 4011
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
4012 4013
		return -ENOMEM;

4014
	chip->info = compat_info;
4015

4016
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
4017 4018
	if (err)
		return err;
4019

4020
	err = mv88e6xxx_detect(chip);
4021 4022
	if (err)
		return err;
4023

4024 4025 4026
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
4027

4028
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
4029
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
4030
		chip->eeprom_len = eeprom_len;
4031

4032
	err = mv88e6xxx_mdio_register(chip, np);
4033 4034 4035
	if (err)
		return err;

4036
	err = mv88e6xxx_register_switch(chip, np);
4037
	if (err) {
4038
		mv88e6xxx_mdio_unregister(chip);
4039 4040 4041
		return err;
	}

4042 4043
	return 0;
}
4044 4045 4046 4047

static void mv88e6xxx_remove(struct mdio_device *mdiodev)
{
	struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev);
4048
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
4049

4050 4051
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
4052 4053 4054
}

static const struct of_device_id mv88e6xxx_of_match[] = {
4055 4056 4057 4058
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077
	{ /* 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)
{
	register_switch_driver(&mv88e6xxx_switch_driver);
	return mdio_driver_register(&mv88e6xxx_driver);
}
4078 4079 4080 4081
module_init(mv88e6xxx_init);

static void __exit mv88e6xxx_cleanup(void)
{
4082
	mdio_driver_unregister(&mv88e6xxx_driver);
4083
	unregister_switch_driver(&mv88e6xxx_switch_driver);
4084 4085
}
module_exit(mv88e6xxx_cleanup);
4086 4087 4088 4089

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