chip.c 96.2 KB
Newer Older
1
/*
2 3
 * Marvell 88e6xxx Ethernet switch single-chip support
 *
4 5
 * Copyright (c) 2008 Marvell Semiconductor
 *
6 7 8
 * Copyright (c) 2015 CMC Electronics, Inc.
 *	Added support for VLAN Table Unit operations
 *
9 10
 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
 *
11 12 13 14 15 16
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

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

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

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

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

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

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

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

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

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

	*val = ret & 0xffff;

	return 0;
}

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

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

	return 0;
}

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

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

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

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

	return -ETIMEDOUT;
}

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

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

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

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

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

146
	*val = ret & 0xffff;
147

148
	return 0;
149 150
}

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

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

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

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

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

	return 0;
}

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

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

190
	assert_reg_lock(chip);
191

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

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

	return 0;
}

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

207
	assert_reg_lock(chip);
208

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

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

216 217 218
	return 0;
}

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
/* Indirect write to single pointer-data register with an Update bit */
static int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,
			    u16 update)
{
	u16 val;
	int i, err;

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

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

	if (i == 16)
		return -ETIMEDOUT;

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

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

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

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

	return val;
}

257
static int mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
258 259 260
{
	int ret;

261 262 263
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_reg_read(chip, addr, reg);
	mutex_unlock(&chip->reg_lock);
264 265 266 267

	return ret;
}

268
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
269 270
				int reg, u16 val)
{
271
	return mv88e6xxx_write(chip, addr, reg, val);
272 273
}

274
static int mv88e6xxx_mdio_read_direct(struct mv88e6xxx_chip *chip,
275
				      int addr, int regnum)
276 277
{
	if (addr >= 0)
278
		return _mv88e6xxx_reg_read(chip, addr, regnum);
279 280 281
	return 0xffff;
}

282
static int mv88e6xxx_mdio_write_direct(struct mv88e6xxx_chip *chip,
283
				       int addr, int regnum, u16 val)
284 285
{
	if (addr >= 0)
286
		return _mv88e6xxx_reg_write(chip, addr, regnum, val);
287 288 289
	return 0;
}

290
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
291 292
{
	int ret;
293
	unsigned long timeout;
294

295
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
296 297 298
	if (ret < 0)
		return ret;

299
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
300
				   ret & ~GLOBAL_CONTROL_PPU_ENABLE);
301 302
	if (ret)
		return ret;
303

304 305
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
306
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
307 308 309
		if (ret < 0)
			return ret;

310
		usleep_range(1000, 2000);
311 312
		if ((ret & GLOBAL_STATUS_PPU_MASK) !=
		    GLOBAL_STATUS_PPU_POLLING)
313
			return 0;
314 315 316 317 318
	}

	return -ETIMEDOUT;
}

319
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
320
{
321
	int ret, err;
322
	unsigned long timeout;
323

324
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
325 326 327
	if (ret < 0)
		return ret;

328
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
329
				   ret | GLOBAL_CONTROL_PPU_ENABLE);
330 331
	if (err)
		return err;
332

333 334
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
335
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
336 337 338
		if (ret < 0)
			return ret;

339
		usleep_range(1000, 2000);
340 341
		if ((ret & GLOBAL_STATUS_PPU_MASK) ==
		    GLOBAL_STATUS_PPU_POLLING)
342
			return 0;
343 344 345 346 347 348 349
	}

	return -ETIMEDOUT;
}

static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
{
350
	struct mv88e6xxx_chip *chip;
351

352
	chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
353

354
	mutex_lock(&chip->reg_lock);
355

356 357 358 359
	if (mutex_trylock(&chip->ppu_mutex)) {
		if (mv88e6xxx_ppu_enable(chip) == 0)
			chip->ppu_disabled = 0;
		mutex_unlock(&chip->ppu_mutex);
360
	}
361

362
	mutex_unlock(&chip->reg_lock);
363 364 365 366
}

static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
{
367
	struct mv88e6xxx_chip *chip = (void *)_ps;
368

369
	schedule_work(&chip->ppu_work);
370 371
}

372
static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
373 374 375
{
	int ret;

376
	mutex_lock(&chip->ppu_mutex);
377

378
	/* If the PHY polling unit is enabled, disable it so that
379 380 381 382
	 * we can access the PHY registers.  If it was already
	 * disabled, cancel the timer that is going to re-enable
	 * it.
	 */
383 384
	if (!chip->ppu_disabled) {
		ret = mv88e6xxx_ppu_disable(chip);
385
		if (ret < 0) {
386
			mutex_unlock(&chip->ppu_mutex);
387 388
			return ret;
		}
389
		chip->ppu_disabled = 1;
390
	} else {
391
		del_timer(&chip->ppu_timer);
392
		ret = 0;
393 394 395 396 397
	}

	return ret;
}

398
static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
399
{
400
	/* Schedule a timer to re-enable the PHY polling unit. */
401 402
	mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
	mutex_unlock(&chip->ppu_mutex);
403 404
}

405
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
406
{
407 408 409 410 411
	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;
412 413
}

414
static int mv88e6xxx_mdio_read_ppu(struct mv88e6xxx_chip *chip, int addr,
415
				   int regnum)
416 417 418
{
	int ret;

419
	ret = mv88e6xxx_ppu_access_get(chip);
420
	if (ret >= 0) {
421 422
		ret = _mv88e6xxx_reg_read(chip, addr, regnum);
		mv88e6xxx_ppu_access_put(chip);
423 424 425 426 427
	}

	return ret;
}

428
static int mv88e6xxx_mdio_write_ppu(struct mv88e6xxx_chip *chip, int addr,
429
				    int regnum, u16 val)
430 431 432
{
	int ret;

433
	ret = mv88e6xxx_ppu_access_get(chip);
434
	if (ret >= 0) {
435 436
		ret = _mv88e6xxx_reg_write(chip, addr, regnum, val);
		mv88e6xxx_ppu_access_put(chip);
437 438 439 440 441
	}

	return ret;
}

442
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
443
{
444
	return chip->info->family == MV88E6XXX_FAMILY_6065;
445 446
}

447
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
448
{
449
	return chip->info->family == MV88E6XXX_FAMILY_6095;
450 451
}

452
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
453
{
454
	return chip->info->family == MV88E6XXX_FAMILY_6097;
455 456
}

457
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
458
{
459
	return chip->info->family == MV88E6XXX_FAMILY_6165;
460 461
}

