xref: /linux/drivers/net/ethernet/marvell/prestera/prestera.h (revision 9e7c9b8eb719835638ee74d93dccc2173581324c)
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
3 
4 #ifndef _PRESTERA_H_
5 #define _PRESTERA_H_
6 
7 #include <linux/notifier.h>
8 #include <linux/skbuff.h>
9 #include <linux/workqueue.h>
10 #include <net/devlink.h>
11 #include <uapi/linux/if_ether.h>
12 
13 #define PRESTERA_DRV_NAME	"prestera"
14 
15 #define PRESTERA_DEFAULT_VID    1
16 
17 struct prestera_fw_rev {
18 	u16 maj;
19 	u16 min;
20 	u16 sub;
21 };
22 
23 struct prestera_flood_domain {
24 	struct prestera_switch *sw;
25 	struct list_head flood_domain_port_list;
26 	u32 idx;
27 };
28 
29 struct prestera_mdb_entry {
30 	struct prestera_switch *sw;
31 	struct prestera_flood_domain *flood_domain;
32 	unsigned char addr[ETH_ALEN];
33 	u16 vid;
34 };
35 
36 struct prestera_flood_domain_port {
37 	struct prestera_flood_domain *flood_domain;
38 	struct net_device *dev;
39 	struct list_head flood_domain_port_node;
40 	u16 vid;
41 };
42 
43 struct prestera_port_stats {
44 	u64 good_octets_received;
45 	u64 bad_octets_received;
46 	u64 mac_trans_error;
47 	u64 broadcast_frames_received;
48 	u64 multicast_frames_received;
49 	u64 frames_64_octets;
50 	u64 frames_65_to_127_octets;
51 	u64 frames_128_to_255_octets;
52 	u64 frames_256_to_511_octets;
53 	u64 frames_512_to_1023_octets;
54 	u64 frames_1024_to_max_octets;
55 	u64 excessive_collision;
56 	u64 multicast_frames_sent;
57 	u64 broadcast_frames_sent;
58 	u64 fc_sent;
59 	u64 fc_received;
60 	u64 buffer_overrun;
61 	u64 undersize;
62 	u64 fragments;
63 	u64 oversize;
64 	u64 jabber;
65 	u64 rx_error_frame_received;
66 	u64 bad_crc;
67 	u64 collisions;
68 	u64 late_collision;
69 	u64 unicast_frames_received;
70 	u64 unicast_frames_sent;
71 	u64 sent_multiple;
72 	u64 sent_deferred;
73 	u64 good_octets_sent;
74 };
75 
76 #define PRESTERA_AP_PORT_MAX   (10)
77 
78 struct prestera_port_caps {
79 	u64 supp_link_modes;
80 	u8 supp_fec;
81 	u8 type;
82 	u8 transceiver;
83 };
84 
85 struct prestera_lag {
86 	struct net_device *dev;
87 	struct list_head members;
88 	u16 member_count;
89 	u16 lag_id;
90 };
91 
92 struct prestera_flow_block;
93 
94 struct prestera_port_mac_state {
95 	u32 mode;
96 	u32 speed;
97 	bool oper;
98 	u8 duplex;
99 	u8 fc;
100 	u8 fec;
101 };
102 
103 struct prestera_port_phy_state {
104 	u64 lmode_bmap;
105 	struct {
106 		bool pause;
107 		bool asym_pause;
108 	} remote_fc;
109 	u8 mdix;
110 };
111 
112 struct prestera_port_mac_config {
113 	u32 mode;
114 	u32 speed;
115 	bool admin;
116 	u8 inband;
117 	u8 duplex;
118 	u8 fec;
119 };
120 
121 struct prestera_port_phy_config {
122 	u32 mode;
123 	bool admin;
124 	u8 mdix;
125 };
126 
127 struct prestera_port {
128 	struct net_device *dev;
129 	struct prestera_switch *sw;
130 	struct prestera_flow_block *ingress_flow_block;
131 	struct prestera_flow_block *egress_flow_block;
132 	struct devlink_port dl_port;
133 	struct list_head lag_member;
134 	struct prestera_lag *lag;
135 	u32 id;
136 	u32 hw_id;
137 	u32 dev_id;
138 	u16 fp_id;
139 	u16 pvid;
140 	bool autoneg;
141 	u64 adver_link_modes;
142 	u8 adver_fec;
143 	struct prestera_port_caps caps;
144 	struct list_head list;
145 	struct list_head vlans_list;
146 	struct {
147 		struct prestera_port_stats stats;
148 		struct delayed_work caching_dw;
149 	} cached_hw_stats;
150 	struct prestera_port_mac_config cfg_mac;
151 	struct prestera_port_phy_config cfg_phy;
152 	struct prestera_port_mac_state state_mac;
153 	struct prestera_port_phy_state state_phy;
154 };
155 
156 struct prestera_device {
157 	struct device *dev;
158 	u8 __iomem *ctl_regs;
159 	u8 __iomem *pp_regs;
160 	struct prestera_fw_rev fw_rev;
161 	void *priv;
162 
163 	/* called by device driver to handle received packets */
164 	void (*recv_pkt)(struct prestera_device *dev);
165 
166 	/* called by device driver to pass event up to the higher layer */
167 	int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
168 
169 	/* called by higher layer to send request to the firmware */
170 	int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
171 			size_t in_size, void *out_msg, size_t out_size,
172 			unsigned int wait);
173 };
174 
175 enum prestera_event_type {
176 	PRESTERA_EVENT_TYPE_UNSPEC,
177 
178 	PRESTERA_EVENT_TYPE_PORT,
179 	PRESTERA_EVENT_TYPE_FDB,
180 	PRESTERA_EVENT_TYPE_RXTX,
181 
182 	PRESTERA_EVENT_TYPE_MAX
183 };
184 
185 enum prestera_rxtx_event_id {
186 	PRESTERA_RXTX_EVENT_UNSPEC,
187 	PRESTERA_RXTX_EVENT_RCV_PKT,
188 };
189 
190 enum prestera_port_event_id {
191 	PRESTERA_PORT_EVENT_UNSPEC,
192 	PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
193 };
194 
195 struct prestera_port_event {
196 	u32 port_id;
197 	union {
198 		struct {
199 			u32 mode;
200 			u32 speed;
201 			u8 oper;
202 			u8 duplex;
203 			u8 fc;
204 			u8 fec;
205 		} mac;
206 		struct {
207 			u64 lmode_bmap;
208 			struct {
209 				bool pause;
210 				bool asym_pause;
211 			} remote_fc;
212 			u8 mdix;
213 		} phy;
214 	} data;
215 };
216 
217 enum prestera_fdb_entry_type {
218 	PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
219 	PRESTERA_FDB_ENTRY_TYPE_LAG,
220 	PRESTERA_FDB_ENTRY_TYPE_MAX
221 };
222 
223 enum prestera_fdb_event_id {
224 	PRESTERA_FDB_EVENT_UNSPEC,
225 	PRESTERA_FDB_EVENT_LEARNED,
226 	PRESTERA_FDB_EVENT_AGED,
227 };
228 
229 struct prestera_fdb_event {
230 	enum prestera_fdb_entry_type type;
231 	union {
232 		u32 port_id;
233 		u16 lag_id;
234 	} dest;
235 	u32 vid;
236 	union {
237 		u8 mac[ETH_ALEN];
238 	} data;
239 };
240 
241 struct prestera_event {
242 	u16 id;
243 	union {
244 		struct prestera_port_event port_evt;
245 		struct prestera_fdb_event fdb_evt;
246 	};
247 };
248 
249 enum prestera_if_type {
250 	/* the interface is of port type (dev,port) */
251 	PRESTERA_IF_PORT_E = 0,
252 
253 	/* the interface is of lag type (lag-id) */
254 	PRESTERA_IF_LAG_E = 1,
255 
256 	/* the interface is of Vid type (vlan-id) */
257 	PRESTERA_IF_VID_E = 3,
258 };
259 
260 struct prestera_iface {
261 	enum prestera_if_type type;
262 	struct {
263 		u32 hw_dev_num;
264 		u32 port_num;
265 	} dev_port;
266 	u32 hw_dev_num;
267 	u16 vr_id;
268 	u16 lag_id;
269 	u16 vlan_id;
270 };
271 
272 struct prestera_switchdev;
273 struct prestera_span;
274 struct prestera_rxtx;
275 struct prestera_trap_data;
276 struct prestera_acl;
277 
278 struct prestera_switch {
279 	struct prestera_device *dev;
280 	struct prestera_switchdev *swdev;
281 	struct prestera_rxtx *rxtx;
282 	struct prestera_acl *acl;
283 	struct prestera_span *span;
284 	struct list_head event_handlers;
285 	struct notifier_block netdev_nb;
286 	struct prestera_trap_data *trap_data;
287 	char base_mac[ETH_ALEN];
288 	struct list_head port_list;
289 	rwlock_t port_list_lock;
290 	u32 port_count;
291 	u32 mtu_min;
292 	u32 mtu_max;
293 	u8 id;
294 	struct prestera_router *router;
295 	struct prestera_lag *lags;
296 	struct prestera_counter *counter;
297 	u8 lag_member_max;
298 	u8 lag_max;
299 };
300 
301 struct prestera_router {
302 	struct prestera_switch *sw;
303 	struct list_head vr_list;
304 	struct list_head rif_entry_list;
305 	struct rhashtable fib_ht;
306 	struct rhashtable kern_fib_cache_ht;
307 	struct notifier_block inetaddr_nb;
308 	struct notifier_block inetaddr_valid_nb;
309 	struct notifier_block fib_nb;
310 };
311 
312 struct prestera_rxtx_params {
313 	bool use_sdma;
314 	u32 map_addr;
315 };
316 
317 #define prestera_dev(sw)		((sw)->dev->dev)
318 
319 static inline void prestera_write(const struct prestera_switch *sw,
320 				  unsigned int reg, u32 val)
321 {
322 	writel(val, sw->dev->pp_regs + reg);
323 }
324 
325 static inline u32 prestera_read(const struct prestera_switch *sw,
326 				unsigned int reg)
327 {
328 	return readl(sw->dev->pp_regs + reg);
329 }
330 
331 int prestera_device_register(struct prestera_device *dev);
332 void prestera_device_unregister(struct prestera_device *dev);
333 
334 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
335 						 u32 dev_id, u32 hw_id);
336 
337 int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
338 
339 int prestera_router_init(struct prestera_switch *sw);
340 void prestera_router_fini(struct prestera_switch *sw);
341 
342 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
343 
344 struct prestera_switch *prestera_switch_get(struct net_device *dev);
345 
346 int prestera_port_cfg_mac_read(struct prestera_port *port,
347 			       struct prestera_port_mac_config *cfg);
348 
349 int prestera_port_cfg_mac_write(struct prestera_port *port,
350 				struct prestera_port_mac_config *cfg);
351 
352 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
353 
354 void prestera_queue_work(struct work_struct *work);
355 
356 int prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
357 int prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
358 int prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
359 
360 int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
361 
362 bool prestera_netdev_check(const struct net_device *dev);
363 
364 int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
365 
366 bool prestera_port_is_lag_member(const struct prestera_port *port);
367 int prestera_lag_id(struct prestera_switch *sw,
368 		    struct net_device *lag_dev, u16 *lag_id);
369 
370 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
371 
372 u16 prestera_port_lag_id(const struct prestera_port *port);
373 
374 struct prestera_mdb_entry *
375 prestera_mdb_entry_create(struct prestera_switch *sw,
376 			  const unsigned char *addr, u16 vid);
377 void prestera_mdb_entry_destroy(struct prestera_mdb_entry *mdb_entry);
378 
379 struct prestera_flood_domain *
380 prestera_flood_domain_create(struct prestera_switch *sw);
381 void prestera_flood_domain_destroy(struct prestera_flood_domain *flood_domain);
382 
383 int
384 prestera_flood_domain_port_create(struct prestera_flood_domain *flood_domain,
385 				  struct net_device *dev,
386 				  u16 vid);
387 void
388 prestera_flood_domain_port_destroy(struct prestera_flood_domain_port *port);
389 struct prestera_flood_domain_port *
390 prestera_flood_domain_port_find(struct prestera_flood_domain *flood_domain,
391 				struct net_device *dev, u16 vid);
392 
393 #endif /* _PRESTERA_H_ */
394