mei: revamp me client search function
authorTomas Winkler <tomas.winkler@intel.com>
Mon, 23 Jul 2012 11:05:39 +0000 (14:05 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 16 Aug 2012 16:40:28 +0000 (09:40 -0700)
me client search functions returns index
into me_client array according me client id
or me client uuid.

1. Add common prefix for the functions mei_me_cl_<>
2. create new function mei_me_cl_by_id that wraps open
 coded loops scattered over the code
3. rename mei_find_me_client_index to  mei_me_cl_by_uuid
4. rename mei_find_me_client_update_filext  to
 mei_me_cl_update_filext and updates its parameter names

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
drivers/misc/mei/wd.c

index e77f86e69fb5f55ba89bfac1e6b217a4318d0fe2..58b3bf47c8ebc68f255b4745c6281f6f967bfb63 100644 (file)
@@ -522,12 +522,12 @@ void mei_cl_init(struct mei_cl *priv, struct mei_device *dev)
        priv->dev = dev;
 }
 
-int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid)
+int mei_me_cl_by_uuid(const struct mei_device *dev, const uuid_le *cuuid)
 {
-       int i, res = -1;
+       int i, res = -ENOENT;
 
        for (i = 0; i < dev->me_clients_num; ++i)
-               if (uuid_le_cmp(cuuid,
+               if (uuid_le_cmp(*cuuid,
                                dev->me_clients[i].props.protocol_name) == 0) {
                        res = i;
                        break;
@@ -538,35 +538,35 @@ int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid)
 
 
 /**
- * mei_find_me_client_update_filext - searches for ME client guid
+ * mei_me_cl_update_filext - searches for ME client guid
  *                       sets client_id in mei_file_private if found
  * @dev: the device structure
- * @priv: private file structure to set client_id in
- * @cguid: searched guid of ME client
+ * @cl: private file structure to set client_id in
+ * @cuuid: searched uuid of ME client
  * @client_id: id of host client to be set in file private structure
  *
  * returns ME client index
  */
-u8 mei_find_me_client_update_filext(struct mei_device *dev, struct mei_cl *priv,
-                               const uuid_le *cguid, u8 client_id)
+int mei_me_cl_update_filext(struct mei_device *dev, struct mei_cl *cl,
+                               const uuid_le *cuuid, u8 host_cl_id)
 {
        int i;
 
-       if (!dev || !priv || !cguid)
-               return 0;
+       if (!dev || !cl || !cuuid)
+               return -EINVAL;
 
        /* check for valid client id */
-       i = mei_find_me_client_index(dev, *cguid);
+       i = mei_me_cl_by_uuid(dev, cuuid);
        if (i >= 0) {
-               priv->me_client_id = dev->me_clients[i].client_id;
-               priv->state = MEI_FILE_CONNECTING;
-               priv->host_client_id = client_id;
+               cl->me_client_id = dev->me_clients[i].client_id;
+               cl->state = MEI_FILE_CONNECTING;
+               cl->host_client_id = host_cl_id;
 
-               list_add_tail(&priv->link, &dev->file_list);
+               list_add_tail(&cl->link, &dev->file_list);
                return (u8)i;
        }
 
-       return 0;
+       return -ENOENT;
 }
 
 /**
@@ -577,16 +577,16 @@ u8 mei_find_me_client_update_filext(struct mei_device *dev, struct mei_cl *priv,
  */
 void mei_host_init_iamthif(struct mei_device *dev)
 {
-       u8 i;
+       int i;
        unsigned char *msg_buf;
 
        mei_cl_init(&dev->iamthif_cl, dev);
        dev->iamthif_cl.state = MEI_FILE_DISCONNECTED;
 
        /* find ME amthi client */
-       i = mei_find_me_client_update_filext(dev, &dev->iamthif_cl,
+       i = mei_me_cl_update_filext(dev, &dev->iamthif_cl,
                            &mei_amthi_guid, MEI_IAMTHIF_HOST_CLIENT_ID);
-       if (dev->iamthif_cl.state != MEI_FILE_CONNECTING) {
+       if (i < 0) {
                dev_dbg(&dev->pdev->dev, "failed to find iamthif client.\n");
                return;
        }
index 50f52e21f587a229e374a9f72149186aace43777..9187d852ef9c702d575e7731d91fb2fdddc03099 100644 (file)
 #include <linux/mei.h>
 #include "interface.h"
 
+/**
+ * mei_me_cl_by_id return index to me_clients for client_id
+ *
+ * @dev: the device structure
+ * @client_id: me client id
+ *
+ * Locking: called under "dev->device_lock" lock
+ *
+ * returns index on success, -ENOENT on failure.
+ */
 
+int mei_me_cl_by_id(struct mei_device *dev, u8 client_id)
+{
+       int i;
+       for (i = 0; i < dev->me_clients_num; i++)
+               if (dev->me_clients[i].client_id == client_id)
+                       break;
+       if (WARN_ON(dev->me_clients[i].client_id != client_id))
+               return -ENOENT;
+
+       if (i == dev->me_clients_num)
+               return -ENOENT;
+
+       return i;
+}
 
 /**
  * mei_ioctl_connect_client - the connect to fw client IOCTL function
@@ -95,7 +119,7 @@ int mei_ioctl_connect_client(struct file *file,
        }
 
        /* find ME client we're trying to connect to */
-       i = mei_find_me_client_index(dev, data->in_client_uuid);
+       i = mei_me_cl_by_uuid(dev, &data->in_client_uuid);
        if (i >= 0 && !dev->me_clients[i].props.fixed_address) {
                cl->me_client_id = dev->me_clients[i].client_id;
                cl->state = MEI_FILE_CONNECTING;
@@ -273,19 +297,12 @@ int amthi_read(struct mei_device *dev, struct file *file,
                return -ETIMEDOUT;
        }
 
-       for (i = 0; i < dev->me_clients_num; i++) {
-               if (dev->me_clients[i].client_id ==
-                   dev->iamthif_cl.me_client_id)
-                       break;
-       }
+       i = mei_me_cl_by_id(dev, dev->iamthif_cl.me_client_id);
 
-       if (i == dev->me_clients_num) {
+       if (i < 0) {
                dev_dbg(&dev->pdev->dev, "amthi client not found.\n");
                return -ENODEV;
        }
-       if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id))
-               return -ENODEV;
-
        dev_dbg(&dev->pdev->dev, "checking amthi data\n");
        cb = find_amthi_read_list_entry(dev, file);
 
@@ -316,8 +333,7 @@ int amthi_read(struct mei_device *dev, struct file *file,
        dev->iamthif_timer = 0;
 
        if (cb) {
-               timeout = cb->read_time +
-                                       msecs_to_jiffies(IAMTHIF_READ_TIMER);
+               timeout = cb->read_time + msecs_to_jiffies(IAMTHIF_READ_TIMER);
                dev_dbg(&dev->pdev->dev, "amthi timeout = %lud\n",
                                timeout);
 
@@ -401,19 +417,8 @@ int mei_start_read(struct mei_device *dev, struct mei_cl *cl)
 
        dev_dbg(&dev->pdev->dev, "allocation call back successful. host client = %d, ME client = %d\n",
                cl->host_client_id, cl->me_client_id);
-
-       for (i = 0; i < dev->me_clients_num; i++) {
-               if (dev->me_clients[i].client_id == cl->me_client_id)
-                       break;
-
-       }
-
-       if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
-               rets = -ENODEV;
-               goto unlock;
-       }
-
-       if (i == dev->me_clients_num) {
+       i = mei_me_cl_by_id(dev, cl->me_client_id);
+       if (i < 0) {
                rets = -ENODEV;
                goto unlock;
        }
index 092330208869640a1e474abfd781bce41a5c6043..b0903bd44bf76642661abdc2c2f518a896790b14 100644 (file)
@@ -393,10 +393,9 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
 
        if ((cl->sm_state & MEI_WD_STATE_INDEPENDENCE_MSG_SENT) == 0) {
                /* Do not allow to read watchdog client */
-               i = mei_find_me_client_index(dev, mei_wd_guid);
+               i = mei_me_cl_by_uuid(dev, &mei_wd_guid);
                if (i >= 0) {
                        struct mei_me_client *me_client = &dev->me_clients[i];
-
                        if (cl->me_client_id == me_client->client_id) {
                                rets = -EBADF;
                                goto out;
@@ -620,22 +619,12 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
                        rets = -ENODEV;
                        goto unlock_dev;
                }
-               for (i = 0; i < dev->me_clients_num; i++) {
-                       if (dev->me_clients[i].client_id ==
-                               dev->iamthif_cl.me_client_id)
-                               break;
-               }
-
-               if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
+               i = mei_me_cl_by_id(dev, dev->iamthif_cl.me_client_id);
+               if (i < 0) {
                        rets = -ENODEV;
                        goto unlock_dev;
                }
-               if (i == dev->me_clients_num ||
-                   (dev->me_clients[i].client_id !=
-                     dev->iamthif_cl.me_client_id)) {
-                       rets = -ENODEV;
-                       goto unlock_dev;
-               } else if (length > dev->me_clients[i].props.max_msg_length ||
+               if (length > dev->me_clients[i].props.max_msg_length ||
                           length <= 0) {
                        rets = -EMSGSIZE;
                        goto unlock_dev;
@@ -688,16 +677,8 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
                    cl->me_client_id);
                goto unlock_dev;
        }
-       for (i = 0; i < dev->me_clients_num; i++) {
-               if (dev->me_clients[i].client_id ==
-                   cl->me_client_id)
-                       break;
-       }
-       if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
-               rets = -ENODEV;
-               goto unlock_dev;
-       }
-       if (i == dev->me_clients_num) {
+       i = mei_me_cl_by_id(dev, cl->me_client_id);
+       if (i < 0) {
                rets = -ENODEV;
                goto unlock_dev;
        }
index d61c4ddfc80c3fa80f804f2c0a7528284b7b957a..1ff1fc678fb3aea807b4628bf192711226a21ed6 100644 (file)
@@ -279,9 +279,10 @@ void mei_host_init_iamthif(struct mei_device *dev);
 void mei_allocate_me_clients_storage(struct mei_device *dev);
 
 
-u8 mei_find_me_client_update_filext(struct mei_device *dev,
-                               struct mei_cl *priv,
-                               const uuid_le *cguid, u8 client_id);
+int mei_me_cl_update_filext(struct mei_device *dev, struct mei_cl *cl,
+                       const uuid_le *cguid, u8 host_client_id);
+int mei_me_cl_by_uuid(const struct mei_device *dev, const uuid_le *cuuid);
+int mei_me_cl_by_id(struct mei_device *dev, u8 client_id);
 
 /*
  * MEI IO List Functions
@@ -348,7 +349,6 @@ void mei_run_next_iamthif_cmd(struct mei_device *dev);
 
 void mei_free_cb_private(struct mei_cl_cb *priv_cb);
 
-int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid);
 
 /*
  * Register Access Function
index 5133fd77b91cc8e01be11736094cd9869b265a86..912319e4fa90985ada27c14a8e534235280eda4a 100644 (file)
@@ -69,7 +69,7 @@ int mei_wd_host_init(struct mei_device *dev)
        dev->wd_timeout = AMT_WD_DEFAULT_TIMEOUT;
 
        /* find ME WD client */
-       mei_find_me_client_update_filext(dev, &dev->wd_cl,
+       mei_me_cl_update_filext(dev, &dev->wd_cl,
                                &mei_wd_guid, MEI_WD_HOST_CLIENT_ID);
 
        dev_dbg(&dev->pdev->dev, "wd: check client\n");