462
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
463
{
464
	return chip->info->family == MV88E6XXX_FAMILY_6185;
465 466
}

467
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
468
{
469
	return chip->info->family == MV88E6XXX_FAMILY_6320;
470 471
}

472
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
473
{
474
	return chip->info->family == MV88E6XXX_FAMILY_6351;
475 476
}

477
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
478
{
479
	return chip->info->family == MV88E6XXX_FAMILY_6352;
480 481
}

482
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
483
{
484
	return chip->info->num_databases;
485 486
}

487
static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
488 489
{
	/* Does the device have dedicated FID registers for ATU and VTU ops? */
490 491
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
492 493 494 495 496
		return true;

	return false;
}

497 498 499 500
/* 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.
 */
501 502
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
503
{
504
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
505 506
	u32 reg;
	int ret;
507 508 509 510

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

511
	mutex_lock(&chip->reg_lock);
512

513
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
514 515 516 517 518 519 520 521 522 523 524
	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)
525
		reg |= PORT_PCS_CTRL_LINK_UP;
526

527
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
		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;

549 550
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
551 552 553 554 555 556 557 558
		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);
	}
559
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
560 561

out:
562
	mutex_unlock(&chip->reg_lock);
563 564
}

565
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
566 567 568 569 570
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
571
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
572
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
573 574 575 576 577 578
			return 0;
	}

	return -ETIMEDOUT;
}

579
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
580 581 582
{
	int ret;

583
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
584 585
		port = (port + 1) << 5;

586
	/* Snapshot the hardware statistics counters for this port. */
587
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
588 589 590 591
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
592

593
	/* Wait for the snapshotting to complete. */
594
	ret = _mv88e6xxx_stats_wait(chip);
595 596 597 598 599 600
	if (ret < 0)
		return ret;

	return 0;
}

601
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
602
				  int stat, u32 *val)
603 604 605 606 607 608
{
	u32 _val;
	int ret;

	*val = 0;

609
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
610 611
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
612 613 614
	if (ret < 0)
		return;

615
	ret = _mv88e6xxx_stats_wait(chip);
616 617 618
	if (ret < 0)
		return;

619
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
620 621 622 623 624
	if (ret < 0)
		return;

	_val = ret << 16;

625
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
626 627 628 629 630 631
	if (ret < 0)
		return;

	*val = _val | ret;
}

632
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
	{ "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, },
692 693
};

694
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
695
			       struct mv88e6xxx_hw_stat *stat)
696
{
697 698
	switch (stat->type) {
	case BANK0:
699
		return true;
700
	case BANK1:
701
		return mv88e6xxx_6320_family(chip);
702
	case PORT:
703 704 705 706 707 708
		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);
709
	}
710
	return false;
711 712
}

713
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
714
					    struct mv88e6xxx_hw_stat *s,
715 716 717 718 719 720 721
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

722 723
	switch (s->type) {
	case PORT:
724
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
725 726 727 728 729
		if (ret < 0)
			return UINT64_MAX;

		low = ret;
		if (s->sizeof_stat == 4) {
730
			ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
731
						  s->reg + 1);
732 733 734 735
			if (ret < 0)
				return UINT64_MAX;
			high = ret;
		}
736 737 738
		break;
	case BANK0:
	case BANK1:
739
		_mv88e6xxx_stats_read(chip, s->reg, &low);
740
		if (s->sizeof_stat == 8)
741
			_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
742 743 744 745 746
	}
	value = (((u64)high) << 16) | low;
	return value;
}

747 748
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
749
{
750
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
751 752
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
753

754 755
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
756
		if (mv88e6xxx_has_stat(chip, stat)) {
757 758 759 760
			memcpy(data + j * ETH_GSTRING_LEN, stat->string,
			       ETH_GSTRING_LEN);
			j++;
		}
761
	}
762 763
}

764
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
765
{
766
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
767 768 769 770 771
	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];
772
		if (mv88e6xxx_has_stat(chip, stat))
773 774 775
			j++;
	}
	return j;
776 777
}

778 779
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
780
{
781
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
782 783 784 785
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

786
	mutex_lock(&chip->reg_lock);
787

788
	ret = _mv88e6xxx_stats_snapshot(chip, port);
789
	if (ret < 0) {
790
		mutex_unlock(&chip->reg_lock);
791 792 793 794
		return;
	}
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
795 796
		if (mv88e6xxx_has_stat(chip, stat)) {
			data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
797 798 799 800
			j++;
		}
	}

801
	mutex_unlock(&chip->reg_lock);
802 803
}

804
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
805 806 807 808
{
	return 32 * sizeof(u16);
}

809 810
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
811
{
812
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
813 814 815 816 817 818 819
	u16 *p = _p;
	int i;

	regs->version = 0;

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

820
	mutex_lock(&chip->reg_lock);
821

822 823 824
	for (i = 0; i < 32; i++) {
		int ret;

825
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
826 827 828
		if (ret >= 0)
			p[i] = ret;
	}
829

830
	mutex_unlock(&chip->reg_lock);
831 832
}

833
static int _mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int reg, int offset,
834
			   u16 mask)
835 836 837 838 839 840
{
	unsigned long timeout = jiffies + HZ / 10;

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

841
		ret = _mv88e6xxx_reg_read(chip, reg, offset);
842 843
		if (ret < 0)
			return ret;
844 845 846 847 848 849 850 851
		if (!(ret & mask))
			return 0;

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

852
static int mv88e6xxx_mdio_wait(struct mv88e6xxx_chip *chip)
853
{
854
	return _mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
855
			       GLOBAL2_SMI_OP_BUSY);
856 857
}

858
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
859
{
860
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
861
			       GLOBAL_ATU_OP_BUSY);
862 863
}

864
static int mv88e6xxx_mdio_read_indirect(struct mv88e6xxx_chip *chip,
865
					int addr, int regnum)
866 867 868
{
	int ret;

869
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
870 871 872 873
				   GLOBAL2_SMI_OP_22_READ | (addr << 5) |
				   regnum);
	if (ret < 0)
		return ret;
874

875
	ret = mv88e6xxx_mdio_wait(chip);
876 877 878
	if (ret < 0)
		return ret;

879
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA);
880 881

	return ret;
882 883
}

884
static int mv88e6xxx_mdio_write_indirect(struct mv88e6xxx_chip *chip,
885
					 int addr, int regnum, u16 val)
886
{
887 888
	int ret;

889
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA, val);
890 891
	if (ret < 0)
		return ret;
