Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (C) 2017 Pengutronix, Juergen Borleis <kernel@pengutronix.de>
0004  */
0005 #include <linux/kernel.h>
0006 #include <linux/module.h>
0007 #include <linux/gpio/consumer.h>
0008 #include <linux/regmap.h>
0009 #include <linux/mutex.h>
0010 #include <linux/mii.h>
0011 #include <linux/phy.h>
0012 #include <linux/if_bridge.h>
0013 #include <linux/if_vlan.h>
0014 #include <linux/etherdevice.h>
0015 
0016 #include "lan9303.h"
0017 
0018 #define LAN9303_NUM_PORTS 3
0019 
0020 /* 13.2 System Control and Status Registers
0021  * Multiply register number by 4 to get address offset.
0022  */
0023 #define LAN9303_CHIP_REV 0x14
0024 # define LAN9303_CHIP_ID 0x9303
0025 #define LAN9303_IRQ_CFG 0x15
0026 # define LAN9303_IRQ_CFG_IRQ_ENABLE BIT(8)
0027 # define LAN9303_IRQ_CFG_IRQ_POL BIT(4)
0028 # define LAN9303_IRQ_CFG_IRQ_TYPE BIT(0)
0029 #define LAN9303_INT_STS 0x16
0030 # define LAN9303_INT_STS_PHY_INT2 BIT(27)
0031 # define LAN9303_INT_STS_PHY_INT1 BIT(26)
0032 #define LAN9303_INT_EN 0x17
0033 # define LAN9303_INT_EN_PHY_INT2_EN BIT(27)
0034 # define LAN9303_INT_EN_PHY_INT1_EN BIT(26)
0035 #define LAN9303_HW_CFG 0x1D
0036 # define LAN9303_HW_CFG_READY BIT(27)
0037 # define LAN9303_HW_CFG_AMDX_EN_PORT2 BIT(26)
0038 # define LAN9303_HW_CFG_AMDX_EN_PORT1 BIT(25)
0039 #define LAN9303_PMI_DATA 0x29
0040 #define LAN9303_PMI_ACCESS 0x2A
0041 # define LAN9303_PMI_ACCESS_PHY_ADDR(x) (((x) & 0x1f) << 11)
0042 # define LAN9303_PMI_ACCESS_MIIRINDA(x) (((x) & 0x1f) << 6)
0043 # define LAN9303_PMI_ACCESS_MII_BUSY BIT(0)
0044 # define LAN9303_PMI_ACCESS_MII_WRITE BIT(1)
0045 #define LAN9303_MANUAL_FC_1 0x68
0046 #define LAN9303_MANUAL_FC_2 0x69
0047 #define LAN9303_MANUAL_FC_0 0x6a
0048 #define LAN9303_SWITCH_CSR_DATA 0x6b
0049 #define LAN9303_SWITCH_CSR_CMD 0x6c
0050 #define LAN9303_SWITCH_CSR_CMD_BUSY BIT(31)
0051 #define LAN9303_SWITCH_CSR_CMD_RW BIT(30)
0052 #define LAN9303_SWITCH_CSR_CMD_LANES (BIT(19) | BIT(18) | BIT(17) | BIT(16))
0053 #define LAN9303_VIRT_PHY_BASE 0x70
0054 #define LAN9303_VIRT_SPECIAL_CTRL 0x77
0055 #define  LAN9303_VIRT_SPECIAL_TURBO BIT(10) /*Turbo MII Enable*/
0056 
0057 /*13.4 Switch Fabric Control and Status Registers
0058  * Accessed indirectly via SWITCH_CSR_CMD, SWITCH_CSR_DATA.
0059  */
0060 #define LAN9303_SW_DEV_ID 0x0000
0061 #define LAN9303_SW_RESET 0x0001
0062 #define LAN9303_SW_RESET_RESET BIT(0)
0063 #define LAN9303_SW_IMR 0x0004
0064 #define LAN9303_SW_IPR 0x0005
0065 #define LAN9303_MAC_VER_ID_0 0x0400
0066 #define LAN9303_MAC_RX_CFG_0 0x0401
0067 # define LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES BIT(1)
0068 # define LAN9303_MAC_RX_CFG_X_RX_ENABLE BIT(0)
0069 #define LAN9303_MAC_RX_UNDSZE_CNT_0 0x0410
0070 #define LAN9303_MAC_RX_64_CNT_0 0x0411
0071 #define LAN9303_MAC_RX_127_CNT_0 0x0412
0072 #define LAN9303_MAC_RX_255_CNT_0 0x413
0073 #define LAN9303_MAC_RX_511_CNT_0 0x0414
0074 #define LAN9303_MAC_RX_1023_CNT_0 0x0415
0075 #define LAN9303_MAC_RX_MAX_CNT_0 0x0416
0076 #define LAN9303_MAC_RX_OVRSZE_CNT_0 0x0417
0077 #define LAN9303_MAC_RX_PKTOK_CNT_0 0x0418
0078 #define LAN9303_MAC_RX_CRCERR_CNT_0 0x0419
0079 #define LAN9303_MAC_RX_MULCST_CNT_0 0x041a
0080 #define LAN9303_MAC_RX_BRDCST_CNT_0 0x041b
0081 #define LAN9303_MAC_RX_PAUSE_CNT_0 0x041c
0082 #define LAN9303_MAC_RX_FRAG_CNT_0 0x041d
0083 #define LAN9303_MAC_RX_JABB_CNT_0 0x041e
0084 #define LAN9303_MAC_RX_ALIGN_CNT_0 0x041f
0085 #define LAN9303_MAC_RX_PKTLEN_CNT_0 0x0420
0086 #define LAN9303_MAC_RX_GOODPKTLEN_CNT_0 0x0421
0087 #define LAN9303_MAC_RX_SYMBL_CNT_0 0x0422
0088 #define LAN9303_MAC_RX_CTLFRM_CNT_0 0x0423
0089 
0090 #define LAN9303_MAC_TX_CFG_0 0x0440
0091 # define LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT (21 << 2)
0092 # define LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE BIT(1)
0093 # define LAN9303_MAC_TX_CFG_X_TX_ENABLE BIT(0)
0094 #define LAN9303_MAC_TX_DEFER_CNT_0 0x0451
0095 #define LAN9303_MAC_TX_PAUSE_CNT_0 0x0452
0096 #define LAN9303_MAC_TX_PKTOK_CNT_0 0x0453
0097 #define LAN9303_MAC_TX_64_CNT_0 0x0454
0098 #define LAN9303_MAC_TX_127_CNT_0 0x0455
0099 #define LAN9303_MAC_TX_255_CNT_0 0x0456
0100 #define LAN9303_MAC_TX_511_CNT_0 0x0457
0101 #define LAN9303_MAC_TX_1023_CNT_0 0x0458
0102 #define LAN9303_MAC_TX_MAX_CNT_0 0x0459
0103 #define LAN9303_MAC_TX_UNDSZE_CNT_0 0x045a
0104 #define LAN9303_MAC_TX_PKTLEN_CNT_0 0x045c
0105 #define LAN9303_MAC_TX_BRDCST_CNT_0 0x045d
0106 #define LAN9303_MAC_TX_MULCST_CNT_0 0x045e
0107 #define LAN9303_MAC_TX_LATECOL_0 0x045f
0108 #define LAN9303_MAC_TX_EXCOL_CNT_0 0x0460
0109 #define LAN9303_MAC_TX_SNGLECOL_CNT_0 0x0461
0110 #define LAN9303_MAC_TX_MULTICOL_CNT_0 0x0462
0111 #define LAN9303_MAC_TX_TOTALCOL_CNT_0 0x0463
0112 
0113 #define LAN9303_MAC_VER_ID_1 0x0800
0114 #define LAN9303_MAC_RX_CFG_1 0x0801
0115 #define LAN9303_MAC_TX_CFG_1 0x0840
0116 #define LAN9303_MAC_VER_ID_2 0x0c00
0117 #define LAN9303_MAC_RX_CFG_2 0x0c01
0118 #define LAN9303_MAC_TX_CFG_2 0x0c40
0119 #define LAN9303_SWE_ALR_CMD 0x1800
0120 # define LAN9303_ALR_CMD_MAKE_ENTRY    BIT(2)
0121 # define LAN9303_ALR_CMD_GET_FIRST     BIT(1)
0122 # define LAN9303_ALR_CMD_GET_NEXT      BIT(0)
0123 #define LAN9303_SWE_ALR_WR_DAT_0 0x1801
0124 #define LAN9303_SWE_ALR_WR_DAT_1 0x1802
0125 # define LAN9303_ALR_DAT1_VALID        BIT(26)
0126 # define LAN9303_ALR_DAT1_END_OF_TABL  BIT(25)
0127 # define LAN9303_ALR_DAT1_AGE_OVERRID  BIT(25)
0128 # define LAN9303_ALR_DAT1_STATIC       BIT(24)
0129 # define LAN9303_ALR_DAT1_PORT_BITOFFS  16
0130 # define LAN9303_ALR_DAT1_PORT_MASK    (7 << LAN9303_ALR_DAT1_PORT_BITOFFS)
0131 #define LAN9303_SWE_ALR_RD_DAT_0 0x1805
0132 #define LAN9303_SWE_ALR_RD_DAT_1 0x1806
0133 #define LAN9303_SWE_ALR_CMD_STS 0x1808
0134 # define ALR_STS_MAKE_PEND     BIT(0)
0135 #define LAN9303_SWE_VLAN_CMD 0x180b
0136 # define LAN9303_SWE_VLAN_CMD_RNW BIT(5)
0137 # define LAN9303_SWE_VLAN_CMD_PVIDNVLAN BIT(4)
0138 #define LAN9303_SWE_VLAN_WR_DATA 0x180c
0139 #define LAN9303_SWE_VLAN_RD_DATA 0x180e
0140 # define LAN9303_SWE_VLAN_MEMBER_PORT2 BIT(17)
0141 # define LAN9303_SWE_VLAN_UNTAG_PORT2 BIT(16)
0142 # define LAN9303_SWE_VLAN_MEMBER_PORT1 BIT(15)
0143 # define LAN9303_SWE_VLAN_UNTAG_PORT1 BIT(14)
0144 # define LAN9303_SWE_VLAN_MEMBER_PORT0 BIT(13)
0145 # define LAN9303_SWE_VLAN_UNTAG_PORT0 BIT(12)
0146 #define LAN9303_SWE_VLAN_CMD_STS 0x1810
0147 #define LAN9303_SWE_GLB_INGRESS_CFG 0x1840
0148 # define LAN9303_SWE_GLB_INGR_IGMP_TRAP BIT(7)
0149 # define LAN9303_SWE_GLB_INGR_IGMP_PORT(p) BIT(10 + p)
0150 #define LAN9303_SWE_PORT_STATE 0x1843
0151 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT2 (0)
0152 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT2 BIT(5)
0153 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT2 BIT(4)
0154 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT1 (0)
0155 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT1 BIT(3)
0156 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 BIT(2)
0157 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 (0)
0158 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT0 BIT(1)
0159 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT0 BIT(0)
0160 # define LAN9303_SWE_PORT_STATE_DISABLED_PORT0 (3)
0161 #define LAN9303_SWE_PORT_MIRROR 0x1846
0162 # define LAN9303_SWE_PORT_MIRROR_SNIFF_ALL BIT(8)
0163 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT2 BIT(7)
0164 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT1 BIT(6)
0165 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 BIT(5)
0166 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 BIT(4)
0167 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 BIT(3)
0168 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT0 BIT(2)
0169 # define LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING BIT(1)
0170 # define LAN9303_SWE_PORT_MIRROR_ENABLE_TX_MIRRORING BIT(0)
0171 # define LAN9303_SWE_PORT_MIRROR_DISABLED 0
0172 #define LAN9303_SWE_INGRESS_PORT_TYPE 0x1847
0173 #define  LAN9303_SWE_INGRESS_PORT_TYPE_VLAN 3
0174 #define LAN9303_BM_CFG 0x1c00
0175 #define LAN9303_BM_EGRSS_PORT_TYPE 0x1c0c
0176 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT2 (BIT(17) | BIT(16))
0177 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT1 (BIT(9) | BIT(8))
0178 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0 (BIT(1) | BIT(0))
0179 
0180 #define LAN9303_SWITCH_PORT_REG(port, reg0) (0x400 * (port) + (reg0))
0181 
0182 /* the built-in PHYs are of type LAN911X */
0183 #define MII_LAN911X_SPECIAL_MODES 0x12
0184 #define MII_LAN911X_SPECIAL_CONTROL_STATUS 0x1f
0185 
0186 static const struct regmap_range lan9303_valid_regs[] = {
0187     regmap_reg_range(0x14, 0x17), /* misc, interrupt */
0188     regmap_reg_range(0x19, 0x19), /* endian test */
0189     regmap_reg_range(0x1d, 0x1d), /* hardware config */
0190     regmap_reg_range(0x23, 0x24), /* general purpose timer */
0191     regmap_reg_range(0x27, 0x27), /* counter */
0192     regmap_reg_range(0x29, 0x2a), /* PMI index regs */
0193     regmap_reg_range(0x68, 0x6a), /* flow control */
0194     regmap_reg_range(0x6b, 0x6c), /* switch fabric indirect regs */
0195     regmap_reg_range(0x6d, 0x6f), /* misc */
0196     regmap_reg_range(0x70, 0x77), /* virtual phy */
0197     regmap_reg_range(0x78, 0x7a), /* GPIO */
0198     regmap_reg_range(0x7c, 0x7e), /* MAC & reset */
0199     regmap_reg_range(0x80, 0xb7), /* switch fabric direct regs (wr only) */
0200 };
0201 
0202 static const struct regmap_range lan9303_reserved_ranges[] = {
0203     regmap_reg_range(0x00, 0x13),
0204     regmap_reg_range(0x18, 0x18),
0205     regmap_reg_range(0x1a, 0x1c),
0206     regmap_reg_range(0x1e, 0x22),
0207     regmap_reg_range(0x25, 0x26),
0208     regmap_reg_range(0x28, 0x28),
0209     regmap_reg_range(0x2b, 0x67),
0210     regmap_reg_range(0x7b, 0x7b),
0211     regmap_reg_range(0x7f, 0x7f),
0212     regmap_reg_range(0xb8, 0xff),
0213 };
0214 
0215 const struct regmap_access_table lan9303_register_set = {
0216     .yes_ranges = lan9303_valid_regs,
0217     .n_yes_ranges = ARRAY_SIZE(lan9303_valid_regs),
0218     .no_ranges = lan9303_reserved_ranges,
0219     .n_no_ranges = ARRAY_SIZE(lan9303_reserved_ranges),
0220 };
0221 EXPORT_SYMBOL(lan9303_register_set);
0222 
0223 static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
0224 {
0225     int ret, i;
0226 
0227     /* we can lose arbitration for the I2C case, because the device
0228      * tries to detect and read an external EEPROM after reset and acts as
0229      * a master on the shared I2C bus itself. This conflicts with our
0230      * attempts to access the device as a slave at the same moment.
0231      */
0232     for (i = 0; i < 5; i++) {
0233         ret = regmap_read(regmap, offset, reg);
0234         if (!ret)
0235             return 0;
0236         if (ret != -EAGAIN)
0237             break;
0238         msleep(500);
0239     }
0240 
0241     return -EIO;
0242 }
0243 
0244 static int lan9303_read_wait(struct lan9303 *chip, int offset, u32 mask)
0245 {
0246     int i;
0247 
0248     for (i = 0; i < 25; i++) {
0249         u32 reg;
0250         int ret;
0251 
0252         ret = lan9303_read(chip->regmap, offset, &reg);
0253         if (ret) {
0254             dev_err(chip->dev, "%s failed to read offset %d: %d\n",
0255                 __func__, offset, ret);
0256             return ret;
0257         }
0258         if (!(reg & mask))
0259             return 0;
0260         usleep_range(1000, 2000);
0261     }
0262 
0263     return -ETIMEDOUT;
0264 }
0265 
0266 static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
0267 {
0268     int ret;
0269     u32 val;
0270 
0271     if (regnum > MII_EXPANSION)
0272         return -EINVAL;
0273 
0274     ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val);
0275     if (ret)
0276         return ret;
0277 
0278     return val & 0xffff;
0279 }
0280 
0281 static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val)
0282 {
0283     if (regnum > MII_EXPANSION)
0284         return -EINVAL;
0285 
0286     return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val);
0287 }
0288 
0289 static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip)
0290 {
0291     return lan9303_read_wait(chip, LAN9303_PMI_ACCESS,
0292                  LAN9303_PMI_ACCESS_MII_BUSY);
0293 }
0294 
0295 static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum)
0296 {
0297     int ret;
0298     u32 val;
0299 
0300     val = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
0301     val |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
0302 
0303     mutex_lock(&chip->indirect_mutex);
0304 
0305     ret = lan9303_indirect_phy_wait_for_completion(chip);
0306     if (ret)
0307         goto on_error;
0308 
0309     /* start the MII read cycle */
0310     ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val);
0311     if (ret)
0312         goto on_error;
0313 
0314     ret = lan9303_indirect_phy_wait_for_completion(chip);
0315     if (ret)
0316         goto on_error;
0317 
0318     /* read the result of this operation */
0319     ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val);
0320     if (ret)
0321         goto on_error;
0322 
0323     mutex_unlock(&chip->indirect_mutex);
0324 
0325     return val & 0xffff;
0326 
0327 on_error:
0328     mutex_unlock(&chip->indirect_mutex);
0329     return ret;
0330 }
0331 
0332 static int lan9303_indirect_phy_write(struct lan9303 *chip, int addr,
0333                       int regnum, u16 val)
0334 {
0335     int ret;
0336     u32 reg;
0337 
0338     reg = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
0339     reg |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
0340     reg |= LAN9303_PMI_ACCESS_MII_WRITE;
0341 
0342     mutex_lock(&chip->indirect_mutex);
0343 
0344     ret = lan9303_indirect_phy_wait_for_completion(chip);
0345     if (ret)
0346         goto on_error;
0347 
0348     /* write the data first... */
0349     ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val);
0350     if (ret)
0351         goto on_error;
0352 
0353     /* ...then start the MII write cycle */
0354     ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg);
0355 
0356 on_error:
0357     mutex_unlock(&chip->indirect_mutex);
0358     return ret;
0359 }
0360 
0361 const struct lan9303_phy_ops lan9303_indirect_phy_ops = {
0362     .phy_read = lan9303_indirect_phy_read,
0363     .phy_write = lan9303_indirect_phy_write,
0364 };
0365 EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops);
0366 
0367 static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
0368 {
0369     return lan9303_read_wait(chip, LAN9303_SWITCH_CSR_CMD,
0370                  LAN9303_SWITCH_CSR_CMD_BUSY);
0371 }
0372 
0373 static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
0374 {
0375     u32 reg;
0376     int ret;
0377 
0378     reg = regnum;
0379     reg |= LAN9303_SWITCH_CSR_CMD_LANES;
0380     reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
0381 
0382     mutex_lock(&chip->indirect_mutex);
0383 
0384     ret = lan9303_switch_wait_for_completion(chip);
0385     if (ret)
0386         goto on_error;
0387 
0388     ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
0389     if (ret) {
0390         dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret);
0391         goto on_error;
0392     }
0393 
0394     /* trigger write */
0395     ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
0396     if (ret)
0397         dev_err(chip->dev, "Failed to write csr command reg: %d\n",
0398             ret);
0399 
0400 on_error:
0401     mutex_unlock(&chip->indirect_mutex);
0402     return ret;
0403 }
0404 
0405 static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)
0406 {
0407     u32 reg;
0408     int ret;
0409 
0410     reg = regnum;
0411     reg |= LAN9303_SWITCH_CSR_CMD_LANES;
0412     reg |= LAN9303_SWITCH_CSR_CMD_RW;
0413     reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
0414 
0415     mutex_lock(&chip->indirect_mutex);
0416 
0417     ret = lan9303_switch_wait_for_completion(chip);
0418     if (ret)
0419         goto on_error;
0420 
0421     /* trigger read */
0422     ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
0423     if (ret) {
0424         dev_err(chip->dev, "Failed to write csr command reg: %d\n",
0425             ret);
0426         goto on_error;
0427     }
0428 
0429     ret = lan9303_switch_wait_for_completion(chip);
0430     if (ret)
0431         goto on_error;
0432 
0433     ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
0434     if (ret)
0435         dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret);
0436 on_error:
0437     mutex_unlock(&chip->indirect_mutex);
0438     return ret;
0439 }
0440 
0441 static int lan9303_write_switch_reg_mask(struct lan9303 *chip, u16 regnum,
0442                      u32 val, u32 mask)
0443 {
0444     int ret;
0445     u32 reg;
0446 
0447     ret = lan9303_read_switch_reg(chip, regnum, &reg);
0448     if (ret)
0449         return ret;
0450 
0451     reg = (reg & ~mask) | val;
0452 
0453     return lan9303_write_switch_reg(chip, regnum, reg);
0454 }
0455 
0456 static int lan9303_write_switch_port(struct lan9303 *chip, int port,
0457                      u16 regnum, u32 val)
0458 {
0459     return lan9303_write_switch_reg(
0460         chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
0461 }
0462 
0463 static int lan9303_read_switch_port(struct lan9303 *chip, int port,
0464                     u16 regnum, u32 *val)
0465 {
0466     return lan9303_read_switch_reg(
0467         chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
0468 }
0469 
0470 static int lan9303_detect_phy_setup(struct lan9303 *chip)
0471 {
0472     int reg;
0473 
0474     /* Calculate chip->phy_addr_base:
0475      * Depending on the 'phy_addr_sel_strap' setting, the three phys are
0476      * using IDs 0-1-2 or IDs 1-2-3. We cannot read back the
0477      * 'phy_addr_sel_strap' setting directly, so we need a test, which
0478      * configuration is active:
0479      * Special reg 18 of phy 3 reads as 0x0000, if 'phy_addr_sel_strap' is 0
0480      * and the IDs are 0-1-2, else it contains something different from
0481      * 0x0000, which means 'phy_addr_sel_strap' is 1 and the IDs are 1-2-3.
0482      * 0xffff is returned on MDIO read with no response.
0483      */
0484     reg = chip->ops->phy_read(chip, 3, MII_LAN911X_SPECIAL_MODES);
0485     if (reg < 0) {
0486         dev_err(chip->dev, "Failed to detect phy config: %d\n", reg);
0487         return reg;
0488     }
0489 
0490     chip->phy_addr_base = reg != 0 && reg != 0xffff;
0491 
0492     dev_dbg(chip->dev, "Phy setup '%s' detected\n",
0493         chip->phy_addr_base ? "1-2-3" : "0-1-2");
0494 
0495     return 0;
0496 }
0497 
0498 /* Map ALR-port bits to port bitmap, and back */
0499 static const int alrport_2_portmap[] = {1, 2, 4, 0, 3, 5, 6, 7 };
0500 static const int portmap_2_alrport[] = {3, 0, 1, 4, 2, 5, 6, 7 };
0501 
0502 /* Return pointer to first free ALR cache entry, return NULL if none */
0503 static struct lan9303_alr_cache_entry *
0504 lan9303_alr_cache_find_free(struct lan9303 *chip)
0505 {
0506     int i;
0507     struct lan9303_alr_cache_entry *entr = chip->alr_cache;
0508 
0509     for (i = 0; i < LAN9303_NUM_ALR_RECORDS; i++, entr++)
0510         if (entr->port_map == 0)
0511             return entr;
0512 
0513     return NULL;
0514 }
0515 
0516 /* Return pointer to ALR cache entry matching MAC address */
0517 static struct lan9303_alr_cache_entry *
0518 lan9303_alr_cache_find_mac(struct lan9303 *chip, const u8 *mac_addr)
0519 {
0520     int i;
0521     struct lan9303_alr_cache_entry *entr = chip->alr_cache;
0522 
0523     BUILD_BUG_ON_MSG(sizeof(struct lan9303_alr_cache_entry) & 1,
0524              "ether_addr_equal require u16 alignment");
0525 
0526     for (i = 0; i < LAN9303_NUM_ALR_RECORDS; i++, entr++)
0527         if (ether_addr_equal(entr->mac_addr, mac_addr))
0528             return entr;
0529 
0530     return NULL;
0531 }
0532 
0533 static int lan9303_csr_reg_wait(struct lan9303 *chip, int regno, u32 mask)
0534 {
0535     int i;
0536 
0537     for (i = 0; i < 25; i++) {
0538         u32 reg;
0539 
0540         lan9303_read_switch_reg(chip, regno, &reg);
0541         if (!(reg & mask))
0542             return 0;
0543         usleep_range(1000, 2000);
0544     }
0545 
0546     return -ETIMEDOUT;
0547 }
0548 
0549 static int lan9303_alr_make_entry_raw(struct lan9303 *chip, u32 dat0, u32 dat1)
0550 {
0551     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_0, dat0);
0552     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_1, dat1);
0553     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
0554                  LAN9303_ALR_CMD_MAKE_ENTRY);
0555     lan9303_csr_reg_wait(chip, LAN9303_SWE_ALR_CMD_STS, ALR_STS_MAKE_PEND);
0556     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
0557 
0558     return 0;
0559 }
0560 
0561 typedef int alr_loop_cb_t(struct lan9303 *chip, u32 dat0, u32 dat1,
0562               int portmap, void *ctx);
0563 
0564 static int lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)
0565 {
0566     int ret = 0, i;
0567 
0568     mutex_lock(&chip->alr_mutex);
0569     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
0570                  LAN9303_ALR_CMD_GET_FIRST);
0571     lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
0572 
0573     for (i = 1; i < LAN9303_NUM_ALR_RECORDS; i++) {
0574         u32 dat0, dat1;
0575         int alrport, portmap;
0576 
0577         lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_0, &dat0);
0578         lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_1, &dat1);
0579         if (dat1 & LAN9303_ALR_DAT1_END_OF_TABL)
0580             break;
0581 
0582         alrport = (dat1 & LAN9303_ALR_DAT1_PORT_MASK) >>
0583                         LAN9303_ALR_DAT1_PORT_BITOFFS;
0584         portmap = alrport_2_portmap[alrport];
0585 
0586         ret = cb(chip, dat0, dat1, portmap, ctx);
0587         if (ret)
0588             break;
0589 
0590         lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
0591                      LAN9303_ALR_CMD_GET_NEXT);
0592         lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
0593     }
0594     mutex_unlock(&chip->alr_mutex);
0595 
0596     return ret;
0597 }
0598 
0599 static void alr_reg_to_mac(u32 dat0, u32 dat1, u8 mac[6])
0600 {
0601     mac[0] = (dat0 >>  0) & 0xff;
0602     mac[1] = (dat0 >>  8) & 0xff;
0603     mac[2] = (dat0 >> 16) & 0xff;
0604     mac[3] = (dat0 >> 24) & 0xff;
0605     mac[4] = (dat1 >>  0) & 0xff;
0606     mac[5] = (dat1 >>  8) & 0xff;
0607 }
0608 
0609 struct del_port_learned_ctx {
0610     int port;
0611 };
0612 
0613 /* Clear learned (non-static) entry on given port */
0614 static int alr_loop_cb_del_port_learned(struct lan9303 *chip, u32 dat0,
0615                     u32 dat1, int portmap, void *ctx)
0616 {
0617     struct del_port_learned_ctx *del_ctx = ctx;
0618     int port = del_ctx->port;
0619 
0620     if (((BIT(port) & portmap) == 0) || (dat1 & LAN9303_ALR_DAT1_STATIC))
0621         return 0;
0622 
0623     /* learned entries has only one port, we can just delete */
0624     dat1 &= ~LAN9303_ALR_DAT1_VALID; /* delete entry */
0625     lan9303_alr_make_entry_raw(chip, dat0, dat1);
0626 
0627     return 0;
0628 }
0629 
0630 struct port_fdb_dump_ctx {
0631     int port;
0632     void *data;
0633     dsa_fdb_dump_cb_t *cb;
0634 };
0635 
0636 static int alr_loop_cb_fdb_port_dump(struct lan9303 *chip, u32 dat0,
0637                      u32 dat1, int portmap, void *ctx)
0638 {
0639     struct port_fdb_dump_ctx *dump_ctx = ctx;
0640     u8 mac[ETH_ALEN];
0641     bool is_static;
0642 
0643     if ((BIT(dump_ctx->port) & portmap) == 0)
0644         return 0;
0645 
0646     alr_reg_to_mac(dat0, dat1, mac);
0647     is_static = !!(dat1 & LAN9303_ALR_DAT1_STATIC);
0648     return dump_ctx->cb(mac, 0, is_static, dump_ctx->data);
0649 }
0650 
0651 /* Set a static ALR entry. Delete entry if port_map is zero */
0652 static void lan9303_alr_set_entry(struct lan9303 *chip, const u8 *mac,
0653                   u8 port_map, bool stp_override)
0654 {
0655     u32 dat0, dat1, alr_port;
0656 
0657     dev_dbg(chip->dev, "%s(%pM, %d)\n", __func__, mac, port_map);
0658     dat1 = LAN9303_ALR_DAT1_STATIC;
0659     if (port_map)
0660         dat1 |= LAN9303_ALR_DAT1_VALID;
0661     /* otherwise no ports: delete entry */
0662     if (stp_override)
0663         dat1 |= LAN9303_ALR_DAT1_AGE_OVERRID;
0664 
0665     alr_port = portmap_2_alrport[port_map & 7];
0666     dat1 &= ~LAN9303_ALR_DAT1_PORT_MASK;
0667     dat1 |= alr_port << LAN9303_ALR_DAT1_PORT_BITOFFS;
0668 
0669     dat0 = 0;
0670     dat0 |= (mac[0] << 0);
0671     dat0 |= (mac[1] << 8);
0672     dat0 |= (mac[2] << 16);
0673     dat0 |= (mac[3] << 24);
0674 
0675     dat1 |= (mac[4] << 0);
0676     dat1 |= (mac[5] << 8);
0677 
0678     lan9303_alr_make_entry_raw(chip, dat0, dat1);
0679 }
0680 
0681 /* Add port to static ALR entry, create new static entry if needed */
0682 static int lan9303_alr_add_port(struct lan9303 *chip, const u8 *mac, int port,
0683                 bool stp_override)
0684 {
0685     struct lan9303_alr_cache_entry *entr;
0686 
0687     mutex_lock(&chip->alr_mutex);
0688     entr = lan9303_alr_cache_find_mac(chip, mac);
0689     if (!entr) { /*New entry */
0690         entr = lan9303_alr_cache_find_free(chip);
0691         if (!entr) {
0692             mutex_unlock(&chip->alr_mutex);
0693             return -ENOSPC;
0694         }
0695         ether_addr_copy(entr->mac_addr, mac);
0696     }
0697     entr->port_map |= BIT(port);
0698     entr->stp_override = stp_override;
0699     lan9303_alr_set_entry(chip, mac, entr->port_map, stp_override);
0700     mutex_unlock(&chip->alr_mutex);
0701 
0702     return 0;
0703 }
0704 
0705 /* Delete static port from ALR entry, delete entry if last port */
0706 static int lan9303_alr_del_port(struct lan9303 *chip, const u8 *mac, int port)
0707 {
0708     struct lan9303_alr_cache_entry *entr;
0709 
0710     mutex_lock(&chip->alr_mutex);
0711     entr = lan9303_alr_cache_find_mac(chip, mac);
0712     if (!entr)
0713         goto out;  /* no static entry found */
0714 
0715     entr->port_map &= ~BIT(port);
0716     if (entr->port_map == 0) /* zero means its free again */
0717         eth_zero_addr(entr->mac_addr);
0718     lan9303_alr_set_entry(chip, mac, entr->port_map, entr->stp_override);
0719 
0720 out:
0721     mutex_unlock(&chip->alr_mutex);
0722     return 0;
0723 }
0724 
0725 static int lan9303_disable_processing_port(struct lan9303 *chip,
0726                        unsigned int port)
0727 {
0728     int ret;
0729 
0730     /* disable RX, but keep register reset default values else */
0731     ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
0732                     LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES);
0733     if (ret)
0734         return ret;
0735 
0736     /* disable TX, but keep register reset default values else */
0737     return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
0738                 LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
0739                 LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE);
0740 }
0741 
0742 static int lan9303_enable_processing_port(struct lan9303 *chip,
0743                       unsigned int port)
0744 {
0745     int ret;
0746 
0747     /* enable RX and keep register reset default values else */
0748     ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
0749                     LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES |
0750                     LAN9303_MAC_RX_CFG_X_RX_ENABLE);
0751     if (ret)
0752         return ret;
0753 
0754     /* enable TX and keep register reset default values else */
0755     return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
0756                 LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
0757                 LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE |
0758                 LAN9303_MAC_TX_CFG_X_TX_ENABLE);
0759 }
0760 
0761 /* forward special tagged packets from port 0 to port 1 *or* port 2 */
0762 static int lan9303_setup_tagging(struct lan9303 *chip)
0763 {
0764     int ret;
0765     u32 val;
0766     /* enable defining the destination port via special VLAN tagging
0767      * for port 0
0768      */
0769     ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE,
0770                        LAN9303_SWE_INGRESS_PORT_TYPE_VLAN);
0771     if (ret)
0772         return ret;
0773 
0774     /* tag incoming packets at port 1 and 2 on their way to port 0 to be
0775      * able to discover their source port
0776      */
0777     val = LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0;
0778     return lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE, val);
0779 }
0780 
0781 /* We want a special working switch:
0782  * - do not forward packets between port 1 and 2
0783  * - forward everything from port 1 to port 0
0784  * - forward everything from port 2 to port 0
0785  */
0786 static int lan9303_separate_ports(struct lan9303 *chip)
0787 {
0788     int ret;
0789 
0790     lan9303_alr_del_port(chip, eth_stp_addr, 0);
0791     ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
0792                 LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
0793                 LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
0794                 LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 |
0795                 LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING |
0796                 LAN9303_SWE_PORT_MIRROR_SNIFF_ALL);
0797     if (ret)
0798         return ret;
0799 
0800     /* prevent port 1 and 2 from forwarding packets by their own */
0801     return lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
0802                 LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 |
0803                 LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 |
0804                 LAN9303_SWE_PORT_STATE_BLOCKING_PORT2);
0805 }
0806 
0807 static void lan9303_bridge_ports(struct lan9303 *chip)
0808 {
0809     /* ports bridged: remove mirroring */
0810     lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
0811                  LAN9303_SWE_PORT_MIRROR_DISABLED);
0812 
0813     lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
0814                  chip->swe_port_state);
0815     lan9303_alr_add_port(chip, eth_stp_addr, 0, true);
0816 }
0817 
0818 static void lan9303_handle_reset(struct lan9303 *chip)
0819 {
0820     if (!chip->reset_gpio)
0821         return;
0822 
0823     if (chip->reset_duration != 0)
0824         msleep(chip->reset_duration);
0825 
0826     /* release (deassert) reset and activate the device */
0827     gpiod_set_value_cansleep(chip->reset_gpio, 0);
0828 }
0829 
0830 /* stop processing packets for all ports */
0831 static int lan9303_disable_processing(struct lan9303 *chip)
0832 {
0833     int p;
0834 
0835     for (p = 1; p < LAN9303_NUM_PORTS; p++) {
0836         int ret = lan9303_disable_processing_port(chip, p);
0837 
0838         if (ret)
0839             return ret;
0840     }
0841 
0842     return 0;
0843 }
0844 
0845 static int lan9303_check_device(struct lan9303 *chip)
0846 {
0847     int ret;
0848     u32 reg;
0849 
0850     ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, &reg);
0851     if (ret) {
0852         dev_err(chip->dev, "failed to read chip revision register: %d\n",
0853             ret);
0854         if (!chip->reset_gpio) {
0855             dev_dbg(chip->dev,
0856                 "hint: maybe failed due to missing reset GPIO\n");
0857         }
0858         return ret;
0859     }
0860 
0861     if ((reg >> 16) != LAN9303_CHIP_ID) {
0862         dev_err(chip->dev, "expecting LAN9303 chip, but found: %X\n",
0863             reg >> 16);
0864         return -ENODEV;
0865     }
0866 
0867     /* The default state of the LAN9303 device is to forward packets between
0868      * all ports (if not configured differently by an external EEPROM).
0869      * The initial state of a DSA device must be forwarding packets only
0870      * between the external and the internal ports and no forwarding
0871      * between the external ports. In preparation we stop packet handling
0872      * at all for now until the LAN9303 device is re-programmed accordingly.
0873      */
0874     ret = lan9303_disable_processing(chip);
0875     if (ret)
0876         dev_warn(chip->dev, "failed to disable switching %d\n", ret);
0877 
0878     dev_info(chip->dev, "Found LAN9303 rev. %u\n", reg & 0xffff);
0879 
0880     ret = lan9303_detect_phy_setup(chip);
0881     if (ret) {
0882         dev_err(chip->dev,
0883             "failed to discover phy bootstrap setup: %d\n", ret);
0884         return ret;
0885     }
0886 
0887     return 0;
0888 }
0889 
0890 /* ---------------------------- DSA -----------------------------------*/
0891 
0892 static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds,
0893                               int port,
0894                               enum dsa_tag_protocol mp)
0895 {
0896     return DSA_TAG_PROTO_LAN9303;
0897 }
0898 
0899 static int lan9303_setup(struct dsa_switch *ds)
0900 {
0901     struct lan9303 *chip = ds->priv;
0902     int ret;
0903 
0904     /* Make sure that port 0 is the cpu port */
0905     if (!dsa_is_cpu_port(ds, 0)) {
0906         dev_err(chip->dev, "port 0 is not the CPU port\n");
0907         return -EINVAL;
0908     }
0909 
0910     ret = lan9303_setup_tagging(chip);
0911     if (ret)
0912         dev_err(chip->dev, "failed to setup port tagging %d\n", ret);
0913 
0914     ret = lan9303_separate_ports(chip);
0915     if (ret)
0916         dev_err(chip->dev, "failed to separate ports %d\n", ret);
0917 
0918     ret = lan9303_enable_processing_port(chip, 0);
0919     if (ret)
0920         dev_err(chip->dev, "failed to re-enable switching %d\n", ret);
0921 
0922     /* Trap IGMP to port 0 */
0923     ret = lan9303_write_switch_reg_mask(chip, LAN9303_SWE_GLB_INGRESS_CFG,
0924                         LAN9303_SWE_GLB_INGR_IGMP_TRAP |
0925                         LAN9303_SWE_GLB_INGR_IGMP_PORT(0),
0926                         LAN9303_SWE_GLB_INGR_IGMP_PORT(1) |
0927                         LAN9303_SWE_GLB_INGR_IGMP_PORT(2));
0928     if (ret)
0929         dev_err(chip->dev, "failed to setup IGMP trap %d\n", ret);
0930 
0931     return 0;
0932 }
0933 
0934 struct lan9303_mib_desc {
0935     unsigned int offset; /* offset of first MAC */
0936     const char *name;
0937 };
0938 
0939 static const struct lan9303_mib_desc lan9303_mib[] = {
0940     { .offset = LAN9303_MAC_RX_BRDCST_CNT_0, .name = "RxBroad", },
0941     { .offset = LAN9303_MAC_RX_PAUSE_CNT_0, .name = "RxPause", },
0942     { .offset = LAN9303_MAC_RX_MULCST_CNT_0, .name = "RxMulti", },
0943     { .offset = LAN9303_MAC_RX_PKTOK_CNT_0, .name = "RxOk", },
0944     { .offset = LAN9303_MAC_RX_CRCERR_CNT_0, .name = "RxCrcErr", },
0945     { .offset = LAN9303_MAC_RX_ALIGN_CNT_0, .name = "RxAlignErr", },
0946     { .offset = LAN9303_MAC_RX_JABB_CNT_0, .name = "RxJabber", },
0947     { .offset = LAN9303_MAC_RX_FRAG_CNT_0, .name = "RxFragment", },
0948     { .offset = LAN9303_MAC_RX_64_CNT_0, .name = "Rx64Byte", },
0949     { .offset = LAN9303_MAC_RX_127_CNT_0, .name = "Rx128Byte", },
0950     { .offset = LAN9303_MAC_RX_255_CNT_0, .name = "Rx256Byte", },
0951     { .offset = LAN9303_MAC_RX_511_CNT_0, .name = "Rx512Byte", },
0952     { .offset = LAN9303_MAC_RX_1023_CNT_0, .name = "Rx1024Byte", },
0953     { .offset = LAN9303_MAC_RX_MAX_CNT_0, .name = "RxMaxByte", },
0954     { .offset = LAN9303_MAC_RX_PKTLEN_CNT_0, .name = "RxByteCnt", },
0955     { .offset = LAN9303_MAC_RX_SYMBL_CNT_0, .name = "RxSymbolCnt", },
0956     { .offset = LAN9303_MAC_RX_CTLFRM_CNT_0, .name = "RxCfs", },
0957     { .offset = LAN9303_MAC_RX_OVRSZE_CNT_0, .name = "RxOverFlow", },
0958     { .offset = LAN9303_MAC_TX_UNDSZE_CNT_0, .name = "TxShort", },
0959     { .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", },
0960     { .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", },
0961     { .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", },
0962     { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", },
0963     { .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", },
0964     { .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", },
0965     { .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },
0966     { .offset = LAN9303_MAC_TX_511_CNT_0, .name = "Tx512Byte", },
0967     { .offset = LAN9303_MAC_TX_1023_CNT_0, .name = "Tx1024Byte", },
0968     { .offset = LAN9303_MAC_TX_MAX_CNT_0, .name = "TxMaxByte", },
0969     { .offset = LAN9303_MAC_TX_PKTLEN_CNT_0, .name = "TxByteCnt", },
0970     { .offset = LAN9303_MAC_TX_PKTOK_CNT_0, .name = "TxOk", },
0971     { .offset = LAN9303_MAC_TX_TOTALCOL_CNT_0, .name = "TxCollision", },
0972     { .offset = LAN9303_MAC_TX_MULTICOL_CNT_0, .name = "TxMultiCol", },
0973     { .offset = LAN9303_MAC_TX_SNGLECOL_CNT_0, .name = "TxSingleCol", },
0974     { .offset = LAN9303_MAC_TX_EXCOL_CNT_0, .name = "TxExcCol", },
0975     { .offset = LAN9303_MAC_TX_DEFER_CNT_0, .name = "TxDefer", },
0976     { .offset = LAN9303_MAC_TX_LATECOL_0, .name = "TxLateCol", },
0977 };
0978 
0979 static void lan9303_get_strings(struct dsa_switch *ds, int port,
0980                 u32 stringset, uint8_t *data)
0981 {
0982     unsigned int u;
0983 
0984     if (stringset != ETH_SS_STATS)
0985         return;
0986 
0987     for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
0988         strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name,
0989             ETH_GSTRING_LEN);
0990     }
0991 }
0992 
0993 static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port,
0994                       uint64_t *data)
0995 {
0996     struct lan9303 *chip = ds->priv;
0997     unsigned int u;
0998 
0999     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 
1013 static 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 
1021 static 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 
1034 static 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 
1048 static 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 
1084 static 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 
1098 static 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 
1112 static 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 
1128 static 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 
1140 static 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 
1180 static 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 
1191 static 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 
1204 static 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 
1218 static 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 
1232 static 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 
1249 static 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 
1265 static 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 
1280 static 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 
1302 static 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 
1320 static 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 
1349 int 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 }
1374 EXPORT_SYMBOL(lan9303_probe);
1375 
1376 int 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 }
1392 EXPORT_SYMBOL(lan9303_remove);
1393 
1394 void lan9303_shutdown(struct lan9303 *chip)
1395 {
1396     dsa_switch_shutdown(chip->ds);
1397 }
1398 EXPORT_SYMBOL(lan9303_shutdown);
1399 
1400 MODULE_AUTHOR("Juergen Borleis <kernel@pengutronix.de>");
1401 MODULE_DESCRIPTION("Core driver for SMSC/Microchip LAN9303 three port ethernet switch");
1402 MODULE_LICENSE("GPL v2");