Staging: hv: Use the completion abstraction in struct rndis_request
authorK. Y. Srinivasan <kys@microsoft.com>
Tue, 10 May 2011 14:55:42 +0000 (07:55 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 11 May 2011 20:49:16 +0000 (13:49 -0700)
Use the completion abstraction in struct rndis_request to synchronize.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/hv/rndis_filter.c

index ee74cd1..2037836 100644 (file)
@@ -59,8 +59,7 @@ struct rndis_device {
 
 struct rndis_request {
        struct list_head list_ent;
-       int wait_condition;
-       wait_queue_head_t wait_event;
+       struct completion  wait_event;
 
        /*
         * FIXME: We assumed a fixed size response here. If we do ever need to
@@ -125,7 +124,7 @@ static struct rndis_request *get_rndis_request(struct rndis_device *dev,
        if (!request)
                return NULL;
 
-       init_waitqueue_head(&request->wait_event);
+       init_completion(&request->wait_event);
 
        rndis_msg = &request->request_msg;
        rndis_msg->ndis_msg_type = msg_type;
@@ -305,8 +304,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
                        }
                }
 
-               request->wait_condition = 1;
-               wake_up(&request->wait_event);
+               complete(&request->wait_event);
        } else {
                dev_err(&dev->net_dev->dev->device,
                        "no rndis request found for this response "
@@ -465,6 +463,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
        struct rndis_query_request *query;
        struct rndis_query_complete *query_complete;
        int ret = 0;
+       int t;
 
        if (!result)
                return -EINVAL;
@@ -484,14 +483,12 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
        query->info_buflen = 0;
        query->dev_vc_handle = 0;
 
-       request->wait_condition = 0;
        ret = rndis_filter_send_request(dev, request);
        if (ret != 0)
                goto Cleanup;
 
-       wait_event_timeout(request->wait_event, request->wait_condition,
-                               msecs_to_jiffies(1000));
-       if (request->wait_condition == 0) {
+       t = wait_for_completion_timeout(&request->wait_event, HZ);
+       if (t == 0) {
                ret = -ETIMEDOUT;
                goto Cleanup;
        }
@@ -543,7 +540,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
        struct rndis_set_request *set;
        struct rndis_set_complete *set_complete;
        u32 status;
-       int ret;
+       int ret, t;
 
        request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG,
                        RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
@@ -562,14 +559,13 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
        memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
               &new_filter, sizeof(u32));
 
-       request->wait_condition = 0;
        ret = rndis_filter_send_request(dev, request);
        if (ret != 0)
                goto Cleanup;
 
-       wait_event_timeout(request->wait_event, request->wait_condition,
-               msecs_to_jiffies(2000));
-       if (request->wait_condition == 0) {
+       t = wait_for_completion_timeout(&request->wait_event, HZ);
+
+       if (t == 0) {
                ret = -1;
                dev_err(&dev->net_dev->dev->device,
                        "timeout before we got a set response...\n");
@@ -624,7 +620,7 @@ static int rndis_filter_init_device(struct rndis_device *dev)
        struct rndis_initialize_request *init;
        struct rndis_initialize_complete *init_complete;
        u32 status;
-       int ret;
+       int ret, t;
 
        request = get_rndis_request(dev, REMOTE_NDIS_INITIALIZE_MSG,
                        RNDIS_MESSAGE_SIZE(struct rndis_initialize_request));
@@ -642,7 +638,6 @@ static int rndis_filter_init_device(struct rndis_device *dev)
 
        dev->state = RNDIS_DEV_INITIALIZING;
 
-       request->wait_condition = 0;
        ret = rndis_filter_send_request(dev, request);
        if (ret != 0) {
                dev->state = RNDIS_DEV_UNINITIALIZED;
@@ -650,9 +645,9 @@ static int rndis_filter_init_device(struct rndis_device *dev)
        }
 
 
-       wait_event_timeout(request->wait_event, request->wait_condition,
-               msecs_to_jiffies(1000));
-       if (request->wait_condition == 0) {
+       t = wait_for_completion_timeout(&request->wait_event, HZ);
+
+       if (t == 0) {
                ret = -ETIMEDOUT;
                goto Cleanup;
        }