892

893
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
894 895 896
				   GLOBAL2_SMI_OP_22_WRITE | (addr << 5) |
				   regnum);

897
	return mv88e6xxx_mdio_wait(chip);
898 899
}

900 901
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
902
{
903
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
904 905
	int reg;

906
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
907 908
		return -EOPNOTSUPP;

909
	mutex_lock(&chip->reg_lock);
910

911
	reg = mv88e6xxx_mdio_read_indirect(chip, port, 16);
912
	if (reg < 0)
913
		goto out;
914 915 916 917

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

918
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
919
	if (reg < 0)
920
		goto out;
921

922
	e->eee_active = !!(reg & PORT_STATUS_EEE);
923
	reg = 0;
924

925
out:
926
	mutex_unlock(&chip->reg_lock);
927
	return reg;
928 929
}

930 931
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
932
{
933
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
934
	int reg;
935 936
	int ret;

937
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
938 939
		return -EOPNOTSUPP;

940
	mutex_lock(&chip->reg_lock);
941

942
	ret = mv88e6xxx_mdio_read_indirect(chip, port, 16);
943 944 945 946 947 948 949 950 951
	if (ret < 0)
		goto out;

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

952
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 16, reg);
953
out:
954
	mutex_unlock(&chip->reg_lock);
955 956

	return ret;
957 958
}

959
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
960 961 962
{
	int ret;

963 964 965
	if (mv88e6xxx_has_fid_reg(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID,
					   fid);
966 967
		if (ret < 0)
			return ret;
968
	} else if (mv88e6xxx_num_databases(chip) == 256) {
969
		/* ATU DBNum[7:4] are located in ATU Control 15:12 */
970
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL);
971 972 973
		if (ret < 0)
			return ret;

974
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
975 976 977 978 979 980 981
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

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

984
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
985 986 987
	if (ret < 0)
		return ret;

988
	return _mv88e6xxx_atu_wait(chip);
989 990
}

991
static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
				     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;
	}

1011
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1012 1013
}

1014
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1015 1016
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1017
{
1018 1019
	int op;
	int err;
1020

1021
	err = _mv88e6xxx_atu_wait(chip);
1022 1023
	if (err)
		return err;
1024

1025
	err = _mv88e6xxx_atu_data_write(chip, entry);
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
	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;
	}

1037
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1038 1039
}

1040
static int _mv88e6xxx_atu_flush(struct mv88e6xxx_chip *chip,
1041
				u16 fid, bool static_too)
1042 1043 1044 1045 1046
{
	struct mv88e6xxx_atu_entry entry = {
		.fid = fid,
		.state = 0, /* EntryState bits must be 0 */
	};
1047

1048
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1049 1050
}

1051
static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
1052
			       int from_port, int to_port, bool static_too)
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
{
	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;

1066
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1067 1068
}

1069
static int _mv88e6xxx_atu_remove(struct mv88e6xxx_chip *chip, u16 fid,
1070
				 int port, bool static_too)
1071 1072
{
	/* Destination port 0xF means remove the entries */
1073
	return _mv88e6xxx_atu_move(chip, fid, port, 0x0f, static_too);
1074 1075
}

1076 1077 1078 1079 1080 1081 1082
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",
};

1083
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1084
				 u8 state)
1085
{
1086
	struct dsa_switch *ds = chip->ds;
1087
	int reg, ret = 0;
1088 1089
	u8 oldstate;

1090
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1091 1092
	if (reg < 0)
		return reg;
1093

1094
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1095

1096 1097 1098 1099 1100
	if (oldstate != state) {
		/* Flush forwarding database if we're moving a port
		 * from Learning or Forwarding state to Disabled or
		 * Blocking or Listening state.
		 */
1101
		if ((oldstate == PORT_CONTROL_STATE_LEARNING ||
1102 1103 1104
		     oldstate == PORT_CONTROL_STATE_FORWARDING) &&
		    (state == PORT_CONTROL_STATE_DISABLED ||
		     state == PORT_CONTROL_STATE_BLOCKING)) {
1105
			ret = _mv88e6xxx_atu_remove(chip, 0, port, false);
1106
			if (ret)
1107
				return ret;
1108
		}
1109

1110
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1111
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1112
					   reg);
1113 1114 1115
		if (ret)
			return ret;

1116
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1117 1118
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1119 1120 1121 1122 1123
	}

	return ret;
}

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

1151
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1152 1153
	if (reg < 0)
		return reg;
1154

1155 1156
	reg &= ~mask;
	reg |= output_ports & mask;
1157

1158
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1159 1160
}

1161 1162
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1163
{
1164
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1165
	int stp_state;
1166
	int err;
1167 1168 1169

	switch (state) {
	case BR_STATE_DISABLED:
1170
		stp_state = PORT_CONTROL_STATE_DISABLED;
1171 1172 1173
		break;
	case BR_STATE_BLOCKING:
	case BR_STATE_LISTENING:
1174
		stp_state = PORT_CONTROL_STATE_BLOCKING;
1175 1176
		break;
	case BR_STATE_LEARNING:
1177
		stp_state = PORT_CONTROL_STATE_LEARNING;
1178 1179 1180
		break;
	case BR_STATE_FORWARDING:
	default:
1181
		stp_state = PORT_CONTROL_STATE_FORWARDING;
1182 1183 1184
		break;
	}

1185 1186 1187
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1188 1189

	if (err)
1190 1191
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1192
			   mv88e6xxx_port_state_names[stp_state]);
1193 1194
}

1195
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1196
				u16 *new, u16 *old)
1197
{
1198
	struct dsa_switch *ds = chip->ds;
1199
	u16 pvid;
1200 1201
	int ret;

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

1206 1207 1208 1209 1210 1211
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1212
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1213 1214 1215 1216
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1217 1218
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1219 1220 1221 1222
	}

	if (old)
		*old = pvid;
1223 1224 1225 1226

	return 0;
}

1227
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1228
				    int port, u16 *pvid)
1229
{
1230
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1231 1232
}

1233
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1234
				    int port, u16 pvid)
1235
{
1236
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1237 1238
}

1239
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1240
{
1241
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
1242 1243 1244
			       GLOBAL_VTU_OP_BUSY);
}

1245
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1246 1247 1248
{
	int ret;

1249
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1250 1251 1252
	if (ret < 0)
		return ret;

1253
	return _mv88e6xxx_vtu_wait(chip);
1254 1255
}

