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

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

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

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

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

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

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

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

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

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

	*val = ret & 0xffff;

	return 0;
}

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

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

	return 0;
}

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

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

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

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

	return -ETIMEDOUT;
}

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

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

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

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

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

146
	*val = ret & 0xffff;
147

148
	return 0;
149 150
}

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

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

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

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

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

	return 0;
}

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

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

190
	assert_reg_lock(chip);
191

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

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

	return 0;
}

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

207
	assert_reg_lock(chip);
208

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

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

216 217 218
	return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

	return err;
}

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

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

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

	return err;
}

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

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

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

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

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

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

		usleep_range(1000, 2000);
	}

	return -ETIMEDOUT;
}

331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
/* 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);
}

357
static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
358 359 360 361
{
	u16 val;
	int err;

362
	err = mv88e6xxx_read(chip, addr, reg, &val);
363 364 365 366 367 368
	if (err)
		return err;

	return val;
}

369
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
370 371
				int reg, u16 val)
{
372
	return mv88e6xxx_write(chip, addr, reg, val);
373 374
}

375
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
376 377
{
	int ret;
378
	int i;
379

380
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
381 382 383
	if (ret < 0)
		return ret;

384
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
385
				   ret & ~GLOBAL_CONTROL_PPU_ENABLE);
386 387
	if (ret)
		return ret;
388

389
	for (i = 0; i < 16; i++) {
390
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
391 392 393
		if (ret < 0)
			return ret;

394
		usleep_range(1000, 2000);
395 396
		if ((ret & GLOBAL_STATUS_PPU_MASK) !=
		    GLOBAL_STATUS_PPU_POLLING)
397
			return 0;
398 399 400 401 402
	}

	return -ETIMEDOUT;
}

403
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
404
{
405
	int ret, err, i;
406

407
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
408 409 410
	if (ret < 0)
		return ret;

411
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
412
				   ret | GLOBAL_CONTROL_PPU_ENABLE);
413 414
	if (err)
		return err;
415

416
	for (i = 0; i < 16; i++) {
417
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
418 419 420
		if (ret < 0)
			return ret;

421
		usleep_range(1000, 2000);
422 423
		if ((ret & GLOBAL_STATUS_PPU_MASK) ==
		    GLOBAL_STATUS_PPU_POLLING)
424
			return 0;
425 426 427 428 429 430 431
	}

	return -ETIMEDOUT;
}

static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
{
432
	struct mv88e6xxx_chip *chip;
433

434
	chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
435

436
	mutex_lock(&chip->reg_lock);
437

438 439 440 441
	if (mutex_trylock(&chip->ppu_mutex)) {
		if (mv88e6xxx_ppu_enable(chip) == 0)
			chip->ppu_disabled = 0;
		mutex_unlock(&chip->ppu_mutex);
442
	}
443

444
	mutex_unlock(&chip->reg_lock);
445 446 447 448
}

static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
{
449
	struct mv88e6xxx_chip *chip = (void *)_ps;
450

451
	schedule_work(&chip->ppu_work);
452 453
}

454
static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
455 456 457
{
	int ret;

458
	mutex_lock(&chip->ppu_mutex);
459

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

	return ret;
}

480
static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
481
{
482
	/* Schedule a timer to re-enable the PHY polling unit. */
483 484
	mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
	mutex_unlock(&chip->ppu_mutex);
485 486
}

487
static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
488
{
489 490 491 492 493
	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;
494 495
}

496 497
static int mv88e6xxx_phy_ppu_read(struct mv88e6xxx_chip *chip, int addr,
				  int reg, u16 *val)
498
{
499
	int err;
500

501 502 503
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_read(chip, addr, reg, val);
504
		mv88e6xxx_ppu_access_put(chip);
505 506
	}

507
	return err;
508 509
}

510 511
static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
				   int reg, u16 val)
512
{
513
	int err;
514

515 516 517
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_write(chip, addr, reg, val);
518
		mv88e6xxx_ppu_access_put(chip);
519 520
	}

521
	return err;
522 523
}

524 525 526 527 528
static const struct mv88e6xxx_ops mv88e6xxx_phy_ppu_ops = {
	.read = mv88e6xxx_phy_ppu_read,
	.write = mv88e6xxx_phy_ppu_write,
};

529
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
530
{
531
	return chip->info->family == MV88E6XXX_FAMILY_6065;
532 533
}

534
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
535
{
536
	return chip->info->family == MV88E6XXX_FAMILY_6095;
537 538
}

539
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
540
{
541
	return chip->info->family == MV88E6XXX_FAMILY_6097;
542 543
}

544
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
545
{
546
	return chip->info->family == MV88E6XXX_FAMILY_6165;
547 548
}

549
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
550
{
551
	return chip->info->family == MV88E6XXX_FAMILY_6185;
552 553
}

554
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
555
{
556
	return chip->info->family == MV88E6XXX_FAMILY_6320;
557 558
}

559
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
560
{
561
	return chip->info->family == MV88E6XXX_FAMILY_6351;
562 563
}

564
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
565
{
566
	return chip->info->family == MV88E6XXX_FAMILY_6352;
567 568
}

569
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
570
{
571
	return chip->info->num_databases;
572 573
}

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

	return false;
}

584 585 586 587
/* 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.
 */
588 589
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
590
{
591
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
592 593
	u32 reg;
	int ret;
594 595 596 597

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

598
	mutex_lock(&chip->reg_lock);
599

600
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
601 602 603 604 605 606 607 608 609 610 611
	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)
612
		reg |= PORT_PCS_CTRL_LINK_UP;
613

614
	if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
		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;

636 637
	if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
	    (port >= chip->info->num_ports - 2)) {
638 639 640 641 642 643 644 645
		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);
	}
646
	_mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
647 648

