aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/misc/mei/hbm.c26
-rw-r--r--drivers/misc/mei/hbm.h6
-rw-r--r--drivers/misc/mei/init.c2
-rw-r--r--drivers/misc/mei/mei_dev.h2
4 files changed, 22 insertions, 14 deletions
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index cda914191a2f..2968b52fc12a 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -172,21 +172,27 @@ bool mei_hbm_cl_addr_equal(struct mei_cl *cl, void *buf)
172 cl->me_client_id == cmd->me_addr; 172 cl->me_client_id == cmd->me_addr;
173} 173}
174 174
175 175/**
176 * mei_hbm_start_wait - wait for start response message.
177 *
178 * @dev: the device structure
179 *
180 * returns 0 on success and < 0 on failure
181 */
176int mei_hbm_start_wait(struct mei_device *dev) 182int mei_hbm_start_wait(struct mei_device *dev)
177{ 183{
178 int ret; 184 int ret;
179 if (dev->hbm_state > MEI_HBM_START) 185
186 if (dev->hbm_state > MEI_HBM_STARTING)
180 return 0; 187 return 0;
181 188
182 mutex_unlock(&dev->device_lock); 189 mutex_unlock(&dev->device_lock);
183 ret = wait_event_interruptible_timeout(dev->wait_recvd_msg, 190 ret = wait_event_timeout(dev->wait_hbm_start,
184 dev->hbm_state == MEI_HBM_IDLE || 191 dev->hbm_state != MEI_HBM_STARTING,
185 dev->hbm_state >= MEI_HBM_STARTED,
186 mei_secs_to_jiffies(MEI_HBM_TIMEOUT)); 192 mei_secs_to_jiffies(MEI_HBM_TIMEOUT));
187 mutex_lock(&dev->device_lock); 193 mutex_lock(&dev->device_lock);
188 194
189 if (ret <= 0 && (dev->hbm_state <= MEI_HBM_START)) { 195 if (ret == 0 && (dev->hbm_state <= MEI_HBM_STARTING)) {
190 dev->hbm_state = MEI_HBM_IDLE; 196 dev->hbm_state = MEI_HBM_IDLE;
191 dev_err(&dev->pdev->dev, "waiting for mei start failed\n"); 197 dev_err(&dev->pdev->dev, "waiting for mei start failed\n");
192 return -ETIME; 198 return -ETIME;
@@ -227,7 +233,7 @@ int mei_hbm_start_req(struct mei_device *dev)
227 return ret; 233 return ret;
228 } 234 }
229 235
230 dev->hbm_state = MEI_HBM_START; 236 dev->hbm_state = MEI_HBM_STARTING;
231 dev->init_clients_timer = MEI_CLIENTS_INIT_TIMEOUT; 237 dev->init_clients_timer = MEI_CLIENTS_INIT_TIMEOUT;
232 return 0; 238 return 0;
233} 239}
@@ -726,7 +732,7 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
726 } 732 }
727 733
728 if (dev->dev_state != MEI_DEV_INIT_CLIENTS || 734 if (dev->dev_state != MEI_DEV_INIT_CLIENTS ||
729 dev->hbm_state != MEI_HBM_START) { 735 dev->hbm_state != MEI_HBM_STARTING) {
730 dev_err(&dev->pdev->dev, "hbm: start: state mismatch, [%d, %d]\n", 736 dev_err(&dev->pdev->dev, "hbm: start: state mismatch, [%d, %d]\n",
731 dev->dev_state, dev->hbm_state); 737 dev->dev_state, dev->hbm_state);
732 return -EPROTO; 738 return -EPROTO;
@@ -739,7 +745,7 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
739 return -EIO; 745 return -EIO;
740 } 746 }
741 747
742 wake_up_interruptible(&dev->wait_recvd_msg); 748 wake_up(&dev->wait_hbm_start);
743 break; 749 break;
744 750
745 case CLIENT_CONNECT_RES_CMD: 751 case CLIENT_CONNECT_RES_CMD:
@@ -866,7 +872,7 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
866 dev_dbg(&dev->pdev->dev, "hbm: stop request: message received\n"); 872 dev_dbg(&dev->pdev->dev, "hbm: stop request: message received\n");
867 dev->hbm_state = MEI_HBM_STOPPED; 873 dev->hbm_state = MEI_HBM_STOPPED;
868 if (mei_hbm_stop_req(dev)) { 874 if (mei_hbm_stop_req(dev)) {
869 dev_err(&dev->pdev->dev, "hbm: start: failed to send stop request\n"); 875 dev_err(&dev->pdev->dev, "hbm: stop request: failed to send stop request\n");
870 return -EIO; 876 return -EIO;
871 } 877 }
872 break; 878 break;
diff --git a/drivers/misc/mei/hbm.h b/drivers/misc/mei/hbm.h
index 683eb2835cec..80920f096c04 100644
--- a/drivers/misc/mei/hbm.h
+++ b/drivers/misc/mei/hbm.h
@@ -25,13 +25,15 @@ struct mei_cl;
25 * enum mei_hbm_state - host bus message protocol state 25 * enum mei_hbm_state - host bus message protocol state
26 * 26 *
27 * @MEI_HBM_IDLE : protocol not started 27 * @MEI_HBM_IDLE : protocol not started
28 * @MEI_HBM_START : start request message was sent 28 * @MEI_HBM_STARTING : start request message was sent
29 * @MEI_HBM_STARTED : start reply message was received
29 * @MEI_HBM_ENUM_CLIENTS : enumeration request was sent 30 * @MEI_HBM_ENUM_CLIENTS : enumeration request was sent
30 * @MEI_HBM_CLIENT_PROPERTIES : acquiring clients properties 31 * @MEI_HBM_CLIENT_PROPERTIES : acquiring clients properties
32 * @MEI_HBM_STOPPED : stopping exchange
31 */ 33 */
32enum mei_hbm_state { 34enum mei_hbm_state {
33 MEI_HBM_IDLE = 0, 35 MEI_HBM_IDLE = 0,
34 MEI_HBM_START, 36 MEI_HBM_STARTING,
35 MEI_HBM_STARTED, 37 MEI_HBM_STARTED,
36 MEI_HBM_ENUM_CLIENTS, 38 MEI_HBM_ENUM_CLIENTS,
37 MEI_HBM_CLIENT_PROPERTIES, 39 MEI_HBM_CLIENT_PROPERTIES,
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c
index 73ccbb65d4ff..9f635be684ea 100644
--- a/drivers/misc/mei/init.c
+++ b/drivers/misc/mei/init.c
@@ -360,7 +360,7 @@ void mei_device_init(struct mei_device *dev, const struct mei_cfg *cfg)
360 mutex_init(&dev->device_lock); 360 mutex_init(&dev->device_lock);
361 init_waitqueue_head(&dev->wait_hw_ready); 361 init_waitqueue_head(&dev->wait_hw_ready);
362 init_waitqueue_head(&dev->wait_pg); 362 init_waitqueue_head(&dev->wait_pg);
363 init_waitqueue_head(&dev->wait_recvd_msg); 363 init_waitqueue_head(&dev->wait_hbm_start);
364 init_waitqueue_head(&dev->wait_stop_wd); 364 init_waitqueue_head(&dev->wait_stop_wd);
365 dev->dev_state = MEI_DEV_INITIALIZING; 365 dev->dev_state = MEI_DEV_INITIALIZING;
366 dev->reset_count = 0; 366 dev->reset_count = 0;
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index 0922ce867d47..79124ae6a249 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -443,7 +443,7 @@ struct mei_device {
443 */ 443 */
444 wait_queue_head_t wait_hw_ready; 444 wait_queue_head_t wait_hw_ready;
445 wait_queue_head_t wait_pg; 445 wait_queue_head_t wait_pg;
446 wait_queue_head_t wait_recvd_msg; 446 wait_queue_head_t wait_hbm_start;
447 wait_queue_head_t wait_stop_wd; 447 wait_queue_head_t wait_stop_wd;
448 448
449 /* 449 /*