1256
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1257 1258 1259
{
	int ret;

1260
	ret = _mv88e6xxx_vtu_wait(chip);
1261 1262 1263
	if (ret < 0)
		return ret;

1264
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1265 1266
}

1267
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1268 1269 1270 1271 1272 1273 1274 1275
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1276
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1277 1278 1279 1280 1281 1282 1283
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1284
	for (i = 0; i < chip->info->num_ports; ++i) {
1285 1286 1287 1288 1289 1290 1291 1292 1293
		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;
}

1294
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1295 1296
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1297
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1298 1299
}

1300
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1301 1302
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1303
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1304 1305
}

1306
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1307 1308 1309 1310 1311 1312 1313
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

1314
	for (i = 0; i < chip->info->num_ports; ++i) {
1315 1316 1317 1318 1319 1320 1321
		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) {
1322
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
1323 1324 1325 1326 1327 1328 1329 1330
					   GLOBAL_VTU_DATA_0_3 + i, regs[i]);
		if (ret < 0)
			return ret;
	}

	return 0;
}

1331
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1332 1333
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1334
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1335 1336
}

1337
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1338 1339
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1340
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1341 1342
}

1343
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1344
{
1345
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1346 1347 1348
				    vid & GLOBAL_VTU_VID_MASK);
}

1349
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1350 1351 1352 1353 1354
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1355
	ret = _mv88e6xxx_vtu_wait(chip);
1356 1357 1358
	if (ret < 0)
		return ret;

1359
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1360 1361 1362
	if (ret < 0)
		return ret;

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

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

	if (next.valid) {
1371
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1372 1373 1374
		if (ret < 0)
			return ret;

1375 1376
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1377 1378 1379 1380 1381
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

			next.fid = ret & GLOBAL_VTU_FID_MASK;
1382
		} else if (mv88e6xxx_num_databases(chip) == 256) {
1383 1384 1385
			/* VTU DBNum[7:4] are located in VTU Operation 11:8, and
			 * VTU DBNum[3:0] are located in VTU Operation 3:0
			 */
1386
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1387 1388 1389 1390 1391 1392
						  GLOBAL_VTU_OP);
			if (ret < 0)
				return ret;

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

1395 1396
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1409 1410 1411
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1412
{
1413
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1414 1415 1416 1417
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1418
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1419 1420
		return -EOPNOTSUPP;

1421
	mutex_lock(&chip->reg_lock);
1422

1423
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1424 1425 1426
	if (err)
		goto unlock;

1427
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1428 1429 1430 1431
	if (err)
		goto unlock;

	do {
1432
		err = _mv88e6xxx_vtu_getnext(chip, &next);
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
		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 */
1443 1444
		vlan->vid_begin = next.vid;
		vlan->vid_end = next.vid;
1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
		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:
1459
	mutex_unlock(&chip->reg_lock);
1460 1461 1462 1463

	return err;
}

1464
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1465 1466
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1467
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1468 1469 1470
	u16 reg = 0;
	int ret;

1471
	ret = _mv88e6xxx_vtu_wait(chip);
1472 1473 1474 1475 1476 1477 1478
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1479
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1480 1481 1482
	if (ret < 0)
		return ret;

1483
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1484
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1485 1486
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1487 1488
		if (ret < 0)
			return ret;
1489
	}
1490

1491
	if (mv88e6xxx_has_fid_reg(chip)) {
1492
		reg = entry->fid & GLOBAL_VTU_FID_MASK;
1493 1494
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
					   reg);
1495 1496
		if (ret < 0)
			return ret;
1497
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1498 1499 1500 1501 1502
		/* 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;
1503 1504 1505 1506 1507
	}

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1508
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1509 1510 1511
	if (ret < 0)
		return ret;

1512
	return _mv88e6xxx_vtu_cmd(chip, op);
1513 1514
}

1515
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1516 1517 1518 1519 1520
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1521
	ret = _mv88e6xxx_vtu_wait(chip);
1522 1523 1524
	if (ret < 0)
		return ret;

1525
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1526 1527 1528 1529
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1530
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1531 1532 1533
	if (ret < 0)
		return ret;

1534
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1535 1536 1537 1538 1539
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1540
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1541 1542 1543 1544 1545 1546
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1547
		ret = mv88e6xxx_stu_data_read(chip, &next);
1548 1549 1550 1551 1552 1553 1554 1555
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1556
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1557 1558 1559 1560 1561
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1562
	ret = _mv88e6xxx_vtu_wait(chip);
1563 1564 1565 1566 1567 1568 1569
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1570
	ret = mv88e6xxx_stu_data_write(chip, entry);
1571 1572 1573 1574 1575
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1576
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1577 1578 1579 1580
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1581
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1582 1583 1584
	if (ret < 0)
		return ret;

1585
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1586 1587
}

1588
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1589
			       u16 *new, u16 *old)
1590
{
1591
	struct dsa_switch *ds = chip->ds;
1592
	u16 upper_mask;
1593 1594 1595
	u16 fid;
	int ret;

1596
	if (mv88e6xxx_num_databases(chip) == 4096)
1597
		upper_mask = 0xff;
1598
	else if (mv88e6xxx_num_databases(chip) == 256)
1599
		upper_mask = 0xf;
1600 1601 1602
	else
		return -EOPNOTSUPP;

1603
	/* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
1604
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1605 1606 1607 1608 1609 1610 1611 1612 1613
	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;

1614
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1615 1616 1617 1618 1619 1620
					   ret);
		if (ret < 0)
			return ret;
	}

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

1625
	fid |= (ret & upper_mask) << 4;
1626 1627

	if (new) {
1628 1629
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1630

1631
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1632 1633 1634 1635
					   ret);
		if (ret < 0)
			return ret;

1636 1637
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1638 1639 1640 1641 1642 1643 1644 1645
	}

	if (old)
		*old = fid;

	return 0;
}

1646
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1647
				   int port, u16 *fid)
1648
{
1649
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1650 1651
}

1652
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1653
				   int port, u16 fid)
1654
{
1655
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1656 1657
}

1658
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1659 1660 1661
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1662
	int i, err;
1663 1664 1665

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

1666
	/* Set every FID bit used by the (un)bridged ports */
1667 1668
	for (i = 0; i < chip->info->num_ports; ++i) {
		err = _mv88e6xxx_port_fid_get(chip, i, fid);
1669 1670 1671 1672 1673 1674
		if (err)
			return err;

		set_bit(*fid, fid_bitmap);
	}