out:
649
	mutex_unlock(&chip->reg_lock);
650 651
}

652
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
653 654 655 656 657
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
658
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
659
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
660 661 662 663 664 665
			return 0;
	}

	return -ETIMEDOUT;
}

666
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
667 668 669
{
	int ret;

670
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
671 672
		port = (port + 1) << 5;

673
	/* Snapshot the hardware statistics counters for this port. */
674
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
675 676 677 678
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
679

680
	/* Wait for the snapshotting to complete. */
681
	ret = _mv88e6xxx_stats_wait(chip);
682 683 684 685 686 687
	if (ret < 0)
		return ret;

	return 0;
}

688
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
689
				  int stat, u32 *val)
690 691 692 693 694 695
{
	u32 _val;
	int ret;

	*val = 0;

696
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
697 698
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
699 700 701
	if (ret < 0)
		return;

702
	ret = _mv88e6xxx_stats_wait(chip);
703 704 705
	if (ret < 0)
		return;

706
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
707 708 709 710 711
	if (ret < 0)
		return;

	_val = ret << 16;

712
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
713 714 715 716 717 718
	if (ret < 0)
		return;

	*val = _val | ret;
}

719
static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778
	{ "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, },
779 780
};

781
static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
782
			       struct mv88e6xxx_hw_stat *stat)
783
{
784 785
	switch (stat->type) {
	case BANK0:
786
		return true;
787
	case BANK1:
788
		return mv88e6xxx_6320_family(chip);
789
	case PORT:
790 791 792 793 794 795
		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);
796
	}
797
	return false;
798 799
}

800
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
801
					    struct mv88e6xxx_hw_stat *s,
802 803 804 805 806 807 808
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

809 810
	switch (s->type) {
	case PORT:
811
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
812 813 814 815 816
		if (ret < 0)
			return UINT64_MAX;

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

834 835
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
836
{
837
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
838 839
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
840

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

851
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
852
{
853
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
854 855 856 857 858
	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];
859
		if (mv88e6xxx_has_stat(chip, stat))
860 861 862
			j++;
	}
	return j;
863 864
}

865 866
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
867
{
868
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
869 870 871 872
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

873
	mutex_lock(&chip->reg_lock);
874

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

888
	mutex_unlock(&chip->reg_lock);
889 890
}

891
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
892 893 894 895
{
	return 32 * sizeof(u16);
}

896 897
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
898
{
899
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
900 901 902 903 904 905 906
	u16 *p = _p;
	int i;

	regs->version = 0;

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

907
	mutex_lock(&chip->reg_lock);
908

909 910 911
	for (i = 0; i < 32; i++) {
		int ret;

912
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
913 914 915
		if (ret >= 0)
			p[i] = ret;
	}
916

917
	mutex_unlock(&chip->reg_lock);
918 919
}

920
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
921
{
922 923
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
			      GLOBAL_ATU_OP_BUSY);
924 925
}

926 927
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
928
{
929
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
930 931
	u16 reg;
	int err;
932

933
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
934 935
		return -EOPNOTSUPP;

936
	mutex_lock(&chip->reg_lock);
937

938 939
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
940
		goto out;
941 942 943 944

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

945 946
	err = mv88e6xxx_read(chip, REG_PORT(port), PORT_STATUS, &reg);
	if (err)
947
		goto out;
948

949
	e->eee_active = !!(reg & PORT_STATUS_EEE);
950
out:
951
	mutex_unlock(&chip->reg_lock);
952 953

	return err;
954 955
}

956 957
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
958
{
959
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
960 961
	u16 reg;
	int err;
962

963
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
964 965
		return -EOPNOTSUPP;

966
	mutex_lock(&chip->reg_lock);
967

968 969
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
970 971
		goto out;

972
	reg &= ~0x0300;
973 974 975 976 977
	if (e->eee_enabled)
		reg |= 0x0200;
	if (e->tx_lpi_enabled)
		reg |= 0x0100;

978
	err = mv88e6xxx_phy_write(chip, port, 16, reg);
979
out:
980
	mutex_unlock(&chip->reg_lock);
981

982
	return err;
983 984
}

985
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
986 987 988
{
	int ret;

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

1000
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
1001 1002 1003 1004 1005 1006 1007
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

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

1010
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
1011 1012 1013
	if (ret < 0)
		return ret;

1014
	return _mv88e6xxx_atu_wait(chip);
1015 1016
}

1017
static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
				     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;
	}

1037
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1038 1039
}

1040
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1041 1042
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1043
{
1044 1045
	int op;
	int err;
1046

1047
	err = _mv88e6xxx_atu_wait(chip);
1048 1049
	if (err)
		return err;
1050

1051
	err = _mv88e6xxx_atu_data_write(chip, entry);
1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
	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;
	}

1063
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1064 1065
}

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

1074
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1075 1076
}

1077
static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
1078
			       int from_port, int to_port, bool static_too)
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
{
	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;

1092
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1093 1094
}

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

1102 1103 1104 1105 1106 1107 1108
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",
};

1109
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1110
				 u8 state)
1111
{
1112
	struct dsa_switch *ds = chip->ds;
1113
	int reg, ret = 0;
1114 1115
	u8 oldstate;

1116
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1117 1118
	if (reg < 0)
		return reg;
1119

1120
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1121

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

1136
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1137
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1138
					   reg);
1139 1140 1141
		if (ret)
			return ret;

1142
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1143 1144
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1145 1146 1147 1148 1149
	}

	return ret;
}

