xref: /linux/drivers/net/ethernet/rocker/rocker.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2de152192SJiri Pirko /*
3de152192SJiri Pirko  * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver
4de152192SJiri Pirko  * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com>
5de152192SJiri Pirko  * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
6de152192SJiri Pirko  */
7de152192SJiri Pirko 
8de152192SJiri Pirko #ifndef _ROCKER_H
9de152192SJiri Pirko #define _ROCKER_H
10de152192SJiri Pirko 
11e420114eSJiri Pirko #include <linux/kernel.h>
12de152192SJiri Pirko #include <linux/types.h>
13e420114eSJiri Pirko #include <linux/netdevice.h>
14936bd486SJiri Pirko #include <linux/notifier.h>
15e420114eSJiri Pirko #include <net/neighbour.h>
16e420114eSJiri Pirko #include <net/switchdev.h>
17de152192SJiri Pirko 
18de152192SJiri Pirko #include "rocker_hw.h"
19de152192SJiri Pirko 
20de152192SJiri Pirko struct rocker_desc_info {
21de152192SJiri Pirko 	char *data; /* mapped */
22de152192SJiri Pirko 	size_t data_size;
23de152192SJiri Pirko 	size_t tlv_size;
24de152192SJiri Pirko 	struct rocker_desc *desc;
25de152192SJiri Pirko 	dma_addr_t mapaddr;
26de152192SJiri Pirko };
27de152192SJiri Pirko 
280514c4e8SJiri Pirko struct rocker_dma_ring_info {
290514c4e8SJiri Pirko 	size_t size;
300514c4e8SJiri Pirko 	u32 head;
310514c4e8SJiri Pirko 	u32 tail;
320514c4e8SJiri Pirko 	struct rocker_desc *desc; /* mapped */
330514c4e8SJiri Pirko 	dma_addr_t mapaddr;
340514c4e8SJiri Pirko 	struct rocker_desc_info *desc_info;
350514c4e8SJiri Pirko 	unsigned int type;
360514c4e8SJiri Pirko };
370514c4e8SJiri Pirko 
380514c4e8SJiri Pirko struct rocker;
390514c4e8SJiri Pirko 
400514c4e8SJiri Pirko struct rocker_port {
410514c4e8SJiri Pirko 	struct net_device *dev;
420514c4e8SJiri Pirko 	struct rocker *rocker;
43e420114eSJiri Pirko 	void *wpriv;
440514c4e8SJiri Pirko 	unsigned int port_number;
450514c4e8SJiri Pirko 	u32 pport;
460514c4e8SJiri Pirko 	struct napi_struct napi_tx;
470514c4e8SJiri Pirko 	struct napi_struct napi_rx;
480514c4e8SJiri Pirko 	struct rocker_dma_ring_info tx_ring;
490514c4e8SJiri Pirko 	struct rocker_dma_ring_info rx_ring;
500514c4e8SJiri Pirko };
510514c4e8SJiri Pirko 
52936bd486SJiri Pirko struct rocker_port *rocker_port_dev_lower_find(struct net_device *dev,
53936bd486SJiri Pirko 					       struct rocker *rocker);
54936bd486SJiri Pirko 
55e420114eSJiri Pirko struct rocker_world_ops;
56e420114eSJiri Pirko 
570514c4e8SJiri Pirko struct rocker {
580514c4e8SJiri Pirko 	struct pci_dev *pdev;
590514c4e8SJiri Pirko 	u8 __iomem *hw_addr;
600514c4e8SJiri Pirko 	struct msix_entry *msix_entries;
610514c4e8SJiri Pirko 	unsigned int port_count;
620514c4e8SJiri Pirko 	struct rocker_port **ports;
630514c4e8SJiri Pirko 	struct {
640514c4e8SJiri Pirko 		u64 id;
650514c4e8SJiri Pirko 	} hw;
660514c4e8SJiri Pirko 	spinlock_t cmd_ring_lock;		/* for cmd ring accesses */
670514c4e8SJiri Pirko 	struct rocker_dma_ring_info cmd_ring;
680514c4e8SJiri Pirko 	struct rocker_dma_ring_info event_ring;
69936bd486SJiri Pirko 	struct notifier_block fib_nb;
70e420114eSJiri Pirko 	struct rocker_world_ops *wops;
71c1bb279cSIdo Schimmel 	struct workqueue_struct *rocker_owq;
72e420114eSJiri Pirko 	void *wpriv;
730514c4e8SJiri Pirko };
740514c4e8SJiri Pirko 
753fbcdbf3SJiri Pirko typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port,
763fbcdbf3SJiri Pirko 				    struct rocker_desc_info *desc_info,
773fbcdbf3SJiri Pirko 				    void *priv);
783fbcdbf3SJiri Pirko 
793fbcdbf3SJiri Pirko typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port,
803fbcdbf3SJiri Pirko 				    const struct rocker_desc_info *desc_info,
813fbcdbf3SJiri Pirko 				    void *priv);
823fbcdbf3SJiri Pirko 
833fbcdbf3SJiri Pirko int rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait,
843fbcdbf3SJiri Pirko 		    rocker_cmd_prep_cb_t prepare, void *prepare_priv,
853fbcdbf3SJiri Pirko 		    rocker_cmd_proc_cb_t process, void *process_priv);
863fbcdbf3SJiri Pirko 
873fbcdbf3SJiri Pirko int rocker_port_set_learning(struct rocker_port *rocker_port,
883fbcdbf3SJiri Pirko 			     bool learning);
893fbcdbf3SJiri Pirko 
90e420114eSJiri Pirko struct rocker_world_ops {
91e420114eSJiri Pirko 	const char *kind;
92e420114eSJiri Pirko 	size_t priv_size;
93e420114eSJiri Pirko 	size_t port_priv_size;
94e420114eSJiri Pirko 	u8 mode;
95e420114eSJiri Pirko 	int (*init)(struct rocker *rocker);
96e420114eSJiri Pirko 	void (*fini)(struct rocker *rocker);
97e420114eSJiri Pirko 	int (*port_pre_init)(struct rocker_port *rocker_port);
98e420114eSJiri Pirko 	int (*port_init)(struct rocker_port *rocker_port);
99e420114eSJiri Pirko 	void (*port_fini)(struct rocker_port *rocker_port);
100e420114eSJiri Pirko 	void (*port_post_fini)(struct rocker_port *rocker_port);
101e420114eSJiri Pirko 	int (*port_open)(struct rocker_port *rocker_port);
102e420114eSJiri Pirko 	void (*port_stop)(struct rocker_port *rocker_port);
103e420114eSJiri Pirko 	int (*port_attr_stp_state_set)(struct rocker_port *rocker_port,
10400fc0c51SArkadi Sharshevsky 				       u8 state);
105e420114eSJiri Pirko 	int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port,
106*bae33f2bSVladimir Oltean 					  unsigned long brport_flags);
10796673a30SArkadi Sharshevsky 	int (*port_attr_bridge_flags_support_get)(const struct rocker_port *
10896673a30SArkadi Sharshevsky 						  rocker_port,
10996673a30SArkadi Sharshevsky 						  unsigned long *
11096673a30SArkadi Sharshevsky 						  p_brport_flags);
111e420114eSJiri Pirko 	int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port,
112*bae33f2bSVladimir Oltean 						u32 ageing_time);
113e420114eSJiri Pirko 	int (*port_obj_vlan_add)(struct rocker_port *rocker_port,
11400fc0c51SArkadi Sharshevsky 				 const struct switchdev_obj_port_vlan *vlan);
115e420114eSJiri Pirko 	int (*port_obj_vlan_del)(struct rocker_port *rocker_port,
116e420114eSJiri Pirko 				 const struct switchdev_obj_port_vlan *vlan);
117e420114eSJiri Pirko 	int (*port_obj_fdb_add)(struct rocker_port *rocker_port,
11800fc0c51SArkadi Sharshevsky 				u16 vid, const unsigned char *addr);
119e420114eSJiri Pirko 	int (*port_obj_fdb_del)(struct rocker_port *rocker_port,
12000fc0c51SArkadi Sharshevsky 				u16 vid, const unsigned char *addr);
121e420114eSJiri Pirko 	int (*port_master_linked)(struct rocker_port *rocker_port,
122e420114eSJiri Pirko 				  struct net_device *master);
123e420114eSJiri Pirko 	int (*port_master_unlinked)(struct rocker_port *rocker_port,
124e420114eSJiri Pirko 				    struct net_device *master);
125e420114eSJiri Pirko 	int (*port_neigh_update)(struct rocker_port *rocker_port,
126e420114eSJiri Pirko 				 struct neighbour *n);
127e420114eSJiri Pirko 	int (*port_neigh_destroy)(struct rocker_port *rocker_port,
128e420114eSJiri Pirko 				  struct neighbour *n);
129e420114eSJiri Pirko 	int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port,
130e420114eSJiri Pirko 				     const unsigned char *addr,
131e420114eSJiri Pirko 				     __be16 vlan_id);
132936bd486SJiri Pirko 	int (*fib4_add)(struct rocker *rocker,
133936bd486SJiri Pirko 			const struct fib_entry_notifier_info *fen_info);
134936bd486SJiri Pirko 	int (*fib4_del)(struct rocker *rocker,
135936bd486SJiri Pirko 			const struct fib_entry_notifier_info *fen_info);
136936bd486SJiri Pirko 	void (*fib4_abort)(struct rocker *rocker);
137e420114eSJiri Pirko };
138e420114eSJiri Pirko 
139e420114eSJiri Pirko extern struct rocker_world_ops rocker_ofdpa_ops;
140e420114eSJiri Pirko 
141de152192SJiri Pirko #endif
142