aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-scsi.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-05-15 08:03:39 -0400
committerTejun Heo <htejun@gmail.com>2006-05-15 08:03:39 -0400
commit2115ea94a2d11fbd228b049e667ec2d3e91ca371 (patch)
tree0584347308aa40af982f5f01d654a8186599b48c /drivers/scsi/libata-scsi.c
parent88e490340ea4c3a2ebc0187a4339912e2fc1a081 (diff)
[PATCH] libata-ncq: pass ata_scsi_translate() return value to SCSI midlayer
ata_scsi_translate() will need to return SCSI_ML_QUEUE_DEVICE_BUSY to achieve exlusion between NCQ and non-NCQ commands or among non-NCQ commands. Pass its return value upward to SCSI midlayer. Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/scsi/libata-scsi.c')
-rw-r--r--drivers/scsi/libata-scsi.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index e61cc357ae4a..96517ca021e3 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -1248,11 +1248,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1248 * 1248 *
1249 * LOCKING: 1249 * LOCKING:
1250 * spin_lock_irqsave(host_set lock) 1250 * spin_lock_irqsave(host_set lock)
1251 *
1252 * RETURNS:
1253 * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
1254 * needs to be deferred.
1251 */ 1255 */
1252 1256static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
1253static void ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, 1257 void (*done)(struct scsi_cmnd *),
1254 void (*done)(struct scsi_cmnd *), 1258 ata_xlat_func_t xlat_func)
1255 ata_xlat_func_t xlat_func)
1256{ 1259{
1257 struct ata_queued_cmd *qc; 1260 struct ata_queued_cmd *qc;
1258 u8 *scsicmd = cmd->cmnd; 1261 u8 *scsicmd = cmd->cmnd;
@@ -1290,13 +1293,13 @@ static void ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
1290 ata_qc_issue(qc); 1293 ata_qc_issue(qc);
1291 1294
1292 VPRINTK("EXIT\n"); 1295 VPRINTK("EXIT\n");
1293 return; 1296 return 0;
1294 1297
1295early_finish: 1298early_finish:
1296 ata_qc_free(qc); 1299 ata_qc_free(qc);
1297 done(cmd); 1300 done(cmd);
1298 DPRINTK("EXIT - early finish (good or error)\n"); 1301 DPRINTK("EXIT - early finish (good or error)\n");
1299 return; 1302 return 0;
1300 1303
1301err_did: 1304err_did:
1302 ata_qc_free(qc); 1305 ata_qc_free(qc);
@@ -1304,7 +1307,7 @@ err_mem:
1304 cmd->result = (DID_ERROR << 16); 1307 cmd->result = (DID_ERROR << 16);
1305 done(cmd); 1308 done(cmd);
1306 DPRINTK("EXIT - internal\n"); 1309 DPRINTK("EXIT - internal\n");
1307 return; 1310 return 0;
1308} 1311}
1309 1312
1310/** 1313/**
@@ -2456,20 +2459,24 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap,
2456#endif 2459#endif
2457} 2460}
2458 2461
2459static inline void __ata_scsi_queuecmd(struct scsi_cmnd *cmd, 2462static inline int __ata_scsi_queuecmd(struct scsi_cmnd *cmd,
2460 void (*done)(struct scsi_cmnd *), 2463 void (*done)(struct scsi_cmnd *),
2461 struct ata_device *dev) 2464 struct ata_device *dev)
2462{ 2465{
2466 int rc = 0;
2467
2463 if (dev->class == ATA_DEV_ATA) { 2468 if (dev->class == ATA_DEV_ATA) {
2464 ata_xlat_func_t xlat_func = ata_get_xlat_func(dev, 2469 ata_xlat_func_t xlat_func = ata_get_xlat_func(dev,
2465 cmd->cmnd[0]); 2470 cmd->cmnd[0]);
2466 2471
2467 if (xlat_func) 2472 if (xlat_func)
2468 ata_scsi_translate(dev, cmd, done, xlat_func); 2473 rc = ata_scsi_translate(dev, cmd, done, xlat_func);
2469 else 2474 else
2470 ata_scsi_simulate(dev, cmd, done); 2475 ata_scsi_simulate(dev, cmd, done);
2471 } else 2476 } else
2472 ata_scsi_translate(dev, cmd, done, atapi_xlat); 2477 rc = ata_scsi_translate(dev, cmd, done, atapi_xlat);
2478
2479 return rc;
2473} 2480}
2474 2481
2475/** 2482/**
@@ -2488,15 +2495,16 @@ static inline void __ata_scsi_queuecmd(struct scsi_cmnd *cmd,
2488 * Releases scsi-layer-held lock, and obtains host_set lock. 2495 * Releases scsi-layer-held lock, and obtains host_set lock.
2489 * 2496 *
2490 * RETURNS: 2497 * RETURNS:
2491 * Zero. 2498 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
2499 * 0 otherwise.
2492 */ 2500 */
2493
2494int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) 2501int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2495{ 2502{
2496 struct ata_port *ap; 2503 struct ata_port *ap;
2497 struct ata_device *dev; 2504 struct ata_device *dev;
2498 struct scsi_device *scsidev = cmd->device; 2505 struct scsi_device *scsidev = cmd->device;
2499 struct Scsi_Host *shost = scsidev->host; 2506 struct Scsi_Host *shost = scsidev->host;
2507 int rc = 0;
2500 2508
2501 ap = ata_shost_to_port(shost); 2509 ap = ata_shost_to_port(shost);
2502 2510
@@ -2507,7 +2515,7 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2507 2515
2508 dev = ata_scsi_find_dev(ap, scsidev); 2516 dev = ata_scsi_find_dev(ap, scsidev);
2509 if (likely(dev)) 2517 if (likely(dev))
2510 __ata_scsi_queuecmd(cmd, done, dev); 2518 rc = __ata_scsi_queuecmd(cmd, done, dev);
2511 else { 2519 else {
2512 cmd->result = (DID_BAD_TARGET << 16); 2520 cmd->result = (DID_BAD_TARGET << 16);
2513 done(cmd); 2521 done(cmd);
@@ -2515,7 +2523,7 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2515 2523
2516 spin_unlock(&ap->host_set->lock); 2524 spin_unlock(&ap->host_set->lock);
2517 spin_lock(shost->host_lock); 2525 spin_lock(shost->host_lock);
2518 return 0; 2526 return rc;
2519} 2527}
2520 2528
2521/** 2529/**