diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/mei/hw-me.c | 9 | ||||
-rw-r--r-- | drivers/misc/mei/interrupt.c | 2 |
2 files changed, 10 insertions, 1 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 | } |
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 2fbf0c0625ed..f38a32addad0 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
@@ -351,7 +351,7 @@ int mei_irq_read_handler(struct mei_device *dev, | |||
351 | dev_err(&dev->pdev->dev, "less data available than length=%08x.\n", | 351 | dev_err(&dev->pdev->dev, "less data available than length=%08x.\n", |
352 | *slots); | 352 | *slots); |
353 | /* we can't read the message */ | 353 | /* we can't read the message */ |
354 | ret = -EBADMSG; | 354 | ret = -ENODATA; |
355 | goto end; | 355 | goto end; |
356 | } | 356 | } |
357 | 357 | ||