1675
	/* Set every FID bit used by the VLAN entries */
1676
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1677 1678 1679 1680
	if (err)
		return err;

	do {
1681
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694
		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);
1695
	if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
1696 1697 1698
		return -ENOSPC;

	/* Clear the database */
1699
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1700 1701
}

1702
static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
1703
			      struct mv88e6xxx_vtu_stu_entry *entry)
1704
{
1705
	struct dsa_switch *ds = chip->ds;
1706 1707 1708 1709
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.valid = true,
		.vid = vid,
	};
1710 1711
	int i, err;

1712
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1713 1714
	if (err)
		return err;
1715

1716
	/* exclude all ports except the CPU and DSA ports */
1717
	for (i = 0; i < chip->info->num_ports; ++i)
1718 1719 1720
		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;
1721

1722 1723
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
1724 1725 1726 1727 1728 1729 1730
		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;
1731
		err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
1732 1733 1734 1735 1736 1737 1738 1739
		if (err)
			return err;

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

1740
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1741 1742 1743 1744 1745 1746 1747 1748 1749
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

1750
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
1751 1752 1753 1754 1755 1756 1757
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

1758
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1759 1760 1761
	if (err)
		return err;

1762
	err = _mv88e6xxx_vtu_getnext(chip, entry);
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
	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.
		 */

1773
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1774 1775 1776 1777 1778
	}

	return err;
}

1779 1780 1781
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
1782
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1783 1784 1785 1786 1787 1788
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

1789
	mutex_lock(&chip->reg_lock);
1790

1791
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1792 1793 1794 1795
	if (err)
		goto unlock;

	do {
1796
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1797 1798 1799 1800 1801 1802 1803 1804 1805
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

1806
		for (i = 0; i < chip->info->num_ports; ++i) {
1807 1808 1809 1810 1811 1812 1813
			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;

1814 1815
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
1816 1817
				break; /* same bridge, check next VLAN */

1818
			netdev_warn(ds->ports[port].netdev,
1819 1820
				    "hardware VLAN %d already used by %s\n",
				    vlan.vid,
1821
				    netdev_name(chip->ports[i].bridge_dev));
1822 1823 1824 1825 1826 1827
			err = -EOPNOTSUPP;
			goto unlock;
		}
	} while (vlan.vid < vid_end);

unlock:
1828
	mutex_unlock(&chip->reg_lock);
1829 1830 1831 1832

	return err;
}

1833 1834 1835 1836 1837 1838 1839
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",
};

1840 1841
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
1842
{
1843
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1844 1845 1846 1847
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

1848
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1849 1850
		return -EOPNOTSUPP;

1851
	mutex_lock(&chip->reg_lock);
1852

1853
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1854 1855 1856 1857 1858
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1859 1860 1861
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1862

1863
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1864 1865 1866 1867
					   ret);
		if (ret < 0)
			goto unlock;

1868
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
1869 1870 1871
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
1872

1873
	ret = 0;
1874
unlock:
1875
	mutex_unlock(&chip->reg_lock);
1876 1877 1878 1879

	return ret;
}

1880 1881 1882 1883
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
1884
{
1885
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1886 1887
	int err;

1888
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1889 1890
		return -EOPNOTSUPP;

1891 1892 1893 1894 1895 1896 1897 1898
	/* 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;

1899 1900 1901 1902 1903 1904
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

1905
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1906
				    u16 vid, bool untagged)
1907 1908 1909 1910
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1911
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1912
	if (err)
1913
		return err;
1914 1915 1916 1917 1918

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

1919
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1920 1921
}

1922 1923 1924
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
1925
{
1926
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1927 1928 1929 1930
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

1931
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1932 1933
		return;

1934
	mutex_lock(&chip->reg_lock);
1935

1936
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
1937
		if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
1938 1939
			netdev_err(ds->ports[port].netdev,
				   "failed to add VLAN %d%c\n",
1940
				   vid, untagged ? 'u' : 't');
1941

1942
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
1943
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
1944
			   vlan->vid_end);
1945

1946
	mutex_unlock(&chip->reg_lock);
1947 1948
}

1949
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
1950
				    int port, u16 vid)
1951
{
1952
	struct dsa_switch *ds = chip->ds;
1953 1954 1955
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

1956
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1957
	if (err)
1958
		return err;
1959

1960 1961
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
1962
		return -EOPNOTSUPP;
1963 1964 1965 1966

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

	/* keep the VLAN unless all ports are excluded */
1967
	vlan.valid = false;
1968
	for (i = 0; i < chip->info->num_ports; ++i) {
1969
		if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
1970 1971 1972
			continue;

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1973
			vlan.valid = true;
1974 1975 1976 1977
			break;
		}
	}

1978
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1979 1980 1981
	if (err)
		return err;

1982
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
1983 1984
}

1985 1986
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
1987
{
1988
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1989 1990 1991
	u16 pvid, vid;
	int err = 0;

1992
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1993 1994
		return -EOPNOTSUPP;

1995
	mutex_lock(&chip->reg_lock);
1996

1997
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1998 1999 2000
	if (err)
		goto unlock;

2001
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
2002
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
2003 2004 2005 2006
		if (err)
			goto unlock;

		if (vid == pvid) {
2007
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2008 2009 2010 2011 2012
			if (err)
				goto unlock;
		}
	}

2013
unlock:
2014
	mutex_unlock(&chip->reg_lock);
2015 2016 2017 2018

	return err;
}

2019
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2020
				    const unsigned char *addr)
2021 2022 2023 2024
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2025
		ret = _mv88e6xxx_reg_write(
2026
			chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i,
2027
			(addr[i * 2] << 8) | addr[i * 2 + 1]);
2028 2029 2030 2031 2032 2033 2034
		if (ret < 0)
			return ret;
	}

	return 0;
}

2035
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2036
				   unsigned char *addr)
2037 2038 2039 2040
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2041
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
2042
					  GLOBAL_ATU_MAC_01 + i);
2043 2044 2045 2046 2047 2048 2049 2050 2051
		if (ret < 0)
			return ret;
		addr[i * 2] = ret >> 8;
		addr[i * 2 + 1] = ret & 0xff;
	}

	return 0;
}

2052
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2053
			       struct mv88e6xxx_atu_entry *entry)
