diff options
Diffstat (limited to 'drivers/net/wireless/prism54')
-rw-r--r-- | drivers/net/wireless/prism54/islpci_hotplug.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/net/wireless/prism54/islpci_hotplug.c b/drivers/net/wireless/prism54/islpci_hotplug.c index f6354b1cbc2..e0bca3abdf6 100644 --- a/drivers/net/wireless/prism54/islpci_hotplug.c +++ b/drivers/net/wireless/prism54/islpci_hotplug.c | |||
@@ -170,14 +170,15 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
170 | pci_set_master(pdev); | 170 | pci_set_master(pdev); |
171 | 171 | ||
172 | /* enable MWI */ | 172 | /* enable MWI */ |
173 | pci_set_mwi(pdev); | 173 | if (pci_set_mwi(pdev)) |
174 | goto do_pci_release_regions; | ||
174 | 175 | ||
175 | /* setup the network device interface and its structure */ | 176 | /* setup the network device interface and its structure */ |
176 | if (!(ndev = islpci_setup(pdev))) { | 177 | if (!(ndev = islpci_setup(pdev))) { |
177 | /* error configuring the driver as a network device */ | 178 | /* error configuring the driver as a network device */ |
178 | printk(KERN_ERR "%s: could not configure network device\n", | 179 | printk(KERN_ERR "%s: could not configure network device\n", |
179 | DRV_NAME); | 180 | DRV_NAME); |
180 | goto do_pci_release_regions; | 181 | goto do_pci_clear_mwi; |
181 | } | 182 | } |
182 | 183 | ||
183 | priv = netdev_priv(ndev); | 184 | priv = netdev_priv(ndev); |
@@ -207,6 +208,8 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
207 | pci_set_drvdata(pdev, NULL); | 208 | pci_set_drvdata(pdev, NULL); |
208 | free_netdev(ndev); | 209 | free_netdev(ndev); |
209 | priv = NULL; | 210 | priv = NULL; |
211 | do_pci_clear_mwi: | ||
212 | pci_clear_mwi(pdev); | ||
210 | do_pci_release_regions: | 213 | do_pci_release_regions: |
211 | pci_release_regions(pdev); | 214 | pci_release_regions(pdev); |
212 | do_pci_disable_device: | 215 | do_pci_disable_device: |
@@ -254,6 +257,8 @@ prism54_remove(struct pci_dev *pdev) | |||
254 | free_netdev(ndev); | 257 | free_netdev(ndev); |
255 | priv = NULL; | 258 | priv = NULL; |
256 | 259 | ||
260 | pci_clear_mwi(pdev); | ||
261 | |||
257 | pci_release_regions(pdev); | 262 | pci_release_regions(pdev); |
258 | 263 | ||
259 | pci_disable_device(pdev); | 264 | pci_disable_device(pdev); |
@@ -287,12 +292,19 @@ prism54_resume(struct pci_dev *pdev) | |||
287 | { | 292 | { |
288 | struct net_device *ndev = pci_get_drvdata(pdev); | 293 | struct net_device *ndev = pci_get_drvdata(pdev); |
289 | islpci_private *priv = ndev ? netdev_priv(ndev) : NULL; | 294 | islpci_private *priv = ndev ? netdev_priv(ndev) : NULL; |
290 | BUG_ON(!priv); | 295 | int err; |
291 | 296 | ||
292 | pci_enable_device(pdev); | 297 | BUG_ON(!priv); |
293 | 298 | ||
294 | printk(KERN_NOTICE "%s: got resume request\n", ndev->name); | 299 | printk(KERN_NOTICE "%s: got resume request\n", ndev->name); |
295 | 300 | ||
301 | err = pci_enable_device(pdev); | ||
302 | if (err) { | ||
303 | printk(KERN_ERR "%s: pci_enable_device failed on resume\n", | ||
304 | ndev->name); | ||
305 | return err; | ||
306 | } | ||
307 | |||
296 | pci_restore_state(pdev); | 308 | pci_restore_state(pdev); |
297 | 309 | ||
298 | /* alright let's go into the PREBOOT state */ | 310 | /* alright let's go into the PREBOOT state */ |