mei: use mei_io_cb_ warppers also for control flows
authorTomas Winkler <tomas.winkler@intel.com>
Thu, 11 Oct 2012 14:35:08 +0000 (16:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Oct 2012 22:37:31 +0000 (15:37 -0700)
move the mei_io_cb_ wrappers to to iorw.c for global use
and use them also for handling control flows

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/init.c
drivers/misc/mei/iorw.c
drivers/misc/mei/main.c
drivers/misc/mei/mei_dev.h

index 4666f0ba350ab08a3a3e35ec62552a1d0de68603..1f13eb97a10a43ae84e0d4f5def8e3b40ed5daf8 100644 (file)
@@ -668,12 +668,10 @@ int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl)
        if (cl->state != MEI_FILE_DISCONNECTING)
                return 0;
 
-       cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL);
+       cb = mei_io_cb_init(cl, NULL);
        if (!cb)
                return -ENOMEM;
 
-       mei_io_list_init(cb);
-       cb->file_private = cl;
        cb->major_file_operations = MEI_CLOSE;
        if (dev->mei_host_buffer_is_empty) {
                dev->mei_host_buffer_is_empty = false;
index 2891bc44f9d49764ed98e328ccc0511bc340160c..541c157f325a3214a8524b8ddca0674f20d149c1 100644 (file)
@@ -52,6 +52,80 @@ void mei_io_cb_free(struct mei_cl_cb *cb)
        kfree(cb->response_buffer.data);
        kfree(cb);
 }
+/**
+ * mei_io_cb_init - allocate and initialize io callback
+ *
+ * @cl - mei client
+ * @file: pointer to file structure
+ *
+ * returns mei_cl_cb pointer or NULL;
+ */
+struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp)
+{
+       struct mei_cl_cb *cb;
+
+       cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL);
+       if (!cb)
+               return NULL;
+
+       mei_io_list_init(cb);
+
+       cb->file_object = fp;
+       cb->file_private = cl;
+       cb->buf_idx = 0;
+       return cb;
+}
+
+
+/**
+ * mei_io_cb_alloc_req_buf - allocate request buffer
+ *
+ * @cb -  io callback structure
+ * @size: size of the buffer
+ *
+ * returns 0 on success
+ *         -EINVAL if cb is NULL
+ *         -ENOMEM if allocation failed
+ */
+int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length)
+{
+       if (!cb)
+               return -EINVAL;
+
+       if (length == 0)
+               return 0;
+
+       cb->request_buffer.data = kmalloc(length, GFP_KERNEL);
+       if (!cb->request_buffer.data)
+               return -ENOMEM;
+       cb->request_buffer.size = length;
+       return 0;
+}
+/**
+ * mei_io_cb_alloc_req_buf - allocate respose buffer
+ *
+ * @cb -  io callback structure
+ * @size: size of the buffer
+ *
+ * returns 0 on success
+ *         -EINVAL if cb is NULL
+ *         -ENOMEM if allocation failed
+ */
+int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length)
+{
+       if (!cb)
+               return -EINVAL;
+
+       if (length == 0)
+               return 0;
+
+       cb->response_buffer.data = kmalloc(length, GFP_KERNEL);
+       if (!cb->response_buffer.data)
+               return -ENOMEM;
+       cb->response_buffer.size = length;
+       return 0;
+}
+
 
 /**
  * mei_me_cl_by_id return index to me_clients for client_id
@@ -112,14 +186,12 @@ int mei_ioctl_connect_client(struct file *file,
 
        dev_dbg(&dev->pdev->dev, "mei_ioctl_connect_client() Entry\n");
 
-
        /* buffered ioctl cb */
-       cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL);
+       cb = mei_io_cb_init(cl, file);
        if (!cb) {
                rets = -ENOMEM;
                goto end;
        }
-       mei_io_list_init(cb);
 
        cb->major_file_operations = MEI_IOCTL;
 
@@ -207,14 +279,12 @@ int mei_ioctl_connect_client(struct file *file,
                } else {
                        dev_dbg(&dev->pdev->dev, "Sending connect message - succeeded\n");
                        cl->timer_count = MEI_CONNECT_TIMEOUT;
-                       cb->file_private = cl;
                        list_add_tail(&cb->list, &dev->ctrl_rd_list.list);
                }
 
 
        } else {
                dev_dbg(&dev->pdev->dev, "Queuing the connect request due to device busy\n");
-               cb->file_private = cl;
                dev_dbg(&dev->pdev->dev, "add connect cb to control write list.\n");
                list_add_tail(&cb->list, &dev->ctrl_wr_list.list);
        }
