1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver 4*4882a593Smuzhiyun * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com> 5*4882a593Smuzhiyun * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _ROCKER_H 9*4882a593Smuzhiyun #define _ROCKER_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/kernel.h> 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <linux/netdevice.h> 14*4882a593Smuzhiyun #include <linux/notifier.h> 15*4882a593Smuzhiyun #include <net/neighbour.h> 16*4882a593Smuzhiyun #include <net/switchdev.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include "rocker_hw.h" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct rocker_desc_info { 21*4882a593Smuzhiyun char *data; /* mapped */ 22*4882a593Smuzhiyun size_t data_size; 23*4882a593Smuzhiyun size_t tlv_size; 24*4882a593Smuzhiyun struct rocker_desc *desc; 25*4882a593Smuzhiyun dma_addr_t mapaddr; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct rocker_dma_ring_info { 29*4882a593Smuzhiyun size_t size; 30*4882a593Smuzhiyun u32 head; 31*4882a593Smuzhiyun u32 tail; 32*4882a593Smuzhiyun struct rocker_desc *desc; /* mapped */ 33*4882a593Smuzhiyun dma_addr_t mapaddr; 34*4882a593Smuzhiyun struct rocker_desc_info *desc_info; 35*4882a593Smuzhiyun unsigned int type; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct rocker; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct rocker_port { 41*4882a593Smuzhiyun struct net_device *dev; 42*4882a593Smuzhiyun struct rocker *rocker; 43*4882a593Smuzhiyun void *wpriv; 44*4882a593Smuzhiyun unsigned int port_number; 45*4882a593Smuzhiyun u32 pport; 46*4882a593Smuzhiyun struct napi_struct napi_tx; 47*4882a593Smuzhiyun struct napi_struct napi_rx; 48*4882a593Smuzhiyun struct rocker_dma_ring_info tx_ring; 49*4882a593Smuzhiyun struct rocker_dma_ring_info rx_ring; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct rocker_port *rocker_port_dev_lower_find(struct net_device *dev, 53*4882a593Smuzhiyun struct rocker *rocker); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct rocker_world_ops; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct rocker { 58*4882a593Smuzhiyun struct pci_dev *pdev; 59*4882a593Smuzhiyun u8 __iomem *hw_addr; 60*4882a593Smuzhiyun struct msix_entry *msix_entries; 61*4882a593Smuzhiyun unsigned int port_count; 62*4882a593Smuzhiyun struct rocker_port **ports; 63*4882a593Smuzhiyun struct { 64*4882a593Smuzhiyun u64 id; 65*4882a593Smuzhiyun } hw; 66*4882a593Smuzhiyun spinlock_t cmd_ring_lock; /* for cmd ring accesses */ 67*4882a593Smuzhiyun struct rocker_dma_ring_info cmd_ring; 68*4882a593Smuzhiyun struct rocker_dma_ring_info event_ring; 69*4882a593Smuzhiyun struct notifier_block fib_nb; 70*4882a593Smuzhiyun struct rocker_world_ops *wops; 71*4882a593Smuzhiyun struct workqueue_struct *rocker_owq; 72*4882a593Smuzhiyun void *wpriv; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port, 76*4882a593Smuzhiyun struct rocker_desc_info *desc_info, 77*4882a593Smuzhiyun void *priv); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port, 80*4882a593Smuzhiyun const struct rocker_desc_info *desc_info, 81*4882a593Smuzhiyun void *priv); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun int rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait, 84*4882a593Smuzhiyun rocker_cmd_prep_cb_t prepare, void *prepare_priv, 85*4882a593Smuzhiyun rocker_cmd_proc_cb_t process, void *process_priv); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun int rocker_port_set_learning(struct rocker_port *rocker_port, 88*4882a593Smuzhiyun bool learning); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct rocker_world_ops { 91*4882a593Smuzhiyun const char *kind; 92*4882a593Smuzhiyun size_t priv_size; 93*4882a593Smuzhiyun size_t port_priv_size; 94*4882a593Smuzhiyun u8 mode; 95*4882a593Smuzhiyun int (*init)(struct rocker *rocker); 96*4882a593Smuzhiyun void (*fini)(struct rocker *rocker); 97*4882a593Smuzhiyun int (*port_pre_init)(struct rocker_port *rocker_port); 98*4882a593Smuzhiyun int (*port_init)(struct rocker_port *rocker_port); 99*4882a593Smuzhiyun void (*port_fini)(struct rocker_port *rocker_port); 100*4882a593Smuzhiyun void (*port_post_fini)(struct rocker_port *rocker_port); 101*4882a593Smuzhiyun int (*port_open)(struct rocker_port *rocker_port); 102*4882a593Smuzhiyun void (*port_stop)(struct rocker_port *rocker_port); 103*4882a593Smuzhiyun int (*port_attr_stp_state_set)(struct rocker_port *rocker_port, 104*4882a593Smuzhiyun u8 state); 105*4882a593Smuzhiyun int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port, 106*4882a593Smuzhiyun unsigned long brport_flags, 107*4882a593Smuzhiyun struct switchdev_trans *trans); 108*4882a593Smuzhiyun int (*port_attr_bridge_flags_support_get)(const struct rocker_port * 109*4882a593Smuzhiyun rocker_port, 110*4882a593Smuzhiyun unsigned long * 111*4882a593Smuzhiyun p_brport_flags); 112*4882a593Smuzhiyun int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port, 113*4882a593Smuzhiyun u32 ageing_time, 114*4882a593Smuzhiyun struct switchdev_trans *trans); 115*4882a593Smuzhiyun int (*port_obj_vlan_add)(struct rocker_port *rocker_port, 116*4882a593Smuzhiyun const struct switchdev_obj_port_vlan *vlan); 117*4882a593Smuzhiyun int (*port_obj_vlan_del)(struct rocker_port *rocker_port, 118*4882a593Smuzhiyun const struct switchdev_obj_port_vlan *vlan); 119*4882a593Smuzhiyun int (*port_obj_fdb_add)(struct rocker_port *rocker_port, 120*4882a593Smuzhiyun u16 vid, const unsigned char *addr); 121*4882a593Smuzhiyun int (*port_obj_fdb_del)(struct rocker_port *rocker_port, 122*4882a593Smuzhiyun u16 vid, const unsigned char *addr); 123*4882a593Smuzhiyun int (*port_master_linked)(struct rocker_port *rocker_port, 124*4882a593Smuzhiyun struct net_device *master); 125*4882a593Smuzhiyun int (*port_master_unlinked)(struct rocker_port *rocker_port, 126*4882a593Smuzhiyun struct net_device *master); 127*4882a593Smuzhiyun int (*port_neigh_update)(struct rocker_port *rocker_port, 128*4882a593Smuzhiyun struct neighbour *n); 129*4882a593Smuzhiyun int (*port_neigh_destroy)(struct rocker_port *rocker_port, 130*4882a593Smuzhiyun struct neighbour *n); 131*4882a593Smuzhiyun int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port, 132*4882a593Smuzhiyun const unsigned char *addr, 133*4882a593Smuzhiyun __be16 vlan_id); 134*4882a593Smuzhiyun int (*fib4_add)(struct rocker *rocker, 135*4882a593Smuzhiyun const struct fib_entry_notifier_info *fen_info); 136*4882a593Smuzhiyun int (*fib4_del)(struct rocker *rocker, 137*4882a593Smuzhiyun const struct fib_entry_notifier_info *fen_info); 138*4882a593Smuzhiyun void (*fib4_abort)(struct rocker *rocker); 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun extern struct rocker_world_ops rocker_ofdpa_ops; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #endif 144