chip.c 89.6 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
#include "global2.h"
35

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

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

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

62
	return chip->smi_ops->read(chip, addr, reg, val);
63 64
}

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

71
	return chip->smi_ops->write(chip, addr, reg, val);
72 73
}

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

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

	*val = ret & 0xffff;

	return 0;
}

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

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

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

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

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

	return -ETIMEDOUT;
}

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

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

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

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

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

148
	*val = ret & 0xffff;
149

150
	return 0;
151 152
}

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

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

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

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

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

	return 0;
}

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

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

191
	assert_reg_lock(chip);
192

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

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

	return 0;
}

203
int mv88e6xxx_write(struct mv88e6xxx_chip *chip, 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
int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, u16 mask)
310
{
311
	int i;
312

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

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

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

		usleep_range(1000, 2000);
	}

327
	dev_err(chip->dev, "Timeout while waiting for switch\n");
328 329 330
	return -ETIMEDOUT;
}

331
/* Indirect write to single pointer-data register with an Update bit */
332
int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, u16 update)
333 334
{
	u16 val;
335
	int err;
336 337

	/* Wait until the previous operation is completed */
338 339 340
	err = mv88e6xxx_wait(chip, addr, reg, BIT(15));
	if (err)
		return err;
341 342 343 344 345 346 347

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

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

348
static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
349 350 351 352
{
	u16 val;
	int err;

353
	err = mv88e6xxx_read(chip, addr, reg, &val);
354 355 356 357 358 359
	if (err)
		return err;

	return val;
}

360
static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
361 362
				int reg, u16 val)
{
363
	return mv88e6xxx_write(chip, addr, reg, val);
364 365
}

366
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
367 368
{
	int ret;
369
	int i;
370

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

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

380
	for (i = 0; i < 16; i++) {
381
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
382 383 384
		if (ret < 0)
			return ret;

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

	return -ETIMEDOUT;
}

394
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
395
{
396
	int ret, err, i;
397

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

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

407
	for (i = 0; i < 16; i++) {
408
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
409 410 411
		if (ret < 0)
			return ret;

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

	return -ETIMEDOUT;
}

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

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

427
	mutex_lock(&chip->reg_lock);
428

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

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

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

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

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

449
	mutex_lock(&chip->ppu_mutex);
450

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

	return ret;
}

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

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

487 488 489 490 491
static void mv88e6xxx_ppu_state_destroy(struct mv88e6xxx_chip *chip)
{
	del_timer_sync(&chip->ppu_timer);
}

492 493
static int mv88e6xxx_phy_ppu_read(struct mv88e6xxx_chip *chip, int addr,
				  int reg, u16 *val)
494
{
495
	int err;
496

497 498 499
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_read(chip, addr, reg, val);
500
		mv88e6xxx_ppu_access_put(chip);
501 502
	}

503
	return err;
504 505
}

506 507
static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
				   int reg, u16 val)
508
{
509
	int err;
510

511 512 513
	err = mv88e6xxx_ppu_access_get(chip);
	if (!err) {
		err = mv88e6xxx_write(chip, addr, reg, val);
514
		mv88e6xxx_ppu_access_put(chip);
515 516
	}

517
	return err;
518 519
}

520 521 522 523 524
static const struct mv88e6xxx_ops mv88e6xxx_phy_ppu_ops = {
	.read = mv88e6xxx_phy_ppu_read,
	.write = mv88e6xxx_phy_ppu_write,
};

525
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
526
{
527
	return chip->info->family == MV88E6XXX_FAMILY_6065;
528 529
}

530
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
531
{
532
	return chip->info->family == MV88E6XXX_FAMILY_6095;
533 534
}

535
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
536
{
537
	return chip->info->family == MV88E6XXX_FAMILY_6097;
538 539
}

540
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
541
{
542
	return chip->info->family == MV88E6XXX_FAMILY_6165;
543 544
}

545
static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
546
{
547
	return chip->info->family == MV88E6XXX_FAMILY_6185;
548 549
}

550
static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
551
{
552
	return chip->info->family == MV88E6XXX_FAMILY_6320;
553 554
}

555
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
556
{
557
	return chip->info->family == MV88E6XXX_FAMILY_6351;
558 559
}

560
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
561
{
562
	return chip->info->family == MV88E6XXX_FAMILY_6352;
563 564
}

565
static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
566
{
567
	return chip->info->num_databases;
568 569
}

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

	return false;
}

580 581 582 583
/* 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.
 */
584 585
static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
				  struct phy_device *phydev)
586
{
V
Vivien Didelot 已提交
587
	struct mv88e6xxx_chip *chip = ds->priv;
588 589
	u32 reg;
	int ret;
590 591 592 593

	if (!phy_is_pseudo_fixed_link(phydev))
		return;

594
	mutex_lock(&chip->reg_lock);
595

596
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
597 598 599 600 601 602 603 604 605 606 607
	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)
608
		reg |= PORT_PCS_CTRL_LINK_UP;
609

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

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

out:
645
	mutex_unlock(&chip->reg_lock);
646 647
}

648
static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
649 650 651 652 653
{
	int ret;
	int i;

	for (i = 0; i < 10; i++) {
654
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
655
		if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
656 657 658 659 660 661
			return 0;
	}

	return -ETIMEDOUT;
}

662
static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
663 664 665
{
	int ret;

666
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
667 668
		port = (port + 1) << 5;

669
	/* Snapshot the hardware statistics counters for this port. */
670
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
671 672 673 674
				   GLOBAL_STATS_OP_CAPTURE_PORT |
				   GLOBAL_STATS_OP_HIST_RX_TX | port);
	if (ret < 0)
		return ret;
675

676
	/* Wait for the snapshotting to complete. */
677
	ret = _mv88e6xxx_stats_wait(chip);
678 679 680 681 682 683
	if (ret < 0)
		return ret;

	return 0;
}

684
static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
685
				  int stat, u32 *val)
686 687 688 689 690 691
{
	u32 _val;
	int ret;

	*val = 0;

692
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
693 694
				   GLOBAL_STATS_OP_READ_CAPTURED |
				   GLOBAL_STATS_OP_HIST_RX_TX | stat);
695 696 697
	if (ret < 0)
		return;

698
	ret = _mv88e6xxx_stats_wait(chip);
699 700 701
	if (ret < 0)
		return;

702
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
703 704 705 706 707
	if (ret < 0)
		return;

	_val = ret << 16;

708
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
709 710 711 712 713 714
	if (ret < 0)
		return;

	*val = _val | ret;
}

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

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

796
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
797
					    struct mv88e6xxx_hw_stat *s,
798 799 800 801 802 803 804
					    int port)
{
	u32 low;
	u32 high = 0;
	int ret;
	u64 value;

805 806
	switch (s->type) {
	case PORT:
807
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
808 809 810 811 812
		if (ret < 0)
			return UINT64_MAX;

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

830 831
static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
				  uint8_t *data)
832
{
V
Vivien Didelot 已提交
833
	struct mv88e6xxx_chip *chip = ds->priv;
834 835
	struct mv88e6xxx_hw_stat *stat;
	int i, j;
836

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

847
static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
848
{
V
Vivien Didelot 已提交
849
	struct mv88e6xxx_chip *chip = ds->priv;
850 851 852 853 854
	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];
855
		if (mv88e6xxx_has_stat(chip, stat))
856 857 858
			j++;
	}
	return j;
859 860
}

861 862
static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
					uint64_t *data)
863
{
V
Vivien Didelot 已提交
864
	struct mv88e6xxx_chip *chip = ds->priv;
865 866 867 868
	struct mv88e6xxx_hw_stat *stat;
	int ret;
	int i, j;

869
	mutex_lock(&chip->reg_lock);
870

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

884
	mutex_unlock(&chip->reg_lock);
885 886
}

887
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
888 889 890 891
{
	return 32 * sizeof(u16);
}

892 893
static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
			       struct ethtool_regs *regs, void *_p)
894
{
V
Vivien Didelot 已提交
895
	struct mv88e6xxx_chip *chip = ds->priv;
896 897 898 899 900 901 902
	u16 *p = _p;
	int i;

	regs->version = 0;

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

903
	mutex_lock(&chip->reg_lock);
904

905 906 907
	for (i = 0; i < 32; i++) {
		int ret;

908
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
909 910 911
		if (ret >= 0)
			p[i] = ret;
	}
912

913
	mutex_unlock(&chip->reg_lock);
914 915
}

