Commit 47f60a01 authored by Alexander Usyskin's avatar Alexander Usyskin Committed by Greg Kroah-Hartman

mei: me: generate an interrupt if the hw indicates reset.

In rare case the driver may lose connection with the device after device
reset due to a missed interrupt. The driver will unlock the flow by
generating an interrupt towards the firmware (HIG) when the device is in
the resetting state. The FW is able to ignore the interrupt during
orderly flow. The effected platforms are skylake and newer.
Signed-off-by: default avatarAlexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9c7daa61
...@@ -393,6 +393,19 @@ static bool mei_me_hw_is_ready(struct mei_device *dev) ...@@ -393,6 +393,19 @@ static bool mei_me_hw_is_ready(struct mei_device *dev)
return (mecsr & ME_RDY_HRA) == ME_RDY_HRA; return (mecsr & ME_RDY_HRA) == ME_RDY_HRA;
} }
/**
* mei_me_hw_is_resetting - check whether the me(hw) is in reset
*
* @dev: mei device
* Return: bool
*/
static bool mei_me_hw_is_resetting(struct mei_device *dev)
{
u32 mecsr = mei_me_mecsr_read(dev);
return (mecsr & ME_RST_HRA) == ME_RST_HRA;
}
/** /**
* mei_me_hw_ready_wait - wait until the me(hw) has turned ready * mei_me_hw_ready_wait - wait until the me(hw) has turned ready
* or timeout is reached * or timeout is reached
...@@ -1219,6 +1232,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) ...@@ -1219,6 +1232,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
goto end; goto end;
} }
if (mei_me_hw_is_resetting(dev))
mei_hcsr_set_hig(dev);
mei_me_pg_intr(dev, me_intr_src(hcsr)); mei_me_pg_intr(dev, me_intr_src(hcsr));
/* check if we need to start the dev */ /* check if we need to start the dev */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment