123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
- * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
- */
- #ifndef __EFCT_LIO_H__
- #define __EFCT_LIO_H__
- #include "efct_scsi.h"
- #include <target/target_core_base.h>
- #define efct_lio_io_printf(io, fmt, ...) \
- efc_log_debug(io->efct, \
- "[%s] [%04x][i:%04x t:%04x h:%04x]" fmt,\
- io->node->display_name, io->instance_index, \
- io->init_task_tag, io->tgt_task_tag, io->hw_tag,\
- ##__VA_ARGS__)
- #define efct_lio_tmfio_printf(io, fmt, ...) \
- efc_log_debug(io->efct, \
- "[%s] [%04x][i:%04x t:%04x h:%04x][f:%02x]" fmt,\
- io->node->display_name, io->instance_index, \
- io->init_task_tag, io->tgt_task_tag, io->hw_tag,\
- io->tgt_io.tmf, ##__VA_ARGS__)
- #define efct_set_lio_io_state(io, value) (io->tgt_io.state |= value)
- struct efct_lio_wq_data {
- struct efct *efct;
- void *ptr;
- struct work_struct work;
- };
- /* Target private efct structure */
- struct efct_scsi_tgt {
- u32 max_sge;
- u32 max_sgl;
- /*
- * Variables used to send task set full. We are using a high watermark
- * method to send task set full. We will reserve a fixed number of IOs
- * per initiator plus a fudge factor. Once we reach this number,
- * then the target will start sending task set full/busy responses.
- */
- atomic_t initiator_count;
- atomic_t ios_in_use;
- atomic_t io_high_watermark;
- atomic_t watermark_hit;
- int watermark_min;
- int watermark_max;
- struct efct_lio_nport *lio_nport;
- struct efct_lio_tpg *tpg;
- struct list_head vport_list;
- /* Protects vport list*/
- spinlock_t efct_lio_lock;
- u64 wwnn;
- };
- struct efct_scsi_tgt_nport {
- struct efct_lio_nport *lio_nport;
- };
- struct efct_node {
- struct list_head list_entry;
- struct kref ref;
- void (*release)(struct kref *arg);
- struct efct *efct;
- struct efc_node *node;
- struct se_session *session;
- spinlock_t active_ios_lock;
- struct list_head active_ios;
- char display_name[EFC_NAME_LENGTH];
- u32 port_fc_id;
- u32 node_fc_id;
- u32 vpi;
- u32 rpi;
- u32 abort_cnt;
- };
- #define EFCT_LIO_STATE_SCSI_RECV_CMD (1 << 0)
- #define EFCT_LIO_STATE_TGT_SUBMIT_CMD (1 << 1)
- #define EFCT_LIO_STATE_TFO_QUEUE_DATA_IN (1 << 2)
- #define EFCT_LIO_STATE_TFO_WRITE_PENDING (1 << 3)
- #define EFCT_LIO_STATE_TGT_EXECUTE_CMD (1 << 4)
- #define EFCT_LIO_STATE_SCSI_SEND_RD_DATA (1 << 5)
- #define EFCT_LIO_STATE_TFO_CHK_STOP_FREE (1 << 6)
- #define EFCT_LIO_STATE_SCSI_DATA_DONE (1 << 7)
- #define EFCT_LIO_STATE_TFO_QUEUE_STATUS (1 << 8)
- #define EFCT_LIO_STATE_SCSI_SEND_RSP (1 << 9)
- #define EFCT_LIO_STATE_SCSI_RSP_DONE (1 << 10)
- #define EFCT_LIO_STATE_TGT_GENERIC_FREE (1 << 11)
- #define EFCT_LIO_STATE_SCSI_RECV_TMF (1 << 12)
- #define EFCT_LIO_STATE_TGT_SUBMIT_TMR (1 << 13)
- #define EFCT_LIO_STATE_TFO_WRITE_PEND_STATUS (1 << 14)
- #define EFCT_LIO_STATE_TGT_GENERIC_REQ_FAILURE (1 << 15)
- #define EFCT_LIO_STATE_TFO_ABORTED_TASK (1 << 29)
- #define EFCT_LIO_STATE_TFO_RELEASE_CMD (1 << 30)
- #define EFCT_LIO_STATE_SCSI_CMPL_CMD (1u << 31)
- struct efct_scsi_tgt_io {
- struct se_cmd cmd;
- unsigned char sense_buffer[TRANSPORT_SENSE_BUFFER];
- enum dma_data_direction ddir;
- int task_attr;
- u64 lun;
- u32 state;
- u8 tmf;
- struct efct_io *io_to_abort;
- u32 seg_map_cnt;
- u32 seg_cnt;
- u32 cur_seg;
- enum efct_scsi_io_status err;
- bool aborting;
- bool rsp_sent;
- u32 transferred_len;
- };
- /* Handler return codes */
- enum {
- SCSI_HANDLER_DATAPHASE_STARTED = 1,
- SCSI_HANDLER_RESP_STARTED,
- SCSI_HANDLER_VALIDATED_DATAPHASE_STARTED,
- SCSI_CMD_NOT_SUPPORTED,
- };
- #define WWN_NAME_LEN 32
- struct efct_lio_vport {
- u64 wwpn;
- u64 npiv_wwpn;
- u64 npiv_wwnn;
- unsigned char wwpn_str[WWN_NAME_LEN];
- struct se_wwn vport_wwn;
- struct efct_lio_tpg *tpg;
- struct efct *efct;
- struct Scsi_Host *shost;
- struct fc_vport *fc_vport;
- atomic_t enable;
- };
- struct efct_lio_nport {
- u64 wwpn;
- unsigned char wwpn_str[WWN_NAME_LEN];
- struct se_wwn nport_wwn;
- struct efct_lio_tpg *tpg;
- struct efct *efct;
- atomic_t enable;
- };
- struct efct_lio_tpg_attrib {
- u32 generate_node_acls;
- u32 cache_dynamic_acls;
- u32 demo_mode_write_protect;
- u32 prod_mode_write_protect;
- u32 demo_mode_login_only;
- bool session_deletion_wait;
- };
- struct efct_lio_tpg {
- struct se_portal_group tpg;
- struct efct_lio_nport *nport;
- struct efct_lio_vport *vport;
- struct efct_lio_tpg_attrib tpg_attrib;
- unsigned short tpgt;
- bool enabled;
- };
- struct efct_lio_nacl {
- u64 nport_wwnn;
- char nport_name[WWN_NAME_LEN];
- struct se_session *session;
- struct se_node_acl se_node_acl;
- };
- struct efct_lio_vport_list_t {
- struct list_head list_entry;
- struct efct_lio_vport *lio_vport;
- };
- int efct_scsi_tgt_driver_init(void);
- int efct_scsi_tgt_driver_exit(void);
- #endif /*__EFCT_LIO_H__ */
|