916
static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
917
{
918 919
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
			      GLOBAL_ATU_OP_BUSY);
920 921
}

922 923
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
			     struct ethtool_eee *e)
924
{
V
Vivien Didelot 已提交
925
	struct mv88e6xxx_chip *chip = ds->priv;
926 927
	u16 reg;
	int err;
928

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

932
	mutex_lock(&chip->reg_lock);
933

934 935
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
936
		goto out;
937 938 939 940

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

941 942
	err = mv88e6xxx_read(chip, REG_PORT(port), PORT_STATUS, &reg);
	if (err)
943
		goto out;
944

945
	e->eee_active = !!(reg & PORT_STATUS_EEE);
946
out:
947
	mutex_unlock(&chip->reg_lock);
948 949

	return err;
950 951
}

952 953
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
954
{
V
Vivien Didelot 已提交
955
	struct mv88e6xxx_chip *chip = ds->priv;
956 957
	u16 reg;
	int err;
958

959
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
960 961
		return -EOPNOTSUPP;

962
	mutex_lock(&chip->reg_lock);
963

964 965
	err = mv88e6xxx_phy_read(chip, port, 16, &reg);
	if (err)
966 967
		goto out;

968
	reg &= ~0x0300;
969 970 971 972 973
	if (e->eee_enabled)
		reg |= 0x0200;
	if (e->tx_lpi_enabled)
		reg |= 0x0100;

974
	err = mv88e6xxx_phy_write(chip, port, 16, reg);
975
out:
976
	mutex_unlock(&chip->reg_lock);
977

978
	return err;
979 980
}

981
static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
982 983 984
{
	int ret;

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

996
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
997 998 999 1000 1001 1002 1003
					   (ret & 0xfff) |
					   ((fid << 8) & 0xf000));
		if (ret < 0)
			return ret;

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

1006
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
1007 1008 1009
	if (ret < 0)
		return ret;

1010
	return _mv88e6xxx_atu_wait(chip);
1011 1012
}

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

1033
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
1034 1035
}

1036
static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
1037 1038
				     struct mv88e6xxx_atu_entry *entry,
				     bool static_too)
1039
{
1040 1041
	int op;
	int err;
1042

1043
	err = _mv88e6xxx_atu_wait(chip);
1044 1045
	if (err)
		return err;
1046

1047
	err = _mv88e6xxx_atu_data_write(chip, entry);
1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
	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;
	}

1059
	return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
1060 1061
}

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

1070
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1071 1072
}

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

1088
	return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
1089 1090
}

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

1098 1099 1100 1101 1102 1103 1104
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",
};

1105
static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
1106
				 u8 state)
1107
{
1108
	struct dsa_switch *ds = chip->ds;
1109
	int reg, ret = 0;
1110 1111
	u8 oldstate;

1112
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
1113 1114
	if (reg < 0)
		return reg;
1115

1116
	oldstate = reg & PORT_CONTROL_STATE_MASK;
1117

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

1132
		reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
1133
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
1134
					   reg);
1135 1136 1137
		if (ret)
			return ret;

1138
		netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
1139 1140
			   mv88e6xxx_port_state_names[state],
			   mv88e6xxx_port_state_names[oldstate]);
1141 1142 1143 1144 1145
	}

	return ret;
}

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

1173
	reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
1174 1175
	if (reg < 0)
		return reg;
1176

1177 1178
	reg &= ~mask;
	reg |= output_ports & mask;
1179

1180
	return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
1181 1182
}

1183 1184
static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
					 u8 state)
1185
{
V
Vivien Didelot 已提交
1186
	struct mv88e6xxx_chip *chip = ds->priv;
1187
	int stp_state;
1188
	int err;
1189 1190 1191

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

1207 1208 1209
	mutex_lock(&chip->reg_lock);
	err = _mv88e6xxx_port_state(chip, port, stp_state);
	mutex_unlock(&chip->reg_lock);
1210 1211

	if (err)
1212 1213
		netdev_err(ds->ports[port].netdev,
			   "failed to update state to %s\n",
1214
			   mv88e6xxx_port_state_names[stp_state]);
1215 1216
}

1217
static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
1218
				u16 *new, u16 *old)
1219
{
1220
	struct dsa_switch *ds = chip->ds;
1221
	u16 pvid;
1222 1223
	int ret;

1224
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
1225 1226 1227
	if (ret < 0)
		return ret;

1228 1229 1230 1231 1232 1233
	pvid = ret & PORT_DEFAULT_VLAN_MASK;

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

1234
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
1235 1236 1237 1238
					   PORT_DEFAULT_VLAN, ret);
		if (ret < 0)
			return ret;

1239 1240
		netdev_dbg(ds->ports[port].netdev,
			   "DefaultVID %d (was %d)\n", *new, pvid);
1241 1242 1243 1244
	}

	if (old)
		*old = pvid;
1245 1246 1247 1248

	return 0;
}

1249
static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
1250
				    int port, u16 *pvid)
1251
{
1252
	return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
1253 1254
}

1255
static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1256
				    int port, u16 pvid)
1257
{
1258
	return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
1259 1260
}

1261
static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1262
{
1263 1264
	return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
			      GLOBAL_VTU_OP_BUSY);
1265 1266
}

1267
static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1268 1269 1270
{
	int ret;

1271
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
1272 1273 1274
	if (ret < 0)
		return ret;

1275
	return _mv88e6xxx_vtu_wait(chip);
1276 1277
}

1278
static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
1279 1280 1281
{
	int ret;

1282
	ret = _mv88e6xxx_vtu_wait(chip);
1283 1284 1285
	if (ret < 0)
		return ret;

1286
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
1287 1288
}

1289
static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1290 1291 1292 1293 1294 1295 1296 1297
					struct mv88e6xxx_vtu_stu_entry *entry,
					unsigned int nibble_offset)
{
	u16 regs[3];
	int i;
	int ret;

	for (i = 0; i < 3; ++i) {
1298
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1299 1300 1301 1302 1303 1304 1305
					  GLOBAL_VTU_DATA_0_3 + i);
		if (ret < 0)
			return ret;

		regs[i] = ret;
	}

1306
	for (i = 0; i < chip->info->num_ports; ++i) {
1307 1308 1309 1310 1311 1312 1313 1314 1315
		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;
}

1316
static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
1317 1318
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1319
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
1320 1321
}

1322
static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
1323 1324
				   struct mv88e6xxx_vtu_stu_entry *entry)
{
1325
	return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
1326 1327
}

1328
static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1329 1330 1331 1332 1333 1334 1335
					 struct mv88e6xxx_vtu_stu_entry *entry,
					 unsigned int nibble_offset)
{
	u16 regs[3] = { 0 };
	int i;
	int ret;

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

	return 0;
}

1353
static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
1354 1355
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1356
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
1357 1358
}

1359
static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1360 1361
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1362
	return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
1363 1364
}

1365
static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1366
{
1367
	return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
1368 1369 1370
				    vid & GLOBAL_VTU_VID_MASK);
}

1371
static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1372 1373 1374 1375 1376
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1377
	ret = _mv88e6xxx_vtu_wait(chip);
1378 1379 1380
	if (ret < 0)
		return ret;

1381
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1382 1383 1384
	if (ret < 0)
		return ret;

1385
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1386 1387 1388 1389 1390 1391 1392
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1393
		ret = mv88e6xxx_vtu_data_read(chip, &next);
1394 1395 1396
		if (ret < 0)
			return ret;

1397 1398
		if (mv88e6xxx_has_fid_reg(chip)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1399 1400 1401 1402 1403
						  GLOBAL_VTU_FID);
			if (ret < 0)
				return ret;

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

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

1417 1418
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
						  GLOBAL_VTU_SID);
			if (ret < 0)
				return ret;

			next.sid = ret & GLOBAL_VTU_SID_MASK;
		}
	}

	*entry = next;
	return 0;
}

