linux/drivers/scsi/elx/efct/efct_lio.h
<<
>>
Prefs
   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
  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 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
  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            32
 134struct 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