diff options
Diffstat (limited to 'drivers/misc/mei/hw-me.c')
-rw-r--r-- | drivers/misc/mei/hw-me.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 7e769c59a420..7145929cdb51 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
@@ -507,7 +507,16 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) | |||
507 | while (slots > 0) { | 507 | while (slots > 0) { |
508 | dev_dbg(&dev->pdev->dev, "slots to read = %08x\n", slots); | 508 | dev_dbg(&dev->pdev->dev, "slots to read = %08x\n", slots); |
509 | rets = mei_irq_read_handler(dev, &complete_list, &slots); | 509 | rets = mei_irq_read_handler(dev, &complete_list, &slots); |
510 | /* There is a race between ME write and interrupt delivery: | ||
511 | * Not all data is always available immediately after the | ||
512 | * interrupt, so try to read again on the next interrupt. | ||
513 | */ | ||
514 | if (rets == -ENODATA) | ||
515 | break; | ||
516 | |||
510 | if (rets && dev->dev_state != MEI_DEV_RESETTING) { | 517 | if (rets && dev->dev_state != MEI_DEV_RESETTING) { |
518 | dev_err(&dev->pdev->dev, "mei_irq_read_handler ret = %d.\n", | ||
519 | rets); | ||
511 | schedule_work(&dev->reset_work); | 520 | schedule_work(&dev->reset_work); |
512 | goto end; | 521 | goto end; |
513 | } | 522 | } |