1431 1432 1433
static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
				    struct switchdev_obj_port_vlan *vlan,
				    int (*cb)(struct switchdev_obj *obj))
1434
{
V
Vivien Didelot 已提交
1435
	struct mv88e6xxx_chip *chip = ds->priv;
1436 1437 1438 1439
	struct mv88e6xxx_vtu_stu_entry next;
	u16 pvid;
	int err;

1440
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1441 1442
		return -EOPNOTSUPP;

1443
	mutex_lock(&chip->reg_lock);
1444

1445
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
1446 1447 1448
	if (err)
		goto unlock;

1449
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1450 1451 1452 1453
	if (err)
		goto unlock;

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

	return err;
}

1486
static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1487 1488
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
1489
	u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1490 1491 1492
	u16 reg = 0;
	int ret;

1493
	ret = _mv88e6xxx_vtu_wait(chip);
1494 1495 1496 1497 1498 1499 1500
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port member tags */
1501
	ret = mv88e6xxx_vtu_data_write(chip, entry);
1502 1503 1504
	if (ret < 0)
		return ret;

1505
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1506
		reg = entry->sid & GLOBAL_VTU_SID_MASK;
1507 1508
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
					   reg);
1509 1510
		if (ret < 0)
			return ret;
1511
	}
1512

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

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
	reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1530
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1531 1532 1533
	if (ret < 0)
		return ret;

1534
	return _mv88e6xxx_vtu_cmd(chip, op);
1535 1536
}

1537
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1538 1539 1540 1541 1542
				  struct mv88e6xxx_vtu_stu_entry *entry)
{
	struct mv88e6xxx_vtu_stu_entry next = { 0 };
	int ret;

1543
	ret = _mv88e6xxx_vtu_wait(chip);
1544 1545 1546
	if (ret < 0)
		return ret;

1547
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
1548 1549 1550 1551
				   sid & GLOBAL_VTU_SID_MASK);
	if (ret < 0)
		return ret;

1552
	ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1553 1554 1555
	if (ret < 0)
		return ret;

1556
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
1557 1558 1559 1560 1561
	if (ret < 0)
		return ret;

	next.sid = ret & GLOBAL_VTU_SID_MASK;

1562
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
1563 1564 1565 1566 1567 1568
	if (ret < 0)
		return ret;

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

	if (next.valid) {
1569
		ret = mv88e6xxx_stu_data_read(chip, &next);
1570 1571 1572 1573 1574 1575 1576 1577
		if (ret < 0)
			return ret;
	}

	*entry = next;
	return 0;
}

1578
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1579 1580 1581 1582 1583
				    struct mv88e6xxx_vtu_stu_entry *entry)
{
	u16 reg = 0;
	int ret;

1584
	ret = _mv88e6xxx_vtu_wait(chip);
1585 1586 1587 1588 1589 1590 1591
	if (ret < 0)
		return ret;

	if (!entry->valid)
		goto loadpurge;

	/* Write port states */
1592
	ret = mv88e6xxx_stu_data_write(chip, entry);
1593 1594 1595 1596 1597
	if (ret < 0)
		return ret;

	reg = GLOBAL_VTU_VID_VALID;
loadpurge:
1598
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
1599 1600 1601 1602
	if (ret < 0)
		return ret;

	reg = entry->sid & GLOBAL_VTU_SID_MASK;
1603
	ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
1604 1605 1606
	if (ret < 0)
		return ret;

1607
	return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1608 1609
}

1610
static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
1611
			       u16 *new, u16 *old)
1612
{
1613
	struct dsa_switch *ds = chip->ds;
1614
	u16 upper_mask;
1615 1616 1617
	u16 fid;
	int ret;

1618
	if (mv88e6xxx_num_databases(chip) == 4096)
1619
		upper_mask = 0xff;
1620
	else if (mv88e6xxx_num_databases(chip) == 256)
1621
		upper_mask = 0xf;
1622 1623 1624
	else
		return -EOPNOTSUPP;

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

1636
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
1637 1638 1639 1640 1641 1642
					   ret);
		if (ret < 0)
			return ret;
	}

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

1647
	fid |= (ret & upper_mask) << 4;
1648 1649

	if (new) {
1650 1651
		ret &= ~upper_mask;
		ret |= (*new >> 4) & upper_mask;
1652

1653
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
1654 1655 1656 1657
					   ret);
		if (ret < 0)
			return ret;

1658 1659
		netdev_dbg(ds->ports[port].netdev,
			   "FID %d (was %d)\n", *new, fid);
1660 1661 1662 1663 1664 1665 1666 1667
	}

	if (old)
		*old = fid;

	return 0;
}

1668
static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
1669
				   int port, u16 *fid)
1670
{
1671
	return _mv88e6xxx_port_fid(chip, port, NULL, fid);
1672 1673
}

1674
static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
1675
				   int port, u16 fid)
1676
{
1677
	return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
1678 1679
}

1680
static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
1681 1682 1683
{
	DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
	struct mv88e6xxx_vtu_stu_entry vlan;
1684
	int i, err;
1685 1686 1687

	bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);

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

		set_bit(*fid, fid_bitmap);
	}

1697
	/* Set every FID bit used by the VLAN entries */
1698
	err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
1699 1700 1701 1702
	if (err)
		return err;

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

	/* Clear the database */
1721
	return _mv88e6xxx_atu_flush(chip, *fid, true);
1722 1723
}

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

1734
	err = _mv88e6xxx_fid_new(chip, &vlan.fid);
1735 1736
	if (err)
		return err;
1737

1738
	/* exclude all ports except the CPU and DSA ports */
1739
	for (i = 0; i < chip->info->num_ports; ++i)
1740 1741 1742
		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;
1743

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

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

1762
			err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
1763 1764 1765 1766 1767 1768 1769 1770 1771
			if (err)
				return err;
		}
	}

	*entry = vlan;
	return 0;
}

1772
static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
1773 1774 1775 1776 1777 1778 1779
			      struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
{
	int err;

	if (!vid)
		return -EINVAL;

1780
	err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
1781 1782 1783
	if (err)
		return err;

1784
	err = _mv88e6xxx_vtu_getnext(chip, entry);
1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
	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.
		 */

1795
		err = _mv88e6xxx_vtu_new(chip, vid, entry);
1796 1797 1798 1799 1800
	}

	return err;
}

1801 1802 1803
static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
					u16 vid_begin, u16 vid_end)
{
V
Vivien Didelot 已提交
1804
	struct mv88e6xxx_chip *chip = ds->priv;
1805 1806 1807 1808 1809 1810
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

	if (!vid_begin)
		return -EOPNOTSUPP;

1811
	mutex_lock(&chip->reg_lock);
1812

1813
	err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
1814 1815 1816 1817
	if (err)
		goto unlock;

	do {
1818
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
1819 1820 1821 1822 1823 1824 1825 1826 1827
		if (err)
			goto unlock;

		if (!vlan.valid)
			break;

		if (vlan.vid > vid_end)
			break;

1828
		for (i = 0; i < chip->info->num_ports; ++i) {
1829 1830 1831 1832 1833 1834 1835
			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;

1836 1837
			if (chip->ports[i].bridge_dev ==
			    chip->ports[port].bridge_dev)
1838 1839
				break; /* same bridge, check next VLAN */

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

unlock:
1850
	mutex_unlock(&chip->reg_lock);
1851 1852 1853 1854

	return err;
}

1855 1856 1857 1858 1859 1860 1861
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",
};

1862 1863
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
					 bool vlan_filtering)
1864
{
V
Vivien Didelot 已提交
1865
	struct mv88e6xxx_chip *chip = ds->priv;
1866 1867 1868 1869
	u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
		PORT_CONTROL_2_8021Q_DISABLED;
	int ret;

1870
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1871 1872
		return -EOPNOTSUPP;

1873
	mutex_lock(&chip->reg_lock);
1874

1875
	ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
1876 1877 1878 1879 1880
	if (ret < 0)
		goto unlock;

	old = ret & PORT_CONTROL_2_8021Q_MASK;

1881 1882 1883
	if (new != old) {
		ret &= ~PORT_CONTROL_2_8021Q_MASK;
		ret |= new & PORT_CONTROL_2_8021Q_MASK;
1884

1885
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
1886 1887 1888 1889
					   ret);
		if (ret < 0)
			goto unlock;

1890
		netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
1891 1892 1893
			   mv88e6xxx_port_8021q_mode_names[new],
			   mv88e6xxx_port_8021q_mode_names[old]);
	}