1150
static int _mv88e6xxx_port_based_vlan_map(struct mv88e6xxx_chip *chip, int port)
1151
{
1152 1153 1154
	struct net_device *bridge = chip->ports[port].bridge_dev;
	const u16 mask = (1 << chip->info->num_ports) - 1;
	struct dsa_switch *ds = chip->ds;
1155
	u16 output_ports = 0;
1156
	int reg;
1157 1158 1159 1160 1161 1162
	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 {
1163
		for (i = 0; i < chip->info->num_ports; ++i) {
1164
			/* allow sending frames to every group member */
1165
			if (bridge && chip->ports[i].bridge_dev == bridge)
1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
				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);
1176

1177
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1178 1179
	if (reg < 0)
		return reg;
1180

1181 1182
	reg &= ~mask;
	reg |= output_ports & mask;
1183

1184
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1185 1186
}

1187 1188
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1189
{
1190
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1191
	int stp_state;
1192
	int err;
1193 1194 1195

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

1211 1212 1213
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1214 1215

	if (err)
1216 1217
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1218
			   mv88e6xxx_port_state_names[stp_state]);
1219 1220
}

1221
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1222
				u16 *new, u16 *old)
1223
{
1224
	struct dsa_switch *ds = chip->ds;
1225
	u16 pvid;
1226 1227
	int ret;

1228
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1229 1230 1231
	if (ret < 0)
		return ret;

1232 1233 1234 1235 1236 1237
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1238
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1239 1240 1241 1242
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1243 1244
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1245 1246 1247 1248
	}

	if (old)
		*old = pvid;
1249 1250 1251 1252

	return 0;
}

1253
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1254
				    int port, u16 *pvid)
1255
{
1256
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1257 1258
}

1259
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1260
				    int port, u16 pvid)
1261
{
1262
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1263 1264
}

1265
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1266
{
1267 1268
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
			      GLOBAL_VTU_OP_BUSY);
1269 1270
}

1271
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1272 1273 1274
{
	int ret;

1275
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1276 1277 1278
	if (ret < 0)
		return ret;

1279
	return _mv88e6xxx_vtu_wait(chip);
1280 1281
}

1282
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1283 1284 1285
{
	int ret;

1286
	ret = _mv88e6xxx_vtu_wait(chip);
1287 1288 1289
	if (ret < 0)
		return ret;

1290
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1291 1292
}

1293
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1294 1295 1296 1297 1298 1299 1300 1301
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1302
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1303 1304 1305 1306 1307 1308 1309
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1310
	for (i = 0; i < chip->info->num_ports; ++i) {
1311 1312 1313 1314 1315 1316 1317 1318 1319
		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;
}

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

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

1332
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1333 1334 1335 1336 1337 1338 1339
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

1340
	for (i = 0; i < chip->info->num_ports; ++i) {
1341 1342 1343 1344 1345 1346 1347
		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) {
1348
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
1349 1350 1351 1352 1353 1354 1355 1356
					   GLOBAL_VTU_DATA_0_3 + i, regs[i]);
		if (ret < 0)
			return ret;
	}

	return 0;
}

1357
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1358 1359
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1360
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1361 1362
}

1363
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1364 1365
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1366
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1367 1368
}

1369
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1370
{
1371
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1372 1373 1374
				    vid & GLOBAL_VTU_VID_MASK);
}

1375
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1376 1377 1378 1379 1380
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1381
	ret = _mv88e6xxx_vtu_wait(chip);
1382 1383 1384
	if (ret < 0)
		return ret;

1385
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1386 1387 1388
	if (ret < 0)
		return ret;

1389
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1390 1391 1392 1393 1394 1395 1396
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1397
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1398 1399 1400
		if (ret < 0)
			return ret;

1401 1402
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1403 1404 1405 1406 1407
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

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

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

1421 1422
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1435 1436 1437
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1438
{
1439
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1440 1441 1442 1443
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1444
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1445 1446
		return -EOPNOTSUPP;

1447
	mutex_lock(&chip->reg_lock);
1448

1449
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1450 1451 1452
	if (err)
		goto unlock;

1453
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1454 1455 1456 1457
	if (err)
		goto unlock;

	do {
1458
		err = _mv88e6xxx_vtu_getnext(chip, &next);
1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
		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 */
1469 1470
		vlan->vid_begin = next.vid;
		vlan->vid_end = next.vid;
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
		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:
1485
	mutex_unlock(&chip->reg_lock);
1486 1487 1488 1489

	return err;
}

1490
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1491 1492
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1493
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1494 1495 1496
	u16 reg = 0;
	int ret;

1497
	ret = _mv88e6xxx_vtu_wait(chip);
1498 1499 1500 1501 1502 1503 1504
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1505
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1506 1507 1508
	if (ret < 0)
		return ret;

1509
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1510
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1511 1512
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1513 1514
		if (ret < 0)
			return ret;
1515
	}
1516

1517
	if (mv88e6xxx_has_fid_reg(chip)) {
1518
		reg = entry->fid & GLOBAL_VTU_FID_MASK;
1519 1520
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
					   reg);
1521 1522
		if (ret < 0)
			return ret;
