|
@@ -140,36 +140,53 @@ static struct device_type mei_cl_device_type = {
|
|
|
.release = mei_cl_dev_release,
|
|
|
};
|
|
|
|
|
|
-struct mei_cl_device *mei_cl_add_device(struct mei_device *mei_device,
|
|
|
+static struct mei_cl *mei_bus_find_mei_cl_by_uuid(struct mei_device *dev,
|
|
|
+ uuid_le uuid)
|
|
|
+{
|
|
|
+ struct mei_cl *cl, *next;
|
|
|
+
|
|
|
+ list_for_each_entry_safe(cl, next, &dev->device_list, device_link) {
|
|
|
+ if (!uuid_le_cmp(uuid, cl->device_uuid))
|
|
|
+ return cl;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+struct mei_cl_device *mei_cl_add_device(struct mei_device *dev,
|
|
|
uuid_le uuid, char *name)
|
|
|
{
|
|
|
struct mei_cl_device *device;
|
|
|
+ struct mei_cl *cl;
|
|
|
int status;
|
|
|
|
|
|
+ cl = mei_bus_find_mei_cl_by_uuid(dev, uuid);
|
|
|
+ if (cl == NULL)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
device = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL);
|
|
|
if (!device)
|
|
|
return NULL;
|
|
|
|
|
|
- device->dev.parent = &mei_device->pdev->dev;
|
|
|
+ device->cl = cl;
|
|
|
+
|
|
|
+ device->dev.parent = &dev->pdev->dev;
|
|
|
device->dev.bus = &mei_cl_bus_type;
|
|
|
device->dev.type = &mei_cl_device_type;
|
|
|
|
|
|
dev_set_name(&device->dev, "%s", name);
|
|
|
|
|
|
status = device_register(&device->dev);
|
|
|
- if (status)
|
|
|
- goto out_err;
|
|
|
+ if (status) {
|
|
|
+ dev_err(&dev->pdev->dev, "Failed to register MEI device\n");
|
|
|
+ kfree(device);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ cl->device = device;
|
|
|
|
|
|
dev_dbg(&device->dev, "client %s registered\n", name);
|
|
|
|
|
|
return device;
|
|
|
-
|
|
|
-out_err:
|
|
|
- dev_err(device->dev.parent, "Failed to register MEI client\n");
|
|
|
-
|
|
|
- kfree(device);
|
|
|
-
|
|
|
- return NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mei_cl_add_device);
|
|
|
|
|
@@ -367,9 +384,10 @@ out:
|
|
|
|
|
|
int mei_cl_send(struct mei_cl_device *device, u8 *buf, size_t length)
|
|
|
{
|
|
|
- struct mei_cl *cl = NULL;
|
|
|
+ struct mei_cl *cl = device->cl;
|
|
|
|
|
|
- /* TODO: hook between mei_bus_client and mei_cl */
|
|
|
+ if (cl == NULL)
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
if (device->ops && device->ops->send)
|
|
|
return device->ops->send(device, buf, length);
|
|
@@ -380,9 +398,10 @@ EXPORT_SYMBOL_GPL(mei_cl_send);
|
|
|
|
|
|
int mei_cl_recv(struct mei_cl_device *device, u8 *buf, size_t length)
|
|
|
{
|
|
|
- struct mei_cl *cl = NULL;
|
|
|
+ struct mei_cl *cl = device->cl;
|
|
|
|
|
|
- /* TODO: hook between mei_bus_client and mei_cl */
|
|
|
+ if (cl == NULL)
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
if (device->ops && device->ops->recv)
|
|
|
return device->ops->recv(device, buf, length);
|