aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Slaby <jirislaby@gmail.com>2008-07-15 11:44:21 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-07-29 16:36:29 -0400
commit3e4242b99ce46fed82aa7f40ad5a1817a2b3bd45 (patch)
tree556a4080d0a73ad90c4016cac8f20d5c61617fa3
parente86600c7b4e9b9b22ba51620613d6159bf5cf504 (diff)
Ath5k: suspend/resume fixes
- free and re-request irq since it might have changed during suspend - disable and enable msi - don't set D0 state of the device, it's already done by the PCI layer - do restore_state before enable_device, it's safer - check ath5k_init return value Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Acked-by: Nick Kossifidis <mickflemm@gmail.com> Cc: Luis R. Rodriguez <mcgrof@gmail.com> Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath5k/base.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index 3aa22dc71651..7273e9f5c6d5 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -592,6 +592,9 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state)
592 ath5k_led_off(sc); 592 ath5k_led_off(sc);
593 593
594 ath5k_stop_hw(sc); 594 ath5k_stop_hw(sc);
595
596 free_irq(pdev->irq, sc);
597 pci_disable_msi(pdev);
595 pci_save_state(pdev); 598 pci_save_state(pdev);
596 pci_disable_device(pdev); 599 pci_disable_device(pdev);
597 pci_set_power_state(pdev, PCI_D3hot); 600 pci_set_power_state(pdev, PCI_D3hot);
@@ -607,15 +610,12 @@ ath5k_pci_resume(struct pci_dev *pdev)
607 struct ath5k_hw *ah = sc->ah; 610 struct ath5k_hw *ah = sc->ah;
608 int i, err; 611 int i, err;
609 612
610 err = pci_set_power_state(pdev, PCI_D0); 613 pci_restore_state(pdev);
611 if (err)
612 return err;
613 614
614 err = pci_enable_device(pdev); 615 err = pci_enable_device(pdev);
615 if (err) 616 if (err)
616 return err; 617 return err;
617 618
618 pci_restore_state(pdev);
619 /* 619 /*
620 * Suspend/Resume resets the PCI configuration space, so we have to 620 * Suspend/Resume resets the PCI configuration space, so we have to
621 * re-disable the RETRY_TIMEOUT register (0x41) to keep 621 * re-disable the RETRY_TIMEOUT register (0x41) to keep
@@ -623,7 +623,17 @@ ath5k_pci_resume(struct pci_dev *pdev)
623 */ 623 */
624 pci_write_config_byte(pdev, 0x41, 0); 624 pci_write_config_byte(pdev, 0x41, 0);
625 625
626 ath5k_init(sc); 626 pci_enable_msi(pdev);
627
628 err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
629 if (err) {
630 ATH5K_ERR(sc, "request_irq failed\n");
631 goto err_msi;
632 }
633
634 err = ath5k_init(sc);
635 if (err)
636 goto err_irq;
627 ath5k_led_enable(sc); 637 ath5k_led_enable(sc);
628 638
629 /* 639 /*
@@ -637,6 +647,12 @@ ath5k_pci_resume(struct pci_dev *pdev)
637 ath5k_hw_reset_key(ah, i); 647 ath5k_hw_reset_key(ah, i);
638 648
639 return 0; 649 return 0;
650err_irq:
651 free_irq(pdev->irq, sc);
652err_msi:
653 pci_disable_msi(pdev);
654 pci_disable_device(pdev);
655 return err;
640} 656}
641#endif /* CONFIG_PM */ 657#endif /* CONFIG_PM */
642 658