cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lan9303-core.c (40352B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2017 Pengutronix, Juergen Borleis <kernel@pengutronix.de>
      4 */
      5#include <linux/kernel.h>
      6#include <linux/module.h>
      7#include <linux/gpio/consumer.h>
      8#include <linux/regmap.h>
      9#include <linux/mutex.h>
     10#include <linux/mii.h>
     11#include <linux/phy.h>
     12#include <linux/if_bridge.h>
     13#include <linux/if_vlan.h>
     14#include <linux/etherdevice.h>
     15
     16#include "lan9303.h"
     17
     18#define LAN9303_NUM_PORTS 3
     19
     20/* 13.2 System Control and Status Registers
     21 * Multiply register number by 4 to get address offset.
     22 */
     23#define LAN9303_CHIP_REV 0x14
     24# define LAN9303_CHIP_ID 0x9303
     25#define LAN9303_IRQ_CFG 0x15
     26# define LAN9303_IRQ_CFG_IRQ_ENABLE BIT(8)
     27# define LAN9303_IRQ_CFG_IRQ_POL BIT(4)
     28# define LAN9303_IRQ_CFG_IRQ_TYPE BIT(0)
     29#define LAN9303_INT_STS 0x16
     30# define LAN9303_INT_STS_PHY_INT2 BIT(27)
     31# define LAN9303_INT_STS_PHY_INT1 BIT(26)
     32#define LAN9303_INT_EN 0x17
     33# define LAN9303_INT_EN_PHY_INT2_EN BIT(27)
     34# define LAN9303_INT_EN_PHY_INT1_EN BIT(26)
     35#define LAN9303_HW_CFG 0x1D
     36# define LAN9303_HW_CFG_READY BIT(27)
     37# define LAN9303_HW_CFG_AMDX_EN_PORT2 BIT(26)
     38# define LAN9303_HW_CFG_AMDX_EN_PORT1 BIT(25)
     39#define LAN9303_PMI_DATA 0x29
     40#define LAN9303_PMI_ACCESS 0x2A
     41# define LAN9303_PMI_ACCESS_PHY_ADDR(x) (((x) & 0x1f) << 11)
     42# define LAN9303_PMI_ACCESS_MIIRINDA(x) (((x) & 0x1f) << 6)
     43# define LAN9303_PMI_ACCESS_MII_BUSY BIT(0)
     44# define LAN9303_PMI_ACCESS_MII_WRITE BIT(1)
     45#define LAN9303_MANUAL_FC_1 0x68
     46#define LAN9303_MANUAL_FC_2 0x69
     47#define LAN9303_MANUAL_FC_0 0x6a
     48#define LAN9303_SWITCH_CSR_DATA 0x6b
     49#define LAN9303_SWITCH_CSR_CMD 0x6c
     50#define LAN9303_SWITCH_CSR_CMD_BUSY BIT(31)
     51#define LAN9303_SWITCH_CSR_CMD_RW BIT(30)
     52#define LAN9303_SWITCH_CSR_CMD_LANES (BIT(19) | BIT(18) | BIT(17) | BIT(16))
     53#define LAN9303_VIRT_PHY_BASE 0x70
     54#define LAN9303_VIRT_SPECIAL_CTRL 0x77
     55#define  LAN9303_VIRT_SPECIAL_TURBO BIT(10) /*Turbo MII Enable*/
     56
     57/*13.4 Switch Fabric Control and Status Registers
     58 * Accessed indirectly via SWITCH_CSR_CMD, SWITCH_CSR_DATA.
     59 */
     60#define LAN9303_SW_DEV_ID 0x0000
     61#define LAN9303_SW_RESET 0x0001
     62#define LAN9303_SW_RESET_RESET BIT(0)
     63#define LAN9303_SW_IMR 0x0004
     64#define LAN9303_SW_IPR 0x0005
     65#define LAN9303_MAC_VER_ID_0 0x0400
     66#define LAN9303_MAC_RX_CFG_0 0x0401
     67# define LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES BIT(1)
     68# define LAN9303_MAC_RX_CFG_X_RX_ENABLE BIT(0)
     69#define LAN9303_MAC_RX_UNDSZE_CNT_0 0x0410
     70#define LAN9303_MAC_RX_64_CNT_0 0x0411
     71#define LAN9303_MAC_RX_127_CNT_0 0x0412
     72#define LAN9303_MAC_RX_255_CNT_0 0x413
     73#define LAN9303_MAC_RX_511_CNT_0 0x0414
     74#define LAN9303_MAC_RX_1023_CNT_0 0x0415
     75#define LAN9303_MAC_RX_MAX_CNT_0 0x0416
     76#define LAN9303_MAC_RX_OVRSZE_CNT_0 0x0417
     77#define LAN9303_MAC_RX_PKTOK_CNT_0 0x0418
     78#define LAN9303_MAC_RX_CRCERR_CNT_0 0x0419
     79#define LAN9303_MAC_RX_MULCST_CNT_0 0x041a
     80#define LAN9303_MAC_RX_BRDCST_CNT_0 0x041b
     81#define LAN9303_MAC_RX_PAUSE_CNT_0 0x041c
     82#define LAN9303_MAC_RX_FRAG_CNT_0 0x041d
     83#define LAN9303_MAC_RX_JABB_CNT_0 0x041e
     84#define LAN9303_MAC_RX_ALIGN_CNT_0 0x041f
     85#define LAN9303_MAC_RX_PKTLEN_CNT_0 0x0420
     86#define LAN9303_MAC_RX_GOODPKTLEN_CNT_0 0x0421
     87#define LAN9303_MAC_RX_SYMBL_CNT_0 0x0422
     88#define LAN9303_MAC_RX_CTLFRM_CNT_0 0x0423
     89
     90#define LAN9303_MAC_TX_CFG_0 0x0440
     91# define LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT (21 << 2)
     92# define LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE BIT(1)
     93# define LAN9303_MAC_TX_CFG_X_TX_ENABLE BIT(0)
     94#define LAN9303_MAC_TX_DEFER_CNT_0 0x0451
     95#define LAN9303_MAC_TX_PAUSE_CNT_0 0x0452
     96#define LAN9303_MAC_TX_PKTOK_CNT_0 0x0453
     97#define LAN9303_MAC_TX_64_CNT_0 0x0454
     98#define LAN9303_MAC_TX_127_CNT_0 0x0455
     99#define LAN9303_MAC_TX_255_CNT_0 0x0456
    100#define LAN9303_MAC_TX_511_CNT_0 0x0457
    101#define LAN9303_MAC_TX_1023_CNT_0 0x0458
    102#define LAN9303_MAC_TX_MAX_CNT_0 0x0459
    103#define LAN9303_MAC_TX_UNDSZE_CNT_0 0x045a
    104#define LAN9303_MAC_TX_PKTLEN_CNT_0 0x045c
    105#define LAN9303_MAC_TX_BRDCST_CNT_0 0x045d
    106#define LAN9303_MAC_TX_MULCST_CNT_0 0x045e
    107#define LAN9303_MAC_TX_LATECOL_0 0x045f
    108#define LAN9303_MAC_TX_EXCOL_CNT_0 0x0460
    109#define LAN9303_MAC_TX_SNGLECOL_CNT_0 0x0461
    110#define LAN9303_MAC_TX_MULTICOL_CNT_0 0x0462
    111#define LAN9303_MAC_TX_TOTALCOL_CNT_0 0x0463
    112
    113#define LAN9303_MAC_VER_ID_1 0x0800
    114#define LAN9303_MAC_RX_CFG_1 0x0801
    115#define LAN9303_MAC_TX_CFG_1 0x0840
    116#define LAN9303_MAC_VER_ID_2 0x0c00
    117#define LAN9303_MAC_RX_CFG_2 0x0c01
    118#define LAN9303_MAC_TX_CFG_2 0x0c40
    119#define LAN9303_SWE_ALR_CMD 0x1800
    120# define LAN9303_ALR_CMD_MAKE_ENTRY    BIT(2)
    121# define LAN9303_ALR_CMD_GET_FIRST     BIT(1)
    122# define LAN9303_ALR_CMD_GET_NEXT      BIT(0)
    123#define LAN9303_SWE_ALR_WR_DAT_0 0x1801
    124#define LAN9303_SWE_ALR_WR_DAT_1 0x1802
    125# define LAN9303_ALR_DAT1_VALID        BIT(26)
    126# define LAN9303_ALR_DAT1_END_OF_TABL  BIT(25)
    127# define LAN9303_ALR_DAT1_AGE_OVERRID  BIT(25)
    128# define LAN9303_ALR_DAT1_STATIC       BIT(24)
    129# define LAN9303_ALR_DAT1_PORT_BITOFFS  16
    130# define LAN9303_ALR_DAT1_PORT_MASK    (7 << LAN9303_ALR_DAT1_PORT_BITOFFS)
    131#define LAN9303_SWE_ALR_RD_DAT_0 0x1805
    132#define LAN9303_SWE_ALR_RD_DAT_1 0x1806
    133#define LAN9303_SWE_ALR_CMD_STS 0x1808
    134# define ALR_STS_MAKE_PEND     BIT(0)
    135#define LAN9303_SWE_VLAN_CMD 0x180b
    136# define LAN9303_SWE_VLAN_CMD_RNW BIT(5)
    137# define LAN9303_SWE_VLAN_CMD_PVIDNVLAN BIT(4)
    138#define LAN9303_SWE_VLAN_WR_DATA 0x180c
    139#define LAN9303_SWE_VLAN_RD_DATA 0x180e
    140# define LAN9303_SWE_VLAN_MEMBER_PORT2 BIT(17)
    141# define LAN9303_SWE_VLAN_UNTAG_PORT2 BIT(16)
    142# define LAN9303_SWE_VLAN_MEMBER_PORT1 BIT(15)
    143# define LAN9303_SWE_VLAN_UNTAG_PORT1 BIT(14)
    144# define LAN9303_SWE_VLAN_MEMBER_PORT0 BIT(13)
    145# define LAN9303_SWE_VLAN_UNTAG_PORT0 BIT(12)
    146#define LAN9303_SWE_VLAN_CMD_STS 0x1810
    147#define LAN9303_SWE_GLB_INGRESS_CFG 0x1840
    148# define LAN9303_SWE_GLB_INGR_IGMP_TRAP BIT(7)
    149# define LAN9303_SWE_GLB_INGR_IGMP_PORT(p) BIT(10 + p)
    150#define LAN9303_SWE_PORT_STATE 0x1843
    151# define LAN9303_SWE_PORT_STATE_FORWARDING_PORT2 (0)
    152# define LAN9303_SWE_PORT_STATE_LEARNING_PORT2 BIT(5)
    153# define LAN9303_SWE_PORT_STATE_BLOCKING_PORT2 BIT(4)
    154# define LAN9303_SWE_PORT_STATE_FORWARDING_PORT1 (0)
    155# define LAN9303_SWE_PORT_STATE_LEARNING_PORT1 BIT(3)
    156# define LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 BIT(2)
    157# define LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 (0)
    158# define LAN9303_SWE_PORT_STATE_LEARNING_PORT0 BIT(1)
    159# define LAN9303_SWE_PORT_STATE_BLOCKING_PORT0 BIT(0)
    160# define LAN9303_SWE_PORT_STATE_DISABLED_PORT0 (3)
    161#define LAN9303_SWE_PORT_MIRROR 0x1846
    162# define LAN9303_SWE_PORT_MIRROR_SNIFF_ALL BIT(8)
    163# define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT2 BIT(7)
    164# define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT1 BIT(6)
    165# define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 BIT(5)
    166# define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 BIT(4)
    167# define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 BIT(3)
    168# define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT0 BIT(2)
    169# define LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING BIT(1)
    170# define LAN9303_SWE_PORT_MIRROR_ENABLE_TX_MIRRORING BIT(0)
    171# define LAN9303_SWE_PORT_MIRROR_DISABLED 0
    172#define LAN9303_SWE_INGRESS_PORT_TYPE 0x1847
    173#define  LAN9303_SWE_INGRESS_PORT_TYPE_VLAN 3
    174#define LAN9303_BM_CFG 0x1c00
    175#define LAN9303_BM_EGRSS_PORT_TYPE 0x1c0c
    176# define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT2 (BIT(17) | BIT(16))
    177# define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT1 (BIT(9) | BIT(8))
    178# define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0 (BIT(1) | BIT(0))
    179
    180#define LAN9303_SWITCH_PORT_REG(port, reg0) (0x400 * (port) + (reg0))
    181
    182/* the built-in PHYs are of type LAN911X */
    183#define MII_LAN911X_SPECIAL_MODES 0x12
    184#define MII_LAN911X_SPECIAL_CONTROL_STATUS 0x1f
    185
    186static const struct regmap_range lan9303_valid_regs[] = {
    187	regmap_reg_range(0x14, 0x17), /* misc, interrupt */
    188	regmap_reg_range(0x19, 0x19), /* endian test */
    189	regmap_reg_range(0x1d, 0x1d), /* hardware config */
    190	regmap_reg_range(0x23, 0x24), /* general purpose timer */
    191	regmap_reg_range(0x27, 0x27), /* counter */
    192	regmap_reg_range(0x29, 0x2a), /* PMI index regs */
    193	regmap_reg_range(0x68, 0x6a), /* flow control */
    194	regmap_reg_range(0x6b, 0x6c), /* switch fabric indirect regs */
    195	regmap_reg_range(0x6d, 0x6f), /* misc */
    196	regmap_reg_range(0x70, 0x77), /* virtual phy */
    197	regmap_reg_range(0x78, 0x7a), /* GPIO */
    198	regmap_reg_range(0x7c, 0x7e), /* MAC & reset */
    199	regmap_reg_range(0x80, 0xb7), /* switch fabric direct regs (wr only) */
    200};
    201
    202static const struct regmap_range lan9303_reserved_ranges[] = {
    203	regmap_reg_range(0x00, 0x13),
    204	regmap_reg_range(0x18, 0x18),
    205	regmap_reg_range(0x1a, 0x1c),
    206	regmap_reg_range(0x1e, 0x22),
    207	regmap_reg_range(0x25, 0x26),
    208	regmap_reg_range(0x28, 0x28),
    209	regmap_reg_range(0x2b, 0x67),
    210	regmap_reg_range(0x7b, 0x7b),
    211	regmap_reg_range(0x7f, 0x7f),
    212	regmap_reg_range(0xb8, 0xff),
    213};
    214
    215const struct regmap_access_table lan9303_register_set = {
    216	.yes_ranges = lan9303_valid_regs,
    217	.n_yes_ranges = ARRAY_SIZE(lan9303_valid_regs),
    218	.no_ranges = lan9303_reserved_ranges,
    219	.n_no_ranges = ARRAY_SIZE(lan9303_reserved_ranges),
    220};
    221EXPORT_SYMBOL(lan9303_register_set);
    222
    223static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
    224{
    225	int ret, i;
    226
    227	/* we can lose arbitration for the I2C case, because the device
    228	 * tries to detect and read an external EEPROM after reset and acts as
    229	 * a master on the shared I2C bus itself. This conflicts with our
    230	 * attempts to access the device as a slave at the same moment.
    231	 */
    232	for (i = 0; i < 5; i++) {
    233		ret = regmap_read(regmap, offset, reg);
    234		if (!ret)
    235			return 0;
    236		if (ret != -EAGAIN)
    237			break;
    238		msleep(500);
    239	}
    240
    241	return -EIO;
    242}
    243
    244static int lan9303_read_wait(struct lan9303 *chip, int offset, u32 mask)
    245{
    246	int i;
    247
    248	for (i = 0; i < 25; i++) {
    249		u32 reg;
    250		int ret;
    251
    252		ret = lan9303_read(chip->regmap, offset, &reg);
    253		if (ret) {
    254			dev_err(chip->dev, "%s failed to read offset %d: %d\n",
    255				__func__, offset, ret);
    256			return ret;
    257		}
    258		if (!(reg & mask))
    259			return 0;
    260		usleep_range(1000, 2000);
    261	}
    262
    263	return -ETIMEDOUT;
    264}
    265
    266static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
    267{
    268	int ret;
    269	u32 val;
    270
    271	if (regnum > MII_EXPANSION)
    272		return -EINVAL;
    273
    274	ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val);
    275	if (ret)
    276		return ret;
    277
    278	return val & 0xffff;
    279}
    280
    281static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val)
    282{
    283	if (regnum > MII_EXPANSION)
    284		return -EINVAL;
    285
    286	return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val);
    287}
    288
    289static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip)
    290{
    291	return lan9303_read_wait(chip, LAN9303_PMI_ACCESS,
    292				 LAN9303_PMI_ACCESS_MII_BUSY);
    293}
    294
    295static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum)
    296{
    297	int ret;
    298	u32 val;
    299
    300	val = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
    301	val |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
    302
    303	mutex_lock(&chip->indirect_mutex);
    304
    305	ret = lan9303_indirect_phy_wait_for_completion(chip);
    306	if (ret)
    307		goto on_error;
    308
    309	/* start the MII read cycle */
    310	ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val);
    311	if (ret)
    312		goto on_error;
    313
    314	ret = lan9303_indirect_phy_wait_for_completion(chip);
    315	if (ret)
    316		goto on_error;
    317
    318	/* read the result of this operation */
    319	ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val);
    320	if (ret)
    321		goto on_error;
    322
    323	mutex_unlock(&chip->indirect_mutex);
    324
    325	return val & 0xffff;
    326
    327on_error:
    328	mutex_unlock(&chip->indirect_mutex);
    329	return ret;
    330}
    331
    332static int lan9303_indirect_phy_write(struct lan9303 *chip, int addr,
    333				      int regnum, u16 val)
    334{
    335	int ret;
    336	u32 reg;
    337
    338	reg = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
    339	reg |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
    340	reg |= LAN9303_PMI_ACCESS_MII_WRITE;
    341
    342	mutex_lock(&chip->indirect_mutex);
    343
    344	ret = lan9303_indirect_phy_wait_for_completion(chip);
    345	if (ret)
    346		goto on_error;
    347
    348	/* write the data first... */
    349	ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val);
    350	if (ret)
    351		goto on_error;
    352
    353	/* ...then start the MII write cycle */
    354	ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg);
    355
    356on_error:
    357	mutex_unlock(&chip->indirect_mutex);
    358	return ret;
    359}
    360
    361const struct lan9303_phy_ops lan9303_indirect_phy_ops = {
    362	.phy_read = lan9303_indirect_phy_read,
    363	.phy_write = lan9303_indirect_phy_write,
    364};
    365EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops);
    366
    367static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
    368{
    369	return lan9303_read_wait(chip, LAN9303_SWITCH_CSR_CMD,
    370				 LAN9303_SWITCH_CSR_CMD_BUSY);
    371}
    372
    373static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
    374{
    375	u32 reg;
    376	int ret;
    377
    378	reg = regnum;
    379	reg |= LAN9303_SWITCH_CSR_CMD_LANES;
    380	reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
    381
    382	mutex_lock(&chip->indirect_mutex);
    383
    384	ret = lan9303_switch_wait_for_completion(chip);
    385	if (ret)
    386		goto on_error;
    387
    388	ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
    389	if (ret) {
    390		dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret);
    391		goto on_error;
    392	}
    393
    394	/* trigger write */
    395	ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
    396	if (ret)
    397		dev_err(chip->dev, "Failed to write csr command reg: %d\n",
    398			ret);
    399
    400on_error:
    401	mutex_unlock(&chip->indirect_mutex);
    402	return ret;
    403}
    404
    405static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)
    406{
    407	u32 reg;
    408	int ret;
    409
    410	reg = regnum;
    411	reg |= LAN9303_SWITCH_CSR_CMD_LANES;
    412	reg |= LAN9303_SWITCH_CSR_CMD_RW;
    413	reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
    414
    415	mutex_lock(&chip->indirect_mutex);
    416
    417	ret = lan9303_switch_wait_for_completion(chip);
    418	if (ret)
    419		goto on_error;
    420
    421	/* trigger read */
    422	ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
    423	if (ret) {
    424		dev_err(chip->dev, "Failed to write csr command reg: %d\n",
    425			ret);
    426		goto on_error;
    427	}
    428
    429	ret = lan9303_switch_wait_for_completion(chip);
    430	if (ret)
    431		goto on_error;
    432
    433	ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
    434	if (ret)
    435		dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret);
    436on_error:
    437	mutex_unlock(&chip->indirect_mutex);
    438	return ret;
    439}
    440
    441static int lan9303_write_switch_reg_mask(struct lan9303 *chip, u16 regnum,
    442					 u32 val, u32 mask)
    443{
    444	int ret;
    445	u32 reg;
    446
    447	ret = lan9303_read_switch_reg(chip, regnum, &reg);
    448	if (ret)
    449		return ret;
    450
    451	reg = (reg & ~mask) | val;
    452
    453	return lan9303_write_switch_reg(chip, regnum, reg);
    454}
    455
    456static int lan9303_write_switch_port(struct lan9303 *chip, int port,
    457				     u16 regnum, u32 val)
    458{
    459	return lan9303_write_switch_reg(
    460		chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
    461}
    462
    463static int lan9303_read_switch_port(struct lan9303 *chip, int port,
    464				    u16 regnum, u32 *val)
    465{
    466	return lan9303_read_switch_reg(
    467		chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
    468}
    469
    470static int lan9303_detect_phy_setup(struct lan9303 *chip)
    471{
    472	int reg;
    473
    474	/* Calculate chip->phy_addr_base:
    475	 * Depending on the 'phy_addr_sel_strap' setting, the three phys are
    476	 * using IDs 0-1-2 or IDs 1-2-3. We cannot read back the
    477	 * 'phy_addr_sel_strap' setting directly, so we need a test, which
    478	 * configuration is active:
    479	 * Special reg 18 of phy 3 reads as 0x0000, if 'phy_addr_sel_strap' is 0
    480	 * and the IDs are 0-1-2, else it contains something different from
    481	 * 0x0000, which means 'phy_addr_sel_strap' is 1 and the IDs are 1-2-3.
    482	 * 0xffff is returned on MDIO read with no response.
    483	 */
    484	reg = chip->ops->phy_read(chip, 3, MII_LAN911X_SPECIAL_MODES);
    485	if (reg < 0) {
    486		dev_err(chip->dev, "Failed to detect phy config: %d\n", reg);
    487		return reg;
    488	}
    489
    490	chip->phy_addr_base = reg != 0 && reg != 0xffff;
    491
    492	dev_dbg(chip->dev, "Phy setup '%s' detected\n",
    493		chip->phy_addr_base ? "1-2-3" : "0-1-2");
    494
    495	return 0;
    496}
    497
    498/* Map ALR-port bits to port bitmap, and back */
    499static const int alrport_2_portmap[] = {1, 2, 4, 0, 3, 5, 6, 7 };
    500static const int portmap_2_alrport[] = {3, 0, 1, 4, 2, 5, 6, 7 };
    501
    502/* Return pointer to first free ALR cache entry, return NULL if none */
    503static struct lan9303_alr_cache_entry *
    504lan9303_alr_cache_find_free(struct lan9303 *chip)
    505{
    506	int i;
    507	struct lan9303_alr_cache_entry *entr = chip->alr_cache;
    508
    509	for (i = 0; i < LAN9303_NUM_ALR_RECORDS; i++, entr++)
    510		if (entr->port_map == 0)
    511			return entr;
    512
    513	return NULL;
    514}
    515
    516/* Return pointer to ALR cache entry matching MAC address */
    517static struct lan9303_alr_cache_entry *
    518lan9303_alr_cache_find_mac(struct lan9303 *chip, const u8 *mac_addr)
    519{
    520	int i;
    521	struct lan9303_alr_cache_entry *entr = chip->alr_cache;
    522
    523	BUILD_BUG_ON_MSG(sizeof(struct lan9303_alr_cache_entry) & 1,
    524			 "ether_addr_equal require u16 alignment");
    525
    526	for (i = 0; i < LAN9303_NUM_ALR_RECORDS; i++, entr++)
    527		if (ether_addr_equal(entr->mac_addr, mac_addr))
    528			return entr;
    529
    530	return NULL;
    531}
    532
    533static int lan9303_csr_reg_wait(struct lan9303 *chip, int regno, u32 mask)
    534{
    535	int i;
    536
    537	for (i = 0; i < 25; i++) {
    538		u32 reg;
    539
    540		lan9303_read_switch_reg(chip, regno, &reg);
    541		if (!(reg & mask))
    542			return 0;
    543		usleep_range(1000, 2000);
    544	}
    545
    546	return -ETIMEDOUT;
    547}
    548
    549static int lan9303_alr_make_entry_raw(struct lan9303 *chip, u32 dat0, u32 dat1)
    550{
    551	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_0, dat0);
    552	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_1, dat1);
    553	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
    554				 LAN9303_ALR_CMD_MAKE_ENTRY);
    555	lan9303_csr_reg_wait(chip, LAN9303_SWE_ALR_CMD_STS, ALR_STS_MAKE_PEND);
    556	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
    557
    558	return 0;
    559}
    560
    561typedef int alr_loop_cb_t(struct lan9303 *chip, u32 dat0, u32 dat1,
    562			  int portmap, void *ctx);
    563
    564static int lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)
    565{
    566	int ret = 0, i;
    567
    568	mutex_lock(&chip->alr_mutex);
    569	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
    570				 LAN9303_ALR_CMD_GET_FIRST);
    571	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
    572
    573	for (i = 1; i < LAN9303_NUM_ALR_RECORDS; i++) {
    574		u32 dat0, dat1;
    575		int alrport, portmap;
    576
    577		lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_0, &dat0);
    578		lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_1, &dat1);
    579		if (dat1 & LAN9303_ALR_DAT1_END_OF_TABL)
    580			break;
    581
    582		alrport = (dat1 & LAN9303_ALR_DAT1_PORT_MASK) >>
    583						LAN9303_ALR_DAT1_PORT_BITOFFS;
    584		portmap = alrport_2_portmap[alrport];
    585
    586		ret = cb(chip, dat0, dat1, portmap, ctx);
    587		if (ret)
    588			break;
    589
    590		lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
    591					 LAN9303_ALR_CMD_GET_NEXT);
    592		lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
    593	}
    594	mutex_unlock(&chip->alr_mutex);
    595
    596	return ret;
    597}
    598
    599static void alr_reg_to_mac(u32 dat0, u32 dat1, u8 mac[6])
    600{
    601	mac[0] = (dat0 >>  0) & 0xff;
    602	mac[1] = (dat0 >>  8) & 0xff;
    603	mac[2] = (dat0 >> 16) & 0xff;
    604	mac[3] = (dat0 >> 24) & 0xff;
    605	mac[4] = (dat1 >>  0) & 0xff;
    606	mac[5] = (dat1 >>  8) & 0xff;
    607}
    608
    609struct del_port_learned_ctx {
    610	int port;
    611};
    612
    613/* Clear learned (non-static) entry on given port */
    614static int alr_loop_cb_del_port_learned(struct lan9303 *chip, u32 dat0,
    615					u32 dat1, int portmap, void *ctx)
    616{
    617	struct del_port_learned_ctx *del_ctx = ctx;
    618	int port = del_ctx->port;
    619
    620	if (((BIT(port) & portmap) == 0) || (dat1 & LAN9303_ALR_DAT1_STATIC))
    621		return 0;
    622
    623	/* learned entries has only one port, we can just delete */
    624	dat1 &= ~LAN9303_ALR_DAT1_VALID; /* delete entry */
    625	lan9303_alr_make_entry_raw(chip, dat0, dat1);
    626
    627	return 0;
    628}
    629
    630struct port_fdb_dump_ctx {
    631	int port;
    632	void *data;
    633	dsa_fdb_dump_cb_t *cb;
    634};
    635
    636static int alr_loop_cb_fdb_port_dump(struct lan9303 *chip, u32 dat0,
    637				     u32 dat1, int portmap, void *ctx)
    638{
    639	struct port_fdb_dump_ctx *dump_ctx = ctx;
    640	u8 mac[ETH_ALEN];
    641	bool is_static;
    642
    643	if ((BIT(dump_ctx->port) & portmap) == 0)
    644		return 0;
    645
    646	alr_reg_to_mac(dat0, dat1, mac);
    647	is_static = !!(dat1 & LAN9303_ALR_DAT1_STATIC);
    648	return dump_ctx->cb(mac, 0, is_static, dump_ctx->data);
    649}
    650
    651/* Set a static ALR entry. Delete entry if port_map is zero */
    652static void lan9303_alr_set_entry(struct lan9303 *chip, const u8 *mac,
    653				  u8 port_map, bool stp_override)
    654{
    655	u32 dat0, dat1, alr_port;
    656
    657	dev_dbg(chip->dev, "%s(%pM, %d)\n", __func__, mac, port_map);
    658	dat1 = LAN9303_ALR_DAT1_STATIC;
    659	if (port_map)
    660		dat1 |= LAN9303_ALR_DAT1_VALID;
    661	/* otherwise no ports: delete entry */
    662	if (stp_override)
    663		dat1 |= LAN9303_ALR_DAT1_AGE_OVERRID;
    664
    665	alr_port = portmap_2_alrport[port_map & 7];
    666	dat1 &= ~LAN9303_ALR_DAT1_PORT_MASK;
    667	dat1 |= alr_port << LAN9303_ALR_DAT1_PORT_BITOFFS;
    668
    669	dat0 = 0;
    670	dat0 |= (mac[0] << 0);
    671	dat0 |= (mac[1] << 8);
    672	dat0 |= (mac[2] << 16);
    673	dat0 |= (mac[3] << 24);
    674
    675	dat1 |= (mac[4] << 0);
    676	dat1 |= (mac[5] << 8);
    677
    678	lan9303_alr_make_entry_raw(chip, dat0, dat1);
    679}
    680
    681/* Add port to static ALR entry, create new static entry if needed */
    682static int lan9303_alr_add_port(struct lan9303 *chip, const u8 *mac, int port,
    683				bool stp_override)
    684{
    685	struct lan9303_alr_cache_entry *entr;
    686
    687	mutex_lock(&chip->alr_mutex);
    688	entr = lan9303_alr_cache_find_mac(chip, mac);
    689	if (!entr) { /*New entry */
    690		entr = lan9303_alr_cache_find_free(chip);
    691		if (!entr) {
    692			mutex_unlock(&chip->alr_mutex);
    693			return -ENOSPC;
    694		}
    695		ether_addr_copy(entr->mac_addr, mac);
    696	}
    697	entr->port_map |= BIT(port);
    698	entr->stp_override = stp_override;
    699	lan9303_alr_set_entry(chip, mac, entr->port_map, stp_override);
    700	mutex_unlock(&chip->alr_mutex);
    701
    702	return 0;
    703}
    704
    705/* Delete static port from ALR entry, delete entry if last port */
    706static int lan9303_alr_del_port(struct lan9303 *chip, const u8 *mac, int port)
    707{
    708	struct lan9303_alr_cache_entry *entr;
    709
    710	mutex_lock(&chip->alr_mutex);
    711	entr = lan9303_alr_cache_find_mac(chip, mac);
    712	if (!entr)
    713		goto out;  /* no static entry found */
    714
    715	entr->port_map &= ~BIT(port);
    716	if (entr->port_map == 0) /* zero means its free again */
    717		eth_zero_addr(entr->mac_addr);
    718	lan9303_alr_set_entry(chip, mac, entr->port_map, entr->stp_override);
    719
    720out:
    721	mutex_unlock(&chip->alr_mutex);
    722	return 0;
    723}
    724
    725static int lan9303_disable_processing_port(struct lan9303 *chip,
    726					   unsigned int port)
    727{
    728	int ret;
    729
    730	/* disable RX, but keep register reset default values else */
    731	ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
    732					LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES);
    733	if (ret)
    734		return ret;
    735
    736	/* disable TX, but keep register reset default values else */
    737	return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
    738				LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
    739				LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE);
    740}
    741
    742static int lan9303_enable_processing_port(struct lan9303 *chip,
    743					  unsigned int port)
    744{
    745	int ret;
    746
    747	/* enable RX and keep register reset default values else */
    748	ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
    749					LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES |
    750					LAN9303_MAC_RX_CFG_X_RX_ENABLE);
    751	if (ret)
    752		return ret;
    753
    754	/* enable TX and keep register reset default values else */
    755	return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
    756				LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
    757				LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE |
    758				LAN9303_MAC_TX_CFG_X_TX_ENABLE);
    759}
    760
    761/* forward special tagged packets from port 0 to port 1 *or* port 2 */
    762static int lan9303_setup_tagging(struct lan9303 *chip)
    763{
    764	int ret;
    765	u32 val;
    766	/* enable defining the destination port via special VLAN tagging
    767	 * for port 0
    768	 */
    769	ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE,
    770				       LAN9303_SWE_INGRESS_PORT_TYPE_VLAN);
    771	if (ret)
    772		return ret;
    773
    774	/* tag incoming packets at port 1 and 2 on their way to port 0 to be
    775	 * able to discover their source port
    776	 */
    777	val = LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0;
    778	return lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE, val);
    779}
    780
    781/* We want a special working switch:
    782 * - do not forward packets between port 1 and 2
    783 * - forward everything from port 1 to port 0
    784 * - forward everything from port 2 to port 0
    785 */
    786static int lan9303_separate_ports(struct lan9303 *chip)
    787{
    788	int ret;
    789
    790	lan9303_alr_del_port(chip, eth_stp_addr, 0);
    791	ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
    792				LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
    793				LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
    794				LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 |
    795				LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING |
    796				LAN9303_SWE_PORT_MIRROR_SNIFF_ALL);
    797	if (ret)
    798		return ret;
    799
    800	/* prevent port 1 and 2 from forwarding packets by their own */
    801	return lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
    802				LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 |
    803				LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 |
    804				LAN9303_SWE_PORT_STATE_BLOCKING_PORT2);
    805}
    806
    807static void lan9303_bridge_ports(struct lan9303 *chip)
    808{
    809	/* ports bridged: remove mirroring */
    810	lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
    811				 LAN9303_SWE_PORT_MIRROR_DISABLED);
    812
    813	lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
    814				 chip->swe_port_state);
    815	lan9303_alr_add_port(chip, eth_stp_addr, 0, true);
    816}
    817
    818static void lan9303_handle_reset(struct lan9303 *chip)
    819{
    820	if (!chip->reset_gpio)
    821		return;
    822
    823	if (chip->reset_duration != 0)
    824		msleep(chip->reset_duration);
    825
    826	/* release (deassert) reset and activate the device */
    827	gpiod_set_value_cansleep(chip->reset_gpio, 0);
    828}
    829
    830/* stop processing packets for all ports */
    831static int lan9303_disable_processing(struct lan9303 *chip)
    832{
    833	int p;
    834
    835	for (p = 1; p < LAN9303_NUM_PORTS; p++) {
    836		int ret = lan9303_disable_processing_port(chip, p);
    837
    838		if (ret)
    839			return ret;
    840	}
    841
    842	return 0;
    843}
    844
    845static int lan9303_check_device(struct lan9303 *chip)
    846{
    847	int ret;
    848	u32 reg;
    849
    850	ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, &reg);
    851	if (ret) {
    852		dev_err(chip->dev, "failed to read chip revision register: %d\n",
    853			ret);
    854		if (!chip->reset_gpio) {
    855			dev_dbg(chip->dev,
    856				"hint: maybe failed due to missing reset GPIO\n");
    857		}
    858		return ret;
    859	}
    860
    861	if ((reg >> 16) != LAN9303_CHIP_ID) {
    862		dev_err(chip->dev, "expecting LAN9303 chip, but found: %X\n",
    863			reg >> 16);
    864		return -ENODEV;
    865	}
    866
    867	/* The default state of the LAN9303 device is to forward packets between
    868	 * all ports (if not configured differently by an external EEPROM).
    869	 * The initial state of a DSA device must be forwarding packets only
    870	 * between the external and the internal ports and no forwarding
    871	 * between the external ports. In preparation we stop packet handling
    872	 * at all for now until the LAN9303 device is re-programmed accordingly.
    873	 */
    874	ret = lan9303_disable_processing(chip);
    875	if (ret)
    876		dev_warn(chip->dev, "failed to disable switching %d\n", ret);
    877
    878	dev_info(chip->dev, "Found LAN9303 rev. %u\n", reg & 0xffff);
    879
    880	ret = lan9303_detect_phy_setup(chip);
    881	if (ret) {
    882		dev_err(chip->dev,
    883			"failed to discover phy bootstrap setup: %d\n", ret);
    884		return ret;
    885	}
    886
    887	return 0;
    888}
    889
    890/* ---------------------------- DSA -----------------------------------*/
    891
    892static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds,
    893						      int port,
    894						      enum dsa_tag_protocol mp)
    895{
    896	return DSA_TAG_PROTO_LAN9303;
    897}
    898
    899static int lan9303_setup(struct dsa_switch *ds)
    900{
    901	struct lan9303 *chip = ds->priv;
    902	int ret;
    903
    904	/* Make sure that port 0 is the cpu port */
    905	if (!dsa_is_cpu_port(ds, 0)) {
    906		dev_err(chip->dev, "port 0 is not the CPU port\n");
    907		return -EINVAL;
    908	}
    909
    910	ret = lan9303_setup_tagging(chip);
    911	if (ret)
    912		dev_err(chip->dev, "failed to setup port tagging %d\n", ret);
    913
    914	ret = lan9303_separate_ports(chip);
    915	if (ret)
    916		dev_err(chip->dev, "failed to separate ports %d\n", ret);
    917
    918	ret = lan9303_enable_processing_port(chip, 0);
    919	if (ret)
    920		dev_err(chip->dev, "failed to re-enable switching %d\n", ret);
    921
    922	/* Trap IGMP to port 0 */
    923	ret = lan9303_write_switch_reg_mask(chip, LAN9303_SWE_GLB_INGRESS_CFG,
    924					    LAN9303_SWE_GLB_INGR_IGMP_TRAP |
    925					    LAN9303_SWE_GLB_INGR_IGMP_PORT(0),
    926					    LAN9303_SWE_GLB_INGR_IGMP_PORT(1) |
    927					    LAN9303_SWE_GLB_INGR_IGMP_PORT(2));
    928	if (ret)
    929		dev_err(chip->dev, "failed to setup IGMP trap %d\n", ret);
    930
    931	return 0;
    932}
    933
    934struct lan9303_mib_desc {
    935	unsigned int offset; /* offset of first MAC */
    936	const char *name;
    937};
    938
    939static const struct lan9303_mib_desc lan9303_mib[] = {
    940	{ .offset = LAN9303_MAC_RX_BRDCST_CNT_0, .name = "RxBroad", },
    941	{ .offset = LAN9303_MAC_RX_PAUSE_CNT_0, .name = "RxPause", },
    942	{ .offset = LAN9303_MAC_RX_MULCST_CNT_0, .name = "RxMulti", },
    943	{ .offset = LAN9303_MAC_RX_PKTOK_CNT_0, .name = "RxOk", },
    944	{ .offset = LAN9303_MAC_RX_CRCERR_CNT_0, .name = "RxCrcErr", },
    945	{ .offset = LAN9303_MAC_RX_ALIGN_CNT_0, .name = "RxAlignErr", },
    946	{ .offset = LAN9303_MAC_RX_JABB_CNT_0, .name = "RxJabber", },
    947	{ .offset = LAN9303_MAC_RX_FRAG_CNT_0, .name = "RxFragment", },
    948	{ .offset = LAN9303_MAC_RX_64_CNT_0, .name = "Rx64Byte", },
    949	{ .offset = LAN9303_MAC_RX_127_CNT_0, .name = "Rx128Byte", },
    950	{ .offset = LAN9303_MAC_RX_255_CNT_0, .name = "Rx256Byte", },
    951	{ .offset = LAN9303_MAC_RX_511_CNT_0, .name = "Rx512Byte", },
    952	{ .offset = LAN9303_MAC_RX_1023_CNT_0, .name = "Rx1024Byte", },
    953	{ .offset = LAN9303_MAC_RX_MAX_CNT_0, .name = "RxMaxByte", },
    954	{ .offset = LAN9303_MAC_RX_PKTLEN_CNT_0, .name = "RxByteCnt", },
    955	{ .offset = LAN9303_MAC_RX_SYMBL_CNT_0, .name = "RxSymbolCnt", },
    956	{ .offset = LAN9303_MAC_RX_CTLFRM_CNT_0, .name = "RxCfs", },
    957	{ .offset = LAN9303_MAC_RX_OVRSZE_CNT_0, .name = "RxOverFlow", },
    958	{ .offset = LAN9303_MAC_TX_UNDSZE_CNT_0, .name = "TxShort", },
    959	{ .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", },
    960	{ .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", },
    961	{ .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", },
    962	{ .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", },
    963	{ .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", },
    964	{ .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", },
    965	{ .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },
    966	{ .offset = LAN9303_MAC_TX_511_CNT_0, .name = "Tx512Byte", },
    967	{ .offset = LAN9303_MAC_TX_1023_CNT_0, .name = "Tx1024Byte", },
    968	{ .offset = LAN9303_MAC_TX_MAX_CNT_0, .name = "TxMaxByte", },
    969	{ .offset = LAN9303_MAC_TX_PKTLEN_CNT_0, .name = "TxByteCnt", },
    970	{ .offset = LAN9303_MAC_TX_PKTOK_CNT_0, .name = "TxOk", },
    971	{ .offset = LAN9303_MAC_TX_TOTALCOL_CNT_0, .name = "TxCollision", },
    972	{ .offset = LAN9303_MAC_TX_MULTICOL_CNT_0, .name = "TxMultiCol", },
    973	{ .offset = LAN9303_MAC_TX_SNGLECOL_CNT_0, .name = "TxSingleCol", },
    974	{ .offset = LAN9303_MAC_TX_EXCOL_CNT_0, .name = "TxExcCol", },
    975	{ .offset = LAN9303_MAC_TX_DEFER_CNT_0, .name = "TxDefer", },
    976	{ .offset = LAN9303_MAC_TX_LATECOL_0, .name = "TxLateCol", },
    977};
    978
    979static void lan9303_get_strings(struct dsa_switch *ds, int port,
    980				u32 stringset, uint8_t *data)
    981{
    982	unsigned int u;
    983
    984	if (stringset != ETH_SS_STATS)
    985		return;
    986
    987	for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
    988		strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name,
    989			ETH_GSTRING_LEN);
    990	}
    991}
    992
    993static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port,
    994				      uint64_t *data)
    995{
    996	struct lan9303 *chip = ds->priv;
    997	unsigned int u;
    998
    999	for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
   1000		u32 reg;
   1001		int ret;
   1002
   1003		ret = lan9303_read_switch_port(
   1004			chip, port, lan9303_mib[u].offset, &reg);
   1005
   1006		if (ret)
   1007			dev_warn(chip->dev, "Reading status port %d reg %u failed\n",
   1008				 port, lan9303_mib[u].offset);
   1009		data[u] = reg;
   1010	}
   1011}
   1012
   1013static int lan9303_get_sset_count(struct dsa_switch *ds, int port, int sset)
   1014{
   1015	if (sset != ETH_SS_STATS)
   1016		return 0;
   1017
   1018	return ARRAY_SIZE(lan9303_mib);
   1019}
   1020
   1021static int lan9303_phy_read(struct dsa_switch *ds, int phy, int regnum)
   1022{
   1023	struct lan9303 *chip = ds->priv;
   1024	int phy_base = chip->phy_addr_base;
   1025
   1026	if (phy == phy_base)
   1027		return lan9303_virt_phy_reg_read(chip, regnum);
   1028	if (phy > phy_base + 2)
   1029		return -ENODEV;
   1030
   1031	return chip->ops->phy_read(chip, phy, regnum);
   1032}
   1033
   1034static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
   1035			     u16 val)
   1036{
   1037	struct lan9303 *chip = ds->priv;
   1038	int phy_base = chip->phy_addr_base;
   1039
   1040	if (phy == phy_base)
   1041		return lan9303_virt_phy_reg_write(chip, regnum, val);
   1042	if (phy > phy_base + 2)
   1043		return -ENODEV;
   1044
   1045	return chip->ops->phy_write(chip, phy, regnum, val);
   1046}
   1047
   1048static void lan9303_adjust_link(struct dsa_switch *ds, int port,
   1049				struct phy_device *phydev)
   1050{
   1051	struct lan9303 *chip = ds->priv;
   1052	int ctl;
   1053
   1054	if (!phy_is_pseudo_fixed_link(phydev))
   1055		return;
   1056
   1057	ctl = lan9303_phy_read(ds, port, MII_BMCR);
   1058
   1059	ctl &= ~BMCR_ANENABLE;
   1060
   1061	if (phydev->speed == SPEED_100)
   1062		ctl |= BMCR_SPEED100;
   1063	else if (phydev->speed == SPEED_10)
   1064		ctl &= ~BMCR_SPEED100;
   1065	else
   1066		dev_err(ds->dev, "unsupported speed: %d\n", phydev->speed);
   1067
   1068	if (phydev->duplex == DUPLEX_FULL)
   1069		ctl |= BMCR_FULLDPLX;
   1070	else
   1071		ctl &= ~BMCR_FULLDPLX;
   1072
   1073	lan9303_phy_write(ds, port, MII_BMCR, ctl);
   1074
   1075	if (port == chip->phy_addr_base) {
   1076		/* Virtual Phy: Remove Turbo 200Mbit mode */
   1077		lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &ctl);
   1078
   1079		ctl &= ~LAN9303_VIRT_SPECIAL_TURBO;
   1080		regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, ctl);
   1081	}
   1082}
   1083
   1084static int lan9303_port_enable(struct dsa_switch *ds, int port,
   1085			       struct phy_device *phy)
   1086{
   1087	struct dsa_port *dp = dsa_to_port(ds, port);
   1088	struct lan9303 *chip = ds->priv;
   1089
   1090	if (!dsa_port_is_user(dp))
   1091		return 0;
   1092
   1093	vlan_vid_add(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
   1094
   1095	return lan9303_enable_processing_port(chip, port);
   1096}
   1097
   1098static void lan9303_port_disable(struct dsa_switch *ds, int port)
   1099{
   1100	struct dsa_port *dp = dsa_to_port(ds, port);
   1101	struct lan9303 *chip = ds->priv;
   1102
   1103	if (!dsa_port_is_user(dp))
   1104		return;
   1105
   1106	vlan_vid_del(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
   1107
   1108	lan9303_disable_processing_port(chip, port);
   1109	lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN);
   1110}
   1111
   1112static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
   1113				    struct dsa_bridge bridge,
   1114				    bool *tx_fwd_offload,
   1115				    struct netlink_ext_ack *extack)
   1116{
   1117	struct lan9303 *chip = ds->priv;
   1118
   1119	dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
   1120	if (dsa_port_bridge_same(dsa_to_port(ds, 1), dsa_to_port(ds, 2))) {
   1121		lan9303_bridge_ports(chip);
   1122		chip->is_bridged = true;  /* unleash stp_state_set() */
   1123	}
   1124
   1125	return 0;
   1126}
   1127
   1128static void lan9303_port_bridge_leave(struct dsa_switch *ds, int port,
   1129				      struct dsa_bridge bridge)
   1130{
   1131	struct lan9303 *chip = ds->priv;
   1132
   1133	dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
   1134	if (chip->is_bridged) {
   1135		lan9303_separate_ports(chip);
   1136		chip->is_bridged = false;
   1137	}
   1138}
   1139
   1140static void lan9303_port_stp_state_set(struct dsa_switch *ds, int port,
   1141				       u8 state)
   1142{
   1143	int portmask, portstate;
   1144	struct lan9303 *chip = ds->priv;
   1145
   1146	dev_dbg(chip->dev, "%s(port %d, state %d)\n",
   1147		__func__, port, state);
   1148
   1149	switch (state) {
   1150	case BR_STATE_DISABLED:
   1151		portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
   1152		break;
   1153	case BR_STATE_BLOCKING:
   1154	case BR_STATE_LISTENING:
   1155		portstate = LAN9303_SWE_PORT_STATE_BLOCKING_PORT0;
   1156		break;
   1157	case BR_STATE_LEARNING:
   1158		portstate = LAN9303_SWE_PORT_STATE_LEARNING_PORT0;
   1159		break;
   1160	case BR_STATE_FORWARDING:
   1161		portstate = LAN9303_SWE_PORT_STATE_FORWARDING_PORT0;
   1162		break;
   1163	default:
   1164		portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
   1165		dev_err(chip->dev, "unknown stp state: port %d, state %d\n",
   1166			port, state);
   1167	}
   1168
   1169	portmask = 0x3 << (port * 2);
   1170	portstate <<= (port * 2);
   1171
   1172	chip->swe_port_state = (chip->swe_port_state & ~portmask) | portstate;
   1173
   1174	if (chip->is_bridged)
   1175		lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
   1176					 chip->swe_port_state);
   1177	/* else: touching SWE_PORT_STATE would break port separation */
   1178}
   1179
   1180static void lan9303_port_fast_age(struct dsa_switch *ds, int port)
   1181{
   1182	struct lan9303 *chip = ds->priv;
   1183	struct del_port_learned_ctx del_ctx = {
   1184		.port = port,
   1185	};
   1186
   1187	dev_dbg(chip->dev, "%s(%d)\n", __func__, port);
   1188	lan9303_alr_loop(chip, alr_loop_cb_del_port_learned, &del_ctx);
   1189}
   1190
   1191static int lan9303_port_fdb_add(struct dsa_switch *ds, int port,
   1192				const unsigned char *addr, u16 vid,
   1193				struct dsa_db db)
   1194{
   1195	struct lan9303 *chip = ds->priv;
   1196
   1197	dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid);
   1198	if (vid)
   1199		return -EOPNOTSUPP;
   1200
   1201	return lan9303_alr_add_port(chip, addr, port, false);
   1202}
   1203
   1204static int lan9303_port_fdb_del(struct dsa_switch *ds, int port,
   1205				const unsigned char *addr, u16 vid,
   1206				struct dsa_db db)
   1207{
   1208	struct lan9303 *chip = ds->priv;
   1209
   1210	dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid);
   1211	if (vid)
   1212		return -EOPNOTSUPP;
   1213	lan9303_alr_del_port(chip, addr, port);
   1214
   1215	return 0;
   1216}
   1217
   1218static int lan9303_port_fdb_dump(struct dsa_switch *ds, int port,
   1219				 dsa_fdb_dump_cb_t *cb, void *data)
   1220{
   1221	struct lan9303 *chip = ds->priv;
   1222	struct port_fdb_dump_ctx dump_ctx = {
   1223		.port = port,
   1224		.data = data,
   1225		.cb   = cb,
   1226	};
   1227
   1228	dev_dbg(chip->dev, "%s(%d)\n", __func__, port);
   1229	return lan9303_alr_loop(chip, alr_loop_cb_fdb_port_dump, &dump_ctx);
   1230}
   1231
   1232static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port,
   1233				    const struct switchdev_obj_port_mdb *mdb)
   1234{
   1235	struct lan9303 *chip = ds->priv;
   1236
   1237	dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr,
   1238		mdb->vid);
   1239	if (mdb->vid)
   1240		return -EOPNOTSUPP;
   1241	if (lan9303_alr_cache_find_mac(chip, mdb->addr))
   1242		return 0;
   1243	if (!lan9303_alr_cache_find_free(chip))
   1244		return -ENOSPC;
   1245
   1246	return 0;
   1247}
   1248
   1249static int lan9303_port_mdb_add(struct dsa_switch *ds, int port,
   1250				const struct switchdev_obj_port_mdb *mdb,
   1251				struct dsa_db db)
   1252{
   1253	struct lan9303 *chip = ds->priv;
   1254	int err;
   1255
   1256	err = lan9303_port_mdb_prepare(ds, port, mdb);
   1257	if (err)
   1258		return err;
   1259
   1260	dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr,
   1261		mdb->vid);
   1262	return lan9303_alr_add_port(chip, mdb->addr, port, false);
   1263}
   1264
   1265static int lan9303_port_mdb_del(struct dsa_switch *ds, int port,
   1266				const struct switchdev_obj_port_mdb *mdb,
   1267				struct dsa_db db)
   1268{
   1269	struct lan9303 *chip = ds->priv;
   1270
   1271	dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr,
   1272		mdb->vid);
   1273	if (mdb->vid)
   1274		return -EOPNOTSUPP;
   1275	lan9303_alr_del_port(chip, mdb->addr, port);
   1276
   1277	return 0;
   1278}
   1279
   1280static const struct dsa_switch_ops lan9303_switch_ops = {
   1281	.get_tag_protocol = lan9303_get_tag_protocol,
   1282	.setup = lan9303_setup,
   1283	.get_strings = lan9303_get_strings,
   1284	.phy_read = lan9303_phy_read,
   1285	.phy_write = lan9303_phy_write,
   1286	.adjust_link = lan9303_adjust_link,
   1287	.get_ethtool_stats = lan9303_get_ethtool_stats,
   1288	.get_sset_count = lan9303_get_sset_count,
   1289	.port_enable = lan9303_port_enable,
   1290	.port_disable = lan9303_port_disable,
   1291	.port_bridge_join       = lan9303_port_bridge_join,
   1292	.port_bridge_leave      = lan9303_port_bridge_leave,
   1293	.port_stp_state_set     = lan9303_port_stp_state_set,
   1294	.port_fast_age          = lan9303_port_fast_age,
   1295	.port_fdb_add           = lan9303_port_fdb_add,
   1296	.port_fdb_del           = lan9303_port_fdb_del,
   1297	.port_fdb_dump          = lan9303_port_fdb_dump,
   1298	.port_mdb_add           = lan9303_port_mdb_add,
   1299	.port_mdb_del           = lan9303_port_mdb_del,
   1300};
   1301
   1302static int lan9303_register_switch(struct lan9303 *chip)
   1303{
   1304	int base;
   1305
   1306	chip->ds = devm_kzalloc(chip->dev, sizeof(*chip->ds), GFP_KERNEL);
   1307	if (!chip->ds)
   1308		return -ENOMEM;
   1309
   1310	chip->ds->dev = chip->dev;
   1311	chip->ds->num_ports = LAN9303_NUM_PORTS;
   1312	chip->ds->priv = chip;
   1313	chip->ds->ops = &lan9303_switch_ops;
   1314	base = chip->phy_addr_base;
   1315	chip->ds->phys_mii_mask = GENMASK(LAN9303_NUM_PORTS - 1 + base, base);
   1316
   1317	return dsa_register_switch(chip->ds);
   1318}
   1319
   1320static int lan9303_probe_reset_gpio(struct lan9303 *chip,
   1321				     struct device_node *np)
   1322{
   1323	chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset",
   1324						   GPIOD_OUT_HIGH);
   1325	if (IS_ERR(chip->reset_gpio))
   1326		return PTR_ERR(chip->reset_gpio);
   1327
   1328	if (!chip->reset_gpio) {
   1329		dev_dbg(chip->dev, "No reset GPIO defined\n");
   1330		return 0;
   1331	}
   1332
   1333	chip->reset_duration = 200;
   1334
   1335	if (np) {
   1336		of_property_read_u32(np, "reset-duration",
   1337				     &chip->reset_duration);
   1338	} else {
   1339		dev_dbg(chip->dev, "reset duration defaults to 200 ms\n");
   1340	}
   1341
   1342	/* A sane reset duration should not be longer than 1s */
   1343	if (chip->reset_duration > 1000)
   1344		chip->reset_duration = 1000;
   1345
   1346	return 0;
   1347}
   1348
   1349int lan9303_probe(struct lan9303 *chip, struct device_node *np)
   1350{
   1351	int ret;
   1352
   1353	mutex_init(&chip->indirect_mutex);
   1354	mutex_init(&chip->alr_mutex);
   1355
   1356	ret = lan9303_probe_reset_gpio(chip, np);
   1357	if (ret)
   1358		return ret;
   1359
   1360	lan9303_handle_reset(chip);
   1361
   1362	ret = lan9303_check_device(chip);
   1363	if (ret)
   1364		return ret;
   1365
   1366	ret = lan9303_register_switch(chip);
   1367	if (ret) {
   1368		dev_dbg(chip->dev, "Failed to register switch: %d\n", ret);
   1369		return ret;
   1370	}
   1371
   1372	return 0;
   1373}
   1374EXPORT_SYMBOL(lan9303_probe);
   1375
   1376int lan9303_remove(struct lan9303 *chip)
   1377{
   1378	int rc;
   1379
   1380	rc = lan9303_disable_processing(chip);
   1381	if (rc != 0)
   1382		dev_warn(chip->dev, "shutting down failed\n");
   1383
   1384	dsa_unregister_switch(chip->ds);
   1385
   1386	/* assert reset to the whole device to prevent it from doing anything */
   1387	gpiod_set_value_cansleep(chip->reset_gpio, 1);
   1388	gpiod_unexport(chip->reset_gpio);
   1389
   1390	return 0;
   1391}
   1392EXPORT_SYMBOL(lan9303_remove);
   1393
   1394void lan9303_shutdown(struct lan9303 *chip)
   1395{
   1396	dsa_switch_shutdown(chip->ds);
   1397}
   1398EXPORT_SYMBOL(lan9303_shutdown);
   1399
   1400MODULE_AUTHOR("Juergen Borleis <kernel@pengutronix.de>");
   1401MODULE_DESCRIPTION("Core driver for SMSC/Microchip LAN9303 three port ethernet switch");
   1402MODULE_LICENSE("GPL v2");