chip.c 94.1 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_reg_write(struct mv88e6xxx_chip *chip, int addr,
275
			       int reg, u16 val)
276 277 278
{
	int ret;

279 280 281
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_reg_write(chip, addr, reg, val);
	mutex_unlock(&chip->reg_lock);
282 283 284 285

	return ret;
}

286
static int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr)
287
{
288
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
289
	int err;
290

291
	err = mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MAC_01,
292 293 294 295
				  (addr[0] << 8) | addr[1]);
	if (err)
		return err;

296
	err = mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MAC_23,
297 298 299 300
				  (addr[2] << 8) | addr[3]);
	if (err)
		return err;

301
	return mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MAC_45,
302
				   (addr[4] << 8) | addr[5]);
303 304
}

305
static int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr)
306
{
307
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
308
	int ret;
309
	int i;
310 311 312 313

	for (i = 0; i < 6; i++) {
		int j;

314
		/* Write the MAC address byte. */
315
		ret = mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MAC,
316 317 318 319
					  GLOBAL2_SWITCH_MAC_BUSY |
					  (i << 8) | addr[i]);
		if (ret)
			return ret;
320

321
		/* Wait for the write to complete. */
322
		for (j = 0; j < 16; j++) {
323
			ret = mv88e6xxx_reg_read(chip, REG_GLOBAL2,
324 325 326 327
						 GLOBAL2_SWITCH_MAC);
			if (ret < 0)
				return ret;

328
			if ((ret & GLOBAL2_SWITCH_MAC_BUSY) == 0)
329 330 331 332 333 334 335 336 337
				break;
		}
		if (j == 16)
			return -ETIMEDOUT;
	}

	return 0;
}

338
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
339
{
340
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
341

342
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_SWITCH_MAC))
343 344 345 346 347
		return mv88e6xxx_set_addr_indirect(ds, addr);
	else
		return mv88e6xxx_set_addr_direct(ds, addr);
}

348
static int mv88e6xxx_mdio_read_direct(struct mv88e6xxx_chip *chip,
349
				      int addr, int regnum)
350 351
{
	if (addr >= 0)
352
		return _mv88e6xxx_reg_read(chip, addr, regnum);
353 354 355
	return 0xffff;
}

356
static int mv88e6xxx_mdio_write_direct(struct mv88e6xxx_chip *chip,
357
				       int addr, int regnum, u16 val)
358 359
{
	if (addr >= 0)
360
		return _mv88e6xxx_reg_write(chip, addr, regnum, val);
361 362 363
	return 0;
}

364
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
365 366
{
	int ret;
367
	unsigned long timeout;
368

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

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

378 379
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
380
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
381 382 383
		if (ret < 0)
			return ret;

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

	return -ETIMEDOUT;
}

393
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
394
{
395
	int ret, err;
396
	unsigned long timeout;
397

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

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

407 408
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
409
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
410 411 412
		if (ret < 0)
			return ret;

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

	return -ETIMEDOUT;
}

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

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

428
	mutex_lock(&chip->reg_lock);
429

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

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

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

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

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

450
	mutex_lock(&chip->ppu_mutex);
451

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

	return ret;
}

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

479
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
480
{
481 482 483 484 485
	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;
486 487
}

488
static int mv88e6xxx_mdio_read_ppu(struct mv88e6xxx_chip *chip, int addr,
489
				   int regnum)
490 491 492
{
	int ret;

493
	ret = mv88e6xxx_ppu_access_get(chip);
494
	if (ret >= 0) {
495 496
		ret = _mv88e6xxx_reg_read(chip, addr, regnum);
		mv88e6xxx_ppu_access_put(chip);
497 498 499 500 501
	}

	return ret;
}

502
static int mv88e6xxx_mdio_write_ppu(struct mv88e6xxx_chip *chip, int addr,
503
				    int regnum, u16 val)
504 505 506
{
	int ret;

507
	ret = mv88e6xxx_ppu_access_get(chip);
508
	if (ret >= 0) {
509 510
		ret = _mv88e6xxx_reg_write(chip, addr, regnum, val);
		mv88e6xxx_ppu_access_put(chip);
511 512 513 514 515
	}

	return ret;
}

516
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
517
{
518
	return chip->info->family == MV88E6XXX_FAMILY_6065;
519 520
}

521
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
522
{
523
	return chip->info->family == MV88E6XXX_FAMILY_6095;
524 525
}

526
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
527
{
528
	return chip->info->family == MV88E6XXX_FAMILY_6097;
529 530
}

531
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
532
{
533
	return chip->info->family == MV88E6XXX_FAMILY_6165;
534 535
}

536
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
537
{
538
	return chip->info->family == MV88E6XXX_FAMILY_6185;
539 540
}

541
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
542
{
543
	return chip->info->family == MV88E6XXX_FAMILY_6320;
544 545
}

546
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
547
{
548
	return chip->info->family == MV88E6XXX_FAMILY_6351;
549 550
}

551
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
552
{
553
	return chip->info->family == MV88E6XXX_FAMILY_6352;
554 555
}

556
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
557
{
558
	return chip->info->num_databases;
559 560
}

561
static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
562 563
{
	/* Does the device have dedicated FID registers for ATU and VTU ops? */
564 565
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
566 567 568 569 570
		return true;

	return false;
}

571 572 573 574
/* 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.
 */
575 576
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
577
{
578
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
579 580
	u32 reg;
	int ret;
581 582 583 584

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

585
	mutex_lock(&chip->reg_lock);
586

587
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
588 589 590 591 592 593 594 595 596 597 598
	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)
599
		reg |= PORT_PCS_CTRL_LINK_UP;
600

601
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
		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;

623 624
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
625 626 627 628 629 630 631 632
		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);
	}
633
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
634 635

out:
636
	mutex_unlock(&chip->reg_lock);
637 638
}

639
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
640 641 642 643 644
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
645
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
646
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
647 648 649 650 651 652
			return 0;
	}

	return -ETIMEDOUT;
}

653
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
654 655 656
{
	int ret;

657
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
658 659
		port = (port + 1) << 5;

660
	/* Snapshot the hardware statistics counters for this port. */
661
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
662 663 664 665
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
666

667
	/* Wait for the snapshotting to complete. */
668
	ret = _mv88e6xxx_stats_wait(chip);
669 670 671 672 673 674
	if (ret < 0)
		return ret;

	return 0;
}

675
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
676
				  int stat, u32 *val)
677 678 679 680 681 682
{
	u32 _val;
	int ret;

	*val = 0;

683
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
684 685
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
686 687 688
	if (ret < 0)
		return;

689
	ret = _mv88e6xxx_stats_wait(chip);
690 691 692
	if (ret < 0)
		return;

693
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
694 695 696 697 698
	if (ret < 0)
		return;

	_val = ret << 16;

699
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
700 701 702 703 704 705
	if (ret < 0)
		return;

	*val = _val | ret;
}

706
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
	{ "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, },
766 767
};

768
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
769
			       struct mv88e6xxx_hw_stat *stat)
770
{
771 772
	switch (stat->type) {
	case BANK0:
773
		return true;
774
	case BANK1:
775
		return mv88e6xxx_6320_family(chip);
776
	case PORT:
777 778 779 780 781 782
		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);
783
	}
784
	return false;
785 786
}

787
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
788
					    struct mv88e6xxx_hw_stat *s,
789 790 791 792 793 794 795
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

796 797
	switch (s->type) {
	case PORT:
798
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
799 800 801 802 803
		if (ret < 0)
			return UINT64_MAX;

		low = ret;
		if (s->sizeof_stat == 4) {
804
			ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
805
						  s->reg + 1);
806 807 808 809
			if (ret < 0)
				return UINT64_MAX;
			high = ret;
		}
810 811 812
		break;
	case BANK0:
	case BANK1:
813
		_mv88e6xxx_stats_read(chip, s->reg, &low);
814
		if (s->sizeof_stat == 8)
815
			_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
816 817 818 819 820
	}
	value = (((u64)high) << 16) | low;
	return value;
}

821 822
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
823
{
824
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
825 826
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
827

828 829
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
830
		if (mv88e6xxx_has_stat(chip, stat)) {
831 832 833 834
			memcpy(data + j * ETH_GSTRING_LEN, stat->string,
			       ETH_GSTRING_LEN);
			j++;
		}
835
	}
836 837
}

838
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
839
{
840
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
841 842 843 844 845
	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];
846
		if (mv88e6xxx_has_stat(chip, stat))
847 848 849
			j++;
	}
	return j;
850 851
}

