Lines Matching refs:ed

142 static void periodic_link (struct ohci_hcd *ohci, struct ed *ed)  in periodic_link()  argument
147 (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", in periodic_link()
148 ed, ed->branch, ed->load, ed->interval); in periodic_link()
150 for (i = ed->branch; i < NUM_INTS; i += ed->interval) { in periodic_link()
151 struct ed **prev = &ohci->periodic [i]; in periodic_link()
153 struct ed *here = *prev; in periodic_link()
159 while (here && ed != here) { in periodic_link()
160 if (ed->interval > here->interval) in periodic_link()
166 if (ed != here) { in periodic_link()
167 ed->ed_next = here; in periodic_link()
169 ed->hwNextED = *prev_p; in periodic_link()
171 *prev = ed; in periodic_link()
172 *prev_p = cpu_to_hc32(ohci, ed->dma); in periodic_link()
175 ohci->load [i] += ed->load; in periodic_link()
177 ohci_to_hcd(ohci)->self.bandwidth_allocated += ed->load / ed->interval; in periodic_link()
182 static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed) in ed_schedule() argument
186 ed->state = ED_OPER; in ed_schedule()
187 ed->ed_prev = NULL; in ed_schedule()
188 ed->ed_next = NULL; in ed_schedule()
189 ed->hwNextED = 0; in ed_schedule()
202 switch (ed->type) { in ed_schedule()
206 ohci_writel (ohci, ed->dma, in ed_schedule()
209 ohci->ed_controltail->ed_next = ed; in ed_schedule()
211 ed->dma); in ed_schedule()
213 ed->ed_prev = ohci->ed_controltail; in ed_schedule()
221 ohci->ed_controltail = ed; in ed_schedule()
227 ohci_writel (ohci, ed->dma, &ohci->regs->ed_bulkhead); in ed_schedule()
229 ohci->ed_bulktail->ed_next = ed; in ed_schedule()
231 ed->dma); in ed_schedule()
233 ed->ed_prev = ohci->ed_bulktail; in ed_schedule()
241 ohci->ed_bulktail = ed; in ed_schedule()
247 branch = balance (ohci, ed->interval, ed->load); in ed_schedule()
251 branch, ed->interval, ed->load); in ed_schedule()
255 ed->branch = branch; in ed_schedule()
256 periodic_link (ohci, ed); in ed_schedule()
268 static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed) in periodic_unlink() argument
272 for (i = ed->branch; i < NUM_INTS; i += ed->interval) { in periodic_unlink()
273 struct ed *temp; in periodic_unlink()
274 struct ed **prev = &ohci->periodic [i]; in periodic_unlink()
277 while (*prev && (temp = *prev) != ed) { in periodic_unlink()
282 *prev_p = ed->hwNextED; in periodic_unlink()
283 *prev = ed->ed_next; in periodic_unlink()
285 ohci->load [i] -= ed->load; in periodic_unlink()
287 ohci_to_hcd(ohci)->self.bandwidth_allocated -= ed->load / ed->interval; in periodic_unlink()
290 (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", in periodic_unlink()
291 ed, ed->branch, ed->load, ed->interval); in periodic_unlink()
315 static void ed_deschedule (struct ohci_hcd *ohci, struct ed *ed) in ed_deschedule() argument
317 ed->hwINFO |= cpu_to_hc32 (ohci, ED_SKIP); in ed_deschedule()
319 ed->state = ED_UNLINK; in ed_deschedule()
331 switch (ed->type) { in ed_deschedule()
334 if (ed->ed_prev == NULL) { in ed_deschedule()
335 if (!ed->hwNextED) { in ed_deschedule()
342 hc32_to_cpup (ohci, &ed->hwNextED), in ed_deschedule()
345 ed->ed_prev->ed_next = ed->ed_next; in ed_deschedule()
346 ed->ed_prev->hwNextED = ed->hwNextED; in ed_deschedule()
349 if (ohci->ed_controltail == ed) { in ed_deschedule()
350 ohci->ed_controltail = ed->ed_prev; in ed_deschedule()
353 } else if (ed->ed_next) { in ed_deschedule()
354 ed->ed_next->ed_prev = ed->ed_prev; in ed_deschedule()
360 if (ed->ed_prev == NULL) { in ed_deschedule()
361 if (!ed->hwNextED) { in ed_deschedule()
368 hc32_to_cpup (ohci, &ed->hwNextED), in ed_deschedule()
371 ed->ed_prev->ed_next = ed->ed_next; in ed_deschedule()
372 ed->ed_prev->hwNextED = ed->hwNextED; in ed_deschedule()
375 if (ohci->ed_bulktail == ed) { in ed_deschedule()
376 ohci->ed_bulktail = ed->ed_prev; in ed_deschedule()
379 } else if (ed->ed_next) { in ed_deschedule()
380 ed->ed_next->ed_prev = ed->ed_prev; in ed_deschedule()
387 periodic_unlink (ohci, ed); in ed_deschedule()
398 static struct ed *ed_get ( in ed_get()
405 struct ed *ed; in ed_get() local
410 if (!(ed = ep->hcpriv)) { in ed_get()
415 ed = ed_alloc (ohci, GFP_ATOMIC); in ed_get()
416 if (!ed) { in ed_get()
425 ed_free (ohci, ed); in ed_get()
426 ed = NULL; in ed_get()
429 ed->dummy = td; in ed_get()
430 ed->hwTailP = cpu_to_hc32 (ohci, td->td_dma); in ed_get()
431 ed->hwHeadP = ed->hwTailP; /* ED_C, ED_H zeroed */ in ed_get()
432 ed->state = ED_IDLE; in ed_get()
440 ed->type = usb_pipetype(pipe); in ed_get()
447 if (ed->type != PIPE_CONTROL) { in ed_get()
449 if (ed->type != PIPE_BULK) { in ed_get()
451 if (ed->type == PIPE_ISOCHRONOUS) in ed_get()
455 ed->interval = interval; in ed_get()
456 ed->load = usb_calc_bus_time ( in ed_get()
458 ed->type == PIPE_ISOCHRONOUS, in ed_get()
463 ed->hwINFO = cpu_to_hc32(ohci, info); in ed_get()
465 ep->hcpriv = ed; in ed_get()
470 return ed; in ed_get()
481 static void start_ed_unlink (struct ohci_hcd *ohci, struct ed *ed) in start_ed_unlink() argument
483 ed->hwINFO |= cpu_to_hc32 (ohci, ED_DEQUEUE); in start_ed_unlink()
484 ed_deschedule (ohci, ed); in start_ed_unlink()
487 ed->ed_next = ohci->ed_rm_list; in start_ed_unlink()
488 ed->ed_prev = NULL; in start_ed_unlink()
489 ohci->ed_rm_list = ed; in start_ed_unlink()
502 ed->tick = ohci_frame_no(ohci) + 1; in start_ed_unlink()
543 td = urb_priv->td [index] = urb_priv->ed->dummy; in td_fill()
544 urb_priv->ed->dummy = td_pt; in td_fill()
546 td->ed = urb_priv->ed; in td_fill()
569 list_add_tail (&td->td_list, &td->ed->td_list); in td_fill()
578 td->ed->hwTailP = td->hwNextTD; in td_fill()
610 urb_priv->ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_C); in td_submit_urb()
638 switch (urb_priv->ed->type) { in td_submit_urb()
682 if (urb_priv->ed->type == PIPE_BULK) { in td_submit_urb()
834 struct ed *ed = td->ed; in ed_halted() local
836 __hc32 toggle = ed->hwHeadP & cpu_to_hc32 (ohci, ED_C); in ed_halted()
841 ed->hwINFO |= cpu_to_hc32 (ohci, ED_SKIP); in ed_halted()
843 ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_H); in ed_halted()
849 while (tmp != &ed->td_list) { in ed_halted()
868 ed->hwHeadP = next->hwNextTD | toggle; in ed_halted()
899 struct ed *ed; in add_to_done_list() local
905 ed = td->ed; in add_to_done_list()
907 list_for_each_entry_continue_reverse(td2, &ed->td_list, td_list) { in add_to_done_list()
926 td2 = ed->pending_td; in add_to_done_list()
928 ed->pending_td = NULL; in add_to_done_list()
961 && (td->ed->hwHeadP & cpu_to_hc32 (ohci, ED_H))) in update_done_list()
975 struct ed *ed, **last; in finish_unlinks() local
978 for (last = &ohci->ed_rm_list, ed = *last; ed != NULL; ed = *last) { in finish_unlinks()
987 tick_before(tick, ed->tick)) { in finish_unlinks()
989 last = &ed->ed_next; in finish_unlinks()
992 if (!list_empty(&ed->td_list)) { in finish_unlinks()
996 td = list_first_entry(&ed->td_list, struct td, td_list); in finish_unlinks()
999 head = hc32_to_cpu(ohci, ed->hwHeadP) & TD_MASK; in finish_unlinks()
1010 ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_H); in finish_unlinks()
1011 ed->hwNextED = 0; in finish_unlinks()
1013 ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE); in finish_unlinks()
1031 prev = &ed->hwHeadP; in finish_unlinks()
1032 list_for_each_safe (entry, tmp, &ed->td_list) { in finish_unlinks()
1059 ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_C); in finish_unlinks()
1061 ed->hwHeadP |= cpu_to_hc32(ohci, ED_C); in finish_unlinks()
1073 if (completed && !list_empty (&ed->td_list)) in finish_unlinks()
1081 if (list_empty(&ed->td_list)) { in finish_unlinks()
1082 *last = ed->ed_next; in finish_unlinks()
1083 ed->ed_next = NULL; in finish_unlinks()
1084 ed->state = ED_IDLE; in finish_unlinks()
1085 list_del(&ed->in_use_list); in finish_unlinks()
1087 *last = ed->ed_next; in finish_unlinks()
1088 ed->ed_next = NULL; in finish_unlinks()
1089 ed_schedule(ohci, ed); in finish_unlinks()
1091 last = &ed->ed_next; in finish_unlinks()
1148 struct ed *ed = td->ed; in takeback_td() local
1160 if (list_empty(&ed->td_list)) { in takeback_td()
1161 if (ed->state == ED_OPER) in takeback_td()
1162 start_ed_unlink(ohci, ed); in takeback_td()
1165 } else if ((ed->hwINFO & cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE)) in takeback_td()
1167 td = list_entry(ed->td_list.next, struct td, td_list); in takeback_td()
1169 ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP); in takeback_td()
1171 switch (ed->type) { in takeback_td()