Skip to content

Commit

Permalink
mei: Remove all bus devices from the mei_dev list when stopping the MEI
Browse files Browse the repository at this point in the history
When stopping the MEI, we should remove and potentially unregister
all bus devices queued on the mei_dev linked list.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Tomas Winkler authored and Greg Kroah-Hartman committed Feb 18, 2014
1 parent ba4b60e commit 4870569
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 7 deletions.
16 changes: 16 additions & 0 deletions drivers/misc/mei/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,22 @@ void mei_cl_bus_rx_event(struct mei_cl *cl)
schedule_work(&device->event_work);
}

void mei_cl_bus_remove_devices(struct mei_device *dev)
{
struct mei_cl *cl, *next;

mutex_lock(&dev->device_lock);
list_for_each_entry_safe(cl, next, &dev->device_list, device_link) {
if (cl->device)
mei_cl_remove_device(cl->device);

list_del(&cl->device_link);
mei_cl_unlink(cl);
kfree(cl);
}
mutex_unlock(&dev->device_lock);
}

int __init mei_cl_bus_init(void)
{
return bus_register(&mei_cl_bus_type);
Expand Down
2 changes: 2 additions & 0 deletions drivers/misc/mei/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,8 @@ void mei_stop(struct mei_device *dev)

mei_nfc_host_exit(dev);

mei_cl_bus_remove_devices(dev);

mutex_lock(&dev->device_lock);

mei_wd_stop(dev);
Expand Down
1 change: 1 addition & 0 deletions drivers/misc/mei/mei_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ int __mei_cl_async_send(struct mei_cl *cl, u8 *buf, size_t length);
int __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length);
int __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length);
void mei_cl_bus_rx_event(struct mei_cl *cl);
void mei_cl_bus_remove_devices(struct mei_device *dev);
int mei_cl_bus_init(void);
void mei_cl_bus_exit(void);

Expand Down
8 changes: 1 addition & 7 deletions drivers/misc/mei/nfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -552,13 +552,7 @@ int mei_nfc_host_init(struct mei_device *dev)
void mei_nfc_host_exit(struct mei_device *dev)
{
struct mei_nfc_dev *ndev = &nfc_dev;

cancel_work_sync(&ndev->init_work);
}

mutex_lock(&dev->device_lock);
if (ndev->cl && ndev->cl->device)
mei_cl_remove_device(ndev->cl->device);

mei_nfc_free(ndev);
mutex_unlock(&dev->device_lock);
}

0 comments on commit 4870569

Please sign in to comment.