root/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*******************************************************************************
   3  * IBM Virtual SCSI Target Driver
   4  * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
   5  *                         Santiago Leon (santil@us.ibm.com) IBM Corp.
   6  *                         Linda Xie (lxie@us.ibm.com) IBM Corp.
   7  *
   8  * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
   9  * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>
  10  * Copyright (C) 2016 Bryant G. Ly <bryantly@linux.vnet.ibm.com> IBM Corp.
  11  *
  12  * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
  13  * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>
  14  *
  15  ****************************************************************************/
  16 
  17 #ifndef __H_IBMVSCSI_TGT
  18 #define __H_IBMVSCSI_TGT
  19 
  20 #include <linux/interrupt.h>
  21 #include "libsrp.h"
  22 
  23 #define SYS_ID_NAME_LEN         64
  24 #define PARTITION_NAMELEN       96
  25 #define IBMVSCSIS_NAMELEN       32
  26 
  27 #define MSG_HI  0
  28 #define MSG_LOW 1
  29 
  30 #define MAX_CMD_Q_PAGES       4
  31 #define CRQ_PER_PAGE          (PAGE_SIZE / sizeof(struct viosrp_crq))
  32 /* in terms of number of elements */
  33 #define DEFAULT_CMD_Q_SIZE    CRQ_PER_PAGE
  34 #define MAX_CMD_Q_SIZE        (DEFAULT_CMD_Q_SIZE * MAX_CMD_Q_PAGES)
  35 
  36 #define SRP_VIOLATION           0x102  /* general error code */
  37 
  38 /*
  39  * SRP buffer formats defined as of 16.a supported by this driver.
  40  */
  41 #define SUPPORTED_FORMATS  ((SRP_DATA_DESC_DIRECT << 1) | \
  42                             (SRP_DATA_DESC_INDIRECT << 1))
  43 
  44 #define SCSI_LUN_ADDR_METHOD_FLAT       1
  45 
  46 struct dma_window {
  47         u32 liobn;      /* Unique per vdevice */
  48         u64 tce_base;   /* Physical location of the TCE table */
  49         u64 tce_size;   /* Size of the TCE table in bytes */
  50 };
  51 
  52 struct target_dds {
  53         u64 unit_id;                /* 64 bit will force alignment */
  54 #define NUM_DMA_WINDOWS 2
  55 #define LOCAL  0
  56 #define REMOTE 1
  57         struct dma_window  window[NUM_DMA_WINDOWS];
  58 
  59         /* root node property "ibm,partition-no" */
  60         uint partition_num;
  61         char partition_name[PARTITION_NAMELEN];
  62 };
  63 
  64 #define MAX_NUM_PORTS        1
  65 #define MAX_H_COPY_RDMA      (128 * 1024)
  66 
  67 #define MAX_EYE   64
  68 
  69 /* Return codes */
  70 #define ADAPT_SUCCESS            0L
  71 /* choose error codes that do not conflict with PHYP */
  72 #define ERROR                   -40L
  73 
  74 struct format_code {
  75         u8 reserved;
  76         u8 buffers;
  77 };
  78 
  79 struct client_info {
  80 #define SRP_VERSION "16.a"
  81         char srp_version[8];
  82         /* root node property ibm,partition-name */
  83         char partition_name[PARTITION_NAMELEN];
  84         /* root node property ibm,partition-no */
  85         u32 partition_number;
  86         /* initially 1 */
  87         u32 mad_version;
  88         u32 os_type;
  89 };
  90 
  91 /*
  92  * Changing this constant changes the number of seconds to wait before
  93  * considering the client will never service its queue again.
  94  */
  95 #define SECONDS_TO_CONSIDER_FAILED 30
  96 /*
  97  * These constants set the polling period used to determine if the client
  98  * has freed at least one element in the response queue.
  99  */
 100 #define WAIT_SECONDS 1
 101 #define WAIT_NANO_SECONDS 5000
 102 #define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \
 103                         SECONDS_TO_CONSIDER_FAILED)
 104 /*
 105  * general purpose timer control block
 106  * which can be used for multiple functions
 107  */
 108 struct timer_cb {
 109         struct hrtimer timer;
 110         /*
 111          * how long has it been since the client
 112          * serviced the queue. The variable is incrmented
 113          * in the service_wait_q routine and cleared
 114          * in send messages
 115          */
 116         int timer_pops;
 117         /* the timer is started */
 118         bool started;
 119 };
 120 
 121 struct cmd_queue {
 122         /* kva */
 123         struct viosrp_crq *base_addr;
 124         dma_addr_t crq_token;
 125         /* used to maintain index */
 126         uint mask;
 127         /* current element */
 128         uint index;
 129         int size;
 130 };
 131 
 132 #define SCSOLNT_RESP_SHIFT      1
 133 #define UCSOLNT_RESP_SHIFT      2
 134 
 135 #define SCSOLNT         BIT(SCSOLNT_RESP_SHIFT)
 136 #define UCSOLNT         BIT(UCSOLNT_RESP_SHIFT)
 137 
 138 enum cmd_type {
 139         SCSI_CDB        = 0x01,
 140         TASK_MANAGEMENT = 0x02,
 141         /* MAD or addressed to port 0 */
 142         ADAPTER_MAD     = 0x04,
 143         UNSET_TYPE      = 0x08,
 144 };
 145 
 146 struct iu_rsp {
 147         u8 format;
 148         u8 sol_not;
 149         u16 len;
 150         /* tag is just to help client identify cmd, so don't translate be/le */
 151         u64 tag;
 152 };
 153 
 154 struct ibmvscsis_cmd {
 155         struct list_head list;
 156         /* Used for TCM Core operations */
 157         struct se_cmd se_cmd;
 158         struct iu_entry *iue;
 159         struct iu_rsp rsp;
 160         struct work_struct work;
 161         struct scsi_info *adapter;
 162         struct ibmvscsis_cmd *abort_cmd;
 163         /* Sense buffer that will be mapped into outgoing status */
 164         unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];
 165         u64 init_time;
 166 #define CMD_FAST_FAIL   BIT(0)
 167 #define DELAY_SEND      BIT(1)
 168         u32 flags;
 169         char type;
 170 };
 171 
 172 struct ibmvscsis_nexus {
 173         struct se_session *se_sess;
 174 };
 175 
 176 struct ibmvscsis_tport {
 177         /* SCSI protocol the tport is providing */
 178         u8 tport_proto_id;
 179         /* ASCII formatted WWPN for SRP Target port */
 180         char tport_name[IBMVSCSIS_NAMELEN];
 181         /* Returned by ibmvscsis_make_tport() */
 182         struct se_wwn tport_wwn;
 183         /* Returned by ibmvscsis_make_tpg() */
 184         struct se_portal_group se_tpg;
 185         /* ibmvscsis port target portal group tag for TCM */
 186         u16 tport_tpgt;
 187         /* Pointer to TCM session for I_T Nexus */
 188         struct ibmvscsis_nexus *ibmv_nexus;
 189         bool enabled;
 190         bool releasing;
 191 };
 192 
 193 struct scsi_info {
 194         struct list_head list;
 195         char eye[MAX_EYE];
 196 
 197         /* commands waiting for space on repsonse queue */
 198         struct list_head waiting_rsp;
 199 #define NO_QUEUE                    0x00
 200 #define WAIT_ENABLED                0X01
 201 #define WAIT_CONNECTION             0x04
 202         /* have established a connection */
 203 #define CONNECTED                   0x08
 204         /* at least one port is processing SRP IU */
 205 #define SRP_PROCESSING              0x10
 206         /* remove request received */
 207 #define UNCONFIGURING               0x20
 208         /* disconnect by letting adapter go idle, no error */
 209 #define WAIT_IDLE                   0x40
 210         /* disconnecting to clear an error */
 211 #define ERR_DISCONNECT              0x80
 212         /* disconnect to clear error state, then come back up */
 213 #define ERR_DISCONNECT_RECONNECT    0x100
 214         /* disconnected after clearing an error */
 215 #define ERR_DISCONNECTED            0x200
 216         /* A series of errors caused unexpected errors */
 217 #define UNDEFINED                   0x400
 218         u16  state;
 219         int fast_fail;
 220         struct target_dds dds;
 221         char *cmd_pool;
 222         /* list of free commands */
 223         struct list_head free_cmd;
 224         /* command elements ready for scheduler */
 225         struct list_head schedule_q;
 226         /* commands sent to TCM */
 227         struct list_head active_q;
 228         caddr_t *map_buf;
 229         /* ioba of map buffer */
 230         dma_addr_t map_ioba;
 231         /* allowable number of outstanding SRP requests */
 232         int request_limit;
 233         /* extra credit */
 234         int credit;
 235         /* outstanding transactions against credit limit */
 236         int debit;
 237 
 238         /* allow only one outstanding mad request */
 239 #define PROCESSING_MAD                0x00002
 240         /* Waiting to go idle */
 241 #define WAIT_FOR_IDLE                 0x00004
 242         /* H_REG_CRQ called */
 243 #define CRQ_CLOSED                    0x00010
 244         /* detected that client has failed */
 245 #define CLIENT_FAILED                 0x00040
 246         /* detected that transport event occurred */
 247 #define TRANS_EVENT                   0x00080
 248         /* don't attempt to send anything to the client */
 249 #define RESPONSE_Q_DOWN               0x00100
 250         /* request made to schedule disconnect handler */
 251 #define SCHEDULE_DISCONNECT           0x00400
 252         /* disconnect handler is scheduled */
 253 #define DISCONNECT_SCHEDULED          0x00800
 254         /* remove function is sleeping */
 255 #define CFG_SLEEPING                  0x01000
 256         /* Register for Prepare for Suspend Transport Events */
 257 #define PREP_FOR_SUSPEND_ENABLED      0x02000
 258         /* Prepare for Suspend event sent */
 259 #define PREP_FOR_SUSPEND_PENDING      0x04000
 260         /* Resume from Suspend event sent */
 261 #define PREP_FOR_SUSPEND_ABORTED      0x08000
 262         /* Prepare for Suspend event overwrote another CRQ entry */
 263 #define PREP_FOR_SUSPEND_OVERWRITE    0x10000
 264         u32 flags;
 265         /* adapter lock */
 266         spinlock_t intr_lock;
 267         /* information needed to manage command queue */
 268         struct cmd_queue cmd_q;
 269         /* used in hcall to copy response back into srp buffer */
 270         u64  empty_iu_id;
 271         /* used in crq, to tag what iu the response is for */
 272         u64  empty_iu_tag;
 273         uint new_state;
 274         uint resume_state;
 275         /* control block for the response queue timer */
 276         struct timer_cb rsp_q_timer;
 277         /* keep last client to enable proper accounting */
 278         struct client_info client_data;
 279         /* what can this client do */
 280         u32 client_cap;
 281         /*
 282          * The following two fields capture state and flag changes that
 283          * can occur when the lock is given up.  In the orginal design,
 284          * the lock was held during calls into phyp;
 285          * however, phyp did not meet PAPR architecture.  This is
 286          * a work around.
 287          */
 288         u16  phyp_acr_state;
 289         u32 phyp_acr_flags;
 290 
 291         struct workqueue_struct *work_q;
 292         struct completion wait_idle;
 293         struct completion unconfig;
 294         struct device dev;
 295         struct vio_dev *dma_dev;
 296         struct srp_target target;
 297         struct ibmvscsis_tport tport;
 298         struct tasklet_struct work_task;
 299         struct work_struct proc_work;
 300 };
 301 
 302 /*
 303  * Provide a constant that allows software to detect the adapter is
 304  * disconnecting from the client from one of several states.
 305  */
 306 #define IS_DISCONNECTING (UNCONFIGURING | ERR_DISCONNECT_RECONNECT | \
 307                           ERR_DISCONNECT)
 308 
 309 /*
 310  * Provide a constant that can be used with interrupt handling that
 311  * essentially lets the interrupt handler know that all requests should
 312  * be thrown out,
 313  */
 314 #define DONT_PROCESS_STATE (IS_DISCONNECTING | UNDEFINED | \
 315                             ERR_DISCONNECTED  | WAIT_IDLE)
 316 
 317 /*
 318  * If any of these flag bits are set then do not allow the interrupt
 319  * handler to schedule the off level handler.
 320  */
 321 #define BLOCK (DISCONNECT_SCHEDULED)
 322 
 323 /* State and transition events that stop the interrupt handler */
 324 #define TARGET_STOP(VSCSI) (long)(((VSCSI)->state & DONT_PROCESS_STATE) | \
 325                                   ((VSCSI)->flags & BLOCK))
 326 
 327 #define PREP_FOR_SUSPEND_FLAGS  (PREP_FOR_SUSPEND_ENABLED | \
 328                                  PREP_FOR_SUSPEND_PENDING | \
 329                                  PREP_FOR_SUSPEND_ABORTED | \
 330                                  PREP_FOR_SUSPEND_OVERWRITE)
 331 
 332 /* flag bit that are not reset during disconnect */
 333 #define PRESERVE_FLAG_FIELDS (PREP_FOR_SUSPEND_FLAGS)
 334 
 335 #define vio_iu(IUE) ((union viosrp_iu *)((IUE)->sbuf->buf))
 336 
 337 #define READ_CMD(cdb)   (((cdb)[0] & 0x1F) == 8)
 338 #define WRITE_CMD(cdb)  (((cdb)[0] & 0x1F) == 0xA)
 339 
 340 #ifndef H_GET_PARTNER_INFO
 341 #define H_GET_PARTNER_INFO              0x0000000000000008LL
 342 #endif
 343 #ifndef H_ENABLE_PREPARE_FOR_SUSPEND
 344 #define H_ENABLE_PREPARE_FOR_SUSPEND    0x000000000000001DLL
 345 #endif
 346 #ifndef H_READY_FOR_SUSPEND
 347 #define H_READY_FOR_SUSPEND             0x000000000000001ELL
 348 #endif
 349 
 350 
 351 #define h_copy_rdma(l, sa, sb, da, db) \
 352                 plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)
 353 #define h_vioctl(u, o, a, u1, u2, u3, u4) \
 354                 plpar_hcall_norets(H_VIOCTL, u, o, a, u1, u2)
 355 #define h_reg_crq(ua, tok, sz) \
 356                 plpar_hcall_norets(H_REG_CRQ, ua, tok, sz)
 357 #define h_free_crq(ua) \
 358                 plpar_hcall_norets(H_FREE_CRQ, ua)
 359 #define h_send_crq(ua, d1, d2) \
 360                 plpar_hcall_norets(H_SEND_CRQ, ua, d1, d2)
 361 
 362 #endif

/* [<][>][^][v][top][bottom][index][help] */