Commit aacda375 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

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: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent cc7feea3
...@@ -527,6 +527,14 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, ...@@ -527,6 +527,14 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
return qc; 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 * ata_dump_status - user friendly display of error info
* @id: id of the port in question * @id: id of the port in question
...@@ -2539,7 +2547,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) ...@@ -2539,7 +2547,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
} }
qc->tf.command = ATA_CMD_PACKET; 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 */ /* check whether ATAPI DMA is safe */
if (!using_pio && ata_check_atapi_dma(qc)) if (!using_pio && ata_check_atapi_dma(qc))
...@@ -2550,7 +2558,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *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 * want to set it properly, and for DMA where it is
* effectively meaningless. * 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 /* Most ATAPI devices which honor transfer chunk size don't
* behave according to the spec when odd chunk size which * 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) ...@@ -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 * TODO: find out if we need to do more here to
* cover scatter/gather case. * 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 */ /* request result TF and be quiet about device error */
qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET; qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
......
...@@ -463,6 +463,7 @@ struct ata_queued_cmd { ...@@ -463,6 +463,7 @@ struct ata_queued_cmd {
unsigned int sect_size; unsigned int sect_size;
unsigned int nbytes; unsigned int nbytes;
unsigned int extrabytes;
unsigned int curbytes; unsigned int curbytes;
struct scatterlist *cursg; struct scatterlist *cursg;
...@@ -1336,6 +1337,11 @@ static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap, ...@@ -1336,6 +1337,11 @@ static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap,
return NULL; 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) static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
{ {
memset(tf, 0, sizeof(*tf)); memset(tf, 0, sizeof(*tf));
...@@ -1354,7 +1360,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc) ...@@ -1354,7 +1360,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
qc->flags = 0; qc->flags = 0;
qc->cursg = NULL; qc->cursg = NULL;
qc->cursg_ofs = 0; qc->cursg_ofs = 0;
qc->nbytes = qc->curbytes = 0; qc->nbytes = qc->extrabytes = qc->curbytes = 0;
qc->n_elem = 0; qc->n_elem = 0;
qc->err_mask = 0; qc->err_mask = 0;
qc->sect_size = ATA_SECT_SIZE; qc->sect_size = ATA_SECT_SIZE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment