linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix ata_task_ioctl to return ATA registers on check condition
@ 2006-12-14 15:59 David Milburn
  2006-12-19  7:20 ` Tejun Heo
  0 siblings, 1 reply; 2+ messages in thread
From: David Milburn @ 2006-12-14 15:59 UTC (permalink / raw)
  To: jeff, linux-ide

[-- Attachment #1: Type: text/plain, Size: 387 bytes --]

The HDIO_DRIVE_TASK ioctl should output the taskfile register values, 
the smartctl utility checks the values of the lba registers specifically 
the values of lbam and lbah for failure status (0xf4 and 0x2c 
respectively). This patch will copy the ATA registers back to the 
user-space application on a check condition similiar to ata_cmd_ioctl().

Please ACK or comment.

Thanks,
David

[-- Attachment #2: linux-2.6.19-ata-task-ioctl-sense.patch --]
[-- Type: text/x-patch, Size: 2507 bytes --]

--- linux-2.6.19-rc5/drivers/ata/libata-scsi.c.smart
+++ linux-2.6.19-rc5/drivers/ata/libata-scsi.c
@@ -273,8 +273,8 @@ int ata_task_ioctl(struct scsi_device *s
 {
 	int rc = 0;
 	u8 scsi_cmd[MAX_COMMAND_SIZE];
-	u8 args[7];
-	struct scsi_sense_hdr sshdr;
+	u8 args[7], *sensebuf = NULL;
+	int cmd_result;
 
 	if (arg == NULL)
 		return -EINVAL;
@@ -282,10 +282,14 @@ int ata_task_ioctl(struct scsi_device *s
 	if (copy_from_user(args, arg, sizeof(args)))
 		return -EFAULT;
 
+	sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
+	if (!sensebuf)
+		return -ENOMEM;
+
 	memset(scsi_cmd, 0, sizeof(scsi_cmd));
 	scsi_cmd[0]  = ATA_16;
 	scsi_cmd[1]  = (3 << 1); /* Non-data */
-	/* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
+	scsi_cmd[2]  = 0x20;     /* cc but no off.line or data xfer */
 	scsi_cmd[4]  = args[1];
 	scsi_cmd[6]  = args[2];
 	scsi_cmd[8]  = args[3];
@@ -295,11 +299,46 @@ int ata_task_ioctl(struct scsi_device *s
 
 	/* Good values for timeout and retries?  Values below
 	   from scsi_ioctl_send_command() for default case... */
-	if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
-			     (10*HZ), 5))
+	cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
+				  sensebuf, (10*HZ), 5, 0);
+	
+	if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
+		u8 *desc = sensebuf + 8;
+		cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
+
+		/* If we set cc then ATA pass-through will cause a
+		 * check condition even if no error. Filter that. */
+		if (cmd_result & SAM_STAT_CHECK_CONDITION) {
+			struct scsi_sense_hdr sshdr;
+			scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
+					     &sshdr);
+			if (sshdr.sense_key==0 &&
+			    sshdr.asc==0 && sshdr.ascq==0)
+				cmd_result &= ~SAM_STAT_CHECK_CONDITION;
+		}
+
+		/* Send userspace ATA registers */
+		if (sensebuf[0] == 0x72 &&     /* format is "descriptor" */
+		    desc[0] == 0x09) {         /* code is "ATA Descriptor" */
+			args[0] = desc[13];    /* status */
+			args[1] = desc[3];     /* error */
+			args[2] = desc[5];     /* sector count (0:7) */
+			args[3] = desc[7];     /* lbal */
+			args[4] = desc[9];     /* lbam */
+			args[5] = desc[11];    /* lbah */
+			args[6] = desc[12];    /* select */
+			if (copy_to_user(arg, args, sizeof(args)))
+				rc = -EFAULT;
+		}
+	}
+
+	if (cmd_result) {
 		rc = -EIO;
+		goto error;
+	}
 
-	/* Need code to retrieve data from check condition? */
+ error:
+	kfree(sensebuf);
 	return rc;
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Fix ata_task_ioctl to return ATA registers on check condition
  2006-12-14 15:59 [PATCH] Fix ata_task_ioctl to return ATA registers on check condition David Milburn
@ 2006-12-19  7:20 ` Tejun Heo
  0 siblings, 0 replies; 2+ messages in thread
From: Tejun Heo @ 2006-12-19  7:20 UTC (permalink / raw)
  To: David Milburn; +Cc: jeff, linux-ide

David Milburn wrote:
> The HDIO_DRIVE_TASK ioctl should output the taskfile register values,
> the smartctl utility checks the values of the lba registers specifically
> the values of lbam and lbah for failure status (0xf4 and 0x2c
> respectively). This patch will copy the ATA registers back to the
> user-space application on a check condition similiar to ata_cmd_ioctl().
> 
> Please ACK or comment.

Acked-by: Tejun Heo <htejun@gmail.com>

Great, but you need to resend the patch with Signed-off-by: line.

-- 
tejun

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-12-19  7:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-14 15:59 [PATCH] Fix ata_task_ioctl to return ATA registers on check condition David Milburn
2006-12-19  7:20 ` Tejun Heo

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).