852 853
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
854
{
855
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
856 857 858 859
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

860
	mutex_lock(&chip->reg_lock);
861

862
	ret = _mv88e6xxx_stats_snapshot(chip, port);
863
	if (ret < 0) {
864
		mutex_unlock(&chip->reg_lock);
865 866 867 868
		return;
	}
	for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
		stat = &mv88e6xxx_hw_stats[i];
869 870
		if (mv88e6xxx_has_stat(chip, stat)) {
			data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
871 872 873 874
			j++;
		}
	}

875
	mutex_unlock(&chip->reg_lock);
876 877
}

878
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
879 880 881 882
{
	return 32 * sizeof(u16);
}

883 884
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
885
{
886
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
887 888 889 890 891 892 893
	u16 *p = _p;
	int i;

	regs->version = 0;

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

894
	mutex_lock(&chip->reg_lock);
895

896 897 898
	for (i = 0; i < 32; i++) {
		int ret;

899
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
900 901 902
		if (ret >= 0)
			p[i] = ret;
	}
903

904
	mutex_unlock(&chip->reg_lock);
905 906
}

907
static int _mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int reg, int offset,
908
			   u16 mask)
909 910 911 912 913 914
{
	unsigned long timeout = jiffies + HZ / 10;

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

915
		ret = _mv88e6xxx_reg_read(chip, reg, offset);
916 917
		if (ret < 0)
			return ret;
918 919 920 921 922 923 924 925
		if (!(ret & mask))
			return 0;

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

926
static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int reg,
927
			  int offset, u16 mask)
928 929 930
{
	int ret;

931 932 933
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_wait(chip, reg, offset, mask);
	mutex_unlock(&chip->reg_lock);
934 935 936 937

	return ret;
}

938
static int mv88e6xxx_mdio_wait(struct mv88e6xxx_chip *chip)
939
{
940
	return _mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
941
			       GLOBAL2_SMI_OP_BUSY);
942 943
}

944
static int mv88e6xxx_eeprom_load_wait(struct dsa_switch *ds)
945
{
946
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
947

948
	return mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_EEPROM_OP,
949
			      GLOBAL2_EEPROM_OP_LOAD);
950 951
}

952
static int mv88e6xxx_eeprom_busy_wait(struct dsa_switch *ds)
953
{
954
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
955

956
	return mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_EEPROM_OP,
957
			      GLOBAL2_EEPROM_OP_BUSY);
958 959
}

960 961
static int mv88e6xxx_read_eeprom_word(struct dsa_switch *ds, int addr)
{
962
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
963 964
	int ret;

965
	mutex_lock(&chip->eeprom_mutex);
966

967
	ret = mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_EEPROM_OP,
968 969 970 971 972 973 974 975 976
				  GLOBAL2_EEPROM_OP_READ |
				  (addr & GLOBAL2_EEPROM_OP_ADDR_MASK));
	if (ret < 0)
		goto error;

	ret = mv88e6xxx_eeprom_busy_wait(ds);
	if (ret < 0)
		goto error;

977
	ret = mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_EEPROM_DATA);
978
error:
979
	mutex_unlock(&chip->eeprom_mutex);
980 981 982
	return ret;
}

983 984
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
985
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
986

987 988
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEPROM))
		return chip->eeprom_len;
989 990 991 992

	return 0;
}

993 994
static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
995
{
996
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
997 998 999 1000
	int offset;
	int len;
	int ret;

1001
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEPROM))
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
		return -EOPNOTSUPP;

	offset = eeprom->offset;
	len = eeprom->len;
	eeprom->len = 0;

	eeprom->magic = 0xc3ec4951;

	ret = mv88e6xxx_eeprom_load_wait(ds);
	if (ret < 0)
		return ret;

	if (offset & 1) {
		int word;

		word = mv88e6xxx_read_eeprom_word(ds, offset >> 1);
		if (word < 0)
			return word;

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

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

	while (len >= 2) {
		int word;

		word = mv88e6xxx_read_eeprom_word(ds, offset >> 1);
		if (word < 0)
			return word;

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

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

	if (len) {
		int word;

		word = mv88e6xxx_read_eeprom_word(ds, offset >> 1);
		if (word < 0)
			return word;

		*data++ = word & 0xff;

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

	return 0;
}

static int mv88e6xxx_eeprom_is_readonly(struct dsa_switch *ds)
{
1062
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1063 1064
	int ret;

1065
	ret = mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_EEPROM_OP);
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
	if (ret < 0)
		return ret;

	if (!(ret & GLOBAL2_EEPROM_OP_WRITE_EN))
		return -EROFS;

	return 0;
}

static int mv88e6xxx_write_eeprom_word(struct dsa_switch *ds, int addr,
				       u16 data)
{
1078
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1079 1080
	int ret;

1081
	mutex_lock(&chip->eeprom_mutex);
1082

1083
	ret = mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_EEPROM_DATA, data);
1084 1085 1086
	if (ret < 0)
		goto error;

1087
	ret = mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_EEPROM_OP,
1088 1089 1090 1091 1092 1093 1094
				  GLOBAL2_EEPROM_OP_WRITE |
				  (addr & GLOBAL2_EEPROM_OP_ADDR_MASK));
	if (ret < 0)
		goto error;

	ret = mv88e6xxx_eeprom_busy_wait(ds);
error:
1095
	mutex_unlock(&chip->eeprom_mutex);
1096 1097 1098
	return ret;
}

1099 1100
static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
1101
{
1102
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1103 1104 1105 1106
	int offset;
	int ret;
	int len;

1107
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEPROM))
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
		return -EOPNOTSUPP;

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

	ret = mv88e6xxx_eeprom_is_readonly(ds);
	if (ret)
		return ret;

	offset = eeprom->offset;
	len = eeprom->len;
	eeprom->len = 0;

	ret = mv88e6xxx_eeprom_load_wait(ds);
	if (ret < 0)
		return ret;

	if (offset & 1) {
		int word;

		word = mv88e6xxx_read_eeprom_word(ds, offset >> 1);
		if (word < 0)
			return word;

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

		ret = mv88e6xxx_write_eeprom_word(ds, offset >> 1, word);
		if (ret < 0)
			return ret;

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

	while (len >= 2) {
		int word;

		word = *data++;
		word |= *data++ << 8;

		ret = mv88e6xxx_write_eeprom_word(ds, offset >> 1, word);
		if (ret < 0)
			return ret;

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

	if (len) {
		int word;

		word = mv88e6xxx_read_eeprom_word(ds, offset >> 1);
		if (word < 0)
			return word;

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

		ret = mv88e6xxx_write_eeprom_word(ds, offset >> 1, word);
		if (ret < 0)
			return ret;

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

	return 0;
}

1179
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
1180
{
1181
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
1182
			       GLOBAL_ATU_OP_BUSY);
1183 1184
}

1185
static int mv88e6xxx_mdio_read_indirect(struct mv88e6xxx_chip *chip,
1186
					int addr, int regnum)
1187 1188 1189
{
	int ret;

1190
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
1191 1192 1193 1194
				   GLOBAL2_SMI_OP_22_READ | (addr << 5) |
				   regnum);
	if (ret < 0)
		return ret;
1195

1196
	ret = mv88e6xxx_mdio_wait(chip);
1197 1198 1199
	if (ret < 0)
		return ret;

1200
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA);
1201 1202

	return ret;
1203 1204
}

1205
static int mv88e6xxx_mdio_write_indirect(struct mv88e6xxx_chip *chip,
1206
					 int addr, int regnum, u16 val)
1207
{
1208 1209
	int ret;

1210
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_DATA, val);
1211 1212
	if (ret < 0)
		return ret;
1213

1214
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SMI_OP,
1215 1216 1217
				   GLOBAL2_SMI_OP_22_WRITE | (addr << 5) |
				   regnum);

1218
	return mv88e6xxx_mdio_wait(chip);
1219 1220
}

1221 1222
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
1223
{
1224
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1225 1226
	int reg;

1227
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
1228 1229
		return -EOPNOTSUPP;

1230
	mutex_lock(&chip->reg_lock);
1231

1232
	reg = mv88e6xxx_mdio_read_indirect(chip, port, 16);
1233
	if (reg < 0)
1234
		goto out;
1235 1236 1237 1238

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

1239
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
1240
	if (reg < 0)
1241
		goto out;
1242

1243
	e->eee_active = !!(reg & PORT_STATUS_EEE);
1244
	reg = 0;
1245

1246
out:
1247
	mutex_unlock(&chip->reg_lock);
1248
	return reg;
1249 1250
}

1251 1252
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
1253
{
1254
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1255
	int reg;
1256 1257
	int ret;

1258
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
1259 1260
		return -EOPNOTSUPP;

1261
	mutex_lock(&chip->reg_lock);
1262

1263
	ret = mv88e6xxx_mdio_read_indirect(chip, port, 16);
1264 1265 1266 1267 1268 1269 1270 1271 1272
	if (ret < 0)
		goto out;

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

1273
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 16, reg);
1274
out:
1275
	mutex_unlock(&chip->reg_lock);