1523
	} else if (mv88e6xxx_num_databases(chip) == 256) {
1524 1525 1526 1527 1528
		/* 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;
1529 1530 1531 1532 1533
	}

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1534
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1535 1536 1537
	if (ret < 0)
		return ret;

1538
	return _mv88e6xxx_vtu_cmd(chip, op);
1539 1540
}

1541
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1542 1543 1544 1545 1546
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1547
	ret = _mv88e6xxx_vtu_wait(chip);
1548 1549 1550
	if (ret < 0)
		return ret;

1551
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1552 1553 1554 1555
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1556
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1557 1558 1559
	if (ret < 0)
		return ret;

1560
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1561 1562 1563 1564 1565
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1566
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1567 1568 1569 1570 1571 1572
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1573
		ret = mv88e6xxx_stu_data_read(chip, &next);
1574 1575 1576 1577 1578 1579 1580 1581
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1582
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1583 1584 1585 1586 1587
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1588
	ret = _mv88e6xxx_vtu_wait(chip);
1589 1590 1591 1592 1593 1594 1595
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1596
	ret = mv88e6xxx_stu_data_write(chip, entry);
1597 1598 1599 1600 1601
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1602
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1603 1604 1605 1606
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1607
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1608 1609 1610
	if (ret < 0)
		return ret;

1611
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1612 1613
}

1614
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1615
			       u16 *new, u16 *old)
1616
{
1617
	struct dsa_switch *ds = chip->ds;
1618
	u16 upper_mask;
1619 1620 1621
	u16 fid;
	int ret;

1622
	if (mv88e6xxx_num_databases(chip) == 4096)
1623
		upper_mask = 0xff;
1624
	else if (mv88e6xxx_num_databases(chip) == 256)
1625
		upper_mask = 0xf;
1626 1627 1628
	else
		return -EOPNOTSUPP;

1629
	/* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
1630
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1631 1632 1633 1634 1635 1636 1637 1638 1639
	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;

1640
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1641 1642 1643 1644 1645 1646
					   ret);
		if (ret < 0)
			return ret;
	}

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

1651
	fid |= (ret & upper_mask) << 4;
1652 1653

	if (new) {
1654 1655
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1656

1657
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1658 1659 1660 1661
					   ret);
		if (ret < 0)
			return ret;

1662 1663
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1664 1665 1666 1667 1668 1669 1670 1671
	}

	if (old)
		*old = fid;

	return 0;
}

1672
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1673
				   int port, u16 *fid)
1674
{
1675
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1676 1677
}

1678
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1679
				   int port, u16 fid)
1680
{
1681
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1682 1683
}

1684
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1685 1686 1687
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1688
	int i, err;
1689 1690 1691

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

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

		set_bit(*fid, fid_bitmap);
	}

1701
	/* Set every FID bit used by the VLAN entries */
1702
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1703 1704 1705 1706
	if (err)
		return err;

	do {
1707
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
		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);
1721
	if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
1722 1723 1724
		return -ENOSPC;

	/* Clear the database */
1725
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1726 1727
}

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

1738
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1739 1740
	if (err)
		return err;
1741

1742
	/* exclude all ports except the CPU and DSA ports */
1743
	for (i = 0; i < chip->info->num_ports; ++i)
1744 1745 1746
		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;
1747

1748 1749
	if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
	    mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
1750 1751 1752 1753 1754 1755 1756
		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;
1757
		err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
1758 1759 1760 1761 1762 1763 1764 1765
		if (err)
			return err;

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

1766
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1767 1768 1769 1770 1771 1772 1773 1774 1775
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

1776
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
1777 1778 1779 1780 1781 1782 1783
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

1784
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1785 1786 1787
	if (err)
		return err;

1788
	err = _mv88e6xxx_vtu_getnext(chip, entry);
1789 1790 1791 1792 1793 1794 1795 1796 1797 1798
	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.
		 */

1799
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1800 1801 1802 1803 1804
	}

	return err;
}

1805 1806 1807
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
1808
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1809 1810 1811 1812 1813 1814
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

1815
	mutex_lock(&chip->reg_lock);
1816

1817
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1818 1819 1820 1821
	if (err)
		goto unlock;

	do {
1822
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1823 1824 1825 1826 1827 1828 1829 1830 1831
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

1832
		for (i = 0; i < chip->info->num_ports; ++i) {
1833 1834 1835 1836 1837 1838 1839
			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;

1840 1841
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
1842 1843
				break; /* same bridge, check next VLAN */

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

unlock:
1854
	mutex_unlock(&chip->reg_lock);
1855 1856 1857 1858

	return err;
}

1859 1860 1861 1862 1863 1864 1865
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",
};

1866 1867
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
1868
{
1869
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1870 1871 1872 1873
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

1874
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1875 1876
		return -EOPNOTSUPP;

1877
	mutex_lock(&chip->reg_lock);
1878

1879
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1880 1881 1882 1883 1884
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1885 1886 1887
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1888

1889
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1890 1891 1892 1893
					   ret);
		if (ret < 0)
			goto unlock;

1894
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
1895 1896 1897
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
1898

1899
	ret = 0;
1900
unlock:
1901
	mutex_unlock(&chip->reg_lock);
1902 1903 1904 1905

	return ret;
}

