source: mainline/uspace/drv/bus/usb/xhci/trb_ring.h@ 239eea41

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 239eea41 was af16ebe, checked in by Ondřej Hlavatý <aearsis@…>, 8 years ago

usb: redefine max_transfer_size

  • Property mode set to 100644
File size: 5.1 KB
RevLine 
[f4eb6c93]1/*
2 * Copyright (c) 2017 Ondrej Hlavaty
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup drvusbxhci
30 * @{
31 */
32/** @file
33 * TRB Ring is a data structure for communication between HC and software.
34 *
35 * Despite this description, it is not used as an hardware structure - all but
36 * the Event ring is used as buffer of the TRBs itself, linked by Link TRB to
37 * form a (possibly multi-segment) circular buffer.
38 *
39 * This data structure abstracts this behavior.
40 */
41
42#ifndef XHCI_TRB_RING_H
43#define XHCI_TRB_RING_H
44
45#include <adt/list.h>
[a2b0ba3]46#include <fibril_synch.h>
[f4eb6c93]47#include <libarch/config.h>
[3b60ea0]48#include <usb/dma_buffer.h>
[f4eb6c93]49
50typedef struct trb_segment trb_segment_t;
[cb89430]51typedef struct xhci_hc xhci_hc_t;
52typedef struct xhci_trb xhci_trb_t;
53typedef struct xhci_erst_entry xhci_erst_entry_t;
[f4eb6c93]54
55/**
56 * A TRB ring of which the software is a producer - command / transfer.
57 */
58typedef struct xhci_trb_ring {
59 list_t segments; /* List of assigned segments */
[cb89430]60 int segment_count; /* Number of segments assigned */
[f4eb6c93]61
62 /*
63 * As the link TRBs connect physical addresses, we need to keep track of
64 * active segment in virtual memory. The enqueue ptr should always belong
65 * to the enqueue segment.
66 */
67 trb_segment_t *enqueue_segment;
68 xhci_trb_t *enqueue_trb;
69
70 uintptr_t dequeue; /* Last reported position of the dequeue pointer */
71 bool pcs; /* Producer Cycle State: section 4.9.2 */
[a2b0ba3]72
73 fibril_mutex_t guard;
[f4eb6c93]74} xhci_trb_ring_t;
75
[45457265]76extern errno_t xhci_trb_ring_init(xhci_trb_ring_t *, size_t);
[3dd80f8]77extern void xhci_trb_ring_fini(xhci_trb_ring_t *);
[45457265]78extern errno_t xhci_trb_ring_enqueue(xhci_trb_ring_t *, xhci_trb_t *, uintptr_t *);
79extern errno_t xhci_trb_ring_enqueue_multiple(xhci_trb_ring_t *, xhci_trb_t *, size_t, uintptr_t *);
[af16ebe]80extern size_t xhci_trb_ring_size(xhci_trb_ring_t *);
[f4eb6c93]81
[3dd80f8]82extern void xhci_trb_ring_reset_dequeue_state(xhci_trb_ring_t *ring, uintptr_t *addr);
[f4eb6c93]83
84/**
85 * When an event is received by the upper layer, it needs to update the dequeue
86 * pointer inside the ring. Otherwise, the ring will soon show up as full.
87 */
[eb862fd]88static inline void xhci_trb_ring_update_dequeue(xhci_trb_ring_t *ring, uintptr_t phys)
89{
[309d9865]90 ring->dequeue = phys;
91}
92
[cb89430]93/**
94 * A TRB ring of which the software is a consumer (event rings).
95 */
96typedef struct xhci_event_ring {
97 list_t segments; /* List of assigned segments */
98 int segment_count; /* Number of segments assigned */
99
100 trb_segment_t *dequeue_segment; /* Current segment of the dequeue ptr */
101 xhci_trb_t *dequeue_trb; /* Next TRB to be processed */
102 uintptr_t dequeue_ptr; /* Physical address of the ERDP to be reported to the HC */
103
[b80c1ab]104 dma_buffer_t erst; /* ERST given to the HC */
[cb89430]105
106 bool ccs; /* Consumer Cycle State: section 4.9.2 */
[a1eb7c67]107
108 fibril_mutex_t guard;
[cb89430]109} xhci_event_ring_t;
[f4eb6c93]110
[45457265]111extern errno_t xhci_event_ring_init(xhci_event_ring_t *, size_t);
[3dd80f8]112extern void xhci_event_ring_fini(xhci_event_ring_t *);
[19f0048]113extern void xhci_event_ring_reset(xhci_event_ring_t *);
[45457265]114extern errno_t xhci_event_ring_dequeue(xhci_event_ring_t *, xhci_trb_t *);
[f4eb6c93]115
[2bff2cc2]116/**
117 * A TRB ring of which the software is both consumer and provider.
118 */
119typedef struct xhci_sw_ring {
120 xhci_trb_t *begin, *end;
121 xhci_trb_t *enqueue, *dequeue;
122
123 fibril_mutex_t guard;
124 fibril_condvar_t enqueued_cv, dequeued_cv;
125
126 bool running;
127} xhci_sw_ring_t;
128
[3dd80f8]129extern void xhci_sw_ring_init(xhci_sw_ring_t *, size_t);
[2bff2cc2]130
131/* Both may block if the ring is full/empty. */
[45457265]132extern errno_t xhci_sw_ring_enqueue(xhci_sw_ring_t *, xhci_trb_t *);
133extern errno_t xhci_sw_ring_dequeue(xhci_sw_ring_t *, xhci_trb_t *);
[2bff2cc2]134
[19f0048]135extern void xhci_sw_ring_restart(xhci_sw_ring_t *);
[3dd80f8]136extern void xhci_sw_ring_stop(xhci_sw_ring_t *);
137extern void xhci_sw_ring_fini(xhci_sw_ring_t *);
[2bff2cc2]138
[f4eb6c93]139#endif
[2bff2cc2]140
141/**
142 * @}
143 */
Note: See TracBrowser for help on using the repository browser.