1276 1277

	return ret;
1278 1279
}

1280
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
1281 1282 1283
{
	int ret;

1284 1285 1286
	if (mv88e6xxx_has_fid_reg(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID,
					   fid);
1287 1288
		if (ret < 0)
			return ret;
1289
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1290
		/* ATU DBNum[7:4] are located in ATU Control 15:12 */
1291
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL);
1292 1293 1294
		if (ret < 0)
			return ret;

1295
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
1296 1297 1298 1299 1300 1301 1302
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

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

1305
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
1306 1307 1308
	if (ret < 0)
		return ret;

1309
	return _mv88e6xxx_atu_wait(chip);
1310 1311
}

1312
static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
				     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;
	}

1332
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1333 1334
}

1335
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1336 1337
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1338
{
1339 1340
	int op;
	int err;
1341

1342
	err = _mv88e6xxx_atu_wait(chip);
1343 1344
	if (err)
		return err;
1345

1346
	err = _mv88e6xxx_atu_data_write(chip, entry);
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
	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;
	}

1358
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1359 1360
}

1361
static int _mv88e6xxx_atu_flush(struct mv88e6xxx_chip *chip,
1362
				u16 fid, bool static_too)
1363 1364 1365 1366 1367
{
	struct mv88e6xxx_atu_entry entry = {
		.fid = fid,
		.state = 0, /* EntryState bits must be 0 */
	};
1368

1369
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1370 1371
}

1372
static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
1373
			       int from_port, int to_port, bool static_too)
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
{
	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;

1387
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1388 1389
}

1390
static int _mv88e6xxx_atu_remove(struct mv88e6xxx_chip *chip, u16 fid,
1391
				 int port, bool static_too)
1392 1393
{
	/* Destination port 0xF means remove the entries */
1394
	return _mv88e6xxx_atu_move(chip, fid, port, 0x0f, static_too);
1395 1396
}

1397 1398 1399 1400 1401 1402 1403
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",
};

1404
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1405
				 u8 state)
1406
{
1407
	struct dsa_switch *ds = chip->ds;
1408
	int reg, ret = 0;
1409 1410
	u8 oldstate;

1411
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1412 1413
	if (reg < 0)
		return reg;
1414

1415
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1416

1417 1418 1419 1420 1421
	if (oldstate != state) {
		/* Flush forwarding database if we're moving a port
		 * from Learning or Forwarding state to Disabled or
		 * Blocking or Listening state.
		 */
1422
		if ((oldstate == PORT_CONTROL_STATE_LEARNING ||
1423 1424 1425
		     oldstate == PORT_CONTROL_STATE_FORWARDING) &&
		    (state == PORT_CONTROL_STATE_DISABLED ||
		     state == PORT_CONTROL_STATE_BLOCKING)) {
1426
			ret = _mv88e6xxx_atu_remove(chip, 0, port, false);
1427
			if (ret)
1428
				return ret;
1429
		}
1430

1431
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1432
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1433
					   reg);
1434 1435 1436
		if (ret)
			return ret;

1437
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1438 1439
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1440 1441 1442 1443 1444
	}

	return ret;
}

1445
static int _mv88e6xxx_port_based_vlan_map(struct mv88e6xxx_chip *chip, int port)
1446
{
1447 1448 1449
	struct net_device *bridge = chip->ports[port].bridge_dev;
	const u16 mask = (1 << chip->info->num_ports) - 1;
	struct dsa_switch *ds = chip->ds;
1450
	u16 output_ports = 0;
1451
	int reg;
1452 1453 1454 1455 1456 1457
	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 {
1458
		for (i = 0; i < chip->info->num_ports; ++i) {
1459
			/* allow sending frames to every group member */
1460
			if (bridge && chip->ports[i].bridge_dev == bridge)
1461 1462 1463 1464 1465 1466 1467 1468 1469 1470
				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);
1471

1472
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1473 1474
	if (reg < 0)
		return reg;
1475

1476 1477
	reg &= ~mask;
	reg |= output_ports & mask;
1478

1479
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1480 1481
}

1482 1483
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1484
{
1485
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1486
	int stp_state;
1487
	int err;
1488 1489 1490

	switch (state) {
	case BR_STATE_DISABLED:
1491
		stp_state = PORT_CONTROL_STATE_DISABLED;
1492 1493 1494
		break;
	case BR_STATE_BLOCKING:
	case BR_STATE_LISTENING:
1495
		stp_state = PORT_CONTROL_STATE_BLOCKING;
1496 1497
		break;
	case BR_STATE_LEARNING:
1498
		stp_state = PORT_CONTROL_STATE_LEARNING;
1499 1500 1501
		break;
	case BR_STATE_FORWARDING:
	default:
1502
		stp_state = PORT_CONTROL_STATE_FORWARDING;
1503 1504 1505
		break;
	}

1506 1507 1508
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1509 1510

	if (err)
1511 1512
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1513
			   mv88e6xxx_port_state_names[stp_state]);
1514 1515
}

1516
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1517
				u16 *new, u16 *old)
1518
{
1519
	struct dsa_switch *ds = chip->ds;
1520
	u16 pvid;
1521 1522
	int ret;

1523
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1524 1525 1526
	if (ret < 0)
		return ret;

1527 1528 1529 1530 1531 1532
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1533
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1534 1535 1536 1537
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1538 1539
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1540 1541 1542 1543
	}

	if (old)
		*old = pvid;
1544 1545 1546 1547

	return 0;
}

1548
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1549
				    int port, u16 *pvid)
1550
{
1551
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1552 1553
}

1554
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1555
				    int port, u16 pvid)
1556
{
1557
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1558 1559
}

1560
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1561
{
1562
	return _mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
1563 1564 1565
			       GLOBAL_VTU_OP_BUSY);
}

1566
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1567 1568 1569
{
	int ret;

1570
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1571 1572 1573
	if (ret < 0)
		return ret;

1574
	return _mv88e6xxx_vtu_wait(chip);
1575 1576
}

1577
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1578 1579 1580
{
	int ret;

1581
	ret = _mv88e6xxx_vtu_wait(chip);
1582 1583 1584
	if (ret < 0)
		return ret;

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

1588
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1589 1590 1591 1592 1593 1594 1595 1596
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1597
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1598 1599 1600 1601 1602 1603 1604
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1605
	for (i = 0; i < chip->info->num_ports; ++i) {
1606 1607 1608 1609 1610 1611 1612 1613 1614
		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;
}

1615
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1616 1617
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1618
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1619 1620
}

1621
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1622 1623
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1624
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1625 1626
}

1627
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1628 1629 1630 1631 1632 1633 1634
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

1635
	for (i = 0; i < chip->info->num_ports; ++i) {
1636 1637 1638 1639 1640 1641 1642
		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) {
1643
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
1644 1645 1646 1647 1648 1649 1650 1651
					   GLOBAL_VTU_DATA_0_3 + i, regs[i]);
		if (ret < 0)
			return ret;
	}

	return 0;
}

1652
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1653 1654
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1655
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1656 1657
}

1658
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1659 1660
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1661
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1662 1663
}

1664
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1665
{
1666
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1667 1668 1669
				    vid & GLOBAL_VTU_VID_MASK);
}

1670
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1671 1672 1673 1674 1675
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1676
	ret = _mv88e6xxx_vtu_wait(chip);
1677 1678 1679
	if (ret < 0)
		return ret;

1680
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1681 1682 1683
	if (ret < 0)
		return ret;

1684
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1685 1686 1687 1688 1689 1690 1691
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1692
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1693 1694 1695
		if (ret < 0)
			return ret;

1696 1697
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1698 1699 1700 1701 1702
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

			next.fid = ret & GLOBAL_VTU_FID_MASK;
1703
		} else if (mv88e6xxx_num_databases(chip) == 256) {
1704 1705 1706
			/* VTU DBNum[7:4] are located in VTU Operation 11:8, and
			 * VTU DBNum[3:0] are located in VTU Operation 3:0
			 */
1707
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1708 1709 1710 1711 1712 1713
						  GLOBAL_VTU_OP);
			if (ret < 0)
				return ret;

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

1716 1717
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1730 1731 1732
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1733
{
1734
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1735 1736 1737 1738
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1739
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1740 1741
		return -EOPNOTSUPP;

1742
	mutex_lock(&chip->reg_lock);
1743

1744
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1745 1746 1747
	if (err)
		goto unlock;

1748
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1749 1750 1751 1752
	if (err)
		goto unlock;

	do {
1753
		err = _mv88e6xxx_vtu_getnext(chip, &next);
1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
		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 */
1764 1765
		vlan->vid_begin = next.vid;
		vlan->vid_end = next.vid;
1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
		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:
1780
	mutex_unlock(&chip->reg_lock);
1781 1782 1783 1784

	return err;
}

1785
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1786 1787
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1788
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1789 1790 1791
	u16 reg = 0;
	int ret;

1792
	ret = _mv88e6xxx_vtu_wait(chip);
1793 1794 1795 1796 1797 1798 1799
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1800
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1801 1802 1803
	if (ret < 0)
		return ret;

1804
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1805
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1806 1807
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1808 1809
		if (ret < 0)
			return ret;
1810
	}
