internal.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * Copyright Gavin Shan, IBM Corporation 2016.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. */
  9. #ifndef __NCSI_INTERNAL_H__
  10. #define __NCSI_INTERNAL_H__
  11. enum {
  12. NCSI_CAP_BASE = 0,
  13. NCSI_CAP_GENERIC = 0,
  14. NCSI_CAP_BC,
  15. NCSI_CAP_MC,
  16. NCSI_CAP_BUFFER,
  17. NCSI_CAP_AEN,
  18. NCSI_CAP_VLAN,
  19. NCSI_CAP_MAX
  20. };
  21. enum {
  22. NCSI_CAP_GENERIC_HWA = 0x01, /* HW arbitration */
  23. NCSI_CAP_GENERIC_HDS = 0x02, /* HNC driver status change */
  24. NCSI_CAP_GENERIC_FC = 0x04, /* HNC to MC flow control */
  25. NCSI_CAP_GENERIC_FC1 = 0x08, /* MC to HNC flow control */
  26. NCSI_CAP_GENERIC_MC = 0x10, /* Global MC filtering */
  27. NCSI_CAP_GENERIC_HWA_UNKNOWN = 0x00, /* Unknown HW arbitration */
  28. NCSI_CAP_GENERIC_HWA_SUPPORT = 0x20, /* Supported HW arbitration */
  29. NCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 0x40, /* No HW arbitration */
  30. NCSI_CAP_GENERIC_HWA_RESERVED = 0x60, /* Reserved HW arbitration */
  31. NCSI_CAP_GENERIC_HWA_MASK = 0x60, /* Mask for HW arbitration */
  32. NCSI_CAP_GENERIC_MASK = 0x7f,
  33. NCSI_CAP_BC_ARP = 0x01, /* ARP packet filtering */
  34. NCSI_CAP_BC_DHCPC = 0x02, /* DHCP client filtering */
  35. NCSI_CAP_BC_DHCPS = 0x04, /* DHCP server filtering */
  36. NCSI_CAP_BC_NETBIOS = 0x08, /* NetBIOS packet filtering */
  37. NCSI_CAP_BC_MASK = 0x0f,
  38. NCSI_CAP_MC_IPV6_NEIGHBOR = 0x01, /* IPv6 neighbor filtering */
  39. NCSI_CAP_MC_IPV6_ROUTER = 0x02, /* IPv6 router filering */
  40. NCSI_CAP_MC_DHCPV6_RELAY = 0x04, /* DHCPv6 relay / server MC */
  41. NCSI_CAP_MC_DHCPV6_WELL_KNOWN = 0x08, /* DHCPv6 well-known MC */
  42. NCSI_CAP_MC_IPV6_MLD = 0x10, /* IPv6 MLD filtering */
  43. NCSI_CAP_MC_IPV6_NEIGHBOR_S = 0x20, /* IPv6 neighbour filtering */
  44. NCSI_CAP_MC_MASK = 0x3f,
  45. NCSI_CAP_AEN_LSC = 0x01, /* Link status change */
  46. NCSI_CAP_AEN_CR = 0x02, /* Configuration required */
  47. NCSI_CAP_AEN_HDS = 0x04, /* HNC driver status */
  48. NCSI_CAP_AEN_MASK = 0x07,
  49. NCSI_CAP_VLAN_ONLY = 0x01, /* Filter VLAN packet only */
  50. NCSI_CAP_VLAN_NO = 0x02, /* Filter VLAN and non-VLAN */
  51. NCSI_CAP_VLAN_ANY = 0x04, /* Filter Any-and-non-VLAN */
  52. NCSI_CAP_VLAN_MASK = 0x07
  53. };
  54. enum {
  55. NCSI_MODE_BASE = 0,
  56. NCSI_MODE_ENABLE = 0,
  57. NCSI_MODE_TX_ENABLE,
  58. NCSI_MODE_LINK,
  59. NCSI_MODE_VLAN,
  60. NCSI_MODE_BC,
  61. NCSI_MODE_MC,
  62. NCSI_MODE_AEN,
  63. NCSI_MODE_FC,
  64. NCSI_MODE_MAX
  65. };
  66. struct ncsi_channel_version {
  67. u32 version; /* Supported BCD encoded NCSI version */
  68. u32 alpha2; /* Supported BCD encoded NCSI version */
  69. u8 fw_name[12]; /* Firware name string */
  70. u32 fw_version; /* Firmware version */
  71. u16 pci_ids[4]; /* PCI identification */
  72. u32 mf_id; /* Manufacture ID */
  73. };
  74. struct ncsi_channel_cap {
  75. u32 index; /* Index of channel capabilities */
  76. u32 cap; /* NCSI channel capability */
  77. };
  78. struct ncsi_channel_mode {
  79. u32 index; /* Index of channel modes */
  80. u32 enable; /* Enabled or disabled */
  81. u32 size; /* Valid entries in ncm_data[] */
  82. u32 data[8]; /* Data entries */
  83. };
  84. struct ncsi_channel_mac_filter {
  85. u8 n_uc;
  86. u8 n_mc;
  87. u8 n_mixed;
  88. u64 bitmap;
  89. unsigned char *addrs;
  90. };
  91. struct ncsi_channel_vlan_filter {
  92. u8 n_vids;
  93. u64 bitmap;
  94. u16 *vids;
  95. };
  96. struct ncsi_channel_stats {
  97. u32 hnc_cnt_hi; /* Counter cleared */
  98. u32 hnc_cnt_lo; /* Counter cleared */
  99. u32 hnc_rx_bytes; /* Rx bytes */
  100. u32 hnc_tx_bytes; /* Tx bytes */
  101. u32 hnc_rx_uc_pkts; /* Rx UC packets */
  102. u32 hnc_rx_mc_pkts; /* Rx MC packets */
  103. u32 hnc_rx_bc_pkts; /* Rx BC packets */
  104. u32 hnc_tx_uc_pkts; /* Tx UC packets */
  105. u32 hnc_tx_mc_pkts; /* Tx MC packets */
  106. u32 hnc_tx_bc_pkts; /* Tx BC packets */
  107. u32 hnc_fcs_err; /* FCS errors */
  108. u32 hnc_align_err; /* Alignment errors */
  109. u32 hnc_false_carrier; /* False carrier detection */
  110. u32 hnc_runt_pkts; /* Rx runt packets */
  111. u32 hnc_jabber_pkts; /* Rx jabber packets */
  112. u32 hnc_rx_pause_xon; /* Rx pause XON frames */
  113. u32 hnc_rx_pause_xoff; /* Rx XOFF frames */
  114. u32 hnc_tx_pause_xon; /* Tx XON frames */
  115. u32 hnc_tx_pause_xoff; /* Tx XOFF frames */
  116. u32 hnc_tx_s_collision; /* Single collision frames */
  117. u32 hnc_tx_m_collision; /* Multiple collision frames */
  118. u32 hnc_l_collision; /* Late collision frames */
  119. u32 hnc_e_collision; /* Excessive collision frames */
  120. u32 hnc_rx_ctl_frames; /* Rx control frames */
  121. u32 hnc_rx_64_frames; /* Rx 64-bytes frames */
  122. u32 hnc_rx_127_frames; /* Rx 65-127 bytes frames */
  123. u32 hnc_rx_255_frames; /* Rx 128-255 bytes frames */
  124. u32 hnc_rx_511_frames; /* Rx 256-511 bytes frames */
  125. u32 hnc_rx_1023_frames; /* Rx 512-1023 bytes frames */
  126. u32 hnc_rx_1522_frames; /* Rx 1024-1522 bytes frames */
  127. u32 hnc_rx_9022_frames; /* Rx 1523-9022 bytes frames */
  128. u32 hnc_tx_64_frames; /* Tx 64-bytes frames */
  129. u32 hnc_tx_127_frames; /* Tx 65-127 bytes frames */
  130. u32 hnc_tx_255_frames; /* Tx 128-255 bytes frames */
  131. u32 hnc_tx_511_frames; /* Tx 256-511 bytes frames */
  132. u32 hnc_tx_1023_frames; /* Tx 512-1023 bytes frames */
  133. u32 hnc_tx_1522_frames; /* Tx 1024-1522 bytes frames */
  134. u32 hnc_tx_9022_frames; /* Tx 1523-9022 bytes frames */
  135. u32 hnc_rx_valid_bytes; /* Rx valid bytes */
  136. u32 hnc_rx_runt_pkts; /* Rx error runt packets */
  137. u32 hnc_rx_jabber_pkts; /* Rx error jabber packets */
  138. u32 ncsi_rx_cmds; /* Rx NCSI commands */
  139. u32 ncsi_dropped_cmds; /* Dropped commands */
  140. u32 ncsi_cmd_type_errs; /* Command type errors */
  141. u32 ncsi_cmd_csum_errs; /* Command checksum errors */
  142. u32 ncsi_rx_pkts; /* Rx NCSI packets */
  143. u32 ncsi_tx_pkts; /* Tx NCSI packets */
  144. u32 ncsi_tx_aen_pkts; /* Tx AEN packets */
  145. u32 pt_tx_pkts; /* Tx packets */
  146. u32 pt_tx_dropped; /* Tx dropped packets */
  147. u32 pt_tx_channel_err; /* Tx channel errors */
  148. u32 pt_tx_us_err; /* Tx undersize errors */
  149. u32 pt_rx_pkts; /* Rx packets */
  150. u32 pt_rx_dropped; /* Rx dropped packets */
  151. u32 pt_rx_channel_err; /* Rx channel errors */
  152. u32 pt_rx_us_err; /* Rx undersize errors */
  153. u32 pt_rx_os_err; /* Rx oversize errors */
  154. };
  155. struct ncsi_dev_priv;
  156. struct ncsi_package;
  157. #define NCSI_PACKAGE_SHIFT 5
  158. #define NCSI_PACKAGE_INDEX(c) (((c) >> NCSI_PACKAGE_SHIFT) & 0x7)
  159. #define NCSI_RESERVED_CHANNEL 0x1f
  160. #define NCSI_CHANNEL_INDEX(c) ((c) & ((1 << NCSI_PACKAGE_SHIFT) - 1))
  161. #define NCSI_TO_CHANNEL(p, c) (((p) << NCSI_PACKAGE_SHIFT) | (c))
  162. struct ncsi_channel {
  163. unsigned char id;
  164. int state;
  165. #define NCSI_CHANNEL_INACTIVE 1
  166. #define NCSI_CHANNEL_ACTIVE 2
  167. #define NCSI_CHANNEL_INVISIBLE 3
  168. bool reconfigure_needed;
  169. spinlock_t lock; /* Protect filters etc */
  170. struct ncsi_package *package;
  171. struct ncsi_channel_version version;
  172. struct ncsi_channel_cap caps[NCSI_CAP_MAX];
  173. struct ncsi_channel_mode modes[NCSI_MODE_MAX];
  174. /* Filtering Settings */
  175. struct ncsi_channel_mac_filter mac_filter;
  176. struct ncsi_channel_vlan_filter vlan_filter;
  177. struct ncsi_channel_stats stats;
  178. struct {
  179. struct timer_list timer;
  180. bool enabled;
  181. unsigned int state;
  182. #define NCSI_CHANNEL_MONITOR_START 0
  183. #define NCSI_CHANNEL_MONITOR_RETRY 1
  184. #define NCSI_CHANNEL_MONITOR_WAIT 2
  185. #define NCSI_CHANNEL_MONITOR_WAIT_MAX 5
  186. } monitor;
  187. struct list_head node;
  188. struct list_head link;
  189. };
  190. struct ncsi_package {
  191. unsigned char id; /* NCSI 3-bits package ID */
  192. unsigned char uuid[16]; /* UUID */
  193. struct ncsi_dev_priv *ndp; /* NCSI device */
  194. spinlock_t lock; /* Protect the package */
  195. unsigned int channel_num; /* Number of channels */
  196. struct list_head channels; /* List of chanels */
  197. struct list_head node; /* Form list of packages */
  198. };
  199. struct ncsi_request {
  200. unsigned char id; /* Request ID - 0 to 255 */
  201. bool used; /* Request that has been assigned */
  202. unsigned int flags; /* NCSI request property */
  203. #define NCSI_REQ_FLAG_EVENT_DRIVEN 1
  204. struct ncsi_dev_priv *ndp; /* Associated NCSI device */
  205. struct sk_buff *cmd; /* Associated NCSI command packet */
  206. struct sk_buff *rsp; /* Associated NCSI response packet */
  207. struct timer_list timer; /* Timer on waiting for response */
  208. bool enabled; /* Time has been enabled or not */
  209. };
  210. enum {
  211. ncsi_dev_state_major = 0xff00,
  212. ncsi_dev_state_minor = 0x00ff,
  213. ncsi_dev_state_probe_deselect = 0x0201,
  214. ncsi_dev_state_probe_package,
  215. ncsi_dev_state_probe_channel,
  216. ncsi_dev_state_probe_cis,
  217. ncsi_dev_state_probe_gvi,
  218. ncsi_dev_state_probe_gc,
  219. ncsi_dev_state_probe_gls,
  220. ncsi_dev_state_probe_dp,
  221. ncsi_dev_state_config_sp = 0x0301,
  222. ncsi_dev_state_config_cis,
  223. ncsi_dev_state_config_clear_vids,
  224. ncsi_dev_state_config_svf,
  225. ncsi_dev_state_config_ev,
  226. ncsi_dev_state_config_sma,
  227. ncsi_dev_state_config_ebf,
  228. #if IS_ENABLED(CONFIG_IPV6)
  229. ncsi_dev_state_config_egmf,
  230. #endif
  231. ncsi_dev_state_config_ecnt,
  232. ncsi_dev_state_config_ec,
  233. ncsi_dev_state_config_ae,
  234. ncsi_dev_state_config_gls,
  235. ncsi_dev_state_config_done,
  236. ncsi_dev_state_suspend_select = 0x0401,
  237. ncsi_dev_state_suspend_gls,
  238. ncsi_dev_state_suspend_dcnt,
  239. ncsi_dev_state_suspend_dc,
  240. ncsi_dev_state_suspend_deselect,
  241. ncsi_dev_state_suspend_done
  242. };
  243. struct vlan_vid {
  244. struct list_head list;
  245. __be16 proto;
  246. u16 vid;
  247. };
  248. struct ncsi_dev_priv {
  249. struct ncsi_dev ndev; /* Associated NCSI device */
  250. unsigned int flags; /* NCSI device flags */
  251. #define NCSI_DEV_PROBED 1 /* Finalized NCSI topology */
  252. #define NCSI_DEV_HWA 2 /* Enabled HW arbitration */
  253. #define NCSI_DEV_RESHUFFLE 4
  254. spinlock_t lock; /* Protect the NCSI device */
  255. #if IS_ENABLED(CONFIG_IPV6)
  256. unsigned int inet6_addr_num; /* Number of IPv6 addresses */
  257. #endif
  258. unsigned int package_num; /* Number of packages */
  259. struct list_head packages; /* List of packages */
  260. struct ncsi_channel *hot_channel; /* Channel was ever active */
  261. struct ncsi_package *force_package; /* Force a specific package */
  262. struct ncsi_channel *force_channel; /* Force a specific channel */
  263. struct ncsi_request requests[256]; /* Request table */
  264. unsigned int request_id; /* Last used request ID */
  265. #define NCSI_REQ_START_IDX 1
  266. unsigned int pending_req_num; /* Number of pending requests */
  267. struct ncsi_package *active_package; /* Currently handled package */
  268. struct ncsi_channel *active_channel; /* Currently handled channel */
  269. struct list_head channel_queue; /* Config queue of channels */
  270. struct work_struct work; /* For channel management */
  271. struct packet_type ptype; /* NCSI packet Rx handler */
  272. struct list_head node; /* Form NCSI device list */
  273. #define NCSI_MAX_VLAN_VIDS 15
  274. struct list_head vlan_vids; /* List of active VLAN IDs */
  275. };
  276. struct ncsi_cmd_arg {
  277. struct ncsi_dev_priv *ndp; /* Associated NCSI device */
  278. unsigned char type; /* Command in the NCSI packet */
  279. unsigned char id; /* Request ID (sequence number) */
  280. unsigned char package; /* Destination package ID */
  281. unsigned char channel; /* Detination channel ID or 0x1f */
  282. unsigned short payload; /* Command packet payload length */
  283. unsigned int req_flags; /* NCSI request properties */
  284. union {
  285. unsigned char bytes[16]; /* Command packet specific data */
  286. unsigned short words[8];
  287. unsigned int dwords[4];
  288. };
  289. };
  290. extern struct list_head ncsi_dev_list;
  291. extern spinlock_t ncsi_dev_lock;
  292. #define TO_NCSI_DEV_PRIV(nd) \
  293. container_of(nd, struct ncsi_dev_priv, ndev)
  294. #define NCSI_FOR_EACH_DEV(ndp) \
  295. list_for_each_entry_rcu(ndp, &ncsi_dev_list, node)
  296. #define NCSI_FOR_EACH_PACKAGE(ndp, np) \
  297. list_for_each_entry_rcu(np, &ndp->packages, node)
  298. #define NCSI_FOR_EACH_CHANNEL(np, nc) \
  299. list_for_each_entry_rcu(nc, &np->channels, node)
  300. /* Resources */
  301. void ncsi_start_channel_monitor(struct ncsi_channel *nc);
  302. void ncsi_stop_channel_monitor(struct ncsi_channel *nc);
  303. struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np,
  304. unsigned char id);
  305. struct ncsi_channel *ncsi_add_channel(struct ncsi_package *np,
  306. unsigned char id);
  307. struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp,
  308. unsigned char id);
  309. struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp,
  310. unsigned char id);
  311. void ncsi_remove_package(struct ncsi_package *np);
  312. void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp,
  313. unsigned char id,
  314. struct ncsi_package **np,
  315. struct ncsi_channel **nc);
  316. struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp,
  317. unsigned int req_flags);
  318. void ncsi_free_request(struct ncsi_request *nr);
  319. struct ncsi_dev *ncsi_find_dev(struct net_device *dev);
  320. int ncsi_process_next_channel(struct ncsi_dev_priv *ndp);
  321. /* Packet handlers */
  322. u32 ncsi_calculate_checksum(unsigned char *data, int len);
  323. int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca);
  324. int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
  325. struct packet_type *pt, struct net_device *orig_dev);
  326. int ncsi_aen_handler(struct ncsi_dev_priv *ndp, struct sk_buff *skb);
  327. #endif /* __NCSI_INTERNAL_H__ */