chip.c 96.3 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
static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg,
			  u16 mask)
{
	unsigned long timeout = jiffies + HZ / 10;

	while (time_before(jiffies, timeout)) {
		u16 val;
		int err;

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

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

		usleep_range(1000, 2000);
	}

	return -ETIMEDOUT;
}

241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
/* 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);
}

267
static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
268 269 270 271
{
	u16 val;
	int err;

272
	err = mv88e6xxx_read(chip, addr, reg, &val);
273 274 275 276 277 278
	if (err)
		return err;

	return val;
}

279
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
280 281
				int reg, u16 val)
{
282
	return mv88e6xxx_write(chip, addr, reg, val);
283 284
}

285
static int mv88e6xxx_mdio_read_direct(struct mv88e6xxx_chip *chip,
286
				      int addr, int regnum)
287 288
{
	if (addr >= 0)
289
		return _mv88e6xxx_reg_read(chip, addr, regnum);
290 291 292
	return 0xffff;
}

293
static int mv88e6xxx_mdio_write_direct(struct mv88e6xxx_chip *chip,
294
				       int addr, int regnum, u16 val)
295 296
{
	if (addr >= 0)
297
		return _mv88e6xxx_reg_write(chip, addr, regnum, val);
298 299 300
	return 0;
}

301
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
302 303
{
	int ret;
304
	unsigned long timeout;
305

306
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
307 308 309
	if (ret < 0)
		return ret;

310
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
311
				   ret & ~GLOBAL_CONTROL_PPU_ENABLE);
312 313
	if (ret)
		return ret;
314

315 316
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
317
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
318 319 320
		if (ret < 0)
			return ret;

321
		usleep_range(1000, 2000);
322 323
		if ((ret & GLOBAL_STATUS_PPU_MASK) !=
		    GLOBAL_STATUS_PPU_POLLING)
324
			return 0;
325 326 327 328 329
	}

	return -ETIMEDOUT;
}

330
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
331
{
332
	int ret, err;
333
	unsigned long timeout;
334

335
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
336 337 338
	if (ret < 0)
		return ret;

339
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
340
				   ret | GLOBAL_CONTROL_PPU_ENABLE);
341 342
	if (err)
		return err;
343

344 345
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
346
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
347 348 349
		if (ret < 0)
			return ret;

350
		usleep_range(1000, 2000);
351 352
		if ((ret & GLOBAL_STATUS_PPU_MASK) ==
		    GLOBAL_STATUS_PPU_POLLING)
353
			return 0;
354 355 356 357 358 359 360
	}

	return -ETIMEDOUT;
}

static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
{
361
	struct mv88e6xxx_chip *chip;
362

363
	chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
364

365
	mutex_lock(&chip->reg_lock);
366

367 368 369 370
	if (mutex_trylock(&chip->ppu_mutex)) {
		if (mv88e6xxx_ppu_enable(chip) == 0)
			chip->ppu_disabled = 0;
		mutex_unlock(&chip->ppu_mutex);
371
	}
372

373
	mutex_unlock(&chip->reg_lock);
374 375 376 377
}

static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
{
378
	struct mv88e6xxx_chip *chip = (void *)_ps;
379

380
	schedule_work(&chip->ppu_work);
381 382
}

383
static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
384 385 386
{
	int ret;

387
	mutex_lock(&chip->ppu_mutex);
388

389
	/* If the PHY polling unit is enabled, disable it so that
390 391 392 393
	 * we can access the PHY registers.  If it was already
	 * disabled, cancel the timer that is going to re-enable
	 * it.
	 */
394 395
	if (!chip->ppu_disabled) {
		ret = mv88e6xxx_ppu_disable(chip);
396
		if (ret < 0) {
397
			mutex_unlock(&chip->ppu_mutex);
398 399
			return ret;
		}
400
		chip->ppu_disabled = 1;
401
	} else {
402
		del_timer(&chip->ppu_timer);
403
		ret = 0;
404 405 406 407 408
	}

	return ret;
}

409
static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
410
{
411
	/* Schedule a timer to re-enable the PHY polling unit. */
412 413
	mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
	mutex_unlock(&chip->ppu_mutex);
414 415
}

416
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
417
{
418 419 420 421 422
	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;
423 424
}

425
static int mv88e6xxx_mdio_read_ppu(struct mv88e6xxx_chip *chip, int addr,
426
				   int regnum)
