| .. | .. | 
|---|
 | 1 | +// SPDX-License-Identifier: GPL-2.0  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 |  | - *  | 
|---|
 | 3 | + * Copyright (c) 2012-2019, Intel Corporation. All rights reserved.  | 
|---|
| 3 | 4 |   * Intel Management Engine Interface (Intel MEI) Linux driver | 
|---|
| 4 |  | - * Copyright (c) 2003-2012, Intel Corporation.  | 
|---|
| 5 |  | - *  | 
|---|
| 6 |  | - * This program is free software; you can redistribute it and/or modify it  | 
|---|
| 7 |  | - * under the terms and conditions of the GNU General Public License,  | 
|---|
| 8 |  | - * version 2, as published by the Free Software Foundation.  | 
|---|
| 9 |  | - *  | 
|---|
| 10 |  | - * This program is distributed in the hope it will be useful, but WITHOUT  | 
|---|
| 11 |  | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  | 
|---|
| 12 |  | - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  | 
|---|
| 13 |  | - * more details.  | 
|---|
| 14 |  | - *  | 
|---|
| 15 | 5 |   */ | 
|---|
| 16 | 6 |   | 
|---|
| 17 | 7 |  #include <linux/export.h> | 
|---|
| .. | .. | 
|---|
| 133 | 123 |   | 
|---|
| 134 | 124 |  	/* enter reset flow */ | 
|---|
| 135 | 125 |  	interrupts_enabled = state != MEI_DEV_POWER_DOWN; | 
|---|
| 136 |  | -	dev->dev_state = MEI_DEV_RESETTING;  | 
|---|
 | 126 | +	mei_set_devstate(dev, MEI_DEV_RESETTING);  | 
|---|
| 137 | 127 |   | 
|---|
| 138 | 128 |  	dev->reset_count++; | 
|---|
| 139 | 129 |  	if (dev->reset_count > MEI_MAX_CONSEC_RESET) { | 
|---|
| 140 | 130 |  		dev_err(dev->dev, "reset: reached maximal consecutive resets: disabling the device\n"); | 
|---|
| 141 |  | -		dev->dev_state = MEI_DEV_DISABLED;  | 
|---|
 | 131 | +		mei_set_devstate(dev, MEI_DEV_DISABLED);  | 
|---|
| 142 | 132 |  		return -ENODEV; | 
|---|
| 143 | 133 |  	} | 
|---|
| 144 | 134 |   | 
|---|
| .. | .. | 
|---|
| 151 | 141 |   | 
|---|
| 152 | 142 |  	mei_hbm_reset(dev); | 
|---|
| 153 | 143 |   | 
|---|
| 154 |  | -	dev->rd_msg_hdr = 0;  | 
|---|
 | 144 | +	memset(dev->rd_msg_hdr, 0, sizeof(dev->rd_msg_hdr));  | 
