IB/hfi1: Use the same capability state for all shared contexts
[deliverable/linux.git] / drivers / misc / mei / client.c
index bab17e4197b68b4763bf05a92d14ffffbaf70f4a..641c1a5666879b9715f5ee0924db447411a2e653 100644 (file)
@@ -727,6 +727,11 @@ static void mei_cl_wake_all(struct mei_cl *cl)
                cl_dbg(dev, cl, "Waking up waiting for event clients!\n");
                wake_up_interruptible(&cl->ev_wait);
        }
+       /* synchronized under device mutex */
+       if (waitqueue_active(&cl->wait)) {
+               cl_dbg(dev, cl, "Waking up ctrl write clients!\n");
+               wake_up(&cl->wait);
+       }
 }
 
 /**
@@ -879,12 +884,15 @@ static int __mei_cl_disconnect(struct mei_cl *cl)
        }
 
        mutex_unlock(&dev->device_lock);
-       wait_event_timeout(cl->wait, cl->state == MEI_FILE_DISCONNECT_REPLY,
+       wait_event_timeout(cl->wait,
+                          cl->state == MEI_FILE_DISCONNECT_REPLY ||
+                          cl->state == MEI_FILE_DISCONNECTED,
                           mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
        mutex_lock(&dev->device_lock);
 
        rets = cl->status;
-       if (cl->state != MEI_FILE_DISCONNECT_REPLY) {
+       if (cl->state != MEI_FILE_DISCONNECT_REPLY &&
+           cl->state != MEI_FILE_DISCONNECTED) {
                cl_dbg(dev, cl, "timeout on disconnect from FW client.\n");
                rets = -ETIME;
        }
@@ -1085,6 +1093,7 @@ int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl,
        mutex_unlock(&dev->device_lock);
        wait_event_timeout(cl->wait,
                        (cl->state == MEI_FILE_CONNECTED ||
+                        cl->state == MEI_FILE_DISCONNECTED ||
                         cl->state == MEI_FILE_DISCONNECT_REQUIRED ||
                         cl->state == MEI_FILE_DISCONNECT_REPLY),
                        mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
@@ -1333,16 +1342,13 @@ int mei_cl_notify_request(struct mei_cl *cl,
        }
 
        mutex_unlock(&dev->device_lock);
-       wait_event_timeout(cl->wait, cl->notify_en == request,
-                       mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
+       wait_event_timeout(cl->wait,
+                          cl->notify_en == request || !mei_cl_is_connected(cl),
+                          mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
        mutex_lock(&dev->device_lock);
 
-       if (cl->notify_en != request) {
-               mei_io_list_flush(&dev->ctrl_rd_list, cl);
-               mei_io_list_flush(&dev->ctrl_wr_list, cl);
-               if (!cl->status)
-                       cl->status = -EFAULT;
-       }
+       if (cl->notify_en != request && !cl->status)
+               cl->status = -EFAULT;
 
        rets = cl->status;
 
@@ -1766,6 +1772,10 @@ void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb)
                if (waitqueue_active(&cl->wait))
                        wake_up(&cl->wait);
 
+               break;
+       case MEI_FOP_DISCONNECT_RSP:
+               mei_io_cb_free(cb);
+               mei_cl_set_disconnected(cl);
                break;
        default:
                BUG_ON(0);
This page took 0.027439 seconds and 5 git commands to generate.