1811

1812
	if (mv88e6xxx_has_fid_reg(chip)) {
1813
		reg = entry->fid & GLOBAL_VTU_FID_MASK;
1814 1815
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
					   reg);
1816 1817
		if (ret < 0)
			return ret;
1818
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1819 1820 1821 1822 1823
		/* 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;
1824 1825 1826 1827 1828
	}

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1829
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1830 1831 1832
	if (ret < 0)
		return ret;

1833
	return _mv88e6xxx_vtu_cmd(chip, op);
1834 1835
}

1836
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1837 1838 1839 1840 1841
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1842
	ret = _mv88e6xxx_vtu_wait(chip);
1843 1844 1845
	if (ret < 0)
		return ret;

1846
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1847 1848 1849 1850
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1851
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1852 1853 1854
	if (ret < 0)
		return ret;

1855
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1856 1857 1858 1859 1860
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1861
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1862 1863 1864 1865 1866 1867
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1868
		ret = mv88e6xxx_stu_data_read(chip, &next);
1869 1870 1871 1872 1873 1874 1875 1876
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1877
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1878 1879 1880 1881 1882
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1883
	ret = _mv88e6xxx_vtu_wait(chip);
1884 1885 1886 1887 1888 1889 1890
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1891
	ret = mv88e6xxx_stu_data_write(chip, entry);
1892 1893 1894 1895 1896
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1897
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1898 1899 1900 1901
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1902
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1903 1904 1905
	if (ret < 0)
		return ret;

1906
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1907 1908
}

1909
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1910
			       u16 *new, u16 *old)
1911
{
1912
	struct dsa_switch *ds = chip->ds;
1913
	u16 upper_mask;
1914 1915 1916
	u16 fid;
	int ret;

1917
	if (mv88e6xxx_num_databases(chip) == 4096)
1918
		upper_mask = 0xff;
1919
	else if (mv88e6xxx_num_databases(chip) == 256)
1920
		upper_mask = 0xf;
1921 1922 1923
	else
		return -EOPNOTSUPP;

1924
	/* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
1925
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1926 1927 1928 1929 1930 1931 1932 1933 1934
	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;

1935
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1936 1937 1938 1939 1940 1941
					   ret);
		if (ret < 0)
			return ret;
	}

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

1946
	fid |= (ret & upper_mask) << 4;
1947 1948

	if (new) {
1949 1950
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1951

1952
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1953 1954 1955 1956
					   ret);
		if (ret < 0)
			return ret;

1957 1958
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1959 1960 1961 1962 1963 1964 1965 1966
	}

	if (old)
		*old = fid;

	return 0;
}

1967
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1968
				   int port, u16 *fid)
1969
{
1970
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1971 1972
}

1973
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1974
				   int port, u16 fid)
1975
{
1976
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1977 1978
}

1979
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1980 1981 1982
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1983
	int i, err;
1984 1985 1986

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

1987
	/* Set every FID bit used by the (un)bridged ports */
1988 1989
	for (i = 0; i < chip->info->num_ports; ++i) {
		err = _mv88e6xxx_port_fid_get(chip, i, fid);
1990 1991 1992 1993 1994 1995
		if (err)
			return err;

		set_bit(*fid, fid_bitmap);
	}

1996
	/* Set every FID bit used by the VLAN entries */
1997
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1998 1999 2000 2001
	if (err)
		return err;

	do {
2002
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
		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);
2016
	if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
2017 2018 2019
		return -ENOSPC;

	/* Clear the database */
2020
	return _mv88e6xxx_atu_flush(chip, *fid, true);
2021 2022
}

2023
static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
2024
			      struct mv88e6xxx_vtu_stu_entry *entry)
2025
{
2026
	struct dsa_switch *ds = chip->ds;
2027 2028 2029 2030
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.valid = true,
		.vid = vid,
	};
2031 2032
	int i, err;

2033
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
2034 2035
	if (err)
		return err;
2036

2037
	/* exclude all ports except the CPU and DSA ports */
2038
	for (i = 0; i < chip->info->num_ports; ++i)
2039 2040 2041
		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;
2042

2043 2044
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
2045 2046 2047 2048 2049 2050 2051
		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;
2052
		err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
2053 2054 2055 2056 2057 2058 2059 2060
		if (err)
			return err;

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

2061
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
2062 2063 2064 2065 2066 2067 2068 2069 2070
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

2071
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
2072 2073 2074 2075 2076 2077 2078
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

2079
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
2080 2081 2082
	if (err)
		return err;

2083
	err = _mv88e6xxx_vtu_getnext(chip, entry);
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093
	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.
		 */

2094
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
2095 2096 2097 2098 2099
	}

	return err;
}

2100 2101 2102
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
2103
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2104 2105 2106 2107 2108 2109
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

2110
	mutex_lock(&chip->reg_lock);
2111

2112
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
2113 2114 2115 2116
	if (err)
		goto unlock;

	do {
2117
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2118 2119 2120 2121 2122 2123 2124 2125 2126
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

2127
		for (i = 0; i < chip->info->num_ports; ++i) {
2128 2129 2130 2131 2132 2133 2134
			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;

2135 2136
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
2137 2138
				break; /* same bridge, check next VLAN */

2139
			netdev_warn(ds->ports[port].netdev,
2140 2141
				    "hardware VLAN %d already used by %s\n",
				    vlan.vid,
2142
				    netdev_name(chip->ports[i].bridge_dev));
2143 2144 2145 2146 2147 2148
			err = -EOPNOTSUPP;
			goto unlock;
		}
	} while (vlan.vid < vid_end);

unlock:
2149
	mutex_unlock(&chip->reg_lock);
2150 2151 2152 2153

	return err;
}

2154 2155 2156 2157 2158 2159 2160
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",
};

2161 2162
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
2163
{
2164
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2165 2166 2167 2168
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

2169
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2170 2171
		return -EOPNOTSUPP;

2172
	mutex_lock(&chip->reg_lock);
2173

2174
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
2175 2176 2177 2178 2179
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

2180 2181 2182
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
2183

2184
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
2185 2186 2187 2188
					   ret);
		if (ret < 0)
			goto unlock;

2189
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
2190 2191 2192
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
2193

2194
	ret = 0;
2195
unlock:
2196
	mutex_unlock(&chip->reg_lock);
2197 2198 2199 2200

	return ret;
}

2201 2202 2203 2204
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
2205
{
2206
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2207 2208
	int err;

2209
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2210 2211
		return -EOPNOTSUPP;

2212 2213 2214 2215 2216 2217 2218 2219
	/* 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;

2220 2221 2222 2223 2224 2225
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2226
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
2227
				    u16 vid, bool untagged)
2228 2229 2230 2231
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

2232
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
2233
	if (err)
2234
		return err;
2235 2236 2237 2238 2239

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

2240
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
2241 2242
}

2243 2244 2245
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
2246
{
2247
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2248 2249 2250 2251
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

2252
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2253 2254
		return;

2255
	mutex_lock(&chip->reg_lock);
2256

2257
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
2258
		if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
2259 2260
			netdev_err(ds->ports[port].netdev,
				   "failed to add VLAN %d%c\n",
2261
				   vid, untagged ? 'u' : 't');
2262

2263
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
2264
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
2265
			   vlan->vid_end);
2266

2267
	mutex_unlock(&chip->reg_lock);
2268 2269
}

2270
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
2271
				    int port, u16 vid)
2272
{
2273
	struct dsa_switch *ds = chip->ds;
2274 2275 2276
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

2277
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2278
	if (err)
2279
		return err;
2280

2281 2282
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
2283
		return -EOPNOTSUPP;
2284 2285 2286 2287

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

	/* keep the VLAN unless all ports are excluded */
2288
	vlan.valid = false;
2289
	for (i = 0; i < chip->info->num_ports; ++i) {
2290
		if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
2291 2292 2293
			continue;

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
2294
			vlan.valid = true;
2295 2296 2297 2298
			break;
		}
	}

2299
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
2300 2301 2302
	if (err)
		return err;

2303
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
2304 2305
}

2306 2307
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
2308
{
2309
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2310 2311 2312
	u16 pvid, vid;
	int err = 0;

2313
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2314 2315
		return -EOPNOTSUPP;

2316
	mutex_lock(&chip->reg_lock);
2317

2318
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
2319 2320 2321
	if (err)
		goto unlock;

2322
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
2323
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
2324 2325 2326 2327
		if (err)
			goto unlock;

		if (vid == pvid) {
2328
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2329 2330 2331 2332 2333
			if (err)
				goto unlock;
		}
	}