1894

1895
	ret = 0;
1896
unlock:
1897
	mutex_unlock(&chip->reg_lock);
1898 1899 1900 1901

	return ret;
}

1902 1903 1904 1905
static int
mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
			    const struct switchdev_obj_port_vlan *vlan,
			    struct switchdev_trans *trans)
1906
{
V
Vivien Didelot 已提交
1907
	struct mv88e6xxx_chip *chip = ds->priv;
1908 1909
	int err;

1910
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1911 1912
		return -EOPNOTSUPP;

1913 1914 1915 1916 1917 1918 1919 1920
	/* 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;

1921 1922 1923 1924 1925 1926
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */
	return 0;
}

1927
static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
1928
				    u16 vid, bool untagged)
1929 1930 1931 1932
{
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

1933
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
1934
	if (err)
1935
		return err;
1936 1937 1938 1939 1940

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

1941
	return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
1942 1943
}

1944 1945 1946
static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
				    const struct switchdev_obj_port_vlan *vlan,
				    struct switchdev_trans *trans)
1947
{
V
Vivien Didelot 已提交
1948
	struct mv88e6xxx_chip *chip = ds->priv;
1949 1950 1951 1952
	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
	u16 vid;

1953
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
1954 1955
		return;

1956
	mutex_lock(&chip->reg_lock);
1957

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

1964
	if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
1965
		netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
1966
			   vlan->vid_end);
1967

1968
	mutex_unlock(&chip->reg_lock);
1969 1970
}

1971
static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
1972
				    int port, u16 vid)
1973
{
1974
	struct dsa_switch *ds = chip->ds;
1975 1976 1977
	struct mv88e6xxx_vtu_stu_entry vlan;
	int i, err;

1978
	err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
1979
	if (err)
1980
		return err;
1981

1982 1983
	/* Tell switchdev if this VLAN is handled in software */
	if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
1984
		return -EOPNOTSUPP;
1985 1986 1987 1988

	vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;

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

		if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
1995
			vlan.valid = true;
1996 1997 1998 1999
			break;
		}
	}

2000
	err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
2001 2002 2003
	if (err)
		return err;

2004
	return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
2005 2006
}

2007 2008
static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_vlan *vlan)
2009
{
V
Vivien Didelot 已提交
2010
	struct mv88e6xxx_chip *chip = ds->priv;
2011 2012 2013
	u16 pvid, vid;
	int err = 0;

2014
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
2015 2016
		return -EOPNOTSUPP;

2017
	mutex_lock(&chip->reg_lock);
2018

2019
	err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
2020 2021 2022
	if (err)
		goto unlock;

2023
	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
2024
		err = _mv88e6xxx_port_vlan_del(chip, port, vid);
2025 2026 2027 2028
		if (err)
			goto unlock;

		if (vid == pvid) {
2029
			err = _mv88e6xxx_port_pvid_set(chip, port, 0);
2030 2031 2032 2033 2034
			if (err)
				goto unlock;
		}
	}

2035
unlock:
2036
	mutex_unlock(&chip->reg_lock);
2037 2038 2039 2040

	return err;
}

2041
static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2042
				    const unsigned char *addr)
2043 2044 2045 2046
{
	int i, ret;

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

	return 0;
}

2057
static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2058
				   unsigned char *addr)
2059 2060 2061 2062
{
	int i, ret;

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

	return 0;
}

2074
static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2075
			       struct mv88e6xxx_atu_entry *entry)
2076
{
2077 2078
	int ret;

2079
	ret = _mv88e6xxx_atu_wait(chip);
2080 2081 2082
	if (ret < 0)
		return ret;

2083
	ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
2084 2085 2086
	if (ret < 0)
		return ret;

2087
	ret = _mv88e6xxx_atu_data_write(chip, entry);
2088
	if (ret < 0)
2089 2090
		return ret;

2091
	return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
2092
}
2093

2094 2095 2096
static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
					const unsigned char *addr, u16 vid,
					u8 state)
2097 2098
{
	struct mv88e6xxx_atu_entry entry = { 0 };
2099 2100 2101
	struct mv88e6xxx_vtu_stu_entry vlan;
	int err;

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

2110
	entry.fid = vlan.fid;
2111 2112 2113 2114 2115 2116 2117
	entry.state = state;
	ether_addr_copy(entry.mac, addr);
	if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
		entry.trunk = false;
		entry.portv_trunkid = BIT(port);
	}

2118
	return _mv88e6xxx_atu_load(chip, &entry);
2119 2120
}

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

2131 2132 2133
static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_fdb *fdb,
				   struct switchdev_trans *trans)
2134
{
V
Vivien Didelot 已提交
2135
	struct mv88e6xxx_chip *chip = ds->priv;
2136

2137
	mutex_lock(&chip->reg_lock);
2138 2139 2140
	if (mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
					 GLOBAL_ATU_DATA_STATE_UC_STATIC))
		netdev_err(ds->ports[port].netdev, "failed to load unicast MAC address\n");
2141
	mutex_unlock(&chip->reg_lock);
2142 2143
}

2144 2145
static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_fdb *fdb)
2146
{
V
Vivien Didelot 已提交
2147
	struct mv88e6xxx_chip *chip = ds->priv;
2148
	int err;
2149

2150
	mutex_lock(&chip->reg_lock);
2151 2152
	err = mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
					   GLOBAL_ATU_DATA_STATE_UNUSED);
2153
	mutex_unlock(&chip->reg_lock);
2154

2155
	return err;
2156 2157
}

2158
static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2159
				  struct mv88e6xxx_atu_entry *entry)
2160
{
2161 2162 2163 2164
	struct mv88e6xxx_atu_entry next = { 0 };
	int ret;

	next.fid = fid;
2165

2166
	ret = _mv88e6xxx_atu_wait(chip);
2167 2168
	if (ret < 0)
		return ret;
2169

2170
	ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2171 2172
	if (ret < 0)
		return ret;
2173

2174
	ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
2175 2176
	if (ret < 0)
		return ret;
2177

2178
	ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
2179 2180
	if (ret < 0)
		return ret;
2181

2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197
	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;
	}
2198

2199
	*entry = next;
2200 2201 2202
	return 0;
}

2203 2204 2205 2206
static int mv88e6xxx_port_db_dump_fid(struct mv88e6xxx_chip *chip,
				      u16 fid, u16 vid, int port,
				      struct switchdev_obj *obj,
				      int (*cb)(struct switchdev_obj *obj))
2207 2208 2209 2210 2211 2212
{
	struct mv88e6xxx_atu_entry addr = {
		.mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
	};
	int err;

2213
	err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
2214 2215 2216 2217
	if (err)
		return err;

	do {
2218
		err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
2219
		if (err)
2220
			return err;
2221 2222 2223 2224

		if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED)
			break;

2225 2226 2227 2228 2229
		if (addr.trunk || (addr.portv_trunkid & BIT(port)) == 0)
			continue;

		if (obj->id == SWITCHDEV_OBJ_ID_PORT_FDB) {
			struct switchdev_obj_port_fdb *fdb;
2230

2231 2232 2233 2234
			if (!is_unicast_ether_addr(addr.mac))
				continue;

			fdb = SWITCHDEV_OBJ_PORT_FDB(obj);
2235 2236
			fdb->vid = vid;
			ether_addr_copy(fdb->addr, addr.mac);
2237 2238 2239 2240
			if (addr.state == GLOBAL_ATU_DATA_STATE_UC_STATIC)
				fdb->ndm_state = NUD_NOARP;
			else
				fdb->ndm_state = NUD_REACHABLE;
2241 2242 2243 2244 2245 2246 2247 2248 2249
		} else if (obj->id == SWITCHDEV_OBJ_ID_PORT_MDB) {
			struct switchdev_obj_port_mdb *mdb;

			if (!is_multicast_ether_addr(addr.mac))
				continue;

			mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
			mdb->vid = vid;
			ether_addr_copy(mdb->addr, addr.mac);
2250 2251
		} else {
			return -EOPNOTSUPP;
2252
		}
2253 2254 2255 2256

		err = cb(obj);
		if (err)
			return err;
2257 2258 2259 2260 2261
	} while (!is_broadcast_ether_addr(addr.mac));

	return err;
}