2054
{
2055 2056
	int ret;

2057
	ret = _mv88e6xxx_atu_wait(chip);
2058 2059 2060
	if (ret < 0)
		return ret;

2061
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2062 2063 2064
	if (ret < 0)
		return ret;

2065
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2066
	if (ret < 0)
2067 2068
		return ret;

2069
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2070
}
2071

2072
static int _mv88e6xxx_port_fdb_load(struct mv88e6xxx_chip *chip, int port,
2073 2074 2075 2076
				    const unsigned char *addr, u16 vid,
				    u8 state)
{
	struct mv88e6xxx_atu_entry entry = { 0 };
2077 2078 2079
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

2080 2081
	/* Null VLAN ID corresponds to the port private database */
	if (vid == 0)
2082
		err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
2083
	else
2084
		err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2085 2086
	if (err)
		return err;
2087

2088
	entry.fid = vlan.fid;
2089 2090 2091 2092 2093 2094 2095
	entry.state = state;
	ether_addr_copy(entry.mac, addr);
	if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.trunk = false;
		entry.portv_trunkid = BIT(port);
	}

2096
	return _mv88e6xxx_atu_load(chip, &entry);
2097 2098
}

2099 2100 2101
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 已提交
2102 2103 2104 2105 2106 2107 2108
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2109 2110 2111
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2112
{
2113
	int state = is_multicast_ether_addr(fdb->addr) ?
2114 2115
		GLOBAL_ATU_DATA_STATE_MC_STATIC :
		GLOBAL_ATU_DATA_STATE_UC_STATIC;
2116
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2117

2118 2119
	mutex_lock(&chip->reg_lock);
	if (_mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid, state))
2120 2121
		netdev_err(ds->ports[port].netdev,
			   "failed to load MAC address\n");
2122
	mutex_unlock(&chip->reg_lock);
2123 2124
}

2125 2126
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2127
{
2128
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2129 2130
	int ret;

2131 2132
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid,
2133
				       GLOBAL_ATU_DATA_STATE_UNUSED);
2134
	mutex_unlock(&chip->reg_lock);
2135 2136 2137 2138

	return ret;
}

2139
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2140
				  struct mv88e6xxx_atu_entry *entry)
2141
{
2142 2143 2144 2145
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2146

2147
	ret = _mv88e6xxx_atu_wait(chip);
2148 2149
	if (ret < 0)
		return ret;
2150

2151
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2152 2153
	if (ret < 0)
		return ret;
2154

2155
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2156 2157
	if (ret < 0)
		return ret;
2158

2159
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2160 2161
	if (ret < 0)
		return ret;
2162

2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178
	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;
	}
2179

2180
	*entry = next;
2181 2182 2183
	return 0;
}

2184
static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2185
					u16 fid, u16 vid, int port,
2186 2187 2188 2189 2190 2191 2192 2193
					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;

2194
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2195 2196 2197 2198
	if (err)
		return err;

	do {
2199
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224
		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;
}

2225 2226 2227
static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
2228
{
2229
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2230 2231 2232
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2233
	u16 fid;
2234 2235
	int err;

2236
	mutex_lock(&chip->reg_lock);
2237

2238
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2239
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2240 2241 2242
	if (err)
		goto unlock;

2243
	err = _mv88e6xxx_port_fdb_dump_one(chip, fid, 0, port, fdb, cb);
2244 2245 2246
	if (err)
		goto unlock;

2247
	/* Dump VLANs' Filtering Information Databases */
2248
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2249 2250 2251 2252
	if (err)
		goto unlock;

	do {
2253
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2254
		if (err)
2255
			break;
2256 2257 2258 2259

		if (!vlan.valid)
			break;

2260 2261
		err = _mv88e6xxx_port_fdb_dump_one(chip, vlan.fid, vlan.vid,
						   port, fdb, cb);
2262
		if (err)
2263
			break;
2264 2265 2266
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

unlock:
2267
	mutex_unlock(&chip->reg_lock);
2268 2269 2270 2271

	return err;
}

2272 2273
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2274
{
2275
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2276
	int i, err = 0;
2277

2278
	mutex_lock(&chip->reg_lock);
2279

2280
	/* Assign the bridge and remap each port's VLANTable */
2281
	chip->ports[port].bridge_dev = bridge;
2282

2283 2284 2285
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2286 2287 2288 2289 2290
			if (err)
				break;
		}
	}

2291
	mutex_unlock(&chip->reg_lock);
2292

2293
	return err;
2294 2295
}

2296
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2297
{
2298 2299
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	struct net_device *bridge = chip->ports[port].bridge_dev;
2300
	int i;
2301

2302
	mutex_lock(&chip->reg_lock);
2303

2304
	/* Unassign the bridge and remap each port's VLANTable */
2305
	chip->ports[port].bridge_dev = NULL;
2306

2307 2308 2309
	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))
2310 2311
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2312

2313
	mutex_unlock(&chip->reg_lock);
2314 2315
}

2316
static int _mv88e6xxx_mdio_page_write(struct mv88e6xxx_chip *chip,
2317
				      int port, int page, int reg, int val)
2318 2319 2320
{
	int ret;

2321
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2322 2323 2324
	if (ret < 0)
		goto restore_page_0;

2325
	ret = mv88e6xxx_mdio_write_indirect(chip, port, reg, val);
2326
restore_page_0:
2327
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2328 2329 2330 2331

	return ret;
}

2332
static int _mv88e6xxx_mdio_page_read(struct mv88e6xxx_chip *chip,
2333
				     int port, int page, int reg)
2334 2335 2336
{
	int ret;

2337
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2338 2339 2340
	if (ret < 0)
		goto restore_page_0;

2341
	ret = mv88e6xxx_mdio_read_indirect(chip, port, reg);
2342
restore_page_0:
2343
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2344 2345 2346 2347

	return ret;
}

2348
static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2349
{
2350
	bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
2351
	u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2352
	struct gpio_desc *gpiod = chip->reset;
2353 2354 2355 2356 2357
	unsigned long timeout;
	int ret;
	int i;

	/* Set all ports to the disabled state. */
2358 2359
	for (i = 0; i < chip->info->num_ports; i++) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
2360 2361 2362
		if (ret < 0)
			return ret;

2363
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384
					   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)
2385
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
2386
	else
2387
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
2388 2389 2390 2391 2392 2393
	if (ret)
		return ret;

	/* Wait up to one second for reset to complete. */
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
2394
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409
		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;
}

