]>
Commit | Line | Data |
---|---|---|
1b4ef922 AM |
1 | --- via-rhine.c.org 2004-08-05 00:31:19.796592888 +0200 |
2 | +++ via-rhine.c 2004-08-05 00:39:26.241642000 +0200 | |
3 | @@ -485,6 +485,10 @@ | |
4 | dma_addr_t tx_bufs_dma; | |
5 | ||
6 | struct pci_dev *pdev; | |
7 | +#ifdef CONFIG_PM | |
8 | + long pioaddr; | |
9 | + u32 pci_state[16]; | |
10 | +#endif | |
11 | struct net_device_stats stats; | |
12 | spinlock_t lock; | |
13 | ||
14 | @@ -825,6 +829,9 @@ | |
15 | dev->base_addr = ioaddr; | |
16 | rp = netdev_priv(dev); | |
17 | rp->quirks = quirks; | |
18 | +#ifdef CONFIG_PM | |
19 | + rp->pioaddr = pioaddr; | |
20 | +#endif | |
21 | ||
22 | /* Get chip registers into a sane state */ | |
23 | rhine_power_init(dev); | |
24 | @@ -1951,11 +1958,64 @@ | |
25 | ||
26 | } | |
27 | ||
28 | +#ifdef CONFIG_PM | |
29 | +static int rhine_suspend (struct pci_dev *pdev, u32 state) | |
30 | +{ | |
31 | + struct net_device *dev = pci_get_drvdata (pdev); | |
32 | + struct rhine_private *rp = dev->priv; | |
33 | + | |
34 | + if (!netif_running (dev)) | |
35 | + return 0; | |
36 | + | |
37 | + netif_device_detach (dev); | |
38 | + | |
39 | + pci_save_state (pdev, rp->pci_state); | |
40 | + pci_set_power_state (pdev, 3); | |
41 | + | |
42 | + return 0; | |
43 | +} | |
44 | + | |
45 | +static int rhine_resume (struct pci_dev *pdev) | |
46 | +{ | |
47 | + struct net_device *dev = pci_get_drvdata (pdev); | |
48 | + struct rhine_private *rp = dev->priv; | |
49 | + unsigned long flags; | |
50 | + | |
51 | + if (!netif_running (dev)) | |
52 | + return 0; | |
53 | + | |
54 | + pci_set_power_state (pdev, 0); | |
55 | + pci_restore_state (pdev, rp->pci_state); | |
56 | + | |
57 | + spin_lock_irqsave (&rp->lock, flags); | |
58 | + | |
59 | + rhine_power_init(dev); | |
60 | + rhine_hw_init(dev, rp->pioaddr); | |
61 | + | |
62 | + free_tbufs(dev); | |
63 | + free_rbufs(dev); | |
64 | + alloc_tbufs(dev); | |
65 | + alloc_rbufs(dev); | |
66 | + | |
67 | + init_registers(dev); | |
68 | + | |
69 | + spin_unlock_irqrestore (&rp->lock, flags); | |
70 | + | |
71 | + netif_device_attach (dev); | |
72 | + | |
73 | + return 0; | |
74 | +} | |
75 | +#endif /* CONFIG_PM */ | |
76 | + | |
77 | static struct pci_driver rhine_driver = { | |
78 | .name = DRV_NAME, | |
79 | .id_table = rhine_pci_tbl, | |
80 | .probe = rhine_init_one, | |
81 | .remove = __devexit_p(rhine_remove_one), | |
82 | +#ifdef CONFIG_PM | |
83 | + .suspend = rhine_suspend, | |
84 | + .resume = rhine_resume, | |
85 | +#endif /* CONFIG_PM */ | |
86 | .driver = { | |
87 | .shutdown = rhine_shutdown, | |
88 | } |