static int qu_queue_urb (hci_t * hci, struct urb * urb) { int index = qu_pipeindex (urb->pipe); struct hci_device * hci_dev = usb_to_hci (urb->dev); if (hci_dev->pipe_head [index]) { __list_add (&urb->urb_list, hci_dev->urb_queue [index].prev, &(hci_dev->urb_queue [index])); } else { hci_dev->pipe_head [index] = urb; qu_queue_active_urb (hci, urb); } return 0; }
static void qu_return_urb (hci_t * hci, struct urb * urb, int resub_ok) { struct hci_device * hci_dev = usb_to_hci (urb->dev); int index = qu_pipeindex (urb->pipe); list_del (&urb->urb_list); INIT_LIST_HEAD (&urb->urb_list); if (!list_empty (&(hci_dev->urb_queue [index]))) { urb = list_entry (hci_dev->urb_queue [index].next, struct urb, urb_list); list_del (&urb->urb_list); INIT_LIST_HEAD (&urb->urb_list); hci_dev->pipe_head [index] = urb; qu_queue_active_urb (hci, urb); } else {
static inline int qu_queue_urb (hci_t * hci, urb_t * urb) { struct hci_endpoint * ep = &usb_to_ep(urb->dev,qu_pipeindex(urb->pipe)); unsigned long flags; int i; spin_lock_irqsave (&hci->urb_list_lock, flags); // if (qu_pipeindex(urb->pipe)==2) printk(KERN_ERR __FILE__ ": pipe 2\n"); i =checkAlreadyActive(hci,urb,ep); if (i==1) { __list_add (&urb->urb_list,ep->urb_queue.prev, &(ep->urb_queue)); } else if (i==0) { qu_queue_active_urb (hci, urb); } else { list_add (&urb->urb_list, &hci->active_list); hc116x_enable_sofint(hci); } spin_unlock_irqrestore (&hci->urb_list_lock, flags); return 0; }