diff options
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r-- | drivers/ata/ahci.c | 53 |
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); | |||
252 | static void ahci_thaw(struct ata_port *ap); | 252 | static void ahci_thaw(struct ata_port *ap); |
253 | static void ahci_pmp_attach(struct ata_port *ap); | 253 | static void ahci_pmp_attach(struct ata_port *ap); |
254 | static void ahci_pmp_detach(struct ata_port *ap); | 254 | static void ahci_pmp_detach(struct ata_port *ap); |
255 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | ||
256 | unsigned long deadline); | ||
257 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, | ||
258 | unsigned long deadline); | ||
259 | static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, | ||
260 | unsigned long deadline); | ||
261 | static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, | ||
262 | unsigned long deadline); | ||
263 | static void ahci_postreset(struct ata_link *link, unsigned int *class); | ||
264 | static int ahci_pmp_softreset(struct ata_link *link, unsigned int *class, | ||
265 | unsigned long deadline); | ||
255 | static void ahci_error_handler(struct ata_port *ap); | 266 | static void ahci_error_handler(struct ata_port *ap); |
256 | static void ahci_vt8251_error_handler(struct ata_port *ap); | ||
257 | static void ahci_p5wdh_error_handler(struct ata_port *ap); | ||
258 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); | 267 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
259 | static int ahci_port_resume(struct ata_port *ap); | 268 | static int ahci_port_resume(struct ata_port *ap); |
260 | static void ahci_dev_config(struct ata_device *dev); | 269 | static 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 | ||
315 | static struct ata_port_operations ahci_vt8251_ops = { | 328 | static 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 | ||
320 | static struct ata_port_operations ahci_p5wdh_ops = { | 333 | static 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 | |||
1806 | static 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 | |||
1819 | static 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 | ||
1832 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) | 1815 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) |