427 428 429
{
	int ret;

430
	ret = mv88e6xxx_ppu_access_get(chip);
431
	if (ret >= 0) {
432 433
		ret = _mv88e6xxx_reg_read(chip, addr, regnum);
		mv88e6xxx_ppu_access_put(chip);
434 435 436 437 438
	}

	return ret;
}

439
static int mv88e6xxx_mdio_write_ppu(struct mv88e6xxx_chip *chip, int addr,
440
				    int regnum, u16 val)
441 442 443
{
	int ret;

444
	ret = mv88e6xxx_ppu_access_get(chip);
445
	if (ret >= 0) {
446 447
		ret = _mv88e6xxx_reg_write(chip, addr, regnum, val);
		mv88e6xxx_ppu_access_put(chip);
448 449 450 451 452
	}

	return ret;
}

453
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
454
{
455
	return chip->info->family == MV88E6XXX_FAMILY_6065;
456 457
}

458
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
459
{
460
	return chip->info->family == MV88E6XXX_FAMILY_6095;
461 462
}

463
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
464
{
465
	return chip->info->family == MV88E6XXX_FAMILY_6097;
466 467
}

468
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
469
{
470
	return chip->info->family == MV88E6XXX_FAMILY_6165;
471 472
}

473
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
474
{
475
	return chip->info->family == MV88E6XXX_FAMILY_6185;
476 477
}

478
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
479
{
480
	return chip->info->family == MV88E6XXX_FAMILY_6320;
481 482
}

483
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
484
{
485
	return chip->info->family == MV88E6XXX_FAMILY_6351;
486 487
}

488
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
489
{
490
	return chip->info->family == MV88E6XXX_FAMILY_6352;
491 492
}

493
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
494
{
495
	return chip->info->num_databases;
496 497
}

498
static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
499 500
{
	/* Does the device have dedicated FID registers for ATU and VTU ops? */
501 502
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
503 504 505 506 507
		return true;

	return false;
}

508 509 510 511
/* 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.
 */
512 513
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
514
{
515
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
516 517
	u32 reg;
	int ret;
518 519 520 521

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

522
	mutex_lock(&chip->reg_lock);
523

524
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
525 526 527 528 529 530 531 532 533 534 535
	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)
536
		reg |= PORT_PCS_CTRL_LINK_UP;
537

538
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
		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;

560 561
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
562 563 564 565 566 567 568 569
		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);
	}
570
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
571 572

out:
573
	mutex_unlock(&chip->reg_lock);
574 575
}

576
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
577 578 579 580 581
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
582
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
583
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
584 585 586 587 588 589
			return 0;
	}

	return -ETIMEDOUT;
}

590
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
591 592 593
{
	int ret;

594
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
595 596
		port = (port + 1) << 5;

597
	/* Snapshot the hardware statistics counters for this port. */
598
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
599 600 601 602
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
603

604
	/* Wait for the snapshotting to complete. */
605
	ret = _mv88e6xxx_stats_wait(chip);
606 607 608 609 610 611
	if (ret < 0)
		return ret;

	return 0;
}

612
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
613
				  int stat, u32 *val)
614 615 616 617 618 619
{
	u32 _val;
	int ret;

	*val = 0;

620
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
621 622
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
623 624 625
	if (ret < 0)
		return;

626
	ret = _mv88e6xxx_stats_wait(chip);
627 628 629
	if (ret < 0)
		return;

630
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
631 632 633 634 635
	if (ret < 0)
		return;

	_val = ret << 16;

636
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
637 638 639 640 641 642
	if (ret < 0)
		return;

	*val = _val | ret;
}

643
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
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 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
	{ "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, },
703 704
};

705
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
706
			       struct mv88e6xxx_hw_stat *stat)
707
{
708 709
	switch (stat->type) {
	case BANK0:
710
		return true;
711
	case BANK1:
712
		return mv88e6xxx_6320_family(chip);
713
	case PORT:
714 715 716 717 718 719
		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);
720
	}
721
	return false;
722 723
}

724
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
725
					    struct mv88e6xxx_hw_stat *s,
726 727 728 729 730 731 732
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

733 734
	switch (s->type) {
	case PORT:
735
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
736 737 738 739 740
		if (ret < 0)
			return UINT64_MAX;

		low = ret;
		if (s->sizeof_stat == 4) {
741
			ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
742
						  s->reg + 1);
743 744 745 746
			if (ret < 0)
				return UINT64_MAX;
			high = ret;
		}
