mei: add reference counting for me clients

To support dynamic addition and removal of
me clients we add reference counter.

Update kdoc with locking requirements.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tento commit je obsažen v:
Tomas Winkler
2015-01-11 00:07:16 +02:00
odevzdal Greg Kroah-Hartman
rodič 3542f6b183
revize 79563db9dd
10 změnil soubory, kde provedl 221 přidání a 94 odebrání

Zobrazit soubor

@@ -228,8 +228,8 @@ static ssize_t ___mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
bool blocking)
{
struct mei_device *dev;
struct mei_me_client *me_cl;
struct mei_cl_cb *cb;
struct mei_me_client *me_cl = NULL;
struct mei_cl_cb *cb = NULL;
ssize_t rets;
if (WARN_ON(!cl || !cl->dev))
@@ -237,33 +237,40 @@ static ssize_t ___mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
dev = cl->dev;
if (cl->state != MEI_FILE_CONNECTED)
return -ENODEV;
mutex_lock(&dev->device_lock);
if (cl->state != MEI_FILE_CONNECTED) {
rets = -ENODEV;
goto out;
}
/* Check if we have an ME client device */
me_cl = mei_me_cl_by_uuid_id(dev, &cl->cl_uuid, cl->me_client_id);
if (!me_cl)
return -ENOTTY;
if (!me_cl) {
rets = -ENOTTY;
goto out;
}
if (length > me_cl->props.max_msg_length)
return -EFBIG;
if (length > me_cl->props.max_msg_length) {
rets = -EFBIG;
goto out;
}
cb = mei_io_cb_init(cl, NULL);
if (!cb)
return -ENOMEM;
if (!cb) {
rets = -ENOMEM;
goto out;
}
rets = mei_io_cb_alloc_req_buf(cb, length);
if (rets < 0) {
mei_io_cb_free(cb);
return rets;
}
if (rets < 0)
goto out;
memcpy(cb->request_buffer.data, buf, length);
mutex_lock(&dev->device_lock);
rets = mei_cl_write(cl, cb, blocking);
out:
mei_me_cl_put(me_cl);
mutex_unlock(&dev->device_lock);
if (rets < 0)
mei_io_cb_free(cb);