/* Free the memory */ kfree(hub); 
/* If there are any children then this is an unbind only, not a * physical disconnection.  The active ports must be disabled * and later on we must call usb_disconnect().  We can't call * it now because we may not hold the hub's device lock. */ n = 0; for (port1 = 1; port1 <= hdev->maxchild; ++port1) { if (hdev->children[port1 - 1]) { ++n; hub_port_disable(hub, port1, 1); } }  if (n == 0) kfree(hub); else { /* Reuse the hub->leds work_struct for our own purposes */ INIT_WORK(&hub->leds, hub_remove_children_work, hub); schedule_work(&hub->leds); usb_get_dev(hdev); } 
static void hub_disconnect(struct usb_interface *intf){	struct usb_hub *hub = usb_get_intfdata (intf);	struct usb_device *hdev;	usb_set_intfdata (intf, NULL);	hdev = hub->hdev;	if (hdev->speed == USB_SPEED_HIGH)		highspeed_hubs--;	hub_quiesce(hub);	usb_free_urb(hub->urb);	hub->urb = NULL;	spin_lock_irq(&hub_event_lock);	list_del_init(&hub->event_list);	spin_unlock_irq(&hub_event_lock);	kfree(hub->descriptor);	hub->descriptor = NULL;	kfree(hub->status);	hub->status = NULL;	if (hub->buffer) {		usb_buffer_free(hdev, sizeof(*hub->buffer), hub->buffer,				hub->buffer_dma);		hub->buffer = NULL;	}	/* Free the memory */	kfree(hub);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/bf193d3cd2a3b73f2df74f57106114867946c09c/hub.c/clean/drivers/usb/core/hub.c