diff options
Diffstat (limited to 'drivers/net/vmxnet3/vmxnet3_drv.c')
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_drv.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 7af1f5cfa87a..31439818c27e 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -3290,27 +3290,15 @@ skip_arp: | |||
3290 | static int | 3290 | static int |
3291 | vmxnet3_resume(struct device *device) | 3291 | vmxnet3_resume(struct device *device) |
3292 | { | 3292 | { |
3293 | int err, i = 0; | 3293 | int err; |
3294 | unsigned long flags; | 3294 | unsigned long flags; |
3295 | struct pci_dev *pdev = to_pci_dev(device); | 3295 | struct pci_dev *pdev = to_pci_dev(device); |
3296 | struct net_device *netdev = pci_get_drvdata(pdev); | 3296 | struct net_device *netdev = pci_get_drvdata(pdev); |
3297 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 3297 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
3298 | struct Vmxnet3_PMConf *pmConf; | ||
3299 | 3298 | ||
3300 | if (!netif_running(netdev)) | 3299 | if (!netif_running(netdev)) |
3301 | return 0; | 3300 | return 0; |
3302 | 3301 | ||
3303 | /* Destroy wake-up filters. */ | ||
3304 | pmConf = adapter->pm_conf; | ||
3305 | memset(pmConf, 0, sizeof(*pmConf)); | ||
3306 | |||
3307 | adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1); | ||
3308 | adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof( | ||
3309 | *pmConf)); | ||
3310 | adapter->shared->devRead.pmConfDesc.confPA = | ||
3311 | cpu_to_le64(adapter->pm_conf_pa); | ||
3312 | |||
3313 | netif_device_attach(netdev); | ||
3314 | pci_set_power_state(pdev, PCI_D0); | 3302 | pci_set_power_state(pdev, PCI_D0); |
3315 | pci_restore_state(pdev); | 3303 | pci_restore_state(pdev); |
3316 | err = pci_enable_device_mem(pdev); | 3304 | err = pci_enable_device_mem(pdev); |
@@ -3319,15 +3307,31 @@ vmxnet3_resume(struct device *device) | |||
3319 | 3307 | ||
3320 | pci_enable_wake(pdev, PCI_D0, 0); | 3308 | pci_enable_wake(pdev, PCI_D0, 0); |
3321 | 3309 | ||
3310 | vmxnet3_alloc_intr_resources(adapter); | ||
3311 | |||
3312 | /* During hibernate and suspend, device has to be reinitialized as the | ||
3313 | * device state need not be preserved. | ||
3314 | */ | ||
3315 | |||
3316 | /* Need not check adapter state as other reset tasks cannot run during | ||
3317 | * device resume. | ||
3318 | */ | ||
3322 | spin_lock_irqsave(&adapter->cmd_lock, flags); | 3319 | spin_lock_irqsave(&adapter->cmd_lock, flags); |
3323 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 3320 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
3324 | VMXNET3_CMD_UPDATE_PMCFG); | 3321 | VMXNET3_CMD_QUIESCE_DEV); |
3325 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | 3322 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); |
3326 | vmxnet3_alloc_intr_resources(adapter); | 3323 | vmxnet3_tq_cleanup_all(adapter); |
3327 | vmxnet3_request_irqs(adapter); | 3324 | vmxnet3_rq_cleanup_all(adapter); |
3328 | for (i = 0; i < adapter->num_rx_queues; i++) | 3325 | |
3329 | napi_enable(&adapter->rx_queue[i].napi); | 3326 | vmxnet3_reset_dev(adapter); |
3330 | vmxnet3_enable_all_intrs(adapter); | 3327 | err = vmxnet3_activate_dev(adapter); |
3328 | if (err != 0) { | ||
3329 | netdev_err(netdev, | ||
3330 | "failed to re-activate on resume, error: %d", err); | ||
3331 | vmxnet3_force_close(adapter); | ||
3332 | return err; | ||
3333 | } | ||
3334 | netif_device_attach(netdev); | ||
3331 | 3335 | ||
3332 | return 0; | 3336 | return 0; |
3333 | } | 3337 | } |
@@ -3335,6 +3339,8 @@ vmxnet3_resume(struct device *device) | |||
3335 | static const struct dev_pm_ops vmxnet3_pm_ops = { | 3339 | static const struct dev_pm_ops vmxnet3_pm_ops = { |
3336 | .suspend = vmxnet3_suspend, | 3340 | .suspend = vmxnet3_suspend, |
3337 | .resume = vmxnet3_resume, | 3341 | .resume = vmxnet3_resume, |
3342 | .freeze = vmxnet3_suspend, | ||
3343 | .restore = vmxnet3_resume, | ||
3338 | }; | 3344 | }; |
3339 | #endif | 3345 | #endif |
3340 | 3346 | ||