diff options
author | Tejun Heo <htejun@gmail.com> | 2008-03-18 04:47:43 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2008-03-24 22:09:12 -0400 |
commit | aacda37538e7f9cf2148eedf3766239829e51ba4 (patch) | |
tree | 0206d2db8ce636aadabf8e3effd1ee3114ccff2a | |
parent | cc7feea39bed2951cc29af3ad642f39a99dfe8d3 (diff) |
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>
-rw-r--r-- | drivers/ata/libata-scsi.c | 14 | ||||
-rw-r--r-- | include/linux/libata.h | 8 |
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 8f0e8f2bc628..15795394b0a8 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -527,6 +527,14 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, | |||
527 | return qc; | 527 | return qc; |
528 | } | 528 | } |
529 | 529 | ||
530 | static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc) | ||
531 | { | ||
532 | struct scsi_cmnd *scmd = qc->scsicmd; | ||
533 | |||
534 | qc->extrabytes = scmd->request->extra_len; | ||
535 | qc->nbytes = scsi_bufflen(scmd) + qc->extrabytes; | ||
536 | } | ||
537 | |||
530 | /** | 538 | /** |
531 | * ata_dump_status - user friendly display of error info | 539 | * ata_dump_status - user friendly display of error info |
532 | * @id: id of the port in question | 540 | * @id: id of the port in question |
@@ -2539,7 +2547,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2539 | } | 2547 | } |
2540 | 2548 | ||
2541 | qc->tf.command = ATA_CMD_PACKET; | 2549 | qc->tf.command = ATA_CMD_PACKET; |
2542 | qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len; | 2550 | ata_qc_set_pc_nbytes(qc); |
2543 | 2551 | ||
2544 | /* check whether ATAPI DMA is safe */ | 2552 | /* check whether ATAPI DMA is safe */ |
2545 | if (!using_pio && ata_check_atapi_dma(qc)) | 2553 | if (!using_pio && ata_check_atapi_dma(qc)) |
@@ -2550,7 +2558,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2550 | * want to set it properly, and for DMA where it is | 2558 | * want to set it properly, and for DMA where it is |
2551 | * effectively meaningless. | 2559 | * effectively meaningless. |
2552 | */ | 2560 | */ |
2553 | nbytes = min(scmd->request->data_len, (unsigned int)63 * 1024); | 2561 | nbytes = min(ata_qc_raw_nbytes(qc), (unsigned int)63 * 1024); |
2554 | 2562 | ||
2555 | /* Most ATAPI devices which honor transfer chunk size don't | 2563 | /* Most ATAPI devices which honor transfer chunk size don't |
2556 | * behave according to the spec when odd chunk size which | 2564 | * 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 | * TODO: find out if we need to do more here to | 2884 | * TODO: find out if we need to do more here to |
2877 | * cover scatter/gather case. | 2885 | * cover scatter/gather case. |
2878 | */ | 2886 | */ |
2879 | qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len; | 2887 | ata_qc_set_pc_nbytes(qc); |
2880 | 2888 | ||
2881 | /* request result TF and be quiet about device error */ | 2889 | /* request result TF and be quiet about device error */ |
2882 | qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET; | 2890 | qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index a05f60013642..269cdba09578 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -463,6 +463,7 @@ struct ata_queued_cmd { | |||
463 | unsigned int sect_size; | 463 | unsigned int sect_size; |
464 | 464 | ||
465 | unsigned int nbytes; | 465 | unsigned int nbytes; |
466 | unsigned int extrabytes; | ||
466 | unsigned int curbytes; | 467 | unsigned int curbytes; |
467 | 468 | ||
468 | struct scatterlist *cursg; | 469 | struct scatterlist *cursg; |
@@ -1336,6 +1337,11 @@ static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap, | |||
1336 | return NULL; | 1337 | return NULL; |
1337 | } | 1338 | } |
1338 | 1339 | ||
1340 | static inline unsigned int ata_qc_raw_nbytes(struct ata_queued_cmd *qc) | ||
1341 | { | ||
1342 | return qc->nbytes - min(qc->extrabytes, qc->nbytes); | ||
1343 | } | ||
1344 | |||
1339 | static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) | 1345 | static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) |
1340 | { | 1346 | { |
1341 | memset(tf, 0, sizeof(*tf)); | 1347 | memset(tf, 0, sizeof(*tf)); |
@@ -1354,7 +1360,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc) | |||
1354 | qc->flags = 0; | 1360 | qc->flags = 0; |
1355 | qc->cursg = NULL; | 1361 | qc->cursg = NULL; |
1356 | qc->cursg_ofs = 0; | 1362 | qc->cursg_ofs = 0; |
1357 | qc->nbytes = qc->curbytes = 0; | 1363 | qc->nbytes = qc->extrabytes = qc->curbytes = 0; |
1358 | qc->n_elem = 0; | 1364 | qc->n_elem = 0; |
1359 | qc->err_mask = 0; | 1365 | qc->err_mask = 0; |
1360 | qc->sect_size = ATA_SECT_SIZE; | 1366 | qc->sect_size = ATA_SECT_SIZE; |