greybus: bundle: Initialize all bundles on link-up
An interface can have 1 or more bundles. On link-up event, we must initialize all the bundles associated with the interface. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
7c183f70ed
commit
bb97ea813b
@ -146,9 +146,7 @@ static void svc_management(struct svc_function_unipro_management *management,
|
|||||||
management->link_up.interface_id);
|
management->link_up.interface_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ret = gb_bundle_init(intf,
|
ret = gb_bundles_init(intf, management->link_up.device_id);
|
||||||
management->link_up.interface_id,
|
|
||||||
management->link_up.device_id);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(hd->parent,
|
dev_err(hd->parent,
|
||||||
"error %d initializing bundles for interface %hhu\n",
|
"error %d initializing bundles for interface %hhu\n",
|
||||||
|
@ -146,16 +146,11 @@ void gb_bundle_destroy(struct gb_interface *intf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int gb_bundle_init(struct gb_interface *intf, u8 bundle_id, u8 device_id)
|
int gb_bundle_init(struct gb_bundle *bundle, u8 device_id)
|
||||||
{
|
{
|
||||||
struct gb_bundle *bundle;
|
struct gb_interface *intf = bundle->intf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
bundle = gb_bundle_find(intf, bundle_id);
|
|
||||||
if (!bundle) {
|
|
||||||
dev_err(intf->hd->parent, "bundle %hhu not found\n", bundle_id);
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
bundle->device_id = device_id;
|
bundle->device_id = device_id;
|
||||||
|
|
||||||
ret = svc_set_route_send(bundle, intf->hd);
|
ret = svc_set_route_send(bundle, intf->hd);
|
||||||
@ -175,6 +170,24 @@ int gb_bundle_init(struct gb_interface *intf, u8 bundle_id, u8 device_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gb_bundles_init(struct gb_interface *intf, u8 device_id)
|
||||||
|
{
|
||||||
|
struct gb_bundle *bundle;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
list_for_each_entry(bundle, &intf->bundles, links) {
|
||||||
|
ret = gb_bundle_init(bundle, device_id);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(intf->hd->parent,
|
||||||
|
"Failed to initialize bundle %hhu\n",
|
||||||
|
bundle->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id)
|
struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id)
|
||||||
{
|
{
|
||||||
struct gb_bundle *bundle;
|
struct gb_bundle *bundle;
|
||||||
|
@ -31,7 +31,8 @@ struct gb_bundle {
|
|||||||
struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
|
struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
|
||||||
u8 class_type);
|
u8 class_type);
|
||||||
void gb_bundle_destroy(struct gb_interface *intf);
|
void gb_bundle_destroy(struct gb_interface *intf);
|
||||||
int gb_bundle_init(struct gb_interface *intf, u8 module_id, u8 device_id);
|
int gb_bundle_init(struct gb_bundle *bundle, u8 device_id);
|
||||||
|
int gb_bundles_init(struct gb_interface *intf, u8 device_id);
|
||||||
|
|
||||||
struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id);
|
struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id);
|
||||||
void gb_bundle_bind_protocols(void);
|
void gb_bundle_bind_protocols(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user