@@ -407,7 +477,7 @@ out:
 int mei_start_read(struct mei_device *dev, struct mei_cl *cl)
 {
        struct mei_cl_cb *cb;
-       int rets = 0;
+       int rets;
        int i;
 
        if (cl->state != MEI_FILE_CONNECTED)
@@ -416,49 +486,40 @@ int mei_start_read(struct mei_device *dev, struct mei_cl *cl)
        if (dev->dev_state != MEI_DEV_ENABLED)
                return -ENODEV;
 
-       dev_dbg(&dev->pdev->dev, "check if read is pending.\n");
        if (cl->read_pending || cl->read_cb) {
                dev_dbg(&dev->pdev->dev, "read is pending.\n");
                return -EBUSY;
        }
+       i = mei_me_cl_by_id(dev, cl->me_client_id);
+       if (i < 0) {
+               dev_err(&dev->pdev->dev, "no such me client %d\n",
+                       cl->me_client_id);
+               return  -ENODEV;
+       }
 
-       cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL);
+       cb = mei_io_cb_init(cl, NULL);
        if (!cb)
                return -ENOMEM;
 
-       dev_dbg(&dev->pdev->dev, "allocation call back successful. host client = %d, ME client = %d\n",
-               cl->host_client_id, cl->me_client_id);
-       i = mei_me_cl_by_id(dev, cl->me_client_id);
-       if (i < 0) {
-               rets = -ENODEV;
-               goto unlock;
-       }
+       rets = mei_io_cb_alloc_resp_buf(cb,
+                       dev->me_clients[i].props.max_msg_length);
+       if (rets)
+               goto err;
 
-       cb->response_buffer.size = dev->me_clients[i].props.max_msg_length;
-       cb->response_buffer.data =
-                       kmalloc(cb->response_buffer.size, GFP_KERNEL);
-       if (!cb->response_buffer.data) {
-               rets = -ENOMEM;
-               goto unlock;
-       }
-       dev_dbg(&dev->pdev->dev, "allocation call back data success.\n");
        cb->major_file_operations = MEI_READ;
-       /* make sure buffer index is zero before we start */
-       cb->buf_idx = 0;
-       cb->file_private = (void *) cl;
        cl->read_cb = cb;
        if (dev->mei_host_buffer_is_empty) {
                dev->mei_host_buffer_is_empty = false;
                if (mei_send_flow_control(dev, cl)) {
                        rets = -ENODEV;
-                       goto unlock;
+                       goto err;
                }
                list_add_tail(&cb->list, &dev->read_list.list);
        } else {
                list_add_tail(&cb->list, &dev->ctrl_wr_list.list);
        }
        return rets;
-unlock:
+err:
        mei_io_cb_free(cb);
        return rets;
 }
index 518e07eb1075e1d9266eb8df249305d5fd805744..ed4943f6b6c21e6c8e4ccb0c86a34b75afc1409c 100644 (file)
@@ -513,84 +513,6 @@ out:
        mutex_unlock(&dev->device_lock);
        return rets;
 }
-
-/**
- * mei_io_cb_init - allocate and initialize io callback
- *
- * @cl - mei client
- * @file: pointer to file structure
- *
- * returns mei_cl_cb pointer or NULL;
- */
-static struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp)
-{
-       struct mei_cl_cb *cb;
-       struct mei_device *dev;
-
-       dev = cl->dev;
-
-       cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL);
-       if (!cb)
-               return NULL;
-
-       mei_io_list_init(cb);
-
-       cb->file_object = fp;
-       cb->file_private = cl;
-       cb->buf_idx = 0;
-       return cb;
-}
-
-
-/**
- * mei_io_cb_alloc_req_buf - allocate request buffer
- *
- * @cb -  io callback structure
- * @size: size of the buffer
- *
- * returns 0 on success
- *         -EINVAL if cb is NULL
- *         -ENOMEM if allocation failed
- */
-static int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length)
-{
-       if (!cb)
-               return -EINVAL;
-
-       if (length == 0)
-               return 0;
-
-       cb->request_buffer.data = kmalloc(length, GFP_KERNEL);
-       if (!cb->request_buffer.data)
-               return -ENOMEM;
-       cb->request_buffer.size = length;
-       return 0;
-}
-/**
- * mei_io_cb_alloc_req_buf - allocate respose buffer
- *
- * @cb -  io callback structure
- * @size: size of the buffer
- *
- * returns 0 on success
- *         -EINVAL if cb is NULL
- *         -ENOMEM if allocation failed
- */
-static int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length)
-{
-       if (!cb)
-               return -EINVAL;
-
-       if (length == 0)
-               return 0;
-
-       cb->response_buffer.data = kmalloc(length, GFP_KERNEL);
-       if (!cb->response_buffer.data)
-               return -ENOMEM;
-       cb->response_buffer.size = length;
-       return 0;
-}
-
 /**
  * mei_write - the write function.
  *
index 4545a9ebd79fad3c1ae20fcd4bf05927dee2892e..6adcb3f6621ae77c7ca1e25b7522387409023314 100644 (file)
@@ -293,7 +293,11 @@ int mei_me_cl_by_id(struct mei_device *dev, u8 client_id);
 /*
  * MEI IO Functions
  */
+struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp);
 void mei_io_cb_free(struct mei_cl_cb *priv_cb);
+int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length);
+int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length);
+
 
 /**
  * mei_io_list_init - Sets up a queue list.