2410
static int mv88e6xxx_power_on_serdes(struct mv88e6xxx_chip *chip)
2411 2412 2413
{
	int ret;

2414
	ret = _mv88e6xxx_mdio_page_read(chip, REG_FIBER_SERDES,
2415
					PAGE_FIBER_SERDES, MII_BMCR);
2416 2417 2418 2419 2420
	if (ret < 0)
		return ret;

	if (ret & BMCR_PDOWN) {
		ret &= ~BMCR_PDOWN;
2421
		ret = _mv88e6xxx_mdio_page_write(chip, REG_FIBER_SERDES,
2422 2423
						 PAGE_FIBER_SERDES, MII_BMCR,
						 ret);
2424 2425 2426 2427 2428
	}

	return ret;
}

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

2435 2436 2437 2438
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip) ||
	    mv88e6xxx_6065_family(chip) || mv88e6xxx_6320_family(chip)) {
2439 2440 2441 2442 2443 2444
		/* MAC Forcing register: don't force link, speed,
		 * duplex or flow control state to any particular
		 * values on physical ports, but force the CPU port
		 * and all DSA ports to their maximum bandwidth and
		 * full duplex.
		 */
2445
		reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
2446
		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
2447
			reg &= ~PORT_PCS_CTRL_UNFORCED;
2448 2449 2450 2451
			reg |= PORT_PCS_CTRL_FORCE_LINK |
				PORT_PCS_CTRL_LINK_UP |
				PORT_PCS_CTRL_DUPLEX_FULL |
				PORT_PCS_CTRL_FORCE_DUPLEX;
2452
			if (mv88e6xxx_6065_family(chip))
2453 2454 2455 2456 2457 2458 2459
				reg |= PORT_PCS_CTRL_100;
			else
				reg |= PORT_PCS_CTRL_1000;
		} else {
			reg |= PORT_PCS_CTRL_UNFORCED;
		}

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

	/* Port Control: disable Drop-on-Unlock, disable Drop-on-Lock,
	 * disable Header mode, enable IGMP/MLD snooping, disable VLAN
	 * tunneling, determine priority by looking at 802.1p and IP
	 * priority fields (IP prio has precedence), and set STP state
	 * to Forwarding.
	 *
	 * If this is the CPU link, use DSA or EDSA tagging depending
	 * on which tagging mode was configured.
	 *
	 * If this is a link to another switch, use DSA tagging mode.
	 *
	 * If this is the upstream port for this switch, enable
	 * forwarding of unknown unicasts and multicasts.
	 */
	reg = 0;
2481 2482 2483 2484
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6095_family(chip) || mv88e6xxx_6065_family(chip) ||
	    mv88e6xxx_6185_family(chip) || mv88e6xxx_6320_family(chip))
2485 2486 2487 2488
		reg = PORT_CONTROL_IGMP_MLD_SNOOP |
		PORT_CONTROL_USE_TAG | PORT_CONTROL_USE_IP |
		PORT_CONTROL_STATE_FORWARDING;
	if (dsa_is_cpu_port(ds, port)) {
2489
		if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip))
2490
			reg |= PORT_CONTROL_DSA_TAG;
2491 2492 2493 2494 2495
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2496 2497
			reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
				PORT_CONTROL_FORWARD_UNKNOWN |
2498
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
2499 2500
		}

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

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

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

2552
	/* Port Control 2: don't force a good FCS, set the maximum frame size to
2553
	 * 10240 bytes, disable 802.1q tags checking, don't discard tagged or
2554 2555 2556
	 * untagged frames on this port, do a destination address lookup on all
	 * received packets as usual, disable ARP mirroring and don't send a
	 * copy of all transmitted/received frames on this port to the CPU.
2557 2558
	 */
	reg = 0;
2559 2560 2561 2562
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6095_family(chip) || mv88e6xxx_6320_family(chip) ||
	    mv88e6xxx_6185_family(chip))
2563 2564
		reg = PORT_CONTROL_2_MAP_DA;

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

2569
	if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
2570 2571 2572 2573 2574 2575 2576 2577 2578
		/* Set the upstream port this port should use */
		reg |= dsa_upstream_port(ds);
		/* enable forwarding of unknown multicast addresses to
		 * the upstream port
		 */
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_2_FORWARD_UNKNOWN;
	}

2579
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2580

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

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

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

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

2609 2610 2611
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
2612 2613 2614 2615
		/* Do not limit the period of time that this port can
		 * be paused for by the remote end or the period of
		 * time that this port can pause the remote end.
		 */
2616
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2617 2618
					   PORT_PAUSE_CTRL, 0x0000);
		if (ret)
2619
			return ret;
2620 2621 2622 2623 2624

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

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

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

2659 2660 2661 2662
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
2663
		/* Rate Control: disable ingress rate limiting. */
2664
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2665 2666
					   PORT_RATE_CONTROL, 0x0001);
		if (ret)
2667
			return ret;
2668 2669
	}

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

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

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

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

	return 0;
}

2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718
static int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
{
	int err;

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

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

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

2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745
static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
				     unsigned int msecs)
{
	const unsigned int coeff = chip->info->age_time_coeff;
	const unsigned int min = 0x01 * coeff;
	const unsigned int max = 0xff * coeff;
	u8 age_time;
	u16 val;
	int err;

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

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

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

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

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

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

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

	return err;
}

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

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

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

2778 2779 2780 2781 2782 2783
	/* Configure the upstream port, and configure it as the port to which
	 * ingress and egress and ARP monitor frames are to be sent.
	 */
	reg = upstream_port << GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT |
		upstream_port << GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT |
		upstream_port << GLOBAL_MONITOR_CONTROL_ARP_SHIFT;
2784 2785
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
				   reg);
2786 2787 2788
	if (err)
		return err;

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

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

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

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

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

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

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

2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
	/* Clear the statistics counters for all ports */
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
				   GLOBAL_STATS_OP_FLUSH_ALL);
	if (err)
		return err;

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

	return 0;
}

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

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

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

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

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

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

	return err;
}

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

	if (hask)
		val |= GLOBAL2_TRUNK_MASK_HASK;

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

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

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

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

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

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

	return 0;
}

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

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

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

	return err;
}

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

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

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

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

	return err;
}

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

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

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

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

	return err;
}

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

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

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

	return mv88e6xxx_g2_eeprom_wait(chip);
}

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

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

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

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

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

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

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

	return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
}

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

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

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

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

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

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

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

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

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

3129
	return 0;
3130 3131
}

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

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

3141
	mutex_lock(&chip->reg_lock);
3142

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

