diff options
Diffstat (limited to 'drivers/misc/mei/hw-me.c')
| -rw-r--r-- | drivers/misc/mei/hw-me.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 822170f0034..b22c7e24722 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c @@ -171,7 +171,7 @@ static void mei_me_hw_reset_release(struct mei_device *dev)   * @dev: the device structure   * @intr_enable: if interrupt should be enabled after reset.   */ -static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable) +static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)  {  	struct mei_me_hw *hw = to_me_hw(dev);  	u32 hcsr = mei_hcsr_read(hw); @@ -191,6 +191,7 @@ static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable)  		mei_me_hw_reset_release(dev);  	dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", mei_hcsr_read(hw)); +	return 0;  }  /** @@ -238,14 +239,18 @@ static int mei_me_hw_ready_wait(struct mei_device *dev)  	if (mei_me_hw_is_ready(dev))  		return 0; +	dev->recvd_hw_ready = false;  	mutex_unlock(&dev->device_lock);  	err = wait_event_interruptible_timeout(dev->wait_hw_ready, -			dev->recvd_hw_ready, MEI_INTEROP_TIMEOUT); +			dev->recvd_hw_ready, +			mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT));  	mutex_lock(&dev->device_lock);  	if (!err && !dev->recvd_hw_ready) { +		if (!err) +			err = -ETIMEDOUT;  		dev_err(&dev->pdev->dev, -			"wait hw ready failed. status = 0x%x\n", err); -		return -ETIMEDOUT; +			"wait hw ready failed. status = %d\n", err); +		return err;  	}  	dev->recvd_hw_ready = false; @@ -482,7 +487,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)  	/* check if ME wants a reset */  	if (!mei_hw_is_ready(dev) &&  	    dev->dev_state != MEI_DEV_RESETTING && -	    dev->dev_state != MEI_DEV_INITIALIZING) { +	    dev->dev_state != MEI_DEV_INITIALIZING && +	    dev->dev_state != MEI_DEV_POWER_DOWN && +	    dev->dev_state != MEI_DEV_POWER_UP) {  		dev_dbg(&dev->pdev->dev, "FW not ready.\n");  		mei_reset(dev, 1);  		mutex_unlock(&dev->device_lock);  | 
