| .. | .. |
|---|
| 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 | } |
|---|