efct_lio.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. #ifndef __EFCT_LIO_H__
  7. #define __EFCT_LIO_H__
  8. #include "efct_scsi.h"
  9. #include <target/target_core_base.h>
  10. #define efct_lio_io_printf(io, fmt, ...) \
  11. efc_log_debug(io->efct, \
  12. "[%s] [%04x][i:%04x t:%04x h:%04x]" fmt,\
  13. io->node->display_name, io->instance_index, \
  14. io->init_task_tag, io->tgt_task_tag, io->hw_tag,\
  15. ##__VA_ARGS__)
  16. #define efct_lio_tmfio_printf(io, fmt, ...) \
  17. efc_log_debug(io->efct, \
  18. "[%s] [%04x][i:%04x t:%04x h:%04x][f:%02x]" fmt,\
  19. io->node->display_name, io->instance_index, \
  20. io->init_task_tag, io->tgt_task_tag, io->hw_tag,\
  21. io->tgt_io.tmf, ##__VA_ARGS__)
  22. #define efct_set_lio_io_state(io, value) (io->tgt_io.state |= value)
  23. struct efct_lio_wq_data {
  24. struct efct *efct;
  25. void *ptr;
  26. struct work_struct work;
  27. };
  28. /* Target private efct structure */
  29. struct efct_scsi_tgt {
  30. u32 max_sge;
  31. u32 max_sgl;
  32. /*
  33. * Variables used to send task set full. We are using a high watermark
  34. * method to send task set full. We will reserve a fixed number of IOs
  35. * per initiator plus a fudge factor. Once we reach this number,
  36. * then the target will start sending task set full/busy responses.
  37. */
  38. atomic_t initiator_count;
  39. atomic_t ios_in_use;
  40. atomic_t io_high_watermark;
  41. atomic_t watermark_hit;
  42. int watermark_min;
  43. int watermark_max;
  44. struct efct_lio_nport *lio_nport;
  45. struct efct_lio_tpg *tpg;
  46. struct list_head vport_list;
  47. /* Protects vport list*/
  48. spinlock_t efct_lio_lock;
  49. u64 wwnn;
  50. };
  51. struct efct_scsi_tgt_nport {
  52. struct efct_lio_nport *lio_nport;
  53. };
  54. struct efct_node {
  55. struct list_head list_entry;
  56. struct kref ref;
  57. void (*release)(struct kref *arg);
  58. struct efct *efct;
  59. struct efc_node *node;
  60. struct se_session *session;
  61. spinlock_t active_ios_lock;
  62. struct list_head active_ios;
  63. char display_name[EFC_NAME_LENGTH];
  64. u32 port_fc_id;
  65. u32 node_fc_id;
  66. u32 vpi;
  67. u32 rpi;
  68. u32 abort_cnt;
  69. };
  70. #define EFCT_LIO_STATE_SCSI_RECV_CMD (1 << 0)
  71. #define EFCT_LIO_STATE_TGT_SUBMIT_CMD (1 << 1)
  72. #define EFCT_LIO_STATE_TFO_QUEUE_DATA_IN (1 << 2)
  73. #define EFCT_LIO_STATE_TFO_WRITE_PENDING (1 << 3)
  74. #define EFCT_LIO_STATE_TGT_EXECUTE_CMD (1 << 4)
  75. #define EFCT_LIO_STATE_SCSI_SEND_RD_DATA (1 << 5)
  76. #define EFCT_LIO_STATE_TFO_CHK_STOP_FREE (1 << 6)
  77. #define EFCT_LIO_STATE_SCSI_DATA_DONE (1 << 7)
  78. #define EFCT_LIO_STATE_TFO_QUEUE_STATUS (1 << 8)
  79. #define EFCT_LIO_STATE_SCSI_SEND_RSP (1 << 9)
  80. #define EFCT_LIO_STATE_SCSI_RSP_DONE (1 << 10)
  81. #define EFCT_LIO_STATE_TGT_GENERIC_FREE (1 << 11)
  82. #define EFCT_LIO_STATE_SCSI_RECV_TMF (1 << 12)
  83. #define EFCT_LIO_STATE_TGT_SUBMIT_TMR (1 << 13)
  84. #define EFCT_LIO_STATE_TFO_WRITE_PEND_STATUS (1 << 14)
  85. #define EFCT_LIO_STATE_TGT_GENERIC_REQ_FAILURE (1 << 15)
  86. #define EFCT_LIO_STATE_TFO_ABORTED_TASK (1 << 29)
  87. #define EFCT_LIO_STATE_TFO_RELEASE_CMD (1 << 30)
  88. #define EFCT_LIO_STATE_SCSI_CMPL_CMD (1u << 31)
  89. struct efct_scsi_tgt_io {
  90. struct se_cmd cmd;
  91. unsigned char sense_buffer[TRANSPORT_SENSE_BUFFER];
  92. enum dma_data_direction ddir;
  93. int task_attr;
  94. u64 lun;
  95. u32 state;
  96. u8 tmf;
  97. struct efct_io *io_to_abort;
  98. u32 seg_map_cnt;
  99. u32 seg_cnt;
  100. u32 cur_seg;
  101. enum efct_scsi_io_status err;
  102. bool aborting;
  103. bool rsp_sent;
  104. u32 transferred_len;
  105. };
  106. /* Handler return codes */
  107. enum {
  108. SCSI_HANDLER_DATAPHASE_STARTED = 1,
  109. SCSI_HANDLER_RESP_STARTED,
  110. SCSI_HANDLER_VALIDATED_DATAPHASE_STARTED,
  111. SCSI_CMD_NOT_SUPPORTED,
  112. };
  113. #define WWN_NAME_LEN 32
  114. struct efct_lio_vport {
  115. u64 wwpn;
  116. u64 npiv_wwpn;
  117. u64 npiv_wwnn;
  118. unsigned char wwpn_str[WWN_NAME_LEN];
  119. struct se_wwn vport_wwn;
  120. struct efct_lio_tpg *tpg;
  121. struct efct *efct;
  122. struct Scsi_Host *shost;
  123. struct fc_vport *fc_vport;
  124. atomic_t enable;
  125. };
  126. struct efct_lio_nport {
  127. u64 wwpn;
  128. unsigned char wwpn_str[WWN_NAME_LEN];
  129. struct se_wwn nport_wwn;
  130. struct efct_lio_tpg *tpg;
  131. struct efct *efct;
  132. atomic_t enable;
  133. };
  134. struct efct_lio_tpg_attrib {
  135. u32 generate_node_acls;
  136. u32 cache_dynamic_acls;
  137. u32 demo_mode_write_protect;
  138. u32 prod_mode_write_protect;
  139. u32 demo_mode_login_only;
  140. bool session_deletion_wait;
  141. };
  142. struct efct_lio_tpg {
  143. struct se_portal_group tpg;
  144. struct efct_lio_nport *nport;
  145. struct efct_lio_vport *vport;
  146. struct efct_lio_tpg_attrib tpg_attrib;
  147. unsigned short tpgt;
  148. bool enabled;
  149. };
  150. struct efct_lio_nacl {
  151. u64 nport_wwnn;
  152. char nport_name[WWN_NAME_LEN];
  153. struct se_session *session;
  154. struct se_node_acl se_node_acl;
  155. };
  156. struct efct_lio_vport_list_t {
  157. struct list_head list_entry;
  158. struct efct_lio_vport *lio_vport;
  159. };
  160. int efct_scsi_tgt_driver_init(void);
  161. int efct_scsi_tgt_driver_exit(void);
  162. #endif /*__EFCT_LIO_H__ */