2262 2263 2264
static int mv88e6xxx_port_db_dump(struct mv88e6xxx_chip *chip, int port,
				  struct switchdev_obj *obj,
				  int (*cb)(struct switchdev_obj *obj))
2265 2266 2267 2268
{
	struct mv88e6xxx_vtu_stu_entry vlan = {
		.vid = GLOBAL_VTU_VID_MASK, /* all ones */
	};
2269
	u16 fid;
2270 2271
	int err;

2272
	/* Dump port's default Filtering Information Database (VLAN ID 0) */
2273
	err = _mv88e6xxx_port_fid_get(chip, port, &fid);
2274
	if (err)
2275
		return err;
2276

2277
	err = mv88e6xxx_port_db_dump_fid(chip, fid, 0, port, obj, cb);
2278
	if (err)
2279
		return err;
2280

2281
	/* Dump VLANs' Filtering Information Databases */
2282
	err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
2283
	if (err)
2284
		return err;
2285 2286

	do {
2287
		err = _mv88e6xxx_vtu_getnext(chip, &vlan);
2288
		if (err)
2289
			return err;
2290 2291 2292 2293

		if (!vlan.valid)
			break;

2294 2295
		err = mv88e6xxx_port_db_dump_fid(chip, vlan.fid, vlan.vid, port,
						 obj, cb);
2296
		if (err)
2297
			return err;
2298 2299
	} while (vlan.vid < GLOBAL_VTU_VID_MASK);

2300 2301 2302 2303 2304 2305 2306
	return err;
}

static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_fdb *fdb,
				   int (*cb)(struct switchdev_obj *obj))
{
V
Vivien Didelot 已提交
2307
	struct mv88e6xxx_chip *chip = ds->priv;
2308 2309 2310 2311
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_dump(chip, port, &fdb->obj, cb);
2312
	mutex_unlock(&chip->reg_lock);
2313 2314 2315 2316

	return err;
}

2317 2318
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
				      struct net_device *bridge)
2319
{
V
Vivien Didelot 已提交
2320
	struct mv88e6xxx_chip *chip = ds->priv;
2321
	int i, err = 0;
2322

2323
	mutex_lock(&chip->reg_lock);
2324

2325
	/* Assign the bridge and remap each port's VLANTable */
2326
	chip->ports[port].bridge_dev = bridge;
2327

2328 2329 2330
	for (i = 0; i < chip->info->num_ports; ++i) {
		if (chip->ports[i].bridge_dev == bridge) {
			err = _mv88e6xxx_port_based_vlan_map(chip, i);
2331 2332 2333 2334 2335
			if (err)
				break;
		}
	}

2336
	mutex_unlock(&chip->reg_lock);
2337

2338
	return err;
2339 2340
}

2341
static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
2342
{
V
Vivien Didelot 已提交
2343
	struct mv88e6xxx_chip *chip = ds->priv;
2344
	struct net_device *bridge = chip->ports[port].bridge_dev;
2345
	int i;
2346

2347
	mutex_lock(&chip->reg_lock);
2348

2349
	/* Unassign the bridge and remap each port's VLANTable */
2350
	chip->ports[port].bridge_dev = NULL;
2351

2352 2353 2354
	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))
2355 2356
				netdev_warn(ds->ports[i].netdev,
					    "failed to remap\n");
2357

2358
	mutex_unlock(&chip->reg_lock);
2359 2360
}

2361
static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2362
{
2363
	bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
2364
	u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2365
	struct gpio_desc *gpiod = chip->reset;
2366 2367 2368 2369 2370
	unsigned long timeout;
	int ret;
	int i;

	/* Set all ports to the disabled state. */
2371 2372
	for (i = 0; i < chip->info->num_ports; i++) {
		ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
2373 2374 2375
		if (ret < 0)
			return ret;

2376
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397
					   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)
2398
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
2399
	else
2400
		ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
2401 2402 2403 2404 2405 2406
	if (ret)
		return ret;

	/* Wait up to one second for reset to complete. */
	timeout = jiffies + 1 * HZ;
	while (time_before(jiffies, timeout)) {
2407
		ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422
		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;
}

2423
static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
2424
{
2425 2426
	u16 val;
	int err;
2427

2428 2429 2430 2431
	/* Clear Power Down bit */
	err = mv88e6xxx_serdes_read(chip, MII_BMCR, &val);
	if (err)
		return err;
2432

2433 2434 2435
	if (val & BMCR_PDOWN) {
		val &= ~BMCR_PDOWN;
		err = mv88e6xxx_serdes_write(chip, MII_BMCR, val);
2436 2437
	}

2438
	return err;
2439 2440
}

2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451
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);
}

2452
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
2453
{
2454
	struct dsa_switch *ds = chip->ds;
2455
	int ret;
2456
	u16 reg;
2457

2458 2459 2460 2461
	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)) {
2462 2463 2464 2465 2466 2467
		/* 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.
		 */
2468
		reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
2469
		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
2470
			reg &= ~PORT_PCS_CTRL_UNFORCED;
2471 2472 2473 2474
			reg |= PORT_PCS_CTRL_FORCE_LINK |
				PORT_PCS_CTRL_LINK_UP |
				PORT_PCS_CTRL_DUPLEX_FULL |
				PORT_PCS_CTRL_FORCE_DUPLEX;
2475
			if (mv88e6xxx_6065_family(chip))
2476 2477 2478 2479 2480 2481 2482
				reg |= PORT_PCS_CTRL_100;
			else
				reg |= PORT_PCS_CTRL_1000;
		} else {
			reg |= PORT_PCS_CTRL_UNFORCED;
		}

2483
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2484 2485
					   PORT_PCS_CTRL, reg);
		if (ret)
2486
			return ret;
2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503
	}

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

2532 2533 2534 2535 2536
		if (port == dsa_upstream_port(ds))
			reg |= PORT_CONTROL_FORWARD_UNKNOWN |
				PORT_CONTROL_FORWARD_UNKNOWN_MC;
	}
	if (reg) {
2537
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2538 2539
					   PORT_CONTROL, reg);
		if (ret)
2540
			return ret;
2541 2542
	}

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

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

2573 2574
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
2575 2576
		reg |= PORT_CONTROL_2_JUMBO_10240;

2577
	if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
2578 2579 2580 2581 2582 2583 2584 2585 2586
		/* 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;
	}

2587
	reg |= PORT_CONTROL_2_8021Q_DISABLED;
2588

2589
	if (reg) {
2590
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2591 2592
					   PORT_CONTROL_2, reg);
		if (ret)
2593
			return ret;
2594 2595 2596 2597 2598 2599 2600
	}

	/* 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.
	 */
2601
	reg = 1 << port;
2602 2603
	/* Disable learning for CPU port */
	if (dsa_is_cpu_port(ds, port))
2604
		reg = 0;
2605

2606 2607
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
				   reg);
2608
	if (ret)
2609
		return ret;
2610 2611

	/* Egress rate control 2: disable egress rate control. */
2612
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_RATE_CONTROL_2,
2613 2614
				   0x0000);
	if (ret)
2615
		return ret;
2616

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

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

		/* Port Ethertype: use the Ethertype DSA Ethertype
		 * value.
		 */
2646 2647 2648 2649 2650 2651 2652
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA)) {
			ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
						   PORT_ETH_TYPE, ETH_P_EDSA);
			if (ret)
				return ret;
		}

2653 2654 2655
		/* Tag Remap: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2656
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2657 2658
					   PORT_TAG_REGMAP_0123, 0x3210);
		if (ret)
2659
			return ret;
2660 2661 2662 2663

		/* Tag Remap 2: use an identity 802.1p prio -> switch
		 * prio mapping.
		 */
2664
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2665 2666
					   PORT_TAG_REGMAP_4567, 0x7654);
		if (ret)
2667
			return ret;
2668 2669
	}

2670
	/* Rate Control: disable ingress rate limiting. */