3147 3148 3149 3150 3151 3152 3153 3154 3155
	/* Setup Switch Port Registers */
	for (i = 0; i < chip->info->num_ports; i++) {
		err = mv88e6xxx_setup_port(chip, i);
		if (err)
			goto unlock;
	}

	/* Setup Switch Global 1 Registers */
	err = mv88e6xxx_g1_setup(chip);
3156 3157 3158
	if (err)
		goto unlock;

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

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

3169
	return err;
3170 3171
}

3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

	mutex_lock(&chip->reg_lock);

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

	mutex_unlock(&chip->reg_lock);

	return err;
}

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

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

3200 3201 3202
	return ret;
}

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

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

3213 3214 3215
	return ret;
}

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

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

	if (addr < 0)
3230
		return 0xffff;
3231

3232
	mutex_lock(&chip->reg_lock);
3233

3234 3235 3236 3237
	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);
3238
	else
3239
		ret = mv88e6xxx_mdio_read_direct(chip, addr, regnum);
3240

3241
	mutex_unlock(&chip->reg_lock);
3242 3243 3244
	return ret;
}

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

	if (addr < 0)
3253
		return 0xffff;
3254

3255
	mutex_lock(&chip->reg_lock);
3256

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

3264
	mutex_unlock(&chip->reg_lock);
3265 3266 3267
	return ret;
}

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

3275 3276
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
		mv88e6xxx_ppu_state_init(chip);
3277 3278

	if (np)
3279
		chip->mdio_np = of_get_child_by_name(np, "mdio");
3280

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

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

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

	return 0;

out:
3311 3312
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3313 3314 3315 3316

	return err;
}

3317
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3318 3319

{
3320
	struct mii_bus *bus = chip->mdio_bus;
3321 3322 3323

	mdiobus_unregister(bus);

3324 3325
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3326 3327
}

3328 3329 3330 3331
#ifdef CONFIG_NET_DSA_HWMON

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

	*temp = 0;

3338
	mutex_lock(&chip->reg_lock);
3339

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

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

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

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

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

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

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

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

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

	*temp = 0;

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

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

	return 0;
}

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

3396
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3397 3398
		return -EOPNOTSUPP;

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

	return mv88e61xx_get_temp(ds, temp);
}

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

3411
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3412 3413 3414 3415
		return -EOPNOTSUPP;

	*temp = 0;

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

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

	return 0;
}

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

3431
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3432 3433
		return -EOPNOTSUPP;

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

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

3448
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3449 3450 3451 3452
		return -EOPNOTSUPP;

	*alarm = false;

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

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

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

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

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

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

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

	return NULL;
}

3830
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3831 3832 3833 3834
{
	const struct mv88e6xxx_info *info;
	int id, prod_num, rev;

3835 3836
	id = mv88e6xxx_reg_read(chip, chip->info->port_base_addr,
				PORT_SWITCH_ID);
3837 3838 3839 3840 3841 3842 3843 3844 3845 3846
	if (id < 0)
		return id;

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

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

3847
	/* Update the compatible info with the probed one */
3848
	chip->info = info;
3849

3850 3851
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3852 3853 3854 3855

	return 0;
}

3856
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3857
{
3858
	struct mv88e6xxx_chip *chip;
3859

3860 3861
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3862 3863
		return NULL;

3864
	chip->dev = dev;
3865

3866
	mutex_init(&chip->reg_lock);
3867

3868
	return chip;
3869 3870
}

3871
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3872 3873 3874 3875 3876 3877
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3878
	if (sw_addr == 0)
3879 3880 3881
		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;
3882 3883 3884
	else
		return -EINVAL;

3885 3886
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3887 3888 3889 3890

	return 0;
}

3891 3892 3893
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3894
{
3895
	struct mv88e6xxx_chip *chip;
3896
	struct mii_bus *bus;
3897
	int err;
3898

3899
	bus = dsa_host_dev_to_mii_bus(host_dev);
3900 3901 3902
	if (!bus)
		return NULL;

3903 3904
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3905 3906
		return NULL;

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

3910
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3911 3912 3913
	if (err)
		goto free;

3914
	err = mv88e6xxx_detect(chip);
3915
	if (err)
3916
		goto free;
3917

3918
	err = mv88e6xxx_mdio_register(chip, NULL);
3919
	if (err)
3920
		goto free;
3921

3922
	*priv = chip;
3923

3924
	return chip->info->name;
3925
free:
3926
	devm_kfree(dsa_dev, chip);
3927 3928

	return NULL;
3929 3930
}

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

3968
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
3969 3970
				     struct device_node *np)
{
3971
	struct device *dev = chip->dev;
3972 3973 3974 3975 3976 3977 3978
	struct dsa_switch *ds;

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

	ds->dev = dev;
3979
	ds->priv = chip;
3980 3981 3982 3983 3984 3985 3986
	ds->drv = &mv88e6xxx_switch_driver;

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

3987
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
3988
{
3989
	dsa_unregister_switch(chip->ds);
3990 3991
}

3992
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
3993
{
3994
	struct device *dev = &mdiodev->dev;
3995
	struct device_node *np = dev->of_node;
3996
	const struct mv88e6xxx_info *compat_info;
3997
	struct mv88e6xxx_chip *chip;
3998
	u32 eeprom_len;
3999
	int err;
4000

4001 4002 4003 4004
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

4005 4006
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
4007 4008
		return -ENOMEM;

4009
	chip->info = compat_info;
4010

4011
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
4012 4013
	if (err)
		return err;
4014

4015
	err = mv88e6xxx_detect(chip);
4016 4017
	if (err)
		return err;
4018

4019 4020 4021
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
4022

4023
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
4024
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
4025
		chip->eeprom_len = eeprom_len;
4026

4027
	err = mv88e6xxx_mdio_register(chip, np);
4028 4029 4030
	if (err)
		return err;

4031
	err = mv88e6xxx_register_switch(chip, np);
4032
	if (err) {
4033
		mv88e6xxx_mdio_unregister(chip);
4034 4035 4036
		return err;
	}

4037 4038
	return 0;
}
4039 4040 4041 4042

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

4045 4046
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
4047 4048 4049
}

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

static void __exit mv88e6xxx_cleanup(void)
{
4077
	mdio_driver_unregister(&mv88e6xxx_driver);
4078
	unregister_switch_driver(&mv88e6xxx_switch_driver);
4079 4080
}
module_exit(mv88e6xxx_cleanup);
4081 4082 4083 4084

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