X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=include%2Fscsi%2Fscsi_cmnd.h;h=e0ae71098144ac9511f5ba315102e74e1d4e0516;hb=67b9d76f9e2f9f87f94a11521cc996dc2e43ce14;hp=e016e2ac38df8f6c570980a4624e9ccaefd0dd5e;hpb=e64d4687730cf47bd0c59e9ed76b52ca0c0f44c0;p=karo-tx-linux.git diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index e016e2ac38df..e0ae71098144 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -7,6 +7,7 @@ #include #include #include +#include struct Scsi_Host; struct scsi_device; @@ -315,4 +316,20 @@ static inline void set_driver_byte(struct scsi_cmnd *cmd, char status) cmd->result = (cmd->result & 0x00ffffff) | (status << 24); } +static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd) +{ + unsigned int xfer_len = scsi_out(scmd)->length; + unsigned int prot_op = scsi_get_prot_op(scmd); + unsigned int sector_size = scmd->device->sector_size; + + switch (prot_op) { + case SCSI_PROT_NORMAL: + case SCSI_PROT_WRITE_STRIP: + case SCSI_PROT_READ_INSERT: + return xfer_len; + } + + return xfer_len + (xfer_len >> ilog2(sector_size)) * 8; +} + #endif /* _SCSI_SCSI_CMND_H */