{
        struct mei_cl *cl = cldev->cl;
 
-       if (cl == NULL)
-               return -ENODEV;
-
        return __mei_cl_send(cl, buf, length, MEI_CL_IO_TX_BLOCKING);
 }
 EXPORT_SYMBOL_GPL(mei_cldev_send);
 {
        struct mei_cl *cl = cldev->cl;
 
-       if (cl == NULL)
-               return -ENODEV;
-
        return __mei_cl_recv(cl, buf, length);
 }
 EXPORT_SYMBOL_GPL(mei_cldev_recv);
  */
 bool mei_cldev_enabled(struct mei_cl_device *cldev)
 {
-       return cldev->cl && mei_cl_is_connected(cldev->cl);
+       return mei_cl_is_connected(cldev->cl);
 }
 EXPORT_SYMBOL_GPL(mei_cldev_enabled);
 
 
        cl = cldev->cl;
 
-       if (!cl) {
+       if (cl->state == MEI_FILE_UNINITIALIZED) {
                mutex_lock(&bus->device_lock);
-               cl = mei_cl_alloc_linked(bus);
+               ret = mei_cl_link(cl);
                mutex_unlock(&bus->device_lock);
-               if (IS_ERR(cl))
-                       return PTR_ERR(cl);
+               if (ret)
+                       return ret;
                /* update pointers */
-               cldev->cl = cl;
                cl->cldev = cldev;
        }
 
        struct mei_cl *cl;
        int err;
 
-       if (!cldev || !cldev->cl)
+       if (!cldev)
                return -ENODEV;
 
        cl = cldev->cl;
        mei_cl_flush_queues(cl, NULL);
        mei_cl_unlink(cl);
 
-       kfree(cl);
-       cldev->cl = NULL;
-
        mutex_unlock(&bus->device_lock);
        return err;
 }
 
        mei_me_cl_put(cldev->me_cl);
        mei_dev_bus_put(cldev->bus);
+       kfree(cldev->cl);
        kfree(cldev);
 }
 
                                                  struct mei_me_client *me_cl)
 {
        struct mei_cl_device *cldev;
+       struct mei_cl *cl;
 
        cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL);
        if (!cldev)
                return NULL;
 
+       cl = mei_cl_allocate(bus);
+       if (!cl) {
+               kfree(cldev);
+               return NULL;
+       }
+
        device_initialize(&cldev->dev);
        cldev->dev.parent = bus->dev;
        cldev->dev.bus    = &mei_cl_bus_type;
        cldev->dev.type   = &mei_cl_device_type;
        cldev->bus        = mei_dev_bus_get(bus);
        cldev->me_cl      = mei_me_cl_get(me_cl);
+       cldev->cl         = cl;
        mei_cl_bus_set_name(cldev);
        cldev->is_added   = 0;
        INIT_LIST_HEAD(&cldev->bus_list);