diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 369b736dde05..f3dd93b4aeaa 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -8932,6 +8932,9 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
8932 | void (*write_op)(struct tg3 *, u32, u32); | 8932 | void (*write_op)(struct tg3 *, u32, u32); |
8933 | int i, err; | 8933 | int i, err; |
8934 | 8934 | ||
8935 | if (!pci_device_is_present(tp->pdev)) | ||
8936 | return -ENODEV; | ||
8937 | |||
8935 | tg3_nvram_lock(tp); | 8938 | tg3_nvram_lock(tp); |
8936 | 8939 | ||
8937 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); | 8940 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); |
@@ -11581,10 +11584,11 @@ static int tg3_close(struct net_device *dev) | |||
11581 | memset(&tp->net_stats_prev, 0, sizeof(tp->net_stats_prev)); | 11584 | memset(&tp->net_stats_prev, 0, sizeof(tp->net_stats_prev)); |
11582 | memset(&tp->estats_prev, 0, sizeof(tp->estats_prev)); | 11585 | memset(&tp->estats_prev, 0, sizeof(tp->estats_prev)); |
11583 | 11586 | ||
11584 | tg3_power_down_prepare(tp); | 11587 | if (pci_device_is_present(tp->pdev)) { |
11585 | 11588 | tg3_power_down_prepare(tp); | |
11586 | tg3_carrier_off(tp); | ||
11587 | 11589 | ||
11590 | tg3_carrier_off(tp); | ||
11591 | } | ||
11588 | return 0; | 11592 | return 0; |
11589 | } | 11593 | } |
11590 | 11594 | ||
@@ -16499,6 +16503,9 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) | |||
16499 | /* Clear this out for sanity. */ | 16503 | /* Clear this out for sanity. */ |
16500 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); | 16504 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
16501 | 16505 | ||
16506 | /* Clear TG3PCI_REG_BASE_ADDR to prevent hangs. */ | ||
16507 | tw32(TG3PCI_REG_BASE_ADDR, 0); | ||
16508 | |||
16502 | pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, | 16509 | pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, |
16503 | &pci_state_reg); | 16510 | &pci_state_reg); |
16504 | if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 && | 16511 | if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 && |
@@ -17726,10 +17733,12 @@ static int tg3_suspend(struct device *device) | |||
17726 | struct pci_dev *pdev = to_pci_dev(device); | 17733 | struct pci_dev *pdev = to_pci_dev(device); |
17727 | struct net_device *dev = pci_get_drvdata(pdev); | 17734 | struct net_device *dev = pci_get_drvdata(pdev); |
17728 | struct tg3 *tp = netdev_priv(dev); | 17735 | struct tg3 *tp = netdev_priv(dev); |
17729 | int err; | 17736 | int err = 0; |
17737 | |||
17738 | rtnl_lock(); | ||
17730 | 17739 | ||
17731 | if (!netif_running(dev)) | 17740 | if (!netif_running(dev)) |
17732 | return 0; | 17741 | goto unlock; |
17733 | 17742 | ||
17734 | tg3_reset_task_cancel(tp); | 17743 | tg3_reset_task_cancel(tp); |
17735 | tg3_phy_stop(tp); | 17744 | tg3_phy_stop(tp); |
@@ -17771,6 +17780,8 @@ out: | |||
17771 | tg3_phy_start(tp); | 17780 | tg3_phy_start(tp); |
17772 | } | 17781 | } |
17773 | 17782 | ||
17783 | unlock: | ||
17784 | rtnl_unlock(); | ||
17774 | return err; | 17785 | return err; |
17775 | } | 17786 | } |
17776 | 17787 | ||
@@ -17779,10 +17790,12 @@ static int tg3_resume(struct device *device) | |||
17779 | struct pci_dev *pdev = to_pci_dev(device); | 17790 | struct pci_dev *pdev = to_pci_dev(device); |
17780 | struct net_device *dev = pci_get_drvdata(pdev); | 17791 | struct net_device *dev = pci_get_drvdata(pdev); |
17781 | struct tg3 *tp = netdev_priv(dev); | 17792 | struct tg3 *tp = netdev_priv(dev); |
17782 | int err; | 17793 | int err = 0; |
17794 | |||
17795 | rtnl_lock(); | ||
17783 | 17796 | ||
17784 | if (!netif_running(dev)) | 17797 | if (!netif_running(dev)) |
17785 | return 0; | 17798 | goto unlock; |
17786 | 17799 | ||
17787 | netif_device_attach(dev); | 17800 | netif_device_attach(dev); |
17788 | 17801 | ||
@@ -17806,6 +17819,8 @@ out: | |||
17806 | if (!err) | 17819 | if (!err) |
17807 | tg3_phy_start(tp); | 17820 | tg3_phy_start(tp); |
17808 | 17821 | ||
17822 | unlock: | ||
17823 | rtnl_unlock(); | ||
17809 | return err; | 17824 | return err; |
17810 | } | 17825 | } |
17811 | #endif /* CONFIG_PM_SLEEP */ | 17826 | #endif /* CONFIG_PM_SLEEP */ |