From c41b4f121240df46e5d901ad8aa9b9051b6c58e1 Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Wed, 22 Oct 2014 02:04:32 -0500 Subject: [PATCH] greybus: only initialize interfaces when up Rather than bringing up all interfaces described in the manifest, wait until we get a link up message, and at that time go initialize the link. Signed-off-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/ap.c | 17 ++++++++--------- drivers/staging/greybus/core.c | 2 -- drivers/staging/greybus/module.c | 24 +++++++++++++++++------- drivers/staging/greybus/module.h | 3 ++- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/drivers/staging/greybus/ap.c b/drivers/staging/greybus/ap.c index 7ea329c..1a9112a 100644 --- a/drivers/staging/greybus/ap.c +++ b/drivers/staging/greybus/ap.c @@ -126,7 +126,7 @@ static void svc_management(struct svc_function_unipro_management *management, int payload_length, struct greybus_host_device *hd) { struct gb_module *module; - struct gb_interface *interface; + int ret; if (payload_length != sizeof(struct svc_function_unipro_management)) { dev_err(hd->parent, @@ -143,15 +143,14 @@ static void svc_management(struct svc_function_unipro_management *management, management->link_up.module_id); return; } - interface = gb_interface_find(module, - management->link_up.interface_id); - if (!interface) { - dev_err(hd->parent, "Interface ID %d not found\n", + ret = gb_module_interface_init(module, + management->link_up.interface_id, + management->link_up.device_id); + if (ret) + dev_err(hd->parent, "error %d initializing" + "module %hhu interface %hhu\n", + ret, management->link_up.module_id, management->link_up.interface_id); - return; - } - interface->device_id = management->link_up.device_id; - (void)svc_set_route_send(interface, hd); break; case SVC_MANAGEMENT_AP_DEVICE_ID: hd->device_id = management->ap_device_id.device_id; diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c index 480e12b..9f4ae1c 100644 --- a/drivers/staging/greybus/core.c +++ b/drivers/staging/greybus/core.c @@ -181,8 +181,6 @@ void gb_add_module(struct greybus_host_device *hd, u8 module_id, if (retval) goto err_device; - gb_module_interfaces_init(gmod); - return; err_device: put_device(&gmod->dev); diff --git a/drivers/staging/greybus/module.c b/drivers/staging/greybus/module.c index 50139f4..bcb0ff0 100644 --- a/drivers/staging/greybus/module.c +++ b/drivers/staging/greybus/module.c @@ -118,15 +118,25 @@ struct gb_module *gb_module_find(struct greybus_host_device *hd, u8 module_id) return NULL; } -void gb_module_interfaces_init(struct gb_module *gmod) +int +gb_module_interface_init(struct gb_module *gmod, u8 interface_id, u8 device_id) { struct gb_interface *interface; - int ret = 0; + int ret; - list_for_each_entry(interface, &gmod->interfaces, links) { - ret = gb_interface_connections_init(interface); - if (ret) - dev_err(gmod->hd->parent, - "module interface init error %d\n", ret); + interface = gb_interface_find(gmod, interface_id); + if (!interface) { + dev_err(gmod->hd->parent, "module %hhu not found\n", + interface_id); + return -ENOENT; } + ret = gb_interface_connections_init(interface); + if (ret) { + dev_err(gmod->hd->parent, "module interface init error %d\n", + ret); + return ret; + } + interface->device_id = device_id; + + return svc_set_route_send(interface, gmod->hd); } diff --git a/drivers/staging/greybus/module.h b/drivers/staging/greybus/module.h index 82def46..74ac4fd 100644 --- a/drivers/staging/greybus/module.h +++ b/drivers/staging/greybus/module.h @@ -55,6 +55,7 @@ void gb_module_destroy(struct gb_module *module); struct gb_module *gb_module_find(struct greybus_host_device *hd, u8 module_id); -void gb_module_interfaces_init(struct gb_module *gmod); +int gb_module_interface_init(struct gb_module *gmod, u8 module_id, + u8 device_id); #endif /* __MODULE_H */ -- 2.7.4