All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.