efct_scsi.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
  4. * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
  5. */
  6. #if !defined(__EFCT_SCSI_H__)
  7. #define __EFCT_SCSI_H__
  8. #include <scsi/scsi_host.h>
  9. #include <scsi/scsi_transport_fc.h>
  10. /* efct_scsi_rcv_cmd() efct_scsi_rcv_tmf() flags */
  11. #define EFCT_SCSI_CMD_DIR_IN (1 << 0)
  12. #define EFCT_SCSI_CMD_DIR_OUT (1 << 1)
  13. #define EFCT_SCSI_CMD_SIMPLE (1 << 2)
  14. #define EFCT_SCSI_CMD_HEAD_OF_QUEUE (1 << 3)
  15. #define EFCT_SCSI_CMD_ORDERED (1 << 4)
  16. #define EFCT_SCSI_CMD_UNTAGGED (1 << 5)
  17. #define EFCT_SCSI_CMD_ACA (1 << 6)
  18. #define EFCT_SCSI_FIRST_BURST_ERR (1 << 7)
  19. #define EFCT_SCSI_FIRST_BURST_ABORTED (1 << 8)
  20. /* efct_scsi_send_rd_data/recv_wr_data/send_resp flags */
  21. #define EFCT_SCSI_LAST_DATAPHASE (1 << 0)
  22. #define EFCT_SCSI_NO_AUTO_RESPONSE (1 << 1)
  23. #define EFCT_SCSI_LOW_LATENCY (1 << 2)
  24. #define EFCT_SCSI_SNS_BUF_VALID(sense) ((sense) && \
  25. (0x70 == (((const u8 *)(sense))[0] & 0x70)))
  26. #define EFCT_SCSI_WQ_STEERING_SHIFT 16
  27. #define EFCT_SCSI_WQ_STEERING_MASK (0xf << EFCT_SCSI_WQ_STEERING_SHIFT)
  28. #define EFCT_SCSI_WQ_STEERING_CLASS (0 << EFCT_SCSI_WQ_STEERING_SHIFT)
  29. #define EFCT_SCSI_WQ_STEERING_REQUEST (1 << EFCT_SCSI_WQ_STEERING_SHIFT)
  30. #define EFCT_SCSI_WQ_STEERING_CPU (2 << EFCT_SCSI_WQ_STEERING_SHIFT)
  31. #define EFCT_SCSI_WQ_CLASS_SHIFT (20)
  32. #define EFCT_SCSI_WQ_CLASS_MASK (0xf << EFCT_SCSI_WQ_CLASS_SHIFT)
  33. #define EFCT_SCSI_WQ_CLASS(x) ((x & EFCT_SCSI_WQ_CLASS_MASK) << \
  34. EFCT_SCSI_WQ_CLASS_SHIFT)
  35. #define EFCT_SCSI_WQ_CLASS_LOW_LATENCY 1
  36. struct efct_scsi_cmd_resp {
  37. u8 scsi_status;
  38. u16 scsi_status_qualifier;
  39. u8 *response_data;
  40. u32 response_data_length;
  41. u8 *sense_data;
  42. u32 sense_data_length;
  43. int residual;
  44. u32 response_wire_length;
  45. };
  46. struct efct_vport {
  47. struct efct *efct;
  48. bool is_vport;
  49. struct fc_host_statistics fc_host_stats;
  50. struct Scsi_Host *shost;
  51. struct fc_vport *fc_vport;
  52. u64 npiv_wwpn;
  53. u64 npiv_wwnn;
  54. };
  55. /* Status values returned by IO callbacks */
  56. enum efct_scsi_io_status {
  57. EFCT_SCSI_STATUS_GOOD = 0,
  58. EFCT_SCSI_STATUS_ABORTED,
  59. EFCT_SCSI_STATUS_ERROR,
  60. EFCT_SCSI_STATUS_DIF_GUARD_ERR,
  61. EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR,
  62. EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR,
  63. EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR,
  64. EFCT_SCSI_STATUS_PROTOCOL_CRC_ERROR,
  65. EFCT_SCSI_STATUS_NO_IO,
  66. EFCT_SCSI_STATUS_ABORT_IN_PROGRESS,
  67. EFCT_SCSI_STATUS_CHECK_RESPONSE,
  68. EFCT_SCSI_STATUS_COMMAND_TIMEOUT,
  69. EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED,
  70. EFCT_SCSI_STATUS_SHUTDOWN,
  71. EFCT_SCSI_STATUS_NEXUS_LOST,
  72. };
  73. struct efct_node;
  74. struct efct_io;
  75. struct efc_node;
  76. struct efc_nport;
  77. /* Callback used by send_rd_data(), recv_wr_data(), send_resp() */
  78. typedef int (*efct_scsi_io_cb_t)(struct efct_io *io,
  79. enum efct_scsi_io_status status,
  80. u32 flags, void *arg);
  81. /* Callback used by send_rd_io(), send_wr_io() */
  82. typedef int (*efct_scsi_rsp_io_cb_t)(struct efct_io *io,
  83. enum efct_scsi_io_status status,
  84. struct efct_scsi_cmd_resp *rsp,
  85. u32 flags, void *arg);
  86. /* efct_scsi_cb_t flags */
  87. #define EFCT_SCSI_IO_CMPL (1 << 0)
  88. /* IO completed, response sent */
  89. #define EFCT_SCSI_IO_CMPL_RSP_SENT (1 << 1)
  90. #define EFCT_SCSI_IO_ABORTED (1 << 2)
  91. /* efct_scsi_recv_tmf() request values */
  92. enum efct_scsi_tmf_cmd {
  93. EFCT_SCSI_TMF_ABORT_TASK = 1,
  94. EFCT_SCSI_TMF_QUERY_TASK_SET,
  95. EFCT_SCSI_TMF_ABORT_TASK_SET,
  96. EFCT_SCSI_TMF_CLEAR_TASK_SET,
  97. EFCT_SCSI_TMF_QUERY_ASYNCHRONOUS_EVENT,
  98. EFCT_SCSI_TMF_LOGICAL_UNIT_RESET,
  99. EFCT_SCSI_TMF_CLEAR_ACA,
  100. EFCT_SCSI_TMF_TARGET_RESET,
  101. };
  102. /* efct_scsi_send_tmf_resp() response values */
  103. enum efct_scsi_tmf_resp {
  104. EFCT_SCSI_TMF_FUNCTION_COMPLETE = 1,
  105. EFCT_SCSI_TMF_FUNCTION_SUCCEEDED,
  106. EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND,
  107. EFCT_SCSI_TMF_FUNCTION_REJECTED,
  108. EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER,
  109. EFCT_SCSI_TMF_SERVICE_DELIVERY,
  110. };
  111. struct efct_scsi_sgl {
  112. uintptr_t addr;
  113. uintptr_t dif_addr;
  114. size_t len;
  115. };
  116. enum efct_scsi_io_role {
  117. EFCT_SCSI_IO_ROLE_ORIGINATOR,
  118. EFCT_SCSI_IO_ROLE_RESPONDER,
  119. };
  120. struct efct_io *
  121. efct_scsi_io_alloc(struct efct_node *node);
  122. void efct_scsi_io_free(struct efct_io *io);
  123. struct efct_io *efct_io_get_instance(struct efct *efct, u32 index);
  124. int efct_scsi_tgt_driver_init(void);
  125. int efct_scsi_tgt_driver_exit(void);
  126. int efct_scsi_tgt_new_device(struct efct *efct);
  127. int efct_scsi_tgt_del_device(struct efct *efct);
  128. int
  129. efct_scsi_tgt_new_nport(struct efc *efc, struct efc_nport *nport);
  130. void
  131. efct_scsi_tgt_del_nport(struct efc *efc, struct efc_nport *nport);
  132. int
  133. efct_scsi_new_initiator(struct efc *efc, struct efc_node *node);
  134. enum efct_scsi_del_initiator_reason {
  135. EFCT_SCSI_INITIATOR_DELETED,
  136. EFCT_SCSI_INITIATOR_MISSING,
  137. };
  138. int
  139. efct_scsi_del_initiator(struct efc *efc, struct efc_node *node, int reason);
  140. void
  141. efct_scsi_recv_cmd(struct efct_io *io, uint64_t lun, u8 *cdb, u32 cdb_len,
  142. u32 flags);
  143. int
  144. efct_scsi_recv_tmf(struct efct_io *tmfio, u32 lun, enum efct_scsi_tmf_cmd cmd,
  145. struct efct_io *abortio, u32 flags);
  146. int
  147. efct_scsi_send_rd_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
  148. u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
  149. int
  150. efct_scsi_recv_wr_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
  151. u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
  152. int
  153. efct_scsi_send_resp(struct efct_io *io, u32 flags,
  154. struct efct_scsi_cmd_resp *rsp, efct_scsi_io_cb_t cb, void *arg);
  155. int
  156. efct_scsi_send_tmf_resp(struct efct_io *io, enum efct_scsi_tmf_resp rspcode,
  157. u8 addl_rsp_info[3], efct_scsi_io_cb_t cb, void *arg);
  158. int
  159. efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg);
  160. void efct_scsi_io_complete(struct efct_io *io);
  161. int efct_scsi_reg_fc_transport(void);
  162. void efct_scsi_release_fc_transport(void);
  163. int efct_scsi_new_device(struct efct *efct);
  164. void efct_scsi_del_device(struct efct *efct);
  165. void _efct_scsi_io_free(struct kref *arg);
  166. int
  167. efct_scsi_del_vport(struct efct *efct, struct Scsi_Host *shost);
  168. struct efct_vport *
  169. efct_scsi_new_vport(struct efct *efct, struct device *dev);
  170. int efct_scsi_io_dispatch(struct efct_io *io, void *cb);
  171. int efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb);
  172. void efct_scsi_check_pending(struct efct *efct);
  173. struct efct_io *
  174. efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr);
  175. #endif /* __EFCT_SCSI_H__ */