1906 1907 1908 1909
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
1910
{
1911
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1912 1913
	int err;

1914
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1915 1916
		return -EOPNOTSUPP;

1917 1918 1919 1920 1921 1922 1923 1924
	/* 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;

1925 1926 1927 1928 1929 1930
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

1931
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1932
				    u16 vid, bool untagged)
1933 1934 1935 1936
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1937
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1938
	if (err)
1939
		return err;
1940 1941 1942 1943 1944

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

1945
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1946 1947
}

1948 1949 1950
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
1951
{
1952
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
1953 1954 1955 1956
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

1957
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1958 1959
		return;

1960
	mutex_lock(&chip->reg_lock);
1961

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

1968
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
1969
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
1970
			   vlan->vid_end);
1971

1972
	mutex_unlock(&chip->reg_lock);
1973 1974
}

1975
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
1976
				    int port, u16 vid)
1977
{
1978
	struct dsa_switch *ds = chip->ds;
1979 1980 1981
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

1982
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1983
	if (err)
1984
		return err;
1985

1986 1987
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
1988
		return -EOPNOTSUPP;
1989 1990 1991 1992

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

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

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1999
			vlan.valid = true;
2000 2001 2002 2003
			break;
		}
	}

2004
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
2005 2006 2007
	if (err)
		return err;

2008
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
2009 2010
}

2011 2012
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
2013
{
2014
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2015 2016 2017
	u16 pvid, vid;
	int err = 0;

2018
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2019 2020
		return -EOPNOTSUPP;

2021
	mutex_lock(&chip->reg_lock);
2022

2023
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
2024 2025 2026
	if (err)
		goto unlock;

2027
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
2028
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
2029 2030 2031 2032
		if (err)
			goto unlock;

		if (vid == pvid) {
2033
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2034 2035 2036 2037 2038
			if (err)
				goto unlock;
		}
	}

2039
unlock:
2040
	mutex_unlock(&chip->reg_lock);
2041 2042 2043 2044

	return err;
}

2045
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2046
				    const unsigned char *addr)
2047 2048 2049 2050
{
	int i, ret;

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

	return 0;
}

2061
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2062
				   unsigned char *addr)
2063 2064 2065 2066
{
	int i, ret;

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

	return 0;
}

2078
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2079
			       struct mv88e6xxx_atu_entry *entry)
2080
{
2081 2082
	int ret;

2083
	ret = _mv88e6xxx_atu_wait(chip);
2084 2085 2086
	if (ret < 0)
		return ret;

2087
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2088 2089 2090
	if (ret < 0)
		return ret;

2091
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2092
	if (ret < 0)
2093 2094
		return ret;

2095
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2096
}
2097

2098
static int _mv88e6xxx_port_fdb_load(struct mv88e6xxx_chip *chip, int port,
2099 2100 2101 2102
				    const unsigned char *addr, u16 vid,
				    u8 state)
{
	struct mv88e6xxx_atu_entry entry = { 0 };
2103 2104 2105
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

2106 2107
	/* Null VLAN ID corresponds to the port private database */
	if (vid == 0)
2108
		err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
2109
	else
2110
		err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
2111 2112
	if (err)
		return err;
2113

2114
	entry.fid = vlan.fid;
2115 2116 2117 2118 2119 2120 2121
	entry.state = state;
	ether_addr_copy(entry.mac, addr);
	if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.trunk = false;
		entry.portv_trunkid = BIT(port);
	}

2122
	return _mv88e6xxx_atu_load(chip, &entry);
2123 2124
}

2125 2126 2127
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 已提交
2128 2129 2130 2131 2132 2133 2134
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

2135 2136 2137
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2138
{
2139
	int state = is_multicast_ether_addr(fdb->addr) ?
2140 2141
		GLOBAL_ATU_DATA_STATE_MC_STATIC :
		GLOBAL_ATU_DATA_STATE_UC_STATIC;
2142
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2143

2144 2145
	mutex_lock(&chip->reg_lock);
	if (_mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid, state))
2146 2147
		netdev_err(ds->ports[port].netdev,
			   "failed to load MAC address\n");
2148
	mutex_unlock(&chip->reg_lock);
2149 2150
}

2151 2152
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2153
{
2154
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2155 2156
	int ret;

2157 2158
	mutex_lock(&chip->reg_lock);
	ret = _mv88e6xxx_port_fdb_load(chip, port, fdb->addr, fdb->vid,
2159
				       GLOBAL_ATU_DATA_STATE_UNUSED);
2160
	mutex_unlock(&chip->reg_lock);
2161 2162 2163 2164

	return ret;
}

2165
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2166
				  struct mv88e6xxx_atu_entry *entry)
2167
{
2168 2169 2170 2171
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2172

2173
	ret = _mv88e6xxx_atu_wait(chip);
2174 2175
	if (ret < 0)
		return ret;
2176

2177
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2178 2179
	if (ret < 0)
		return ret;
2180

2181
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2182 2183
	if (ret < 0)
		return ret;
2184

2185
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2186 2187
	if (ret < 0)
		return ret;
2188

2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204
	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;
	}
2205

2206
	*entry = next;
2207 2208 2209
	return 0;
}

2210
static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2211
					u16 fid, u16 vid, int port,
2212 2213 2214 2215 2216 2217 2218 2219
					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;

2220
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2221 2222 2223 2224
	if (err)
		return err;

	do {
2225
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250
		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;
}

2251 2252 2253
static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
2254
{
2255
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2256 2257 2258
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2259
	u16 fid;
2260 2261
	int err;

2262
	mutex_lock(&chip->reg_lock);
2263

2264
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2265
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2266 2267 2268
	if (err)
		goto unlock;

2269
	err = _mv88e6xxx_port_fdb_dump_one(chip, fid, 0, port, fdb, cb);
2270 2271 2272
	if (err)
		goto unlock;

2273
	/* Dump VLANs' Filtering Information Databases */
2274
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2275 2276 2277 2278
	if (err)
		goto unlock;

	do {
2279
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2280
		if (err)
2281
			break;
2282 2283 2284 2285

		if (!vlan.valid)
			break;

2286 2287
		err = _mv88e6xxx_port_fdb_dump_one(chip, vlan.fid, vlan.vid,
						   port, fdb, cb);
2288
		if (err)
2289
			break;
2290 2291 2292
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

unlock:
2293
	mutex_unlock(&chip->reg_lock);
2294 2295 2296 2297

	return err;
}

2298 2299
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2300
{
2301
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
2302
	int i, err = 0;
2303

2304
	mutex_lock(&chip->reg_lock);
2305

2306
	/* Assign the bridge and remap each port's VLANTable */
2307
	chip->ports[port].bridge_dev = bridge;
2308

2309 2310 2311
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2312 2313 2314 2315 2316
			if (err)
				break;
		}
	}

2317
	mutex_unlock(&chip->reg_lock);
2318

2319
	return err;
2320 2321
}

2322
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2323
{
2324 2325
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	struct net_device *bridge = chip->ports[port].bridge_dev;
2326
	int i;
2327

2328
	mutex_lock(&chip->reg_lock);
2329

2330
	/* Unassign the bridge and remap each port's VLANTable */
2331
	chip->ports[port].bridge_dev = NULL;
2332

2333 2334 2335
	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))