2334
unlock:
2335
	mutex_unlock(&chip->reg_lock);
2336 2337 2338 2339

	return err;
}

2340
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2341
				    const unsigned char *addr)
2342 2343 2344 2345
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2346
		ret = _mv88e6xxx_reg_write(
2347
			chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i,
2348
			(addr[i * 2] << 8) | addr[i * 2 + 1]);
2349 2350 2351 2352 2353 2354 2355
		if (ret < 0)
			return ret;
	}

	return 0;
}

2356
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2357
				   unsigned char *addr)
2358 2359 2360 2361
{
	int i, ret;

	for (i = 0; i < 3; i++) {
2362
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
2363
					  GLOBAL_ATU_MAC_01 + i);
2364 2365 2366 2367 2368 2369 2370 2371 2372
		if (ret < 0)
			return ret;
		addr[i * 2] = ret >> 8;
		addr[i * 2 + 1] = ret & 0xff;
	}

	return 0;
}

2373
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2374
			       struct mv88e6xxx_atu_entry *entry)
2375
{
2376 2377
	int ret;

2378
	ret = _mv88e6xxx_atu_wait(chip);
2379 2380 2381
	if (ret < 0)
		return ret;

2382
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2383 2384 2385
	if (ret < 0)
		return ret;

2386
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2387
	if (ret < 0)
2388 2389
		return ret;

2390
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2391
}
2392

2393
static int _mv88e6xxx_port_fdb_load(struct mv88e6xxx_chip *chip, int port,
2394 2395 2396 2397
				    const unsigned char *addr, u16 vid,
				    u8 state)
{
	struct mv88e6xxx_atu_entry entry = { 0 };
2398 2399 2400
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

2401 2402
	/* Null VLAN ID corresponds to the port private database */
	if (vid == 0)
2403
		err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
2404
	else
2405
		err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2406 2407
	if (err)
		return err;
2408

2409
	entry.fid = vlan.fid;
2410 2411 2412 2413 2414 2415 2416
	entry.state = state;
	ether_addr_copy(entry.mac, addr);
	if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.trunk = false;
		entry.portv_trunkid = BIT(port);
	}

2417
	return _mv88e6xxx_atu_load(chip, &entry);
2418 2419
}

2420 2421 2422
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 已提交
2423 2424 2425 2426 2427 2428 2429
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2430 2431 2432
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2433
{
2434
	int state = is_multicast_ether_addr(fdb->addr) ?
2435 2436
		GLOBAL_ATU_DATA_STATE_MC_STATIC :
		GLOBAL_ATU_DATA_STATE_UC_STATIC;
2437
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2438

2439 2440
	mutex_lock(&chip->reg_lock);
	if (_mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid, state))
2441 2442
		netdev_err(ds->ports[port].netdev,
			   "failed to load MAC address\n");
2443
	mutex_unlock(&chip->reg_lock);
2444 2445
}

2446 2447
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2448
{
2449
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2450 2451
	int ret;

2452 2453
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid,
2454
				       GLOBAL_ATU_DATA_STATE_UNUSED);
2455
	mutex_unlock(&chip->reg_lock);
2456 2457 2458 2459

	return ret;
}

2460
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2461
				  struct mv88e6xxx_atu_entry *entry)
2462
{
2463 2464 2465 2466
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2467

2468
	ret = _mv88e6xxx_atu_wait(chip);
2469 2470
	if (ret < 0)
		return ret;
2471

2472
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2473 2474
	if (ret < 0)
		return ret;
2475

2476
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2477 2478
	if (ret < 0)
		return ret;
2479

2480
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2481 2482
	if (ret < 0)
		return ret;
2483

2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499
	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;
	}
2500

2501
	*entry = next;
2502 2503 2504
	return 0;
}

2505
static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2506
					u16 fid, u16 vid, int port,
2507 2508 2509 2510 2511 2512 2513 2514
					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;

2515
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2516 2517 2518 2519
	if (err)
		return err;

	do {
2520
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545
		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;
}

2546 2547 2548
static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
2549
{
2550
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2551 2552 2553
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2554
	u16 fid;
2555 2556
	int err;

2557
	mutex_lock(&chip->reg_lock);
2558

2559
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2560
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2561 2562 2563
	if (err)
		goto unlock;

2564
	err = _mv88e6xxx_port_fdb_dump_one(chip, fid, 0, port, fdb, cb);
2565 2566 2567
	if (err)
		goto unlock;

2568
	/* Dump VLANs' Filtering Information Databases */
2569
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2570 2571 2572 2573
	if (err)
		goto unlock;

	do {
2574
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2575
		if (err)
2576
			break;
2577 2578 2579 2580

		if (!vlan.valid)
			break;

2581 2582
		err = _mv88e6xxx_port_fdb_dump_one(chip, vlan.fid, vlan.vid,
						   port, fdb, cb);
2583
		if (err)
2584
			break;
2585 2586 2587
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

unlock:
2588
	mutex_unlock(&chip->reg_lock);
2589 2590 2591 2592

	return err;
}

2593 2594
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2595
{
2596
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2597
	int i, err = 0;
2598

2599
	mutex_lock(&chip->reg_lock);
2600

2601
	/* Assign the bridge and remap each port's VLANTable */
2602
	chip->ports[port].bridge_dev = bridge;
2603

2604 2605 2606
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2607 2608 2609 2610 2611
			if (err)
				break;
		}
	}

2612
	mutex_unlock(&chip->reg_lock);
2613

2614
	return err;
2615 2616
}

2617
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2618
{
2619 2620
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	struct net_device *bridge = chip->ports[port].bridge_dev;
2621
	int i;
2622

2623
	mutex_lock(&chip->reg_lock);
2624

2625
	/* Unassign the bridge and remap each port's VLANTable */
2626
	chip->ports[port].bridge_dev = NULL;
2627

2628 2629 2630
	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))
2631 2632
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2633

2634
	mutex_unlock(&chip->reg_lock);
2635 2636
}

2637
static int _mv88e6xxx_mdio_page_write(struct mv88e6xxx_chip *chip,
2638
				      int port, int page, int reg, int val)
2639 2640 2641
{
	int ret;

2642
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2643 2644 2645
	if (ret < 0)
		goto restore_page_0;

2646
	ret = mv88e6xxx_mdio_write_indirect(chip, port, reg, val);
2647
restore_page_0:
2648
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2649 2650 2651 2652

	return ret;
}

2653
static int _mv88e6xxx_mdio_page_read(struct mv88e6xxx_chip *chip,
2654
				     int port, int page, int reg)
2655 2656 2657
{
	int ret;

2658
	ret = mv88e6xxx_mdio_write_indirect(chip, port, 0x16, page);
2659 2660 2661
	if (ret < 0)
		goto restore_page_0;

2662
	ret = mv88e6xxx_mdio_read_indirect(chip, port, reg);
2663
restore_page_0:
2664
	mv88e6xxx_mdio_write_indirect(chip, port, 0x16, 0x0);
2665 2666 2667 2668

	return ret;
}

2669
static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2670
{
2671
	bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
2672
	u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2673
	struct gpio_desc *gpiod = chip->reset;
2674 2675 2676 2677 2678
	unsigned long timeout;
	int ret;
	int i;

	/* Set all ports to the disabled state. */
2679 2680
	for (i = 0; i < chip->info->num_ports; i++) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
2681 2682 2683
		if (ret < 0)
			return ret;

2684
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705
					   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)
2706
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
2707
	else
2708
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
2709 2710 2711 2712 2713 2714
	if (ret)
		return ret;

	/* Wait up to one second for reset to complete. */
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
2715
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730
		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;
}

2731
static int mv88e6xxx_power_on_serdes(struct mv88e6xxx_chip *chip)
2732 2733 2734
{
	int ret;

2735
	ret = _mv88e6xxx_mdio_page_read(chip, REG_FIBER_SERDES,
2736
					PAGE_FIBER_SERDES, MII_BMCR);
2737 2738 2739 2740 2741
	if (ret < 0)
		return ret;

	if (ret & BMCR_PDOWN) {
		ret &= ~BMCR_PDOWN;
2742
		ret = _mv88e6xxx_mdio_page_write(chip, REG_FIBER_SERDES,
2743 2744
						 PAGE_FIBER_SERDES, MII_BMCR,
						 ret);
2745 2746 2747 2748 2749
	}

	return ret;
}

