Lines Matching refs:xhci

18 dbc_dma_alloc_coherent(struct xhci_hcd *xhci, size_t size,  in dbc_dma_alloc_coherent()  argument
23 vaddr = dma_alloc_coherent(xhci_to_hcd(xhci)->self.sysdev, in dbc_dma_alloc_coherent()
30 dbc_dma_free_coherent(struct xhci_hcd *xhci, size_t size, in dbc_dma_free_coherent() argument
34 dma_free_coherent(xhci_to_hcd(xhci)->self.sysdev, in dbc_dma_free_coherent()
87 static void xhci_dbc_init_contexts(struct xhci_hcd *xhci, u32 string_length) in xhci_dbc_init_contexts() argument
96 dbc = xhci->dbc; in xhci_dbc_init_contexts()
125 xhci_write_64(xhci, dbc->ctx->dma, &dbc->regs->dccp); in xhci_dbc_init_contexts()
140 struct xhci_hcd *xhci = dbc->xhci; in xhci_dbc_giveback() local
141 struct device *dev = xhci_to_hcd(dbc->xhci)->self.sysdev; in xhci_dbc_giveback()
159 req->complete(xhci, req); in xhci_dbc_giveback()
295 struct xhci_hcd *xhci = dbc->xhci; in dbc_ep_do_queue() local
297 dev = xhci_to_hcd(xhci)->self.sysdev; in dbc_ep_do_queue()
310 xhci_err(xhci, "failed to map buffer\n"); in dbc_ep_do_queue()
316 xhci_err(xhci, "failed to queue trbs\n"); in dbc_ep_do_queue()
348 static inline void xhci_dbc_do_eps_init(struct xhci_hcd *xhci, bool direction) in xhci_dbc_do_eps_init() argument
351 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_do_eps_init()
361 static void xhci_dbc_eps_init(struct xhci_hcd *xhci) in xhci_dbc_eps_init() argument
363 xhci_dbc_do_eps_init(xhci, BULK_OUT); in xhci_dbc_eps_init()
364 xhci_dbc_do_eps_init(xhci, BULK_IN); in xhci_dbc_eps_init()
367 static void xhci_dbc_eps_exit(struct xhci_hcd *xhci) in xhci_dbc_eps_exit() argument
369 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_eps_exit()
374 static int xhci_dbc_mem_init(struct xhci_hcd *xhci, gfp_t flags) in xhci_dbc_mem_init() argument
379 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_mem_init()
382 dbc->ring_evt = xhci_ring_alloc(xhci, 1, 1, TYPE_EVENT, 0, flags); in xhci_dbc_mem_init()
386 dbc->ring_in = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags); in xhci_dbc_mem_init()
390 dbc->ring_out = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags); 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()
406 dbc->string = dbc_dma_alloc_coherent(xhci, in xhci_dbc_mem_init()
415 xhci_write_64(xhci, dbc->erst.erst_dma_addr, &dbc->regs->erstba); in xhci_dbc_mem_init()
418 xhci_write_64(xhci, deq, &dbc->regs->erdp); in xhci_dbc_mem_init()
422 xhci_dbc_init_contexts(xhci, string_length); in xhci_dbc_mem_init()
426 xhci_dbc_eps_init(xhci); in xhci_dbc_mem_init()
432 xhci_free_container_ctx(xhci, dbc->ctx); 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()
440 xhci_ring_free(xhci, dbc->ring_in); in xhci_dbc_mem_init()
443 xhci_ring_free(xhci, dbc->ring_evt); in xhci_dbc_mem_init()
449 static void xhci_dbc_mem_cleanup(struct xhci_hcd *xhci) in xhci_dbc_mem_cleanup() argument
451 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_mem_cleanup()
456 xhci_dbc_eps_exit(xhci); in xhci_dbc_mem_cleanup()
459 dbc_dma_free_coherent(xhci, in xhci_dbc_mem_cleanup()
465 xhci_free_container_ctx(xhci, dbc->ctx); 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()
477 static int xhci_do_dbc_start(struct xhci_hcd *xhci) in xhci_do_dbc_start() argument
481 struct xhci_dbc *dbc = xhci->dbc; in xhci_do_dbc_start()
493 ret = xhci_dbc_mem_init(xhci, GFP_ATOMIC); in xhci_do_dbc_start()
511 static int xhci_do_dbc_stop(struct xhci_hcd *xhci) in xhci_do_dbc_stop() argument
513 struct xhci_dbc *dbc = xhci->dbc; in xhci_do_dbc_stop()
519 xhci_dbc_mem_cleanup(xhci); in xhci_do_dbc_stop()
525 static int xhci_dbc_start(struct xhci_hcd *xhci) in xhci_dbc_start() argument
529 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_start()
533 pm_runtime_get_sync(xhci_to_hcd(xhci)->self.controller); in xhci_dbc_start()
536 ret = xhci_do_dbc_start(xhci); in xhci_dbc_start()
540 pm_runtime_put(xhci_to_hcd(xhci)->self.controller); in xhci_dbc_start()
547 static void xhci_dbc_stop(struct xhci_hcd *xhci) in xhci_dbc_stop() argument
551 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_stop()
559 xhci_dbc_tty_unregister_device(xhci); in xhci_dbc_stop()
562 ret = xhci_do_dbc_stop(xhci); in xhci_dbc_stop()
566 pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); in xhci_dbc_stop()
570 dbc_handle_port_status(struct xhci_hcd *xhci, union xhci_trb *event) in dbc_handle_port_status() argument
573 struct xhci_dbc *dbc = xhci->dbc; in dbc_handle_port_status()
577 xhci_info(xhci, "DbC port connect change\n"); in dbc_handle_port_status()
580 xhci_info(xhci, "DbC port reset change\n"); in dbc_handle_port_status()
583 xhci_info(xhci, "DbC port link status change\n"); in dbc_handle_port_status()
586 xhci_info(xhci, "DbC config error change\n"); in dbc_handle_port_status()
592 static void dbc_handle_xfer_event(struct xhci_hcd *xhci, union xhci_trb *event) in dbc_handle_xfer_event() argument
606 get_out_ep(xhci) : get_in_ep(xhci); in dbc_handle_xfer_event()
620 xhci_warn(xhci, "tx error %d detected\n", comp_code); in dbc_handle_xfer_event()
624 xhci_err(xhci, "unknown tx error %d\n", comp_code); in dbc_handle_xfer_event()
638 xhci_warn(xhci, "no matched request\n"); in dbc_handle_xfer_event()
655 struct xhci_hcd *xhci = dbc->xhci; in xhci_dbc_do_handle_events() local
668 xhci_info(xhci, "DbC connected\n"); in xhci_dbc_do_handle_events()
676 xhci_info(xhci, "DbC configured\n"); in xhci_dbc_do_handle_events()
688 xhci_info(xhci, "DbC cable unplugged\n"); in xhci_dbc_do_handle_events()
697 xhci_info(xhci, "DbC port reset\n"); in xhci_dbc_do_handle_events()
709 xhci_info(xhci, "DbC Endpoint stall\n"); in xhci_dbc_do_handle_events()
713 dep = get_in_ep(xhci); in xhci_dbc_do_handle_events()
718 dep = get_out_ep(xhci); in xhci_dbc_do_handle_events()
743 xhci_err(xhci, "Unknown DbC state %d\n", dbc->state); in xhci_dbc_do_handle_events()
761 dbc_handle_port_status(xhci, evt); in xhci_dbc_do_handle_events()
764 dbc_handle_xfer_event(xhci, evt); in xhci_dbc_do_handle_events()
770 inc_deq(xhci, dbc->ring_evt); in xhci_dbc_do_handle_events()
779 xhci_write_64(xhci, deq, &dbc->regs->erdp); in xhci_dbc_do_handle_events()
791 struct xhci_hcd *xhci; in xhci_dbc_handle_events() local
794 xhci = dbc->xhci; in xhci_dbc_handle_events()
802 ret = xhci_dbc_tty_register_device(xhci); in xhci_dbc_handle_events()
804 xhci_err(xhci, "failed to alloc tty device\n"); in xhci_dbc_handle_events()
808 xhci_info(xhci, "DbC now attached to /dev/ttyDBC0\n"); in xhci_dbc_handle_events()
811 xhci_dbc_tty_unregister_device(xhci); in xhci_dbc_handle_events()
816 xhci_info(xhci, "stop handling dbc events\n"); in xhci_dbc_handle_events()
823 static void xhci_do_dbc_exit(struct xhci_hcd *xhci) in xhci_do_dbc_exit() argument
827 spin_lock_irqsave(&xhci->lock, flags); in xhci_do_dbc_exit()
828 kfree(xhci->dbc); in xhci_do_dbc_exit()
829 xhci->dbc = NULL; in xhci_do_dbc_exit()
830 spin_unlock_irqrestore(&xhci->lock, flags); in xhci_do_dbc_exit()
833 static int xhci_do_dbc_init(struct xhci_hcd *xhci) in xhci_do_dbc_init() argument
841 base = &xhci->cap_regs->hc_capbase; in xhci_do_dbc_init()
859 spin_lock_irqsave(&xhci->lock, flags); in xhci_do_dbc_init()
860 if (xhci->dbc) { in xhci_do_dbc_init()
861 spin_unlock_irqrestore(&xhci->lock, flags); in xhci_do_dbc_init()
865 xhci->dbc = dbc; in xhci_do_dbc_init()
866 spin_unlock_irqrestore(&xhci->lock, flags); in xhci_do_dbc_init()
868 dbc->xhci = xhci; in xhci_do_dbc_init()
881 struct xhci_hcd *xhci; in dbc_show() local
883 xhci = hcd_to_xhci(dev_get_drvdata(dev)); in dbc_show()
884 dbc = xhci->dbc; in dbc_show()
916 struct xhci_hcd *xhci; in dbc_store() local
918 xhci = hcd_to_xhci(dev_get_drvdata(dev)); in dbc_store()
921 xhci_dbc_start(xhci); in dbc_store()
923 xhci_dbc_stop(xhci); in dbc_store()
932 int xhci_dbc_init(struct xhci_hcd *xhci) in xhci_dbc_init() argument
935 struct device *dev = xhci_to_hcd(xhci)->self.controller; in xhci_dbc_init()
937 ret = xhci_do_dbc_init(xhci); in xhci_dbc_init()
941 ret = xhci_dbc_tty_register_driver(xhci); in xhci_dbc_init()
954 xhci_do_dbc_exit(xhci); in xhci_dbc_init()
959 void xhci_dbc_exit(struct xhci_hcd *xhci) in xhci_dbc_exit() argument
961 struct device *dev = xhci_to_hcd(xhci)->self.controller; in xhci_dbc_exit()
963 if (!xhci->dbc) in xhci_dbc_exit()
968 xhci_dbc_stop(xhci); in xhci_dbc_exit()
969 xhci_do_dbc_exit(xhci); in xhci_dbc_exit()
973 int xhci_dbc_suspend(struct xhci_hcd *xhci) in xhci_dbc_suspend() argument
975 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_suspend()
983 xhci_dbc_stop(xhci); in xhci_dbc_suspend()
988 int xhci_dbc_resume(struct xhci_hcd *xhci) in xhci_dbc_resume() argument
991 struct xhci_dbc *dbc = xhci->dbc; in xhci_dbc_resume()
998 xhci_dbc_start(xhci); in xhci_dbc_resume()