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