2671 2672 2673 2674
	if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
	    mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
	    mv88e6xxx_6320_family(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
2675 2676
					   PORT_RATE_CONTROL, 0x0001);
		if (ret)
2677
			return ret;
2678 2679 2680 2681 2682
	} else if (mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip)) {
		ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
					   PORT_RATE_CONTROL, 0x0000);
		if (ret)
			return ret;
2683 2684
	}

2685 2686
	/* Port Control 1: disable trunking, disable sending
	 * learning messages to this port.
2687
	 */
2688 2689
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
				   0x0000);
2690
	if (ret)
2691
		return ret;
2692

2693
	/* Port based VLAN map: give each port the same default address
2694 2695
	 * database, and allow bidirectional communication between the
	 * CPU and DSA port(s), and the other ports.
2696
	 */
2697
	ret = _mv88e6xxx_port_fid_set(chip, port, 0);
2698
	if (ret)
2699
		return ret;
2700

2701
	ret = _mv88e6xxx_port_based_vlan_map(chip, port);
2702
	if (ret)
2703
		return ret;
2704 2705 2706 2707

	/* Default VLAN ID and priority: don't set a default VLAN
	 * ID, and set the default packet priority to zero.
	 */
2708
	ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_DEFAULT_VLAN,
2709
				   0x0000);
2710 2711
	if (ret)
		return ret;
2712 2713 2714 2715

	return 0;
}

2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733
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]);
}

2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760
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);
}

2761 2762 2763
static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
				     unsigned int ageing_time)
{
V
Vivien Didelot 已提交
2764
	struct mv88e6xxx_chip *chip = ds->priv;
2765 2766 2767 2768 2769 2770 2771 2772 2773
	int err;

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

	return err;
}

2774
static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2775
{
2776
	struct dsa_switch *ds = chip->ds;
2777
	u32 upstream_port = dsa_upstream_port(ds);
2778
	u16 reg;
2779
	int err;
2780

2781 2782 2783 2784
	/* Enable the PHY Polling Unit if present, don't discard any packets,
	 * and mask all interrupt sources.
	 */
	reg = 0;
2785 2786
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
	    mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
2787 2788
		reg |= GLOBAL_CONTROL_PPU_ENABLE;

2789
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
2790 2791 2792
	if (err)
		return err;

2793 2794 2795 2796 2797 2798
	/* 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;
2799 2800
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
				   reg);
2801 2802 2803
	if (err)
		return err;

2804
	/* Disable remote management, and set the switch's DSA device number. */
2805
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2,
2806 2807 2808 2809 2810
				   GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
				   (ds->index & 0x1f));
	if (err)
		return err;

2811 2812 2813 2814 2815
	/* Clear all the VTU and STU entries */
	err = _mv88e6xxx_vtu_stu_flush(chip);
	if (err < 0)
		return err;

2816 2817 2818 2819
	/* Set the default address aging time to 5 minutes, and
	 * enable address learn messages to be sent to all message
	 * ports.
	 */
2820 2821
	err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
			      GLOBAL_ATU_CONTROL_LEARN2ALL);
2822
	if (err)
2823
		return err;
2824

2825 2826
	err = mv88e6xxx_g1_set_age_time(chip, 300000);
	if (err)
2827 2828 2829 2830 2831 2832 2833
		return err;

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

2834
	/* Configure the IP ToS mapping registers. */
2835
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000);
2836
	if (err)
2837
		return err;
2838
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000);
2839
	if (err)
2840
		return err;
2841
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555);
2842
	if (err)
2843
		return err;
2844
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555);
2845
	if (err)
2846
		return err;
2847
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa);
2848
	if (err)
2849
		return err;
2850
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa);
2851
	if (err)
2852
		return err;
2853
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff);
2854
	if (err)
2855
		return err;
2856
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff);
2857
	if (err)
2858
		return err;
2859 2860

	/* Configure the IEEE 802.1p priority mapping register. */
2861
	err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41);
2862
	if (err)
2863
		return err;
2864

2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878
	/* 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;
}

2879
static int mv88e6xxx_setup(struct dsa_switch *ds)
2880
{
V
Vivien Didelot 已提交
2881
	struct mv88e6xxx_chip *chip = ds->priv;
2882
	int err;
2883 2884
	int i;

2885 2886
	chip->ds = ds;
	ds->slave_mii_bus = chip->mdio_bus;
2887

2888
	mutex_lock(&chip->reg_lock);
2889

2890
	err = mv88e6xxx_switch_reset(chip);
2891 2892 2893
	if (err)
		goto unlock;

2894 2895 2896 2897 2898 2899 2900 2901 2902
	/* 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);
2903 2904 2905
	if (err)
		goto unlock;

2906 2907 2908
	/* Setup Switch Global 2 Registers */
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
		err = mv88e6xxx_g2_setup(chip);
2909 2910 2911
		if (err)
			goto unlock;
	}
2912

2913
unlock:
2914
	mutex_unlock(&chip->reg_lock);
2915

2916
	return err;
2917 2918
}

2919 2920
static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
V
Vivien Didelot 已提交
2921
	struct mv88e6xxx_chip *chip = ds->priv;
2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936
	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;
}

2937
static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg)
2938
{
2939
	struct mv88e6xxx_chip *chip = bus->priv;
2940 2941
	u16 val;
	int err;
2942

2943
	if (phy >= chip->info->num_ports)
2944
		return 0xffff;
2945

2946
	mutex_lock(&chip->reg_lock);
2947
	err = mv88e6xxx_phy_read(chip, phy, reg, &val);
2948
	mutex_unlock(&chip->reg_lock);
2949 2950

	return err ? err : val;
2951 2952
}

2953
static int mv88e6xxx_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val)
2954
{
2955
	struct mv88e6xxx_chip *chip = bus->priv;
2956
	int err;
2957

2958
	if (phy >= chip->info->num_ports)
2959
		return 0xffff;
2960

2961
	mutex_lock(&chip->reg_lock);
2962
	err = mv88e6xxx_phy_write(chip, phy, reg, val);
2963
	mutex_unlock(&chip->reg_lock);
2964 2965

	return err;
2966 2967
}

2968
static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
2969 2970 2971 2972 2973 2974 2975
				   struct device_node *np)
{
	static int index;
	struct mii_bus *bus;
	int err;

	if (np)
2976
		chip->mdio_np = of_get_child_by_name(np, "mdio");
2977

2978
	bus = devm_mdiobus_alloc(chip->dev);
2979 2980 2981
	if (!bus)
		return -ENOMEM;

2982
	bus->priv = (void *)chip;
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992
	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;
2993
	bus->parent = chip->dev;
2994

2995 2996
	if (chip->mdio_np)
		err = of_mdiobus_register(bus, chip->mdio_np);
2997 2998 2999
	else
		err = mdiobus_register(bus);
	if (err) {
3000
		dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
3001 3002
		goto out;
	}
3003
	chip->mdio_bus = bus;
3004 3005 3006 3007

	return 0;

out:
3008 3009
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3010 3011 3012 3013

	return err;
}

3014
static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
3015 3016

{
3017
	struct mii_bus *bus = chip->mdio_bus;
3018 3019 3020

	mdiobus_unregister(bus);

3021 3022
	if (chip->mdio_np)
		of_node_put(chip->mdio_np);
3023 3024
}

3025 3026 3027 3028
#ifdef CONFIG_NET_DSA_HWMON

static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
{
V
Vivien Didelot 已提交
3029
	struct mv88e6xxx_chip *chip = ds->priv;
3030
	u16 val;
3031 3032 3033 3034
	int ret;

	*temp = 0;

3035
	mutex_lock(&chip->reg_lock);
3036

3037
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
3038 3039 3040 3041
	if (ret < 0)
		goto error;

	/* Enable temperature sensor */
3042
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
3043 3044 3045
	if (ret < 0)
		goto error;

3046
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
3047 3048 3049 3050 3051 3052
	if (ret < 0)
		goto error;

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

3053 3054
	ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
	if (ret < 0)
3055 3056 3057
		goto error;

	/* Disable temperature sensor */
3058
	ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
3059 3060 3061 3062 3063 3064
	if (ret < 0)
		goto error;

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

error:
3065
	mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
3066
	mutex_unlock(&chip->reg_lock);
3067 3068 3069 3070 3071
	return ret;
}

