aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c53
1 files changed, 18 insertions, 35 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index dacb3ef0c3e6..3efa9904f7a0 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -252,9 +252,18 @@ static void ahci_freeze(struct ata_port *ap);
252static void ahci_thaw(struct ata_port *ap); 252static void ahci_thaw(struct ata_port *ap);
253static void ahci_pmp_attach(struct ata_port *ap); 253static void ahci_pmp_attach(struct ata_port *ap);
254static void ahci_pmp_detach(struct ata_port *ap); 254static void ahci_pmp_detach(struct ata_port *ap);
255static int ahci_softreset(struct ata_link *link, unsigned int *class,
256 unsigned long deadline);
257static int ahci_hardreset(struct ata_link *link, unsigned int *class,
258 unsigned long deadline);
259static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
260 unsigned long deadline);
261static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
262 unsigned long deadline);
263static void ahci_postreset(struct ata_link *link, unsigned int *class);
264static int ahci_pmp_softreset(struct ata_link *link, unsigned int *class,
265 unsigned long deadline);
255static void ahci_error_handler(struct ata_port *ap); 266static void ahci_error_handler(struct ata_port *ap);
256static void ahci_vt8251_error_handler(struct ata_port *ap);
257static void ahci_p5wdh_error_handler(struct ata_port *ap);
258static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); 267static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
259static int ahci_port_resume(struct ata_port *ap); 268static int ahci_port_resume(struct ata_port *ap);
260static void ahci_dev_config(struct ata_device *dev); 269static void ahci_dev_config(struct ata_device *dev);
@@ -293,6 +302,10 @@ static struct ata_port_operations ahci_ops = {
293 302
294 .freeze = ahci_freeze, 303 .freeze = ahci_freeze,
295 .thaw = ahci_thaw, 304 .thaw = ahci_thaw,
305 .softreset = ahci_softreset,
306 .hardreset = ahci_hardreset,
307 .postreset = ahci_postreset,
308 .pmp_softreset = ahci_pmp_softreset,
296 .error_handler = ahci_error_handler, 309 .error_handler = ahci_error_handler,
297 .post_internal_cmd = ahci_post_internal_cmd, 310 .post_internal_cmd = ahci_post_internal_cmd,
298 .dev_config = ahci_dev_config, 311 .dev_config = ahci_dev_config,
@@ -314,12 +327,12 @@ static struct ata_port_operations ahci_ops = {
314 327
315static struct ata_port_operations ahci_vt8251_ops = { 328static struct ata_port_operations ahci_vt8251_ops = {
316 .inherits = &ahci_ops, 329 .inherits = &ahci_ops,
317 .error_handler = ahci_vt8251_error_handler, 330 .hardreset = ahci_vt8251_hardreset,
318}; 331};
319 332
320static struct ata_port_operations ahci_p5wdh_ops = { 333static struct ata_port_operations ahci_p5wdh_ops = {
321 .inherits = &ahci_ops, 334 .inherits = &ahci_ops,
322 .error_handler = ahci_p5wdh_error_handler, 335 .hardreset = ahci_p5wdh_hardreset,
323}; 336};
324 337
325#define AHCI_HFLAGS(flags) .private_data = (void *)(flags) 338#define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
@@ -1796,37 +1809,7 @@ static void ahci_error_handler(struct ata_port *ap)
1796 ahci_start_engine(ap); 1809 ahci_start_engine(ap);
1797 } 1810 }
1798 1811
1799 /* perform recovery */ 1812 sata_pmp_error_handler(ap);
1800 sata_pmp_do_eh(ap, ata_std_prereset, ahci_softreset,
1801 ahci_hardreset, ahci_postreset,
1802 sata_pmp_std_prereset, ahci_pmp_softreset,
1803 sata_pmp_std_hardreset, sata_pmp_std_postreset);
1804}
1805
1806static void ahci_vt8251_error_handler(struct ata_port *ap)
1807{
1808 if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
1809 /* restart engine */
1810 ahci_stop_engine(ap);
1811 ahci_start_engine(ap);
1812 }
1813
1814 /* perform recovery */
1815 ata_do_eh(ap, ata_std_prereset, ahci_softreset, ahci_vt8251_hardreset,
1816 ahci_postreset);
1817}
1818
1819static void ahci_p5wdh_error_handler(struct ata_port *ap)
1820{
1821 if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
1822 /* restart engine */
1823 ahci_stop_engine(ap);
1824 ahci_start_engine(ap);
1825 }
1826
1827 /* perform recovery */
1828 ata_do_eh(ap, ata_std_prereset, ahci_softreset, ahci_p5wdh_hardreset,
1829 ahci_postreset);
1830} 1813}
1831 1814
1832static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) 1815static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)