190 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term4 * “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 29struct efct_lio_wq_data {30 struct efct *efct;31 void *ptr;32 struct work_struct work;33};34 35/* Target private efct structure */36struct 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 watermark42 * method to send task set full. We will reserve a fixed number of IOs43 * 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 64struct efct_scsi_tgt_nport {65 struct efct_lio_nport *lio_nport;66};67 68struct 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 106struct 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 */126enum {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 32134struct 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 147struct 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 156struct 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 165struct 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 174struct 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 181struct efct_lio_vport_list_t {182 struct list_head list_entry;183 struct efct_lio_vport *lio_vport;184};185 186int efct_scsi_tgt_driver_init(void);187int efct_scsi_tgt_driver_exit(void);188 189#endif /*__EFCT_LIO_H__ */190