2336 2337
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2338

2339
	mutex_unlock(&chip->reg_lock);
2340 2341
}

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

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

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

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

2404
static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
2405
{
2406 2407
	u16 val;
	int err;
2408

2409 2410 2411 2412
	/* Clear Power Down bit */
	err = mv88e6xxx_serdes_read(chip, MII_BMCR, &val);
	if (err)
		return err;
2413

2414 2415 2416
	if (val & BMCR_PDOWN) {
		val &= ~BMCR_PDOWN;
		err = mv88e6xxx_serdes_write(chip, MII_BMCR, val);
2417 2418
	}

2419
	return err;
2420 2421
}

2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432
static int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port,
			       int reg, u16 *val)
{
	int addr = chip->info->port_base_addr + port;

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

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

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

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

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

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

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

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

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

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

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

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

2583
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2584

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

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722
static int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
{
	int err;

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

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

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

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

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

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

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

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

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

2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762
static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
				     unsigned int ageing_time)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

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

	return err;
}

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

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

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

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

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

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

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

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

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

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

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

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

2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898
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;
}

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

	if (hask)
		val |= GLOBAL2_TRUNK_MASK_HASK;

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

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

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

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

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

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

	return 0;
}

2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955
static int mv88e6xxx_g2_clear_irl(struct mv88e6xxx_chip *chip)
{
	int port, err;

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

		/* Wait for the operation to complete */
2956 2957
		err = mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_IRL_CMD,
				     GLOBAL2_IRL_CMD_BUSY);
2958 2959 2960 2961 2962 2963 2964
		if (err)
			break;
	}

	return err;
}

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

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

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

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

	return err;
}

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

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

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

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

	return err;
}

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

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

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

	return mv88e6xxx_g2_eeprom_wait(chip);
}

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

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

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

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

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

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

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

	return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
}

3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111
static int mv88e6xxx_g2_smi_phy_wait(struct mv88e6xxx_chip *chip)
{
	return mv88e6xxx_wait(chip, REG_GLOBAL2, GLOBAL2_SMI_PHY_CMD,
			      GLOBAL2_SMI_PHY_CMD_BUSY);
}

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

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

	return mv88e6xxx_g2_smi_phy_wait(chip);
}

static int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, int addr,
				     int reg, u16 *val)
{
	u16 cmd = GLOBAL2_SMI_PHY_CMD_OP_22_READ_DATA | (addr << 5) | reg;
	int err;

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

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

	return mv88e6xxx_read(chip, REG_GLOBAL2, GLOBAL2_SMI_PHY_DATA, val);
}

static int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, int addr,
				      int reg, u16 val)
{
	u16 cmd = GLOBAL2_SMI_PHY_CMD_OP_22_WRITE_DATA | (addr << 5) | reg;
	int err;

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

	err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_SMI_PHY_DATA, val);
	if (err)
		return err;

	return mv88e6xxx_g2_smi_phy_cmd(chip, cmd);
}

3112 3113 3114 3115 3116
static const struct mv88e6xxx_ops mv88e6xxx_g2_smi_phy_ops = {
	.read = mv88e6xxx_g2_smi_phy_read,
	.write = mv88e6xxx_g2_smi_phy_write,
};

3117 3118
static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
{
3119
	u16 reg;
3120 3121
	int err;

3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X)) {
		/* Consider the frames with reserved multicast destination
		 * addresses matching 01:80:c2:00:00:2x as MGMT.
		 */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_2X,
				      0xffff);
		if (err)
			return err;
	}

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X)) {
		/* Consider the frames with reserved multicast destination
		 * addresses matching 01:80:c2:00:00:0x as MGMT.
		 */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_0X,
				      0xffff);
		if (err)
			return err;
	}
3141 3142 3143 3144 3145 3146

	/* 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.
	 */
3147 3148 3149 3150 3151
	reg = GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI | (0x7 << 4);
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X))
		reg |= GLOBAL2_SWITCH_MGMT_RSVD2CPU | 0x7;
	err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MGMT, reg);
3152
	if (err)
3153
		return err;
3154 3155

	/* Program the DSA routing table. */
3156 3157 3158
	err = mv88e6xxx_g2_set_device_mapping(chip);
	if (err)
		return err;
3159

3160 3161 3162 3163
	/* Clear all trunk masks and mapping. */
	err = mv88e6xxx_g2_clear_trunk(chip);
	if (err)
		return err;
3164

3165 3166 3167 3168 3169 3170 3171 3172 3173
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_IRL)) {
		/* Disable ingress rate limiting by resetting all per port
		 * ingress rate limit resources to their initial state.
		 */
		err = mv88e6xxx_g2_clear_irl(chip);
			if (err)
				return err;
	}

3174 3175 3176 3177
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_PVT)) {
		/* Initialize Cross-chip Port VLAN Table to reset defaults */
		err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_PVT_ADDR,
				      GLOBAL2_PVT_ADDR_OP_INIT_ONES);
3178
		if (err)
3179
			return err;
3180
	}
3181

3182
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_POT)) {
3183
		/* Clear the priority override table. */
3184 3185 3186
		err = mv88e6xxx_g2_clear_pot(chip);
		if (err)
			return err;
3187 3188
	}

3189
	return 0;
3190 3191
}

3192
static int mv88e6xxx_setup(struct dsa_switch *ds)
3193
{
3194
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3195
	int err;
3196 3197
	int i;

3198 3199
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
3200

3201
	mutex_lock(&chip->reg_lock);
3202

3203
	err = mv88e6xxx_switch_reset(chip);
3204 3205 3206
	if (err)
		goto unlock;

3207 3208 3209 3210 3211 3212 3213 3214 3215
	/* 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);
3216 3217 3218
	if (err)
		goto unlock;

3219 3220 3221
	/* Setup Switch Global 2 Registers */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
		err = mv88e6xxx_g2_setup(chip);
3222 3223 3224
		if (err)
			goto unlock;
	}
