diff options
Diffstat (limited to 'drivers/misc/mei')
-rw-r--r-- | drivers/misc/mei/amthif.c | 1 | ||||
-rw-r--r-- | drivers/misc/mei/bus.c | 5 | ||||
-rw-r--r-- | drivers/misc/mei/client.h | 6 | ||||
-rw-r--r-- | drivers/misc/mei/hbm.c | 10 | ||||
-rw-r--r-- | drivers/misc/mei/init.c | 3 | ||||
-rw-r--r-- | drivers/misc/mei/main.c | 11 | ||||
-rw-r--r-- | drivers/misc/mei/mei_dev.h | 6 |
7 files changed, 27 insertions, 15 deletions
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index 04fd38567729..226c3f3cd3e8 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c | |||
@@ -57,6 +57,7 @@ void mei_amthif_reset_params(struct mei_device *dev) | |||
57 | dev->iamthif_ioctl = false; | 57 | dev->iamthif_ioctl = false; |
58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; | 58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; |
59 | dev->iamthif_timer = 0; | 59 | dev->iamthif_timer = 0; |
60 | dev->iamthif_stall_timer = 0; | ||
60 | } | 61 | } |
61 | 62 | ||
62 | /** | 63 | /** |
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 6d0282c08a06..cd2033cd7120 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c | |||
@@ -297,10 +297,13 @@ int __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) | |||
297 | 297 | ||
298 | if (cl->reading_state != MEI_READ_COMPLETE && | 298 | if (cl->reading_state != MEI_READ_COMPLETE && |
299 | !waitqueue_active(&cl->rx_wait)) { | 299 | !waitqueue_active(&cl->rx_wait)) { |
300 | |||
300 | mutex_unlock(&dev->device_lock); | 301 | mutex_unlock(&dev->device_lock); |
301 | 302 | ||
302 | if (wait_event_interruptible(cl->rx_wait, | 303 | if (wait_event_interruptible(cl->rx_wait, |
303 | (MEI_READ_COMPLETE == cl->reading_state))) { | 304 | cl->reading_state == MEI_READ_COMPLETE || |
305 | mei_cl_is_transitioning(cl))) { | ||
306 | |||
304 | if (signal_pending(current)) | 307 | if (signal_pending(current)) |
305 | return -EINTR; | 308 | return -EINTR; |
306 | return -ERESTARTSYS; | 309 | return -ERESTARTSYS; |
diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h index 6374ed99e233..c8396e582f1c 100644 --- a/drivers/misc/mei/client.h +++ b/drivers/misc/mei/client.h | |||
@@ -90,6 +90,12 @@ static inline bool mei_cl_is_connected(struct mei_cl *cl) | |||
90 | cl->dev->dev_state == MEI_DEV_ENABLED && | 90 | cl->dev->dev_state == MEI_DEV_ENABLED && |
91 | cl->state == MEI_FILE_CONNECTED); | 91 | cl->state == MEI_FILE_CONNECTED); |
92 | } | 92 | } |
93 | static inline bool mei_cl_is_transitioning(struct mei_cl *cl) | ||
94 | { | ||
95 | return (MEI_FILE_INITIALIZING == cl->state || | ||
96 | MEI_FILE_DISCONNECTED == cl->state || | ||
97 | MEI_FILE_DISCONNECTING == cl->state); | ||
98 | } | ||
93 | 99 | ||
94 | bool mei_cl_is_other_connecting(struct mei_cl *cl); | 100 | bool mei_cl_is_other_connecting(struct mei_cl *cl); |
95 | int mei_cl_disconnect(struct mei_cl *cl); | 101 | int mei_cl_disconnect(struct mei_cl *cl); |
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index f1c974a0bc0d..9b3a0fb7f265 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
@@ -35,11 +35,15 @@ static void mei_hbm_me_cl_allocate(struct mei_device *dev) | |||
35 | struct mei_me_client *clients; | 35 | struct mei_me_client *clients; |
36 | int b; | 36 | int b; |
37 | 37 | ||
38 | dev->me_clients_num = 0; | ||
39 | dev->me_client_presentation_num = 0; | ||
40 | dev->me_client_index = 0; | ||
41 | |||
38 | /* count how many ME clients we have */ | 42 | /* count how many ME clients we have */ |
39 | for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX) | 43 | for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX) |
40 | dev->me_clients_num++; | 44 | dev->me_clients_num++; |
41 | 45 | ||
42 | if (dev->me_clients_num <= 0) | 46 | if (dev->me_clients_num == 0) |
43 | return; | 47 | return; |
44 | 48 | ||
45 | kfree(dev->me_clients); | 49 | kfree(dev->me_clients); |
@@ -221,7 +225,7 @@ static int mei_hbm_prop_req(struct mei_device *dev) | |||
221 | struct hbm_props_request *prop_req; | 225 | struct hbm_props_request *prop_req; |
222 | const size_t len = sizeof(struct hbm_props_request); | 226 | const size_t len = sizeof(struct hbm_props_request); |
223 | unsigned long next_client_index; | 227 | unsigned long next_client_index; |
224 | u8 client_num; | 228 | unsigned long client_num; |
225 | 229 | ||
226 | 230 | ||
227 | client_num = dev->me_client_presentation_num; | 231 | client_num = dev->me_client_presentation_num; |
@@ -680,8 +684,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) | |||
680 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && | 684 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && |
681 | dev->hbm_state == MEI_HBM_ENUM_CLIENTS) { | 685 | dev->hbm_state == MEI_HBM_ENUM_CLIENTS) { |
682 | dev->init_clients_timer = 0; | 686 | dev->init_clients_timer = 0; |
683 | dev->me_client_presentation_num = 0; | ||
684 | dev->me_client_index = 0; | ||
685 | mei_hbm_me_cl_allocate(dev); | 687 | mei_hbm_me_cl_allocate(dev); |
686 | dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; | 688 | dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; |
687 | 689 | ||
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index 92c73118b13c..6197018e2f16 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
@@ -175,6 +175,9 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
175 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); | 175 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); |
176 | } | 176 | } |
177 | 177 | ||
178 | /* we're already in reset, cancel the init timer */ | ||
179 | dev->init_clients_timer = 0; | ||
180 | |||
178 | dev->me_clients_num = 0; | 181 | dev->me_clients_num = 0; |
179 | dev->rd_msg_hdr = 0; | 182 | dev->rd_msg_hdr = 0; |
180 | dev->wd_pending = false; | 183 | dev->wd_pending = false; |
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 9aa3b78067d3..c71420ef1e37 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
@@ -252,19 +252,16 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, | |||
252 | mutex_unlock(&dev->device_lock); | 252 | mutex_unlock(&dev->device_lock); |
253 | 253 | ||
254 | if (wait_event_interruptible(cl->rx_wait, | 254 | if (wait_event_interruptible(cl->rx_wait, |
255 | (MEI_READ_COMPLETE == cl->reading_state || | 255 | MEI_READ_COMPLETE == cl->reading_state || |
256 | MEI_FILE_INITIALIZING == cl->state || | 256 | mei_cl_is_transitioning(cl))) { |
257 | MEI_FILE_DISCONNECTED == cl->state || | 257 | |
258 | MEI_FILE_DISCONNECTING == cl->state))) { | ||
259 | if (signal_pending(current)) | 258 | if (signal_pending(current)) |
260 | return -EINTR; | 259 | return -EINTR; |
261 | return -ERESTARTSYS; | 260 | return -ERESTARTSYS; |
262 | } | 261 | } |
263 | 262 | ||
264 | mutex_lock(&dev->device_lock); | 263 | mutex_lock(&dev->device_lock); |
265 | if (MEI_FILE_INITIALIZING == cl->state || | 264 | if (mei_cl_is_transitioning(cl)) { |
266 | MEI_FILE_DISCONNECTED == cl->state || | ||
267 | MEI_FILE_DISCONNECTING == cl->state) { | ||
268 | rets = -EBUSY; | 265 | rets = -EBUSY; |
269 | goto out; | 266 | goto out; |
270 | } | 267 | } |
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 7b918b2fb894..456b322013e2 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
@@ -396,9 +396,9 @@ struct mei_device { | |||
396 | struct mei_me_client *me_clients; /* Note: memory has to be allocated */ | 396 | struct mei_me_client *me_clients; /* Note: memory has to be allocated */ |
397 | DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX); | 397 | DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX); |
398 | DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX); | 398 | DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX); |
399 | u8 me_clients_num; | 399 | unsigned long me_clients_num; |
400 | u8 me_client_presentation_num; | 400 | unsigned long me_client_presentation_num; |
401 | u8 me_client_index; | 401 | unsigned long me_client_index; |
402 | 402 | ||
403 | struct mei_cl wd_cl; | 403 | struct mei_cl wd_cl; |
404 | enum mei_wd_states wd_state; | 404 | enum mei_wd_states wd_state; |