162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver 462306a36Sopenharmony_ci * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com> 562306a36Sopenharmony_ci * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _ROCKER_H 962306a36Sopenharmony_ci#define _ROCKER_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci#include <linux/netdevice.h> 1462306a36Sopenharmony_ci#include <linux/notifier.h> 1562306a36Sopenharmony_ci#include <net/neighbour.h> 1662306a36Sopenharmony_ci#include <net/switchdev.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "rocker_hw.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct rocker_desc_info { 2162306a36Sopenharmony_ci char *data; /* mapped */ 2262306a36Sopenharmony_ci size_t data_size; 2362306a36Sopenharmony_ci size_t tlv_size; 2462306a36Sopenharmony_ci struct rocker_desc *desc; 2562306a36Sopenharmony_ci dma_addr_t mapaddr; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct rocker_dma_ring_info { 2962306a36Sopenharmony_ci size_t size; 3062306a36Sopenharmony_ci u32 head; 3162306a36Sopenharmony_ci u32 tail; 3262306a36Sopenharmony_ci struct rocker_desc *desc; /* mapped */ 3362306a36Sopenharmony_ci dma_addr_t mapaddr; 3462306a36Sopenharmony_ci struct rocker_desc_info *desc_info; 3562306a36Sopenharmony_ci unsigned int type; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct rocker; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct rocker_port { 4162306a36Sopenharmony_ci struct net_device *dev; 4262306a36Sopenharmony_ci struct rocker *rocker; 4362306a36Sopenharmony_ci void *wpriv; 4462306a36Sopenharmony_ci unsigned int port_number; 4562306a36Sopenharmony_ci u32 pport; 4662306a36Sopenharmony_ci struct napi_struct napi_tx; 4762306a36Sopenharmony_ci struct napi_struct napi_rx; 4862306a36Sopenharmony_ci struct rocker_dma_ring_info tx_ring; 4962306a36Sopenharmony_ci struct rocker_dma_ring_info rx_ring; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct rocker_port *rocker_port_dev_lower_find(struct net_device *dev, 5362306a36Sopenharmony_ci struct rocker *rocker); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct rocker_world_ops; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct rocker { 5862306a36Sopenharmony_ci struct pci_dev *pdev; 5962306a36Sopenharmony_ci u8 __iomem *hw_addr; 6062306a36Sopenharmony_ci struct msix_entry *msix_entries; 6162306a36Sopenharmony_ci unsigned int port_count; 6262306a36Sopenharmony_ci struct rocker_port **ports; 6362306a36Sopenharmony_ci struct { 6462306a36Sopenharmony_ci u64 id; 6562306a36Sopenharmony_ci } hw; 6662306a36Sopenharmony_ci spinlock_t cmd_ring_lock; /* for cmd ring accesses */ 6762306a36Sopenharmony_ci struct rocker_dma_ring_info cmd_ring; 6862306a36Sopenharmony_ci struct rocker_dma_ring_info event_ring; 6962306a36Sopenharmony_ci struct notifier_block fib_nb; 7062306a36Sopenharmony_ci struct rocker_world_ops *wops; 7162306a36Sopenharmony_ci struct workqueue_struct *rocker_owq; 7262306a36Sopenharmony_ci void *wpriv; 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_citypedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port, 7662306a36Sopenharmony_ci struct rocker_desc_info *desc_info, 7762306a36Sopenharmony_ci void *priv); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_citypedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port, 8062306a36Sopenharmony_ci const struct rocker_desc_info *desc_info, 8162306a36Sopenharmony_ci void *priv); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciint rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait, 8462306a36Sopenharmony_ci rocker_cmd_prep_cb_t prepare, void *prepare_priv, 8562306a36Sopenharmony_ci rocker_cmd_proc_cb_t process, void *process_priv); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciint rocker_port_set_learning(struct rocker_port *rocker_port, 8862306a36Sopenharmony_ci bool learning); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct rocker_world_ops { 9162306a36Sopenharmony_ci const char *kind; 9262306a36Sopenharmony_ci size_t priv_size; 9362306a36Sopenharmony_ci size_t port_priv_size; 9462306a36Sopenharmony_ci u8 mode; 9562306a36Sopenharmony_ci int (*init)(struct rocker *rocker); 9662306a36Sopenharmony_ci void (*fini)(struct rocker *rocker); 9762306a36Sopenharmony_ci int (*port_pre_init)(struct rocker_port *rocker_port); 9862306a36Sopenharmony_ci int (*port_init)(struct rocker_port *rocker_port); 9962306a36Sopenharmony_ci void (*port_fini)(struct rocker_port *rocker_port); 10062306a36Sopenharmony_ci void (*port_post_fini)(struct rocker_port *rocker_port); 10162306a36Sopenharmony_ci int (*port_open)(struct rocker_port *rocker_port); 10262306a36Sopenharmony_ci void (*port_stop)(struct rocker_port *rocker_port); 10362306a36Sopenharmony_ci int (*port_attr_stp_state_set)(struct rocker_port *rocker_port, 10462306a36Sopenharmony_ci u8 state); 10562306a36Sopenharmony_ci int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port, 10662306a36Sopenharmony_ci unsigned long brport_flags); 10762306a36Sopenharmony_ci int (*port_attr_bridge_flags_support_get)(const struct rocker_port * 10862306a36Sopenharmony_ci rocker_port, 10962306a36Sopenharmony_ci unsigned long * 11062306a36Sopenharmony_ci p_brport_flags); 11162306a36Sopenharmony_ci int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port, 11262306a36Sopenharmony_ci u32 ageing_time); 11362306a36Sopenharmony_ci int (*port_obj_vlan_add)(struct rocker_port *rocker_port, 11462306a36Sopenharmony_ci const struct switchdev_obj_port_vlan *vlan); 11562306a36Sopenharmony_ci int (*port_obj_vlan_del)(struct rocker_port *rocker_port, 11662306a36Sopenharmony_ci const struct switchdev_obj_port_vlan *vlan); 11762306a36Sopenharmony_ci int (*port_obj_fdb_add)(struct rocker_port *rocker_port, 11862306a36Sopenharmony_ci u16 vid, const unsigned char *addr); 11962306a36Sopenharmony_ci int (*port_obj_fdb_del)(struct rocker_port *rocker_port, 12062306a36Sopenharmony_ci u16 vid, const unsigned char *addr); 12162306a36Sopenharmony_ci int (*port_master_linked)(struct rocker_port *rocker_port, 12262306a36Sopenharmony_ci struct net_device *master, 12362306a36Sopenharmony_ci struct netlink_ext_ack *extack); 12462306a36Sopenharmony_ci int (*port_master_unlinked)(struct rocker_port *rocker_port, 12562306a36Sopenharmony_ci struct net_device *master); 12662306a36Sopenharmony_ci int (*port_neigh_update)(struct rocker_port *rocker_port, 12762306a36Sopenharmony_ci struct neighbour *n); 12862306a36Sopenharmony_ci int (*port_neigh_destroy)(struct rocker_port *rocker_port, 12962306a36Sopenharmony_ci struct neighbour *n); 13062306a36Sopenharmony_ci int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port, 13162306a36Sopenharmony_ci const unsigned char *addr, 13262306a36Sopenharmony_ci __be16 vlan_id); 13362306a36Sopenharmony_ci int (*fib4_add)(struct rocker *rocker, 13462306a36Sopenharmony_ci const struct fib_entry_notifier_info *fen_info); 13562306a36Sopenharmony_ci int (*fib4_del)(struct rocker *rocker, 13662306a36Sopenharmony_ci const struct fib_entry_notifier_info *fen_info); 13762306a36Sopenharmony_ci void (*fib4_abort)(struct rocker *rocker); 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciextern struct rocker_world_ops rocker_ofdpa_ops; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#endif 143