/** * udc_cable_event - called from cradle interrupt handler */ void udc_cable_event(void) { struct usb_bus_instance *bus; struct usb_device_instance *device; struct bi_data *data; dbgENTER(dbgflg_usbdbi_init,1); // sanity check if (!(device = device_array[0]) || !(bus = device->bus) || !(data = bus->privdata)) { return; } { unsigned long flags; local_irq_save(flags); if (udc_connected()) { dbg_init(1, "state: %d connected: %d", device->device_state, 1);; if (device->device_state == STATE_ATTACHED) { dbg_init(1, "LOADING"); usbd_device_event_irq(device, DEVICE_HUB_CONFIGURED, 0); usbd_device_event_irq(device, DEVICE_RESET, 0); } } else { dbg_init(1, "state: %d connected: %d", device->device_state, 0);; if (device->device_state != STATE_ATTACHED) { dbg_init(1, "UNLOADING"); usbd_device_event_irq(device, DEVICE_RESET, 0); usbd_device_event_irq(device, DEVICE_POWER_INTERRUPTION, 0); usbd_device_event_irq(device, DEVICE_HUB_RESET, 0); } } local_irq_restore(flags); } dbgLEAVE(dbgflg_usbdbi_init,1); }
/* bi_modexit - decommission bus interface driver */ void __exit bi_modexit(void) { struct usb_bus_instance *bus; struct usb_device_instance *device; struct bi_data *data; dbgENTER(dbgflg_usbdbi_init,1); if ((device = device_array[0])) { // XXX moved to usbd_deregister_device() //device->status = USBD_CLOSING; udc_disconnect(); udc_disable(); // XXX XXX if (dbgflg_usbdbi_tick > 0) { ticker_killoff(); } bus = device->bus; data = bus->privdata; // XXX usbd_device_event(device, DEVICE_RESET, 0); usbd_device_event(device, DEVICE_POWER_INTERRUPTION, 0); usbd_device_event(device, DEVICE_HUB_RESET, 0); dbg_init(1,"DEVICE_DESTROY"); usbd_device_event(device, DEVICE_DESTROY, 0); dbg_init(1,"DISABLE ENDPOINTS"); bi_disable_endpoints(device); dbg_init(1,"UDC_DISABLE"); //udc_disable(); dbg_init(1,"BI_UDC_EXIT"); bi_udc_exit(); device_array[0] = NULL; bus->privdata = NULL; #ifdef CONFIG_PM dbg_init(1,"PM_UNREGISTER(pm_dev#%p)",pm_dev); if (pm_dev) { pm_unregister(pm_dev); } #endif dbg_init(1,"DEREGISTER DEVICE"); usbd_deregister_device(device); bus->device = NULL; dbg_init(1,"kfree(data#%p)",data); if (data) { kfree(data); } if (bus->serial_number_str) { kfree(bus->serial_number_str); } dbg_init(1,"DEREGISTER BUS"); usbd_deregister_bus(bus); } else { dbg_init(0,"device is NULL"); } dbg_init(1,"BI_EXIT"); bi_exit(); dbgLEAVE(dbgflg_usbdbi_init,1); }
/** * bi_cancel_urb - cancel sending an urb * @urb: data urb to cancel * * Used by the USB Device Core to cancel an urb. */ int bi_cancel_urb (struct urb *urb) { dbgENTER (dbgflg_usbdbi_tx, 1); //ep2_reset(); return 0; }