From: Tejun Heo <htejun@gmail.com>
To: axboe@suse.de, jgarzik@pobox.com, James.Bottomley@steeleye.com,
bzolnier@gmail.com
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH linux-2.6-block:master 07/10] blk: add FUA support to libata
Date: Wed, 19 Oct 2005 21:48:17 +0900 (KST) [thread overview]
Message-ID: <20051019124716.E1B02C73@htj.dyndns.org> (raw)
In-Reply-To: <20051019124716.EF1F6546@htj.dyndns.org>
07_blk_libata-add-fua-support.patch
Add FUA support to libata.
Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/scsi/libata-core.c | 14 +++++++++-----
drivers/scsi/libata-scsi.c | 36 +++++++++++++++++++++++++++++++++---
include/linux/ata.h | 4 +++-
include/linux/libata.h | 1 +
4 files changed, 46 insertions(+), 9 deletions(-)
Index: blk-fixes/drivers/scsi/libata-core.c
===================================================================
--- blk-fixes.orig/drivers/scsi/libata-core.c 2005-10-19 21:46:49.000000000 +0900
+++ blk-fixes/drivers/scsi/libata-core.c 2005-10-19 21:47:14.000000000 +0900
@@ -616,19 +616,21 @@ void ata_tf_from_fis(u8 *fis, struct ata
}
/**
- * ata_prot_to_cmd - determine which read/write opcodes to use
+ * ata_prot_to_cmd - determine which read/write/fua-write opcodes to use
* @protocol: ATA_PROT_xxx taskfile protocol
* @lba48: true is lba48 is present
*
- * Given necessary input, determine which read/write commands
- * to use to transfer data.
+ * Given necessary input, determine which read/write/fua-write
+ * commands to use to transfer data. Note that we only support
+ * fua-writes on DMA LBA48 protocol. In other cases, we simply
+ * return 0 which is NOP.
*
* LOCKING:
* None.
*/
static int ata_prot_to_cmd(int protocol, int lba48)
{
- int rcmd = 0, wcmd = 0;
+ int rcmd = 0, wcmd = 0, wfua = 0;
switch (protocol) {
case ATA_PROT_PIO:
@@ -645,6 +647,7 @@ static int ata_prot_to_cmd(int protocol,
if (lba48) {
rcmd = ATA_CMD_READ_EXT;
wcmd = ATA_CMD_WRITE_EXT;
+ wfua = ATA_CMD_WRITE_FUA_EXT;
} else {
rcmd = ATA_CMD_READ;
wcmd = ATA_CMD_WRITE;
@@ -655,7 +658,7 @@ static int ata_prot_to_cmd(int protocol,
return -1;
}
- return rcmd | (wcmd << 8);
+ return rcmd | (wcmd << 8) | (wfua << 16);
}
/**
@@ -688,6 +691,7 @@ static void ata_dev_set_protocol(struct
dev->read_cmd = cmd & 0xff;
dev->write_cmd = (cmd >> 8) & 0xff;
+ dev->write_fua_cmd = (cmd >> 16) & 0xff;
}
static const char * xfer_mode_str[] = {
Index: blk-fixes/drivers/scsi/libata-scsi.c
===================================================================
--- blk-fixes.orig/drivers/scsi/libata-scsi.c 2005-10-19 21:46:49.000000000 +0900
+++ blk-fixes/drivers/scsi/libata-scsi.c 2005-10-19 21:47:14.000000000 +0900
@@ -608,12 +608,40 @@ static unsigned int ata_scsi_rw_xlat(str
tf->protocol = qc->dev->xfer_protocol;
tf->device |= ATA_LBA;
- if (scsicmd[0] == READ_10 || scsicmd[0] == READ_6 ||
- scsicmd[0] == READ_16) {
+ switch (scsicmd[0]) {
+ case READ_10:
+ case READ_16:
+ if (unlikely(scsicmd[1] & (1 << 3))) {
+ printk(KERN_WARNING
+ "ata%u(%u): WARNING: FUA READ unsupported\n",
+ qc->ap->id, qc->dev->devno);
+ return 1;
+ }
+ /* fall through */
+ case READ_6:
tf->command = qc->dev->read_cmd;
- } else {
+ break;
+
+ case WRITE_10:
+ case WRITE_16:
+ if (unlikely(scsicmd[1] & (1 << 3))) {
+ if (qc->dev->write_fua_cmd == 0 || !lba48) {
+ printk(KERN_WARNING
+ "ata%u(%u): WARNING: FUA WRITE "
+ "unsupported with the current "
+ "protocol/addressing\n",
+ qc->ap->id, qc->dev->devno);
+ return 1;
+ }
+ tf->command = qc->dev->write_fua_cmd;
+ tf->flags |= ATA_TFLAG_WRITE;
+ break;
+ }
+ /* fall through */
+ case WRITE_6:
tf->command = qc->dev->write_cmd;
tf->flags |= ATA_TFLAG_WRITE;
+ break;
}
if (scsicmd[0] == READ_10 || scsicmd[0] == WRITE_10) {
@@ -1217,10 +1245,12 @@ unsigned int ata_scsiop_mode_sense(struc
if (six_byte) {
output_len--;
rbuf[0] = output_len;
+ rbuf[2] |= ata_id_has_fua(args->id) ? 1 << 4 : 0;
} else {
output_len -= 2;
rbuf[0] = output_len >> 8;
rbuf[1] = output_len;
+ rbuf[3] |= ata_id_has_fua(args->id) ? 1 << 4 : 0;
}
return 0;
Index: blk-fixes/include/linux/ata.h
===================================================================
--- blk-fixes.orig/include/linux/ata.h 2005-10-19 21:46:49.000000000 +0900
+++ blk-fixes/include/linux/ata.h 2005-10-19 21:47:14.000000000 +0900
@@ -124,6 +124,7 @@ enum {
ATA_CMD_READ_EXT = 0x25,
ATA_CMD_WRITE = 0xCA,
ATA_CMD_WRITE_EXT = 0x35,
+ ATA_CMD_WRITE_FUA_EXT = 0x3D,
ATA_CMD_PIO_READ = 0x20,
ATA_CMD_PIO_READ_EXT = 0x24,
ATA_CMD_PIO_WRITE = 0x30,
@@ -234,7 +235,8 @@ struct ata_taskfile {
#define ata_id_is_sata(id) ((id)[93] == 0)
#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
-#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
+#define ata_id_has_fua(id) ((id)[84] & (1 << 6))
+#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
#define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13))
#define ata_id_has_lba48(id) ((id)[83] & (1 << 10))
#define ata_id_has_wcache(id) ((id)[82] & (1 << 5))
Index: blk-fixes/include/linux/libata.h
===================================================================
--- blk-fixes.orig/include/linux/libata.h 2005-10-19 21:46:49.000000000 +0900
+++ blk-fixes/include/linux/libata.h 2005-10-19 21:47:14.000000000 +0900
@@ -282,6 +282,7 @@ struct ata_device {
u8 xfer_protocol; /* taskfile xfer protocol */
u8 read_cmd; /* opcode to use on read */
u8 write_cmd; /* opcode to use on write */
+ u8 write_fua_cmd; /* opcode to use on FUA write */
};
struct ata_port {
next prev parent reply other threads:[~2005-10-19 12:49 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-19 12:47 [PATCH linux-2.6-block:master 00/10] blk: reimplementation of I/O barrier Tejun Heo
2005-10-19 12:47 ` [PATCH linux-2.6-block:master 01/10] blk: add @uptodate to end_that_request_last() and @error to rq_end_io_fn() Tejun Heo
2005-10-19 12:47 ` [PATCH linux-2.6-block:master 02/10] blk: separate out bio init part from __make_request Tejun Heo
2005-10-19 12:47 ` [PATCH linux-2.6-block:master 03/10] blk: reimplement handling of barrier request Tejun Heo
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 04/10] blk: update SCSI to use new blk_ordered Tejun Heo
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 05/10] blk: add FUA support to SCSI disk Tejun Heo
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 06/10] blk: update libata to use new blk_ordered Tejun Heo
2005-10-19 12:48 ` Tejun Heo [this message]
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 08/10] blk: update IDE " Tejun Heo
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 09/10] blk: add FUA support to IDE Tejun Heo
2005-10-19 12:48 ` [PATCH linux-2.6-block:master 10/10] blk: I/O barrier documentation Tejun Heo
-- strict thread matches above, loose matches on Subject: below --
2005-07-26 15:45 [PATCH linux-2.6-block:master 00/10] blk: reimplementation of I/O barrier Tejun Heo
2005-07-26 15:46 ` [PATCH linux-2.6-block:master 07/10] blk: add FUA support to libata Tejun Heo
2005-07-26 15:55 ` Jeff Garzik
2005-07-27 7:44 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20051019124716.E1B02C73@htj.dyndns.org \
--to=htejun@gmail.com \
--cc=James.Bottomley@steeleye.com \
--cc=axboe@suse.de \
--cc=bzolnier@gmail.com \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®