libata: implement ata_qc_raw_nbytes()
Implement ata_qc_raw_nbytes() which determines the raw user-requested size of a PC command. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
cc7feea39b
commit
aacda37538
2 changed files with 18 additions and 4 deletions
|
@ -527,6 +527,14 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
|
|||
return qc;
|
||||
}
|
||||
|
||||
static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct scsi_cmnd *scmd = qc->scsicmd;
|
||||
|
||||
qc->extrabytes = scmd->request->extra_len;
|
||||
qc->nbytes = scsi_bufflen(scmd) + qc->extrabytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_dump_status - user friendly display of error info
|
||||
* @id: id of the port in question
|
||||
|
@ -2539,7 +2547,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
|||
}
|
||||
|
||||
qc->tf.command = ATA_CMD_PACKET;
|
||||
qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len;
|
||||
ata_qc_set_pc_nbytes(qc);
|
||||
|
||||
/* check whether ATAPI DMA is safe */
|
||||
if (!using_pio && ata_check_atapi_dma(qc))
|
||||
|
@ -2550,7 +2558,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
|||
* want to set it properly, and for DMA where it is
|
||||
* effectively meaningless.
|
||||
*/
|
||||
nbytes = min(scmd->request->data_len, (unsigned int)63 * 1024);
|
||||
nbytes = min(ata_qc_raw_nbytes(qc), (unsigned int)63 * 1024);
|
||||
|
||||
/* Most ATAPI devices which honor transfer chunk size don't
|
||||
* behave according to the spec when odd chunk size which
|
||||
|
@ -2876,7 +2884,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
|
|||
* TODO: find out if we need to do more here to
|
||||
* cover scatter/gather case.
|
||||
*/
|
||||
qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len;
|
||||
ata_qc_set_pc_nbytes(qc);
|
||||
|
||||
/* request result TF and be quiet about device error */
|
||||
qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
|
||||
|
|
|
@ -463,6 +463,7 @@ struct ata_queued_cmd {
|
|||
unsigned int sect_size;
|
||||
|
||||
unsigned int nbytes;
|
||||
unsigned int extrabytes;
|
||||
unsigned int curbytes;
|
||||
|
||||
struct scatterlist *cursg;
|
||||
|
@ -1336,6 +1337,11 @@ static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline unsigned int ata_qc_raw_nbytes(struct ata_queued_cmd *qc)
|
||||
{
|
||||
return qc->nbytes - min(qc->extrabytes, qc->nbytes);
|
||||
}
|
||||
|
||||
static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
|
||||
{
|
||||
memset(tf, 0, sizeof(*tf));
|
||||
|
@ -1354,7 +1360,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
|
|||
qc->flags = 0;
|
||||
qc->cursg = NULL;
|
||||
qc->cursg_ofs = 0;
|
||||
qc->nbytes = qc->curbytes = 0;
|
||||
qc->nbytes = qc->extrabytes = qc->curbytes = 0;
|
||||
qc->n_elem = 0;
|
||||
qc->err_mask = 0;
|
||||
qc->sect_size = ATA_SECT_SIZE;
|
||||
|
|
Loading…
Reference in a new issue