0001
0002
0003
0004
0005
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;
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;
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;
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