18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver 48c2ecf20Sopenharmony_ci * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com> 58c2ecf20Sopenharmony_ci * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _ROCKER_H 98c2ecf20Sopenharmony_ci#define _ROCKER_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/types.h> 138c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 148c2ecf20Sopenharmony_ci#include <linux/notifier.h> 158c2ecf20Sopenharmony_ci#include <net/neighbour.h> 168c2ecf20Sopenharmony_ci#include <net/switchdev.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include "rocker_hw.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct rocker_desc_info { 218c2ecf20Sopenharmony_ci char *data; /* mapped */ 228c2ecf20Sopenharmony_ci size_t data_size; 238c2ecf20Sopenharmony_ci size_t tlv_size; 248c2ecf20Sopenharmony_ci struct rocker_desc *desc; 258c2ecf20Sopenharmony_ci dma_addr_t mapaddr; 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct rocker_dma_ring_info { 298c2ecf20Sopenharmony_ci size_t size; 308c2ecf20Sopenharmony_ci u32 head; 318c2ecf20Sopenharmony_ci u32 tail; 328c2ecf20Sopenharmony_ci struct rocker_desc *desc; /* mapped */ 338c2ecf20Sopenharmony_ci dma_addr_t mapaddr; 348c2ecf20Sopenharmony_ci struct rocker_desc_info *desc_info; 358c2ecf20Sopenharmony_ci unsigned int type; 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistruct rocker; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistruct rocker_port { 418c2ecf20Sopenharmony_ci struct net_device *dev; 428c2ecf20Sopenharmony_ci struct rocker *rocker; 438c2ecf20Sopenharmony_ci void *wpriv; 448c2ecf20Sopenharmony_ci unsigned int port_number; 458c2ecf20Sopenharmony_ci u32 pport; 468c2ecf20Sopenharmony_ci struct napi_struct napi_tx; 478c2ecf20Sopenharmony_ci struct napi_struct napi_rx; 488c2ecf20Sopenharmony_ci struct rocker_dma_ring_info tx_ring; 498c2ecf20Sopenharmony_ci struct rocker_dma_ring_info rx_ring; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct rocker_port *rocker_port_dev_lower_find(struct net_device *dev, 538c2ecf20Sopenharmony_ci struct rocker *rocker); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistruct rocker_world_ops; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistruct rocker { 588c2ecf20Sopenharmony_ci struct pci_dev *pdev; 598c2ecf20Sopenharmony_ci u8 __iomem *hw_addr; 608c2ecf20Sopenharmony_ci struct msix_entry *msix_entries; 618c2ecf20Sopenharmony_ci unsigned int port_count; 628c2ecf20Sopenharmony_ci struct rocker_port **ports; 638c2ecf20Sopenharmony_ci struct { 648c2ecf20Sopenharmony_ci u64 id; 658c2ecf20Sopenharmony_ci } hw; 668c2ecf20Sopenharmony_ci spinlock_t cmd_ring_lock; /* for cmd ring accesses */ 678c2ecf20Sopenharmony_ci struct rocker_dma_ring_info cmd_ring; 688c2ecf20Sopenharmony_ci struct rocker_dma_ring_info event_ring; 698c2ecf20Sopenharmony_ci struct notifier_block fib_nb; 708c2ecf20Sopenharmony_ci struct rocker_world_ops *wops; 718c2ecf20Sopenharmony_ci struct workqueue_struct *rocker_owq; 728c2ecf20Sopenharmony_ci void *wpriv; 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_citypedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port, 768c2ecf20Sopenharmony_ci struct rocker_desc_info *desc_info, 778c2ecf20Sopenharmony_ci void *priv); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_citypedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port, 808c2ecf20Sopenharmony_ci const struct rocker_desc_info *desc_info, 818c2ecf20Sopenharmony_ci void *priv); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ciint rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait, 848c2ecf20Sopenharmony_ci rocker_cmd_prep_cb_t prepare, void *prepare_priv, 858c2ecf20Sopenharmony_ci rocker_cmd_proc_cb_t process, void *process_priv); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciint rocker_port_set_learning(struct rocker_port *rocker_port, 888c2ecf20Sopenharmony_ci bool learning); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistruct rocker_world_ops { 918c2ecf20Sopenharmony_ci const char *kind; 928c2ecf20Sopenharmony_ci size_t priv_size; 938c2ecf20Sopenharmony_ci size_t port_priv_size; 948c2ecf20Sopenharmony_ci u8 mode; 958c2ecf20Sopenharmony_ci int (*init)(struct rocker *rocker); 968c2ecf20Sopenharmony_ci void (*fini)(struct rocker *rocker); 978c2ecf20Sopenharmony_ci int (*port_pre_init)(struct rocker_port *rocker_port); 988c2ecf20Sopenharmony_ci int (*port_init)(struct rocker_port *rocker_port); 998c2ecf20Sopenharmony_ci void (*port_fini)(struct rocker_port *rocker_port); 1008c2ecf20Sopenharmony_ci void (*port_post_fini)(struct rocker_port *rocker_port); 1018c2ecf20Sopenharmony_ci int (*port_open)(struct rocker_port *rocker_port); 1028c2ecf20Sopenharmony_ci void (*port_stop)(struct rocker_port *rocker_port); 1038c2ecf20Sopenharmony_ci int (*port_attr_stp_state_set)(struct rocker_port *rocker_port, 1048c2ecf20Sopenharmony_ci u8 state); 1058c2ecf20Sopenharmony_ci int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port, 1068c2ecf20Sopenharmony_ci unsigned long brport_flags, 1078c2ecf20Sopenharmony_ci struct switchdev_trans *trans); 1088c2ecf20Sopenharmony_ci int (*port_attr_bridge_flags_support_get)(const struct rocker_port * 1098c2ecf20Sopenharmony_ci rocker_port, 1108c2ecf20Sopenharmony_ci unsigned long * 1118c2ecf20Sopenharmony_ci p_brport_flags); 1128c2ecf20Sopenharmony_ci int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port, 1138c2ecf20Sopenharmony_ci u32 ageing_time, 1148c2ecf20Sopenharmony_ci struct switchdev_trans *trans); 1158c2ecf20Sopenharmony_ci int (*port_obj_vlan_add)(struct rocker_port *rocker_port, 1168c2ecf20Sopenharmony_ci const struct switchdev_obj_port_vlan *vlan); 1178c2ecf20Sopenharmony_ci int (*port_obj_vlan_del)(struct rocker_port *rocker_port, 1188c2ecf20Sopenharmony_ci const struct switchdev_obj_port_vlan *vlan); 1198c2ecf20Sopenharmony_ci int (*port_obj_fdb_add)(struct rocker_port *rocker_port, 1208c2ecf20Sopenharmony_ci u16 vid, const unsigned char *addr); 1218c2ecf20Sopenharmony_ci int (*port_obj_fdb_del)(struct rocker_port *rocker_port, 1228c2ecf20Sopenharmony_ci u16 vid, const unsigned char *addr); 1238c2ecf20Sopenharmony_ci int (*port_master_linked)(struct rocker_port *rocker_port, 1248c2ecf20Sopenharmony_ci struct net_device *master); 1258c2ecf20Sopenharmony_ci int (*port_master_unlinked)(struct rocker_port *rocker_port, 1268c2ecf20Sopenharmony_ci struct net_device *master); 1278c2ecf20Sopenharmony_ci int (*port_neigh_update)(struct rocker_port *rocker_port, 1288c2ecf20Sopenharmony_ci struct neighbour *n); 1298c2ecf20Sopenharmony_ci int (*port_neigh_destroy)(struct rocker_port *rocker_port, 1308c2ecf20Sopenharmony_ci struct neighbour *n); 1318c2ecf20Sopenharmony_ci int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port, 1328c2ecf20Sopenharmony_ci const unsigned char *addr, 1338c2ecf20Sopenharmony_ci __be16 vlan_id); 1348c2ecf20Sopenharmony_ci int (*fib4_add)(struct rocker *rocker, 1358c2ecf20Sopenharmony_ci const struct fib_entry_notifier_info *fen_info); 1368c2ecf20Sopenharmony_ci int (*fib4_del)(struct rocker *rocker, 1378c2ecf20Sopenharmony_ci const struct fib_entry_notifier_info *fen_info); 1388c2ecf20Sopenharmony_ci void (*fib4_abort)(struct rocker *rocker); 1398c2ecf20Sopenharmony_ci}; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ciextern struct rocker_world_ops rocker_ofdpa_ops; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci#endif 144