summaryrefslogtreecommitdiffstats
path: root/drivers/misc/mei/client.c
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2013-01-08 22:07:22 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-09 01:40:46 +0100
commit781d0d89224bbbc438c2c0360cfd4822bb35d280 (patch)
treeccda09fa57cd18a9f875bf46d0ce35b925cd9219 /drivers/misc/mei/client.c
parentmei: rename remaining amthi strings to amthif (diff)
downloadlinux-781d0d89224bbbc438c2c0360cfd4822bb35d280.tar.xz
linux-781d0d89224bbbc438c2c0360cfd4822bb35d280.zip
mei: normalize me host client linking routines
In order we can use the same code pattern for in-kernel and user space host clients we replace mei_cl_link_to_me with mei_cl_link function. We then have to keep me client lookupout of the new link function. The unlinking cannot be yet symetric due to amthif connection handling Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc/mei/client.c')
-rw-r--r--drivers/misc/mei/client.c53
1 files changed, 30 insertions, 23 deletions
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index 8103d94facb8..d566dd880eb0 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -258,54 +258,61 @@ struct mei_cl_cb *mei_cl_find_read_cb(struct mei_cl *cl)
return NULL;
}
-
-/**
- * mei_me_cl_link - create link between host and me clinet and add
- * me_cl to the list
- *
- * @cl: link between me and host client assocated with opened file descriptor
- * @uuid: uuid of ME client
- * @client_id: id of the host client
+/** mei_cl_link: allocte host id in the host map
*
- * returns ME client index if ME client
+ * @cl - host client
+ * @id - fixed host id or -1 for genereting one
+ * returns 0 on success
* -EINVAL on incorrect values
* -ENONET if client not found
*/
-int mei_cl_link_me(struct mei_cl *cl, const uuid_le *uuid, u8 host_cl_id)
+int mei_cl_link(struct mei_cl *cl, int id)
{
struct mei_device *dev;
- int i;
- if (WARN_ON(!cl || !cl->dev || !uuid))
+ if (WARN_ON(!cl || !cl->dev))
return -EINVAL;
dev = cl->dev;
- /* check for valid client id */
- i = mei_me_cl_by_uuid(dev, uuid);
- if (i >= 0) {
- cl->me_client_id = dev->me_clients[i].client_id;
- cl->state = MEI_FILE_CONNECTING;
- cl->host_client_id = host_cl_id;
+ /* If Id is not asigned get one*/
+ if (id == MEI_HOST_CLIENT_ID_ANY)
+ id = find_first_zero_bit(dev->host_clients_map,
+ MEI_CLIENTS_MAX);
- list_add_tail(&cl->link, &dev->file_list);
- return (u8)i;
+ if (id >= MEI_CLIENTS_MAX) {
+ dev_err(&dev->pdev->dev, "id exceded %d", MEI_CLIENTS_MAX) ;
+ return -ENOENT;
}
- return -ENOENT;
+ dev->open_handle_count++;
+
+ cl->host_client_id = id;
+ list_add_tail(&cl->link, &dev->file_list);
+
+ set_bit(id, dev->host_clients_map);
+
+ cl->state = MEI_FILE_INITIALIZING;
+
+ dev_dbg(&dev->pdev->dev, "link cl host id = %d\n", cl->host_client_id);
+ return 0;
}
+
/**
* mei_cl_unlink - remove me_cl from the list
*
* @dev: the device structure
- * @host_client_id: host client id to be removed
*/
int mei_cl_unlink(struct mei_cl *cl)
{
struct mei_device *dev;
struct mei_cl *pos, *next;
- if (WARN_ON(!cl || !cl->dev))
+ /* don't shout on error exit path */
+ if (!cl)
+ return 0;
+
+ if (WARN_ON(!cl->dev))
return -EINVAL;
dev = cl->dev;