internal.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright Gavin Shan, IBM Corporation 2016.
  4. */
  5. #ifndef __NCSI_INTERNAL_H__
  6. #define __NCSI_INTERNAL_H__
  7. enum {
  8. NCSI_CAP_BASE = 0,
  9. NCSI_CAP_GENERIC = 0,
  10. NCSI_CAP_BC,
  11. NCSI_CAP_MC,
  12. NCSI_CAP_BUFFER,
  13. NCSI_CAP_AEN,
  14. NCSI_CAP_VLAN,
  15. NCSI_CAP_MAX
  16. };
  17. enum {
  18. NCSI_CAP_GENERIC_HWA = 0x01, /* HW arbitration */
  19. NCSI_CAP_GENERIC_HDS = 0x02, /* HNC driver status change */
  20. NCSI_CAP_GENERIC_FC = 0x04, /* HNC to MC flow control */
  21. NCSI_CAP_GENERIC_FC1 = 0x08, /* MC to HNC flow control */
  22. NCSI_CAP_GENERIC_MC = 0x10, /* Global MC filtering */
  23. NCSI_CAP_GENERIC_HWA_UNKNOWN = 0x00, /* Unknown HW arbitration */
  24. NCSI_CAP_GENERIC_HWA_SUPPORT = 0x20, /* Supported HW arbitration */
  25. NCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 0x40, /* No HW arbitration */
  26. NCSI_CAP_GENERIC_HWA_RESERVED = 0x60, /* Reserved HW arbitration */
  27. NCSI_CAP_GENERIC_HWA_MASK = 0x60, /* Mask for HW arbitration */
  28. NCSI_CAP_GENERIC_MASK = 0x7f,
  29. NCSI_CAP_BC_ARP = 0x01, /* ARP packet filtering */
  30. NCSI_CAP_BC_DHCPC = 0x02, /* DHCP client filtering */
  31. NCSI_CAP_BC_DHCPS = 0x04, /* DHCP server filtering */
  32. NCSI_CAP_BC_NETBIOS = 0x08, /* NetBIOS packet filtering */
  33. NCSI_CAP_BC_MASK = 0x0f,
  34. NCSI_CAP_MC_IPV6_NEIGHBOR = 0x01, /* IPv6 neighbor filtering */
  35. NCSI_CAP_MC_IPV6_ROUTER = 0x02, /* IPv6 router filering */
  36. NCSI_CAP_MC_DHCPV6_RELAY = 0x04, /* DHCPv6 relay / server MC */
  37. NCSI_CAP_MC_DHCPV6_WELL_KNOWN = 0x08, /* DHCPv6 well-known MC */
  38. NCSI_CAP_MC_IPV6_MLD = 0x10, /* IPv6 MLD filtering */
  39. NCSI_CAP_MC_IPV6_NEIGHBOR_S = 0x20, /* IPv6 neighbour filtering */
  40. NCSI_CAP_MC_MASK = 0x3f,
  41. NCSI_CAP_AEN_LSC = 0x01, /* Link status change */
  42. NCSI_CAP_AEN_CR = 0x02, /* Configuration required */
  43. NCSI_CAP_AEN_HDS = 0x04, /* HNC driver status */
  44. NCSI_CAP_AEN_MASK = 0x07,
  45. NCSI_CAP_VLAN_ONLY = 0x01, /* Filter VLAN packet only */
  46. NCSI_CAP_VLAN_NO = 0x02, /* Filter VLAN and non-VLAN */
  47. NCSI_CAP_VLAN_ANY = 0x04, /* Filter Any-and-non-VLAN */
  48. NCSI_CAP_VLAN_MASK = 0x07
  49. };
  50. enum {
  51. NCSI_MODE_BASE = 0,
  52. NCSI_MODE_ENABLE = 0,
  53. NCSI_MODE_TX_ENABLE,
  54. NCSI_MODE_LINK,
  55. NCSI_MODE_VLAN,
  56. NCSI_MODE_BC,
  57. NCSI_MODE_MC,
  58. NCSI_MODE_AEN,
  59. NCSI_MODE_FC,
  60. NCSI_MODE_MAX
  61. };
  62. /* Supported media status bits for Mellanox Mac affinity command.
  63. * Bit (0-2) for different protocol support; Bit 1 for RBT support,
  64. * bit 1 for SMBUS support and bit 2 for PCIE support. Bit (3-5)
  65. * for different protocol availability. Bit 4 for RBT, bit 4 for
  66. * SMBUS and bit 5 for PCIE.
  67. */
  68. enum {
  69. MLX_MC_RBT_SUPPORT = 0x01, /* MC supports RBT */
  70. MLX_MC_RBT_AVL = 0x08, /* RBT medium is available */
  71. };
  72. /* OEM Vendor Manufacture ID */
  73. #define NCSI_OEM_MFR_MLX_ID 0x8119
  74. #define NCSI_OEM_MFR_BCM_ID 0x113d
  75. #define NCSI_OEM_MFR_INTEL_ID 0x157
  76. /* Intel specific OEM command */
  77. #define NCSI_OEM_INTEL_CMD_GMA 0x06 /* CMD ID for Get MAC */
  78. #define NCSI_OEM_INTEL_CMD_KEEP_PHY 0x20 /* CMD ID for Keep PHY up */
  79. /* Broadcom specific OEM Command */
  80. #define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */
  81. /* Mellanox specific OEM Command */
  82. #define NCSI_OEM_MLX_CMD_GMA 0x00 /* CMD ID for Get MAC */
  83. #define NCSI_OEM_MLX_CMD_GMA_PARAM 0x1b /* Parameter for GMA */
  84. #define NCSI_OEM_MLX_CMD_SMAF 0x01 /* CMD ID for Set MC Affinity */
  85. #define NCSI_OEM_MLX_CMD_SMAF_PARAM 0x07 /* Parameter for SMAF */
  86. /* OEM Command payload lengths*/
  87. #define NCSI_OEM_INTEL_CMD_GMA_LEN 5
  88. #define NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN 7
  89. #define NCSI_OEM_BCM_CMD_GMA_LEN 12
  90. #define NCSI_OEM_MLX_CMD_GMA_LEN 8
  91. #define NCSI_OEM_MLX_CMD_SMAF_LEN 60
  92. /* Offset in OEM request */
  93. #define MLX_SMAF_MAC_ADDR_OFFSET 8 /* Offset for MAC in SMAF */
  94. #define MLX_SMAF_MED_SUPPORT_OFFSET 14 /* Offset for medium in SMAF */
  95. /* Mac address offset in OEM response */
  96. #define BCM_MAC_ADDR_OFFSET 28
  97. #define MLX_MAC_ADDR_OFFSET 8
  98. #define INTEL_MAC_ADDR_OFFSET 1
  99. struct ncsi_channel_version {
  100. u32 version; /* Supported BCD encoded NCSI version */
  101. u32 alpha2; /* Supported BCD encoded NCSI version */
  102. u8 fw_name[12]; /* Firmware name string */
  103. u32 fw_version; /* Firmware version */
  104. u16 pci_ids[4]; /* PCI identification */
  105. u32 mf_id; /* Manufacture ID */
  106. };
  107. struct ncsi_channel_cap {
  108. u32 index; /* Index of channel capabilities */
  109. u32 cap; /* NCSI channel capability */
  110. };
  111. struct ncsi_channel_mode {
  112. u32 index; /* Index of channel modes */
  113. u32 enable; /* Enabled or disabled */
  114. u32 size; /* Valid entries in ncm_data[] */
  115. u32 data[8]; /* Data entries */
  116. };
  117. struct ncsi_channel_mac_filter {
  118. u8 n_uc;
  119. u8 n_mc;
  120. u8 n_mixed;
  121. u64 bitmap;
  122. unsigned char *addrs;
  123. };
  124. struct ncsi_channel_vlan_filter {
  125. u8 n_vids;
  126. u64 bitmap;
  127. u16 *vids;
  128. };
  129. struct ncsi_channel_stats {
  130. u32 hnc_cnt_hi; /* Counter cleared */
  131. u32 hnc_cnt_lo; /* Counter cleared */
  132. u32 hnc_rx_bytes; /* Rx bytes */
  133. u32 hnc_tx_bytes; /* Tx bytes */
  134. u32 hnc_rx_uc_pkts; /* Rx UC packets */
  135. u32 hnc_rx_mc_pkts; /* Rx MC packets */
  136. u32 hnc_rx_bc_pkts; /* Rx BC packets */
  137. u32 hnc_tx_uc_pkts; /* Tx UC packets */
  138. u32 hnc_tx_mc_pkts; /* Tx MC packets */
  139. u32 hnc_tx_bc_pkts; /* Tx BC packets */
  140. u32 hnc_fcs_err; /* FCS errors */
  141. u32 hnc_align_err; /* Alignment errors */
  142. u32 hnc_false_carrier; /* False carrier detection */
  143. u32 hnc_runt_pkts; /* Rx runt packets */
  144. u32 hnc_jabber_pkts; /* Rx jabber packets */
  145. u32 hnc_rx_pause_xon; /* Rx pause XON frames */
  146. u32 hnc_rx_pause_xoff; /* Rx XOFF frames */
  147. u32 hnc_tx_pause_xon; /* Tx XON frames */
  148. u32 hnc_tx_pause_xoff; /* Tx XOFF frames */
  149. u32 hnc_tx_s_collision; /* Single collision frames */
  150. u32 hnc_tx_m_collision; /* Multiple collision frames */
  151. u32 hnc_l_collision; /* Late collision frames */
  152. u32 hnc_e_collision; /* Excessive collision frames */
  153. u32 hnc_rx_ctl_frames; /* Rx control frames */
  154. u32 hnc_rx_64_frames; /* Rx 64-bytes frames */
  155. u32 hnc_rx_127_frames; /* Rx 65-127 bytes frames */
  156. u32 hnc_rx_255_frames; /* Rx 128-255 bytes frames */
  157. u32 hnc_rx_511_frames; /* Rx 256-511 bytes frames */
  158. u32 hnc_rx_1023_frames; /* Rx 512-1023 bytes frames */
  159. u32 hnc_rx_1522_frames; /* Rx 1024-1522 bytes frames */
  160. u32 hnc_rx_9022_frames; /* Rx 1523-9022 bytes frames */
  161. u32 hnc_tx_64_frames; /* Tx 64-bytes frames */
  162. u32 hnc_tx_127_frames; /* Tx 65-127 bytes frames */
  163. u32 hnc_tx_255_frames; /* Tx 128-255 bytes frames */
  164. u32 hnc_tx_511_frames; /* Tx 256-511 bytes frames */
  165. u32 hnc_tx_1023_frames; /* Tx 512-1023 bytes frames */
  166. u32 hnc_tx_1522_frames; /* Tx 1024-1522 bytes frames */
  167. u32 hnc_tx_9022_frames; /* Tx 1523-9022 bytes frames */
  168. u32 hnc_rx_valid_bytes; /* Rx valid bytes */
  169. u32 hnc_rx_runt_pkts; /* Rx error runt packets */
  170. u32 hnc_rx_jabber_pkts; /* Rx error jabber packets */
  171. u32 ncsi_rx_cmds; /* Rx NCSI commands */
  172. u32 ncsi_dropped_cmds; /* Dropped commands */
  173. u32 ncsi_cmd_type_errs; /* Command type errors */
  174. u32 ncsi_cmd_csum_errs; /* Command checksum errors */
  175. u32 ncsi_rx_pkts; /* Rx NCSI packets */
  176. u32 ncsi_tx_pkts; /* Tx NCSI packets */
  177. u32 ncsi_tx_aen_pkts; /* Tx AEN packets */
  178. u32 pt_tx_pkts; /* Tx packets */
  179. u32 pt_tx_dropped; /* Tx dropped packets */
  180. u32 pt_tx_channel_err; /* Tx channel errors */
  181. u32 pt_tx_us_err; /* Tx undersize errors */
  182. u32 pt_rx_pkts; /* Rx packets */
  183. u32 pt_rx_dropped; /* Rx dropped packets */
  184. u32 pt_rx_channel_err; /* Rx channel errors */
  185. u32 pt_rx_us_err; /* Rx undersize errors */
  186. u32 pt_rx_os_err; /* Rx oversize errors */
  187. };
  188. struct ncsi_dev_priv;
  189. struct ncsi_package;
  190. #define NCSI_PACKAGE_SHIFT 5
  191. #define NCSI_PACKAGE_INDEX(c) (((c) >> NCSI_PACKAGE_SHIFT) & 0x7)
  192. #define NCSI_RESERVED_CHANNEL 0x1f
  193. #define NCSI_CHANNEL_INDEX(c) ((c) & ((1 << NCSI_PACKAGE_SHIFT) - 1))
  194. #define NCSI_TO_CHANNEL(p, c) (((p) << NCSI_PACKAGE_SHIFT) | (c))
  195. #define NCSI_MAX_PACKAGE 8
  196. #define NCSI_MAX_CHANNEL 32
  197. struct ncsi_channel {
  198. unsigned char id;
  199. int state;
  200. #define NCSI_CHANNEL_INACTIVE 1
  201. #define NCSI_CHANNEL_ACTIVE 2
  202. #define NCSI_CHANNEL_INVISIBLE 3
  203. bool reconfigure_needed;
  204. spinlock_t lock; /* Protect filters etc */
  205. struct ncsi_package *package;
  206. struct ncsi_channel_version version;
  207. struct ncsi_channel_cap caps[NCSI_CAP_MAX];
  208. struct ncsi_channel_mode modes[NCSI_MODE_MAX];
  209. /* Filtering Settings */
  210. struct ncsi_channel_mac_filter mac_filter;
  211. struct ncsi_channel_vlan_filter vlan_filter;
  212. struct ncsi_channel_stats stats;
  213. struct {
  214. struct timer_list timer;
  215. bool enabled;
  216. unsigned int state;
  217. #define NCSI_CHANNEL_MONITOR_START 0
  218. #define NCSI_CHANNEL_MONITOR_RETRY 1
  219. #define NCSI_CHANNEL_MONITOR_WAIT 2
  220. #define NCSI_CHANNEL_MONITOR_WAIT_MAX 5
  221. } monitor;
  222. struct list_head node;
  223. struct list_head link;
  224. };
  225. struct ncsi_package {
  226. unsigned char id; /* NCSI 3-bits package ID */
  227. unsigned char uuid[16]; /* UUID */
  228. struct ncsi_dev_priv *ndp; /* NCSI device */
  229. spinlock_t lock; /* Protect the package */
  230. unsigned int channel_num; /* Number of channels */
  231. struct list_head channels; /* List of channels */
  232. struct list_head node; /* Form list of packages */
  233. bool multi_channel; /* Enable multiple channels */
  234. u32 channel_whitelist; /* Channels to configure */
  235. struct ncsi_channel *preferred_channel; /* Primary channel */
  236. };
  237. struct ncsi_request {
  238. unsigned char id; /* Request ID - 0 to 255 */
  239. bool used; /* Request that has been assigned */
  240. unsigned int flags; /* NCSI request property */
  241. #define NCSI_REQ_FLAG_EVENT_DRIVEN 1
  242. #define NCSI_REQ_FLAG_NETLINK_DRIVEN 2
  243. struct ncsi_dev_priv *ndp; /* Associated NCSI device */
  244. struct sk_buff *cmd; /* Associated NCSI command packet */
  245. struct sk_buff *rsp; /* Associated NCSI response packet */
  246. struct timer_list timer; /* Timer on waiting for response */
  247. bool enabled; /* Time has been enabled or not */
  248. u32 snd_seq; /* netlink sending sequence number */
  249. u32 snd_portid; /* netlink portid of sender */
  250. struct nlmsghdr nlhdr; /* netlink message header */
  251. };
  252. enum {
  253. ncsi_dev_state_major = 0xff00,
  254. ncsi_dev_state_minor = 0x00ff,
  255. ncsi_dev_state_probe_deselect = 0x0201,
  256. ncsi_dev_state_probe_package,
  257. ncsi_dev_state_probe_channel,
  258. ncsi_dev_state_probe_mlx_gma,
  259. ncsi_dev_state_probe_mlx_smaf,
  260. ncsi_dev_state_probe_cis,
  261. ncsi_dev_state_probe_keep_phy,
  262. ncsi_dev_state_probe_gvi,
  263. ncsi_dev_state_probe_gc,
  264. ncsi_dev_state_probe_gls,
  265. ncsi_dev_state_probe_dp,
  266. ncsi_dev_state_config_sp = 0x0301,
  267. ncsi_dev_state_config_cis,
  268. ncsi_dev_state_config_oem_gma,
  269. ncsi_dev_state_config_clear_vids,
  270. ncsi_dev_state_config_svf,
  271. ncsi_dev_state_config_ev,
  272. ncsi_dev_state_config_sma,
  273. ncsi_dev_state_config_ebf,
  274. ncsi_dev_state_config_dgmf,
  275. ncsi_dev_state_config_ecnt,
  276. ncsi_dev_state_config_ec,
  277. ncsi_dev_state_config_ae,
  278. ncsi_dev_state_config_gls,
  279. ncsi_dev_state_config_done,
  280. ncsi_dev_state_suspend_select = 0x0401,
  281. ncsi_dev_state_suspend_gls,
  282. ncsi_dev_state_suspend_dcnt,
  283. ncsi_dev_state_suspend_dc,
  284. ncsi_dev_state_suspend_deselect,
  285. ncsi_dev_state_suspend_done
  286. };
  287. struct vlan_vid {
  288. struct list_head list;
  289. __be16 proto;
  290. u16 vid;
  291. };
  292. struct ncsi_dev_priv {
  293. struct ncsi_dev ndev; /* Associated NCSI device */
  294. unsigned int flags; /* NCSI device flags */
  295. #define NCSI_DEV_PROBED 1 /* Finalized NCSI topology */
  296. #define NCSI_DEV_HWA 2 /* Enabled HW arbitration */
  297. #define NCSI_DEV_RESHUFFLE 4
  298. #define NCSI_DEV_RESET 8 /* Reset state of NC */
  299. unsigned int gma_flag; /* OEM GMA flag */
  300. spinlock_t lock; /* Protect the NCSI device */
  301. unsigned int package_probe_id;/* Current ID during probe */
  302. unsigned int package_num; /* Number of packages */
  303. struct list_head packages; /* List of packages */
  304. struct ncsi_channel *hot_channel; /* Channel was ever active */
  305. struct ncsi_request requests[256]; /* Request table */
  306. unsigned int request_id; /* Last used request ID */
  307. #define NCSI_REQ_START_IDX 1
  308. unsigned int pending_req_num; /* Number of pending requests */
  309. struct ncsi_package *active_package; /* Currently handled package */
  310. struct ncsi_channel *active_channel; /* Currently handled channel */
  311. struct list_head channel_queue; /* Config queue of channels */
  312. struct work_struct work; /* For channel management */
  313. struct packet_type ptype; /* NCSI packet Rx handler */
  314. struct list_head node; /* Form NCSI device list */
  315. #define NCSI_MAX_VLAN_VIDS 15
  316. struct list_head vlan_vids; /* List of active VLAN IDs */
  317. bool multi_package; /* Enable multiple packages */
  318. bool mlx_multi_host; /* Enable multi host Mellanox */
  319. u32 package_whitelist; /* Packages to configure */
  320. };
  321. struct ncsi_cmd_arg {
  322. struct ncsi_dev_priv *ndp; /* Associated NCSI device */
  323. unsigned char type; /* Command in the NCSI packet */
  324. unsigned char id; /* Request ID (sequence number) */
  325. unsigned char package; /* Destination package ID */
  326. unsigned char channel; /* Destination channel ID or 0x1f */
  327. unsigned short payload; /* Command packet payload length */
  328. unsigned int req_flags; /* NCSI request properties */
  329. union {
  330. unsigned char bytes[16]; /* Command packet specific data */
  331. unsigned short words[8];
  332. unsigned int dwords[4];
  333. };
  334. unsigned char *data; /* NCSI OEM data */
  335. struct genl_info *info; /* Netlink information */
  336. };
  337. extern struct list_head ncsi_dev_list;
  338. extern spinlock_t ncsi_dev_lock;
  339. #define TO_NCSI_DEV_PRIV(nd) \
  340. container_of(nd, struct ncsi_dev_priv, ndev)
  341. #define NCSI_FOR_EACH_DEV(ndp) \
  342. list_for_each_entry_rcu(ndp, &ncsi_dev_list, node)
  343. #define NCSI_FOR_EACH_PACKAGE(ndp, np) \
  344. list_for_each_entry_rcu(np, &ndp->packages, node)
  345. #define NCSI_FOR_EACH_CHANNEL(np, nc) \
  346. list_for_each_entry_rcu(nc, &np->channels, node)
  347. /* Resources */
  348. int ncsi_reset_dev(struct ncsi_dev *nd);
  349. void ncsi_start_channel_monitor(struct ncsi_channel *nc);
  350. void ncsi_stop_channel_monitor(struct ncsi_channel *nc);
  351. struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np,
  352. unsigned char id);
  353. struct ncsi_channel *ncsi_add_channel(struct ncsi_package *np,
  354. unsigned char id);
  355. struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp,
  356. unsigned char id);
  357. struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp,
  358. unsigned char id);
  359. void ncsi_remove_package(struct ncsi_package *np);
  360. void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp,
  361. unsigned char id,
  362. struct ncsi_package **np,
  363. struct ncsi_channel **nc);
  364. struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp,
  365. unsigned int req_flags);
  366. void ncsi_free_request(struct ncsi_request *nr);
  367. struct ncsi_dev *ncsi_find_dev(struct net_device *dev);
  368. int ncsi_process_next_channel(struct ncsi_dev_priv *ndp);
  369. bool ncsi_channel_has_link(struct ncsi_channel *channel);
  370. bool ncsi_channel_is_last(struct ncsi_dev_priv *ndp,
  371. struct ncsi_channel *channel);
  372. int ncsi_update_tx_channel(struct ncsi_dev_priv *ndp,
  373. struct ncsi_package *np,
  374. struct ncsi_channel *disable,
  375. struct ncsi_channel *enable);
  376. /* Packet handlers */
  377. u32 ncsi_calculate_checksum(unsigned char *data, int len);
  378. int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca);
  379. int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
  380. struct packet_type *pt, struct net_device *orig_dev);
  381. int ncsi_aen_handler(struct ncsi_dev_priv *ndp, struct sk_buff *skb);
  382. #endif /* __NCSI_INTERNAL_H__ */