From: Gilbert Wu <Gilbert_Wu@adaptec.com>
To: Linux-scsi@vger.kernel.org
Subject: [PATCH] aic94xx: fix smartctl utility problem
Date: Wed, 05 Sep 2007 15:25:55 -0700 [thread overview]
Message-ID: <1189031155.6108.8.camel@linux.site> (raw)
Fixed the problem that "smartctl -a /dev/some_sata_disk -d ata" does not work on SATA device.
( The smartctl v5.38 does need "-d ata" option.)
The root cause is the aic94xx driver does not return ATA output register due to performance reason.
The aic94xx need check ATA command which need ATA output register and turn on internal flag to
enable firmware to return ATA output register to top layer.
It also add new ATA commands to ata.h sush as ATA_CMD_CHK_MEDIA_TYPE and ATA_CMD_SMART.
Signed-off-by: Gilbert Wu <gilbert_wu@adaptec.com>
diff -urN a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c
--- a/drivers/scsi/aic94xx/aic94xx_task.c 2007-09-04 14:55:57.000000000 -0700
+++ b/drivers/scsi/aic94xx/aic94xx_task.c 2007-09-05 14:55:45.000000000 -0700
@@ -25,6 +25,7 @@
*/
#include <linux/spinlock.h>
+#include <linux/hdreg.h>
#include "aic94xx.h"
#include "aic94xx_sas.h"
#include "aic94xx_hwi.h"
@@ -152,6 +153,22 @@
pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
task->data_dir);
}
+static const struct ata_command_table {
+ u8 command;
+ u8 sub_command;
+} ata_command_tbl[] = {
+ {ATA_CMD_CHK_MEDIA_TYPE, 0},
+ {ATA_CMD_DEV_RESET, 0},
+ {ATA_CMD_EDD, 0},
+ {ATA_CMD_IDLEIMMEDIATE, 0},
+ {ATA_CMD_READ_NATIVE_MAX, 0},
+ {ATA_CMD_READ_NATIVE_MAX_EXT, 0},
+ {ATA_CMD_SET_MAX, 0},
+ {ATA_CMD_SET_MAX_EXT, 0},
+ {ATA_CMD_SMART, SMART_STATUS},
+ {ATA_CMD_SMART, SMART_IMMEDIATE_OFFLINE},
+ {0,0} /* terminate list */
+};
/* ---------- Task complete tasklet ---------- */
@@ -253,6 +270,7 @@
break;
case TC_SSP_RESP:
case TC_ATA_RESP:
+ case TC_CSMI:
ts->resp = SAS_TASK_COMPLETE;
ts->stat = SAS_PROTO_RESPONSE;
asd_get_response_tasklet(ascb, dl);
@@ -375,6 +393,21 @@
/* ---------- ATA ---------- */
+int need_ata_output_reg(u8 command, u8 sub_command)
+{
+
+ int i;
+
+ for (i = 0; ata_command_tbl[i].command != 0 ; i++) {
+
+ if (ata_command_tbl[i].command == command &&
+ (!ata_command_tbl[i].sub_command ||
+ ata_command_tbl[i].sub_command == sub_command ))
+ return 1;
+ }
+ return 0;
+}
+
static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
gfp_t gfp_flags)
{
@@ -427,6 +460,9 @@
flags |= STP_AFFIL_POLICY;
scb->ata_task.flags = flags;
}
+ if (need_ata_output_reg(scb->ata_task.fis.command,scb->ata_task.fis.features))
+ scb->ata_task.ata_flags|=CSMI_TASK;
+
ascb->tasklet_complete = asd_task_tasklet_complete;
if (likely(!task->ata_task.device_control_reg_update))
diff -urN a/include/linux/ata.h b/include/linux/ata.h
--- a/include/linux/ata.h 2007-09-04 14:48:44.000000000 -0700
+++ b/include/linux/ata.h 2007-09-04 19:28:05.000000000 -0700
@@ -175,6 +175,8 @@
ATA_CMD_READ_LOG_EXT = 0x2f,
ATA_CMD_PMP_READ = 0xE4,
ATA_CMD_PMP_WRITE = 0xE8,
+ ATA_CMD_CHK_MEDIA_TYPE = 0xD1,
+ ATA_CMD_SMART = 0xB0,
/* READ_LOG_EXT pages */
ATA_LOG_SATA_NCQ = 0x10,
next reply other threads:[~2007-09-05 20:44 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-05 22:25 Gilbert Wu [this message]
2007-09-06 10:06 ` [PATCH] aic94xx: fix smartctl utility problem Jeff Garzik
2007-09-06 18:33 ` Wu, Gilbert
2007-09-07 23:00 ` Jeff Garzik
2007-09-07 23:58 ` Wu, Gilbert
-- strict thread matches above, loose matches on Subject: below --
2007-09-14 12:30 Gilbert Wu
2007-09-14 17:26 ` Jeff Garzik
2007-09-14 17:30 ` Wu, Gilbert
2007-09-14 17:58 Gilbert Wu
2007-09-14 18:14 ` Jeff Garzik
2007-09-15 17:05 ` James Bottomley
2007-09-16 16:37 ` James Bottomley
2007-09-16 19:43 ` Jeff Garzik
2007-09-16 23:01 ` Douglas Gilbert
2007-09-16 23:21 ` James Bottomley
2007-09-17 20:53 ` Wu, Gilbert
2007-09-17 22:59 ` James Bottomley
2007-09-18 1:43 ` Wu, Gilbert
2007-09-18 3:31 ` James Bottomley
2007-09-21 18:53 ` Wu, Gilbert
2007-09-21 20:40 ` James Bottomley
2007-09-21 23:05 ` Wu, Gilbert
2007-09-20 18:52 ` Douglas Gilbert
2007-09-18 20:35 ` Luben Tuikov
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=1189031155.6108.8.camel@linux.site \
--to=gilbert_wu@adaptec.com \
--cc=Linux-scsi@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