LCOV - code coverage report
Current view: top level - include/scsi - scsi_cmnd.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 0 31 0.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _SCSI_SCSI_CMND_H
       3             : #define _SCSI_SCSI_CMND_H
       4             : 
       5             : #include <linux/dma-mapping.h>
       6             : #include <linux/blkdev.h>
       7             : #include <linux/t10-pi.h>
       8             : #include <linux/list.h>
       9             : #include <linux/types.h>
      10             : #include <linux/timer.h>
      11             : #include <linux/scatterlist.h>
      12             : #include <scsi/scsi_device.h>
      13             : #include <scsi/scsi_request.h>
      14             : 
      15             : struct Scsi_Host;
      16             : struct scsi_driver;
      17             : 
      18             : /*
      19             :  * MAX_COMMAND_SIZE is:
      20             :  * The longest fixed-length SCSI CDB as per the SCSI standard.
      21             :  * fixed-length means: commands that their size can be determined
      22             :  * by their opcode and the CDB does not carry a length specifier, (unlike
      23             :  * the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly
      24             :  * true and the SCSI standard also defines extended commands and
      25             :  * vendor specific commands that can be bigger than 16 bytes. The kernel
      26             :  * will support these using the same infrastructure used for VARLEN CDB's.
      27             :  * So in effect MAX_COMMAND_SIZE means the maximum size command scsi-ml
      28             :  * supports without specifying a cmd_len by ULD's
      29             :  */
      30             : #define MAX_COMMAND_SIZE 16
      31             : #if (MAX_COMMAND_SIZE > BLK_MAX_CDB)
      32             : # error MAX_COMMAND_SIZE can not be bigger than BLK_MAX_CDB
      33             : #endif
      34             : 
      35             : struct scsi_data_buffer {
      36             :         struct sg_table table;
      37             :         unsigned length;
      38             : };
      39             : 
      40             : /* embedded in scsi_cmnd */
      41             : struct scsi_pointer {
      42             :         char *ptr;              /* data pointer */
      43             :         int this_residual;      /* left in this buffer */
      44             :         struct scatterlist *buffer;     /* which buffer */
      45             :         int buffers_residual;   /* how many buffers left */
      46             : 
      47             :         dma_addr_t dma_handle;
      48             : 
      49             :         volatile int Status;
      50             :         volatile int Message;
      51             :         volatile int have_data_in;
      52             :         volatile int sent_command;
      53             :         volatile int phase;
      54             : };
      55             : 
      56             : /* for scmd->flags */
      57             : #define SCMD_TAGGED             (1 << 0)
      58             : #define SCMD_UNCHECKED_ISA_DMA  (1 << 1)
      59             : #define SCMD_INITIALIZED        (1 << 2)
      60             : #define SCMD_LAST               (1 << 3)
      61             : /* flags preserved across unprep / reprep */
      62             : #define SCMD_PRESERVED_FLAGS    (SCMD_UNCHECKED_ISA_DMA | SCMD_INITIALIZED)
      63             : 
      64             : /* for scmd->state */
      65             : #define SCMD_STATE_COMPLETE     0
      66             : #define SCMD_STATE_INFLIGHT     1
      67             : 
      68             : struct scsi_cmnd {
      69             :         struct scsi_request req;
      70             :         struct scsi_device *device;
      71             :         struct list_head eh_entry; /* entry for the host eh_cmd_q */
      72             :         struct delayed_work abort_work;
      73             : 
      74             :         struct rcu_head rcu;
      75             : 
      76             :         int eh_eflags;          /* Used by error handlr */
      77             : 
      78             :         /*
      79             :          * This is set to jiffies as it was when the command was first
      80             :          * allocated.  It is used to time how long the command has
      81             :          * been outstanding
      82             :          */
      83             :         unsigned long jiffies_at_alloc;
      84             : 
      85             :         int retries;
      86             :         int allowed;
      87             : 
      88             :         unsigned char prot_op;
      89             :         unsigned char prot_type;
      90             :         unsigned char prot_flags;
      91             : 
      92             :         unsigned short cmd_len;
      93             :         enum dma_data_direction sc_data_direction;
      94             : 
      95             :         /* These elements define the operation we are about to perform */
      96             :         unsigned char *cmnd;
      97             : 
      98             : 
      99             :         /* These elements define the operation we ultimately want to perform */
     100             :         struct scsi_data_buffer sdb;
     101             :         struct scsi_data_buffer *prot_sdb;
     102             : 
     103             :         unsigned underflow;     /* Return error if less than
     104             :                                    this amount is transferred */
     105             : 
     106             :         unsigned transfersize;  /* How much we are guaranteed to
     107             :                                    transfer with each SCSI transfer
     108             :                                    (ie, between disconnect / 
     109             :                                    reconnects.   Probably == sector
     110             :                                    size */
     111             : 
     112             :         struct request *request;        /* The command we are
     113             :                                            working on */
     114             : 
     115             :         unsigned char *sense_buffer;
     116             :                                 /* obtained by REQUEST SENSE when
     117             :                                  * CHECK CONDITION is received on original
     118             :                                  * command (auto-sense). Length must be
     119             :                                  * SCSI_SENSE_BUFFERSIZE bytes. */
     120             : 
     121             :         /* Low-level done function - can be used by low-level driver to point
     122             :          *        to completion function.  Not used by mid/upper level code. */
     123             :         void (*scsi_done) (struct scsi_cmnd *);
     124             : 
     125             :         /*
     126             :          * The following fields can be written to by the host specific code. 
     127             :          * Everything else should be left alone. 
     128             :          */
     129             :         struct scsi_pointer SCp;        /* Scratchpad used by some host adapters */
     130             : 
     131             :         unsigned char *host_scribble;   /* The host adapter is allowed to
     132             :                                          * call scsi_malloc and get some memory
     133             :                                          * and hang it here.  The host adapter
     134             :                                          * is also expected to call scsi_free
     135             :                                          * to release this memory.  (The memory
     136             :                                          * obtained by scsi_malloc is guaranteed
     137             :                                          * to be at an address < 16Mb). */
     138             : 
     139             :         int result;             /* Status code from lower level driver */
     140             :         int flags;              /* Command flags */
     141             :         unsigned long state;    /* Command completion state */
     142             : 
     143             :         unsigned char tag;      /* SCSI-II queued command tag */
     144             :         unsigned int extra_len; /* length of alignment and padding */
     145             : };
     146             : 
     147             : /*
     148             :  * Return the driver private allocation behind the command.
     149             :  * Only works if cmd_size is set in the host template.
     150             :  */
     151           0 : static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd)
     152             : {
     153           0 :         return cmd + 1;
     154             : }
     155             : 
     156             : /* make sure not to use it with passthrough commands */
     157           0 : static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
     158             : {
     159           0 :         return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
     160             : }
     161             : 
     162             : extern void scsi_finish_command(struct scsi_cmnd *cmd);
     163             : 
     164             : extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
     165             :                                  size_t *offset, size_t *len);
     166             : extern void scsi_kunmap_atomic_sg(void *virt);
     167             : 
     168             : blk_status_t scsi_alloc_sgtables(struct scsi_cmnd *cmd);
     169             : void scsi_free_sgtables(struct scsi_cmnd *cmd);
     170             : 
     171             : #ifdef CONFIG_SCSI_DMA
     172             : extern int scsi_dma_map(struct scsi_cmnd *cmd);
     173             : extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
     174             : #else /* !CONFIG_SCSI_DMA */
     175             : static inline int scsi_dma_map(struct scsi_cmnd *cmd) { return -ENOSYS; }
     176             : static inline void scsi_dma_unmap(struct scsi_cmnd *cmd) { }
     177             : #endif /* !CONFIG_SCSI_DMA */
     178             : 
     179           0 : static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
     180             : {
     181           0 :         return cmd->sdb.table.nents;
     182             : }
     183             : 
     184           0 : static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)
     185             : {
     186           0 :         return cmd->sdb.table.sgl;
     187             : }
     188             : 
     189           0 : static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)
     190             : {
     191           0 :         return cmd->sdb.length;
     192             : }
     193             : 
     194           0 : static inline void scsi_set_resid(struct scsi_cmnd *cmd, unsigned int resid)
     195             : {
     196           0 :         cmd->req.resid_len = resid;
     197           0 : }
     198             : 
     199           0 : static inline unsigned int scsi_get_resid(struct scsi_cmnd *cmd)
     200             : {
     201           0 :         return cmd->req.resid_len;
     202             : }
     203             : 
     204             : #define scsi_for_each_sg(cmd, sg, nseg, __i)                    \
     205             :         for_each_sg(scsi_sglist(cmd), sg, nseg, __i)
     206             : 
     207             : static inline int scsi_sg_copy_from_buffer(struct scsi_cmnd *cmd,
     208             :                                            void *buf, int buflen)
     209             : {
     210             :         return sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
     211             :                                    buf, buflen);
     212             : }
     213             : 
     214             : static inline int scsi_sg_copy_to_buffer(struct scsi_cmnd *cmd,
     215             :                                          void *buf, int buflen)
     216             : {
     217             :         return sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
     218             :                                  buf, buflen);
     219             : }
     220             : 
     221             : /*
     222             :  * The operations below are hints that tell the controller driver how
     223             :  * to handle I/Os with DIF or similar types of protection information.
     224             :  */
     225             : enum scsi_prot_operations {
     226             :         /* Normal I/O */
     227             :         SCSI_PROT_NORMAL = 0,
     228             : 
     229             :         /* OS-HBA: Protected, HBA-Target: Unprotected */
     230             :         SCSI_PROT_READ_INSERT,
     231             :         SCSI_PROT_WRITE_STRIP,
     232             : 
     233             :         /* OS-HBA: Unprotected, HBA-Target: Protected */
     234             :         SCSI_PROT_READ_STRIP,
     235             :         SCSI_PROT_WRITE_INSERT,
     236             : 
     237             :         /* OS-HBA: Protected, HBA-Target: Protected */
     238             :         SCSI_PROT_READ_PASS,
     239             :         SCSI_PROT_WRITE_PASS,
     240             : };
     241             : 
     242           0 : static inline void scsi_set_prot_op(struct scsi_cmnd *scmd, unsigned char op)
     243             : {
     244           0 :         scmd->prot_op = op;
     245             : }
     246             : 
     247           0 : static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
     248             : {
     249           0 :         return scmd->prot_op;
     250             : }
     251             : 
     252             : enum scsi_prot_flags {
     253             :         SCSI_PROT_TRANSFER_PI           = 1 << 0,
     254             :         SCSI_PROT_GUARD_CHECK           = 1 << 1,
     255             :         SCSI_PROT_REF_CHECK             = 1 << 2,
     256             :         SCSI_PROT_REF_INCREMENT         = 1 << 3,
     257             :         SCSI_PROT_IP_CHECKSUM           = 1 << 4,
     258             : };
     259             : 
     260             : /*
     261             :  * The controller usually does not know anything about the target it
     262             :  * is communicating with.  However, when DIX is enabled the controller
     263             :  * must be know target type so it can verify the protection
     264             :  * information passed along with the I/O.
     265             :  */
     266             : enum scsi_prot_target_type {
     267             :         SCSI_PROT_DIF_TYPE0 = 0,
     268             :         SCSI_PROT_DIF_TYPE1,
     269             :         SCSI_PROT_DIF_TYPE2,
     270             :         SCSI_PROT_DIF_TYPE3,
     271             : };
     272             : 
     273           0 : static inline void scsi_set_prot_type(struct scsi_cmnd *scmd, unsigned char type)
     274             : {
     275           0 :         scmd->prot_type = type;
     276             : }
     277             : 
     278             : static inline unsigned char scsi_get_prot_type(struct scsi_cmnd *scmd)
     279             : {
     280             :         return scmd->prot_type;
     281             : }
     282             : 
     283             : static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd)
     284             : {
     285             :         return blk_rq_pos(scmd->request);
     286             : }
     287             : 
     288             : static inline unsigned int scsi_prot_interval(struct scsi_cmnd *scmd)
     289             : {
     290             :         return scmd->device->sector_size;
     291             : }
     292             : 
     293           0 : static inline unsigned scsi_prot_sg_count(struct scsi_cmnd *cmd)
     294             : {
     295           0 :         return cmd->prot_sdb ? cmd->prot_sdb->table.nents : 0;
     296             : }
     297             : 
     298           0 : static inline struct scatterlist *scsi_prot_sglist(struct scsi_cmnd *cmd)
     299             : {
     300           0 :         return cmd->prot_sdb ? cmd->prot_sdb->table.sgl : NULL;
     301             : }
     302             : 
     303             : static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
     304             : {
     305             :         return cmd->prot_sdb;
     306             : }
     307             : 
     308             : #define scsi_for_each_prot_sg(cmd, sg, nseg, __i)               \
     309             :         for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i)
     310             : 
     311             : static inline void set_status_byte(struct scsi_cmnd *cmd, char status)
     312             : {
     313             :         cmd->result = (cmd->result & 0xffffff00) | status;
     314             : }
     315             : 
     316             : static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
     317             : {
     318             :         cmd->result = (cmd->result & 0xffff00ff) | (status << 8);
     319             : }
     320             : 
     321           0 : static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
     322             : {
     323           0 :         cmd->result = (cmd->result & 0xff00ffff) | (status << 16);
     324           0 : }
     325             : 
     326           0 : static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
     327             : {
     328           0 :         cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
     329           0 : }
     330             : 
     331             : static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
     332             : {
     333             :         unsigned int xfer_len = scmd->sdb.length;
     334             :         unsigned int prot_interval = scsi_prot_interval(scmd);
     335             : 
     336             :         if (scmd->prot_flags & SCSI_PROT_TRANSFER_PI)
     337             :                 xfer_len += (xfer_len >> ilog2(prot_interval)) * 8;
     338             : 
     339             :         return xfer_len;
     340             : }
     341             : 
     342             : #endif /* _SCSI_SCSI_CMND_H */

Generated by: LCOV version 1.14