1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */ 3 4 #ifndef _PRESTERA_H_ 5 #define _PRESTERA_H_ 6 7 #include <linux/notifier.h> 8 #include <linux/skbuff.h> 9 #include <linux/workqueue.h> 10 #include <net/devlink.h> 11 #include <uapi/linux/if_ether.h> 12 13 #define PRESTERA_DRV_NAME "prestera" 14 15 #define PRESTERA_DEFAULT_VID 1 16 17 struct prestera_fw_rev { 18 u16 maj; 19 u16 min; 20 u16 sub; 21 }; 22 23 struct prestera_port_stats { 24 u64 good_octets_received; 25 u64 bad_octets_received; 26 u64 mac_trans_error; 27 u64 broadcast_frames_received; 28 u64 multicast_frames_received; 29 u64 frames_64_octets; 30 u64 frames_65_to_127_octets; 31 u64 frames_128_to_255_octets; 32 u64 frames_256_to_511_octets; 33 u64 frames_512_to_1023_octets; 34 u64 frames_1024_to_max_octets; 35 u64 excessive_collision; 36 u64 multicast_frames_sent; 37 u64 broadcast_frames_sent; 38 u64 fc_sent; 39 u64 fc_received; 40 u64 buffer_overrun; 41 u64 undersize; 42 u64 fragments; 43 u64 oversize; 44 u64 jabber; 45 u64 rx_error_frame_received; 46 u64 bad_crc; 47 u64 collisions; 48 u64 late_collision; 49 u64 unicast_frames_received; 50 u64 unicast_frames_sent; 51 u64 sent_multiple; 52 u64 sent_deferred; 53 u64 good_octets_sent; 54 }; 55 56 #define PRESTERA_AP_PORT_MAX (10) 57 58 struct prestera_port_caps { 59 u64 supp_link_modes; 60 u8 supp_fec; 61 u8 type; 62 u8 transceiver; 63 }; 64 65 struct prestera_lag { 66 struct net_device *dev; 67 struct list_head members; 68 u16 member_count; 69 u16 lag_id; 70 }; 71 72 struct prestera_flow_block; 73 74 struct prestera_port_mac_state { 75 u32 mode; 76 u32 speed; 77 bool oper; 78 u8 duplex; 79 u8 fc; 80 u8 fec; 81 }; 82 83 struct prestera_port_phy_state { 84 u64 lmode_bmap; 85 struct { 86 bool pause; 87 bool asym_pause; 88 } remote_fc; 89 u8 mdix; 90 }; 91 92 struct prestera_port_mac_config { 93 u32 mode; 94 u32 speed; 95 bool admin; 96 u8 inband; 97 u8 duplex; 98 u8 fec; 99 }; 100 101 struct prestera_port_phy_config { 102 u32 mode; 103 bool admin; 104 u8 mdix; 105 }; 106 107 struct prestera_port { 108 struct net_device *dev; 109 struct prestera_switch *sw; 110 struct prestera_flow_block *ingress_flow_block; 111 struct prestera_flow_block *egress_flow_block; 112 struct devlink_port dl_port; 113 struct list_head lag_member; 114 struct prestera_lag *lag; 115 u32 id; 116 u32 hw_id; 117 u32 dev_id; 118 u16 fp_id; 119 u16 pvid; 120 bool autoneg; 121 u64 adver_link_modes; 122 u8 adver_fec; 123 struct prestera_port_caps caps; 124 struct list_head list; 125 struct list_head vlans_list; 126 struct { 127 struct prestera_port_stats stats; 128 struct delayed_work caching_dw; 129 } cached_hw_stats; 130 struct prestera_port_mac_config cfg_mac; 131 struct prestera_port_phy_config cfg_phy; 132 struct prestera_port_mac_state state_mac; 133 struct prestera_port_phy_state state_phy; 134 }; 135 136 struct prestera_device { 137 struct device *dev; 138 u8 __iomem *ctl_regs; 139 u8 __iomem *pp_regs; 140 struct prestera_fw_rev fw_rev; 141 void *priv; 142 143 /* called by device driver to handle received packets */ 144 void (*recv_pkt)(struct prestera_device *dev); 145 146 /* called by device driver to pass event up to the higher layer */ 147 int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size); 148 149 /* called by higher layer to send request to the firmware */ 150 int (*send_req)(struct prestera_device *dev, int qid, void *in_msg, 151 size_t in_size, void *out_msg, size_t out_size, 152 unsigned int wait); 153 }; 154 155 enum prestera_event_type { 156 PRESTERA_EVENT_TYPE_UNSPEC, 157 158 PRESTERA_EVENT_TYPE_PORT, 159 PRESTERA_EVENT_TYPE_FDB, 160 PRESTERA_EVENT_TYPE_RXTX, 161 162 PRESTERA_EVENT_TYPE_MAX 163 }; 164 165 enum prestera_rxtx_event_id { 166 PRESTERA_RXTX_EVENT_UNSPEC, 167 PRESTERA_RXTX_EVENT_RCV_PKT, 168 }; 169 170 enum prestera_port_event_id { 171 PRESTERA_PORT_EVENT_UNSPEC, 172 PRESTERA_PORT_EVENT_MAC_STATE_CHANGED, 173 }; 174 175 struct prestera_port_event { 176 u32 port_id; 177 union { 178 struct { 179 u32 mode; 180 u32 speed; 181 u8 oper; 182 u8 duplex; 183 u8 fc; 184 u8 fec; 185 } mac; 186 struct { 187 u64 lmode_bmap; 188 struct { 189 bool pause; 190 bool asym_pause; 191 } remote_fc; 192 u8 mdix; 193 } phy; 194 } data; 195 }; 196 197 enum prestera_fdb_entry_type { 198 PRESTERA_FDB_ENTRY_TYPE_REG_PORT, 199 PRESTERA_FDB_ENTRY_TYPE_LAG, 200 PRESTERA_FDB_ENTRY_TYPE_MAX 201 }; 202 203 enum prestera_fdb_event_id { 204 PRESTERA_FDB_EVENT_UNSPEC, 205 PRESTERA_FDB_EVENT_LEARNED, 206 PRESTERA_FDB_EVENT_AGED, 207 }; 208 209 struct prestera_fdb_event { 210 enum prestera_fdb_entry_type type; 211 union { 212 u32 port_id; 213 u16 lag_id; 214 } dest; 215 u32 vid; 216 union { 217 u8 mac[ETH_ALEN]; 218 } data; 219 }; 220 221 struct prestera_event { 222 u16 id; 223 union { 224 struct prestera_port_event port_evt; 225 struct prestera_fdb_event fdb_evt; 226 }; 227 }; 228 229 enum prestera_if_type { 230 /* the interface is of port type (dev,port) */ 231 PRESTERA_IF_PORT_E = 0, 232 233 /* the interface is of lag type (lag-id) */ 234 PRESTERA_IF_LAG_E = 1, 235 236 /* the interface is of Vid type (vlan-id) */ 237 PRESTERA_IF_VID_E = 3, 238 }; 239 240 struct prestera_iface { 241 enum prestera_if_type type; 242 struct { 243 u32 hw_dev_num; 244 u32 port_num; 245 } dev_port; 246 u32 hw_dev_num; 247 u16 vr_id; 248 u16 lag_id; 249 u16 vlan_id; 250 }; 251 252 struct prestera_switchdev; 253 struct prestera_span; 254 struct prestera_rxtx; 255 struct prestera_trap_data; 256 struct prestera_acl; 257 258 struct prestera_switch { 259 struct prestera_device *dev; 260 struct prestera_switchdev *swdev; 261 struct prestera_rxtx *rxtx; 262 struct prestera_acl *acl; 263 struct prestera_span *span; 264 struct list_head event_handlers; 265 struct notifier_block netdev_nb; 266 struct prestera_trap_data *trap_data; 267 char base_mac[ETH_ALEN]; 268 struct list_head port_list; 269 rwlock_t port_list_lock; 270 u32 port_count; 271 u32 mtu_min; 272 u32 mtu_max; 273 u8 id; 274 struct prestera_router *router; 275 struct prestera_lag *lags; 276 struct prestera_counter *counter; 277 u8 lag_member_max; 278 u8 lag_max; 279 }; 280 281 struct prestera_router { 282 struct prestera_switch *sw; 283 struct list_head vr_list; 284 struct list_head rif_entry_list; 285 struct rhashtable fib_ht; 286 struct rhashtable kern_fib_cache_ht; 287 struct notifier_block inetaddr_nb; 288 struct notifier_block inetaddr_valid_nb; 289 struct notifier_block fib_nb; 290 }; 291 292 struct prestera_rxtx_params { 293 bool use_sdma; 294 u32 map_addr; 295 }; 296 297 #define prestera_dev(sw) ((sw)->dev->dev) 298 299 static inline void prestera_write(const struct prestera_switch *sw, 300 unsigned int reg, u32 val) 301 { 302 writel(val, sw->dev->pp_regs + reg); 303 } 304 305 static inline u32 prestera_read(const struct prestera_switch *sw, 306 unsigned int reg) 307 { 308 return readl(sw->dev->pp_regs + reg); 309 } 310 311 int prestera_device_register(struct prestera_device *dev); 312 void prestera_device_unregister(struct prestera_device *dev); 313 314 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw, 315 u32 dev_id, u32 hw_id); 316 317 int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes); 318 319 int prestera_router_init(struct prestera_switch *sw); 320 void prestera_router_fini(struct prestera_switch *sw); 321 322 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id); 323 324 int prestera_port_cfg_mac_read(struct prestera_port *port, 325 struct prestera_port_mac_config *cfg); 326 327 int prestera_port_cfg_mac_write(struct prestera_port *port, 328 struct prestera_port_mac_config *cfg); 329 330 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev); 331 332 void prestera_queue_work(struct work_struct *work); 333 334 int prestera_port_pvid_set(struct prestera_port *port, u16 vid); 335 336 bool prestera_netdev_check(const struct net_device *dev); 337 338 int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr); 339 340 bool prestera_port_is_lag_member(const struct prestera_port *port); 341 342 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id); 343 344 u16 prestera_port_lag_id(const struct prestera_port *port); 345 346 #endif /* _PRESTERA_H_ */ 347