linux/include/scsi/scsi_cmnd.h
<<
>>
Prefs
   1#ifndef _SCSI_SCSI_CMND_H
   2#define _SCSI_SCSI_CMND_H
   3
   4#include <linux/dma-mapping.h>
   5#include <linux/blkdev.h>
   6#include <linux/list.h>
   7#include <linux/types.h>
   8#include <linux/timer.h>
   9#include <linux/scatterlist.h>
  10
  11struct Scsi_Host;
  12struct scsi_device;
  13
  14struct scsi_data_buffer {
  15        struct sg_table table;
  16        unsigned length;
  17        int resid;
  18};
  19
  20/* embedded in scsi_cmnd */
  21struct scsi_pointer {
  22        char *ptr;              /* data pointer */
  23        int this_residual;      /* left in this buffer */
  24        struct scatterlist *buffer;     /* which buffer */
  25        int buffers_residual;   /* how many buffers left */
  26
  27        dma_addr_t dma_handle;
  28
  29        volatile int Status;
  30        volatile int Message;
  31        volatile int have_data_in;
  32        volatile int sent_command;
  33        volatile int phase;
  34};
  35
  36struct scsi_cmnd {
  37        struct scsi_device *device;
  38        struct list_head list;  /* scsi_cmnd participates in queue lists */
  39        struct list_head eh_entry; /* entry for the host eh_cmd_q */
  40        int eh_eflags;          /* Used by error handlr */
  41
  42        /*
  43         * A SCSI Command is assigned a nonzero serial_number before passed
  44         * to the driver's queue command function.  The serial_number is
  45         * cleared when scsi_done is entered indicating that the command
  46         * has been completed.  It is a bug for LLDDs to use this number
  47         * for purposes other than printk (and even that is only useful
  48         * for debugging).
  49         */
  50        unsigned long serial_number;
  51
  52        /*
  53         * This is set to jiffies as it was when the command was first
  54         * allocated.  It is used to time how long the command has
  55         * been outstanding
  56         */
  57        unsigned long jiffies_at_alloc;
  58
  59        int retries;
  60        int allowed;
  61        int timeout_per_command;
  62
  63        unsigned char cmd_len;
  64        enum dma_data_direction sc_data_direction;
  65
  66        /* These elements define the operation we are about to perform */
  67#define MAX_COMMAND_SIZE        16
  68        unsigned char cmnd[MAX_COMMAND_SIZE];
  69
  70        struct timer_list eh_timeout;   /* Used to time out the command. */
  71
  72        /* These elements define the operation we ultimately want to perform */
  73        struct scsi_data_buffer sdb;
  74        unsigned underflow;     /* Return error if less than
  75                                   this amount is transferred */
  76
  77        unsigned transfersize;  /* How much we are guaranteed to
  78                                   transfer with each SCSI transfer
  79                                   (ie, between disconnect / 
  80                                   reconnects.   Probably == sector
  81                                   size */
  82
  83        struct request *request;        /* The command we are
  84                                           working on */
  85
  86#define SCSI_SENSE_BUFFERSIZE   96
  87        unsigned char *sense_buffer;
  88                                /* obtained by REQUEST SENSE when
  89                                 * CHECK CONDITION is received on original
  90                                 * command (auto-sense) */
  91
  92        /* Low-level done function - can be used by low-level driver to point
  93         *        to completion function.  Not used by mid/upper level code. */
  94        void (*scsi_done) (struct scsi_cmnd *);
  95
  96        /*
  97         * The following fields can be written to by the host specific code. 
  98         * Everything else should be left alone. 
  99         */
 100        struct scsi_pointer SCp;        /* Scratchpad used by some host adapters */
 101
 102        unsigned char *host_scribble;   /* The host adapter is allowed to
 103                                         * call scsi_malloc and get some memory
 104                                         * and hang it here.  The host adapter
 105                                         * is also expected to call scsi_free
 106                                         * to release this memory.  (The memory
 107                                         * obtained by scsi_malloc is guaranteed
 108                                         * to be at an address < 16Mb). */
 109
 110        int result;             /* Status code from lower level driver */
 111
 112        unsigned char tag;      /* SCSI-II queued command tag */
 113};
 114
 115extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
 116extern struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *, gfp_t);
 117extern void scsi_put_command(struct scsi_cmnd *);
 118extern void __scsi_put_command(struct Scsi_Host *, struct scsi_cmnd *,
 119                               struct device *);
 120extern void scsi_finish_command(struct scsi_cmnd *cmd);
 121extern void scsi_req_abort_cmd(struct scsi_cmnd *cmd);
 122
 123extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
 124                                 size_t *offset, size_t *len);
 125extern void scsi_kunmap_atomic_sg(void *virt);
 126
 127extern int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask);
 128extern void scsi_release_buffers(struct scsi_cmnd *cmd);
 129
 130extern int scsi_dma_map(struct scsi_cmnd *cmd);
 131extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
 132
 133static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
 134{
 135        return cmd->sdb.table.nents;
 136}
 137
 138static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)
 139{
 140        return cmd->sdb.table.sgl;
 141}
 142
 143static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)
 144{
 145        return cmd->sdb.length;
 146}
 147
 148static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid)
 149{
 150        cmd->sdb.resid = resid;
 151}
 152
 153static inline int scsi_get_resid(struct scsi_cmnd *cmd)
 154{
 155        return cmd->sdb.resid;
 156}
 157
 158#define scsi_for_each_sg(cmd, sg, nseg, __i)                    \
 159        for_each_sg(scsi_sglist(cmd), sg, nseg, __i)
 160
 161static inline int scsi_bidi_cmnd(struct scsi_cmnd *cmd)
 162{
 163        return blk_bidi_rq(cmd->request) &&
 164                (cmd->request->next_rq->special != NULL);
 165}
 166
 167static inline struct scsi_data_buffer *scsi_in(struct scsi_cmnd *cmd)
 168{
 169        return scsi_bidi_cmnd(cmd) ?
 170                cmd->request->next_rq->special : &cmd->sdb;
 171}
 172
 173static inline struct scsi_data_buffer *scsi_out(struct scsi_cmnd *cmd)
 174{
 175        return &cmd->sdb;
 176}
 177
 178#endif /* _SCSI_SCSI_CMND_H */
 179
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.