static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
{
V
Vivien Didelot 已提交
3072
	struct mv88e6xxx_chip *chip = ds->priv;
3073
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3074
	u16 val;
3075 3076 3077 3078
	int ret;

	*temp = 0;

3079 3080 3081
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
	mutex_unlock(&chip->reg_lock);
3082 3083 3084
	if (ret < 0)
		return ret;

3085
	*temp = (val & 0xff) - 25;
3086 3087 3088 3089

	return 0;
}

3090
static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
3091
{
V
Vivien Didelot 已提交
3092
	struct mv88e6xxx_chip *chip = ds->priv;
3093

3094
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
3095 3096
		return -EOPNOTSUPP;

3097
	if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
3098 3099 3100 3101 3102
		return mv88e63xx_get_temp(ds, temp);

	return mv88e61xx_get_temp(ds, temp);
}

3103
static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
3104
{
V
Vivien Didelot 已提交
3105
	struct mv88e6xxx_chip *chip = ds->priv;
3106
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3107
	u16 val;
3108 3109
	int ret;

3110
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3111 3112 3113 3114
		return -EOPNOTSUPP;

	*temp = 0;

3115 3116 3117
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3118 3119 3120
	if (ret < 0)
		return ret;

3121
	*temp = (((val >> 8) & 0x1f) * 5) - 25;
3122 3123 3124 3125

	return 0;
}

3126
static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
3127
{
V
Vivien Didelot 已提交
3128
	struct mv88e6xxx_chip *chip = ds->priv;
3129
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3130 3131
	u16 val;
	int err;
3132

3133
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3134 3135
		return -EOPNOTSUPP;

3136 3137 3138 3139
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	if (err)
		goto unlock;
3140
	temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
3141 3142 3143 3144 3145 3146
	err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
				       (val & 0xe0ff) | (temp << 8));
unlock:
	mutex_unlock(&chip->reg_lock);

	return err;
3147 3148
}

3149
static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
3150
{
V
Vivien Didelot 已提交
3151
	struct mv88e6xxx_chip *chip = ds->priv;
3152
	int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
3153
	u16 val;
3154 3155
	int ret;

3156
	if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
3157 3158 3159 3160
		return -EOPNOTSUPP;

	*alarm = false;

3161 3162 3163
	mutex_lock(&chip->reg_lock);
	ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
	mutex_unlock(&chip->reg_lock);
3164 3165 3166
	if (ret < 0)
		return ret;

3167
	*alarm = !!(val & 0x40);
3168 3169 3170 3171 3172

	return 0;
}
#endif /* CONFIG_NET_DSA_HWMON */

3173 3174
static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
V
Vivien Didelot 已提交
3175
	struct mv88e6xxx_chip *chip = ds->priv;
3176 3177 3178 3179 3180 3181 3182

	return chip->eeprom_len;
}

static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
V
Vivien Didelot 已提交
3183
	struct mv88e6xxx_chip *chip = ds->priv;
3184 3185 3186 3187 3188
	int err;

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
3189
		err = mv88e6xxx_g2_get_eeprom16(chip, eeprom, data);
3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	if (err)
		return err;

	eeprom->magic = 0xc3ec4951;

	return 0;
}

static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
				struct ethtool_eeprom *eeprom, u8 *data)
{
V
Vivien Didelot 已提交
3206
	struct mv88e6xxx_chip *chip = ds->priv;
3207 3208 3209 3210 3211 3212 3213 3214
	int err;

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

	mutex_lock(&chip->reg_lock);

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
3215
		err = mv88e6xxx_g2_set_eeprom16(chip, eeprom, data);
3216 3217 3218 3219 3220 3221 3222 3223
	else
		err = -EOPNOTSUPP;

	mutex_unlock(&chip->reg_lock);

	return err;
}

3224 3225 3226 3227 3228 3229 3230
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,
3231
		.port_base_addr = 0x10,
3232
		.age_time_coeff = 15000,
3233 3234 3235 3236 3237 3238 3239 3240 3241
		.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,
3242
		.port_base_addr = 0x10,
3243
		.age_time_coeff = 15000,
3244 3245 3246 3247 3248 3249 3250 3251 3252
		.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,
3253
		.port_base_addr = 0x10,
3254
		.age_time_coeff = 15000,
3255 3256 3257 3258 3259 3260 3261 3262 3263
		.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,
3264
		.port_base_addr = 0x10,
3265
		.age_time_coeff = 15000,
3266 3267 3268 3269 3270 3271 3272 3273 3274
		.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,
3275
		.port_base_addr = 0x10,
3276
		.age_time_coeff = 15000,
3277 3278 3279 3280 3281 3282 3283 3284 3285
		.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,
3286
		.port_base_addr = 0x10,
3287
		.age_time_coeff = 15000,
3288 3289 3290 3291 3292 3293 3294 3295 3296
		.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,
3297
		.port_base_addr = 0x10,
3298
		.age_time_coeff = 15000,
3299 3300 3301 3302 3303 3304 3305 3306 3307
		.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,
3308
		.port_base_addr = 0x10,
3309
		.age_time_coeff = 15000,
3310 3311 3312 3313 3314 3315 3316 3317 3318
		.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,
3319
		.port_base_addr = 0x10,
3320
		.age_time_coeff = 15000,
3321 3322 3323 3324 3325 3326 3327 3328 3329
		.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,
3330
		.port_base_addr = 0x10,
3331
		.age_time_coeff = 15000,
3332 3333 3334 3335 3336 3337 3338 3339 3340
		.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,
3341
		.port_base_addr = 0x10,
3342
		.age_time_coeff = 15000,
3343 3344 3345 3346 3347 3348 3349 3350 3351
		.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,
3352
		.port_base_addr = 0x10,
3353
		.age_time_coeff = 15000,
3354 3355 3356 3357 3358 3359 3360 3361 3362
		.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,
3363
		.port_base_addr = 0x10,
3364
		.age_time_coeff = 15000,
3365 3366 3367 3368 3369 3370 3371 3372 3373
		.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,
3374
		.port_base_addr = 0x10,
3375
		.age_time_coeff = 15000,
3376 3377 3378 3379 3380 3381 3382 3383 3384
		.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,
3385
		.port_base_addr = 0x10,
3386
		.age_time_coeff = 15000,
3387 3388 3389 3390 3391 3392 3393 3394 3395
		.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,
3396
		.port_base_addr = 0x10,
3397
		.age_time_coeff = 15000,
3398 3399 3400 3401 3402 3403 3404 3405 3406
		.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,
3407
		.port_base_addr = 0x10,
3408
		.age_time_coeff = 15000,
3409 3410 3411 3412
		.flags = MV88E6XXX_FLAGS_FAMILY_6352,
	},
};

3413
static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
3414
{
3415
	int i;
3416

3417 3418 3419
	for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
		if (mv88e6xxx_table[i].prod_num == prod_num)
			return &mv88e6xxx_table[i];
3420 3421 3422 3423

	return NULL;
}

3424
static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
3425 3426
{
	const struct mv88e6xxx_info *info;
3427 3428 3429
	unsigned int prod_num, rev;
	u16 id;
	int err;
3430

3431 3432 3433 3434 3435
	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_read(chip, 0, PORT_SWITCH_ID, &id);
	mutex_unlock(&chip->reg_lock);
	if (err)
		return err;
3436 3437 3438 3439 3440 3441 3442 3443

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

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

3444
	/* Update the compatible info with the probed one */
3445
	chip->info = info;
3446

3447 3448
	dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
		 chip->info->prod_num, chip->info->name, rev);
3449 3450 3451 3452

	return 0;
}

3453
static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3454
{
3455
	struct mv88e6xxx_chip *chip;
3456

3457 3458
	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
	if (!chip)
3459 3460
		return NULL;

3461
	chip->dev = dev;
3462

3463
	mutex_init(&chip->reg_lock);
3464

3465
	return chip;
3466 3467
}

3468 3469 3470 3471 3472
static const struct mv88e6xxx_ops mv88e6xxx_g2_smi_phy_ops = {
	.read = mv88e6xxx_g2_smi_phy_read,
	.write = mv88e6xxx_g2_smi_phy_write,
};

