prestera.h 9.5 KB

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