]> Git Repo - linux.git/blob - drivers/net/dsa/microchip/ksz_common.h
Merge tag 'cxl-for-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
[linux.git] / drivers / net / dsa / microchip / ksz_common.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Microchip switch driver common header
3  *
4  * Copyright (C) 2017-2019 Microchip Technology Inc.
5  */
6
7 #ifndef __KSZ_COMMON_H
8 #define __KSZ_COMMON_H
9
10 #include <linux/etherdevice.h>
11 #include <linux/kernel.h>
12 #include <linux/mutex.h>
13 #include <linux/phy.h>
14 #include <linux/regmap.h>
15 #include <net/dsa.h>
16
17 #define KSZ_MAX_NUM_PORTS 8
18
19 struct vlan_table {
20         u32 table[3];
21 };
22
23 struct ksz_port_mib {
24         struct mutex cnt_mutex;         /* structure access */
25         u8 cnt_ptr;
26         u64 *counters;
27         struct rtnl_link_stats64 stats64;
28         struct ethtool_pause_stats pause_stats;
29         struct spinlock stats64_lock;
30 };
31
32 struct ksz_mib_names {
33         int index;
34         char string[ETH_GSTRING_LEN];
35 };
36
37 struct ksz_chip_data {
38         u32 chip_id;
39         const char *dev_name;
40         int num_vlans;
41         int num_alus;
42         int num_statics;
43         int cpu_ports;
44         int port_cnt;
45         const struct ksz_dev_ops *ops;
46         bool phy_errata_9477;
47         bool ksz87xx_eee_link_erratum;
48         const struct ksz_mib_names *mib_names;
49         int mib_cnt;
50         u8 reg_mib_cnt;
51         const u16 *regs;
52         const u32 *masks;
53         const u8 *shifts;
54         const u8 *xmii_ctrl0;
55         const u8 *xmii_ctrl1;
56         int stp_ctrl_reg;
57         int broadcast_ctrl_reg;
58         int multicast_ctrl_reg;
59         int start_ctrl_reg;
60         bool supports_mii[KSZ_MAX_NUM_PORTS];
61         bool supports_rmii[KSZ_MAX_NUM_PORTS];
62         bool supports_rgmii[KSZ_MAX_NUM_PORTS];
63         bool internal_phy[KSZ_MAX_NUM_PORTS];
64 };
65
66 struct ksz_port {
67         bool remove_tag;                /* Remove Tag flag set, for ksz8795 only */
68         int stp_state;
69         struct phy_device phydev;
70
71         u32 on:1;                       /* port is not disabled by hardware */
72         u32 phy:1;                      /* port has a PHY */
73         u32 fiber:1;                    /* port is fiber */
74         u32 sgmii:1;                    /* port is SGMII */
75         u32 force:1;
76         u32 read:1;                     /* read MIB counters in background */
77         u32 freeze:1;                   /* MIB counter freeze is enabled */
78
79         struct ksz_port_mib mib;
80         phy_interface_t interface;
81         u16 max_frame;
82         u32 rgmii_tx_val;
83         u32 rgmii_rx_val;
84 };
85
86 struct ksz_device {
87         struct dsa_switch *ds;
88         struct ksz_platform_data *pdata;
89         const struct ksz_chip_data *info;
90
91         struct mutex dev_mutex;         /* device access */
92         struct mutex regmap_mutex;      /* regmap access */
93         struct mutex alu_mutex;         /* ALU access */
94         struct mutex vlan_mutex;        /* vlan access */
95         const struct ksz_dev_ops *dev_ops;
96
97         struct device *dev;
98         struct regmap *regmap[3];
99
100         void *priv;
101
102         struct gpio_desc *reset_gpio;   /* Optional reset GPIO */
103
104         /* chip specific data */
105         u32 chip_id;
106         u8 chip_rev;
107         int cpu_port;                   /* port connected to CPU */
108         int phy_port_cnt;
109         phy_interface_t compat_interface;
110         bool synclko_125;
111         bool synclko_disable;
112
113         struct vlan_table *vlan_cache;
114
115         struct ksz_port *ports;
116         struct delayed_work mib_read;
117         unsigned long mib_read_interval;
118         u16 mirror_rx;
119         u16 mirror_tx;
120         u32 features;                   /* chip specific features */
121         u16 port_mask;
122 };
123
124 /* List of supported models */
125 enum ksz_model {
126         KSZ8795,
127         KSZ8794,
128         KSZ8765,
129         KSZ8830,
130         KSZ9477,
131         KSZ9897,
132         KSZ9893,
133         KSZ9567,
134         LAN9370,
135         LAN9371,
136         LAN9372,
137         LAN9373,
138         LAN9374,
139 };
140
141 enum ksz_chip_id {
142         KSZ8795_CHIP_ID = 0x8795,
143         KSZ8794_CHIP_ID = 0x8794,
144         KSZ8765_CHIP_ID = 0x8765,
145         KSZ8830_CHIP_ID = 0x8830,
146         KSZ9477_CHIP_ID = 0x00947700,
147         KSZ9897_CHIP_ID = 0x00989700,
148         KSZ9893_CHIP_ID = 0x00989300,
149         KSZ9567_CHIP_ID = 0x00956700,
150         LAN9370_CHIP_ID = 0x00937000,
151         LAN9371_CHIP_ID = 0x00937100,
152         LAN9372_CHIP_ID = 0x00937200,
153         LAN9373_CHIP_ID = 0x00937300,
154         LAN9374_CHIP_ID = 0x00937400,
155 };
156
157 enum ksz_regs {
158         REG_IND_CTRL_0,
159         REG_IND_DATA_8,
160         REG_IND_DATA_CHECK,
161         REG_IND_DATA_HI,
162         REG_IND_DATA_LO,
163         REG_IND_MIB_CHECK,
164         REG_IND_BYTE,
165         P_FORCE_CTRL,
166         P_LINK_STATUS,
167         P_LOCAL_CTRL,
168         P_NEG_RESTART_CTRL,
169         P_REMOTE_STATUS,
170         P_SPEED_STATUS,
171         S_TAIL_TAG_CTRL,
172         P_STP_CTRL,
173         S_START_CTRL,
174         S_BROADCAST_CTRL,
175         S_MULTICAST_CTRL,
176         P_XMII_CTRL_0,
177         P_XMII_CTRL_1,
178 };
179
180 enum ksz_masks {
181         PORT_802_1P_REMAPPING,
182         SW_TAIL_TAG_ENABLE,
183         MIB_COUNTER_OVERFLOW,
184         MIB_COUNTER_VALID,
185         VLAN_TABLE_FID,
186         VLAN_TABLE_MEMBERSHIP,
187         VLAN_TABLE_VALID,
188         STATIC_MAC_TABLE_VALID,
189         STATIC_MAC_TABLE_USE_FID,
190         STATIC_MAC_TABLE_FID,
191         STATIC_MAC_TABLE_OVERRIDE,
192         STATIC_MAC_TABLE_FWD_PORTS,
193         DYNAMIC_MAC_TABLE_ENTRIES_H,
194         DYNAMIC_MAC_TABLE_MAC_EMPTY,
195         DYNAMIC_MAC_TABLE_NOT_READY,
196         DYNAMIC_MAC_TABLE_ENTRIES,
197         DYNAMIC_MAC_TABLE_FID,
198         DYNAMIC_MAC_TABLE_SRC_PORT,
199         DYNAMIC_MAC_TABLE_TIMESTAMP,
200         ALU_STAT_WRITE,
201         ALU_STAT_READ,
202         P_MII_TX_FLOW_CTRL,
203         P_MII_RX_FLOW_CTRL,
204 };
205
206 enum ksz_shifts {
207         VLAN_TABLE_MEMBERSHIP_S,
208         VLAN_TABLE,
209         STATIC_MAC_FWD_PORTS,
210         STATIC_MAC_FID,
211         DYNAMIC_MAC_ENTRIES_H,
212         DYNAMIC_MAC_ENTRIES,
213         DYNAMIC_MAC_FID,
214         DYNAMIC_MAC_TIMESTAMP,
215         DYNAMIC_MAC_SRC_PORT,
216         ALU_STAT_INDEX,
217 };
218
219 enum ksz_xmii_ctrl0 {
220         P_MII_100MBIT,
221         P_MII_10MBIT,
222         P_MII_FULL_DUPLEX,
223         P_MII_HALF_DUPLEX,
224 };
225
226 enum ksz_xmii_ctrl1 {
227         P_RGMII_SEL,
228         P_RMII_SEL,
229         P_GMII_SEL,
230         P_MII_SEL,
231         P_GMII_1GBIT,
232         P_GMII_NOT_1GBIT,
233 };
234
235 struct alu_struct {
236         /* entry 1 */
237         u8      is_static:1;
238         u8      is_src_filter:1;
239         u8      is_dst_filter:1;
240         u8      prio_age:3;
241         u32     _reserv_0_1:23;
242         u8      mstp:3;
243         /* entry 2 */
244         u8      is_override:1;
245         u8      is_use_fid:1;
246         u32     _reserv_1_1:23;
247         u8      port_forward:7;
248         /* entry 3 & 4*/
249         u32     _reserv_2_1:9;
250         u8      fid:7;
251         u8      mac[ETH_ALEN];
252 };
253
254 struct ksz_dev_ops {
255         int (*setup)(struct dsa_switch *ds);
256         u32 (*get_port_addr)(int port, int offset);
257         void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member);
258         void (*flush_dyn_mac_table)(struct ksz_device *dev, int port);
259         void (*port_cleanup)(struct ksz_device *dev, int port);
260         void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
261         void (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
262         void (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val);
263         void (*r_mib_cnt)(struct ksz_device *dev, int port, u16 addr,
264                           u64 *cnt);
265         void (*r_mib_pkt)(struct ksz_device *dev, int port, u16 addr,
266                           u64 *dropped, u64 *cnt);
267         void (*r_mib_stat64)(struct ksz_device *dev, int port);
268         int  (*vlan_filtering)(struct ksz_device *dev, int port,
269                                bool flag, struct netlink_ext_ack *extack);
270         int  (*vlan_add)(struct ksz_device *dev, int port,
271                          const struct switchdev_obj_port_vlan *vlan,
272                          struct netlink_ext_ack *extack);
273         int  (*vlan_del)(struct ksz_device *dev, int port,
274                          const struct switchdev_obj_port_vlan *vlan);
275         int (*mirror_add)(struct ksz_device *dev, int port,
276                           struct dsa_mall_mirror_tc_entry *mirror,
277                           bool ingress, struct netlink_ext_ack *extack);
278         void (*mirror_del)(struct ksz_device *dev, int port,
279                            struct dsa_mall_mirror_tc_entry *mirror);
280         int (*fdb_add)(struct ksz_device *dev, int port,
281                        const unsigned char *addr, u16 vid, struct dsa_db db);
282         int (*fdb_del)(struct ksz_device *dev, int port,
283                        const unsigned char *addr, u16 vid, struct dsa_db db);
284         int (*fdb_dump)(struct ksz_device *dev, int port,
285                         dsa_fdb_dump_cb_t *cb, void *data);
286         int (*mdb_add)(struct ksz_device *dev, int port,
287                        const struct switchdev_obj_port_mdb *mdb,
288                        struct dsa_db db);
289         int (*mdb_del)(struct ksz_device *dev, int port,
290                        const struct switchdev_obj_port_mdb *mdb,
291                        struct dsa_db db);
292         void (*get_caps)(struct ksz_device *dev, int port,
293                          struct phylink_config *config);
294         int (*change_mtu)(struct ksz_device *dev, int port, int mtu);
295         int (*max_mtu)(struct ksz_device *dev, int port);
296         void (*freeze_mib)(struct ksz_device *dev, int port, bool freeze);
297         void (*port_init_cnt)(struct ksz_device *dev, int port);
298         void (*phylink_mac_config)(struct ksz_device *dev, int port,
299                                    unsigned int mode,
300                                    const struct phylink_link_state *state);
301         void (*phylink_mac_link_up)(struct ksz_device *dev, int port,
302                                     unsigned int mode,
303                                     phy_interface_t interface,
304                                     struct phy_device *phydev, int speed,
305                                     int duplex, bool tx_pause, bool rx_pause);
306         void (*setup_rgmii_delay)(struct ksz_device *dev, int port);
307         void (*config_cpu_port)(struct dsa_switch *ds);
308         int (*enable_stp_addr)(struct ksz_device *dev);
309         int (*reset)(struct ksz_device *dev);
310         int (*init)(struct ksz_device *dev);
311         void (*exit)(struct ksz_device *dev);
312 };
313
314 struct ksz_device *ksz_switch_alloc(struct device *base, void *priv);
315 int ksz_switch_register(struct ksz_device *dev);
316 void ksz_switch_remove(struct ksz_device *dev);
317
318 void ksz_init_mib_timer(struct ksz_device *dev);
319 void ksz_r_mib_stats64(struct ksz_device *dev, int port);
320 void ksz_port_stp_state_set(struct dsa_switch *ds, int port, u8 state);
321 bool ksz_get_gbit(struct ksz_device *dev, int port);
322 phy_interface_t ksz_get_xmii(struct ksz_device *dev, int port, bool gbit);
323 extern const struct ksz_chip_data ksz_switch_chips[];
324
325 /* Common register access functions */
326
327 static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
328 {
329         unsigned int value;
330         int ret = regmap_read(dev->regmap[0], reg, &value);
331
332         *val = value;
333         return ret;
334 }
335
336 static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
337 {
338         unsigned int value;
339         int ret = regmap_read(dev->regmap[1], reg, &value);
340
341         *val = value;
342         return ret;
343 }
344
345 static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
346 {
347         unsigned int value;
348         int ret = regmap_read(dev->regmap[2], reg, &value);
349
350         *val = value;
351         return ret;
352 }
353
354 static inline int ksz_read64(struct ksz_device *dev, u32 reg, u64 *val)
355 {
356         u32 value[2];
357         int ret;
358
359         ret = regmap_bulk_read(dev->regmap[2], reg, value, 2);
360         if (!ret)
361                 *val = (u64)value[0] << 32 | value[1];
362
363         return ret;
364 }
365
366 static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
367 {
368         return regmap_write(dev->regmap[0], reg, value);
369 }
370
371 static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
372 {
373         return regmap_write(dev->regmap[1], reg, value);
374 }
375
376 static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
377 {
378         return regmap_write(dev->regmap[2], reg, value);
379 }
380
381 static inline int ksz_write64(struct ksz_device *dev, u32 reg, u64 value)
382 {
383         u32 val[2];
384
385         /* Ick! ToDo: Add 64bit R/W to regmap on 32bit systems */
386         value = swab64(value);
387         val[0] = swab32(value & 0xffffffffULL);
388         val[1] = swab32(value >> 32ULL);
389
390         return regmap_bulk_write(dev->regmap[2], reg, val, 2);
391 }
392
393 static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
394                               u8 *data)
395 {
396         ksz_read8(dev, dev->dev_ops->get_port_addr(port, offset), data);
397 }
398
399 static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
400                                u16 *data)
401 {
402         ksz_read16(dev, dev->dev_ops->get_port_addr(port, offset), data);
403 }
404
405 static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
406                                u32 *data)
407 {
408         ksz_read32(dev, dev->dev_ops->get_port_addr(port, offset), data);
409 }
410
411 static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
412                                u8 data)
413 {
414         ksz_write8(dev, dev->dev_ops->get_port_addr(port, offset), data);
415 }
416
417 static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
418                                 u16 data)
419 {
420         ksz_write16(dev, dev->dev_ops->get_port_addr(port, offset), data);
421 }
422
423 static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
424                                 u32 data)
425 {
426         ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
427 }
428
429 static inline void ksz_prmw8(struct ksz_device *dev, int port, int offset,
430                              u8 mask, u8 val)
431 {
432         regmap_update_bits(dev->regmap[0],
433                            dev->dev_ops->get_port_addr(port, offset),
434                            mask, val);
435 }
436
437 static inline void ksz_regmap_lock(void *__mtx)
438 {
439         struct mutex *mtx = __mtx;
440         mutex_lock(mtx);
441 }
442
443 static inline void ksz_regmap_unlock(void *__mtx)
444 {
445         struct mutex *mtx = __mtx;
446         mutex_unlock(mtx);
447 }
448
449 static inline bool ksz_is_ksz88x3(struct ksz_device *dev)
450 {
451         return dev->chip_id == KSZ8830_CHIP_ID;
452 }
453
454 static inline int is_lan937x(struct ksz_device *dev)
455 {
456         return dev->chip_id == LAN9370_CHIP_ID ||
457                 dev->chip_id == LAN9371_CHIP_ID ||
458                 dev->chip_id == LAN9372_CHIP_ID ||
459                 dev->chip_id == LAN9373_CHIP_ID ||
460                 dev->chip_id == LAN9374_CHIP_ID;
461 }
462
463 /* STP State Defines */
464 #define PORT_TX_ENABLE                  BIT(2)
465 #define PORT_RX_ENABLE                  BIT(1)
466 #define PORT_LEARN_DISABLE              BIT(0)
467
468 /* Switch ID Defines */
469 #define REG_CHIP_ID0                    0x00
470
471 #define SW_FAMILY_ID_M                  GENMASK(15, 8)
472 #define KSZ87_FAMILY_ID                 0x87
473 #define KSZ88_FAMILY_ID                 0x88
474
475 #define KSZ8_PORT_STATUS_0              0x08
476 #define KSZ8_PORT_FIBER_MODE            BIT(7)
477
478 #define SW_CHIP_ID_M                    GENMASK(7, 4)
479 #define KSZ87_CHIP_ID_94                0x6
480 #define KSZ87_CHIP_ID_95                0x9
481 #define KSZ88_CHIP_ID_63                0x3
482
483 #define SW_REV_ID_M                     GENMASK(7, 4)
484
485 /* Driver set switch broadcast storm protection at 10% rate. */
486 #define BROADCAST_STORM_PROT_RATE       10
487
488 /* 148,800 frames * 67 ms / 100 */
489 #define BROADCAST_STORM_VALUE           9969
490
491 #define BROADCAST_STORM_RATE_HI         0x07
492 #define BROADCAST_STORM_RATE_LO         0xFF
493 #define BROADCAST_STORM_RATE            0x07FF
494
495 #define MULTICAST_STORM_DISABLE         BIT(6)
496
497 #define SW_START                        0x01
498
499 /* Used with variable features to indicate capabilities. */
500 #define GBIT_SUPPORT                    BIT(0)
501 #define IS_9893                         BIT(2)
502
503 /* xMII configuration */
504 #define P_MII_DUPLEX_M                  BIT(6)
505 #define P_MII_100MBIT_M                 BIT(4)
506
507 #define P_GMII_1GBIT_M                  BIT(6)
508 #define P_RGMII_ID_IG_ENABLE            BIT(4)
509 #define P_RGMII_ID_EG_ENABLE            BIT(3)
510 #define P_MII_MAC_MODE                  BIT(2)
511 #define P_MII_SEL_M                     0x3
512
513 /* Regmap tables generation */
514 #define KSZ_SPI_OP_RD           3
515 #define KSZ_SPI_OP_WR           2
516
517 #define swabnot_used(x)         0
518
519 #define KSZ_SPI_OP_FLAG_MASK(opcode, swp, regbits, regpad)              \
520         swab##swp((opcode) << ((regbits) + (regpad)))
521
522 #define KSZ_REGMAP_ENTRY(width, swp, regbits, regpad, regalign)         \
523         {                                                               \
524                 .name = #width,                                         \
525                 .val_bits = (width),                                    \
526                 .reg_stride = 1,                                        \
527                 .reg_bits = (regbits) + (regalign),                     \
528                 .pad_bits = (regpad),                                   \
529                 .max_register = BIT(regbits) - 1,                       \
530                 .cache_type = REGCACHE_NONE,                            \
531                 .read_flag_mask =                                       \
532                         KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, swp,        \
533                                              regbits, regpad),          \
534                 .write_flag_mask =                                      \
535                         KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, swp,        \
536                                              regbits, regpad),          \
537                 .lock = ksz_regmap_lock,                                \
538                 .unlock = ksz_regmap_unlock,                            \
539                 .reg_format_endian = REGMAP_ENDIAN_BIG,                 \
540                 .val_format_endian = REGMAP_ENDIAN_BIG                  \
541         }
542
543 #define KSZ_REGMAP_TABLE(ksz, swp, regbits, regpad, regalign)           \
544         static const struct regmap_config ksz##_regmap_config[] = {     \
545                 KSZ_REGMAP_ENTRY(8, swp, (regbits), (regpad), (regalign)), \
546                 KSZ_REGMAP_ENTRY(16, swp, (regbits), (regpad), (regalign)), \
547                 KSZ_REGMAP_ENTRY(32, swp, (regbits), (regpad), (regalign)), \
548         }
549
550 #endif
This page took 0.065455 seconds and 4 git commands to generate.