]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/net/dsa/lan9303-core.c
net: dsa: add dsa_to_port helper
[linux.git] / drivers / net / dsa / lan9303-core.c
1 /*
2  * Copyright (C) 2017 Pengutronix, Juergen Borleis <kernel@pengutronix.de>
3  *
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.
7  *
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.
12  *
13  */
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>
22
23 #include "lan9303.h"
24
25 #define LAN9303_NUM_PORTS 3
26
27 /* 13.2 System Control and Status Registers
28  * Multiply register number by 4 to get address offset.
29  */
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*/
63
64 /*13.4 Switch Fabric Control and Status Registers
65  * Accessed indirectly via SWITCH_CSR_CMD, SWITCH_CSR_DATA.
66  */
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
96
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
119
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))
169
170 #define LAN9303_SWITCH_PORT_REG(port, reg0) (0x400 * (port) + (reg0))
171
172 /* the built-in PHYs are of type LAN911X */
173 #define MII_LAN911X_SPECIAL_MODES 0x12
174 #define MII_LAN911X_SPECIAL_CONTROL_STATUS 0x1f
175
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) */
190 };
191
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),
203 };
204
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),
210 };
211 EXPORT_SYMBOL(lan9303_register_set);
212
213 static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
214 {
215         int ret, i;
216
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.
221          */
222         for (i = 0; i < 5; i++) {
223                 ret = regmap_read(regmap, offset, reg);
224                 if (!ret)
225                         return 0;
226                 if (ret != -EAGAIN)
227                         break;
228                 msleep(500);
229         }
230
231         return -EIO;
232 }
233
234 static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
235 {
236         int ret;
237         u32 val;
238
239         if (regnum > MII_EXPANSION)
240                 return -EINVAL;
241
242         ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val);
243         if (ret)
244                 return ret;
245
246         return val & 0xffff;
247 }
248
249 static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val)
250 {
251         if (regnum > MII_EXPANSION)
252                 return -EINVAL;
253
254         return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val);
255 }
256
257 static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip)
258 {
259         int ret, i;
260         u32 reg;
261
262         for (i = 0; i < 25; i++) {
263                 ret = lan9303_read(chip->regmap, LAN9303_PMI_ACCESS, &reg);
264                 if (ret) {
265                         dev_err(chip->dev,
266                                 "Failed to read pmi access status: %d\n", ret);
267                         return ret;
268                 }
269                 if (!(reg & LAN9303_PMI_ACCESS_MII_BUSY))
270                         return 0;
271                 msleep(1);
272         }
273
274         return -EIO;
275 }
276
277 static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum)
278 {
279         int ret;
280         u32 val;
281
282         val = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
283         val |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
284
285         mutex_lock(&chip->indirect_mutex);
286
287         ret = lan9303_indirect_phy_wait_for_completion(chip);
288         if (ret)
289                 goto on_error;
290
291         /* start the MII read cycle */
292         ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val);
293         if (ret)
294                 goto on_error;
295
296         ret = lan9303_indirect_phy_wait_for_completion(chip);
297         if (ret)
298                 goto on_error;
299
300         /* read the result of this operation */
301         ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val);
302         if (ret)
303                 goto on_error;
304
305         mutex_unlock(&chip->indirect_mutex);
306
307         return val & 0xffff;
308
309 on_error:
310         mutex_unlock(&chip->indirect_mutex);
311         return ret;
312 }
313
314 static int lan9303_indirect_phy_write(struct lan9303 *chip, int addr,
315                                       int regnum, u16 val)
316 {
317         int ret;
318         u32 reg;
319
320         reg = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
321         reg |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
322         reg |= LAN9303_PMI_ACCESS_MII_WRITE;
323
324         mutex_lock(&chip->indirect_mutex);
325
326         ret = lan9303_indirect_phy_wait_for_completion(chip);
327         if (ret)
328                 goto on_error;
329
330         /* write the data first... */
331         ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val);
332         if (ret)
333                 goto on_error;
334
335         /* ...then start the MII write cycle */
336         ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg);
337
338 on_error:
339         mutex_unlock(&chip->indirect_mutex);
340         return ret;
341 }
342
343 const struct lan9303_phy_ops lan9303_indirect_phy_ops = {
344         .phy_read = lan9303_indirect_phy_read,
345         .phy_write = lan9303_indirect_phy_write,
346 };
347 EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops);
348
349 static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
350 {
351         int ret, i;
352         u32 reg;
353
354         for (i = 0; i < 25; i++) {
355                 ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_CMD, &reg);
356                 if (ret) {
357                         dev_err(chip->dev,
358                                 "Failed to read csr command status: %d\n", ret);
359                         return ret;
360                 }
361                 if (!(reg & LAN9303_SWITCH_CSR_CMD_BUSY))
362                         return 0;
363                 msleep(1);
364         }
365
366         return -EIO;
367 }
368
369 static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
370 {
371         u32 reg;
372         int ret;
373
374         reg = regnum;
375         reg |= LAN9303_SWITCH_CSR_CMD_LANES;
376         reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
377
378         mutex_lock(&chip->indirect_mutex);
379
380         ret = lan9303_switch_wait_for_completion(chip);
381         if (ret)
382                 goto on_error;
383
384         ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
385         if (ret) {
386                 dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret);
387                 goto on_error;
388         }
389
390         /* trigger write */
391         ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
392         if (ret)
393                 dev_err(chip->dev, "Failed to write csr command reg: %d\n",
394                         ret);
395
396 on_error:
397         mutex_unlock(&chip->indirect_mutex);
398         return ret;
399 }
400
401 static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)
402 {
403         u32 reg;
404         int ret;
405
406         reg = regnum;
407         reg |= LAN9303_SWITCH_CSR_CMD_LANES;
408         reg |= LAN9303_SWITCH_CSR_CMD_RW;
409         reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
410
411         mutex_lock(&chip->indirect_mutex);
412
413         ret = lan9303_switch_wait_for_completion(chip);
414         if (ret)
415                 goto on_error;
416
417         /* trigger read */
418         ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
419         if (ret) {
420                 dev_err(chip->dev, "Failed to write csr command reg: %d\n",
421                         ret);
422                 goto on_error;
423         }
424
425         ret = lan9303_switch_wait_for_completion(chip);
426         if (ret)
427                 goto on_error;
428
429         ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
430         if (ret)
431                 dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret);
432 on_error:
433         mutex_unlock(&chip->indirect_mutex);
434         return ret;
435 }
436
437 static int lan9303_write_switch_port(struct lan9303 *chip, int port,
438                                      u16 regnum, u32 val)
439 {
440         return lan9303_write_switch_reg(
441                 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
442 }
443
444 static int lan9303_read_switch_port(struct lan9303 *chip, int port,
445                                     u16 regnum, u32 *val)
446 {
447         return lan9303_read_switch_reg(
448                 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val);
449 }
450
451 static int lan9303_detect_phy_setup(struct lan9303 *chip)
452 {
453         int reg;
454
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.
463          */
464         reg = chip->ops->phy_read(chip, 3, MII_LAN911X_SPECIAL_MODES);
465         if (reg < 0) {
466                 dev_err(chip->dev, "Failed to detect phy config: %d\n", reg);
467                 return reg;
468         }
469
470         if ((reg != 0) && (reg != 0xffff))
471                 chip->phy_addr_sel_strap = 1;
472         else
473                 chip->phy_addr_sel_strap = 0;
474
475         dev_dbg(chip->dev, "Phy setup '%s' detected\n",
476                 chip->phy_addr_sel_strap ? "1-2-3" : "0-1-2");
477
478         return 0;
479 }
480
481 static int lan9303_disable_processing_port(struct lan9303 *chip,
482                                            unsigned int port)
483 {
484         int ret;
485
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);
489         if (ret)
490                 return ret;
491
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);
496 }
497
498 static int lan9303_enable_processing_port(struct lan9303 *chip,
499                                           unsigned int port)
500 {
501         int ret;
502
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);
507         if (ret)
508                 return ret;
509
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);
515 }
516
517 /* forward special tagged packets from port 0 to port 1 *or* port 2 */
518 static int lan9303_setup_tagging(struct lan9303 *chip)
519 {
520         int ret;
521         u32 val;
522         /* enable defining the destination port via special VLAN tagging
523          * for port 0
524          */
525         ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE,
526                                        LAN9303_SWE_INGRESS_PORT_TYPE_VLAN);
527         if (ret)
528                 return ret;
529
530         /* tag incoming packets at port 1 and 2 on their way to port 0 to be
531          * able to discover their source port
532          */
533         val = LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0;
534         return lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE, val);
535 }
536
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
541  */
542 static int lan9303_separate_ports(struct lan9303 *chip)
543 {
544         int ret;
545
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);
552         if (ret)
553                 return ret;
554
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);
560 }
561
562 static void lan9303_bridge_ports(struct lan9303 *chip)
563 {
564         /* ports bridged: remove mirroring */
565         lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
566                                  LAN9303_SWE_PORT_MIRROR_DISABLED);
567
568         lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
569                                  chip->swe_port_state);
570 }
571
572 static int lan9303_handle_reset(struct lan9303 *chip)
573 {
574         if (!chip->reset_gpio)
575                 return 0;
576
577         if (chip->reset_duration != 0)
578                 msleep(chip->reset_duration);
579
580         /* release (deassert) reset and activate the device */
581         gpiod_set_value_cansleep(chip->reset_gpio, 0);
582
583         return 0;
584 }
585
586 /* stop processing packets for all ports */
587 static int lan9303_disable_processing(struct lan9303 *chip)
588 {
589         int p;
590
591         for (p = 0; p < LAN9303_NUM_PORTS; p++) {
592                 int ret = lan9303_disable_processing_port(chip, p);
593
594                 if (ret)
595                         return ret;
596         }
597
598         return 0;
599 }
600
601 static int lan9303_check_device(struct lan9303 *chip)
602 {
603         int ret;
604         u32 reg;
605
606         ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, &reg);
607         if (ret) {
608                 dev_err(chip->dev, "failed to read chip revision register: %d\n",
609                         ret);
610                 if (!chip->reset_gpio) {
611                         dev_dbg(chip->dev,
612                                 "hint: maybe failed due to missing reset GPIO\n");
613                 }
614                 return ret;
615         }
616
617         if ((reg >> 16) != LAN9303_CHIP_ID) {
618                 dev_err(chip->dev, "expecting LAN9303 chip, but found: %X\n",
619                         reg >> 16);
620                 return ret;
621         }
622
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.
629          */
630         ret = lan9303_disable_processing(chip);
631         if (ret)
632                 dev_warn(chip->dev, "failed to disable switching %d\n", ret);
633
634         dev_info(chip->dev, "Found LAN9303 rev. %u\n", reg & 0xffff);
635
636         ret = lan9303_detect_phy_setup(chip);
637         if (ret) {
638                 dev_err(chip->dev,
639                         "failed to discover phy bootstrap setup: %d\n", ret);
640                 return ret;
641         }
642
643         return 0;
644 }
645
646 /* ---------------------------- DSA -----------------------------------*/
647
648 static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds)
649 {
650         return DSA_TAG_PROTO_LAN9303;
651 }
652
653 static int lan9303_setup(struct dsa_switch *ds)
654 {
655         struct lan9303 *chip = ds->priv;
656         int ret;
657
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");
661                 return -EINVAL;
662         }
663
664         ret = lan9303_setup_tagging(chip);
665         if (ret)
666                 dev_err(chip->dev, "failed to setup port tagging %d\n", ret);
667
668         ret = lan9303_separate_ports(chip);
669         if (ret)
670                 dev_err(chip->dev, "failed to separate ports %d\n", ret);
671
672         ret = lan9303_enable_processing_port(chip, 0);
673         if (ret)
674                 dev_err(chip->dev, "failed to re-enable switching %d\n", ret);
675
676         return 0;
677 }
678
679 struct lan9303_mib_desc {
680         unsigned int offset; /* offset of first MAC */
681         const char *name;
682 };
683
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", },
722 };
723
724 static void lan9303_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
725 {
726         unsigned int u;
727
728         for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
729                 strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name,
730                         ETH_GSTRING_LEN);
731         }
732 }
733
734 static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port,
735                                       uint64_t *data)
736 {
737         struct lan9303 *chip = ds->priv;
738         unsigned int u;
739
740         for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
741                 u32 reg;
742                 int ret;
743
744                 ret = lan9303_read_switch_port(
745                         chip, port, lan9303_mib[u].offset, &reg);
746
747                 if (ret)
748                         dev_warn(chip->dev, "Reading status port %d reg %u failed\n",
749                                  port, lan9303_mib[u].offset);
750                 data[u] = reg;
751         }
752 }
753
754 static int lan9303_get_sset_count(struct dsa_switch *ds)
755 {
756         return ARRAY_SIZE(lan9303_mib);
757 }
758
759 static int lan9303_phy_read(struct dsa_switch *ds, int phy, int regnum)
760 {
761         struct lan9303 *chip = ds->priv;
762         int phy_base = chip->phy_addr_sel_strap;
763
764         if (phy == phy_base)
765                 return lan9303_virt_phy_reg_read(chip, regnum);
766         if (phy > phy_base + 2)
767                 return -ENODEV;
768
769         return chip->ops->phy_read(chip, phy, regnum);
770 }
771
772 static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
773                              u16 val)
774 {
775         struct lan9303 *chip = ds->priv;
776         int phy_base = chip->phy_addr_sel_strap;
777
778         if (phy == phy_base)
779                 return lan9303_virt_phy_reg_write(chip, regnum, val);
780         if (phy > phy_base + 2)
781                 return -ENODEV;
782
783         return chip->ops->phy_write(chip, phy, regnum, val);
784 }
785
786 static void lan9303_adjust_link(struct dsa_switch *ds, int port,
787                                 struct phy_device *phydev)
788 {
789         struct lan9303 *chip = ds->priv;
790         int ctl, res;
791
792         if (!phy_is_pseudo_fixed_link(phydev))
793                 return;
794
795         ctl = lan9303_phy_read(ds, port, MII_BMCR);
796
797         ctl &= ~BMCR_ANENABLE;
798
799         if (phydev->speed == SPEED_100)
800                 ctl |= BMCR_SPEED100;
801         else if (phydev->speed == SPEED_10)
802                 ctl &= ~BMCR_SPEED100;
803         else
804                 dev_err(ds->dev, "unsupported speed: %d\n", phydev->speed);
805
806         if (phydev->duplex == DUPLEX_FULL)
807                 ctl |= BMCR_FULLDPLX;
808         else
809                 ctl &= ~BMCR_FULLDPLX;
810
811         res =  lan9303_phy_write(ds, port, MII_BMCR, ctl);
812
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);
816
817                 ctl &= ~LAN9303_VIRT_SPECIAL_TURBO;
818                 res =  regmap_write(chip->regmap,
819                                     LAN9303_VIRT_SPECIAL_CTRL, ctl);
820         }
821 }
822
823 static int lan9303_port_enable(struct dsa_switch *ds, int port,
824                                struct phy_device *phy)
825 {
826         struct lan9303 *chip = ds->priv;
827
828         /* enable internal packet processing */
829         switch (port) {
830         case 1:
831         case 2:
832                 return lan9303_enable_processing_port(chip, port);
833         default:
834                 dev_dbg(chip->dev,
835                         "Error: request to power up invalid port %d\n", port);
836         }
837
838         return -ENODEV;
839 }
840
841 static void lan9303_port_disable(struct dsa_switch *ds, int port,
842                                  struct phy_device *phy)
843 {
844         struct lan9303 *chip = ds->priv;
845
846         /* disable internal packet processing */
847         switch (port) {
848         case 1:
849         case 2:
850                 lan9303_disable_processing_port(chip, port);
851                 lan9303_phy_write(ds, chip->phy_addr_sel_strap + port,
852                                   MII_BMCR, BMCR_PDOWN);
853                 break;
854         default:
855                 dev_dbg(chip->dev,
856                         "Error: request to power down invalid port %d\n", port);
857         }
858 }
859
860 static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
861                                     struct net_device *br)
862 {
863         struct lan9303 *chip = ds->priv;
864
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() */
869         }
870
871         return 0;
872 }
873
874 static void lan9303_port_bridge_leave(struct dsa_switch *ds, int port,
875                                       struct net_device *br)
876 {
877         struct lan9303 *chip = ds->priv;
878
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;
883         }
884 }
885
886 static void lan9303_port_stp_state_set(struct dsa_switch *ds, int port,
887                                        u8 state)
888 {
889         int portmask, portstate;
890         struct lan9303 *chip = ds->priv;
891
892         dev_dbg(chip->dev, "%s(port %d, state %d)\n",
893                 __func__, port, state);
894
895         switch (state) {
896         case BR_STATE_DISABLED:
897                 portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
898                 break;
899         case BR_STATE_BLOCKING:
900         case BR_STATE_LISTENING:
901                 portstate = LAN9303_SWE_PORT_STATE_BLOCKING_PORT0;
902                 break;
903         case BR_STATE_LEARNING:
904                 portstate = LAN9303_SWE_PORT_STATE_LEARNING_PORT0;
905                 break;
906         case BR_STATE_FORWARDING:
907                 portstate = LAN9303_SWE_PORT_STATE_FORWARDING_PORT0;
908                 break;
909         default:
910                 portstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;
911                 dev_err(chip->dev, "unknown stp state: port %d, state %d\n",
912                         port, state);
913         }
914
915         portmask = 0x3 << (port * 2);
916         portstate <<= (port * 2);
917
918         chip->swe_port_state = (chip->swe_port_state & ~portmask) | portstate;
919
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 */
924 }
925
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,
940 };
941
942 static int lan9303_register_switch(struct lan9303 *chip)
943 {
944         chip->ds = dsa_switch_alloc(chip->dev, LAN9303_NUM_PORTS);
945         if (!chip->ds)
946                 return -ENOMEM;
947
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;
951
952         return dsa_register_switch(chip->ds);
953 }
954
955 static void lan9303_probe_reset_gpio(struct lan9303 *chip,
956                                      struct device_node *np)
957 {
958         chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset",
959                                                    GPIOD_OUT_LOW);
960
961         if (!chip->reset_gpio) {
962                 dev_dbg(chip->dev, "No reset GPIO defined\n");
963                 return;
964         }
965
966         chip->reset_duration = 200;
967
968         if (np) {
969                 of_property_read_u32(np, "reset-duration",
970                                      &chip->reset_duration);
971         } else {
972                 dev_dbg(chip->dev, "reset duration defaults to 200 ms\n");
973         }
974
975         /* A sane reset duration should not be longer than 1s */
976         if (chip->reset_duration > 1000)
977                 chip->reset_duration = 1000;
978 }
979
980 int lan9303_probe(struct lan9303 *chip, struct device_node *np)
981 {
982         int ret;
983
984         mutex_init(&chip->indirect_mutex);
985
986         lan9303_probe_reset_gpio(chip, np);
987
988         ret = lan9303_handle_reset(chip);
989         if (ret)
990                 return ret;
991
992         ret = lan9303_check_device(chip);
993         if (ret)
994                 return ret;
995
996         ret = lan9303_register_switch(chip);
997         if (ret) {
998                 dev_dbg(chip->dev, "Failed to register switch: %d\n", ret);
999                 return ret;
1000         }
1001
1002         return 0;
1003 }
1004 EXPORT_SYMBOL(lan9303_probe);
1005
1006 int lan9303_remove(struct lan9303 *chip)
1007 {
1008         int rc;
1009
1010         rc = lan9303_disable_processing(chip);
1011         if (rc != 0)
1012                 dev_warn(chip->dev, "shutting down failed\n");
1013
1014         dsa_unregister_switch(chip->ds);
1015
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);
1019
1020         return 0;
1021 }
1022 EXPORT_SYMBOL(lan9303_remove);
1023
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");