747 748 749
		break;
	case BANK0:
	case BANK1:
750
		_mv88e6xxx_stats_read(chip, s->reg, &low);
751
		if (s->sizeof_stat == 8)
752
			_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
753 754 755 756 757
	}
	value = (((u64)high) << 16) | low;
	return value;
}

758 759
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
760
{
761
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
762 763
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
764

765 766
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
767
		if (mv88e6xxx_has_stat(chip, stat)) {
768 769 770 771
			memcpy(data + j * ETH_GSTRING_LEN, stat->string,
			       ETH_GSTRING_LEN);
			j++;
		}
772
	}
773 774
}

775
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
776
{
777
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
778 779 780 781 782
	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];
783
		if (mv88e6xxx_has_stat(chip, stat))
784 785 786
			j++;
	}
	return j;
787 788
}

789 790
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
791
{
792
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
793 794 795 796
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

797
	mutex_lock(&chip->reg_lock);
798

799
	ret = _mv88e6xxx_stats_snapshot(chip, port);
800
	if (ret < 0) {
801
		mutex_unlock(&chip->reg_lock);
802 803 804 805
		return;
	}
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
806 807
		if (mv88e6xxx_has_stat(chip, stat)) {
			data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
808 809 810 811
			j++;
		}
	}

812
	mutex_unlock(&chip->reg_lock);
813 814
}

815
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
816 817 818 819
{
	return 32 * sizeof(u16);
}

820 821
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
822
{
823
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
824 825 826 827 828 829 830
	u16 *p = _p;
	int i;

	regs->version = 0;

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

831
	mutex_lock(&chip->reg_lock);
832

833 834 835
	for (i = 0; i < 32; i++) {
		int ret;

836
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
837 838 839
		if (ret >= 0)
			p[i] = ret;
	}
840

841
	mutex_unlock(&chip->reg_lock);
842 843
}

844
static int mv88e6xxx_mdio_wait(struct mv88e6xxx_chip *chip)
845
{
846 847
	return mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
			      GLOBAL2_SMI_OP_BUSY);
848 849
}

850
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
851
{
852 853
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
			      GLOBAL_ATU_OP_BUSY);
854 855
}

856
static int mv88e6xxx_mdio_read_indirect(struct mv88e6xxx_chip *chip,
857
					int addr, int regnum)
858 859 860
{
	int ret;

861
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
862 863 864 865
				   GLOBAL2_SMI_OP_22_READ | (addr << 5) |
				   regnum);
	if (ret < 0)
		return ret;
866

867
	ret = mv88e6xxx_mdio_wait(chip);
868 869 870
	if (ret < 0)
		return ret;

871
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA);
872 873

	return ret;
874 875
}

876
static int mv88e6xxx_mdio_write_indirect(struct mv88e6xxx_chip *chip,
877
					 int addr, int regnum, u16 val)
878
{
879 880
	int ret;

881
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA, val);
882 883
	if (ret < 0)
		return ret;
884

885
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
886 887 888
				   GLOBAL2_SMI_OP_22_WRITE | (addr << 5) |
				   regnum);

889
	return mv88e6xxx_mdio_wait(chip);
890 891
}

892 893
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
894
{
895
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
896 897
	int reg;

898
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
899 900
		return -EOPNOTSUPP;

901
	mutex_lock(&chip->reg_lock);
902

903
	reg = mv88e6xxx_mdio_read_indirect(chip, port, 16);
904
	if (reg < 0)
905
		goto out;
906 907 908 909

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

910
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
911
	if (reg < 0)
912
		goto out;
913

914
	e->eee_active = !!(reg & PORT_STATUS_EEE);
915
	reg = 0;
916

917
out:
918
	mutex_unlock(&chip->reg_lock);
919
	return reg;
920 921
}

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

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

932
	mutex_lock(&chip->reg_lock);
933

934
	ret = mv88e6xxx_mdio_read_indirect(chip, port, 16);
935 936 937 938 939 940 941 942 943
	if (ret < 0)
		goto out;

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

944
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 16, reg);
945
out:
946
	mutex_unlock(&chip->reg_lock);
947 948

	return ret;
949 950
}