2750
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
2751
{
2752
	struct dsa_switch *ds = chip->ds;
2753
	int ret;
2754
	u16 reg;
2755

2756 2757 2758 2759
	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)) {
2760 2761 2762 2763 2764 2765
		/* 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.
		 */
2766
		reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
2767
		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
2768
			reg &= ~PORT_PCS_CTRL_UNFORCED;
2769 2770 2771 2772
			reg |= PORT_PCS_CTRL_FORCE_LINK |
				PORT_PCS_CTRL_LINK_UP |
				PORT_PCS_CTRL_DUPLEX_FULL |
				PORT_PCS_CTRL_FORCE_DUPLEX;
2773
			if (mv88e6xxx_6065_family(chip))
2774 2775 2776 2777 2778 2779 2780
				reg |= PORT_PCS_CTRL_100;
			else
				reg |= PORT_PCS_CTRL_1000;
		} else {
			reg |= PORT_PCS_CTRL_UNFORCED;
		}

2781
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2782 2783
					   PORT_PCS_CTRL, reg);
		if (ret)
2784
			return ret;
2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801
	}

	/* 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;
2802 2803 2804 2805
	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))
2806 2807 2808 2809
		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)) {
2810
		if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip))
2811
			reg |= PORT_CONTROL_DSA_TAG;
2812 2813 2814 2815 2816
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2817 2818
			reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
				PORT_CONTROL_FORWARD_UNKNOWN |
2819
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
2820 2821
		}

2822 2823 2824 2825 2826 2827 2828 2829
		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)) {
2830
			reg |= PORT_CONTROL_EGRESS_ADD_TAG;
2831 2832
		}
	}
2833
	if (dsa_is_dsa_port(ds, port)) {
2834 2835
		if (mv88e6xxx_6095_family(chip) ||
		    mv88e6xxx_6185_family(chip))
2836
			reg |= PORT_CONTROL_DSA_TAG;
2837 2838 2839 2840 2841
		if (mv88e6xxx_6352_family(chip) ||
		    mv88e6xxx_6351_family(chip) ||
		    mv88e6xxx_6165_family(chip) ||
		    mv88e6xxx_6097_family(chip) ||
		    mv88e6xxx_6320_family(chip)) {
2842
			reg |= PORT_CONTROL_FRAME_MODE_DSA;
2843 2844
		}

2845 2846 2847 2848 2849
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_FORWARD_UNKNOWN |
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
	}
	if (reg) {
2850
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2851 2852
					   PORT_CONTROL, reg);
		if (ret)
2853
			return ret;
2854 2855
	}

2856 2857 2858
	/* If this port is connected to a SerDes, make sure the SerDes is not
	 * powered down.
	 */
2859 2860
	if (mv88e6xxx_6352_family(chip)) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
2861
		if (ret < 0)
2862
			return ret;
2863 2864 2865 2866
		ret &= PORT_STATUS_CMODE_MASK;
		if ((ret == PORT_STATUS_CMODE_100BASE_X) ||
		    (ret == PORT_STATUS_CMODE_1000BASE_X) ||
		    (ret == PORT_STATUS_CMODE_SGMII)) {
2867
			ret = mv88e6xxx_power_on_serdes(chip);
2868
			if (ret < 0)
2869
				return ret;
2870 2871 2872
		}
	}

2873
	/* Port Control 2: don't force a good FCS, set the maximum frame size to
2874
	 * 10240 bytes, disable 802.1q tags checking, don't discard tagged or
2875 2876 2877
	 * 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.
2878 2879
	 */
	reg = 0;
2880 2881 2882 2883
	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))
2884 2885
		reg = PORT_CONTROL_2_MAP_DA;

2886 2887
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
2888 2889
		reg |= PORT_CONTROL_2_JUMBO_10240;

2890
	if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
2891 2892 2893 2894 2895 2896 2897 2898 2899
		/* 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;
	}

2900
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2901

2902
	if (reg) {
2903
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2904 2905
					   PORT_CONTROL_2, reg);
		if (ret)
2906
			return ret;
2907 2908 2909 2910 2911 2912 2913
	}

	/* 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.
	 */
2914
	reg = 1 << port;
2915 2916
	/* Disable learning for CPU port */
	if (dsa_is_cpu_port(ds, port))
2917
		reg = 0;
2918

2919 2920
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
				   reg);
2921
	if (ret)
2922
		return ret;
2923 2924

	/* Egress rate control 2: disable egress rate control. */
2925
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_RATE_CONTROL_2,
2926 2927
				   0x0000);
	if (ret)
2928
		return ret;
2929

2930 2931 2932
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
2933 2934 2935 2936
		/* 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.
		 */
2937
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2938 2939
					   PORT_PAUSE_CTRL, 0x0000);
		if (ret)
2940
			return ret;
2941 2942 2943 2944 2945

		/* Port ATU control: disable limiting the number of
		 * address database entries that this port is allowed
		 * to use.
		 */
2946
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2947 2948 2949 2950
					   PORT_ATU_CONTROL, 0x0000);
		/* Priority Override: disable DA, SA and VTU priority
		 * override.
		 */
2951
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2952 2953
					   PORT_PRI_OVERRIDE, 0x0000);
		if (ret)
2954
			return ret;
2955 2956 2957 2958

		/* Port Ethertype: use the Ethertype DSA Ethertype
		 * value.
		 */
2959
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2960 2961
					   PORT_ETH_TYPE, ETH_P_EDSA);
		if (ret)
2962
			return ret;
2963 2964 2965
		/* Tag Remap: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2966
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2967 2968
					   PORT_TAG_REGMAP_0123, 0x3210);
		if (ret)
2969
			return ret;
2970 2971 2972 2973

		/* Tag Remap 2: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2974
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2975 2976
					   PORT_TAG_REGMAP_4567, 0x7654);
		if (ret)
2977
			return ret;
2978 2979
	}

2980 2981 2982 2983
	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)) {
2984
		/* Rate Control: disable ingress rate limiting. */
2985
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2986 2987
					   PORT_RATE_CONTROL, 0x0001);
		if (ret)
2988
			return ret;
2989 2990
	}

2991 2992
	/* Port Control 1: disable trunking, disable sending
	 * learning messages to this port.
2993
	 */
2994 2995
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
				   0x0000);
2996
	if (ret)
2997
		return ret;
2998

2999
	/* Port based VLAN map: give each port the same default address
3000 3001
	 * database, and allow bidirectional communication between the
	 * CPU and DSA port(s), and the other ports.
3002
	 */
3003
	ret = _mv88e6xxx_port_fid_set(chip, port, 0);
3004
	if (ret)
3005
		return ret;
3006

3007
	ret = _mv88e6xxx_port_based_vlan_map(chip, port);
3008
	if (ret)
3009
		return ret;
3010 3011 3012 3013

	/* Default VLAN ID and priority: don't set a default VLAN
	 * ID, and set the default packet priority to zero.
	 */
3014
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_DEFAULT_VLAN,
3015
				   0x0000);
3016 3017
	if (ret)
		return ret;
3018 3019 3020 3021

	return 0;
}

3022
static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
3023
{
3024
	struct dsa_switch *ds = chip->ds;
3025
	u32 upstream_port = dsa_upstream_port(ds);
3026
	u16 reg;
3027
	int err;
3028

3029 3030 3031 3032
	/* Enable the PHY Polling Unit if present, don't discard any packets,
	 * and mask all interrupt sources.
	 */
	reg = 0;
3033 3034
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
3035 3036
		reg |= GLOBAL_CONTROL_PPU_ENABLE;

3037
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
3038 3039 3040
	if (err)
		return err;

3041 3042 3043 3044 3045 3046
	/* 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;
3047 3048
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
				   reg);
3049 3050 3051
	if (err)
		return err;

3052
	/* Disable remote management, and set the switch's DSA device number. */
3053
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2,
3054 3055 3056 3057 3058
				   GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
				   (ds->index & 0x1f));
	if (err)
		return err;

3059 3060 3061 3062
	/* Set the default address aging time to 5 minutes, and
	 * enable address learn messages to be sent to all message
	 * ports.
	 */
3063
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
3064 3065
				   0x0140 | GLOBAL_ATU_CONTROL_LEARN2ALL);
	if (err)
3066
		return err;
3067

3068 3069 3070 3071 3072 3073 3074 3075 3076 3077
	/* Clear all the VTU and STU entries */
	err = _mv88e6xxx_vtu_stu_flush(chip);
	if (err < 0)
		return err;

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

3078
	/* Configure the IP ToS mapping registers. */
3079
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000);
3080
	if (err)
3081
		return err;
3082
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000);
3083
	if (err)
3084
		return err;
3085
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555);
3086
	if (err)
3087
		return err;
3088
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555);
3089
	if (err)
3090
		return err;
3091
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa);
3092
	if (err)
3093
		return err;
3094
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa);
3095
	if (err)
3096
		return err;
3097
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff);
3098
	if (err)
3099
		return err;
