aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_sil24.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-10-09 02:06:48 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:47 -0400
commitb06ce3e51e3df4394a584c234f11240b1c6f8d5b (patch)
tree6a6f5a1cccdc2972b236d376afeba4fd296d5400 /drivers/ata/sata_sil24.c
parentafaa5c373d2c49ee4865847031b82f1377f609d0 (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.c30
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);
337static void sil24_irq_clear(struct ata_port *ap); 337static void sil24_irq_clear(struct ata_port *ap);
338static void sil24_pmp_attach(struct ata_port *ap); 338static void sil24_pmp_attach(struct ata_port *ap);
339static void sil24_pmp_detach(struct ata_port *ap); 339static void sil24_pmp_detach(struct ata_port *ap);
340static int sil24_pmp_read(struct ata_device *dev, int pmp, int reg, u32 *r_val);
341static int sil24_pmp_write(struct ata_device *dev, int pmp, int reg, u32 val);
342static void sil24_freeze(struct ata_port *ap); 340static void sil24_freeze(struct ata_port *ap);
343static void sil24_thaw(struct ata_port *ap); 341static void sil24_thaw(struct ata_port *ap);
344static void sil24_error_handler(struct ata_port *ap); 342static 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
931static 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
947static 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
957static int sil24_pmp_softreset(struct ata_link *link, unsigned int *class, 927static int sil24_pmp_softreset(struct ata_link *link, unsigned int *class,
958 unsigned long deadline) 928 unsigned long deadline)
959{ 929{