aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-05-15 07:57:40 -0400
committerTejun Heo <htejun@gmail.com>2006-05-15 07:57:40 -0400
commite61e067227bc76b4d9411a50d735c9d87f27b0e2 (patch)
tree007d22539b24aa6ae8e258af6e22a4187490a4c1 /drivers
parent96bd39ec295e49443c8b0c25a6b69fdace18780f (diff)
[PATCH] libata: implement qc->result_tf
Add qc->result_tf and ATA_QCFLAG_RESULT_TF. This moves the responsibility of loading result TF from post-compltion path to qc execution path. qc->result_tf is loaded if explicitly requested or the qc failsa. This allows more efficient completion implementation and correct handling of result TF for controllers which don't have global TF representation such as sil3124/32. Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/libata-core.c4
-rw-r--r--drivers/scsi/libata-scsi.c18
2 files changed, 9 insertions, 13 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 19ae3fa1cfcb..51cb9ca5519c 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -955,7 +955,6 @@ void ata_qc_complete_internal(struct ata_queued_cmd *qc)
955{ 955{
956 struct completion *waiting = qc->private_data; 956 struct completion *waiting = qc->private_data;
957 957
958 qc->ap->ops->tf_read(qc->ap, &qc->tf);
959 complete(waiting); 958 complete(waiting);
960} 959}
961 960
@@ -997,6 +996,7 @@ unsigned ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
997 qc->tf = *tf; 996 qc->tf = *tf;
998 if (cdb) 997 if (cdb)
999 memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); 998 memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
999 qc->flags |= ATA_QCFLAG_RESULT_TF;
1000 qc->dma_dir = dma_dir; 1000 qc->dma_dir = dma_dir;
1001 if (dma_dir != DMA_NONE) { 1001 if (dma_dir != DMA_NONE) {
1002 ata_sg_init_one(qc, buf, buflen); 1002 ata_sg_init_one(qc, buf, buflen);
@@ -1034,7 +1034,7 @@ unsigned ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
1034 /* finish up */ 1034 /* finish up */
1035 spin_lock_irqsave(&ap->host_set->lock, flags); 1035 spin_lock_irqsave(&ap->host_set->lock, flags);
1036 1036
1037 *tf = qc->tf; 1037 *tf = qc->result_tf;
1038 err_mask = qc->err_mask; 1038 err_mask = qc->err_mask;
1039 1039
1040 ata_qc_free(qc); 1040 ata_qc_free(qc);
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index b0c83c28d578..ce90b6352a81 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -537,7 +537,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
537void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc) 537void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc)
538{ 538{
539 struct scsi_cmnd *cmd = qc->scsicmd; 539 struct scsi_cmnd *cmd = qc->scsicmd;
540 struct ata_taskfile *tf = &qc->tf; 540 struct ata_taskfile *tf = &qc->result_tf;
541 unsigned char *sb = cmd->sense_buffer; 541 unsigned char *sb = cmd->sense_buffer;
542 unsigned char *desc = sb + 8; 542 unsigned char *desc = sb + 8;
543 543
@@ -608,7 +608,7 @@ void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc)
608void ata_gen_fixed_sense(struct ata_queued_cmd *qc) 608void ata_gen_fixed_sense(struct ata_queued_cmd *qc)
609{ 609{
610 struct scsi_cmnd *cmd = qc->scsicmd; 610 struct scsi_cmnd *cmd = qc->scsicmd;
611 struct ata_taskfile *tf = &qc->tf; 611 struct ata_taskfile *tf = &qc->result_tf;
612 unsigned char *sb = cmd->sense_buffer; 612 unsigned char *sb = cmd->sense_buffer;
613 613
614 memset(sb, 0, SCSI_SENSE_BUFFERSIZE); 614 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
@@ -1199,14 +1199,11 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1199 */ 1199 */
1200 if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) && 1200 if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
1201 ((cdb[2] & 0x20) || need_sense)) { 1201 ((cdb[2] & 0x20) || need_sense)) {
1202 qc->ap->ops->tf_read(qc->ap, &qc->tf);
1203 ata_gen_ata_desc_sense(qc); 1202 ata_gen_ata_desc_sense(qc);
1204 } else { 1203 } else {
1205 if (!need_sense) { 1204 if (!need_sense) {
1206 cmd->result = SAM_STAT_GOOD; 1205 cmd->result = SAM_STAT_GOOD;
1207 } else { 1206 } else {
1208 qc->ap->ops->tf_read(qc->ap, &qc->tf);
1209
1210 /* TODO: decide which descriptor format to use 1207 /* TODO: decide which descriptor format to use
1211 * for 48b LBA devices and call that here 1208 * for 48b LBA devices and call that here
1212 * instead of the fixed desc, which is only 1209 * instead of the fixed desc, which is only
@@ -1217,10 +1214,8 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1217 } 1214 }
1218 } 1215 }
1219 1216
1220 if (need_sense) { 1217 if (need_sense)
1221 /* The ata_gen_..._sense routines fill in tf */ 1218 ata_dump_status(qc->ap->id, &qc->result_tf);
1222 ata_dump_status(qc->ap->id, &qc->tf);
1223 }
1224 1219
1225 qc->scsidone(cmd); 1220 qc->scsidone(cmd);
1226 1221
@@ -2004,7 +1999,6 @@ static void atapi_sense_complete(struct ata_queued_cmd *qc)
2004 * a sense descriptors, since that's only 1999 * a sense descriptors, since that's only
2005 * correct for ATA, not ATAPI 2000 * correct for ATA, not ATAPI
2006 */ 2001 */
2007 qc->ap->ops->tf_read(qc->ap, &qc->tf);
2008 ata_gen_ata_desc_sense(qc); 2002 ata_gen_ata_desc_sense(qc);
2009 } 2003 }
2010 2004
@@ -2080,7 +2074,6 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
2080 * a sense descriptors, since that's only 2074 * a sense descriptors, since that's only
2081 * correct for ATA, not ATAPI 2075 * correct for ATA, not ATAPI
2082 */ 2076 */
2083 qc->ap->ops->tf_read(qc->ap, &qc->tf);
2084 ata_gen_ata_desc_sense(qc); 2077 ata_gen_ata_desc_sense(qc);
2085 } else { 2078 } else {
2086 u8 *scsicmd = cmd->cmnd; 2079 u8 *scsicmd = cmd->cmnd;
@@ -2361,6 +2354,9 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
2361 */ 2354 */
2362 qc->nsect = cmd->bufflen / ATA_SECT_SIZE; 2355 qc->nsect = cmd->bufflen / ATA_SECT_SIZE;
2363 2356
2357 /* request result TF */
2358 qc->flags |= ATA_QCFLAG_RESULT_TF;
2359
2364 return 0; 2360 return 0;
2365 2361
2366 invalid_fld: 2362 invalid_fld: