return ret;
}
-static void gb_svc_intf_remove(struct gb_svc *svc, struct gb_interface *intf)
+static void gb_svc_interface_route_destroy(struct gb_svc *svc,
+ struct gb_interface *intf)
{
- u8 intf_id = intf->interface_id;
- u8 device_id = intf->device_id;
+ gb_svc_route_destroy(svc, svc->ap_intf_id, intf->interface_id);
+ ida_simple_remove(&svc->device_id_map, intf->device_id);
+}
+static void gb_svc_intf_remove(struct gb_svc *svc, struct gb_interface *intf)
+{
intf->disconnected = true;
- gb_interface_remove(intf);
+ get_device(&intf->dev);
- /*
- * Destroy the two-way route between the AP and the interface.
- */
- gb_svc_route_destroy(svc, svc->ap_intf_id, intf_id);
+ gb_interface_remove(intf);
+ gb_svc_interface_route_destroy(svc, intf);
- ida_simple_remove(&svc->device_id_map, device_id);
+ put_device(&intf->dev);
}
static void gb_svc_process_intf_hotplug(struct gb_operation *operation)
return;
destroy_route:
- gb_svc_route_destroy(svc, svc->ap_intf_id, intf_id);
- ida_simple_remove(&svc->device_id_map, intf->device_id);
+ gb_svc_interface_route_destroy(svc, intf);
destroy_interface:
gb_interface_remove(intf);
}