Lines Matching refs:dbc

89 	struct xhci_dbc		*dbc;  in xhci_dbc_init_contexts()  local
96 dbc = xhci->dbc; in xhci_dbc_init_contexts()
97 if (!dbc) in xhci_dbc_init_contexts()
101 info = (struct dbc_info_context *)dbc->ctx->bytes; in xhci_dbc_init_contexts()
102 dma = dbc->string_dma; in xhci_dbc_init_contexts()
110 ep_ctx = dbc_bulkout_ctx(dbc); in xhci_dbc_init_contexts()
111 max_burst = DBC_CTRL_MAXBURST(readl(&dbc->regs->control)); in xhci_dbc_init_contexts()
112 deq = dbc_bulkout_enq(dbc); in xhci_dbc_init_contexts()
115 ep_ctx->deq = cpu_to_le64(deq | dbc->ring_out->cycle_state); in xhci_dbc_init_contexts()
118 ep_ctx = dbc_bulkin_ctx(dbc); in xhci_dbc_init_contexts()
119 deq = dbc_bulkin_enq(dbc); in xhci_dbc_init_contexts()
122 ep_ctx->deq = cpu_to_le64(deq | dbc->ring_in->cycle_state); in xhci_dbc_init_contexts()
125 xhci_write_64(xhci, dbc->ctx->dma, &dbc->regs->dccp); in xhci_dbc_init_contexts()
128 writel(dev_info, &dbc->regs->devinfo1); in xhci_dbc_init_contexts()
131 writel(dev_info, &dbc->regs->devinfo2); in xhci_dbc_init_contexts()
135 __releases(&dbc->lock) in xhci_dbc_giveback()
136 __acquires(&dbc->lock) in xhci_dbc_giveback()
139 struct xhci_dbc *dbc = dep->dbc; in xhci_dbc_giveback() local
140 struct xhci_hcd *xhci = dbc->xhci; in xhci_dbc_giveback()
141 struct device *dev = xhci_to_hcd(dbc->xhci)->self.sysdev; in xhci_dbc_giveback()
158 spin_unlock(&dbc->lock); in xhci_dbc_giveback()
160 spin_lock(&dbc->lock); in xhci_dbc_giveback()
184 static void xhci_dbc_flush_reqests(struct xhci_dbc *dbc) in xhci_dbc_flush_reqests() argument
186 xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_OUT]); in xhci_dbc_flush_reqests()
187 xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_IN]); in xhci_dbc_flush_reqests()
246 struct xhci_dbc *dbc = dep->dbc; in xhci_dbc_queue_bulk_tx() local
284 writel(DBC_DOOR_BELL_TARGET(dep->direction), &dbc->regs->doorbell); in xhci_dbc_queue_bulk_tx()
294 struct xhci_dbc *dbc = dep->dbc; in dbc_ep_do_queue() local
295 struct xhci_hcd *xhci = dbc->xhci; in dbc_ep_do_queue()
333 struct xhci_dbc *dbc = dep->dbc; in dbc_ep_queue() local
336 spin_lock_irqsave(&dbc->lock, flags); in dbc_ep_queue()
337 if (dbc->state == DS_CONFIGURED) in dbc_ep_queue()
339 spin_unlock_irqrestore(&dbc->lock, flags); in dbc_ep_queue()
341 mod_delayed_work(system_wq, &dbc->event_work, 0); in dbc_ep_queue()
351 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_do_eps_init() local
353 dep = &dbc->eps[direction]; in xhci_dbc_do_eps_init()
354 dep->dbc = dbc; in xhci_dbc_do_eps_init()
356 dep->ring = direction ? dbc->ring_in : dbc->ring_out; in xhci_dbc_do_eps_init()
369 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_eps_exit() local
371 memset(dbc->eps, 0, sizeof(struct dbc_ep) * ARRAY_SIZE(dbc->eps)); in xhci_dbc_eps_exit()
379 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_mem_init() local
382 dbc->ring_evt = xhci_ring_alloc(xhci, 1, 1, TYPE_EVENT, 0, flags); in xhci_dbc_mem_init()
383 if (!dbc->ring_evt) in xhci_dbc_mem_init()
386 dbc->ring_in = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags); in xhci_dbc_mem_init()
387 if (!dbc->ring_in) in xhci_dbc_mem_init()
390 dbc->ring_out = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags); in xhci_dbc_mem_init()
391 if (!dbc->ring_out) in xhci_dbc_mem_init()
395 ret = xhci_alloc_erst(xhci, dbc->ring_evt, &dbc->erst, flags); in xhci_dbc_mem_init()
400 dbc->ctx = xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_DEVICE, flags); in xhci_dbc_mem_init()
401 if (!dbc->ctx) in xhci_dbc_mem_init()
405 dbc->string_size = sizeof(struct dbc_str_descs); in xhci_dbc_mem_init()
406 dbc->string = dbc_dma_alloc_coherent(xhci, in xhci_dbc_mem_init()
407 dbc->string_size, in xhci_dbc_mem_init()
408 &dbc->string_dma, in xhci_dbc_mem_init()
410 if (!dbc->string) in xhci_dbc_mem_init()
414 writel(dbc->erst.erst_size, &dbc->regs->ersts); in xhci_dbc_mem_init()
415 xhci_write_64(xhci, dbc->erst.erst_dma_addr, &dbc->regs->erstba); in xhci_dbc_mem_init()
416 deq = xhci_trb_virt_to_dma(dbc->ring_evt->deq_seg, in xhci_dbc_mem_init()
417 dbc->ring_evt->dequeue); in xhci_dbc_mem_init()
418 xhci_write_64(xhci, deq, &dbc->regs->erdp); in xhci_dbc_mem_init()
421 string_length = xhci_dbc_populate_strings(dbc->string); in xhci_dbc_mem_init()
427 dbc->state = DS_INITIALIZED; in xhci_dbc_mem_init()
432 xhci_free_container_ctx(xhci, dbc->ctx); in xhci_dbc_mem_init()
433 dbc->ctx = NULL; in xhci_dbc_mem_init()
435 xhci_free_erst(xhci, &dbc->erst); in xhci_dbc_mem_init()
437 xhci_ring_free(xhci, dbc->ring_out); in xhci_dbc_mem_init()
438 dbc->ring_out = NULL; in xhci_dbc_mem_init()
440 xhci_ring_free(xhci, dbc->ring_in); in xhci_dbc_mem_init()
441 dbc->ring_in = NULL; in xhci_dbc_mem_init()
443 xhci_ring_free(xhci, dbc->ring_evt); in xhci_dbc_mem_init()
444 dbc->ring_evt = NULL; in xhci_dbc_mem_init()
451 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_mem_cleanup() local
453 if (!dbc) in xhci_dbc_mem_cleanup()
458 if (dbc->string) { in xhci_dbc_mem_cleanup()
460 dbc->string_size, in xhci_dbc_mem_cleanup()
461 dbc->string, dbc->string_dma); in xhci_dbc_mem_cleanup()
462 dbc->string = NULL; in xhci_dbc_mem_cleanup()
465 xhci_free_container_ctx(xhci, dbc->ctx); in xhci_dbc_mem_cleanup()
466 dbc->ctx = NULL; in xhci_dbc_mem_cleanup()
468 xhci_free_erst(xhci, &dbc->erst); in xhci_dbc_mem_cleanup()
469 xhci_ring_free(xhci, dbc->ring_out); in xhci_dbc_mem_cleanup()
470 xhci_ring_free(xhci, dbc->ring_in); in xhci_dbc_mem_cleanup()
471 xhci_ring_free(xhci, dbc->ring_evt); in xhci_dbc_mem_cleanup()
472 dbc->ring_in = NULL; in xhci_dbc_mem_cleanup()
473 dbc->ring_out = NULL; in xhci_dbc_mem_cleanup()
474 dbc->ring_evt = NULL; in xhci_dbc_mem_cleanup()
481 struct xhci_dbc *dbc = xhci->dbc; in xhci_do_dbc_start() local
483 if (dbc->state != DS_DISABLED) in xhci_do_dbc_start()
486 writel(0, &dbc->regs->control); in xhci_do_dbc_start()
487 ret = xhci_handshake(&dbc->regs->control, in xhci_do_dbc_start()
497 ctrl = readl(&dbc->regs->control); in xhci_do_dbc_start()
499 &dbc->regs->control); in xhci_do_dbc_start()
500 ret = xhci_handshake(&dbc->regs->control, in xhci_do_dbc_start()
506 dbc->state = DS_ENABLED; in xhci_do_dbc_start()
513 struct xhci_dbc *dbc = xhci->dbc; in xhci_do_dbc_stop() local
515 if (dbc->state == DS_DISABLED) in xhci_do_dbc_stop()
518 writel(0, &dbc->regs->control); in xhci_do_dbc_stop()
520 dbc->state = DS_DISABLED; in xhci_do_dbc_stop()
529 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_start() local
531 WARN_ON(!dbc); in xhci_dbc_start()
535 spin_lock_irqsave(&dbc->lock, flags); in xhci_dbc_start()
537 spin_unlock_irqrestore(&dbc->lock, flags); in xhci_dbc_start()
544 return mod_delayed_work(system_wq, &dbc->event_work, 1); in xhci_dbc_start()
551 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_stop() local
552 struct dbc_port *port = &dbc->port; in xhci_dbc_stop()
554 WARN_ON(!dbc); in xhci_dbc_stop()
556 cancel_delayed_work_sync(&dbc->event_work); in xhci_dbc_stop()
561 spin_lock_irqsave(&dbc->lock, flags); in xhci_dbc_stop()
563 spin_unlock_irqrestore(&dbc->lock, flags); in xhci_dbc_stop()
573 struct xhci_dbc *dbc = xhci->dbc; in dbc_handle_port_status() local
575 portsc = readl(&dbc->regs->portsc); in dbc_handle_port_status()
589 writel(portsc & ~DBC_PORTSC_RESET_CHANGE, &dbc->regs->portsc); in dbc_handle_port_status()
649 static enum evtreturn xhci_dbc_do_handle_events(struct xhci_dbc *dbc) in xhci_dbc_do_handle_events() argument
655 struct xhci_hcd *xhci = dbc->xhci; in xhci_dbc_do_handle_events()
659 switch (dbc->state) { in xhci_dbc_do_handle_events()
665 portsc = readl(&dbc->regs->portsc); in xhci_dbc_do_handle_events()
667 dbc->state = DS_CONNECTED; in xhci_dbc_do_handle_events()
673 ctrl = readl(&dbc->regs->control); in xhci_dbc_do_handle_events()
675 dbc->state = DS_CONFIGURED; in xhci_dbc_do_handle_events()
677 portsc = readl(&dbc->regs->portsc); in xhci_dbc_do_handle_events()
678 writel(portsc, &dbc->regs->portsc); in xhci_dbc_do_handle_events()
685 portsc = readl(&dbc->regs->portsc); in xhci_dbc_do_handle_events()
689 dbc->state = DS_ENABLED; in xhci_dbc_do_handle_events()
690 xhci_dbc_flush_reqests(dbc); in xhci_dbc_do_handle_events()
698 writel(portsc, &dbc->regs->portsc); in xhci_dbc_do_handle_events()
699 dbc->state = DS_ENABLED; in xhci_dbc_do_handle_events()
700 xhci_dbc_flush_reqests(dbc); in xhci_dbc_do_handle_events()
706 ctrl = readl(&dbc->regs->control); in xhci_dbc_do_handle_events()
710 dbc->state = DS_STALLED; in xhci_dbc_do_handle_events()
727 writel(ctrl, &dbc->regs->control); in xhci_dbc_do_handle_events()
728 ctrl = readl(&dbc->regs->control); in xhci_dbc_do_handle_events()
733 ctrl = readl(&dbc->regs->control); in xhci_dbc_do_handle_events()
737 dbc->state = DS_CONFIGURED; in xhci_dbc_do_handle_events()
743 xhci_err(xhci, "Unknown DbC state %d\n", dbc->state); in xhci_dbc_do_handle_events()
748 evt = dbc->ring_evt->dequeue; in xhci_dbc_do_handle_events()
750 dbc->ring_evt->cycle_state) { in xhci_dbc_do_handle_events()
757 trace_xhci_dbc_handle_event(dbc->ring_evt, &evt->generic); in xhci_dbc_do_handle_events()
770 inc_deq(xhci, dbc->ring_evt); in xhci_dbc_do_handle_events()
771 evt = dbc->ring_evt->dequeue; in xhci_dbc_do_handle_events()
777 deq = xhci_trb_virt_to_dma(dbc->ring_evt->deq_seg, in xhci_dbc_do_handle_events()
778 dbc->ring_evt->dequeue); in xhci_dbc_do_handle_events()
779 xhci_write_64(xhci, deq, &dbc->regs->erdp); in xhci_dbc_do_handle_events()
789 struct xhci_dbc *dbc; in xhci_dbc_handle_events() local
793 dbc = container_of(to_delayed_work(work), struct xhci_dbc, event_work); in xhci_dbc_handle_events()
794 xhci = dbc->xhci; in xhci_dbc_handle_events()
796 spin_lock_irqsave(&dbc->lock, flags); in xhci_dbc_handle_events()
797 evtr = xhci_dbc_do_handle_events(dbc); in xhci_dbc_handle_events()
798 spin_unlock_irqrestore(&dbc->lock, flags); in xhci_dbc_handle_events()
820 mod_delayed_work(system_wq, &dbc->event_work, 1); in xhci_dbc_handle_events()
828 kfree(xhci->dbc); in xhci_do_dbc_exit()
829 xhci->dbc = NULL; in xhci_do_dbc_exit()
836 struct xhci_dbc *dbc; in xhci_do_dbc_init() local
846 dbc = kzalloc(sizeof(*dbc), GFP_KERNEL); in xhci_do_dbc_init()
847 if (!dbc) in xhci_do_dbc_init()
850 dbc->regs = base + dbc_cap_offs; in xhci_do_dbc_init()
853 reg = readl(&dbc->regs->control); in xhci_do_dbc_init()
855 kfree(dbc); in xhci_do_dbc_init()
860 if (xhci->dbc) { in xhci_do_dbc_init()
862 kfree(dbc); in xhci_do_dbc_init()
865 xhci->dbc = dbc; in xhci_do_dbc_init()
868 dbc->xhci = xhci; in xhci_do_dbc_init()
869 INIT_DELAYED_WORK(&dbc->event_work, xhci_dbc_handle_events); in xhci_do_dbc_init()
870 spin_lock_init(&dbc->lock); in xhci_do_dbc_init()
880 struct xhci_dbc *dbc; in dbc_show() local
884 dbc = xhci->dbc; in dbc_show()
886 switch (dbc->state) { in dbc_show()
930 static DEVICE_ATTR_RW(dbc);
963 if (!xhci->dbc) in xhci_dbc_exit()
975 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_suspend() local
977 if (!dbc) in xhci_dbc_suspend()
980 if (dbc->state == DS_CONFIGURED) in xhci_dbc_suspend()
981 dbc->resume_required = 1; in xhci_dbc_suspend()
991 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_resume() local
993 if (!dbc) in xhci_dbc_resume()
996 if (dbc->resume_required) { in xhci_dbc_resume()
997 dbc->resume_required = 0; in xhci_dbc_resume()