Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver
0004  * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com>
0005  * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
0006  */
0007 
0008 #ifndef _ROCKER_H
0009 #define _ROCKER_H
0010 
0011 #include <linux/kernel.h>
0012 #include <linux/types.h>
0013 #include <linux/netdevice.h>
0014 #include <linux/notifier.h>
0015 #include <net/neighbour.h>
0016 #include <net/switchdev.h>
0017 
0018 #include "rocker_hw.h"
0019 
0020 struct rocker_desc_info {
0021     char *data; /* mapped */
0022     size_t data_size;
0023     size_t tlv_size;
0024     struct rocker_desc *desc;
0025     dma_addr_t mapaddr;
0026 };
0027 
0028 struct rocker_dma_ring_info {
0029     size_t size;
0030     u32 head;
0031     u32 tail;
0032     struct rocker_desc *desc; /* mapped */
0033     dma_addr_t mapaddr;
0034     struct rocker_desc_info *desc_info;
0035     unsigned int type;
0036 };
0037 
0038 struct rocker;
0039 
0040 struct rocker_port {
0041     struct net_device *dev;
0042     struct rocker *rocker;
0043     void *wpriv;
0044     unsigned int port_number;
0045     u32 pport;
0046     struct napi_struct napi_tx;
0047     struct napi_struct napi_rx;
0048     struct rocker_dma_ring_info tx_ring;
0049     struct rocker_dma_ring_info rx_ring;
0050 };
0051 
0052 struct rocker_port *rocker_port_dev_lower_find(struct net_device *dev,
0053                            struct rocker *rocker);
0054 
0055 struct rocker_world_ops;
0056 
0057 struct rocker {
0058     struct pci_dev *pdev;
0059     u8 __iomem *hw_addr;
0060     struct msix_entry *msix_entries;
0061     unsigned int port_count;
0062     struct rocker_port **ports;
0063     struct {
0064         u64 id;
0065     } hw;
0066     spinlock_t cmd_ring_lock;       /* for cmd ring accesses */
0067     struct rocker_dma_ring_info cmd_ring;
0068     struct rocker_dma_ring_info event_ring;
0069     struct notifier_block fib_nb;
0070     struct rocker_world_ops *wops;
0071     struct workqueue_struct *rocker_owq;
0072     void *wpriv;
0073 };
0074 
0075 typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port,
0076                     struct rocker_desc_info *desc_info,
0077                     void *priv);
0078 
0079 typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port,
0080                     const struct rocker_desc_info *desc_info,
0081                     void *priv);
0082 
0083 int rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait,
0084             rocker_cmd_prep_cb_t prepare, void *prepare_priv,
0085             rocker_cmd_proc_cb_t process, void *process_priv);
0086 
0087 int rocker_port_set_learning(struct rocker_port *rocker_port,
0088                  bool learning);
0089 
0090 struct rocker_world_ops {
0091     const char *kind;
0092     size_t priv_size;
0093     size_t port_priv_size;
0094     u8 mode;
0095     int (*init)(struct rocker *rocker);
0096     void (*fini)(struct rocker *rocker);
0097     int (*port_pre_init)(struct rocker_port *rocker_port);
0098     int (*port_init)(struct rocker_port *rocker_port);
0099     void (*port_fini)(struct rocker_port *rocker_port);
0100     void (*port_post_fini)(struct rocker_port *rocker_port);
0101     int (*port_open)(struct rocker_port *rocker_port);
0102     void (*port_stop)(struct rocker_port *rocker_port);
0103     int (*port_attr_stp_state_set)(struct rocker_port *rocker_port,
0104                        u8 state);
0105     int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port,
0106                       unsigned long brport_flags);
0107     int (*port_attr_bridge_flags_support_get)(const struct rocker_port *
0108                           rocker_port,
0109                           unsigned long *
0110                           p_brport_flags);
0111     int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port,
0112                         u32 ageing_time);
0113     int (*port_obj_vlan_add)(struct rocker_port *rocker_port,
0114                  const struct switchdev_obj_port_vlan *vlan);
0115     int (*port_obj_vlan_del)(struct rocker_port *rocker_port,
0116                  const struct switchdev_obj_port_vlan *vlan);
0117     int (*port_obj_fdb_add)(struct rocker_port *rocker_port,
0118                 u16 vid, const unsigned char *addr);
0119     int (*port_obj_fdb_del)(struct rocker_port *rocker_port,
0120                 u16 vid, const unsigned char *addr);
0121     int (*port_master_linked)(struct rocker_port *rocker_port,
0122                   struct net_device *master,
0123                   struct netlink_ext_ack *extack);
0124     int (*port_master_unlinked)(struct rocker_port *rocker_port,
0125                     struct net_device *master);
0126     int (*port_neigh_update)(struct rocker_port *rocker_port,
0127                  struct neighbour *n);
0128     int (*port_neigh_destroy)(struct rocker_port *rocker_port,
0129                   struct neighbour *n);
0130     int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port,
0131                      const unsigned char *addr,
0132                      __be16 vlan_id);
0133     int (*fib4_add)(struct rocker *rocker,
0134             const struct fib_entry_notifier_info *fen_info);
0135     int (*fib4_del)(struct rocker *rocker,
0136             const struct fib_entry_notifier_info *fen_info);
0137     void (*fib4_abort)(struct rocker *rocker);
0138 };
0139 
0140 extern struct rocker_world_ops rocker_ofdpa_ops;
0141 
0142 #endif