diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/mei/bus.c | 5 | ||||
-rw-r--r-- | drivers/misc/mei/client.h | 6 | ||||
-rw-r--r-- | drivers/misc/mei/main.c | 11 |
3 files changed, 14 insertions, 8 deletions
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 9eb031e92070..892cc4207fa2 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/main.c b/drivers/misc/mei/main.c index 173ff095be0d..cabeddd66c1f 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
@@ -249,19 +249,16 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, | |||
249 | mutex_unlock(&dev->device_lock); | 249 | mutex_unlock(&dev->device_lock); |
250 | 250 | ||
251 | if (wait_event_interruptible(cl->rx_wait, | 251 | if (wait_event_interruptible(cl->rx_wait, |
252 | (MEI_READ_COMPLETE == cl->reading_state || | 252 | MEI_READ_COMPLETE == cl->reading_state || |
253 | MEI_FILE_INITIALIZING == cl->state || | 253 | mei_cl_is_transitioning(cl))) { |
254 | MEI_FILE_DISCONNECTED == cl->state || | 254 | |
255 | MEI_FILE_DISCONNECTING == cl->state))) { | ||
256 | if (signal_pending(current)) | 255 | if (signal_pending(current)) |
257 | return -EINTR; | 256 | return -EINTR; |
258 | return -ERESTARTSYS; | 257 | return -ERESTARTSYS; |
259 | } | 258 | } |
260 | 259 | ||
261 | mutex_lock(&dev->device_lock); | 260 | mutex_lock(&dev->device_lock); |
262 | if (MEI_FILE_INITIALIZING == cl->state || | 261 | if (mei_cl_is_transitioning(cl)) { |
263 | MEI_FILE_DISCONNECTED == cl->state || | ||
264 | MEI_FILE_DISCONNECTING == cl->state) { | ||
265 | rets = -EBUSY; | 262 | rets = -EBUSY; |
266 | goto out; | 263 | goto out; |
267 | } | 264 | } |