2 * Copyright (C) 2017 Pengutronix, Juergen Borleis <kernel@pengutronix.de>
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * version 2, as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/gpio/consumer.h>
17 #include <linux/regmap.h>
18 #include <linux/mutex.h>
19 #include <linux/mii.h>
20 #include <linux/phy.h>
21 #include <linux/if_bridge.h>
25 #define LAN9303_NUM_PORTS 3
27 /* 13.2 System Control and Status Registers
28 * Multiply register number by 4 to get address offset.
30 #define LAN9303_CHIP_REV 0x14
31 # define LAN9303_CHIP_ID 0x9303
32 #define LAN9303_IRQ_CFG 0x15
33 # define LAN9303_IRQ_CFG_IRQ_ENABLE BIT(8)
34 # define LAN9303_IRQ_CFG_IRQ_POL BIT(4)
35 # define LAN9303_IRQ_CFG_IRQ_TYPE BIT(0)
36 #define LAN9303_INT_STS 0x16
37 # define LAN9303_INT_STS_PHY_INT2 BIT(27)
38 # define LAN9303_INT_STS_PHY_INT1 BIT(26)
39 #define LAN9303_INT_EN 0x17
40 # define LAN9303_INT_EN_PHY_INT2_EN BIT(27)
41 # define LAN9303_INT_EN_PHY_INT1_EN BIT(26)
42 #define LAN9303_HW_CFG 0x1D
43 # define LAN9303_HW_CFG_READY BIT(27)
44 # define LAN9303_HW_CFG_AMDX_EN_PORT2 BIT(26)
45 # define LAN9303_HW_CFG_AMDX_EN_PORT1 BIT(25)
46 #define LAN9303_PMI_DATA 0x29
47 #define LAN9303_PMI_ACCESS 0x2A
48 # define LAN9303_PMI_ACCESS_PHY_ADDR(x) (((x) & 0x1f) << 11)
49 # define LAN9303_PMI_ACCESS_MIIRINDA(x) (((x) & 0x1f) << 6)
50 # define LAN9303_PMI_ACCESS_MII_BUSY BIT(0)
51 # define LAN9303_PMI_ACCESS_MII_WRITE BIT(1)
52 #define LAN9303_MANUAL_FC_1 0x68
53 #define LAN9303_MANUAL_FC_2 0x69
54 #define LAN9303_MANUAL_FC_0 0x6a
55 #define LAN9303_SWITCH_CSR_DATA 0x6b
56 #define LAN9303_SWITCH_CSR_CMD 0x6c
57 #define LAN9303_SWITCH_CSR_CMD_BUSY BIT(31)
58 #define LAN9303_SWITCH_CSR_CMD_RW BIT(30)
59 #define LAN9303_SWITCH_CSR_CMD_LANES (BIT(19) | BIT(18) | BIT(17) | BIT(16))
60 #define LAN9303_VIRT_PHY_BASE 0x70
61 #define LAN9303_VIRT_SPECIAL_CTRL 0x77
62 #define LAN9303_VIRT_SPECIAL_TURBO BIT(10) /*Turbo MII Enable*/
64 /*13.4 Switch Fabric Control and Status Registers
65 * Accessed indirectly via SWITCH_CSR_CMD, SWITCH_CSR_DATA.
67 #define LAN9303_SW_DEV_ID 0x0000
68 #define LAN9303_SW_RESET 0x0001
69 #define LAN9303_SW_RESET_RESET BIT(0)
70 #define LAN9303_SW_IMR 0x0004
71 #define LAN9303_SW_IPR 0x0005
72 #define LAN9303_MAC_VER_ID_0 0x0400
73 #define LAN9303_MAC_RX_CFG_0 0x0401
74 # define LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES BIT(1)
75 # define LAN9303_MAC_RX_CFG_X_RX_ENABLE BIT(0)
76 #define LAN9303_MAC_RX_UNDSZE_CNT_0 0x0410
77 #define LAN9303_MAC_RX_64_CNT_0 0x0411
78 #define LAN9303_MAC_RX_127_CNT_0 0x0412
79 #define LAN9303_MAC_RX_255_CNT_0 0x413
80 #define LAN9303_MAC_RX_511_CNT_0 0x0414
81 #define LAN9303_MAC_RX_1023_CNT_0 0x0415
82 #define LAN9303_MAC_RX_MAX_CNT_0 0x0416
83 #define LAN9303_MAC_RX_OVRSZE_CNT_0 0x0417
84 #define LAN9303_MAC_RX_PKTOK_CNT_0 0x0418
85 #define LAN9303_MAC_RX_CRCERR_CNT_0 0x0419
86 #define LAN9303_MAC_RX_MULCST_CNT_0 0x041a
87 #define LAN9303_MAC_RX_BRDCST_CNT_0 0x041b
88 #define LAN9303_MAC_RX_PAUSE_CNT_0 0x041c
89 #define LAN9303_MAC_RX_FRAG_CNT_0 0x041d
90 #define LAN9303_MAC_RX_JABB_CNT_0 0x041e
91 #define LAN9303_MAC_RX_ALIGN_CNT_0 0x041f
92 #define LAN9303_MAC_RX_PKTLEN_CNT_0 0x0420
93 #define LAN9303_MAC_RX_GOODPKTLEN_CNT_0 0x0421
94 #define LAN9303_MAC_RX_SYMBL_CNT_0 0x0422
95 #define LAN9303_MAC_RX_CTLFRM_CNT_0 0x0423
97 #define LAN9303_MAC_TX_CFG_0 0x0440
98 # define LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT (21 << 2)
99 # define LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE BIT(1)
100 # define LAN9303_MAC_TX_CFG_X_TX_ENABLE BIT(0)
101 #define LAN9303_MAC_TX_DEFER_CNT_0 0x0451
102 #define LAN9303_MAC_TX_PAUSE_CNT_0 0x0452
103 #define LAN9303_MAC_TX_PKTOK_CNT_0 0x0453
104 #define LAN9303_MAC_TX_64_CNT_0 0x0454
105 #define LAN9303_MAC_TX_127_CNT_0 0x0455
106 #define LAN9303_MAC_TX_255_CNT_0 0x0456
107 #define LAN9303_MAC_TX_511_CNT_0 0x0457
108 #define LAN9303_MAC_TX_1023_CNT_0 0x0458
109 #define LAN9303_MAC_TX_MAX_CNT_0 0x0459
110 #define LAN9303_MAC_TX_UNDSZE_CNT_0 0x045a
111 #define LAN9303_MAC_TX_PKTLEN_CNT_0 0x045c
112 #define LAN9303_MAC_TX_BRDCST_CNT_0 0x045d
113 #define LAN9303_MAC_TX_MULCST_CNT_0 0x045e
114 #define LAN9303_MAC_TX_LATECOL_0 0x045f
115 #define LAN9303_MAC_TX_EXCOL_CNT_0 0x0460
116 #define LAN9303_MAC_TX_SNGLECOL_CNT_0 0x0461
117 #define LAN9303_MAC_TX_MULTICOL_CNT_0 0x0462
118 #define LAN9303_MAC_TX_TOTALCOL_CNT_0 0x0463
120 #define LAN9303_MAC_VER_ID_1 0x0800
121 #define LAN9303_MAC_RX_CFG_1 0x0801
122 #define LAN9303_MAC_TX_CFG_1 0x0840
123 #define LAN9303_MAC_VER_ID_2 0x0c00
124 #define LAN9303_MAC_RX_CFG_2 0x0c01
125 #define LAN9303_MAC_TX_CFG_2 0x0c40
126 #define LAN9303_SWE_ALR_CMD 0x1800
127 #define LAN9303_SWE_VLAN_CMD 0x180b
128 # define LAN9303_SWE_VLAN_CMD_RNW BIT(5)
129 # define LAN9303_SWE_VLAN_CMD_PVIDNVLAN BIT(4)
130 #define LAN9303_SWE_VLAN_WR_DATA 0x180c
131 #define LAN9303_SWE_VLAN_RD_DATA 0x180e
132 # define LAN9303_SWE_VLAN_MEMBER_PORT2 BIT(17)
133 # define LAN9303_SWE_VLAN_UNTAG_PORT2 BIT(16)
134 # define LAN9303_SWE_VLAN_MEMBER_PORT1 BIT(15)
135 # define LAN9303_SWE_VLAN_UNTAG_PORT1 BIT(14)
136 # define LAN9303_SWE_VLAN_MEMBER_PORT0 BIT(13)
137 # define LAN9303_SWE_VLAN_UNTAG_PORT0 BIT(12)
138 #define LAN9303_SWE_VLAN_CMD_STS 0x1810
139 #define LAN9303_SWE_GLB_INGRESS_CFG 0x1840
140 #define LAN9303_SWE_PORT_STATE 0x1843
141 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT2 (0)
142 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT2 BIT(5)
143 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT2 BIT(4)
144 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT1 (0)
145 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT1 BIT(3)
146 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 BIT(2)
147 # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 (0)
148 # define LAN9303_SWE_PORT_STATE_LEARNING_PORT0 BIT(1)
149 # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT0 BIT(0)
150 # define LAN9303_SWE_PORT_STATE_DISABLED_PORT0 (3)
151 #define LAN9303_SWE_PORT_MIRROR 0x1846
152 # define LAN9303_SWE_PORT_MIRROR_SNIFF_ALL BIT(8)
153 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT2 BIT(7)
154 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT1 BIT(6)
155 # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 BIT(5)
156 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 BIT(4)
157 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 BIT(3)
158 # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT0 BIT(2)
159 # define LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING BIT(1)
160 # define LAN9303_SWE_PORT_MIRROR_ENABLE_TX_MIRRORING BIT(0)
161 # define LAN9303_SWE_PORT_MIRROR_DISABLED 0
162 #define LAN9303_SWE_INGRESS_PORT_TYPE 0x1847
163 #define LAN9303_SWE_INGRESS_PORT_TYPE_VLAN 3
164 #define LAN9303_BM_CFG 0x1c00
165 #define LAN9303_BM_EGRSS_PORT_TYPE 0x1c0c
166 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT2 (BIT(17) | BIT(16))
167 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT1 (BIT(9) | BIT(8))
168 # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0 (BIT(1) | BIT(0))
170 #define LAN9303_SWITCH_PORT_REG(port, reg0) (0x400 * (port) + (reg0))
172 /* the built-in PHYs are of type LAN911X */
173 #define MII_LAN911X_SPECIAL_MODES 0x12
174 #define MII_LAN911X_SPECIAL_CONTROL_STATUS 0x1f
176 static const struct regmap_range lan9303_valid_regs[] = {
177 regmap_reg_range(0x14, 0x17), /* misc, interrupt */
178 regmap_reg_range(0x19, 0x19), /* endian test */
179 regmap_reg_range(0x1d, 0x1d), /* hardware config */
180 regmap_reg_range(0x23, 0x24), /* general purpose timer */
181 regmap_reg_range(0x27, 0x27), /* counter */
182 regmap_reg_range(0x29, 0x2a), /* PMI index regs */
183 regmap_reg_range(0x68, 0x6a), /* flow control */
184 regmap_reg_range(0x6b, 0x6c), /* switch fabric indirect regs */
185 regmap_reg_range(0x6d, 0x6f), /* misc */
186 regmap_reg_range(0x70, 0x77), /* virtual phy */
187 regmap_reg_range(0x78, 0x7a), /* GPIO */
188 regmap_reg_range(0x7c, 0x7e), /* MAC & reset */
189 regmap_reg_range(0x80, 0xb7), /* switch fabric direct regs (wr only) */
192 static const struct regmap_range lan9303_reserved_ranges[] = {
193 regmap_reg_range(0x00, 0x13),
194 regmap_reg_range(0x18, 0x18),
195 regmap_reg_range(0x1a, 0x1c),
196 regmap_reg_range(0x1e, 0x22),
197 regmap_reg_range(0x25, 0x26),
198 regmap_reg_range(0x28, 0x28),
199 regmap_reg_range(0x2b, 0x67),
200 regmap_reg_range(0x7b, 0x7b),
201 regmap_reg_range(0x7f, 0x7f),
202 regmap_reg_range(0xb8, 0xff),
205 const struct regmap_access_table lan9303_register_set = {
206 .yes_ranges = lan9303_valid_regs,
207 .n_yes_ranges = ARRAY_SIZE(lan9303_valid_regs),
208 .no_ranges = lan9303_reserved_ranges,
209 .n_no_ranges = ARRAY_SIZE(lan9303_reserved_ranges),
211 EXPORT_SYMBOL(lan9303_register_set);
213 static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
217 /* we can lose arbitration for the I2C case, because the device
218 * tries to detect and read an external EEPROM after reset and acts as
219 * a master on the shared I2C bus itself. This conflicts with our
220 * attempts to access the device as a slave at the same moment.
222 for (i = 0; i < 5; i++) {
223 ret = regmap_read(regmap, offset, reg);
234 static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
239 if (regnum > MII_EXPANSION)
242 ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val);
249 static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val)
251 if (regnum > MII_EXPANSION)
254 return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val);
257 static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip)
262 for (i = 0; i < 25; i++) {
263 ret = lan9303_read(chip->regmap, LAN9303_PMI_ACCESS, ®);
266 "Failed to read pmi access status: %d\n", ret);
269 if (!(reg & LAN9303_PMI_ACCESS_MII_BUSY))
277 static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum)
282 val = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
283 val |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
285 mutex_lock(&chip->indirect_mutex);
287 ret = lan9303_indirect_phy_wait_for_completion(chip);
291 /* start the MII read cycle */
292 ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val);
296 ret = lan9303_indirect_phy_wait_for_completion(chip);
300 /* read the result of this operation */
301 ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val);
305 mutex_unlock(&chip->indirect_mutex);
310 mutex_unlock(&chip->indirect_mutex);
314 static int lan9303_indirect_phy_write(struct lan9303 *chip, int addr,
320 reg = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
321 reg |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
322 reg |= LAN9303_PMI_ACCESS_MII_WRITE;
324 mutex_lock(&chip->indirect_mutex);
326 ret = lan9303_indirect_phy_wait_for_completion(chip);
330 /* write the data first... */
331 ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val);
335 /* ...then start the MII write cycle */
336 ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg);
339 mutex_unlock(&chip->indirect_mutex);
343 const struct lan9303_phy_ops lan9303_indirect_phy_ops = {
344 .phy_read = lan9303_indirect_phy_read,
345 .phy_write = lan9303_indirect_phy_write,
347 EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops);
349 static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
354 for (i = 0; i < 25; i++) {
355 ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_CMD, ®);
358 "Failed to read csr command status: %d\n", ret);
361 if (!(reg & LAN9303_SWITCH_CSR_CMD_BUSY))
369 static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
375 reg |= LAN9303_SWITCH_CSR_CMD_LANES;
376 reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
378 mutex_lock(&chip->indirect_mutex);
380 ret = lan9303_switch_wait_for_completion(chip);
384 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
386 dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret);
391 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
393 dev_err(chip->dev, "Failed to write csr command reg: %d\n",
397 mutex_unlock(&chip->indirect_mutex);
401 static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)
407 reg |= LAN9303_SWITCH_CSR_CMD_LANES;
408 reg |= LAN9303_SWITCH_CSR_CMD_RW;
409 reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
411 mutex_lock(&chip->indirect_mutex);
413 ret = lan9303_switch_wait_for_completion(chip);
418 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
420 dev_err(chip->dev, "Failed to write csr command reg: %d\n",
425 ret = lan9303_switch_wait_for_completion(chip);
429 ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
431 dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret);
433 mutex_unlock(&chip->indirect_mutex);
437 static int lan9303_write_switch_port(struct lan9303 *chip, int port,
440 return lan9303_write_switch_reg(
441 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
444 static int lan9303_read_switch_port(struct lan9303 *chip, int port,
445 u16 regnum, u32 *val)
447 return lan9303_read_switch_reg(
448 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
451 static int lan9303_detect_phy_setup(struct lan9303 *chip)
455 /* depending on the 'phy_addr_sel_strap' setting, the three phys are
456 * using IDs 0-1-2 or IDs 1-2-3. We cannot read back the
457 * 'phy_addr_sel_strap' setting directly, so we need a test, which
458 * configuration is active:
459 * Special reg 18 of phy 3 reads as 0x0000, if 'phy_addr_sel_strap' is 0
460 * and the IDs are 0-1-2, else it contains something different from
461 * 0x0000, which means 'phy_addr_sel_strap' is 1 and the IDs are 1-2-3.
462 * 0xffff is returned on MDIO read with no response.
464 reg = chip->ops->phy_read(chip, 3, MII_LAN911X_SPECIAL_MODES);
466 dev_err(chip->dev, "Failed to detect phy config: %d\n", reg);
470 if ((reg != 0) && (reg != 0xffff))
471 chip->phy_addr_sel_strap = 1;
473 chip->phy_addr_sel_strap = 0;
475 dev_dbg(chip->dev, "Phy setup '%s' detected\n",
476 chip->phy_addr_sel_strap ? "1-2-3" : "0-1-2");
481 static int lan9303_disable_processing_port(struct lan9303 *chip,
486 /* disable RX, but keep register reset default values else */
487 ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
488 LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES);
492 /* disable TX, but keep register reset default values else */
493 return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
494 LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
495 LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE);
498 static int lan9303_enable_processing_port(struct lan9303 *chip,
503 /* enable RX and keep register reset default values else */
504 ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0,
505 LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES |
506 LAN9303_MAC_RX_CFG_X_RX_ENABLE);
510 /* enable TX and keep register reset default values else */
511 return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0,
512 LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
513 LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE |
514 LAN9303_MAC_TX_CFG_X_TX_ENABLE);
517 /* forward special tagged packets from port 0 to port 1 *or* port 2 */
518 static int lan9303_setup_tagging(struct lan9303 *chip)
522 /* enable defining the destination port via special VLAN tagging
525 ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE,
526 LAN9303_SWE_INGRESS_PORT_TYPE_VLAN);
530 /* tag incoming packets at port 1 and 2 on their way to port 0 to be
531 * able to discover their source port
533 val = LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0;
534 return lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE, val);
537 /* We want a special working switch:
538 * - do not forward packets between port 1 and 2
539 * - forward everything from port 1 to port 0
540 * - forward everything from port 2 to port 0
542 static int lan9303_separate_ports(struct lan9303 *chip)
546 ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
547 LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
548 LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
549 LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 |
550 LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING |
551 LAN9303_SWE_PORT_MIRROR_SNIFF_ALL);
555 /* prevent port 1 and 2 from forwarding packets by their own */
556 return lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
557 LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 |
558 LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 |
559 LAN9303_SWE_PORT_STATE_BLOCKING_PORT2);
562 static void lan9303_bridge_ports(struct lan9303 *chip)
564 /* ports bridged: remove mirroring */
565 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
566 LAN9303_SWE_PORT_MIRROR_DISABLED);
568 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
569 chip->swe_port_state);
572 static int lan9303_handle_reset(struct lan9303 *chip)
574 if (!chip->reset_gpio)
577 if (chip->reset_duration != 0)
578 msleep(chip->reset_duration);
580 /* release (deassert) reset and activate the device */
581 gpiod_set_value_cansleep(chip->reset_gpio, 0);
586 /* stop processing packets for all ports */
587 static int lan9303_disable_processing(struct lan9303 *chip)
591 for (p = 0; p < LAN9303_NUM_PORTS; p++) {
592 int ret = lan9303_disable_processing_port(chip, p);
601 static int lan9303_check_device(struct lan9303 *chip)
606 ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, ®);
608 dev_err(chip->dev, "failed to read chip revision register: %d\n",
610 if (!chip->reset_gpio) {
612 "hint: maybe failed due to missing reset GPIO\n");
617 if ((reg >> 16) != LAN9303_CHIP_ID) {
618 dev_err(chip->dev, "expecting LAN9303 chip, but found: %X\n",
623 /* The default state of the LAN9303 device is to forward packets between
624 * all ports (if not configured differently by an external EEPROM).
625 * The initial state of a DSA device must be forwarding packets only
626 * between the external and the internal ports and no forwarding
627 * between the external ports. In preparation we stop packet handling
628 * at all for now until the LAN9303 device is re-programmed accordingly.
630 ret = lan9303_disable_processing(chip);
632 dev_warn(chip->dev, "failed to disable switching %d\n", ret);
634 dev_info(chip->dev, "Found LAN9303 rev. %u\n", reg & 0xffff);
636 ret = lan9303_detect_phy_setup(chip);
639 "failed to discover phy bootstrap setup: %d\n", ret);
646 /* ---------------------------- DSA -----------------------------------*/
648 static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds)
650 return DSA_TAG_PROTO_LAN9303;
653 static int lan9303_setup(struct dsa_switch *ds)
655 struct lan9303 *chip = ds->priv;
658 /* Make sure that port 0 is the cpu port */
659 if (!dsa_is_cpu_port(ds, 0)) {
660 dev_err(chip->dev, "port 0 is not the CPU port\n");
664 ret = lan9303_setup_tagging(chip);
666 dev_err(chip->dev, "failed to setup port tagging %d\n", ret);
668 ret = lan9303_separate_ports(chip);
670 dev_err(chip->dev, "failed to separate ports %d\n", ret);
672 ret = lan9303_enable_processing_port(chip, 0);
674 dev_err(chip->dev, "failed to re-enable switching %d\n", ret);
679 struct lan9303_mib_desc {
680 unsigned int offset; /* offset of first MAC */
684 static const struct lan9303_mib_desc lan9303_mib[] = {
685 { .offset = LAN9303_MAC_RX_BRDCST_CNT_0, .name = "RxBroad", },
686 { .offset = LAN9303_MAC_RX_PAUSE_CNT_0, .name = "RxPause", },
687 { .offset = LAN9303_MAC_RX_MULCST_CNT_0, .name = "RxMulti", },
688 { .offset = LAN9303_MAC_RX_PKTOK_CNT_0, .name = "RxOk", },
689 { .offset = LAN9303_MAC_RX_CRCERR_CNT_0, .name = "RxCrcErr", },
690 { .offset = LAN9303_MAC_RX_ALIGN_CNT_0, .name = "RxAlignErr", },
691 { .offset = LAN9303_MAC_RX_JABB_CNT_0, .name = "RxJabber", },
692 { .offset = LAN9303_MAC_RX_FRAG_CNT_0, .name = "RxFragment", },
693 { .offset = LAN9303_MAC_RX_64_CNT_0, .name = "Rx64Byte", },
694 { .offset = LAN9303_MAC_RX_127_CNT_0, .name = "Rx128Byte", },
695 { .offset = LAN9303_MAC_RX_255_CNT_0, .name = "Rx256Byte", },
696 { .offset = LAN9303_MAC_RX_511_CNT_0, .name = "Rx512Byte", },
697 { .offset = LAN9303_MAC_RX_1023_CNT_0, .name = "Rx1024Byte", },
698 { .offset = LAN9303_MAC_RX_MAX_CNT_0, .name = "RxMaxByte", },
699 { .offset = LAN9303_MAC_RX_PKTLEN_CNT_0, .name = "RxByteCnt", },
700 { .offset = LAN9303_MAC_RX_SYMBL_CNT_0, .name = "RxSymbolCnt", },
701 { .offset = LAN9303_MAC_RX_CTLFRM_CNT_0, .name = "RxCfs", },
702 { .offset = LAN9303_MAC_RX_OVRSZE_CNT_0, .name = "RxOverFlow", },
703 { .offset = LAN9303_MAC_TX_UNDSZE_CNT_0, .name = "TxShort", },
704 { .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", },
705 { .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", },
706 { .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", },
707 { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", },
708 { .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", },
709 { .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", },
710 { .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },
711 { .offset = LAN9303_MAC_TX_511_CNT_0, .name = "Tx512Byte", },
712 { .offset = LAN9303_MAC_TX_1023_CNT_0, .name = "Tx1024Byte", },
713 { .offset = LAN9303_MAC_TX_MAX_CNT_0, .name = "TxMaxByte", },
714 { .offset = LAN9303_MAC_TX_PKTLEN_CNT_0, .name = "TxByteCnt", },
715 { .offset = LAN9303_MAC_TX_PKTOK_CNT_0, .name = "TxOk", },
716 { .offset = LAN9303_MAC_TX_TOTALCOL_CNT_0, .name = "TxCollision", },
717 { .offset = LAN9303_MAC_TX_MULTICOL_CNT_0, .name = "TxMultiCol", },
718 { .offset = LAN9303_MAC_TX_SNGLECOL_CNT_0, .name = "TxSingleCol", },
719 { .offset = LAN9303_MAC_TX_EXCOL_CNT_0, .name = "TxExcCol", },
720 { .offset = LAN9303_MAC_TX_DEFER_CNT_0, .name = "TxDefer", },
721 { .offset = LAN9303_MAC_TX_LATECOL_0, .name = "TxLateCol", },
724 static void lan9303_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
728 for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
729 strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name,
734 static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port,
737 struct lan9303 *chip = ds->priv;
740 for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
744 ret = lan9303_read_switch_port(
745 chip, port, lan9303_mib[u].offset, ®);
748 dev_warn(chip->dev, "Reading status port %d reg %u failed\n",
749 port, lan9303_mib[u].offset);
754 static int lan9303_get_sset_count(struct dsa_switch *ds)
756 return ARRAY_SIZE(lan9303_mib);
759 static int lan9303_phy_read(struct dsa_switch *ds, int phy, int regnum)
761 struct lan9303 *chip = ds->priv;
762 int phy_base = chip->phy_addr_sel_strap;
765 return lan9303_virt_phy_reg_read(chip, regnum);
766 if (phy > phy_base + 2)
769 return chip->ops->phy_read(chip, phy, regnum);
772 static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
775 struct lan9303 *chip = ds->priv;
776 int phy_base = chip->phy_addr_sel_strap;
779 return lan9303_virt_phy_reg_write(chip, regnum, val);
780 if (phy > phy_base + 2)
783 return chip->ops->phy_write(chip, phy, regnum, val);
786 static void lan9303_adjust_link(struct dsa_switch *ds, int port,
787 struct phy_device *phydev)
789 struct lan9303 *chip = ds->priv;
792 if (!phy_is_pseudo_fixed_link(phydev))
795 ctl = lan9303_phy_read(ds, port, MII_BMCR);
797 ctl &= ~BMCR_ANENABLE;
799 if (phydev->speed == SPEED_100)
800 ctl |= BMCR_SPEED100;
801 else if (phydev->speed == SPEED_10)
802 ctl &= ~BMCR_SPEED100;
804 dev_err(ds->dev, "unsupported speed: %d\n", phydev->speed);
806 if (phydev->duplex == DUPLEX_FULL)
807 ctl |= BMCR_FULLDPLX;
809 ctl &= ~BMCR_FULLDPLX;
811 res = lan9303_phy_write(ds, port, MII_BMCR, ctl);
813 if (port == chip->phy_addr_sel_strap) {
814 /* Virtual Phy: Remove Turbo 200Mbit mode */
815 lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &ctl);
817 ctl &= ~LAN9303_VIRT_SPECIAL_TURBO;
818 res = regmap_write(chip->regmap,
819 LAN9303_VIRT_SPECIAL_CTRL, ctl);
823 static int lan9303_port_enable(struct dsa_switch *ds, int port,
824 struct phy_device *phy)
826 struct lan9303 *chip = ds->priv;
828 /* enable internal packet processing */
832 return lan9303_enable_processing_port(chip, port);
835 "Error: request to power up invalid port %d\n", port);
841 static void lan9303_port_disable(struct dsa_switch *ds, int port,
842 struct phy_device *phy)
844 struct lan9303 *chip = ds->priv;
846 /* disable internal packet processing */
850 lan9303_disable_processing_port(chip, port);
851 lan9303_phy_write(ds, chip->phy_addr_sel_strap + port,
852 MII_BMCR, BMCR_PDOWN);
856 "Error: request to power down invalid port %d\n", port);
860 static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
861 struct net_device *br)
863 struct lan9303 *chip = ds->priv;
865 dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
866 if (dsa_to_port(ds, 1)->bridge_dev == dsa_to_port(ds, 2)->bridge_dev) {
867 lan9303_bridge_ports(chip);
868 chip->is_bridged = true; /* unleash stp_state_set() */
874 static void lan9303_port_bridge_leave(struct dsa_switch *ds, int port,
875 struct net_device *br)
877 struct lan9303 *chip = ds->priv;
879 dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
880 if (chip->is_bridged) {
881 lan9303_separate_ports(chip);
882 chip->is_bridged = false;
886 static void lan9303_port_stp_state_set(struct dsa_switch *ds, int port,
889 int portmask, portstate;
890 struct lan9303 *chip = ds->priv;
892 dev_dbg(chip->dev, "%s(port %d, state %d)\n",
893 __func__, port, state);
896 case BR_STATE_DISABLED:
897 portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
899 case BR_STATE_BLOCKING:
900 case BR_STATE_LISTENING:
901 portstate = LAN9303_SWE_PORT_STATE_BLOCKING_PORT0;
903 case BR_STATE_LEARNING:
904 portstate = LAN9303_SWE_PORT_STATE_LEARNING_PORT0;
906 case BR_STATE_FORWARDING:
907 portstate = LAN9303_SWE_PORT_STATE_FORWARDING_PORT0;
910 portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
911 dev_err(chip->dev, "unknown stp state: port %d, state %d\n",
915 portmask = 0x3 << (port * 2);
916 portstate <<= (port * 2);
918 chip->swe_port_state = (chip->swe_port_state & ~portmask) | portstate;
920 if (chip->is_bridged)
921 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
922 chip->swe_port_state);
923 /* else: touching SWE_PORT_STATE would break port separation */
926 static const struct dsa_switch_ops lan9303_switch_ops = {
927 .get_tag_protocol = lan9303_get_tag_protocol,
928 .setup = lan9303_setup,
929 .get_strings = lan9303_get_strings,
930 .phy_read = lan9303_phy_read,
931 .phy_write = lan9303_phy_write,
932 .adjust_link = lan9303_adjust_link,
933 .get_ethtool_stats = lan9303_get_ethtool_stats,
934 .get_sset_count = lan9303_get_sset_count,
935 .port_enable = lan9303_port_enable,
936 .port_disable = lan9303_port_disable,
937 .port_bridge_join = lan9303_port_bridge_join,
938 .port_bridge_leave = lan9303_port_bridge_leave,
939 .port_stp_state_set = lan9303_port_stp_state_set,
942 static int lan9303_register_switch(struct lan9303 *chip)
944 chip->ds = dsa_switch_alloc(chip->dev, LAN9303_NUM_PORTS);
948 chip->ds->priv = chip;
949 chip->ds->ops = &lan9303_switch_ops;
950 chip->ds->phys_mii_mask = chip->phy_addr_sel_strap ? 0xe : 0x7;
952 return dsa_register_switch(chip->ds);
955 static void lan9303_probe_reset_gpio(struct lan9303 *chip,
956 struct device_node *np)
958 chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset",
961 if (!chip->reset_gpio) {
962 dev_dbg(chip->dev, "No reset GPIO defined\n");
966 chip->reset_duration = 200;
969 of_property_read_u32(np, "reset-duration",
970 &chip->reset_duration);
972 dev_dbg(chip->dev, "reset duration defaults to 200 ms\n");
975 /* A sane reset duration should not be longer than 1s */
976 if (chip->reset_duration > 1000)
977 chip->reset_duration = 1000;
980 int lan9303_probe(struct lan9303 *chip, struct device_node *np)
984 mutex_init(&chip->indirect_mutex);
986 lan9303_probe_reset_gpio(chip, np);
988 ret = lan9303_handle_reset(chip);
992 ret = lan9303_check_device(chip);
996 ret = lan9303_register_switch(chip);
998 dev_dbg(chip->dev, "Failed to register switch: %d\n", ret);
1004 EXPORT_SYMBOL(lan9303_probe);
1006 int lan9303_remove(struct lan9303 *chip)
1010 rc = lan9303_disable_processing(chip);
1012 dev_warn(chip->dev, "shutting down failed\n");
1014 dsa_unregister_switch(chip->ds);
1016 /* assert reset to the whole device to prevent it from doing anything */
1017 gpiod_set_value_cansleep(chip->reset_gpio, 1);
1018 gpiod_unexport(chip->reset_gpio);
1022 EXPORT_SYMBOL(lan9303_remove);
1024 MODULE_AUTHOR("Juergen Borleis <kernel@pengutronix.de>");
1025 MODULE_DESCRIPTION("Core driver for SMSC/Microchip LAN9303 three port ethernet switch");
1026 MODULE_LICENSE("GPL v2");