3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489
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;
	}
}

3490 3491 3492 3493 3494 3495 3496
static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
{
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
		mv88e6xxx_ppu_state_destroy(chip);
	}
}

3497
static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
3498 3499 3500 3501 3502 3503
			      struct mii_bus *bus, int sw_addr)
{
	/* ADDR[0] pin is unavailable externally and considered zero */
	if (sw_addr & 0x1)
		return -EINVAL;

3504
	if (sw_addr == 0)
3505
		chip->smi_ops = &mv88e6xxx_smi_single_chip_ops;
3506
	else if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_MULTI_CHIP))
3507
		chip->smi_ops = &mv88e6xxx_smi_multi_chip_ops;
3508 3509 3510
	else
		return -EINVAL;

3511 3512
	chip->bus = bus;
	chip->sw_addr = sw_addr;
3513 3514 3515 3516

	return 0;
}

3517 3518
static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds)
{
V
Vivien Didelot 已提交
3519
	struct mv88e6xxx_chip *chip = ds->priv;
3520 3521 3522 3523 3524

	if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA))
		return DSA_TAG_PROTO_EDSA;

	return DSA_TAG_PROTO_DSA;
3525 3526
}

3527 3528 3529
static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
				       struct device *host_dev, int sw_addr,
				       void **priv)
3530
{
3531
	struct mv88e6xxx_chip *chip;
3532
	struct mii_bus *bus;
3533
	int err;
3534

3535
	bus = dsa_host_dev_to_mii_bus(host_dev);
3536 3537 3538
	if (!bus)
		return NULL;

3539 3540
	chip = mv88e6xxx_alloc_chip(dsa_dev);
	if (!chip)
3541 3542
		return NULL;

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

3546
	err = mv88e6xxx_smi_init(chip, bus, sw_addr);
3547 3548 3549
	if (err)
		goto free;

3550
	err = mv88e6xxx_detect(chip);
3551
	if (err)
3552
		goto free;
3553

3554 3555
	mv88e6xxx_phy_init(chip);

3556
	err = mv88e6xxx_mdio_register(chip, NULL);
3557
	if (err)
3558
		goto free;
3559

3560
	*priv = chip;
3561

3562
	return chip->info->name;
3563
free:
3564
	devm_kfree(dsa_dev, chip);
3565 3566

	return NULL;
3567 3568
}

3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583
static int mv88e6xxx_port_mdb_prepare(struct dsa_switch *ds, int port,
				      const struct switchdev_obj_port_mdb *mdb,
				      struct switchdev_trans *trans)
{
	/* We don't need any dynamic resource from the kernel (yet),
	 * so skip the prepare phase.
	 */

	return 0;
}

static void mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
				   const struct switchdev_obj_port_mdb *mdb,
				   struct switchdev_trans *trans)
{
V
Vivien Didelot 已提交
3584
	struct mv88e6xxx_chip *chip = ds->priv;
3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595

	mutex_lock(&chip->reg_lock);
	if (mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
					 GLOBAL_ATU_DATA_STATE_MC_STATIC))
		netdev_err(ds->ports[port].netdev, "failed to load multicast MAC address\n");
	mutex_unlock(&chip->reg_lock);
}

static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port,
				  const struct switchdev_obj_port_mdb *mdb)
{
V
Vivien Didelot 已提交
3596
	struct mv88e6xxx_chip *chip = ds->priv;
3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
					   GLOBAL_ATU_DATA_STATE_UNUSED);
	mutex_unlock(&chip->reg_lock);

	return err;
}

static int mv88e6xxx_port_mdb_dump(struct dsa_switch *ds, int port,
				   struct switchdev_obj_port_mdb *mdb,
				   int (*cb)(struct switchdev_obj *obj))
{
V
Vivien Didelot 已提交
3611
	struct mv88e6xxx_chip *chip = ds->priv;
3612 3613 3614 3615 3616 3617 3618 3619 3620
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_port_db_dump(chip, port, &mdb->obj, cb);
	mutex_unlock(&chip->reg_lock);

	return err;
}

3621
static struct dsa_switch_ops mv88e6xxx_switch_ops = {
3622
	.probe			= mv88e6xxx_drv_probe,
3623
	.get_tag_protocol	= mv88e6xxx_get_tag_protocol,
3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637
	.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
3638
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
3639 3640 3641 3642
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
	.get_regs_len		= mv88e6xxx_get_regs_len,
	.get_regs		= mv88e6xxx_get_regs,
3643
	.set_ageing_time	= mv88e6xxx_set_ageing_time,
3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655
	.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,
3656 3657 3658 3659
	.port_mdb_prepare       = mv88e6xxx_port_mdb_prepare,
	.port_mdb_add           = mv88e6xxx_port_mdb_add,
	.port_mdb_del           = mv88e6xxx_port_mdb_del,
	.port_mdb_dump          = mv88e6xxx_port_mdb_dump,
3660 3661
};

3662
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
3663 3664
				     struct device_node *np)
{
3665
	struct device *dev = chip->dev;
3666 3667 3668 3669 3670 3671 3672
	struct dsa_switch *ds;

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

	ds->dev = dev;
3673
	ds->priv = chip;
3674
	ds->ops = &mv88e6xxx_switch_ops;
3675 3676 3677 3678 3679 3680

	dev_set_drvdata(dev, ds);

	return dsa_register_switch(ds, np);
}

3681
static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
3682
{
3683
	dsa_unregister_switch(chip->ds);
3684 3685
}

3686
static int mv88e6xxx_probe(struct mdio_device *mdiodev)
3687
{
3688
	struct device *dev = &mdiodev->dev;
3689
	struct device_node *np = dev->of_node;
3690
	const struct mv88e6xxx_info *compat_info;
3691
	struct mv88e6xxx_chip *chip;
3692
	u32 eeprom_len;
3693
	int err;
3694

3695 3696 3697 3698
	compat_info = of_device_get_match_data(dev);
	if (!compat_info)
		return -EINVAL;

3699 3700
	chip = mv88e6xxx_alloc_chip(dev);
	if (!chip)
3701 3702
		return -ENOMEM;

3703
	chip->info = compat_info;
3704

3705
	err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
3706 3707
	if (err)
		return err;
3708

3709
	err = mv88e6xxx_detect(chip);
3710 3711
	if (err)
		return err;
3712

3713 3714
	mv88e6xxx_phy_init(chip);

3715 3716 3717
	chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
	if (IS_ERR(chip->reset))
		return PTR_ERR(chip->reset);
3718

3719
	if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
3720
	    !of_property_read_u32(np, "eeprom-length", &eeprom_len))
3721
		chip->eeprom_len = eeprom_len;
3722

3723
	err = mv88e6xxx_mdio_register(chip, np);
3724 3725 3726
	if (err)
		return err;

3727
	err = mv88e6xxx_register_switch(chip, np);
3728
	if (err) {
3729
		mv88e6xxx_mdio_unregister(chip);
3730 3731 3732
		return err;
	}

3733 3734
	return 0;
}
3735 3736 3737 3738

static void mv88e6xxx_remove(struct mdio_device *mdiodev)
{
	struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev);
V
Vivien Didelot 已提交
3739
	struct mv88e6xxx_chip *chip = ds->priv;
3740

3741
	mv88e6xxx_phy_destroy(chip);
3742 3743
	mv88e6xxx_unregister_switch(chip);
	mv88e6xxx_mdio_unregister(chip);
3744 3745 3746
}

static const struct of_device_id mv88e6xxx_of_match[] = {
3747 3748 3749 3750
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766
	{ /* 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)
{
3767
	register_switch_driver(&mv88e6xxx_switch_ops);
3768 3769
	return mdio_driver_register(&mv88e6xxx_driver);
}
3770 3771 3772 3773
module_init(mv88e6xxx_init);

static void __exit mv88e6xxx_cleanup(void)
{
3774
	mdio_driver_unregister(&mv88e6xxx_driver);
3775
	unregister_switch_driver(&mv88e6xxx_switch_ops);
3776 3777
}
module_exit(mv88e6xxx_cleanup);
3778 3779 3780 3781

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