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

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

xhci: commands shall not just timeout

Previous behavior was breaking semantic: if a command was successful,
but just took too long to complete, we returned an error, and the caller
had no way to know if the command's effect has taken place.

This commit implements command aborting. The wait_for_command now cannot
just timeout - instead it aborts currently running (probably blocked)
command, and then gets back to waiting. So now, if command_sync returns
an error, it means the command was really unsuccessful.

If aborting the command takes too long, we should reset the whole HC.
This is not yet implemented.

  • Property mode set to 100644
File size: 4.3 KB
Line 
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>
46#include <fibril_synch.h>
47#include <libarch/config.h>
48#include <usb/host/dma_buffer.h>
49
50typedef struct trb_segment trb_segment_t;
51typedef struct xhci_hc xhci_hc_t;
52typedef struct xhci_trb xhci_trb_t;
53typedef struct xhci_erst_entry xhci_erst_entry_t;
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 */
60 int segment_count; /* Number of segments assigned */
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 */
72
73 fibril_mutex_t guard;
74} xhci_trb_ring_t;
75
76int xhci_trb_ring_init(xhci_trb_ring_t *);
77void xhci_trb_ring_fini(xhci_trb_ring_t *);
78int xhci_trb_ring_enqueue(xhci_trb_ring_t *, xhci_trb_t *, uintptr_t *);
79int xhci_trb_ring_enqueue_multiple(xhci_trb_ring_t *, xhci_trb_t *, size_t, uintptr_t *);
80
81/**
82 * Get the initial value to fill into CRCR.
83 */
84static inline uintptr_t xhci_trb_ring_get_dequeue_ptr(xhci_trb_ring_t *ring)
85{
86 return ring->dequeue;
87}
88
89/**
90 * When an event is received by the upper layer, it needs to update the dequeue
91 * pointer inside the ring. Otherwise, the ring will soon show up as full.
92 */
93static inline void xhci_trb_ring_update_dequeue(xhci_trb_ring_t *ring, uintptr_t phys) {}
94uintptr_t xhci_trb_ring_get_dequeue_ptr(xhci_trb_ring_t *);
95
96/**
97 * A TRB ring of which the software is a consumer (event rings).
98 */
99typedef struct xhci_event_ring {
100 list_t segments; /* List of assigned segments */
101 int segment_count; /* Number of segments assigned */
102
103 trb_segment_t *dequeue_segment; /* Current segment of the dequeue ptr */
104 xhci_trb_t *dequeue_trb; /* Next TRB to be processed */
105 uintptr_t dequeue_ptr; /* Physical address of the ERDP to be reported to the HC */
106
107 dma_buffer_t erst; /* ERST given to the HC */
108
109 bool ccs; /* Consumer Cycle State: section 4.9.2 */
110
111 fibril_mutex_t guard;
112} xhci_event_ring_t;
113
114int xhci_event_ring_init(xhci_event_ring_t *);
115void xhci_event_ring_fini(xhci_event_ring_t *);
116int xhci_event_ring_dequeue(xhci_event_ring_t *, xhci_trb_t *);
117
118#endif
Note: See TracBrowser for help on using the repository browser.