diff options
author | Tejun Heo <htejun@gmail.com> | 2007-10-09 02:06:48 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:47 -0400 |
commit | b06ce3e51e3df4394a584c234f11240b1c6f8d5b (patch) | |
tree | 6a6f5a1cccdc2972b236d376afeba4fd296d5400 /drivers/ata/sata_sil24.c | |
parent | afaa5c373d2c49ee4865847031b82f1377f609d0 (diff) |
libata: use ata_exec_internal() for PMP register access
PMP registers used to be accessed with dedicated accessors ->pmp_read
and ->pmp_write. During reset, those callbacks are called with the
port frozen so they should be able to run without depending on
interrupt delivery. To achieve this, they were implemented polling.
However, as resetting the host port makes the PMP to isolate fan-out
ports until SError.X is cleared, resetting fan-out ports while port is
frozen doesn't buy much additional safety.
This patch updates libata PMP support such that PMP registers are
accessed using regular ata_exec_internal() mechanism and kills
->pmp_read/write() callbacks. The following changes are made.
* PMP access helpers - sata_pmp_read_init_tf(), sata_pmp_read_val(),
sata_pmp_write_init_tf() are folded into sata_pmp_read/write() which
are now standalone PMP register access functions.
* sata_pmp_read/write() returns err_mask instead of rc. This is
consistent with other functions which issue internal commands and
allows more detailed error reporting.
* ahci interrupt handler is modified to ignore BAD_PMP and
spurious/illegal completion IRQs while reset is in progress. These
conditions are expected during reset.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/sata_sil24.c')
-rw-r--r-- | drivers/ata/sata_sil24.c | 30 |
1 files changed, 0 insertions, 30 deletions
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 15b9a80a1782..b0619278454a 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -337,8 +337,6 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); | |||
337 | static void sil24_irq_clear(struct ata_port *ap); | 337 | static void sil24_irq_clear(struct ata_port *ap); |
338 | static void sil24_pmp_attach(struct ata_port *ap); | 338 | static void sil24_pmp_attach(struct ata_port *ap); |
339 | static void sil24_pmp_detach(struct ata_port *ap); | 339 | static void sil24_pmp_detach(struct ata_port *ap); |
340 | static int sil24_pmp_read(struct ata_device *dev, int pmp, int reg, u32 *r_val); | ||
341 | static int sil24_pmp_write(struct ata_device *dev, int pmp, int reg, u32 val); | ||
342 | static void sil24_freeze(struct ata_port *ap); | 340 | static void sil24_freeze(struct ata_port *ap); |
343 | static void sil24_thaw(struct ata_port *ap); | 341 | static void sil24_thaw(struct ata_port *ap); |
344 | static void sil24_error_handler(struct ata_port *ap); | 342 | static void sil24_error_handler(struct ata_port *ap); |
@@ -411,8 +409,6 @@ static const struct ata_port_operations sil24_ops = { | |||
411 | 409 | ||
412 | .pmp_attach = sil24_pmp_attach, | 410 | .pmp_attach = sil24_pmp_attach, |
413 | .pmp_detach = sil24_pmp_detach, | 411 | .pmp_detach = sil24_pmp_detach, |
414 | .pmp_read = sil24_pmp_read, | ||
415 | .pmp_write = sil24_pmp_write, | ||
416 | 412 | ||
417 | .freeze = sil24_freeze, | 413 | .freeze = sil24_freeze, |
418 | .thaw = sil24_thaw, | 414 | .thaw = sil24_thaw, |
@@ -928,32 +924,6 @@ static void sil24_pmp_detach(struct ata_port *ap) | |||
928 | sil24_config_pmp(ap, 0); | 924 | sil24_config_pmp(ap, 0); |
929 | } | 925 | } |
930 | 926 | ||
931 | static int sil24_pmp_read(struct ata_device *dev, int pmp, int reg, u32 *r_val) | ||
932 | { | ||
933 | struct ata_port *ap = dev->link->ap; | ||
934 | struct ata_taskfile tf; | ||
935 | int rc; | ||
936 | |||
937 | sata_pmp_read_init_tf(&tf, dev, pmp, reg); | ||
938 | rc = sil24_exec_polled_cmd(ap, SATA_PMP_CTRL_PORT, &tf, 1, 0, | ||
939 | SATA_PMP_SCR_TIMEOUT); | ||
940 | if (rc == 0) { | ||
941 | sil24_read_tf(ap, 0, &tf); | ||
942 | *r_val = sata_pmp_read_val(&tf); | ||
943 | } | ||
944 | return rc; | ||
945 | } | ||
946 | |||
947 | static int sil24_pmp_write(struct ata_device *dev, int pmp, int reg, u32 val) | ||
948 | { | ||
949 | struct ata_port *ap = dev->link->ap; | ||
950 | struct ata_taskfile tf; | ||
951 | |||
952 | sata_pmp_write_init_tf(&tf, dev, pmp, reg, val); | ||
953 | return sil24_exec_polled_cmd(ap, SATA_PMP_CTRL_PORT, &tf, 1, 0, | ||
954 | SATA_PMP_SCR_TIMEOUT); | ||
955 | } | ||
956 | |||
957 | static int sil24_pmp_softreset(struct ata_link *link, unsigned int *class, | 927 | static int sil24_pmp_softreset(struct ata_link *link, unsigned int *class, |
958 | unsigned long deadline) | 928 | unsigned long deadline) |
959 | { | 929 | { |