in interface.c [917:974]
static int _gb_interface_activate(struct gb_interface *intf,
enum gb_interface_type *type)
{
int ret;
*type = GB_INTERFACE_TYPE_UNKNOWN;
if (intf->ejected || intf->removed)
return -ENODEV;
ret = gb_interface_vsys_set(intf, true);
if (ret)
return ret;
ret = gb_interface_refclk_set(intf, true);
if (ret)
goto err_vsys_disable;
ret = gb_interface_unipro_set(intf, true);
if (ret)
goto err_refclk_disable;
ret = gb_interface_activate_operation(intf, type);
if (ret) {
switch (*type) {
case GB_INTERFACE_TYPE_UNIPRO:
case GB_INTERFACE_TYPE_GREYBUS:
goto err_hibernate_link;
default:
goto err_unipro_disable;
}
}
ret = gb_interface_read_dme(intf);
if (ret)
goto err_hibernate_link;
ret = gb_interface_route_create(intf);
if (ret)
goto err_hibernate_link;
intf->active = true;
trace_gb_interface_activate(intf);
return 0;
err_hibernate_link:
gb_interface_hibernate_link(intf);
err_unipro_disable:
gb_interface_unipro_set(intf, false);
err_refclk_disable:
gb_interface_refclk_set(intf, false);
err_vsys_disable:
gb_interface_vsys_set(intf, false);
return ret;
}