|---|
| 155 | 145 |   | 
|---|
| 156 | 146 |  	if (ret) { | 
|---|
| 157 | 147 |  		dev_err(dev->dev, "hw_reset failed ret = %d\n", ret); | 
|---|
| .. | .. | 
|---|
| 160 | 150 |   | 
|---|
| 161 | 151 |  	if (state == MEI_DEV_POWER_DOWN) { | 
|---|
| 162 | 152 |  		dev_dbg(dev->dev, "powering down: end of reset\n"); | 
|---|
| 163 |  | -		dev->dev_state = MEI_DEV_DISABLED;  | 
|---|
 | 153 | +		mei_set_devstate(dev, MEI_DEV_DISABLED);  | 
|---|
| 164 | 154 |  		return 0; | 
|---|
| 165 | 155 |  	} | 
|---|
| 166 | 156 |   | 
|---|
| .. | .. | 
|---|
| 172 | 162 |   | 
|---|
| 173 | 163 |  	dev_dbg(dev->dev, "link is established start sending messages.\n"); | 
|---|
| 174 | 164 |   | 
|---|
| 175 |  | -	dev->dev_state = MEI_DEV_INIT_CLIENTS;  | 
|---|
 | 165 | +	mei_set_devstate(dev, MEI_DEV_INIT_CLIENTS);  | 
|---|
| 176 | 166 |  	ret = mei_hbm_start_req(dev); | 
|---|
| 177 | 167 |  	if (ret) { | 
|---|
| 178 | 168 |  		dev_err(dev->dev, "hbm_start failed ret = %d\n", ret); | 
|---|
| 179 |  | -		dev->dev_state = MEI_DEV_RESETTING;  | 
|---|
 | 169 | +		mei_set_devstate(dev, MEI_DEV_RESETTING);  | 
|---|
| 180 | 170 |  		return ret; | 
|---|
| 181 | 171 |  	} | 
|---|
| 182 | 172 |   | 
|---|
| .. | .. | 
|---|
| 200 | 190 |  	/* acknowledge interrupt and stop interrupts */ | 
|---|
| 201 | 191 |  	mei_clear_interrupts(dev); | 
|---|
| 202 | 192 |   | 
|---|
| 203 |  | -	mei_hw_config(dev);  | 
|---|
 | 193 | +	ret = mei_hw_config(dev);  | 
|---|
 | 194 | +	if (ret)  | 
|---|
 | 195 | +		goto err;  | 
|---|
| 204 | 196 |   | 
|---|
| 205 | 197 |  	dev_dbg(dev->dev, "reset in start the mei device.\n"); | 
|---|
| 206 | 198 |   | 
|---|
| 207 | 199 |  	dev->reset_count = 0; | 
|---|
| 208 | 200 |  	do { | 
|---|
| 209 |  | -		dev->dev_state = MEI_DEV_INITIALIZING;  | 
|---|
 | 201 | +		mei_set_devstate(dev, MEI_DEV_INITIALIZING);  | 
|---|
| 210 | 202 |  		ret = mei_reset(dev); | 
|---|
| 211 | 203 |   | 
|---|
| 212 | 204 |  		if (ret == -ENODEV || dev->dev_state == MEI_DEV_DISABLED) { | 
|---|
| .. | .. | 
|---|
| 241 | 233 |  	return 0; | 
|---|
| 242 | 234 |  err: | 
|---|
| 243 | 235 |  	dev_err(dev->dev, "link layer initialization failed.\n"); | 
|---|
| 244 |  | -	dev->dev_state = MEI_DEV_DISABLED;  | 
|---|
 | 236 | +	mei_set_devstate(dev, MEI_DEV_DISABLED);  | 
|---|
| 245 | 237 |  	mutex_unlock(&dev->device_lock); | 
|---|
| 246 | 238 |  	return -ENODEV; | 
|---|
| 247 | 239 |  } | 
|---|
| .. | .. | 
|---|
| 260 | 252 |   | 
|---|
| 261 | 253 |  	mutex_lock(&dev->device_lock); | 
|---|
| 262 | 254 |   | 
|---|
| 263 |  | -	dev->dev_state = MEI_DEV_POWER_UP;  | 
|---|
 | 255 | +	mei_set_devstate(dev, MEI_DEV_POWER_UP);  | 
|---|
| 264 | 256 |  	dev->reset_count = 0; | 
|---|
| 265 | 257 |   | 
|---|
| 266 | 258 |  	err = mei_reset(dev); | 
|---|
| .. | .. | 
|---|
| 311 | 303 |  	dev_dbg(dev->dev, "stopping the device.\n"); | 
|---|
| 312 | 304 |   | 
|---|
| 313 | 305 |  	mutex_lock(&dev->device_lock); | 
|---|
| 314 |  | -	dev->dev_state = MEI_DEV_POWER_DOWN;  | 
|---|
 | 306 | +	mei_set_devstate(dev, MEI_DEV_POWER_DOWN);  | 
|---|
| 315 | 307 |  	mutex_unlock(&dev->device_lock); | 
|---|
| 316 | 308 |  	mei_cl_bus_remove_devices(dev); | 
|---|
| 317 | 309 |   | 
|---|
| .. | .. | 
|---|
| 324 | 316 |   | 
|---|
| 325 | 317 |  	mei_reset(dev); | 
|---|
| 326 | 318 |  	/* move device to disabled state unconditionally */ | 
|---|
| 327 |  | -	dev->dev_state = MEI_DEV_DISABLED;  | 
|---|
 | 319 | +	mei_set_devstate(dev, MEI_DEV_DISABLED);  | 
|---|
| 328 | 320 |   | 
|---|
| 329 | 321 |  	mutex_unlock(&dev->device_lock); | 
|---|
| 330 | 322 |  } | 
|---|