diff options
Diffstat (limited to 'drivers/misc/mei/init.c')
| -rw-r--r-- | drivers/misc/mei/init.c | 35 | 
1 files changed, 23 insertions, 12 deletions
| diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index eb052005ca86..bac8852aad51 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c @@ -1,6 +1,6 @@  // SPDX-License-Identifier: GPL-2.0  /* - * Copyright (c) 2012-2019, Intel Corporation. All rights reserved. + * Copyright (c) 2012-2022, Intel Corporation. All rights reserved.   * Intel Management Engine Interface (Intel MEI) Linux driver   */ @@ -218,16 +218,6 @@ int mei_start(struct mei_device *dev)  		goto err;  	} -	if (!mei_host_is_ready(dev)) { -		dev_err(dev->dev, "host is not ready.\n"); -		goto err; -	} - -	if (!mei_hw_is_ready(dev)) { -		dev_err(dev->dev, "ME is not ready.\n"); -		goto err; -	} -  	if (!mei_hbm_version_is_supported(dev)) {  		dev_dbg(dev->dev, "MEI start failed.\n");  		goto err; @@ -320,6 +310,8 @@ void mei_stop(struct mei_device *dev)  	mei_clear_interrupts(dev);  	mei_synchronize_irq(dev); +	/* to catch HW-initiated reset */ +	mei_cancel_work(dev);  	mutex_lock(&dev->device_lock); @@ -357,14 +349,16 @@ bool mei_write_is_idle(struct mei_device *dev)  EXPORT_SYMBOL_GPL(mei_write_is_idle);  /** - * mei_device_init  -- initialize mei_device structure + * mei_device_init - initialize mei_device structure   *   * @dev: the mei device   * @device: the device structure + * @slow_fw: configure longer timeouts as FW is slow   * @hw_ops: hw operations   */  void mei_device_init(struct mei_device *dev,  		     struct device *device, +		     bool slow_fw,  		     const struct mei_hw_ops *hw_ops)  {  	/* setup our list array */ @@ -393,6 +387,8 @@ void mei_device_init(struct mei_device *dev,  	bitmap_zero(dev->host_clients_map, MEI_CLIENTS_MAX);  	dev->open_handle_count = 0; +	dev->pxp_mode = MEI_DEV_PXP_DEFAULT; +  	/*  	 * Reserving the first client ID  	 * 0: Reserved for MEI Bus Message communications @@ -402,6 +398,21 @@ void mei_device_init(struct mei_device *dev,  	dev->pg_event = MEI_PG_EVENT_IDLE;  	dev->ops      = hw_ops;  	dev->dev      = device; + +	dev->timeouts.hw_ready = mei_secs_to_jiffies(MEI_HW_READY_TIMEOUT); +	dev->timeouts.connect = MEI_CONNECT_TIMEOUT; +	dev->timeouts.client_init = MEI_CLIENTS_INIT_TIMEOUT; +	dev->timeouts.pgi = mei_secs_to_jiffies(MEI_PGI_TIMEOUT); +	dev->timeouts.d0i3 = mei_secs_to_jiffies(MEI_D0I3_TIMEOUT); +	if (slow_fw) { +		dev->timeouts.cl_connect = mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT_SLOW); +		dev->timeouts.hbm = mei_secs_to_jiffies(MEI_HBM_TIMEOUT_SLOW); +		dev->timeouts.mkhi_recv = msecs_to_jiffies(MKHI_RCV_TIMEOUT_SLOW); +	} else { +		dev->timeouts.cl_connect = mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT); +		dev->timeouts.hbm = mei_secs_to_jiffies(MEI_HBM_TIMEOUT); +		dev->timeouts.mkhi_recv = msecs_to_jiffies(MKHI_RCV_TIMEOUT); +	}  }  EXPORT_SYMBOL_GPL(mei_device_init); |