951
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
952 953 954
{
	int ret;

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

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

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

976
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
977 978 979
	if (ret < 0)
		return ret;

980
	return _mv88e6xxx_atu_wait(chip);
981 982
}

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

1003
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1004 1005
}

1006
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1007 1008
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1009
{
1010 1011
	int op;
	int err;
1012

1013
	err = _mv88e6xxx_atu_wait(chip);
1014 1015
	if (err)
		return err;
1016

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

1029
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1030 1031
}

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

1040
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1041 1042
}

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

1058
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1059 1060
}

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

1068 1069 1070 1071 1072 1073 1074
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",
};

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

1082
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1083 1084
	if (reg < 0)
		return reg;
1085

1086
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1087

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

1102
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1103
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1104
					   reg);
1105 1106 1107
		if (ret)
			return ret;

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

	return ret;
}

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

1143
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1144 1145
	if (reg < 0)
		return reg;
1146

1147 1148
	reg &= ~mask;
	reg |= output_ports & mask;
1149

1150
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1151 1152
}

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

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

1177 1178 1179
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1180 1181

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

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

1194
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1195 1196 1197
	if (ret < 0)
		return ret;

1198 1199 1200 1201 1202 1203
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1204
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1205 1206 1207 1208
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

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

	if (old)
		*old = pvid;
1215 1216 1217 1218

	return 0;
}

1219
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1220
				    int port, u16 *pvid)
1221
{
1222
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1223 1224
}

1225
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1226
				    int port, u16 pvid)
1227
{
1228
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1229 1230
}

1231
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1232
{
1233 1234
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
			      GLOBAL_VTU_OP_BUSY);
1235 1236
}

1237
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1238 1239 1240
{
	int ret;

1241
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1242 1243 1244
	if (ret < 0)
		return ret;

1245
	return _mv88e6xxx_vtu_wait(chip);
1246 1247
}

1248
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1249 1250 1251
{
	int ret;

1252
	ret = _mv88e6xxx_vtu_wait(chip);
1253 1254 1255
	if (ret < 0)
		return ret;

1256
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1257 1258
}

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

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

		regs[i] = ret;
	}

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

1286
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1287 1288
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1289
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1290 1291
}

1292
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1293 1294
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1295
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1296 1297
}

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

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

	return 0;
}

1323
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1324 1325
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1326
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1327 1328
}

1329
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1330 1331
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1332
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1333 1334
}

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

1341
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1342 1343 1344 1345 1346
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1347
	ret = _mv88e6xxx_vtu_wait(chip);
1348 1349 1350
	if (ret < 0)
		return ret;

1351
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1352 1353 1354
	if (ret < 0)
		return ret;

1355
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1356 1357 1358 1359 1360 1361 1362
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1363
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1364 1365 1366
		if (ret < 0)
			return ret;

1367 1368
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1369 1370 1371 1372 1373
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

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

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

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

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

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

1410
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1411 1412
		return -EOPNOTSUPP;

1413
	mutex_lock(&chip->reg_lock);
1414

1415
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1416 1417 1418
	if (err)
		goto unlock;

1419
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1420 1421 1422 1423
	if (err)
		goto unlock;

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

	return err;
}

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

1463
	ret = _mv88e6xxx_vtu_wait(chip);
1464 1465 1466 1467 1468 1469 1470
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1471
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1472 1473 1474
	if (ret < 0)
		return ret;

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

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

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

1504
	return _mv88e6xxx_vtu_cmd(chip, op);
1505 1506
}

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

1513
	ret = _mv88e6xxx_vtu_wait(chip);
1514 1515 1516
	if (ret < 0)
		return ret;

1517
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1518 1519 1520 1521
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1522
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1523 1524 1525
	if (ret < 0)
		return ret;

1526
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1527 1528 1529 1530 1531
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1532
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1533 1534 1535 1536 1537 1538
	if (ret < 0)
		return ret;

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

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

	*entry = next;
	return 0;
}

1548
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1549 1550 1551 1552 1553
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1554
	ret = _mv88e6xxx_vtu_wait(chip);
1555 1556 1557 1558 1559 1560 1561
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1562
	ret = mv88e6xxx_stu_data_write(chip, entry);
1563 1564 1565 1566 1567
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1568
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1569 1570 1571 1572
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1573
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1574 1575 1576
	if (ret < 0)
		return ret;

1577
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1578 1579
}

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

1588
	if (mv88e6xxx_num_databases(chip) == 4096)