3225

3226
unlock:
3227
	mutex_unlock(&chip->reg_lock);
3228

3229
	return err;
3230 3231
}

3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int err;

	mutex_lock(&chip->reg_lock);

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

	mutex_unlock(&chip->reg_lock);

	return err;
}

3250
static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg)
3251
{
3252
	struct mv88e6xxx_chip *chip = bus->priv;
3253 3254
	u16 val;
	int err;
3255

3256
	if (phy >= chip->info->num_ports)
3257
		return 0xffff;
3258

3259
	mutex_lock(&chip->reg_lock);
3260
	err = mv88e6xxx_phy_read(chip, phy, reg, &val);
3261
	mutex_unlock(&chip->reg_lock);
3262 3263

	return err ? err : val;
3264 3265
}

3266
static int mv88e6xxx_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val)
3267
{
3268
	struct mv88e6xxx_chip *chip = bus->priv;
3269
	int err;
3270

3271
	if (phy >= chip->info->num_ports)
3272
		return 0xffff;
3273

3274
	mutex_lock(&chip->reg_lock);
3275
	err = mv88e6xxx_phy_write(chip, phy, reg, val);
3276
	mutex_unlock(&chip->reg_lock);
3277 3278

	return err;
3279 3280
}

3281
static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
3282 3283 3284 3285 3286 3287 3288
				   struct device_node *np)
{
	static int index;
	struct mii_bus *bus;
	int err;

	if (np)
3289
		chip->mdio_np = of_get_child_by_name(np, "mdio");
3290

3291
	bus = devm_mdiobus_alloc(chip->dev);
3292 3293 3294
	if (!bus)
		return -ENOMEM;

3295
	bus->priv = (void *)chip;
3296 3297 3298 3299 3300 3301 3302 3303 3304 3305
	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;
3306
	bus->parent = chip->dev;
3307

3308 3309
	if (chip->mdio_np)
		err = of_mdiobus_register(bus, chip->mdio_np);
3310 3311 3312
	else
		err = mdiobus_register(bus);
	if (err) {
3313
		dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
3314 3315
		goto out;
	}
3316
	chip->mdio_bus = bus;
3317 3318 3319 3320

	return 0;

out:
3321 3322
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3323 3324 3325 3326

	return err;
}

3327
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3328 3329

{
3330
	struct mii_bus *bus = chip->mdio_bus;
3331 3332 3333

	mdiobus_unregister(bus);

3334 3335
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3336 3337
}

3338 3339 3340 3341
#ifdef CONFIG_NET_DSA_HWMON

static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
{
3342
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3343
	u16 val;
3344 3345 3346 3347
	int ret;

	*temp = 0;

3348
	mutex_lock(&chip->reg_lock);
3349

3350
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
3351 3352 3353 3354
	if (ret < 0)
		goto error;

	/* Enable temperature sensor */
3355
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
3356 3357 3358
	if (ret < 0)
		goto error;

3359
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
3360 3361 3362 3363 3364 3365
	if (ret < 0)
		goto error;

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

3366 3367
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
	if (ret < 0)
3368 3369 3370
		goto error;

	/* Disable temperature sensor */
3371
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
3372 3373 3374 3375 3376 3377
	if (ret < 0)
		goto error;

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

error:
3378
	mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
3379
	mutex_unlock(&chip->reg_lock);
3380 3381 3382 3383 3384
	return ret;
}

static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
{
3385 3386
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3387
	u16 val;
3388 3389 3390 3391
	int ret;

	*temp = 0;

3392 3393 3394
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
	mutex_unlock(&chip->reg_lock);
3395 3396 3397
	if (ret < 0)
		return ret;

3398
	*temp = (val & 0xff) - 25;
3399 3400 3401 3402

	return 0;
}

3403
static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
3404
{
3405
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
3406

3407
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3408 3409
		return -EOPNOTSUPP;

3410
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
3411 3412 3413 3414 3415
		return mv88e63xx_get_temp(ds, temp);

	return mv88e61xx_get_temp(ds, temp);
}

3416
static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3417
{
3418 3419
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3420
	u16 val;
3421 3422
	int ret;

3423
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3424 3425 3426 3427
		return -EOPNOTSUPP;

	*temp = 0;

3428 3429 3430
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3431 3432 3433
	if (ret < 0)
		return ret;

3434
	*temp = (((val >> 8) & 0x1f) * 5) - 25;
3435 3436 3437 3438

	return 0;
}

3439
static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3440
{
3441 3442
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3443 3444
	u16 val;
	int err;
3445

3446
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3447 3448
		return -EOPNOTSUPP;

3449 3450 3451 3452
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	if (err)
		goto unlock;
3453
	temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3454 3455 3456 3457 3458 3459
	err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
				       (val & 0xe0ff) | (temp << 8));
unlock:
	mutex_unlock(&chip->reg_lock);

	return err;
3460 3461
}

3462
static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3463
{
3464 3465
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3466
	u16 val;
3467 3468
	int ret;

3469
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3470 3471 3472 3473
		return -EOPNOTSUPP;

	*alarm = false;

3474 3475 3476
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3477 3478 3479
	if (ret < 0)
		return ret;

3480
	*alarm = !!(val & 0x40);
3481 3482 3483 3484 3485

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
	struct mv88e6xxx_chip *chip = ds_to_priv(ds);

	return chip->eeprom_len;
}

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

	eeprom->len = 0;

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

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

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

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

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

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

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

		*data++ = val & 0xff;

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

	return 0;
}

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

	mutex_lock(&chip->reg_lock);

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

	mutex_unlock(&chip->reg_lock);

	if (err)
		return err;

	eeprom->magic = 0xc3ec4951;

	return 0;
}

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

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

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

	eeprom->len = 0;

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

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

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

	mutex_lock(&chip->reg_lock);

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

	mutex_unlock(&chip->reg_lock);

	return err;
}

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

