Release 4.7 include/scsi/scsi_cmnd.h
#ifndef _SCSI_SCSI_CMND_H
#define _SCSI_SCSI_CMND_H
#include <linux/dma-mapping.h>
#include <linux/blkdev.h>
#include <linux/list.h>
#include <linux/types.h>
#include <linux/timer.h>
#include <linux/scatterlist.h>
#include <scsi/scsi_device.h>
struct Scsi_Host;
struct scsi_driver;
#include <scsi/scsi_device.h>
/*
* MAX_COMMAND_SIZE is:
* The longest fixed-length SCSI CDB as per the SCSI standard.
* fixed-length means: commands that their size can be determined
* by their opcode and the CDB does not carry a length specifier, (unlike
* the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly
* true and the SCSI standard also defines extended commands and
* vendor specific commands that can be bigger than 16 bytes. The kernel
* will support these using the same infrastructure used for VARLEN CDB's.
* So in effect MAX_COMMAND_SIZE means the maximum size command scsi-ml
* supports without specifying a cmd_len by ULD's
*/
#define MAX_COMMAND_SIZE 16
#if (MAX_COMMAND_SIZE > BLK_MAX_CDB)
# error MAX_COMMAND_SIZE can not be bigger than BLK_MAX_CDB
#endif
struct scsi_data_buffer {
struct sg_table table;
unsigned length;
int resid;
};
/* embedded in scsi_cmnd */
struct scsi_pointer {
char *ptr; /* data pointer */
int this_residual; /* left in this buffer */
struct scatterlist *buffer; /* which buffer */
int buffers_residual; /* how many buffers left */
dma_addr_t dma_handle;
volatile int Status;
volatile int Message;
volatile int have_data_in;
volatile int sent_command;
volatile int phase;
};
/* for scmd->flags */
#define SCMD_TAGGED (1 << 0)
struct scsi_cmnd {
struct scsi_device *device;
struct list_head list; /* scsi_cmnd participates in queue lists */
struct list_head eh_entry; /* entry for the host eh_cmd_q */
struct delayed_work abort_work;
int eh_eflags; /* Used by error handlr */
/*
* A SCSI Command is assigned a nonzero serial_number before passed
* to the driver's queue command function. The serial_number is
* cleared when scsi_done is entered indicating that the command
* has been completed. It is a bug for LLDDs to use this number
* for purposes other than printk (and even that is only useful
* for debugging).
*/
unsigned long serial_number;
/*
* This is set to jiffies as it was when the command was first
* allocated. It is used to time how long the command has
* been outstanding
*/
unsigned long jiffies_at_alloc;
int retries;
int allowed;
unsigned char prot_op;
unsigned char prot_type;
unsigned char prot_flags;
unsigned short cmd_len;
enum dma_data_direction sc_data_direction;
/* These elements define the operation we are about to perform */
unsigned char *cmnd;
/* These elements define the operation we ultimately want to perform */
struct scsi_data_buffer sdb;
struct scsi_data_buffer *prot_sdb;
unsigned underflow; /* Return error if less than
this amount is transferred */
unsigned transfersize; /* How much we are guaranteed to
transfer with each SCSI transfer
(ie, between disconnect /
reconnects. Probably == sector
size */
struct request *request; /* The command we are
working on */
#define SCSI_SENSE_BUFFERSIZE 96
unsigned char *sense_buffer;
/* obtained by REQUEST SENSE when
* CHECK CONDITION is received on original
* command (auto-sense) */
/* Low-level done function - can be used by low-level driver to point
* to completion function. Not used by mid/upper level code. */
void (*scsi_done) (struct scsi_cmnd *);
/*
* The following fields can be written to by the host specific code.
* Everything else should be left alone.
*/
struct scsi_pointer SCp; /* Scratchpad used by some host adapters */
unsigned char *host_scribble; /* The host adapter is allowed to
* call scsi_malloc and get some memory
* and hang it here. The host adapter
* is also expected to call scsi_free
* to release this memory. (The memory
* obtained by scsi_malloc is guaranteed
* to be at an address < 16Mb). */
int result; /* Status code from lower level driver */
int flags; /* Command flags */
unsigned char tag; /* SCSI-II queued command tag */
};
/*
* Return the driver private allocation behind the command.
* Only works if cmd_size is set in the host template.
*/
static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd)
{
return cmd + 1;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
christoph hellwig | christoph hellwig | 18 | 100.00% | 1 | 100.00% |
| Total | 18 | 100.00% | 1 | 100.00% |
/* make sure not to use it with REQ_TYPE_BLOCK_PC commands */
static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
{
return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 29 | 96.67% | 2 | 66.67% |
li zhong | li zhong | 1 | 3.33% | 1 | 33.33% |
| Total | 30 | 100.00% | 3 | 100.00% |
extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
extern void scsi_put_command(struct scsi_cmnd *);
extern void scsi_finish_command(struct scsi_cmnd *cmd);
extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
size_t *offset, size_t *len);
extern void scsi_kunmap_atomic_sg(void *virt);
extern int scsi_init_io(struct scsi_cmnd *cmd);
extern int scsi_dma_map(struct scsi_cmnd *cmd);
extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
{
return cmd->sdb.table.nents;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 17 | 80.95% | 1 | 50.00% |
fujita tomonori | fujita tomonori | 4 | 19.05% | 1 | 50.00% |
| Total | 21 | 100.00% | 2 | 100.00% |
static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)
{
return cmd->sdb.table.sgl;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 19 | 82.61% | 1 | 50.00% |
fujita tomonori | fujita tomonori | 4 | 17.39% | 1 | 50.00% |
| Total | 23 | 100.00% | 2 | 100.00% |
static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)
{
return cmd->sdb.length;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 15 | 78.95% | 1 | 50.00% |
fujita tomonori | fujita tomonori | 4 | 21.05% | 1 | 50.00% |
| Total | 19 | 100.00% | 2 | 100.00% |
static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid)
{
cmd->sdb.resid = resid;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
fujita tomonori | fujita tomonori | 21 | 91.30% | 1 | 50.00% |
boaz harrosh | boaz harrosh | 2 | 8.70% | 1 | 50.00% |
| Total | 23 | 100.00% | 2 | 100.00% |
static inline int scsi_get_resid(struct scsi_cmnd *cmd)
{
return cmd->sdb.resid;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
fujita tomonori | fujita tomonori | 17 | 89.47% | 1 | 50.00% |
boaz harrosh | boaz harrosh | 2 | 10.53% | 1 | 50.00% |
| Total | 19 | 100.00% | 2 | 100.00% |
#define scsi_for_each_sg(cmd, sg, nseg, __i) \
for_each_sg(scsi_sglist(cmd), sg, nseg, __i)
static inline int scsi_bidi_cmnd(struct scsi_cmnd *cmd)
{
return blk_bidi_rq(cmd->request) &&
(cmd->request->next_rq->special != NULL);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 32 | 100.00% | 1 | 100.00% |
| Total | 32 | 100.00% | 1 | 100.00% |
static inline struct scsi_data_buffer *scsi_in(struct scsi_cmnd *cmd)
{
return scsi_bidi_cmnd(cmd) ?
cmd->request->next_rq->special : &cmd->sdb;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 33 | 100.00% | 1 | 100.00% |
| Total | 33 | 100.00% | 1 | 100.00% |
static inline struct scsi_data_buffer *scsi_out(struct scsi_cmnd *cmd)
{
return &cmd->sdb;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
boaz harrosh | boaz harrosh | 20 | 100.00% | 1 | 100.00% |
| Total | 20 | 100.00% | 1 | 100.00% |
static inline int scsi_sg_copy_from_buffer(struct scsi_cmnd *cmd,
void *buf, int buflen)
{
return sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
buf, buflen);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
fujita tomonori | fujita tomonori | 37 | 100.00% | 1 | 100.00% |
| Total | 37 | 100.00% | 1 | 100.00% |
static inline int scsi_sg_copy_to_buffer(struct scsi_cmnd *cmd,
void *buf, int buflen)
{
return sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
buf, buflen);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
fujita tomonori | fujita tomonori | 37 | 100.00% | 1 | 100.00% |
| Total | 37 | 100.00% | 1 | 100.00% |
/*
* The operations below are hints that tell the controller driver how
* to handle I/Os with DIF or similar types of protection information.
*/
enum scsi_prot_operations {
/* Normal I/O */
SCSI_PROT_NORMAL = 0,
/* OS-HBA: Protected, HBA-Target: Unprotected */
SCSI_PROT_READ_INSERT,
SCSI_PROT_WRITE_STRIP,
/* OS-HBA: Unprotected, HBA-Target: Protected */
SCSI_PROT_READ_STRIP,
SCSI_PROT_WRITE_INSERT,
/* OS-HBA: Protected, HBA-Target: Protected */
SCSI_PROT_READ_PASS,
SCSI_PROT_WRITE_PASS,
};
static inline void scsi_set_prot_op(struct scsi_cmnd *scmd, unsigned char op)
{
scmd->prot_op = op;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 22 | 100.00% | 1 | 100.00% |
| Total | 22 | 100.00% | 1 | 100.00% |
static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
{
return scmd->prot_op;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 18 | 100.00% | 1 | 100.00% |
| Total | 18 | 100.00% | 1 | 100.00% |
enum scsi_prot_flags {
SCSI_PROT_TRANSFER_PI = 1 << 0,
SCSI_PROT_GUARD_CHECK = 1 << 1,
SCSI_PROT_REF_CHECK = 1 << 2,
SCSI_PROT_REF_INCREMENT = 1 << 3,
SCSI_PROT_IP_CHECKSUM = 1 << 4,
};
/*
* The controller usually does not know anything about the target it
* is communicating with. However, when DIX is enabled the controller
* must be know target type so it can verify the protection
* information passed along with the I/O.
*/
enum scsi_prot_target_type {
SCSI_PROT_DIF_TYPE0 = 0,
SCSI_PROT_DIF_TYPE1,
SCSI_PROT_DIF_TYPE2,
SCSI_PROT_DIF_TYPE3,
};
static inline void scsi_set_prot_type(struct scsi_cmnd *scmd, unsigned char type)
{
scmd->prot_type = type;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 22 | 100.00% | 1 | 100.00% |
| Total | 22 | 100.00% | 1 | 100.00% |
static inline unsigned char scsi_get_prot_type(struct scsi_cmnd *scmd)
{
return scmd->prot_type;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 18 | 100.00% | 1 | 100.00% |
| Total | 18 | 100.00% | 1 | 100.00% |
static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd)
{
return blk_rq_pos(scmd->request);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 17 | 85.00% | 1 | 50.00% |
tejun heo | tejun heo | 3 | 15.00% | 1 | 50.00% |
| Total | 20 | 100.00% | 2 | 100.00% |
static inline unsigned int scsi_prot_interval(struct scsi_cmnd *scmd)
{
return scmd->device->sector_size;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 20 | 100.00% | 1 | 100.00% |
| Total | 20 | 100.00% | 1 | 100.00% |
static inline u32 scsi_prot_ref_tag(struct scsi_cmnd *scmd)
{
return blk_rq_pos(scmd->request) >>
(ilog2(scsi_prot_interval(scmd)) - 9) & 0xffffffff;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 34 | 100.00% | 1 | 100.00% |
| Total | 34 | 100.00% | 1 | 100.00% |
static inline unsigned scsi_prot_sg_count(struct scsi_cmnd *cmd)
{
return cmd->prot_sdb ? cmd->prot_sdb->table.nents : 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 27 | 100.00% | 1 | 100.00% |
| Total | 27 | 100.00% | 1 | 100.00% |
static inline struct scatterlist *scsi_prot_sglist(struct scsi_cmnd *cmd)
{
return cmd->prot_sdb ? cmd->prot_sdb->table.sgl : NULL;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 29 | 100.00% | 1 | 100.00% |
| Total | 29 | 100.00% | 1 | 100.00% |
static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
{
return cmd->prot_sdb;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 19 | 100.00% | 1 | 100.00% |
| Total | 19 | 100.00% | 1 | 100.00% |
#define scsi_for_each_prot_sg(cmd, sg, nseg, __i) \
for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i)
static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
{
cmd->result = (cmd->result & 0xffff00ff) | (status << 8);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
james bottomley | james bottomley | 22 | 66.67% | 1 | 50.00% |
babu moger | babu moger | 11 | 33.33% | 1 | 50.00% |
| Total | 33 | 100.00% | 2 | 100.00% |
static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
{
cmd->result = (cmd->result & 0xff00ffff) | (status << 16);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
james bottomley | james bottomley | 22 | 66.67% | 1 | 50.00% |
babu moger | babu moger | 11 | 33.33% | 1 | 50.00% |
| Total | 33 | 100.00% | 2 | 100.00% |
static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
{
cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
james bottomley | james bottomley | 22 | 66.67% | 1 | 50.00% |
babu moger | babu moger | 11 | 33.33% | 1 | 50.00% |
| Total | 33 | 100.00% | 2 | 100.00% |
static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
{
unsigned int xfer_len = scsi_out(scmd)->length;
unsigned int prot_interval = scsi_prot_interval(scmd);
if (scmd->prot_flags & SCSI_PROT_TRANSFER_PI)
xfer_len += (xfer_len >> ilog2(prot_interval)) * 8;
return xfer_len;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
sagi grimberg | sagi grimberg | 41 | 73.21% | 1 | 33.33% |
martin k. petersen | martin k. petersen | 15 | 26.79% | 2 | 66.67% |
| Total | 56 | 100.00% | 3 | 100.00% |
#endif /* _SCSI_SCSI_CMND_H */
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
martin k. petersen | martin k. petersen | 380 | 32.82% | 6 | 16.67% |
christoph hellwig | christoph hellwig | 219 | 18.91% | 4 | 11.11% |
boaz harrosh | boaz harrosh | 181 | 15.63% | 5 | 13.89% |
fujita tomonori | fujita tomonori | 168 | 14.51% | 4 | 11.11% |
james bottomley | james bottomley | 71 | 6.13% | 2 | 5.56% |
sagi grimberg | sagi grimberg | 44 | 3.80% | 1 | 2.78% |
babu moger | babu moger | 33 | 2.85% | 1 | 2.78% |
guennadi liakhovetski | guennadi liakhovetski | 29 | 2.50% | 1 | 2.78% |
jeff garzik | jeff garzik | 8 | 0.69% | 1 | 2.78% |
jens axboe | jens axboe | 6 | 0.52% | 2 | 5.56% |
hannes reinecke | hannes reinecke | 4 | 0.35% | 1 | 2.78% |
matthew wilcox | matthew wilcox | 3 | 0.26% | 2 | 5.56% |
tejun heo | tejun heo | 3 | 0.26% | 1 | 2.78% |
tim schmielau | tim schmielau | 3 | 0.26% | 1 | 2.78% |
luben tuikov | luben tuikov | 2 | 0.17% | 1 | 2.78% |
li zhong | li zhong | 2 | 0.17% | 1 | 2.78% |
al viro | al viro | 1 | 0.09% | 1 | 2.78% |
kurt garloff | kurt garloff | 1 | 0.09% | 1 | 2.78% |
| Total | 1158 | 100.00% | 36 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.