1589
		upper_mask = 0xff;
1590
	else if (mv88e6xxx_num_databases(chip) == 256)
1591
		upper_mask = 0xf;
1592 1593 1594
	else
		return -EOPNOTSUPP;

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

1606
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1607 1608 1609 1610 1611 1612
					   ret);
		if (ret < 0)
			return ret;
	}

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

1617
	fid |= (ret & upper_mask) << 4;
1618 1619

	if (new) {
1620 1621
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1622

1623
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1624 1625 1626 1627
					   ret);
		if (ret < 0)
			return ret;

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

	if (old)
		*old = fid;

	return 0;
}

1638
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1639
				   int port, u16 *fid)
1640
{
1641
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1642 1643
}

1644
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1645
				   int port, u16 fid)
1646
{
1647
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1648 1649
}

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

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

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

		set_bit(*fid, fid_bitmap);
	}

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

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

	/* Clear the database */
1691
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1692 1693
}

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

1704
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1705 1706
	if (err)
		return err;
1707

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

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

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

1732
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1733 1734 1735 1736 1737 1738 1739 1740 1741
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

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

	if (!vid)
		return -EINVAL;

1750
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1751 1752 1753
	if (err)
		return err;

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

1765
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1766 1767 1768 1769 1770
	}

	return err;
}

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

	if (!vid_begin)
		return -EOPNOTSUPP;

1781
	mutex_lock(&chip->reg_lock);
1782

1783
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1784 1785 1786 1787
	if (err)
		goto unlock;

	do {
1788
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1789 1790 1791 1792 1793 1794 1795 1796 1797
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

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

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

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

unlock:
1820
	mutex_unlock(&chip->reg_lock);
1821 1822 1823 1824

	return err;
}

1825 1826 1827 1828 1829 1830 1831
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",
};

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

1840
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1841 1842
		return -EOPNOTSUPP;

1843
	mutex_lock(&chip->reg_lock);
1844

1845
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1846 1847 1848 1849 1850
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1851 1852 1853
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1854

1855
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1856 1857 1858 1859
					   ret);
		if (ret < 0)
			goto unlock;

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

1865
	ret = 0;
1866
unlock:
1867
	mutex_unlock(&chip->reg_lock);
1868 1869 1870 1871

	return ret;
}

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

1880
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1881 1882
		return -EOPNOTSUPP;

1883 1884 1885 1886 1887 1888 1889 1890
	/* 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;

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

1897
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1898
				    u16 vid, bool untagged)
1899 1900 1901 1902
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1903
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1904
	if (err)
1905
		return err;
1906 1907 1908 1909 1910

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

1911
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1912 1913
}

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

1923
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1924 1925
		return;

1926
	mutex_lock(&chip->reg_lock);
1927

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

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

1938
	mutex_unlock(&chip->reg_lock);
1939 1940
}

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

1948
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1949
	if (err)
1950
		return err;
1951

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

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

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

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1965
			vlan.valid = true;
1966 1967 1968 1969
			break;
		}
	}

1970
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1971 1972 1973
	if (err)
		return err;

1974
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
1975 1976
}

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

1984
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1985 1986
		return -EOPNOTSUPP;

1987
	mutex_lock(&chip->reg_lock);
1988

1989
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1990 1991 1992
	if (err)
		goto unlock;

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

		if (vid == pvid) {
1999
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2000 2001 2002 2003 2004
			if (err)
				goto unlock;
		}
	}

2005
unlock:
2006
	mutex_unlock(&chip->reg_lock);
2007 2008 2009 2010

	return err;
}

2011
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2012
				    const unsigned char *addr)
2013 2014 2015 2016
{
	int i, ret;

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

	return 0;
}

2027
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2028
				   unsigned char *addr)
2029 2030 2031 2032
{
	int i, ret;

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

	return 0;
}

2044
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2045
			       struct mv88e6xxx_atu_entry *entry)
2046
{
2047 2048
	int ret;

2049
	ret = _mv88e6xxx_atu_wait(chip);
2050 2051 2052
	if (ret < 0)
		return ret;

2053
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2054 2055 2056
	if (ret < 0)
		return ret;

2057
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2058
	if (ret < 0)
2059 2060
		return ret;

2061
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2062
}
2063

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

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

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

2088
	return _mv88e6xxx_atu_load(chip, &entry);
2089 2090
}

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

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

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

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

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

	return ret;
}

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

	next.fid = fid;
2138

2139
	ret = _mv88e6xxx_atu_wait(chip);
2140 2141
	if (ret < 0)
		return ret;
2142

2143
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2144 2145
	if (ret < 0)
		return ret;
2146

2147
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2148 2149
	if (ret < 0)
		return ret;
2150

2151
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2152 2153
	if (ret < 0)
		return ret;
2154

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

2172
	*entry = next;
2173 2174 2175
	return 0;
}

2176
static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2177
					u16 fid, u16 vid, int port,
2178 2179 2180 2181 2182 2183 2184 2185
					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;

2186
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2187 2188 2189 2190
	if (err)
		return err;

	do {
2191
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216
		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;
}

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

2228
	mutex_lock(&chip->reg_lock);
2229

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

2235
	err = _mv88e6xxx_port_fdb_dump_one(chip, fid, 0, port, fdb, cb);
2236 2237 2238
	if (err)
		goto unlock;

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

	do {
2245
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2246
		if (err)
2247
			break;
2248 2249 2250 2251

		if (!vlan.valid)
			break;

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

unlock:
2259
	mutex_unlock(&chip->reg_lock);
2260 2261 2262 2263

	return err;
}

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

2270
	mutex_lock(&chip->reg_lock);
2271

2272
	/* Assign the bridge and remap each port's VLANTable */
