1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
7 #include <linux/notifier.h>
8 #include <linux/skbuff.h>
9 #include <linux/workqueue.h>
10 #include <linux/phylink.h>
11 #include <net/devlink.h>
12 #include <uapi/linux/if_ether.h>
14 #define PRESTERA_DRV_NAME "prestera"
16 #define PRESTERA_DEFAULT_VID 1
18 struct prestera_fw_rev {
24 struct prestera_flood_domain {
25 struct prestera_switch *sw;
26 struct list_head flood_domain_port_list;
30 struct prestera_mdb_entry {
31 struct prestera_switch *sw;
32 struct prestera_flood_domain *flood_domain;
33 unsigned char addr[ETH_ALEN];
37 struct prestera_flood_domain_port {
38 struct prestera_flood_domain *flood_domain;
39 struct net_device *dev;
40 struct list_head flood_domain_port_node;
44 struct prestera_port_stats {
45 u64 good_octets_received;
46 u64 bad_octets_received;
48 u64 broadcast_frames_received;
49 u64 multicast_frames_received;
51 u64 frames_65_to_127_octets;
52 u64 frames_128_to_255_octets;
53 u64 frames_256_to_511_octets;
54 u64 frames_512_to_1023_octets;
55 u64 frames_1024_to_max_octets;
56 u64 excessive_collision;
57 u64 multicast_frames_sent;
58 u64 broadcast_frames_sent;
66 u64 rx_error_frame_received;
70 u64 unicast_frames_received;
71 u64 unicast_frames_sent;
77 #define PRESTERA_AP_PORT_MAX (10)
79 struct prestera_port_caps {
87 struct net_device *dev;
88 struct list_head members;
93 struct prestera_flow_block;
95 struct prestera_port_mac_state {
105 struct prestera_port_phy_state {
114 struct prestera_port_mac_config {
123 struct prestera_port_phy_config {
129 struct prestera_port {
130 struct net_device *dev;
131 struct prestera_switch *sw;
132 struct prestera_flow_block *ingress_flow_block;
133 struct prestera_flow_block *egress_flow_block;
134 struct devlink_port dl_port;
135 struct list_head lag_member;
136 struct prestera_lag *lag;
143 u64 adver_link_modes;
145 struct prestera_port_caps caps;
146 struct list_head list;
147 struct list_head vlans_list;
149 struct prestera_port_stats stats;
150 struct delayed_work caching_dw;
152 struct prestera_port_mac_config cfg_mac;
153 struct prestera_port_phy_config cfg_phy;
154 struct prestera_port_mac_state state_mac;
155 struct prestera_port_phy_state state_phy;
157 struct phylink_config phy_config;
158 struct phylink *phy_link;
159 struct phylink_pcs phylink_pcs;
161 /* protects state_mac */
162 spinlock_t state_mac_lock;
165 struct prestera_device {
167 u8 __iomem *ctl_regs;
169 struct prestera_fw_rev fw_rev;
172 /* called by device driver to handle received packets */
173 void (*recv_pkt)(struct prestera_device *dev);
175 /* called by device driver to pass event up to the higher layer */
176 int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
178 /* called by higher layer to send request to the firmware */
179 int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
180 size_t in_size, void *out_msg, size_t out_size,
184 enum prestera_event_type {
185 PRESTERA_EVENT_TYPE_UNSPEC,
187 PRESTERA_EVENT_TYPE_PORT,
188 PRESTERA_EVENT_TYPE_FDB,
189 PRESTERA_EVENT_TYPE_RXTX,
191 PRESTERA_EVENT_TYPE_MAX
194 enum prestera_rxtx_event_id {
195 PRESTERA_RXTX_EVENT_UNSPEC,
196 PRESTERA_RXTX_EVENT_RCV_PKT,
199 enum prestera_port_event_id {
200 PRESTERA_PORT_EVENT_UNSPEC,
201 PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
204 struct prestera_port_event {
226 enum prestera_fdb_entry_type {
227 PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
228 PRESTERA_FDB_ENTRY_TYPE_LAG,
229 PRESTERA_FDB_ENTRY_TYPE_MAX
232 enum prestera_fdb_event_id {
233 PRESTERA_FDB_EVENT_UNSPEC,
234 PRESTERA_FDB_EVENT_LEARNED,
235 PRESTERA_FDB_EVENT_AGED,
238 struct prestera_fdb_event {
239 enum prestera_fdb_entry_type type;
250 struct prestera_event {
253 struct prestera_port_event port_evt;
254 struct prestera_fdb_event fdb_evt;
258 enum prestera_if_type {
259 /* the interface is of port type (dev,port) */
260 PRESTERA_IF_PORT_E = 0,
262 /* the interface is of lag type (lag-id) */
263 PRESTERA_IF_LAG_E = 1,
265 /* the interface is of Vid type (vlan-id) */
266 PRESTERA_IF_VID_E = 3,
269 struct prestera_iface {
270 enum prestera_if_type type;
281 struct prestera_switchdev;
282 struct prestera_span;
283 struct prestera_rxtx;
284 struct prestera_trap_data;
287 struct prestera_switch {
288 struct prestera_device *dev;
289 struct prestera_switchdev *swdev;
290 struct prestera_rxtx *rxtx;
291 struct prestera_acl *acl;
292 struct prestera_span *span;
293 struct list_head event_handlers;
294 struct notifier_block netdev_nb;
295 struct prestera_trap_data *trap_data;
296 char base_mac[ETH_ALEN];
297 struct list_head port_list;
298 rwlock_t port_list_lock;
303 struct device_node *np;
304 struct prestera_router *router;
305 struct prestera_lag *lags;
306 struct prestera_counter *counter;
309 u32 size_tbl_router_nexthop;
312 struct prestera_router {
313 struct prestera_switch *sw;
314 struct list_head vr_list;
315 struct list_head rif_entry_list;
316 struct rhashtable nh_neigh_ht;
317 struct rhashtable nexthop_group_ht;
318 struct rhashtable fib_ht;
319 struct rhashtable kern_neigh_cache_ht;
320 struct rhashtable kern_fib_cache_ht;
321 struct notifier_block inetaddr_nb;
322 struct notifier_block inetaddr_valid_nb;
323 struct notifier_block fib_nb;
324 struct notifier_block netevent_nb;
325 u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */
326 unsigned long nhgrp_hw_cache_kick; /* jiffies */
328 struct delayed_work dw;
332 struct prestera_rxtx_params {
337 #define prestera_dev(sw) ((sw)->dev->dev)
339 static inline void prestera_write(const struct prestera_switch *sw,
340 unsigned int reg, u32 val)
342 writel(val, sw->dev->pp_regs + reg);
345 static inline u32 prestera_read(const struct prestera_switch *sw,
348 return readl(sw->dev->pp_regs + reg);
351 int prestera_device_register(struct prestera_device *dev);
352 void prestera_device_unregister(struct prestera_device *dev);
354 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
355 u32 dev_id, u32 hw_id);
357 int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
359 int prestera_router_init(struct prestera_switch *sw);
360 void prestera_router_fini(struct prestera_switch *sw);
362 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
364 struct prestera_switch *prestera_switch_get(struct net_device *dev);
366 int prestera_port_cfg_mac_read(struct prestera_port *port,
367 struct prestera_port_mac_config *cfg);
369 int prestera_port_cfg_mac_write(struct prestera_port *port,
370 struct prestera_port_mac_config *cfg);
372 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
374 void prestera_queue_work(struct work_struct *work);
375 void prestera_queue_delayed_work(struct delayed_work *work, unsigned long delay);
376 void prestera_queue_drain(void);
378 int prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
379 int prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
380 int prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
382 int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked);
384 int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
386 bool prestera_netdev_check(const struct net_device *dev);
388 int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
390 bool prestera_port_is_lag_member(const struct prestera_port *port);
391 int prestera_lag_id(struct prestera_switch *sw,
392 struct net_device *lag_dev, u16 *lag_id);
394 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
396 u16 prestera_port_lag_id(const struct prestera_port *port);
398 struct prestera_mdb_entry *
399 prestera_mdb_entry_create(struct prestera_switch *sw,
400 const unsigned char *addr, u16 vid);
401 void prestera_mdb_entry_destroy(struct prestera_mdb_entry *mdb_entry);
403 struct prestera_flood_domain *
404 prestera_flood_domain_create(struct prestera_switch *sw);
405 void prestera_flood_domain_destroy(struct prestera_flood_domain *flood_domain);
408 prestera_flood_domain_port_create(struct prestera_flood_domain *flood_domain,
409 struct net_device *dev,
412 prestera_flood_domain_port_destroy(struct prestera_flood_domain_port *port);
413 struct prestera_flood_domain_port *
414 prestera_flood_domain_port_find(struct prestera_flood_domain *flood_domain,
415 struct net_device *dev, u16 vid);
417 #endif /* _PRESTERA_H_ */