[PATCH] libata-ncq: implement NCQ command translation and exclusion
authorTejun Heo <htejun@gmail.com>
Mon, 15 May 2006 12:03:45 +0000 (21:03 +0900)
committerTejun Heo <htejun@gmail.com>
Mon, 15 May 2006 12:03:45 +0000 (21:03 +0900)
commit3dc1d88193b9c65b01b64fb2dc730e486306649f
tree1ffba999eadfe0e5b704d8ee9163483ef31e0591
parentdedaf2b0365ccec50714fbde0b3215e7e94fa47c
[PATCH] libata-ncq: implement NCQ command translation and exclusion

This patch implements NCQ command translation and exclusion.  Note
that NCQ commands don't use ata_rwcmd_protocol() to choose ATA
command.  This is because, unlike non-NCQ RW commands, NCQ commands
can only be used for NCQ protocol and FUA handling is done with a flag
rather than separate command.

NCQ enabled device will have queue depth larger than one but no two
non-NCQ commands can be issued simultaneously, neither can a non-NCQ
command and NCQ commands.  This patch makes ata_scsi_translate()
return SCSI_MLQUEUE_DEVICE_BUSY if such exclusion is necessary.  SCSI
midlayer will retry the command later.

As SCSI midlayer always retries once a command completes, this doesn't
incur unnecessary delays and as most commands will be NCQ ones for NCQ
device, so the overhead should be negligible.

Initial implementation is from Jens Axboe and using
SCSI_MLQUEUE_DEVICE_BUSY for exclusion is suggested by Jeff Garzik.

Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/scsi/libata-core.c
drivers/scsi/libata-scsi.c