3100
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff);
3101
	if (err)
3102
		return err;
3103 3104

	/* Configure the IEEE 802.1p priority mapping register. */
3105
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41);
3106
	if (err)
3107
		return err;
3108

3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122
	/* 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;
}

3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153
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;
}

3154 3155 3156 3157 3158
static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
{
	int err;
	int i;

3159 3160 3161
	/* Send all frames with destination addresses matching
	 * 01:80:c2:00:00:0x to the CPU port.
	 */
3162 3163
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_0X,
				   0xffff);
3164
	if (err)
3165
		return err;
3166 3167 3168 3169 3170 3171

	/* 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.
	 */
3172
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MGMT,
3173 3174 3175
				   0x7 | GLOBAL2_SWITCH_MGMT_RSVD2CPU | 0x70 |
				   GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI);
	if (err)
3176
		return err;
3177 3178

	/* Program the DSA routing table. */
3179 3180 3181
	err = mv88e6xxx_g2_set_device_mapping(chip);
	if (err)
		return err;
3182 3183

	/* Clear all trunk masks. */
3184
	for (i = 0; i < 8; i++) {
3185 3186
		err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2,
					   GLOBAL2_TRUNK_MASK,
3187 3188
					   0x8000 |
					   (i << GLOBAL2_TRUNK_MASK_NUM_SHIFT) |
3189
					   ((1 << chip->info->num_ports) - 1));
3190
		if (err)
3191
			return err;
3192
	}
3193 3194

	/* Clear all trunk mappings. */
3195 3196
	for (i = 0; i < 16; i++) {
		err = _mv88e6xxx_reg_write(
3197
			chip, REG_GLOBAL2,
3198 3199 3200 3201
			GLOBAL2_TRUNK_MAPPING,
			GLOBAL2_TRUNK_MAPPING_UPDATE |
			(i << GLOBAL2_TRUNK_MAPPING_ID_SHIFT));
		if (err)
3202
			return err;
3203
	}
3204

3205 3206 3207
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
3208 3209 3210
		/* Send all frames with destination addresses matching
		 * 01:80:c2:00:00:2x to the CPU port.
		 */
3211
		err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2,
3212 3213
					   GLOBAL2_MGMT_EN_2X, 0xffff);
		if (err)
3214
			return err;
3215 3216 3217 3218

		/* Initialise cross-chip port VLAN table to reset
		 * defaults.
		 */
3219
		err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2,
3220 3221
					   GLOBAL2_PVT_ADDR, 0x9000);
		if (err)
3222
			return err;
3223 3224

		/* Clear the priority override table. */
3225
		for (i = 0; i < 16; i++) {
3226
			err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2,
3227 3228 3229
						   GLOBAL2_PRIO_OVERRIDE,
						   0x8000 | (i << 8));
			if (err)
3230
				return err;
3231
		}
3232 3233
	}

3234 3235 3236 3237
	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)) {
3238 3239 3240 3241
		/* Disable ingress rate limiting by resetting all
		 * ingress rate limit registers to their initial
		 * state.
		 */
3242 3243
		for (i = 0; i < chip->info->num_ports; i++) {
			err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2,
3244 3245 3246
						   GLOBAL2_INGRESS_OP,
						   0x9000 | (i << 8));
			if (err)
3247
				return err;
3248
		}
3249 3250
	}

3251
	return 0;
3252 3253
}

3254
static int mv88e6xxx_setup(struct dsa_switch *ds)
3255
{
3256
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3257
	int err;
3258 3259
	int i;

3260 3261
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
3262

3263 3264
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEPROM))
		mutex_init(&chip->eeprom_mutex);
3265

3266
	mutex_lock(&chip->reg_lock);
3267

3268
	err = mv88e6xxx_switch_reset(chip);
3269 3270 3271
	if (err)
		goto unlock;

3272 3273 3274 3275 3276 3277 3278 3279 3280
	/* 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);
3281 3282 3283
	if (err)
		goto unlock;

3284 3285 3286
	/* Setup Switch Global 2 Registers */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
		err = mv88e6xxx_g2_setup(chip);
3287 3288 3289
		if (err)
			goto unlock;
	}
3290

3291
unlock:
3292
	mutex_unlock(&chip->reg_lock);
3293

3294
	return err;
3295 3296
}

3297 3298
static int mv88e6xxx_mdio_page_read(struct dsa_switch *ds, int port, int page,
				    int reg)
3299
{
3300
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3301 3302
	int ret;

3303 3304 3305
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_mdio_page_read(chip, port, page, reg);
	mutex_unlock(&chip->reg_lock);
3306

3307 3308 3309
	return ret;
}

3310 3311
static int mv88e6xxx_mdio_page_write(struct dsa_switch *ds, int port, int page,
				     int reg, int val)
3312
{
3313
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3314 3315
	int ret;

3316 3317 3318
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_mdio_page_write(chip, port, page, reg, val);
	mutex_unlock(&chip->reg_lock);
3319

3320 3321 3322
	return ret;
}

3323
static int mv88e6xxx_port_to_mdio_addr(struct mv88e6xxx_chip *chip, int port)
3324
{
3325
	if (port >= 0 && port < chip->info->num_ports)
3326 3327 3328 3329
		return port;
	return -EINVAL;
}

3330
static int mv88e6xxx_mdio_read(struct mii_bus *bus, int port, int regnum)
3331
{
3332 3333
	struct mv88e6xxx_chip *chip = bus->priv;
	int addr = mv88e6xxx_port_to_mdio_addr(chip, port);
3334 3335 3336
	int ret;

	if (addr < 0)
3337
		return 0xffff;
3338

3339
	mutex_lock(&chip->reg_lock);
3340

3341 3342 3343 3344
	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);
3345
	else
3346
		ret = mv88e6xxx_mdio_read_direct(chip, addr, regnum);
3347

3348
	mutex_unlock(&chip->reg_lock);
3349 3350 3351
	return ret;
}

3352
static int mv88e6xxx_mdio_write(struct mii_bus *bus, int port, int regnum,
3353
				u16 val)
3354
{
3355 3356
	struct mv88e6xxx_chip *chip = bus->priv;
	int addr = mv88e6xxx_port_to_mdio_addr(chip, port);
3357 3358 3359
	int ret;

	if (addr < 0)
3360
		return 0xffff;
3361

3362
	mutex_lock(&chip->reg_lock);
3363

3364 3365 3366 3367
	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);
3368
	else
3369
		ret = mv88e6xxx_mdio_write_direct(chip, addr, regnum, val);
3370

3371
	mutex_unlock(&chip->reg_lock);
3372 3373 3374
	return ret;
}

3375
static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
3376 3377 3378 3379 3380 3381
				   struct device_node *np)
{
	static int index;
	struct mii_bus *bus;
	int err;

3382 3383
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
		mv88e6xxx_ppu_state_init(chip);
3384 3385

	if (np)
3386
		chip->mdio_np = of_get_child_by_name(np, "mdio");
3387

3388
	bus = devm_mdiobus_alloc(chip->dev);
3389 3390 3391
	if (!bus)
		return -ENOMEM;

3392
	bus->priv = (void *)chip;
3393 3394 3395 3396 3397 3398 3399 3400 3401 3402
	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;
3403
	bus->parent = chip->dev;
3404

3405 3406
	if (chip->mdio_np)
		err = of_mdiobus_register(bus, chip->mdio_np);
3407 3408 3409
	else
		err = mdiobus_register(bus);
	if (err) {
3410
		dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
3411 3412
		goto out;
	}
3413
	chip->mdio_bus = bus;
3414 3415 3416 3417

	return 0;

out:
3418 3419
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3420 3421 3422 3423

	return err;
}

3424
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3425 3426

{
3427
	struct mii_bus *bus = chip->mdio_bus;
3428 3429 3430

	mdiobus_unregister(bus);

3431 3432
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3433 3434
}

3435 3436 3437 3438
#ifdef CONFIG_NET_DSA_HWMON

static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
{
3439
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3440 3441 3442 3443 3444
	int ret;
	int val;

	*temp = 0;

3445
	mutex_lock(&chip->reg_lock);
3446

3447
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x6);
3448 3449 3450 3451
	if (ret < 0)
		goto error;

	/* Enable temperature sensor */
3452
	ret = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a);
3453 3454 3455
	if (ret < 0)
		goto error;

3456
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret | (1 << 5));
3457 3458 3459 3460 3461 3462
	if (ret < 0)
		goto error;

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

3463
	val = mv88e6xxx_mdio_read_direct(chip, 0x0, 0x1a);
3464 3465 3466 3467 3468 3469
	if (val < 0) {
		ret = val;
		goto error;
	}

	/* Disable temperature sensor */
3470
	ret = mv88e6xxx_mdio_write_direct(chip, 0x0, 0x1a, ret & ~(1 << 5));
