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