From: Willy Tarreau <w@1wt.eu>
To: jeff@garzik.org
Cc: linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 1/2] libata: implement ATA_IOC_GET_IO32/ATA_IOC_SET_IO32 ioctls
Date: Sun, 17 Feb 2008 22:19:22 +0100 [thread overview]
Message-ID: <20080217211922.GA15327@1wt.eu> (raw)
In-Reply-To: <20080217211810.GA15001@1wt.eu>
>From 40a8174d27cb9d93b859bc073c8f075b9ff71578 Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Sun, 17 Feb 2008 21:11:46 +0100
Subject: [PATCH 1/2] libata: implement ATA_IOC_GET_IO32/ATA_IOC_SET_IO32 ioctls
This patch implements the aforementionned ioctls and get/set the
new ATA_DFLAG_32BIT_PIO ata flag accordingly for the device. It
only supports values 0 and 1 (disable/enable), as I have no plan
to implement the sync VLB transfers.
Signed-off-by: Willy Tarreau <w@1wt.eu>
---
drivers/ata/libata-scsi.c | 70 +++++++++++++++++++++++++++++++++++++++-----
include/linux/libata.h | 1 +
2 files changed, 63 insertions(+), 8 deletions(-)
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 1cea18f..8b4ca45 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -448,22 +448,76 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
return rc;
}
+/**
+ * ata_get_io32 - Handler for ATA_IOC_GET_IO32 ioctl
+ * @sdev: SCSI device to get identify data for
+ * @arg: User buffer area for return value
+ *
+ * LOCKING:
+ * Defined by the SCSI layer. We don't really care.
+ *
+ * RETURNS:
+ * Zero on success, negative errno on error.
+ */
+static int ata_get_io32(struct scsi_device *sdev, void __user *arg)
+{
+ struct ata_port *ap = ata_shost_to_port(sdev->host);
+ struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
+ int val;
+
+ if (!dev)
+ return -ENOMSG;
+
+ val = (dev->flags & ATA_DFLAG_32BIT_PIO) != 0;
+ if (copy_to_user(arg, &val, 1))
+ return -EFAULT;
+
+ return 0;
+}
+
+/**
+ * ata_set_io32 - Handler for ATA_IOC_SET_IO32 ioctl
+ * @sdev: SCSI device to get identify data for
+ * @arg: boolean integer value passed by user
+ *
+ * LOCKING:
+ * Defined by the SCSI layer. We don't really care.
+ *
+ * RETURNS:
+ * Zero on success, negative errno on error.
+ */
+static int ata_set_io32(struct scsi_device *sdev, void __user *arg)
+{
+ struct ata_port *ap = ata_shost_to_port(sdev->host);
+ struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
+
+ if (!dev)
+ return -ENOMSG;
+
+ switch ((unsigned long) arg) {
+ case 0:
+ dev->flags &= ~ATA_DFLAG_32BIT_PIO;
+ return 0;
+ case 1:
+ dev->flags |= ATA_DFLAG_32BIT_PIO;
+ return 0;
+ default:
+ break;
+ }
+
+ return -EFAULT;
+}
+
int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
{
int val = -EINVAL, rc = -EINVAL;
switch (cmd) {
case ATA_IOC_GET_IO32:
- val = 0;
- if (copy_to_user(arg, &val, 1))
- return -EFAULT;
- return 0;
+ return ata_get_io32(scsidev, arg);
case ATA_IOC_SET_IO32:
- val = (unsigned long) arg;
- if (val != 0)
- return -EINVAL;
- return 0;
+ return ata_set_io32(scsidev, arg);
case HDIO_GET_IDENTITY:
return ata_get_identity(scsidev, arg);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index bc5a8d0..ea9e3fc 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -138,6 +138,7 @@ enum {
ATA_DFLAG_AN = (1 << 7), /* AN configured */
ATA_DFLAG_HIPM = (1 << 8), /* device supports HIPM */
ATA_DFLAG_DIPM = (1 << 9), /* device supports DIPM */
+ ATA_DFLAG_32BIT_PIO = (1 << 10), /* device supports 32-bit in PIO mode */
ATA_DFLAG_CFG_MASK = (1 << 12) - 1,
ATA_DFLAG_PIO = (1 << 12), /* device limited to PIO mode */
--
1.5.3.8
next prev parent reply other threads:[~2008-02-17 21:19 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-17 21:18 [PATCH 0/2] libata: implement 32-bit transfers for PIO mode Willy Tarreau
2008-02-17 21:19 ` Willy Tarreau [this message]
2008-04-17 19:49 ` [PATCH 1/2] libata: implement ATA_IOC_GET_IO32/ATA_IOC_SET_IO32 ioctls Jeff Garzik
2008-04-17 19:46 ` Willy Tarreau
2008-04-17 22:02 ` [PATCH] libata: implement support for 32-bit PIO transfers Willy Tarreau
2008-02-17 21:20 ` [PATCH 2/2] " Willy Tarreau
2008-02-17 22:32 ` Alan Cox
2008-02-17 22:31 ` [PATCH 0/2] libata: implement 32-bit transfers for PIO mode Alan Cox
2008-02-17 23:08 ` Willy Tarreau
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=20080217211922.GA15327@1wt.eu \
--to=w@1wt.eu \
--cc=jeff@garzik.org \
--cc=linux-ide@vger.kernel.org \
--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;
as well as URLs for NNTP newsgroup(s).