summaryrefslogblamecommitdiffstats
path: root/drivers/net/ethernet/rocker/rocker.h
blob: 5fd0e3520fd6f82099959bb360bf63270e19895a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                       
                         
                        

                            


                            










                                 






























                                                                              
                    













                                                          

                        











                                                                           

                                      















                                                                            



























































                                                                                
      
/*
 * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver
 * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com>
 * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#ifndef _ROCKER_H
#define _ROCKER_H

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/hashtable.h>
#include <linux/if_vlan.h>
#include <linux/netdevice.h>
#include <net/neighbour.h>
#include <net/switchdev.h>

#include "rocker_hw.h"

struct rocker_desc_info {
	char *data; /* mapped */
	size_t data_size;
	size_t tlv_size;
	struct rocker_desc *desc;
	dma_addr_t mapaddr;
};

struct rocker_dma_ring_info {
	size_t size;
	u32 head;
	u32 tail;
	struct rocker_desc *desc; /* mapped */
	dma_addr_t mapaddr;
	struct rocker_desc_info *desc_info;
	unsigned int type;
};

struct rocker;

enum {
	ROCKER_CTRL_LINK_LOCAL_MCAST,
	ROCKER_CTRL_LOCAL_ARP,
	ROCKER_CTRL_IPV4_MCAST,
	ROCKER_CTRL_IPV6_MCAST,
	ROCKER_CTRL_DFLT_BRIDGING,
	ROCKER_CTRL_DFLT_OVS,
	ROCKER_CTRL_MAX,
};

#define ROCKER_INTERNAL_VLAN_ID_BASE	0x0f00
#define ROCKER_N_INTERNAL_VLANS		255
#define ROCKER_VLAN_BITMAP_LEN		BITS_TO_LONGS(VLAN_N_VID)
#define ROCKER_INTERNAL_VLAN_BITMAP_LEN	BITS_TO_LONGS(ROCKER_N_INTERNAL_VLANS)

struct rocker_port {
	struct net_device *dev;
	struct net_device *bridge_dev;
	struct rocker *rocker;
	void *wpriv;
	unsigned int port_number;
	u32 pport;
	__be16 internal_vlan_id;
	int stp_state;
	u32 brport_flags;
	unsigned long ageing_time;
	bool ctrls[ROCKER_CTRL_MAX];
	unsigned long vlan_bitmap[ROCKER_VLAN_BITMAP_LEN];
	struct napi_struct napi_tx;
	struct napi_struct napi_rx;
	struct rocker_dma_ring_info tx_ring;
	struct rocker_dma_ring_info rx_ring;
};

struct rocker_world_ops;

struct rocker {
	struct pci_dev *pdev;
	u8 __iomem *hw_addr;
	struct msix_entry *msix_entries;
	unsigned int port_count;
	struct rocker_port **ports;
	struct {
		u64 id;
	} hw;
	spinlock_t cmd_ring_lock;		/* for cmd ring accesses */
	struct rocker_dma_ring_info cmd_ring;
	struct rocker_dma_ring_info event_ring;
	struct rocker_world_ops *wops;
	void *wpriv;
	DECLARE_HASHTABLE(flow_tbl, 16);
	spinlock_t flow_tbl_lock;		/* for flow tbl accesses */
	u64 flow_tbl_next_cookie;
	DECLARE_HASHTABLE(group_tbl, 16);
	spinlock_t group_tbl_lock;		/* for group tbl accesses */
	struct timer_list fdb_cleanup_timer;
	DECLARE_HASHTABLE(fdb_tbl, 16);
	spinlock_t fdb_tbl_lock;		/* for fdb tbl accesses */
	unsigned long internal_vlan_bitmap[ROCKER_INTERNAL_VLAN_BITMAP_LEN];
	DECLARE_HASHTABLE(internal_vlan_tbl, 8);
	spinlock_t internal_vlan_tbl_lock;	/* for vlan tbl accesses */
	DECLARE_HASHTABLE(neigh_tbl, 16);
	spinlock_t neigh_tbl_lock;		/* for neigh tbl accesses */
	u32 neigh_tbl_next_index;
};

struct rocker_world_ops {
	const char *kind;
	size_t priv_size;
	size_t port_priv_size;
	u8 mode;
	int (*init)(struct rocker *rocker);
	void (*fini)(struct rocker *rocker);
	int (*port_pre_init)(struct rocker_port *rocker_port);
	int (*port_init)(struct rocker_port *rocker_port);
	void (*port_fini)(struct rocker_port *rocker_port);
	void (*port_post_fini)(struct rocker_port *rocker_port);
	int (*port_open)(struct rocker_port *rocker_port);
	void (*port_stop)(struct rocker_port *rocker_port);
	int (*port_attr_stp_state_set)(struct rocker_port *rocker_port,
				       u8 state,
				       struct switchdev_trans *trans);
	int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port,
					  unsigned long brport_flags,
					  struct switchdev_trans *trans);
	int (*port_attr_bridge_flags_get)(const struct rocker_port *rocker_port,
					  unsigned long *p_brport_flags);
	int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port,
						u32 ageing_time,
						struct switchdev_trans *trans);
	int (*port_obj_vlan_add)(struct rocker_port *rocker_port,
				 const struct switchdev_obj_port_vlan *vlan,
				 struct switchdev_trans *trans);
	int (*port_obj_vlan_del)(struct rocker_port *rocker_port,
				 const struct switchdev_obj_port_vlan *vlan);
	int (*port_obj_vlan_dump)(const struct rocker_port *rocker_port,
				  struct switchdev_obj_port_vlan *vlan,
				  switchdev_obj_dump_cb_t *cb);
	int (*port_obj_fib4_add)(struct rocker_port *rocker_port,
				 const struct switchdev_obj_ipv4_fib *fib4,
				 struct switchdev_trans *trans);
	int (*port_obj_fib4_del)(struct rocker_port *rocker_port,
				 const struct switchdev_obj_ipv4_fib *fib4);
	int (*port_obj_fdb_add)(struct rocker_port *rocker_port,
				const struct switchdev_obj_port_fdb *fdb,
				struct switchdev_trans *trans);
	int (*port_obj_fdb_del)(struct rocker_port *rocker_port,
				const struct switchdev_obj_port_fdb *fdb);
	int (*port_obj_fdb_dump)(const struct rocker_port *rocker_port,
				 struct switchdev_obj_port_fdb *fdb,
				 switchdev_obj_dump_cb_t *cb);
	int (*port_master_linked)(struct rocker_port *rocker_port,
				  struct net_device *master);
	int (*port_master_unlinked)(struct rocker_port *rocker_port,
				    struct net_device *master);
	int (*port_neigh_update)(struct rocker_port *rocker_port,
				 struct neighbour *n);
	int (*port_neigh_destroy)(struct rocker_port *rocker_port,
				  struct neighbour *n);
	int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port,
				     const unsigned char *addr,
				     __be16 vlan_id);
};

extern struct rocker_world_ops rocker_ofdpa_ops;

#endif