int usb_init_hub( struct rt_urb *p_urb ) { int i; hub_descriptor_t *p_hub_desc = NULL; if(!p_urb || ! p_urb->p_usbdev){ return -1; } p_hub_desc = kmalloc( sizeof(hub_descriptor_t),GFP_KERNEL); if(!p_hub_desc){ return -ENOMEM; } alloc_bytes += sizeof(hub_descriptor_t); DBG("RT-USBCORE: %d Byte allocated (%s %d Byte)\n", alloc_bytes, "+", sizeof(hub_descriptor_t) ); memset( p_hub_desc,0,sizeof( hub_descriptor_t ) ); p_urb->p_usbdev->p_hub_desc = p_hub_desc; DBG_MSG2(p_urb->p_hcd,p_urb->p_usbdev," Hub-Descriptor saved @ 0x%p\n",p_hub_desc); if( hub_get_descriptor( p_urb, p_hub_desc ) ){ kfree(p_hub_desc); alloc_bytes -= sizeof(hub_descriptor_t); DBG("RT-USBCORE: %d Byte allocated (%s %d Byte)\n", alloc_bytes, "-", sizeof(hub_descriptor_t) ); return -1; } dump_hub_descriptor( p_urb->p_usbdev ); for(i=1; i<= p_hub_desc->bNbrPorts; i++) { if( hub_set_port_feature( p_urb, i, PORT_POWER) < 0 ){ continue; } } /* Angabe in 2ms -Intervallen */ udelay( p_hub_desc->bPwrOn2PwrGood * 2000); return(0); }
static vsf_err_t hub_init_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt) { vsf_err_t err; struct vsfusbh_hub_t *hub = (struct vsfusbh_hub_t *)pt->user_data; struct vsfusbh_urb_t *vsfurb = hub->vsfurb; vsfsm_pt_begin(pt); vsfurb->sm = &hub->sm; // init hub err = hub_class_check(hub); if (err != VSFERR_NONE) return err; vsfurb->transfer_buffer = &hub->hub_desc; vsfurb->transfer_length = 4; err = hub_get_descriptor(hub->usbh, vsfurb); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; if (hub->hub_desc.bDescLength > sizeof(hub->hub_desc)) { return VSFERR_FAIL; } vsfurb->transfer_buffer = &hub->hub_desc; vsfurb->transfer_length = hub->hub_desc.bDescLength; err = hub_get_descriptor(hub->usbh, vsfurb); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; hub->dev->maxchild = min(hub->hub_desc.bNbrPorts, USB_MAXCHILDREN); vsfurb->transfer_buffer = &hub->hub_status; vsfurb->transfer_length = sizeof(hub->hub_status); err = hub_get_status(hub->usbh, vsfurb); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; hub->counter = 0; do { hub->counter++; hub->vsfurb->transfer_buffer = NULL; hub->vsfurb->transfer_length = 0; err = hub_set_port_feature(hub->usbh, hub->vsfurb, hub->counter, USB_PORT_FEAT_POWER); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; vsfsm_pt_delay(pt, hub->hub_desc.bPwrOn2PwrGood * 2); } while (hub->counter < hub->dev->maxchild); vsfsm_pt_end(pt); return VSFERR_NONE; }