3471 3472 3473 3474 3475 3476
	if (ret < 0)
		goto error;

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

error:
3477 3478
	mv88e6xxx_mdio_write_direct(chip, 0x0, 0x16, 0x0);
	mutex_unlock(&chip->reg_lock);
3479 3480 3481 3482 3483
	return ret;
}

static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
{
3484 3485
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3486 3487 3488 3489
	int ret;

	*temp = 0;

3490
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 27);
3491 3492 3493 3494 3495 3496 3497 3498
	if (ret < 0)
		return ret;

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

	return 0;
}

3499
static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
3500
{
3501
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3502

3503
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3504 3505
		return -EOPNOTSUPP;

3506
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
3507 3508 3509 3510 3511
		return mv88e63xx_get_temp(ds, temp);

	return mv88e61xx_get_temp(ds, temp);
}

3512
static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3513
{
3514 3515
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3516 3517
	int ret;

3518
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3519 3520 3521 3522
		return -EOPNOTSUPP;

	*temp = 0;

3523
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3524 3525 3526 3527 3528 3529 3530 3531
	if (ret < 0)
		return ret;

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

	return 0;
}

3532
static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3533
{
3534 3535
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3536 3537
	int ret;

3538
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3539 3540
		return -EOPNOTSUPP;

3541
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3542 3543 3544
	if (ret < 0)
		return ret;
	temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3545 3546
	return mv88e6xxx_mdio_page_write(ds, phy, 6, 26,
					 (ret & 0xe0ff) | (temp << 8));
3547 3548
}

3549
static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3550
{
3551 3552
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3553 3554
	int ret;

3555
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3556 3557 3558 3559
		return -EOPNOTSUPP;

	*alarm = false;

3560
	ret = mv88e6xxx_mdio_page_read(ds, phy, 6, 26);
3561 3562 3563 3564 3565 3566 3567 3568 3569
	if (ret < 0)
		return ret;

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

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

3570 3571 3572 3573 3574 3575 3576
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,
3577
		.port_base_addr = 0x10,
3578 3579 3580 3581 3582 3583 3584 3585 3586
		.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,
3587
		.port_base_addr = 0x10,
3588 3589 3590 3591 3592 3593 3594 3595 3596
		.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,
3597
		.port_base_addr = 0x10,
3598 3599 3600 3601 3602 3603 3604 3605 3606
		.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,
3607
		.port_base_addr = 0x10,
3608 3609 3610 3611 3612 3613 3614 3615 3616
		.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,
3617
		.port_base_addr = 0x10,
3618 3619 3620 3621 3622 3623 3624 3625 3626
		.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,
3627
		.port_base_addr = 0x10,
3628 3629 3630 3631 3632 3633 3634 3635 3636
		.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,
3637
		.port_base_addr = 0x10,
3638 3639 3640 3641 3642 3643 3644 3645 3646
		.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,
3647
		.port_base_addr = 0x10,
3648 3649 3650 3651 3652 3653 3654 3655 3656
		.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,
3657
		.port_base_addr = 0x10,
3658 3659 3660 3661 3662 3663 3664 3665 3666
		.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,
3667
		.port_base_addr = 0x10,
3668 3669 3670 3671 3672 3673 3674 3675 3676
		.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,
3677
		.port_base_addr = 0x10,
3678 3679 3680 3681 3682 3683 3684 3685 3686
		.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,
3687
		.port_base_addr = 0x10,
3688 3689 3690 3691 3692 3693 3694 3695 3696
		.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,
3697
		.port_base_addr = 0x10,
3698 3699 3700 3701 3702 3703 3704 3705 3706
		.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,
3707
		.port_base_addr = 0x10,
3708 3709 3710 3711 3712 3713 3714 3715 3716
		.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,
3717
		.port_base_addr = 0x10,
3718 3719 3720 3721 3722 3723 3724 3725 3726
		.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,
3727
		.port_base_addr = 0x10,
3728 3729 3730 3731 3732 3733 3734 3735 3736
		.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,
3737
		.port_base_addr = 0x10,
3738 3739 3740 3741
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},
};

3742
static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
3743
{
3744
	int i;
3745

3746 3747 3748
	for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
		if (mv88e6xxx_table[i].prod_num == prod_num)
			return &mv88e6xxx_table[i];
3749 3750 3751 3752

	return NULL;
}

3753
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3754 3755 3756 3757
{
	const struct mv88e6xxx_info *info;
	int id, prod_num, rev;

3758 3759
	id = mv88e6xxx_reg_read(chip, chip->info->port_base_addr,
				PORT_SWITCH_ID);
3760 3761 3762 3763 3764 3765 3766 3767 3768 3769
	if (id < 0)
		return id;

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

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

3770
	/* Update the compatible info with the probed one */
3771
	chip->info = info;
3772

3773 3774
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3775 3776 3777 3778

	return 0;
}

3779
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3780
{
3781
	struct mv88e6xxx_chip *chip;
3782

3783 3784
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3785 3786
		return NULL;

3787
	chip->dev = dev;
3788

3789
	mutex_init(&chip->reg_lock);
3790

3791
	return chip;
3792 3793
}

3794
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3795 3796 3797 3798 3799 3800
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3801
	if (sw_addr == 0)
3802 3803 3804
		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;
3805 3806 3807
	else
		return -EINVAL;

3808 3809
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3810 3811 3812 3813

	return 0;
}

3814 3815 3816
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3817
{
3818
	struct mv88e6xxx_chip *chip;
3819
	struct mii_bus *bus;
3820
	int err;
3821

3822
	bus = dsa_host_dev_to_mii_bus(host_dev);
3823 3824 3825
	if (!bus)
		return NULL;

3826 3827
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3828 3829
		return NULL;

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

3833
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3834 3835 3836
	if (err)
		goto free;

3837
	err = mv88e6xxx_detect(chip);
3838
	if (err)
3839
		goto free;
3840

3841
	err = mv88e6xxx_mdio_register(chip, NULL);
3842
	if (err)
3843
		goto free;
3844

3845
	*priv = chip;
3846

3847
	return chip->info->name;
3848
free:
3849
	devm_kfree(dsa_dev, chip);
3850 3851

	return NULL;
3852 3853
}

3854
static struct dsa_switch_driver mv88e6xxx_switch_driver = {
3855
	.tag_protocol		= DSA_TAG_PROTO_EDSA,
3856
	.probe			= mv88e6xxx_drv_probe,
3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870
	.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
3871
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
	.get_regs_len		= mv88e6xxx_get_regs_len,
	.get_regs		= mv88e6xxx_get_regs,
	.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,
};

3890
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
3891 3892
				     struct device_node *np)
{
3893
	struct device *dev = chip->dev;
3894 3895 3896 3897 3898 3899 3900
	struct dsa_switch *ds;

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

	ds->dev = dev;
3901
	ds->priv = chip;
3902 3903 3904 3905 3906 3907 3908
	ds->drv = &mv88e6xxx_switch_driver;

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

3909
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
3910
{
3911
	dsa_unregister_switch(chip->ds);
3912 3913
}

3914
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
3915
{
3916
	struct device *dev = &mdiodev->dev;
3917
	struct device_node *np = dev->of_node;
3918
	const struct mv88e6xxx_info *compat_info;
3919
	struct mv88e6xxx_chip *chip;
3920
	u32 eeprom_len;
3921
	int err;
3922

3923 3924 3925 3926
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

3927 3928
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
3929 3930
		return -ENOMEM;

3931
	chip->info = compat_info;
3932

3933
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
3934 3935
	if (err)
		return err;
3936

3937
	err = mv88e6xxx_detect(chip);
3938 3939
	if (err)
		return err;
3940

3941 3942 3943
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
3944

3945
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEPROM) &&
3946
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
3947
		chip->eeprom_len = eeprom_len;
3948

3949
	err = mv88e6xxx_mdio_register(chip, np);
3950 3951 3952
	if (err)
		return err;

3953
	err = mv88e6xxx_register_switch(chip, np);
3954
	if (err) {
3955
		mv88e6xxx_mdio_unregister(chip);
3956 3957 3958
		return err;
	}

3959 3960
	return 0;
}
3961 3962 3963 3964

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

3967 3968
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
3969 3970 3971
}

static const struct of_device_id mv88e6xxx_of_match[] = {
3972 3973 3974 3975
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994
	{ /* 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);
}
3995 3996 3997 3998
module_init(mv88e6xxx_init);

static void __exit mv88e6xxx_cleanup(void)
{
3999
	mdio_driver_unregister(&mv88e6xxx_driver);
4000
	unregister_switch_driver(&mv88e6xxx_switch_driver);
4001 4002
}
module_exit(mv88e6xxx_cleanup);
4003 4004 4005 4006

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