aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-scsi.c
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/scsi/libata-scsi.c
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/scsi/libata-scsi.c')
-rw-r--r--drivers/scsi/libata-scsi.c18
1 files changed, 7 insertions, 11 deletions
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: