コード例 #1
0
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);
}
コード例 #2
0
ファイル: vsfusbh_HUB.c プロジェクト: hank-fan/vsf
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;
}