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 ed = ep->hcpriv; in ed_get()
411 if (!ed) { in ed_get()
416 ed = ed_alloc (ohci, GFP_ATOMIC); in ed_get()
417 if (!ed) { in ed_get()
426 ed_free (ohci, ed); in ed_get()
427 ed = NULL; in ed_get()
430 ed->dummy = td; in ed_get()
431 ed->hwTailP = cpu_to_hc32 (ohci, td->td_dma); in ed_get()
432 ed->hwHeadP = ed->hwTailP; /* ED_C, ED_H zeroed */ in ed_get()
433 ed->state = ED_IDLE; in ed_get()
441 ed->type = usb_pipetype(pipe); in ed_get()
448 if (ed->type != PIPE_CONTROL) { in ed_get()
450 if (ed->type != PIPE_BULK) { in ed_get()
452 if (ed->type == PIPE_ISOCHRONOUS) in ed_get()
456 ed->interval = interval; in ed_get()
457 ed->load = usb_calc_bus_time ( in ed_get()
459 ed->type == PIPE_ISOCHRONOUS, in ed_get()
464 ed->hwINFO = cpu_to_hc32(ohci, info); in ed_get()
466 ep->hcpriv = ed; in ed_get()
471 return ed; in ed_get()
482 static void start_ed_unlink (struct ohci_hcd *ohci, struct ed *ed) in start_ed_unlink() argument
484 ed->hwINFO |= cpu_to_hc32 (ohci, ED_DEQUEUE); in start_ed_unlink()
485 ed_deschedule (ohci, ed); in start_ed_unlink()
488 ed->ed_next = ohci->ed_rm_list; in start_ed_unlink()
489 ed->ed_prev = NULL; in start_ed_unlink()
490 ohci->ed_rm_list = ed; in start_ed_unlink()
503 ed->tick = ohci_frame_no(ohci) + 1; in start_ed_unlink()
544 td = urb_priv->td [index] = urb_priv->ed->dummy; in td_fill()
545 urb_priv->ed->dummy = td_pt; in td_fill()
547 td->ed = urb_priv->ed; in td_fill()
570 list_add_tail (&td->td_list, &td->ed->td_list); in td_fill()
579 td->ed->hwTailP = td->hwNextTD; in td_fill()
611 urb_priv->ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_C); in td_submit_urb()
639 switch (urb_priv->ed->type) { in td_submit_urb()
683 if (urb_priv->ed->type == PIPE_BULK) { in td_submit_urb()
835 struct ed *ed = td->ed; in ed_halted() local
837 __hc32 toggle = ed->hwHeadP & cpu_to_hc32 (ohci, ED_C); in ed_halted()
842 ed->hwINFO |= cpu_to_hc32 (ohci, ED_SKIP); in ed_halted()
844 ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_H); in ed_halted()
850 while (tmp != &ed->td_list) { in ed_halted()
869 ed->hwHeadP = next->hwNextTD | toggle; in ed_halted()
900 struct ed *ed; in add_to_done_list() local
906 ed = td->ed; in add_to_done_list()
908 list_for_each_entry_continue_reverse(td2, &ed->td_list, td_list) { in add_to_done_list()
927 td2 = ed->pending_td; in add_to_done_list()
929 ed->pending_td = NULL; in add_to_done_list()
962 && (td->ed->hwHeadP & cpu_to_hc32 (ohci, ED_H))) in update_done_list()
976 struct ed *ed, **last; in finish_unlinks() local
979 for (last = &ohci->ed_rm_list, ed = *last; ed != NULL; ed = *last) { in finish_unlinks()
988 tick_before(tick, ed->tick)) { in finish_unlinks()
990 last = &ed->ed_next; in finish_unlinks()
993 if (!list_empty(&ed->td_list)) { in finish_unlinks()
997 td = list_first_entry(&ed->td_list, struct td, td_list); in finish_unlinks()
1000 head = hc32_to_cpu(ohci, ed->hwHeadP) & TD_MASK; in finish_unlinks()
1011 ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_H); in finish_unlinks()
1012 ed->hwNextED = 0; in finish_unlinks()
1014 ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE); in finish_unlinks()
1032 prev = &ed->hwHeadP; in finish_unlinks()
1033 list_for_each_safe (entry, tmp, &ed->td_list) { in finish_unlinks()
1060 ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_C); in finish_unlinks()
1062 ed->hwHeadP |= cpu_to_hc32(ohci, ED_C); in finish_unlinks()
1074 if (completed && !list_empty (&ed->td_list)) in finish_unlinks()
1082 if (list_empty(&ed->td_list)) { in finish_unlinks()
1083 *last = ed->ed_next; in finish_unlinks()
1084 ed->ed_next = NULL; in finish_unlinks()
1085 ed->state = ED_IDLE; in finish_unlinks()
1086 list_del(&ed->in_use_list); in finish_unlinks()
1088 *last = ed->ed_next; in finish_unlinks()
1089 ed->ed_next = NULL; in finish_unlinks()
1090 ed_schedule(ohci, ed); in finish_unlinks()
1092 last = &ed->ed_next; in finish_unlinks()
1149 struct ed *ed = td->ed; in takeback_td() local
1161 if (list_empty(&ed->td_list)) { in takeback_td()
1162 if (ed->state == ED_OPER) in takeback_td()
1163 start_ed_unlink(ohci, ed); in takeback_td()
1166 } else if ((ed->hwINFO & cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE)) in takeback_td()
1168 td = list_entry(ed->td_list.next, struct td, td_list); in takeback_td()
1170 ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP); in takeback_td()
1172 switch (ed->type) { in takeback_td()