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