394362e23c47f12dbe146f2c3079b670dc42a93c
[linux-2.6-microblaze.git] / drivers / net / ethernet / mscc / ocelot.h
1 /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
2 /*
3  * Microsemi Ocelot Switch driver
4  *
5  * Copyright (c) 2017 Microsemi Corporation
6  */
7
8 #ifndef _MSCC_OCELOT_H_
9 #define _MSCC_OCELOT_H_
10
11 #include <linux/bitops.h>
12 #include <linux/etherdevice.h>
13 #include <linux/if_vlan.h>
14 #include <linux/net_tstamp.h>
15 #include <linux/phy.h>
16 #include <linux/phy/phy.h>
17 #include <linux/platform_device.h>
18 #include <linux/regmap.h>
19
20 #include <soc/mscc/ocelot_qsys.h>
21 #include <soc/mscc/ocelot_sys.h>
22 #include <soc/mscc/ocelot_dev.h>
23 #include <soc/mscc/ocelot_ana.h>
24 #include <soc/mscc/ocelot_ptp.h>
25 #include <soc/mscc/ocelot.h>
26 #include "ocelot_rew.h"
27 #include "ocelot_qs.h"
28
29 #define OCELOT_BUFFER_CELL_SZ 60
30
31 #define OCELOT_STATS_CHECK_DELAY (2 * HZ)
32
33 #define OCELOT_PTP_QUEUE_SZ     128
34
35 struct frame_info {
36         u32 len;
37         u16 port;
38         u16 vid;
39         u8 tag_type;
40         u16 rew_op;
41         u32 timestamp;  /* rew_val */
42 };
43
44 struct ocelot_multicast {
45         struct list_head list;
46         unsigned char addr[ETH_ALEN];
47         u16 vid;
48         u16 ports;
49         int pgid;
50 };
51
52 struct ocelot_port_tc {
53         bool block_shared;
54         unsigned long offload_cnt;
55
56         unsigned long police_id;
57 };
58
59 struct ocelot_port_private {
60         struct ocelot_port port;
61         struct net_device *dev;
62         struct phy_device *phy;
63         u8 chip_port;
64
65         struct phy *serdes;
66
67         struct ocelot_port_tc tc;
68 };
69
70 struct ocelot_dump_ctx {
71         struct net_device *dev;
72         struct sk_buff *skb;
73         struct netlink_callback *cb;
74         int idx;
75 };
76
77 /* MAC table entry types.
78  * ENTRYTYPE_NORMAL is subject to aging.
79  * ENTRYTYPE_LOCKED is not subject to aging.
80  * ENTRYTYPE_MACv4 is not subject to aging. For IPv4 multicast.
81  * ENTRYTYPE_MACv6 is not subject to aging. For IPv6 multicast.
82  */
83 enum macaccess_entry_type {
84         ENTRYTYPE_NORMAL = 0,
85         ENTRYTYPE_LOCKED,
86         ENTRYTYPE_MACv4,
87         ENTRYTYPE_MACv6,
88 };
89
90 int ocelot_port_fdb_do_dump(const unsigned char *addr, u16 vid,
91                             bool is_static, void *data);
92 int ocelot_mact_learn(struct ocelot *ocelot, int port,
93                       const unsigned char mac[ETH_ALEN],
94                       unsigned int vid, enum macaccess_entry_type type);
95 int ocelot_mact_forget(struct ocelot *ocelot,
96                        const unsigned char mac[ETH_ALEN], unsigned int vid);
97 int ocelot_port_lag_join(struct ocelot *ocelot, int port,
98                          struct net_device *bond);
99 void ocelot_port_lag_leave(struct ocelot *ocelot, int port,
100                            struct net_device *bond);
101
102 u32 ocelot_port_readl(struct ocelot_port *port, u32 reg);
103 void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg);
104
105 #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val))
106 #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val))
107
108 int ocelot_probe_port(struct ocelot *ocelot, u8 port,
109                       void __iomem *regs,
110                       struct phy_device *phy);
111
112 void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu,
113                          enum ocelot_tag_prefix injection,
114                          enum ocelot_tag_prefix extraction);
115
116 extern struct notifier_block ocelot_netdevice_nb;
117 extern struct notifier_block ocelot_switchdev_nb;
118 extern struct notifier_block ocelot_switchdev_blocking_nb;
119
120 #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val))
121 #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val))
122
123 #endif