1 /* 2 * drivers/net/ethernet/rocker/rocker.h - Rocker switch device driver 3 * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com> 4 * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11 12 #ifndef _ROCKER_H 13 #define _ROCKER_H 14 15 #include <linux/kernel.h> 16 #include <linux/types.h> 17 #include <linux/netdevice.h> 18 #include <linux/notifier.h> 19 #include <net/neighbour.h> 20 #include <net/switchdev.h> 21 22 #include "rocker_hw.h" 23 24 struct rocker_desc_info { 25 char *data; /* mapped */ 26 size_t data_size; 27 size_t tlv_size; 28 struct rocker_desc *desc; 29 dma_addr_t mapaddr; 30 }; 31 32 struct rocker_dma_ring_info { 33 size_t size; 34 u32 head; 35 u32 tail; 36 struct rocker_desc *desc; /* mapped */ 37 dma_addr_t mapaddr; 38 struct rocker_desc_info *desc_info; 39 unsigned int type; 40 }; 41 42 struct rocker; 43 44 struct rocker_port { 45 struct net_device *dev; 46 struct rocker *rocker; 47 void *wpriv; 48 unsigned int port_number; 49 u32 pport; 50 struct napi_struct napi_tx; 51 struct napi_struct napi_rx; 52 struct rocker_dma_ring_info tx_ring; 53 struct rocker_dma_ring_info rx_ring; 54 }; 55 56 struct rocker_port *rocker_port_dev_lower_find(struct net_device *dev, 57 struct rocker *rocker); 58 59 struct rocker_world_ops; 60 61 struct rocker { 62 struct pci_dev *pdev; 63 u8 __iomem *hw_addr; 64 struct msix_entry *msix_entries; 65 unsigned int port_count; 66 struct rocker_port **ports; 67 struct { 68 u64 id; 69 } hw; 70 spinlock_t cmd_ring_lock; /* for cmd ring accesses */ 71 struct rocker_dma_ring_info cmd_ring; 72 struct rocker_dma_ring_info event_ring; 73 struct notifier_block fib_nb; 74 struct rocker_world_ops *wops; 75 void *wpriv; 76 }; 77 78 typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port, 79 struct rocker_desc_info *desc_info, 80 void *priv); 81 82 typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port, 83 const struct rocker_desc_info *desc_info, 84 void *priv); 85 86 int rocker_cmd_exec(struct rocker_port *rocker_port, bool nowait, 87 rocker_cmd_prep_cb_t prepare, void *prepare_priv, 88 rocker_cmd_proc_cb_t process, void *process_priv); 89 90 int rocker_port_set_learning(struct rocker_port *rocker_port, 91 bool learning); 92 93 struct rocker_world_ops { 94 const char *kind; 95 size_t priv_size; 96 size_t port_priv_size; 97 u8 mode; 98 int (*init)(struct rocker *rocker); 99 void (*fini)(struct rocker *rocker); 100 int (*port_pre_init)(struct rocker_port *rocker_port); 101 int (*port_init)(struct rocker_port *rocker_port); 102 void (*port_fini)(struct rocker_port *rocker_port); 103 void (*port_post_fini)(struct rocker_port *rocker_port); 104 int (*port_open)(struct rocker_port *rocker_port); 105 void (*port_stop)(struct rocker_port *rocker_port); 106 int (*port_attr_stp_state_set)(struct rocker_port *rocker_port, 107 u8 state, 108 struct switchdev_trans *trans); 109 int (*port_attr_bridge_flags_set)(struct rocker_port *rocker_port, 110 unsigned long brport_flags, 111 struct switchdev_trans *trans); 112 int (*port_attr_bridge_flags_get)(const struct rocker_port *rocker_port, 113 unsigned long *p_brport_flags); 114 int (*port_attr_bridge_ageing_time_set)(struct rocker_port *rocker_port, 115 u32 ageing_time, 116 struct switchdev_trans *trans); 117 int (*port_obj_vlan_add)(struct rocker_port *rocker_port, 118 const struct switchdev_obj_port_vlan *vlan, 119 struct switchdev_trans *trans); 120 int (*port_obj_vlan_del)(struct rocker_port *rocker_port, 121 const struct switchdev_obj_port_vlan *vlan); 122 int (*port_obj_vlan_dump)(const struct rocker_port *rocker_port, 123 struct switchdev_obj_port_vlan *vlan, 124 switchdev_obj_dump_cb_t *cb); 125 int (*port_obj_fdb_add)(struct rocker_port *rocker_port, 126 const struct switchdev_obj_port_fdb *fdb, 127 struct switchdev_trans *trans); 128 int (*port_obj_fdb_del)(struct rocker_port *rocker_port, 129 const struct switchdev_obj_port_fdb *fdb); 130 int (*port_obj_fdb_dump)(const struct rocker_port *rocker_port, 131 struct switchdev_obj_port_fdb *fdb, 132 switchdev_obj_dump_cb_t *cb); 133 int (*port_master_linked)(struct rocker_port *rocker_port, 134 struct net_device *master); 135 int (*port_master_unlinked)(struct rocker_port *rocker_port, 136 struct net_device *master); 137 int (*port_neigh_update)(struct rocker_port *rocker_port, 138 struct neighbour *n); 139 int (*port_neigh_destroy)(struct rocker_port *rocker_port, 140 struct neighbour *n); 141 int (*port_ev_mac_vlan_seen)(struct rocker_port *rocker_port, 142 const unsigned char *addr, 143 __be16 vlan_id); 144 int (*fib4_add)(struct rocker *rocker, 145 const struct fib_entry_notifier_info *fen_info); 146 int (*fib4_del)(struct rocker *rocker, 147 const struct fib_entry_notifier_info *fen_info); 148 void (*fib4_abort)(struct rocker *rocker); 149 }; 150 151 extern struct rocker_world_ops rocker_ofdpa_ops; 152 153 #endif 154