if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { retval = -ENODEV; goto fail; } 
static int ohci_urb_enqueue (	struct usb_hcd	*hcd,	struct usb_host_endpoint *ep,	struct urb	*urb,	gfp_t		mem_flags) {	struct ohci_hcd	*ohci = hcd_to_ohci (hcd);	struct ed	*ed;	urb_priv_t	*urb_priv;	unsigned int	pipe = urb->pipe;	int		i, size = 0;	unsigned long	flags;	int		retval = 0;	#ifdef OHCI_VERBOSE_DEBUG	urb_print (urb, "SUB", usb_pipein (pipe));#endif		/* every endpoint has a ed, locate and maybe (re)initialize it */	if (! (ed = ed_get (ohci, ep, urb->dev, pipe, urb->interval)))		return -ENOMEM;	/* for the private part of the URB we need the number of TDs (size) */	switch (ed->type) {		case PIPE_CONTROL:			/* td_submit_urb() doesn't yet handle these */			if (urb->transfer_buffer_length > 4096)				return -EMSGSIZE;			/* 1 TD for setup, 1 for ACK, plus ... */			size = 2;			/* FALLTHROUGH */		// case PIPE_INTERRUPT:		// case PIPE_BULK:		default:			/* one TD for every 4096 Bytes (can be upto 8K) */			size += urb->transfer_buffer_length / 4096;			/* ... and for any remaining bytes ... */			if ((urb->transfer_buffer_length % 4096) != 0)				size++;			/* ... and maybe a zero length packet to wrap it up */			if (size == 0)				size++;			else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0				&& (urb->transfer_buffer_length					% usb_maxpacket (urb->dev, pipe,						usb_pipeout (pipe))) == 0)				size++;			break;		case PIPE_ISOCHRONOUS: /* number of packets from URB */			size = urb->number_of_packets;			break;	}	/* allocate the private part of the URB */	urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (struct td *),			mem_flags);	if (!urb_priv)		return -ENOMEM;	memset (urb_priv, 0, sizeof (urb_priv_t) + size * sizeof (struct td *));	INIT_LIST_HEAD (&urb_priv->pending);	urb_priv->length = size;	urb_priv->ed = ed;		/* allocate the TDs (deferring hash chain updates) */	for (i = 0; i < size; i++) {		urb_priv->td [i] = td_alloc (ohci, mem_flags);		if (!urb_priv->td [i]) {			urb_priv->length = i;			urb_free_priv (ohci, urb_priv);			return -ENOMEM;		}	}		spin_lock_irqsave (&ohci->lock, flags);	/* don't submit to a dead HC */	if (!HC_IS_RUNNING(hcd->state)) {		retval = -ENODEV;		goto fail;	}	/* in case of unlink-during-submit */	spin_lock (&urb->lock);	if (urb->status != -EINPROGRESS) {		spin_unlock (&urb->lock);		urb->hcpriv = urb_priv;		finish_urb (ohci, urb, NULL);		retval = 0;		goto fail;	}	/* schedule the ed if needed */	if (ed->state == ED_IDLE) {		retval = ed_schedule (ohci, ed);		if (retval < 0)			goto fail0;		if (ed->type == PIPE_ISOCHRONOUS) {			u16	frame = ohci_frame_no(ohci);			/* delay a few frames before the first TD */			frame += max_t (u16, 8, ed->interval);			frame &= ~(ed->interval - 1);			frame |= ed->branch;			urb->start_frame = frame;			/* yes, only URB_ISO_ASAP is supported, and			 * urb->start_frame is never used as input.			 */		}	} else if (ed->type == PIPE_ISOCHRONOUS)		urb->start_frame = ed->last_iso + ed->interval;	/* fill the TDs and link them to the ed; and	 * enable that part of the schedule, if needed	 * and update count of queued periodic urbs	 */	urb->hcpriv = urb_priv;	td_submit_urb (ohci, urb);fail0:	spin_unlock (&urb->lock);fail:	if (retval)		urb_free_priv (ohci, urb_priv);	spin_unlock_irqrestore (&ohci->lock, flags);	return retval;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/8de98402652c01839ae321be6cb3054cf5735d83/ohci-hcd.c/clean/drivers/usb/host/ohci-hcd.c