diff options
Diffstat (limited to 'drivers/misc/mei/pci-me.c')
-rw-r--r-- | drivers/misc/mei/pci-me.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 2cab3c0a6805..ddadd08956f4 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
@@ -144,6 +144,21 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
144 | dev_err(&pdev->dev, "failed to get pci regions.\n"); | 144 | dev_err(&pdev->dev, "failed to get pci regions.\n"); |
145 | goto disable_device; | 145 | goto disable_device; |
146 | } | 146 | } |
147 | |||
148 | if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) || | ||
149 | dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { | ||
150 | |||
151 | err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); | ||
152 | if (err) | ||
153 | err = dma_set_coherent_mask(&pdev->dev, | ||
154 | DMA_BIT_MASK(32)); | ||
155 | } | ||
156 | if (err) { | ||
157 | dev_err(&pdev->dev, "No usable DMA configuration, aborting\n"); | ||
158 | goto release_regions; | ||
159 | } | ||
160 | |||
161 | |||
147 | /* allocates and initializes the mei dev structure */ | 162 | /* allocates and initializes the mei dev structure */ |
148 | dev = mei_me_dev_init(pdev); | 163 | dev = mei_me_dev_init(pdev); |
149 | if (!dev) { | 164 | if (!dev) { |
@@ -197,8 +212,8 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
197 | return 0; | 212 | return 0; |
198 | 213 | ||
199 | release_irq: | 214 | release_irq: |
215 | mei_cancel_work(dev); | ||
200 | mei_disable_interrupts(dev); | 216 | mei_disable_interrupts(dev); |
201 | flush_scheduled_work(); | ||
202 | free_irq(pdev->irq, dev); | 217 | free_irq(pdev->irq, dev); |
203 | disable_msi: | 218 | disable_msi: |
204 | pci_disable_msi(pdev); | 219 | pci_disable_msi(pdev); |
@@ -306,16 +321,14 @@ static int mei_me_pci_resume(struct device *device) | |||
306 | return err; | 321 | return err; |
307 | } | 322 | } |
308 | 323 | ||
309 | mutex_lock(&dev->device_lock); | 324 | err = mei_restart(dev); |
310 | dev->dev_state = MEI_DEV_POWER_UP; | 325 | if (err) |
311 | mei_clear_interrupts(dev); | 326 | return err; |
312 | mei_reset(dev, 1); | ||
313 | mutex_unlock(&dev->device_lock); | ||
314 | 327 | ||
315 | /* Start timer if stopped in suspend */ | 328 | /* Start timer if stopped in suspend */ |
316 | schedule_delayed_work(&dev->timer_work, HZ); | 329 | schedule_delayed_work(&dev->timer_work, HZ); |
317 | 330 | ||
318 | return err; | 331 | return 0; |
319 | } | 332 | } |
320 | static SIMPLE_DEV_PM_OPS(mei_me_pm_ops, mei_me_pci_suspend, mei_me_pci_resume); | 333 | static SIMPLE_DEV_PM_OPS(mei_me_pm_ops, mei_me_pci_suspend, mei_me_pci_resume); |
321 | #define MEI_ME_PM_OPS (&mei_me_pm_ops) | 334 | #define MEI_ME_PM_OPS (&mei_me_pm_ops) |