2273
	chip->ports[port].bridge_dev = bridge;
2274

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

2283
	mutex_unlock(&chip->reg_lock);
2284

2285
	return err;
2286 2287
}

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

2294
	mutex_lock(&chip->reg_lock);
2295

2296
	/* Unassign the bridge and remap each port's VLANTable */
2297
	chip->ports[port].bridge_dev = NULL;
2298

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

2305
	mutex_unlock(&chip->reg_lock);
2306 2307
}

2308
static int _mv88e6xxx_mdio_page_write(struct mv88e6xxx_chip *chip,
2309
				      int port, int page, int reg, int val)
2310 2311 2312
{
	int ret;

2313
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2314 2315 2316
	if (ret < 0)
		goto restore_page_0;

2317
	ret = mv88e6xxx_mdio_write_indirect(chip, port, reg, val);
2318
restore_page_0:
2319
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2320 2321 2322 2323

	return ret;
}

2324
static int _mv88e6xxx_mdio_page_read(struct mv88e6xxx_chip *chip,
2325
				     int port, int page, int reg)
2326 2327 2328
{
	int ret;

2329
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2330 2331 2332
	if (ret < 0)
		goto restore_page_0;

2333
	ret = mv88e6xxx_mdio_read_indirect(chip, port, reg);
2334
restore_page_0:
2335
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2336 2337 2338 2339

	return ret;
}

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

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

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

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

2402
static int mv88e6xxx_power_on_serdes(struct mv88e6xxx_chip *chip)
2403 2404 2405
{
	int ret;

2406
	ret = _mv88e6xxx_mdio_page_read(chip, REG_FIBER_SERDES,
2407
					PAGE_FIBER_SERDES, MII_BMCR);
2408 2409 2410 2411 2412
	if (ret < 0)
		return ret;

	if (ret & BMCR_PDOWN) {
		ret &= ~BMCR_PDOWN;
2413
		ret = _mv88e6xxx_mdio_page_write(chip, REG_FIBER_SERDES,
2414 2415
						 PAGE_FIBER_SERDES, MII_BMCR,
						 ret);
2416 2417 2418 2419 2420
	}

	return ret;
}

2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431
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);
}

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

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

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

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

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

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

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

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

2568 2569
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
2570 2571
		reg |= PORT_CONTROL_2_JUMBO_10240;

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

2582
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2583

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

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

2601 2602
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
				   reg);
2603
	if (ret)
2604
		return ret;
2605 2606

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

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

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

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

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

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

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

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

2689
	ret = _mv88e6xxx_port_based_vlan_map(chip, port);
2690
	if (ret)
2691
		return ret;
2692 2693 2694 2695

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

	return 0;
}

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

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

2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761
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;
}

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

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

2777
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
2778 2779 2780
	if (err)
		return err;

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

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

2799 2800 2801 2802 2803
	/* Clear all the VTU and STU entries */
	err = _mv88e6xxx_vtu_stu_flush(chip);
	if (err < 0)
		return err;

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