3842
static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
3843
{
3844
	int i;
3845

3846 3847 3848
	for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
		if (mv88e6xxx_table[i].prod_num == prod_num)
			return &mv88e6xxx_table[i];
3849 3850 3851 3852

	return NULL;
}

3853
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3854 3855
{
	const struct mv88e6xxx_info *info;
3856 3857 3858
	unsigned int prod_num, rev;
	u16 id;
	int err;
3859

3860 3861 3862 3863 3864
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_read(chip, 0, PORT_SWITCH_ID, &id);
	mutex_unlock(&chip->reg_lock);
	if (err)
		return err;
3865 3866 3867 3868 3869 3870 3871 3872

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

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

3873
	/* Update the compatible info with the probed one */
3874
	chip->info = info;
3875

3876 3877
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3878 3879 3880 3881

	return 0;
}

3882
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3883
{
3884
	struct mv88e6xxx_chip *chip;
3885

3886 3887
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3888 3889
		return NULL;

3890
	chip->dev = dev;
3891

3892
	mutex_init(&chip->reg_lock);
3893

3894
	return chip;
3895 3896
}

3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913
static const struct mv88e6xxx_ops mv88e6xxx_phy_ops = {
	.read = mv88e6xxx_read,
	.write = mv88e6xxx_write,
};

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

3914
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3915 3916 3917 3918 3919 3920
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3921
	if (sw_addr == 0)
3922
		chip->smi_ops = &mv88e6xxx_smi_single_chip_ops;
3923
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_MULTI_CHIP))
3924
		chip->smi_ops = &mv88e6xxx_smi_multi_chip_ops;
3925 3926 3927
	else
		return -EINVAL;

3928 3929
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3930 3931 3932 3933

	return 0;
}

3934 3935 3936
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3937
{
3938
	struct mv88e6xxx_chip *chip;
3939
	struct mii_bus *bus;
3940
	int err;
3941

3942
	bus = dsa_host_dev_to_mii_bus(host_dev);
3943 3944 3945
	if (!bus)
		return NULL;

3946 3947
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3948 3949
		return NULL;

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

3953
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3954 3955 3956
	if (err)
		goto free;

3957
	err = mv88e6xxx_detect(chip);
3958
	if (err)
3959
		goto free;
3960

3961 3962
	mv88e6xxx_phy_init(chip);

3963
	err = mv88e6xxx_mdio_register(chip, NULL);
3964
	if (err)
3965
		goto free;
3966

3967
	*priv = chip;
3968

3969
	return chip->info->name;
3970
free:
3971
	devm_kfree(dsa_dev, chip);
3972 3973

	return NULL;
3974 3975
}

3976
static struct dsa_switch_driver mv88e6xxx_switch_driver = {
3977
	.tag_protocol		= DSA_TAG_PROTO_EDSA,
3978
	.probe			= mv88e6xxx_drv_probe,
3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992
	.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
3993
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
3994 3995 3996 3997
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
	.get_regs_len		= mv88e6xxx_get_regs_len,
	.get_regs		= mv88e6xxx_get_regs,
3998
	.set_ageing_time	= mv88e6xxx_set_ageing_time,
3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012
	.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,
};

4013
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
4014 4015
				     struct device_node *np)
{
4016
	struct device *dev = chip->dev;
4017 4018 4019 4020 4021 4022 4023
	struct dsa_switch *ds;

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

	ds->dev = dev;
4024
	ds->priv = chip;
4025 4026 4027 4028 4029 4030 4031
	ds->drv = &mv88e6xxx_switch_driver;

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

4032
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
4033
{
4034
	dsa_unregister_switch(chip->ds);
4035 4036
}

4037
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
4038
{
4039
	struct device *dev = &mdiodev->dev;
4040
	struct device_node *np = dev->of_node;
4041
	const struct mv88e6xxx_info *compat_info;
4042
	struct mv88e6xxx_chip *chip;
4043
	u32 eeprom_len;
4044
	int err;
4045

4046 4047 4048 4049
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

4050 4051
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
4052 4053
		return -ENOMEM;

4054
	chip->info = compat_info;
4055

4056
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
4057 4058
	if (err)
		return err;
4059

4060
	err = mv88e6xxx_detect(chip);
4061 4062
	if (err)
		return err;
4063

4064 4065
	mv88e6xxx_phy_init(chip);

4066 4067 4068
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
4069

4070
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
4071
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
4072
		chip->eeprom_len = eeprom_len;
4073

4074
	err = mv88e6xxx_mdio_register(chip, np);
4075 4076 4077
	if (err)
		return err;

4078
	err = mv88e6xxx_register_switch(chip, np);
4079
	if (err) {
4080
		mv88e6xxx_mdio_unregister(chip);
4081 4082 4083
		return err;
	}

4084 4085
	return 0;
}
4086 4087 4088 4089

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

4092 4093
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
4094 4095 4096
}

static const struct of_device_id mv88e6xxx_of_match[] = {
4097 4098 4099 4100
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119
	{ /* 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);
}
4120 4121 4122 4123
module_init(mv88e6xxx_init);

static void __exit mv88e6xxx_cleanup(void)
{
4124
	mdio_driver_unregister(&mv88e6xxx_driver);
4125
	unregister_switch_driver(&mv88e6xxx_switch_driver);
4126 4127
}
module_exit(mv88e6xxx_cleanup);
4128 4129 4130 4131

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