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 <linux/phylink.h> 11 #include <net/devlink.h> 12 #include <uapi/linux/if_ether.h> 13 14 #define PRESTERA_DRV_NAME "prestera" 15 16 #define PRESTERA_DEFAULT_VID 1 17 18 struct prestera_fw_rev { 19 u16 maj; 20 u16 min; 21 u16 sub; 22 }; 23 24 struct prestera_flood_domain { 25 struct prestera_switch *sw; 26 struct list_head flood_domain_port_list; 27 u32 idx; 28 }; 29 30 struct prestera_mdb_entry { 31 struct prestera_switch *sw; 32 struct prestera_flood_domain *flood_domain; 33 unsigned char addr[ETH_ALEN]; 34 u16 vid; 35 }; 36 37 struct prestera_flood_domain_port { 38 struct prestera_flood_domain *flood_domain; 39 struct net_device *dev; 40 struct list_head flood_domain_port_node; 41 u16 vid; 42 }; 43 44 struct prestera_port_stats { 45 u64 good_octets_received; 46 u64 bad_octets_received; 47 u64 mac_trans_error; 48 u64 broadcast_frames_received; 49 u64 multicast_frames_received; 50 u64 frames_64_octets; 51 u64 frames_65_to_127_octets; 52 u64 frames_128_to_255_octets; 53 u64 frames_256_to_511_octets; 54 u64 frames_512_to_1023_octets; 55 u64 frames_1024_to_max_octets; 56 u64 excessive_collision; 57 u64 multicast_frames_sent; 58 u64 broadcast_frames_sent; 59 u64 fc_sent; 60 u64 fc_received; 61 u64 buffer_overrun; 62 u64 undersize; 63 u64 fragments; 64 u64 oversize; 65 u64 jabber; 66 u64 rx_error_frame_received; 67 u64 bad_crc; 68 u64 collisions; 69 u64 late_collision; 70 u64 unicast_frames_received; 71 u64 unicast_frames_sent; 72 u64 sent_multiple; 73 u64 sent_deferred; 74 u64 good_octets_sent; 75 }; 76 77 #define PRESTERA_AP_PORT_MAX (10) 78 79 struct prestera_port_caps { 80 u64 supp_link_modes; 81 u8 supp_fec; 82 u8 type; 83 u8 transceiver; 84 }; 85 86 struct prestera_lag { 87 struct net_device *dev; 88 struct list_head members; 89 u16 member_count; 90 u16 lag_id; 91 }; 92 93 struct prestera_flow_block; 94 95 struct prestera_port_mac_state { 96 bool valid; 97 u32 mode; 98 u32 speed; 99 bool oper; 100 u8 duplex; 101 u8 fc; 102 u8 fec; 103 }; 104 105 struct prestera_port_phy_state { 106 u64 lmode_bmap; 107 struct { 108 bool pause; 109 bool asym_pause; 110 } remote_fc; 111 u8 mdix; 112 }; 113 114 struct prestera_port_mac_config { 115 u32 mode; 116 u32 speed; 117 bool admin; 118 u8 inband; 119 u8 duplex; 120 u8 fec; 121 }; 122 123 struct prestera_port_phy_config { 124 u32 mode; 125 bool admin; 126 u8 mdix; 127 }; 128 129 struct prestera_port { 130 struct net_device *dev; 131 struct prestera_switch *sw; 132 struct prestera_flow_block *ingress_flow_block; 133 struct prestera_flow_block *egress_flow_block; 134 struct devlink_port dl_port; 135 struct list_head lag_member; 136 struct prestera_lag *lag; 137 u32 id; 138 u32 hw_id; 139 u32 dev_id; 140 u16 fp_id; 141 u16 pvid; 142 bool autoneg; 143 u64 adver_link_modes; 144 u8 adver_fec; 145 struct prestera_port_caps caps; 146 struct list_head list; 147 struct list_head vlans_list; 148 struct { 149 struct prestera_port_stats stats; 150 struct delayed_work caching_dw; 151 } cached_hw_stats; 152 struct prestera_port_mac_config cfg_mac; 153 struct prestera_port_phy_config cfg_phy; 154 struct prestera_port_mac_state state_mac; 155 struct prestera_port_phy_state state_phy; 156 157 struct phylink_config phy_config; 158 struct phylink *phy_link; 159 struct phylink_pcs phylink_pcs; 160 161 /* protects state_mac */ 162 spinlock_t state_mac_lock; 163 }; 164 165 struct prestera_device { 166 struct device *dev; 167 u8 __iomem *ctl_regs; 168 u8 __iomem *pp_regs; 169 struct prestera_fw_rev fw_rev; 170 void *priv; 171 172 /* called by device driver to handle received packets */ 173 void (*recv_pkt)(struct prestera_device *dev); 174 175 /* called by device driver to pass event up to the higher layer */ 176 int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size); 177 178 /* called by higher layer to send request to the firmware */ 179 int (*send_req)(struct prestera_device *dev, int qid, void *in_msg, 180 size_t in_size, void *out_msg, size_t out_size, 181 unsigned int wait); 182 }; 183 184 enum prestera_event_type { 185 PRESTERA_EVENT_TYPE_UNSPEC, 186 187 PRESTERA_EVENT_TYPE_PORT, 188 PRESTERA_EVENT_TYPE_FDB, 189 PRESTERA_EVENT_TYPE_RXTX, 190 191 PRESTERA_EVENT_TYPE_MAX 192 }; 193 194 enum prestera_rxtx_event_id { 195 PRESTERA_RXTX_EVENT_UNSPEC, 196 PRESTERA_RXTX_EVENT_RCV_PKT, 197 }; 198 199 enum prestera_port_event_id { 200 PRESTERA_PORT_EVENT_UNSPEC, 201 PRESTERA_PORT_EVENT_MAC_STATE_CHANGED, 202 }; 203 204 struct prestera_port_event { 205 u32 port_id; 206 union { 207 struct { 208 u32 mode; 209 u32 speed; 210 u8 oper; 211 u8 duplex; 212 u8 fc; 213 u8 fec; 214 } mac; 215 struct { 216 u64 lmode_bmap; 217 struct { 218 bool pause; 219 bool asym_pause; 220 } remote_fc; 221 u8 mdix; 222 } phy; 223 } data; 224 }; 225 226 enum prestera_fdb_entry_type { 227 PRESTERA_FDB_ENTRY_TYPE_REG_PORT, 228 PRESTERA_FDB_ENTRY_TYPE_LAG, 229 PRESTERA_FDB_ENTRY_TYPE_MAX 230 }; 231 232 enum prestera_fdb_event_id { 233 PRESTERA_FDB_EVENT_UNSPEC, 234 PRESTERA_FDB_EVENT_LEARNED, 235 PRESTERA_FDB_EVENT_AGED, 236 }; 237 238 struct prestera_fdb_event { 239 enum prestera_fdb_entry_type type; 240 union { 241 u32 port_id; 242 u16 lag_id; 243 } dest; 244 u32 vid; 245 union { 246 u8 mac[ETH_ALEN]; 247 } data; 248 }; 249 250 struct prestera_event { 251 u16 id; 252 union { 253 struct prestera_port_event port_evt; 254 struct prestera_fdb_event fdb_evt; 255 }; 256 }; 257 258 enum prestera_if_type { 259 /* the interface is of port type (dev,port) */ 260 PRESTERA_IF_PORT_E = 0, 261 262 /* the interface is of lag type (lag-id) */ 263 PRESTERA_IF_LAG_E = 1, 264 265 /* the interface is of Vid type (vlan-id) */ 266 PRESTERA_IF_VID_E = 3, 267 }; 268 269 struct prestera_iface { 270 enum prestera_if_type type; 271 struct { 272 u32 hw_dev_num; 273 u32 port_num; 274 } dev_port; 275 u32 hw_dev_num; 276 u16 vr_id; 277 u16 lag_id; 278 u16 vlan_id; 279 }; 280 281 struct prestera_switchdev; 282 struct prestera_span; 283 struct prestera_rxtx; 284 struct prestera_trap_data; 285 struct prestera_acl; 286 287 struct prestera_switch { 288 struct prestera_device *dev; 289 struct prestera_switchdev *swdev; 290 struct prestera_rxtx *rxtx; 291 struct prestera_acl *acl; 292 struct prestera_span *span; 293 struct list_head event_handlers; 294 struct notifier_block netdev_nb; 295 struct prestera_trap_data *trap_data; 296 char base_mac[ETH_ALEN]; 297 struct list_head port_list; 298 rwlock_t port_list_lock; 299 u32 port_count; 300 u32 mtu_min; 301 u32 mtu_max; 302 u8 id; 303 struct device_node *np; 304 struct prestera_router *router; 305 struct prestera_lag *lags; 306 struct prestera_counter *counter; 307 u8 lag_member_max; 308 u8 lag_max; 309 u32 size_tbl_router_nexthop; 310 }; 311 312 struct prestera_router { 313 struct prestera_switch *sw; 314 struct list_head vr_list; 315 struct list_head rif_entry_list; 316 struct rhashtable nh_neigh_ht; 317 struct rhashtable nexthop_group_ht; 318 struct rhashtable fib_ht; 319 struct rhashtable kern_neigh_cache_ht; 320 struct rhashtable kern_fib_cache_ht; 321 struct notifier_block inetaddr_nb; 322 struct notifier_block inetaddr_valid_nb; 323 struct notifier_block fib_nb; 324 struct notifier_block netevent_nb; 325 u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */ 326 unsigned long nhgrp_hw_cache_kick; /* jiffies */ 327 struct { 328 struct delayed_work dw; 329 } neighs_update; 330 }; 331 332 struct prestera_rxtx_params { 333 bool use_sdma; 334 u32 map_addr; 335 }; 336 337 #define prestera_dev(sw) ((sw)->dev->dev) 338 339 static inline void prestera_write(const struct prestera_switch *sw, 340 unsigned int reg, u32 val) 341 { 342 writel(val, sw->dev->pp_regs + reg); 343 } 344 345 static inline u32 prestera_read(const struct prestera_switch *sw, 346 unsigned int reg) 347 { 348 return readl(sw->dev->pp_regs + reg); 349 } 350 351 int prestera_device_register(struct prestera_device *dev); 352 void prestera_device_unregister(struct prestera_device *dev); 353 354 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw, 355 u32 dev_id, u32 hw_id); 356 357 int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes); 358 359 int prestera_router_init(struct prestera_switch *sw); 360 void prestera_router_fini(struct prestera_switch *sw); 361 362 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id); 363 364 struct prestera_switch *prestera_switch_get(struct net_device *dev); 365 366 int prestera_port_cfg_mac_read(struct prestera_port *port, 367 struct prestera_port_mac_config *cfg); 368 369 int prestera_port_cfg_mac_write(struct prestera_port *port, 370 struct prestera_port_mac_config *cfg); 371 372 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev); 373 374 void prestera_queue_work(struct work_struct *work); 375 void prestera_queue_delayed_work(struct delayed_work *work, unsigned long delay); 376 void prestera_queue_drain(void); 377 378 int prestera_port_learning_set(struct prestera_port *port, bool learn_enable); 379 int prestera_port_uc_flood_set(struct prestera_port *port, bool flood); 380 int prestera_port_mc_flood_set(struct prestera_port *port, bool flood); 381 382 int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked); 383 384 int prestera_port_pvid_set(struct prestera_port *port, u16 vid); 385 386 bool prestera_netdev_check(const struct net_device *dev); 387 388 int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr); 389 390 bool prestera_port_is_lag_member(const struct prestera_port *port); 391 int prestera_lag_id(struct prestera_switch *sw, 392 struct net_device *lag_dev, u16 *lag_id); 393 394 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id); 395 396 u16 prestera_port_lag_id(const struct prestera_port *port); 397 398 struct prestera_mdb_entry * 399 prestera_mdb_entry_create(struct prestera_switch *sw, 400 const unsigned char *addr, u16 vid); 401 void prestera_mdb_entry_destroy(struct prestera_mdb_entry *mdb_entry); 402 403 struct prestera_flood_domain * 404 prestera_flood_domain_create(struct prestera_switch *sw); 405 void prestera_flood_domain_destroy(struct prestera_flood_domain *flood_domain); 406 407 int 408 prestera_flood_domain_port_create(struct prestera_flood_domain *flood_domain, 409 struct net_device *dev, 410 u16 vid); 411 void 412 prestera_flood_domain_port_destroy(struct prestera_flood_domain_port *port); 413 struct prestera_flood_domain_port * 414 prestera_flood_domain_port_find(struct prestera_flood_domain *flood_domain, 415 struct net_device *dev, u16 vid); 416 417 #endif /* _PRESTERA_H_ */ 418