2813 2814
	err = mv88e6xxx_g1_set_age_time(chip, 300000);
	if (err)
2815 2816 2817 2818 2819 2820 2821
		return err;

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

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

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

2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866
	/* 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;
}

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 2895 2896 2897
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;
}

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 2938 2939 2940
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;
}

2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954
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 */
2955 2956
		err = mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_IRL_CMD,
				     GLOBAL2_IRL_CMD_BUSY);
2957 2958 2959 2960 2961 2962 2963
		if (err)
			break;
	}

	return err;
}

2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985
/* 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;
}

2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007
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;
}

3008 3009
static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
{
3010 3011 3012
	return mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_EEPROM_CMD,
			      GLOBAL2_EEPROM_CMD_BUSY |
			      GLOBAL2_EEPROM_CMD_RUNNING);
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 3057 3058 3059
}

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

3060 3061
static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
{
3062
	u16 reg;
3063 3064
	int err;

3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083
	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;
	}
3084 3085 3086 3087 3088 3089

	/* 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.
	 */
3090 3091 3092 3093 3094
	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);
3095
	if (err)
3096
		return err;
3097 3098

	/* Program the DSA routing table. */
3099 3100 3101
	err = mv88e6xxx_g2_set_device_mapping(chip);
	if (err)
		return err;
3102

3103 3104 3105 3106
	/* Clear all trunk masks and mapping. */
	err = mv88e6xxx_g2_clear_trunk(chip);
	if (err)
		return err;
3107

3108 3109 3110 3111 3112 3113 3114 3115 3116
	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;
	}

3117 3118 3119 3120
	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);
3121
		if (err)
3122
			return err;
3123
	}
3124

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

3132
	return 0;
3133 3134
}

3135
static int mv88e6xxx_setup(struct dsa_switch *ds)
3136
{
3137
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3138
	int err;
3139 3140
	int i;

3141 3142
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
3143

3144
	mutex_lock(&chip->reg_lock);
3145

3146
	err = mv88e6xxx_switch_reset(chip);
3147 3148 3149
	if (err)
		goto unlock;

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

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

3169
unlock:
3170
	mutex_unlock(&chip->reg_lock);
3171

3172
	return err;
3173 3174
}

3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192
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;
}

3193 3194
static int mv88e6xxx_mdio_page_read(struct dsa_switch *ds, int port, int page,
				    int reg)
3195
{
3196
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3197 3198
	int ret;

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

3203 3204 3205
	return ret;
}

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

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

3216 3217 3218
	return ret;
}

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

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

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

3235
	mutex_lock(&chip->reg_lock);
3236

3237 3238 3239 3240
	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);
3241
	else
3242
		ret = mv88e6xxx_mdio_read_direct(chip, addr, regnum);
3243

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

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

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

3258
	mutex_lock(&chip->reg_lock);
3259

3260 3261 3262 3263
	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);
3264
	else
3265
		ret = mv88e6xxx_mdio_write_direct(chip, addr, regnum, val);
3266

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

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

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

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

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

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

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

	return 0;

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

	return err;
}

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

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

	mdiobus_unregister(bus);

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

3331 3332 3333 3334
#ifdef CONFIG_NET_DSA_HWMON

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

	*temp = 0;

3341
	mutex_lock(&chip->reg_lock);
3342

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

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

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

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

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

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

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

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

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

	*temp = 0;

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

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

	return 0;
}

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

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

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

	return mv88e61xx_get_temp(ds, temp);
}

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

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

	*temp = 0;

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

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

	return 0;
}

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

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

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

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

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

	*alarm = false;

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

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

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

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

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

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

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

	return NULL;
}

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

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

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

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

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

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

	return 0;
}

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

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

3870
	chip->dev = dev;
3871

3872
	mutex_init(&chip->reg_lock);
3873

3874
	return chip;
3875 3876
}

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

3884
	if (sw_addr == 0)
3885 3886 3887
		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;
3888 3889 3890
	else
		return -EINVAL;

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

	return 0;
}

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

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

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

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

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

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

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

3928
	*priv = chip;
3929

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

	return NULL;
3935 3936
}

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

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

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

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

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

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

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

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

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

4015
	chip->info = compat_info;
4016

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

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

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

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

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

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

4043 4044
	return 0;
}
4045 4046 4047 4048

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

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

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

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

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