diff options
-rw-r--r-- | drivers/misc/mei/bus.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 7c075e9b25e5..483587f60249 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c | |||
@@ -187,9 +187,6 @@ ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length) | |||
187 | { | 187 | { |
188 | struct mei_cl *cl = cldev->cl; | 188 | struct mei_cl *cl = cldev->cl; |
189 | 189 | ||
190 | if (cl == NULL) | ||
191 | return -ENODEV; | ||
192 | |||
193 | return __mei_cl_send(cl, buf, length, MEI_CL_IO_TX_BLOCKING); | 190 | return __mei_cl_send(cl, buf, length, MEI_CL_IO_TX_BLOCKING); |
194 | } | 191 | } |
195 | EXPORT_SYMBOL_GPL(mei_cldev_send); | 192 | EXPORT_SYMBOL_GPL(mei_cldev_send); |
@@ -207,9 +204,6 @@ ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length) | |||
207 | { | 204 | { |
208 | struct mei_cl *cl = cldev->cl; | 205 | struct mei_cl *cl = cldev->cl; |
209 | 206 | ||
210 | if (cl == NULL) | ||
211 | return -ENODEV; | ||
212 | |||
213 | return __mei_cl_recv(cl, buf, length); | 207 | return __mei_cl_recv(cl, buf, length); |
214 | } | 208 | } |
215 | EXPORT_SYMBOL_GPL(mei_cldev_recv); | 209 | EXPORT_SYMBOL_GPL(mei_cldev_recv); |
@@ -403,7 +397,7 @@ EXPORT_SYMBOL_GPL(mei_cldev_ver); | |||
403 | */ | 397 | */ |
404 | bool mei_cldev_enabled(struct mei_cl_device *cldev) | 398 | bool mei_cldev_enabled(struct mei_cl_device *cldev) |
405 | { | 399 | { |
406 | return cldev->cl && mei_cl_is_connected(cldev->cl); | 400 | return mei_cl_is_connected(cldev->cl); |
407 | } | 401 | } |
408 | EXPORT_SYMBOL_GPL(mei_cldev_enabled); | 402 | EXPORT_SYMBOL_GPL(mei_cldev_enabled); |
409 | 403 | ||
@@ -423,14 +417,13 @@ int mei_cldev_enable(struct mei_cl_device *cldev) | |||
423 | 417 | ||
424 | cl = cldev->cl; | 418 | cl = cldev->cl; |
425 | 419 | ||
426 | if (!cl) { | 420 | if (cl->state == MEI_FILE_UNINITIALIZED) { |
427 | mutex_lock(&bus->device_lock); | 421 | mutex_lock(&bus->device_lock); |
428 | cl = mei_cl_alloc_linked(bus); | 422 | ret = mei_cl_link(cl); |
429 | mutex_unlock(&bus->device_lock); | 423 | mutex_unlock(&bus->device_lock); |
430 | if (IS_ERR(cl)) | 424 | if (ret) |
431 | return PTR_ERR(cl); | 425 | return ret; |
432 | /* update pointers */ | 426 | /* update pointers */ |
433 | cldev->cl = cl; | ||
434 | cl->cldev = cldev; | 427 | cl->cldev = cldev; |
435 | } | 428 | } |
436 | 429 | ||
@@ -471,7 +464,7 @@ int mei_cldev_disable(struct mei_cl_device *cldev) | |||
471 | struct mei_cl *cl; | 464 | struct mei_cl *cl; |
472 | int err; | 465 | int err; |
473 | 466 | ||
474 | if (!cldev || !cldev->cl) | 467 | if (!cldev) |
475 | return -ENODEV; | 468 | return -ENODEV; |
476 | 469 | ||
477 | cl = cldev->cl; | 470 | cl = cldev->cl; |
@@ -497,9 +490,6 @@ out: | |||
497 | mei_cl_flush_queues(cl, NULL); | 490 | mei_cl_flush_queues(cl, NULL); |
498 | mei_cl_unlink(cl); | 491 | mei_cl_unlink(cl); |
499 | 492 | ||
500 | kfree(cl); | ||
501 | cldev->cl = NULL; | ||
502 | |||
503 | mutex_unlock(&bus->device_lock); | 493 | mutex_unlock(&bus->device_lock); |
504 | return err; | 494 | return err; |
505 | } | 495 | } |
@@ -754,6 +744,7 @@ static void mei_cl_bus_dev_release(struct device *dev) | |||
754 | 744 | ||
755 | mei_me_cl_put(cldev->me_cl); | 745 | mei_me_cl_put(cldev->me_cl); |
756 | mei_dev_bus_put(cldev->bus); | 746 | mei_dev_bus_put(cldev->bus); |
747 | kfree(cldev->cl); | ||
757 | kfree(cldev); | 748 | kfree(cldev); |
758 | } | 749 | } |
759 | 750 | ||
@@ -786,17 +777,25 @@ static struct mei_cl_device *mei_cl_bus_dev_alloc(struct mei_device *bus, | |||
786 | struct mei_me_client *me_cl) | 777 | struct mei_me_client *me_cl) |
787 | { | 778 | { |
788 | struct mei_cl_device *cldev; | 779 | struct mei_cl_device *cldev; |
780 | struct mei_cl *cl; | ||
789 | 781 | ||
790 | cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL); | 782 | cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL); |
791 | if (!cldev) | 783 | if (!cldev) |
792 | return NULL; | 784 | return NULL; |
793 | 785 | ||
786 | cl = mei_cl_allocate(bus); | ||
787 | if (!cl) { | ||
788 | kfree(cldev); | ||
789 | return NULL; | ||
790 | } | ||
791 | |||
794 | device_initialize(&cldev->dev); | 792 | device_initialize(&cldev->dev); |
795 | cldev->dev.parent = bus->dev; | 793 | cldev->dev.parent = bus->dev; |
796 | cldev->dev.bus = &mei_cl_bus_type; | 794 | cldev->dev.bus = &mei_cl_bus_type; |
797 | cldev->dev.type = &mei_cl_device_type; | 795 | cldev->dev.type = &mei_cl_device_type; |
798 | cldev->bus = mei_dev_bus_get(bus); | 796 | cldev->bus = mei_dev_bus_get(bus); |
799 | cldev->me_cl = mei_me_cl_get(me_cl); | 797 | cldev->me_cl = mei_me_cl_get(me_cl); |
798 | cldev->cl = cl; | ||
800 | mei_cl_bus_set_name(cldev); | 799 | mei_cl_bus_set_name(cldev); |
801 | cldev->is_added = 0; | 800 | cldev->is_added = 0; |
802 | INIT_LIST_HEAD(&cldev->bus_list); | 801 | INIT_LIST_HEAD(&cldev->bus_list); |