smc_llc.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Shared Memory Communications over RDMA (SMC-R) and RoCE
  4. *
  5. * Definitions for LLC (link layer control) message handling
  6. *
  7. * Copyright IBM Corp. 2016
  8. *
  9. * Author(s): Klaus Wacker <[email protected]>
  10. * Ursula Braun <[email protected]>
  11. */
  12. #ifndef SMC_LLC_H
  13. #define SMC_LLC_H
  14. #include "smc_wr.h"
  15. #define SMC_LLC_FLAG_RESP 0x80
  16. #define SMC_LLC_WAIT_FIRST_TIME (5 * HZ)
  17. #define SMC_LLC_WAIT_TIME (2 * HZ)
  18. #define SMC_LLC_TESTLINK_DEFAULT_TIME (30 * HZ)
  19. enum smc_llc_reqresp {
  20. SMC_LLC_REQ,
  21. SMC_LLC_RESP
  22. };
  23. enum smc_llc_msg_type {
  24. SMC_LLC_CONFIRM_LINK = 0x01,
  25. SMC_LLC_ADD_LINK = 0x02,
  26. SMC_LLC_ADD_LINK_CONT = 0x03,
  27. SMC_LLC_DELETE_LINK = 0x04,
  28. SMC_LLC_REQ_ADD_LINK = 0x05,
  29. SMC_LLC_CONFIRM_RKEY = 0x06,
  30. SMC_LLC_TEST_LINK = 0x07,
  31. SMC_LLC_CONFIRM_RKEY_CONT = 0x08,
  32. SMC_LLC_DELETE_RKEY = 0x09,
  33. /* V2 types */
  34. SMC_LLC_CONFIRM_LINK_V2 = 0x21,
  35. SMC_LLC_ADD_LINK_V2 = 0x22,
  36. SMC_LLC_DELETE_LINK_V2 = 0x24,
  37. SMC_LLC_REQ_ADD_LINK_V2 = 0x25,
  38. SMC_LLC_CONFIRM_RKEY_V2 = 0x26,
  39. SMC_LLC_TEST_LINK_V2 = 0x27,
  40. SMC_LLC_DELETE_RKEY_V2 = 0x29,
  41. };
  42. #define smc_link_downing(state) \
  43. (cmpxchg(state, SMC_LNK_ACTIVE, SMC_LNK_INACTIVE) == SMC_LNK_ACTIVE)
  44. /* LLC DELETE LINK Request Reason Codes */
  45. #define SMC_LLC_DEL_LOST_PATH 0x00010000
  46. #define SMC_LLC_DEL_OP_INIT_TERM 0x00020000
  47. #define SMC_LLC_DEL_PROG_INIT_TERM 0x00030000
  48. #define SMC_LLC_DEL_PROT_VIOL 0x00040000
  49. #define SMC_LLC_DEL_NO_ASYM_NEEDED 0x00050000
  50. /* LLC DELETE LINK Response Reason Codes */
  51. #define SMC_LLC_DEL_NOLNK 0x00100000 /* Unknown Link ID (no link) */
  52. #define SMC_LLC_DEL_NOLGR 0x00200000 /* Unknown Link Group */
  53. /* returns a usable link of the link group, or NULL */
  54. static inline struct smc_link *smc_llc_usable_link(struct smc_link_group *lgr)
  55. {
  56. int i;
  57. for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++)
  58. if (smc_link_usable(&lgr->lnk[i]))
  59. return &lgr->lnk[i];
  60. return NULL;
  61. }
  62. /* set the termination reason code for the link group */
  63. static inline void smc_llc_set_termination_rsn(struct smc_link_group *lgr,
  64. u32 rsn)
  65. {
  66. if (!lgr->llc_termination_rsn)
  67. lgr->llc_termination_rsn = rsn;
  68. }
  69. /* transmit */
  70. int smc_llc_send_confirm_link(struct smc_link *lnk,
  71. enum smc_llc_reqresp reqresp);
  72. int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[],
  73. struct smc_link *link_new,
  74. enum smc_llc_reqresp reqresp);
  75. int smc_llc_send_delete_link(struct smc_link *link, u8 link_del_id,
  76. enum smc_llc_reqresp reqresp, bool orderly,
  77. u32 reason);
  78. void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id);
  79. void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc);
  80. void smc_llc_lgr_clear(struct smc_link_group *lgr);
  81. int smc_llc_link_init(struct smc_link *link);
  82. void smc_llc_link_active(struct smc_link *link);
  83. void smc_llc_link_clear(struct smc_link *link, bool log);
  84. int smc_llc_do_confirm_rkey(struct smc_link *send_link,
  85. struct smc_buf_desc *rmb_desc);
  86. int smc_llc_do_delete_rkey(struct smc_link_group *lgr,
  87. struct smc_buf_desc *rmb_desc);
  88. int smc_llc_flow_initiate(struct smc_link_group *lgr,
  89. enum smc_llc_flowtype type);
  90. void smc_llc_flow_stop(struct smc_link_group *lgr, struct smc_llc_flow *flow);
  91. int smc_llc_eval_conf_link(struct smc_llc_qentry *qentry,
  92. enum smc_llc_reqresp type);
  93. void smc_llc_link_set_uid(struct smc_link *link);
  94. void smc_llc_save_peer_uid(struct smc_llc_qentry *qentry);
  95. struct smc_llc_qentry *smc_llc_wait(struct smc_link_group *lgr,
  96. struct smc_link *lnk,
  97. int time_out, u8 exp_msg);
  98. struct smc_llc_qentry *smc_llc_flow_qentry_clr(struct smc_llc_flow *flow);
  99. void smc_llc_flow_qentry_del(struct smc_llc_flow *flow);
  100. void smc_llc_send_link_delete_all(struct smc_link_group *lgr, bool ord,
  101. u32 rsn);
  102. int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry);
  103. int smc_llc_srv_add_link(struct smc_link *link,
  104. struct smc_llc_qentry *req_qentry);
  105. void smc_llc_add_link_local(struct smc_link *link);
  106. int smc_llc_init(void) __init;
  107. #endif /* SMC_LLC_H */