aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/ata/ahci.c48
-rw-r--r--drivers/ata/libata-core.c3
-rw-r--r--drivers/ata/libata-eh.c17
-rw-r--r--drivers/ata/libata-pmp.c209
-rw-r--r--drivers/ata/sata_sil24.c30
-rw-r--r--include/linux/libata.h8
6 files changed, 118 insertions, 197 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index abfb72aae3de..10bc3f64c453 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -239,8 +239,6 @@ static void ahci_freeze(struct ata_port *ap);
239static void ahci_thaw(struct ata_port *ap); 239static void ahci_thaw(struct ata_port *ap);
240static void ahci_pmp_attach(struct ata_port *ap); 240static void ahci_pmp_attach(struct ata_port *ap);
241static void ahci_pmp_detach(struct ata_port *ap); 241static void ahci_pmp_detach(struct ata_port *ap);
242static int ahci_pmp_read(struct ata_device *dev, int pmp, int reg, u32 *r_val);
243static int ahci_pmp_write(struct ata_device *dev, int pmp, int reg, u32 val);
244static void ahci_error_handler(struct ata_port *ap); 242static void ahci_error_handler(struct ata_port *ap);
245static void ahci_vt8251_error_handler(struct ata_port *ap); 243static void ahci_vt8251_error_handler(struct ata_port *ap);
246static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); 244static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
@@ -297,8 +295,6 @@ static const struct ata_port_operations ahci_ops = {
297 295
298 .pmp_attach = ahci_pmp_attach, 296 .pmp_attach = ahci_pmp_attach,
299 .pmp_detach = ahci_pmp_detach, 297 .pmp_detach = ahci_pmp_detach,
300 .pmp_read = ahci_pmp_read,
301 .pmp_write = ahci_pmp_write,
302 298
303#ifdef CONFIG_PM 299#ifdef CONFIG_PM
304 .port_suspend = ahci_port_suspend, 300 .port_suspend = ahci_port_suspend,
@@ -333,8 +329,6 @@ static const struct ata_port_operations ahci_vt8251_ops = {
333 329
334 .pmp_attach = ahci_pmp_attach, 330 .pmp_attach = ahci_pmp_attach,
335 .pmp_detach = ahci_pmp_detach, 331 .pmp_detach = ahci_pmp_detach,
336 .pmp_read = ahci_pmp_read,
337 .pmp_write = ahci_pmp_write,
338 332
339#ifdef CONFIG_PM 333#ifdef CONFIG_PM
340 .port_suspend = ahci_port_suspend, 334 .port_suspend = ahci_port_suspend,
@@ -1421,12 +1415,17 @@ static void ahci_port_intr(struct ata_port *ap)
1421 struct ata_eh_info *ehi = &ap->link.eh_info; 1415 struct ata_eh_info *ehi = &ap->link.eh_info;
1422 struct ahci_port_priv *pp = ap->private_data; 1416 struct ahci_port_priv *pp = ap->private_data;
1423 struct ahci_host_priv *hpriv = ap->host->private_data; 1417 struct ahci_host_priv *hpriv = ap->host->private_data;
1418 int resetting = !!(ap->pflags & ATA_PFLAG_RESETTING);
1424 u32 status, qc_active; 1419 u32 status, qc_active;
1425 int rc, known_irq = 0; 1420 int rc, known_irq = 0;
1426 1421
1427 status = readl(port_mmio + PORT_IRQ_STAT); 1422 status = readl(port_mmio + PORT_IRQ_STAT);
1428 writel(status, port_mmio + PORT_IRQ_STAT); 1423 writel(status, port_mmio + PORT_IRQ_STAT);
1429 1424
1425 /* ignore BAD_PMP while resetting */
1426 if (unlikely(resetting))
1427 status &= ~PORT_IRQ_BAD_PMP;
1428
1430 if (unlikely(status & PORT_IRQ_ERROR)) { 1429 if (unlikely(status & PORT_IRQ_ERROR)) {
1431 ahci_error_intr(ap, status); 1430 ahci_error_intr(ap, status);
1432 return; 1431 return;
@@ -1464,6 +1463,13 @@ static void ahci_port_intr(struct ata_port *ap)
1464 qc_active = readl(port_mmio + PORT_CMD_ISSUE); 1463 qc_active = readl(port_mmio + PORT_CMD_ISSUE);
1465 1464
1466 rc = ata_qc_complete_multiple(ap, qc_active, NULL); 1465 rc = ata_qc_complete_multiple(ap, qc_active, NULL);
1466
1467 /* If resetting, spurious or invalid completions are expected,
1468 * return unconditionally.
1469 */
1470 if (resetting)
1471 return;
1472
1467 if (rc > 0) 1473 if (rc > 0)
1468 return; 1474 return;
1469 if (rc < 0) { 1475 if (rc < 0) {
@@ -1701,36 +1707,6 @@ static void ahci_pmp_detach(struct ata_port *ap)
1701 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); 1707 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
1702} 1708}
1703 1709
1704static int ahci_pmp_read(struct ata_device *dev, int pmp, int reg, u32 *r_val)
1705{
1706 struct ata_port *ap = dev->link->ap;
1707 struct ata_taskfile tf;
1708 int rc;
1709
1710 ahci_kick_engine(ap, 0);
1711
1712 sata_pmp_read_init_tf(&tf, dev, pmp, reg);
1713 rc = ahci_exec_polled_cmd(ap, SATA_PMP_CTRL_PORT, &tf, 1, 0,
1714 SATA_PMP_SCR_TIMEOUT);
1715 if (rc == 0) {
1716 ahci_tf_read(ap, &tf);
1717 *r_val = sata_pmp_read_val(&tf);
1718 }
1719 return rc;
1720}
1721
1722static int ahci_pmp_write(struct ata_device *dev, int pmp, int reg, u32 val)
1723{
1724 struct ata_port *ap = dev->link->ap;
1725 struct ata_taskfile tf;
1726
1727 ahci_kick_engine(ap, 0);
1728
1729 sata_pmp_write_init_tf(&tf, dev, pmp, reg, val);
1730 return ahci_exec_polled_cmd(ap, SATA_PMP_CTRL_PORT, &tf, 1, 0,
1731 SATA_PMP_SCR_TIMEOUT);
1732}
1733
1734static int ahci_port_resume(struct ata_port *ap) 1710static int ahci_port_resume(struct ata_port *ap)
1735{ 1711{
1736 ahci_power_up(ap); 1712 ahci_power_up(ap);
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 59ebc5d5100a..ce8ccb434aff 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -7354,9 +7354,6 @@ EXPORT_SYMBOL_GPL(ata_pci_clear_simplex);
7354#endif /* CONFIG_PCI */ 7354#endif /* CONFIG_PCI */
7355 7355
7356EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch); 7356EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch);
7357EXPORT_SYMBOL_GPL(sata_pmp_read_init_tf);
7358EXPORT_SYMBOL_GPL(sata_pmp_read_val);
7359EXPORT_SYMBOL_GPL(sata_pmp_write_init_tf);
7360EXPORT_SYMBOL_GPL(sata_pmp_std_prereset); 7357EXPORT_SYMBOL_GPL(sata_pmp_std_prereset);
7361EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset); 7358EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset);
7362EXPORT_SYMBOL_GPL(sata_pmp_std_postreset); 7359EXPORT_SYMBOL_GPL(sata_pmp_std_postreset);
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 1f84e40fa6ae..5a2b2af4d0c1 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2557,7 +2557,11 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2557 2557
2558 /* reset */ 2558 /* reset */
2559 if (reset) { 2559 if (reset) {
2560 ata_eh_freeze_port(ap); 2560 /* if PMP is attached, this function only deals with
2561 * downstream links, port should stay thawed.
2562 */
2563 if (!ap->nr_pmp_links)
2564 ata_eh_freeze_port(ap);
2561 2565
2562 ata_port_for_each_link(link, ap) { 2566 ata_port_for_each_link(link, ap) {
2563 struct ata_eh_context *ehc = &link->eh_context; 2567 struct ata_eh_context *ehc = &link->eh_context;
@@ -2575,7 +2579,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2575 } 2579 }
2576 } 2580 }
2577 2581
2578 ata_eh_thaw_port(ap); 2582 if (!ap->nr_pmp_links)
2583 ata_eh_thaw_port(ap);
2579 } 2584 }
2580 2585
2581 /* the rest */ 2586 /* the rest */
@@ -2610,8 +2615,14 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2610 if (ata_eh_handle_dev_fail(dev, rc)) 2615 if (ata_eh_handle_dev_fail(dev, rc))
2611 nr_disabled_devs++; 2616 nr_disabled_devs++;
2612 2617
2613 if (ap->pflags & ATA_PFLAG_FROZEN) 2618 if (ap->pflags & ATA_PFLAG_FROZEN) {
2619 /* PMP reset requires working host port.
2620 * Can't retry if it's frozen.
2621 */
2622 if (ap->nr_pmp_links)
2623 goto out;
2614 break; 2624 break;
2625 }
2615 } 2626 }
2616 2627
2617 if (nr_failed_devs) { 2628 if (nr_failed_devs) {
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index f6c4b11336e9..c0c4dbcde091 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -17,27 +17,35 @@
17 * @reg: register to read 17 * @reg: register to read
18 * @r_val: resulting value 18 * @r_val: resulting value
19 * 19 *
20 * Wrapper around ap->ops->pmp_read to make it easier to call and 20 * Read PMP register.
21 * nomarlize error return value.
22 * 21 *
23 * LOCKING: 22 * LOCKING:
24 * Kernel thread context (may sleep). 23 * Kernel thread context (may sleep).
25 * 24 *
26 * RETURNS: 25 * RETURNS:
27 * 0 on success, -errno on failure. 26 * 0 on success, AC_ERR_* mask on failure.
28 */ 27 */
29static int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val) 28static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)
30{ 29{
31 struct ata_port *ap = link->ap; 30 struct ata_port *ap = link->ap;
32 struct ata_device *pmp_dev = ap->link.device; 31 struct ata_device *pmp_dev = ap->link.device;
33 int rc; 32 struct ata_taskfile tf;
34 33 unsigned int err_mask;
35 might_sleep(); 34
36 35 ata_tf_init(pmp_dev, &tf);
37 rc = ap->ops->pmp_read(pmp_dev, link->pmp, reg, r_val); 36 tf.command = ATA_CMD_PMP_READ;
38 if (rc) 37 tf.protocol = ATA_PROT_NODATA;
39 rc = -EIO; 38 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
40 return rc; 39 tf.feature = reg;
40 tf.device = link->pmp;
41
42 err_mask = ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
43 SATA_PMP_SCR_TIMEOUT);
44 if (err_mask)
45 return err_mask;
46
47 *r_val = tf.nsect | tf.lbal << 8 | tf.lbam << 16 | tf.lbah << 24;
48 return 0;
41} 49}
42 50
43/** 51/**
@@ -46,27 +54,33 @@ static int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)
46 * @reg: register to write 54 * @reg: register to write
47 * @r_val: value to write 55 * @r_val: value to write
48 * 56 *
49 * Wrapper around ap->ops->pmp_write to make it easier to call 57 * Write PMP register.
50 * and nomarlize error return value.
51 * 58 *
52 * LOCKING: 59 * LOCKING:
53 * Kernel thread context (may sleep). 60 * Kernel thread context (may sleep).
54 * 61 *
55 * RETURNS: 62 * RETURNS:
56 * 0 on success, -errno on failure. 63 * 0 on success, AC_ERR_* mask on failure.
57 */ 64 */
58static int sata_pmp_write(struct ata_link *link, int reg, u32 val) 65static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val)
59{ 66{
60 struct ata_port *ap = link->ap; 67 struct ata_port *ap = link->ap;
61 struct ata_device *pmp_dev = ap->link.device; 68 struct ata_device *pmp_dev = ap->link.device;
62 int rc; 69 struct ata_taskfile tf;
63 70
64 might_sleep(); 71 ata_tf_init(pmp_dev, &tf);
65 72 tf.command = ATA_CMD_PMP_WRITE;
66 rc = ap->ops->pmp_write(pmp_dev, link->pmp, reg, val); 73 tf.protocol = ATA_PROT_NODATA;
67 if (rc) 74 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
68 rc = -EIO; 75 tf.feature = reg;
69 return rc; 76 tf.device = link->pmp;
77 tf.nsect = val & 0xff;
78 tf.lbal = (val >> 8) & 0xff;
79 tf.lbam = (val >> 16) & 0xff;
80 tf.lbah = (val >> 24) & 0xff;
81
82 return ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
83 SATA_PMP_SCR_TIMEOUT);
70} 84}
71 85
72/** 86/**
@@ -100,71 +114,6 @@ int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc)
100} 114}
101 115
102/** 116/**
103 * sata_pmp_read_init_tf - initialize TF for PMP read
104 * @tf: taskfile to initialize
105 * @dev: PMP dev
106 * @pmp: port multiplier port number
107 * @reg: register to read
108 *
109 * Initialize @tf for PMP read command.
110 *
111 * LOCKING:
112 * None.
113 */
114void sata_pmp_read_init_tf(struct ata_taskfile *tf,
115 struct ata_device *dev, int pmp, int reg)
116{
117 ata_tf_init(dev, tf);
118 tf->command = ATA_CMD_PMP_READ;
119 tf->protocol = ATA_PROT_NODATA;
120 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
121 tf->feature = reg;
122 tf->device = pmp;
123}
124
125/**
126 * sata_pmp_read_val - extract PMP read result from TF
127 * @tf: target TF
128 *
129 * Determine PMP read result from @tf.
130 *
131 * LOCKING:
132 * None.
133 */
134u32 sata_pmp_read_val(const struct ata_taskfile *tf)
135{
136 return tf->nsect | tf->lbal << 8 | tf->lbam << 16 | tf->lbah << 24;
137}
138
139/**
140 * sata_pmp_read_init_tf - initialize TF for PMP write
141 * @tf: taskfile to initialize
142 * @dev: PMP dev
143 * @pmp: port multiplier port number
144 * @reg: register to read
145 * @val: value to write
146 *
147 * Initialize @tf for PMP write command.
148 *
149 * LOCKING:
150 * None.
151 */
152void sata_pmp_write_init_tf(struct ata_taskfile *tf,
153 struct ata_device *dev, int pmp, int reg, u32 val)
154{
155 ata_tf_init(dev, tf);
156 tf->command = ATA_CMD_PMP_WRITE;
157 tf->protocol = ATA_PROT_NODATA;
158 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
159 tf->feature = reg;
160 tf->device = pmp;
161 tf->nsect = val & 0xff;
162 tf->lbal = (val >> 8) & 0xff;
163 tf->lbam = (val >> 16) & 0xff;
164 tf->lbah = (val >> 24) & 0xff;
165}
166
167/**
168 * sata_pmp_scr_read - read PSCR 117 * sata_pmp_scr_read - read PSCR
169 * @link: ATA link to read PSCR for 118 * @link: ATA link to read PSCR for
170 * @reg: PSCR to read 119 * @reg: PSCR to read
@@ -181,10 +130,18 @@ void sata_pmp_write_init_tf(struct ata_taskfile *tf,
181 */ 130 */
182int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *r_val) 131int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *r_val)
183{ 132{
133 unsigned int err_mask;
134
184 if (reg > SATA_PMP_PSCR_CONTROL) 135 if (reg > SATA_PMP_PSCR_CONTROL)
185 return -EINVAL; 136 return -EINVAL;
186 137
187 return sata_pmp_read(link, reg, r_val); 138 err_mask = sata_pmp_read(link, reg, r_val);
139 if (err_mask) {
140 ata_link_printk(link, KERN_WARNING, "failed to read SCR %d "
141 "(Emask=0x%x)\n", reg, err_mask);
142 return -EIO;
143 }
144 return 0;
188} 145}
189 146
190/** 147/**
@@ -204,10 +161,18 @@ int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *r_val)
204 */ 161 */
205int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val) 162int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
206{ 163{
164 unsigned int err_mask;
165
207 if (reg > SATA_PMP_PSCR_CONTROL) 166 if (reg > SATA_PMP_PSCR_CONTROL)
208 return -EINVAL; 167 return -EINVAL;
209 168
210 return sata_pmp_write(link, reg, val); 169 err_mask = sata_pmp_write(link, reg, val);
170 if (err_mask) {
171 ata_link_printk(link, KERN_WARNING, "failed to write SCR %d "
172 "(Emask=0x%x)\n", reg, err_mask);
173 return -EIO;
174 }
175 return 0;
211} 176}
212 177
213/** 178/**
@@ -361,16 +326,17 @@ void sata_pmp_std_postreset(struct ata_link *link, unsigned int *class)
361static int sata_pmp_read_gscr(struct ata_device *dev, u32 *gscr) 326static int sata_pmp_read_gscr(struct ata_device *dev, u32 *gscr)
362{ 327{
363 static const int gscr_to_read[] = { 0, 1, 2, 32, 33, 64, 96 }; 328 static const int gscr_to_read[] = { 0, 1, 2, 32, 33, 64, 96 };
364 int i, rc; 329 int i;
365 330
366 for (i = 0; i < ARRAY_SIZE(gscr_to_read); i++) { 331 for (i = 0; i < ARRAY_SIZE(gscr_to_read); i++) {
367 int reg = gscr_to_read[i]; 332 int reg = gscr_to_read[i];
333 unsigned int err_mask;
368 334
369 rc = sata_pmp_read(dev->link, reg, &gscr[reg]); 335 err_mask = sata_pmp_read(dev->link, reg, &gscr[reg]);
370 if (rc) { 336 if (err_mask) {
371 ata_dev_printk(dev, KERN_ERR, "failed to read " 337 ata_dev_printk(dev, KERN_ERR, "failed to read PMP "
372 "PMP GSCR[%d] (errno=%d)\n", reg, rc); 338 "GSCR[%d] (Emask=0x%x)\n", reg, err_mask);
373 return rc; 339 return -EIO;
374 } 340 }
375 } 341 }
376 342
@@ -392,6 +358,7 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
392{ 358{
393 struct ata_port *ap = dev->link->ap; 359 struct ata_port *ap = dev->link->ap;
394 u32 *gscr = dev->gscr; 360 u32 *gscr = dev->gscr;
361 unsigned int err_mask = 0;
395 const char *reason; 362 const char *reason;
396 int nr_ports, rc; 363 int nr_ports, rc;
397 364
@@ -408,8 +375,10 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
408 dev->flags |= ATA_DFLAG_AN; 375 dev->flags |= ATA_DFLAG_AN;
409 376
410 /* monitor SERR_PHYRDY_CHG on fan-out ports */ 377 /* monitor SERR_PHYRDY_CHG on fan-out ports */
411 rc = sata_pmp_write(dev->link, SATA_PMP_GSCR_ERROR_EN, SERR_PHYRDY_CHG); 378 err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_ERROR_EN,
412 if (rc) { 379 SERR_PHYRDY_CHG);
380 if (err_mask) {
381 rc = -EIO;
413 reason = "failed to write GSCR_ERROR_EN"; 382 reason = "failed to write GSCR_ERROR_EN";
414 goto fail; 383 goto fail;
415 } 384 }
@@ -418,9 +387,10 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
418 if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) { 387 if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {
419 gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY; 388 gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;
420 389
421 rc = sata_pmp_write(dev->link, SATA_PMP_GSCR_FEAT_EN, 390 err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_FEAT_EN,
422 gscr[SATA_PMP_GSCR_FEAT_EN]); 391 gscr[SATA_PMP_GSCR_FEAT_EN]);
423 if (rc) { 392 if (err_mask) {
393 rc = -EIO;
424 reason = "failed to write GSCR_FEAT_EN"; 394 reason = "failed to write GSCR_FEAT_EN";
425 goto fail; 395 goto fail;
426 } 396 }
@@ -447,7 +417,8 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
447 417
448 fail: 418 fail:
449 ata_dev_printk(dev, KERN_ERR, 419 ata_dev_printk(dev, KERN_ERR,
450 "failed to configure Port Multiplier (%s)\n", reason); 420 "failed to configure Port Multiplier (%s, Emask=0x%x)\n",
421 reason, err_mask);
451 return rc; 422 return rc;
452} 423}
453 424
@@ -812,13 +783,14 @@ static int sata_pmp_revalidate(struct ata_device *dev, unsigned int new_class)
812 */ 783 */
813static int sata_pmp_revalidate_quick(struct ata_device *dev) 784static int sata_pmp_revalidate_quick(struct ata_device *dev)
814{ 785{
786 unsigned int err_mask;
815 u32 prod_id; 787 u32 prod_id;
816 int rc;
817 788
818 rc = sata_pmp_read(dev->link, SATA_PMP_GSCR_PROD_ID, &prod_id); 789 err_mask = sata_pmp_read(dev->link, SATA_PMP_GSCR_PROD_ID, &prod_id);
819 if (rc) { 790 if (err_mask) {
820 ata_dev_printk(dev, KERN_ERR, "failed to read PMP product ID\n"); 791 ata_dev_printk(dev, KERN_ERR, "failed to read PMP product ID "
821 return rc; 792 "(Emask=0x%x)\n", err_mask);
793 return -EIO;
822 } 794 }
823 795
824 if (prod_id != dev->gscr[SATA_PMP_GSCR_PROD_ID]) { 796 if (prod_id != dev->gscr[SATA_PMP_GSCR_PROD_ID]) {
@@ -1049,6 +1021,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap,
1049 struct ata_eh_context *pmp_ehc = &pmp_link->eh_context; 1021 struct ata_eh_context *pmp_ehc = &pmp_link->eh_context;
1050 struct ata_link *link; 1022 struct ata_link *link;
1051 struct ata_device *dev; 1023 struct ata_device *dev;
1024 unsigned int err_mask;
1052 u32 gscr_error, sntf; 1025 u32 gscr_error, sntf;
1053 int cnt, rc; 1026 int cnt, rc;
1054 1027
@@ -1107,20 +1080,22 @@ static int sata_pmp_eh_recover(struct ata_port *ap,
1107 if (pmp_dev->flags & ATA_DFLAG_AN) { 1080 if (pmp_dev->flags & ATA_DFLAG_AN) {
1108 pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY; 1081 pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;
1109 1082
1110 rc = sata_pmp_write(pmp_dev->link, SATA_PMP_GSCR_FEAT_EN, 1083 err_mask = sata_pmp_write(pmp_dev->link, SATA_PMP_GSCR_FEAT_EN,
1111 pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN]); 1084 pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN]);
1112 if (rc) { 1085 if (err_mask) {
1113 ata_dev_printk(pmp_dev, KERN_ERR, 1086 ata_dev_printk(pmp_dev, KERN_ERR, "failed to write "
1114 "failed to write PMP_FEAT_EN\n"); 1087 "PMP_FEAT_EN (Emask=0x%x)\n", err_mask);
1088 rc = -EIO;
1115 goto pmp_fail; 1089 goto pmp_fail;
1116 } 1090 }
1117 } 1091 }
1118 1092
1119 /* check GSCR_ERROR */ 1093 /* check GSCR_ERROR */
1120 rc = sata_pmp_read(pmp_link, SATA_PMP_GSCR_ERROR, &gscr_error); 1094 err_mask = sata_pmp_read(pmp_link, SATA_PMP_GSCR_ERROR, &gscr_error);
1121 if (rc) { 1095 if (err_mask) {
1122 ata_dev_printk(pmp_dev, KERN_ERR, 1096 ata_dev_printk(pmp_dev, KERN_ERR, "failed to read "
1123 "failed to read PMP_GSCR_ERROR\n"); 1097 "PMP_GSCR_ERROR (Emask=0x%x)\n", err_mask);
1098 rc = -EIO;
1124 goto pmp_fail; 1099 goto pmp_fail;
1125 } 1100 }
1126 1101
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{
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 529af9fbed53..2439f1fa47a1 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -669,8 +669,6 @@ struct ata_port_operations {
669 /* port multiplier */ 669 /* port multiplier */
670 void (*pmp_attach) (struct ata_port *ap); 670 void (*pmp_attach) (struct ata_port *ap);
671 void (*pmp_detach) (struct ata_port *ap); 671 void (*pmp_detach) (struct ata_port *ap);
672 int (*pmp_read) (struct ata_device *dev, int pmp, int reg, u32 *r_val);
673 int (*pmp_write) (struct ata_device *dev, int pmp, int reg, u32 val);
674 672
675 /* Error handlers. ->error_handler overrides ->eng_timeout and 673 /* Error handlers. ->error_handler overrides ->eng_timeout and
676 * indicates that new-style EH is in place. 674 * indicates that new-style EH is in place.
@@ -957,12 +955,6 @@ extern unsigned long ata_pci_default_filter(struct ata_device *, unsigned long);
957 * PMP 955 * PMP
958 */ 956 */
959extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc); 957extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
960extern void sata_pmp_read_init_tf(struct ata_taskfile *tf,
961 struct ata_device *dev, int pmp, int reg);
962extern u32 sata_pmp_read_val(const struct ata_taskfile *tf);
963extern void sata_pmp_write_init_tf(struct ata_taskfile *tf,
964 struct ata_device *dev,
965 int pmp, int reg, u32 val);
966extern int sata_pmp_std_prereset(struct ata_link *link, unsigned long deadline); 958extern int sata_pmp_std_prereset(struct ata_link *link, unsigned long deadline);
967extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class, 959extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class,
968 unsigned long deadline); 960 unsigned long deadline);