xref: /openbmc/qemu/hw/usb/hcd-ohci.c (revision c9ba79baca7c673098361e3a687f72d458e0d18a)
1 f1ae32a1SGerd Hoffmann /*
2 f1ae32a1SGerd Hoffmann  * QEMU USB OHCI Emulation
3 f1ae32a1SGerd Hoffmann  * Copyright (c) 2004 Gianni Tedesco
4 f1ae32a1SGerd Hoffmann  * Copyright (c) 2006 CodeSourcery
5 f1ae32a1SGerd Hoffmann  * Copyright (c) 2006 Openedhand Ltd.
6 f1ae32a1SGerd Hoffmann  *
7 f1ae32a1SGerd Hoffmann  * This library is free software; you can redistribute it and/or
8 f1ae32a1SGerd Hoffmann  * modify it under the terms of the GNU Lesser General Public
9 f1ae32a1SGerd Hoffmann  * License as published by the Free Software Foundation; either
10 bee41971SChetan Pant  * version 2.1 of the License, or (at your option) any later version.
11 f1ae32a1SGerd Hoffmann  *
12 f1ae32a1SGerd Hoffmann  * This library is distributed in the hope that it will be useful,
13 f1ae32a1SGerd Hoffmann  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 f1ae32a1SGerd Hoffmann  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 f1ae32a1SGerd Hoffmann  * Lesser General Public License for more details.
16 f1ae32a1SGerd Hoffmann  *
17 f1ae32a1SGerd Hoffmann  * You should have received a copy of the GNU Lesser General Public
18 f1ae32a1SGerd Hoffmann  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 f1ae32a1SGerd Hoffmann  *
20 f1ae32a1SGerd Hoffmann  * TODO:
21 f1ae32a1SGerd Hoffmann  *  o Isochronous transfers
22 f1ae32a1SGerd Hoffmann  *  o Allocate bandwidth in frames properly
23 f1ae32a1SGerd Hoffmann  *  o Disable timers when nothing needs to be done, or remove timer usage
24 f1ae32a1SGerd Hoffmann  *    all together.
25 f1ae32a1SGerd Hoffmann  *  o BIOS work to boot from USB storage
26 f1ae32a1SGerd Hoffmann  */
27 f1ae32a1SGerd Hoffmann 
28 e532b2e0SPeter Maydell #include "qemu/osdep.h"
29 64552b6bSMarkus Armbruster #include "hw/irq.h"
30 da34e65cSMarkus Armbruster #include "qapi/error.h"
31 0b8fa32fSMarkus Armbruster #include "qemu/module.h"
32 1de7afc9SPaolo Bonzini #include "qemu/timer.h"
33 f1ae32a1SGerd Hoffmann #include "hw/usb.h"
34 d6454270SMarkus Armbruster #include "migration/vmstate.h"
35 f1ae32a1SGerd Hoffmann #include "hw/sysbus.h"
36 9ac6a217SDavid Gibson #include "hw/qdev-dma.h"
37 a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
38 dc1f5988SAlexey Kardashevskiy #include "trace.h"
39 34d97308SThomas Huth #include "hcd-ohci.h"
40 f1ae32a1SGerd Hoffmann 
41 f1ae32a1SGerd Hoffmann /* This causes frames to occur 1000x slower */
42 572a6732SBALATON Zoltan /*#define OHCI_TIME_WARP 1*/
43 f1ae32a1SGerd Hoffmann 
44 ab6b1105SGerd Hoffmann #define ED_LINK_LIMIT 32
45 95ed5693SLi Qiang 
46 f1ae32a1SGerd Hoffmann static int64_t usb_frame_time;
47 f1ae32a1SGerd Hoffmann static int64_t usb_bit_time;
48 f1ae32a1SGerd Hoffmann 
49 f1ae32a1SGerd Hoffmann /* Host Controller Communications Area */
50 f1ae32a1SGerd Hoffmann struct ohci_hcca {
51 f1ae32a1SGerd Hoffmann     uint32_t intr[32];
52 f1ae32a1SGerd Hoffmann     uint16_t frame, pad;
53 f1ae32a1SGerd Hoffmann     uint32_t done;
54 f1ae32a1SGerd Hoffmann };
55 86e18caeSWei Yang #define HCCA_WRITEBACK_OFFSET   offsetof(struct ohci_hcca, frame)
56 86e18caeSWei Yang #define HCCA_WRITEBACK_SIZE     8 /* frame, pad, done */
57 86e18caeSWei Yang 
58 86e18caeSWei Yang #define ED_WBACK_OFFSET offsetof(struct ohci_ed, head)
59 86e18caeSWei Yang #define ED_WBACK_SIZE   4
60 f1ae32a1SGerd Hoffmann 
61 38019462SPhilippe Mathieu-Daudé /* Bitfields for the first word of an Endpoint Descriptor. */
62 f1ae32a1SGerd Hoffmann #define OHCI_ED_FA_SHIFT  0
63 f1ae32a1SGerd Hoffmann #define OHCI_ED_FA_MASK   (0x7f << OHCI_ED_FA_SHIFT)
64 f1ae32a1SGerd Hoffmann #define OHCI_ED_EN_SHIFT  7
65 f1ae32a1SGerd Hoffmann #define OHCI_ED_EN_MASK   (0xf << OHCI_ED_EN_SHIFT)
66 f1ae32a1SGerd Hoffmann #define OHCI_ED_D_SHIFT   11
67 f1ae32a1SGerd Hoffmann #define OHCI_ED_D_MASK    (3 << OHCI_ED_D_SHIFT)
68 f1ae32a1SGerd Hoffmann #define OHCI_ED_S         (1 << 13)
69 f1ae32a1SGerd Hoffmann #define OHCI_ED_K         (1 << 14)
70 f1ae32a1SGerd Hoffmann #define OHCI_ED_F         (1 << 15)
71 f1ae32a1SGerd Hoffmann #define OHCI_ED_MPS_SHIFT 16
72 f1ae32a1SGerd Hoffmann #define OHCI_ED_MPS_MASK  (0x7ff << OHCI_ED_MPS_SHIFT)
73 f1ae32a1SGerd Hoffmann 
74 38019462SPhilippe Mathieu-Daudé /* Flags in the head field of an Endpoint Descriptor. */
75 f1ae32a1SGerd Hoffmann #define OHCI_ED_H         1
76 f1ae32a1SGerd Hoffmann #define OHCI_ED_C         2
77 f1ae32a1SGerd Hoffmann 
78 38019462SPhilippe Mathieu-Daudé /* Bitfields for the first word of a Transfer Descriptor. */
79 f1ae32a1SGerd Hoffmann #define OHCI_TD_R         (1 << 18)
80 f1ae32a1SGerd Hoffmann #define OHCI_TD_DP_SHIFT  19
81 f1ae32a1SGerd Hoffmann #define OHCI_TD_DP_MASK   (3 << OHCI_TD_DP_SHIFT)
82 f1ae32a1SGerd Hoffmann #define OHCI_TD_DI_SHIFT  21
83 f1ae32a1SGerd Hoffmann #define OHCI_TD_DI_MASK   (7 << OHCI_TD_DI_SHIFT)
84 f1ae32a1SGerd Hoffmann #define OHCI_TD_T0        (1 << 24)
85 f1ae32a1SGerd Hoffmann #define OHCI_TD_T1        (1 << 25)
86 f1ae32a1SGerd Hoffmann #define OHCI_TD_EC_SHIFT  26
87 f1ae32a1SGerd Hoffmann #define OHCI_TD_EC_MASK   (3 << OHCI_TD_EC_SHIFT)
88 f1ae32a1SGerd Hoffmann #define OHCI_TD_CC_SHIFT  28
89 f1ae32a1SGerd Hoffmann #define OHCI_TD_CC_MASK   (0xf << OHCI_TD_CC_SHIFT)
90 f1ae32a1SGerd Hoffmann 
91 38019462SPhilippe Mathieu-Daudé /* Bitfields for the first word of an Isochronous Transfer Descriptor. */
92 38019462SPhilippe Mathieu-Daudé /* CC & DI - same as in the General Transfer Descriptor */
93 f1ae32a1SGerd Hoffmann #define OHCI_TD_SF_SHIFT  0
94 f1ae32a1SGerd Hoffmann #define OHCI_TD_SF_MASK   (0xffff << OHCI_TD_SF_SHIFT)
95 f1ae32a1SGerd Hoffmann #define OHCI_TD_FC_SHIFT  24
96 f1ae32a1SGerd Hoffmann #define OHCI_TD_FC_MASK   (7 << OHCI_TD_FC_SHIFT)
97 f1ae32a1SGerd Hoffmann 
98 38019462SPhilippe Mathieu-Daudé /* Isochronous Transfer Descriptor - Offset / PacketStatusWord */
99 f1ae32a1SGerd Hoffmann #define OHCI_TD_PSW_CC_SHIFT 12
100 f1ae32a1SGerd Hoffmann #define OHCI_TD_PSW_CC_MASK  (0xf << OHCI_TD_PSW_CC_SHIFT)
101 f1ae32a1SGerd Hoffmann #define OHCI_TD_PSW_SIZE_SHIFT 0
102 f1ae32a1SGerd Hoffmann #define OHCI_TD_PSW_SIZE_MASK  (0xfff << OHCI_TD_PSW_SIZE_SHIFT)
103 f1ae32a1SGerd Hoffmann 
104 f1ae32a1SGerd Hoffmann #define OHCI_PAGE_MASK    0xfffff000
105 f1ae32a1SGerd Hoffmann #define OHCI_OFFSET_MASK  0xfff
106 f1ae32a1SGerd Hoffmann 
107 f1ae32a1SGerd Hoffmann #define OHCI_DPTR_MASK    0xfffffff0
108 f1ae32a1SGerd Hoffmann 
109 f1ae32a1SGerd Hoffmann #define OHCI_BM(val, field) \
110 f1ae32a1SGerd Hoffmann   (((val) & OHCI_##field##_MASK) >> OHCI_##field##_SHIFT)
111 f1ae32a1SGerd Hoffmann 
112 f1ae32a1SGerd Hoffmann #define OHCI_SET_BM(val, field, newval) do { \
113 f1ae32a1SGerd Hoffmann     val &= ~OHCI_##field##_MASK; \
114 f1ae32a1SGerd Hoffmann     val |= ((newval) << OHCI_##field##_SHIFT) & OHCI_##field##_MASK; \
115 f1ae32a1SGerd Hoffmann     } while (0)
116 f1ae32a1SGerd Hoffmann 
117 f1ae32a1SGerd Hoffmann /* endpoint descriptor */
118 f1ae32a1SGerd Hoffmann struct ohci_ed {
119 f1ae32a1SGerd Hoffmann     uint32_t flags;
120 f1ae32a1SGerd Hoffmann     uint32_t tail;
121 f1ae32a1SGerd Hoffmann     uint32_t head;
122 f1ae32a1SGerd Hoffmann     uint32_t next;
123 f1ae32a1SGerd Hoffmann };
124 f1ae32a1SGerd Hoffmann 
125 f1ae32a1SGerd Hoffmann /* General transfer descriptor */
126 f1ae32a1SGerd Hoffmann struct ohci_td {
127 f1ae32a1SGerd Hoffmann     uint32_t flags;
128 f1ae32a1SGerd Hoffmann     uint32_t cbp;
129 f1ae32a1SGerd Hoffmann     uint32_t next;
130 f1ae32a1SGerd Hoffmann     uint32_t be;
131 f1ae32a1SGerd Hoffmann };
132 f1ae32a1SGerd Hoffmann 
133 f1ae32a1SGerd Hoffmann /* Isochronous transfer descriptor */
134 f1ae32a1SGerd Hoffmann struct ohci_iso_td {
135 f1ae32a1SGerd Hoffmann     uint32_t flags;
136 f1ae32a1SGerd Hoffmann     uint32_t bp;
137 f1ae32a1SGerd Hoffmann     uint32_t next;
138 f1ae32a1SGerd Hoffmann     uint32_t be;
139 f1ae32a1SGerd Hoffmann     uint16_t offset[8];
140 f1ae32a1SGerd Hoffmann };
141 f1ae32a1SGerd Hoffmann 
142 f1ae32a1SGerd Hoffmann #define USB_HZ                      12000000
143 f1ae32a1SGerd Hoffmann 
144 f1ae32a1SGerd Hoffmann /* OHCI Local stuff */
145 f1ae32a1SGerd Hoffmann #define OHCI_CTL_CBSR         ((1 << 0) | (1 << 1))
146 f1ae32a1SGerd Hoffmann #define OHCI_CTL_PLE          (1 << 2)
147 f1ae32a1SGerd Hoffmann #define OHCI_CTL_IE           (1 << 3)
148 f1ae32a1SGerd Hoffmann #define OHCI_CTL_CLE          (1 << 4)
149 f1ae32a1SGerd Hoffmann #define OHCI_CTL_BLE          (1 << 5)
150 f1ae32a1SGerd Hoffmann #define OHCI_CTL_HCFS         ((1 << 6) | (1 << 7))
151 f1ae32a1SGerd Hoffmann #define  OHCI_USB_RESET       0x00
152 f1ae32a1SGerd Hoffmann #define  OHCI_USB_RESUME      0x40
153 f1ae32a1SGerd Hoffmann #define  OHCI_USB_OPERATIONAL 0x80
154 f1ae32a1SGerd Hoffmann #define  OHCI_USB_SUSPEND     0xc0
155 f1ae32a1SGerd Hoffmann #define OHCI_CTL_IR           (1 << 8)
156 f1ae32a1SGerd Hoffmann #define OHCI_CTL_RWC          (1 << 9)
157 f1ae32a1SGerd Hoffmann #define OHCI_CTL_RWE          (1 << 10)
158 f1ae32a1SGerd Hoffmann 
159 f1ae32a1SGerd Hoffmann #define OHCI_STATUS_HCR       (1 << 0)
160 f1ae32a1SGerd Hoffmann #define OHCI_STATUS_CLF       (1 << 1)
161 f1ae32a1SGerd Hoffmann #define OHCI_STATUS_BLF       (1 << 2)
162 f1ae32a1SGerd Hoffmann #define OHCI_STATUS_OCR       (1 << 3)
163 f1ae32a1SGerd Hoffmann #define OHCI_STATUS_SOC       ((1 << 6) | (1 << 7))
164 f1ae32a1SGerd Hoffmann 
165 00b01793SPeter Maydell #define OHCI_INTR_SO          (1U << 0) /* Scheduling overrun */
166 00b01793SPeter Maydell #define OHCI_INTR_WD          (1U << 1) /* HcDoneHead writeback */
167 00b01793SPeter Maydell #define OHCI_INTR_SF          (1U << 2) /* Start of frame */
168 00b01793SPeter Maydell #define OHCI_INTR_RD          (1U << 3) /* Resume detect */
169 00b01793SPeter Maydell #define OHCI_INTR_UE          (1U << 4) /* Unrecoverable error */
170 00b01793SPeter Maydell #define OHCI_INTR_FNO         (1U << 5) /* Frame number overflow */
171 00b01793SPeter Maydell #define OHCI_INTR_RHSC        (1U << 6) /* Root hub status change */
172 00b01793SPeter Maydell #define OHCI_INTR_OC          (1U << 30) /* Ownership change */
173 00b01793SPeter Maydell #define OHCI_INTR_MIE         (1U << 31) /* Master Interrupt Enable */
174 f1ae32a1SGerd Hoffmann 
175 f1ae32a1SGerd Hoffmann #define OHCI_HCCA_SIZE        0x100
176 f1ae32a1SGerd Hoffmann #define OHCI_HCCA_MASK        0xffffff00
177 f1ae32a1SGerd Hoffmann 
178 f1ae32a1SGerd Hoffmann #define OHCI_EDPTR_MASK       0xfffffff0
179 f1ae32a1SGerd Hoffmann 
180 f1ae32a1SGerd Hoffmann #define OHCI_FMI_FI           0x00003fff
181 f1ae32a1SGerd Hoffmann #define OHCI_FMI_FSMPS        0xffff0000
182 f1ae32a1SGerd Hoffmann #define OHCI_FMI_FIT          0x80000000
183 f1ae32a1SGerd Hoffmann 
184 00b01793SPeter Maydell #define OHCI_FR_RT            (1U << 31)
185 f1ae32a1SGerd Hoffmann 
186 f1ae32a1SGerd Hoffmann #define OHCI_LS_THRESH        0x628
187 f1ae32a1SGerd Hoffmann 
188 f1ae32a1SGerd Hoffmann #define OHCI_RHA_RW_MASK      0x00000000 /* Mask of supported features.  */
189 f1ae32a1SGerd Hoffmann #define OHCI_RHA_PSM          (1 << 8)
190 f1ae32a1SGerd Hoffmann #define OHCI_RHA_NPS          (1 << 9)
191 f1ae32a1SGerd Hoffmann #define OHCI_RHA_DT           (1 << 10)
192 f1ae32a1SGerd Hoffmann #define OHCI_RHA_OCPM         (1 << 11)
193 f1ae32a1SGerd Hoffmann #define OHCI_RHA_NOCP         (1 << 12)
194 f1ae32a1SGerd Hoffmann #define OHCI_RHA_POTPGT_MASK  0xff000000
195 f1ae32a1SGerd Hoffmann 
196 00b01793SPeter Maydell #define OHCI_RHS_LPS          (1U << 0)
197 00b01793SPeter Maydell #define OHCI_RHS_OCI          (1U << 1)
198 00b01793SPeter Maydell #define OHCI_RHS_DRWE         (1U << 15)
199 00b01793SPeter Maydell #define OHCI_RHS_LPSC         (1U << 16)
200 00b01793SPeter Maydell #define OHCI_RHS_OCIC         (1U << 17)
201 00b01793SPeter Maydell #define OHCI_RHS_CRWE         (1U << 31)
202 f1ae32a1SGerd Hoffmann 
203 f1ae32a1SGerd Hoffmann #define OHCI_PORT_CCS         (1 << 0)
204 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PES         (1 << 1)
205 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PSS         (1 << 2)
206 f1ae32a1SGerd Hoffmann #define OHCI_PORT_POCI        (1 << 3)
207 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PRS         (1 << 4)
208 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PPS         (1 << 8)
209 f1ae32a1SGerd Hoffmann #define OHCI_PORT_LSDA        (1 << 9)
210 f1ae32a1SGerd Hoffmann #define OHCI_PORT_CSC         (1 << 16)
211 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PESC        (1 << 17)
212 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PSSC        (1 << 18)
213 f1ae32a1SGerd Hoffmann #define OHCI_PORT_OCIC        (1 << 19)
214 f1ae32a1SGerd Hoffmann #define OHCI_PORT_PRSC        (1 << 20)
215 978c93beSBALATON Zoltan #define OHCI_PORT_WTC         (OHCI_PORT_CSC | OHCI_PORT_PESC | \
216 978c93beSBALATON Zoltan                                OHCI_PORT_PSSC | OHCI_PORT_OCIC | \
217 978c93beSBALATON Zoltan                                OHCI_PORT_PRSC)
218 f1ae32a1SGerd Hoffmann #define OHCI_TD_DIR_SETUP     0x0
219 f1ae32a1SGerd Hoffmann #define OHCI_TD_DIR_OUT       0x1
220 f1ae32a1SGerd Hoffmann #define OHCI_TD_DIR_IN        0x2
221 f1ae32a1SGerd Hoffmann #define OHCI_TD_DIR_RESERVED  0x3
222 f1ae32a1SGerd Hoffmann 
223 f1ae32a1SGerd Hoffmann #define OHCI_CC_NOERROR             0x0
224 f1ae32a1SGerd Hoffmann #define OHCI_CC_CRC                 0x1
225 f1ae32a1SGerd Hoffmann #define OHCI_CC_BITSTUFFING         0x2
226 f1ae32a1SGerd Hoffmann #define OHCI_CC_DATATOGGLEMISMATCH  0x3
227 f1ae32a1SGerd Hoffmann #define OHCI_CC_STALL               0x4
228 f1ae32a1SGerd Hoffmann #define OHCI_CC_DEVICENOTRESPONDING 0x5
229 f1ae32a1SGerd Hoffmann #define OHCI_CC_PIDCHECKFAILURE     0x6
230 f1ae32a1SGerd Hoffmann #define OHCI_CC_UNDEXPETEDPID       0x7
231 f1ae32a1SGerd Hoffmann #define OHCI_CC_DATAOVERRUN         0x8
232 f1ae32a1SGerd Hoffmann #define OHCI_CC_DATAUNDERRUN        0x9
233 f1ae32a1SGerd Hoffmann #define OHCI_CC_BUFFEROVERRUN       0xc
234 f1ae32a1SGerd Hoffmann #define OHCI_CC_BUFFERUNDERRUN      0xd
235 f1ae32a1SGerd Hoffmann 
236 f1ae32a1SGerd Hoffmann #define OHCI_HRESET_FSBIR       (1 << 0)
237 f1ae32a1SGerd Hoffmann 
238 9ae8d31dSBALATON Zoltan static const char *ohci_reg_names[] = {
239 9ae8d31dSBALATON Zoltan     "HcRevision", "HcControl", "HcCommandStatus", "HcInterruptStatus",
240 9ae8d31dSBALATON Zoltan     "HcInterruptEnable", "HcInterruptDisable", "HcHCCA", "HcPeriodCurrentED",
241 9ae8d31dSBALATON Zoltan     "HcControlHeadED", "HcControlCurrentED", "HcBulkHeadED", "HcBulkCurrentED",
242 9ae8d31dSBALATON Zoltan     "HcDoneHead", "HcFmInterval", "HcFmRemaining", "HcFmNumber",
243 9ae8d31dSBALATON Zoltan     "HcPeriodicStart", "HcLSThreshold", "HcRhDescriptorA", "HcRhDescriptorB",
244 9ae8d31dSBALATON Zoltan     "HcRhStatus"
245 9ae8d31dSBALATON Zoltan };
246 9ae8d31dSBALATON Zoltan 
ohci_reg_name(hwaddr addr)247 9ae8d31dSBALATON Zoltan static const char *ohci_reg_name(hwaddr addr)
248 9ae8d31dSBALATON Zoltan {
249 9ae8d31dSBALATON Zoltan     if (addr >> 2 < ARRAY_SIZE(ohci_reg_names)) {
250 9ae8d31dSBALATON Zoltan         return ohci_reg_names[addr >> 2];
251 9ae8d31dSBALATON Zoltan     } else {
252 9ae8d31dSBALATON Zoltan         return "<unknown>";
253 9ae8d31dSBALATON Zoltan     }
254 9ae8d31dSBALATON Zoltan }
255 9ae8d31dSBALATON Zoltan 
ohci_die(OHCIState * ohci)256 72e0c127SThomas Huth static void ohci_die(OHCIState *ohci)
257 72e0c127SThomas Huth {
258 72e0c127SThomas Huth     ohci->ohci_die(ohci);
259 72e0c127SThomas Huth }
260 cf66ee8eSAlexey Kardashevskiy 
261 f1ae32a1SGerd Hoffmann /* Update IRQ levels */
ohci_intr_update(OHCIState * ohci)262 f1ae32a1SGerd Hoffmann static inline void ohci_intr_update(OHCIState *ohci)
263 f1ae32a1SGerd Hoffmann {
264 f1ae32a1SGerd Hoffmann     int level = 0;
265 f1ae32a1SGerd Hoffmann 
266 f1ae32a1SGerd Hoffmann     if ((ohci->intr & OHCI_INTR_MIE) &&
267 f1ae32a1SGerd Hoffmann         (ohci->intr_status & ohci->intr))
268 f1ae32a1SGerd Hoffmann         level = 1;
269 f1ae32a1SGerd Hoffmann 
270 f1ae32a1SGerd Hoffmann     qemu_set_irq(ohci->irq, level);
271 f1ae32a1SGerd Hoffmann }
272 f1ae32a1SGerd Hoffmann 
273 f1ae32a1SGerd Hoffmann /* Set an interrupt */
ohci_set_interrupt(OHCIState * ohci,uint32_t intr)274 f1ae32a1SGerd Hoffmann static inline void ohci_set_interrupt(OHCIState *ohci, uint32_t intr)
275 f1ae32a1SGerd Hoffmann {
276 f1ae32a1SGerd Hoffmann     ohci->intr_status |= intr;
277 f1ae32a1SGerd Hoffmann     ohci_intr_update(ohci);
278 f1ae32a1SGerd Hoffmann }
279 f1ae32a1SGerd Hoffmann 
ohci_find_device(OHCIState * ohci,uint8_t addr)280 f1ae32a1SGerd Hoffmann static USBDevice *ohci_find_device(OHCIState *ohci, uint8_t addr)
281 f1ae32a1SGerd Hoffmann {
282 f1ae32a1SGerd Hoffmann     USBDevice *dev;
283 f1ae32a1SGerd Hoffmann     int i;
284 f1ae32a1SGerd Hoffmann 
285 f1ae32a1SGerd Hoffmann     for (i = 0; i < ohci->num_ports; i++) {
286 f1ae32a1SGerd Hoffmann         if ((ohci->rhport[i].ctrl & OHCI_PORT_PES) == 0) {
287 f1ae32a1SGerd Hoffmann             continue;
288 f1ae32a1SGerd Hoffmann         }
289 f1ae32a1SGerd Hoffmann         dev = usb_find_device(&ohci->rhport[i].port, addr);
290 f1ae32a1SGerd Hoffmann         if (dev != NULL) {
291 f1ae32a1SGerd Hoffmann             return dev;
292 f1ae32a1SGerd Hoffmann         }
293 f1ae32a1SGerd Hoffmann     }
294 f1ae32a1SGerd Hoffmann     return NULL;
295 f1ae32a1SGerd Hoffmann }
296 f1ae32a1SGerd Hoffmann 
ohci_stop_endpoints(OHCIState * ohci)297 34d97308SThomas Huth void ohci_stop_endpoints(OHCIState *ohci)
298 f79738b0SHans de Goede {
299 f79738b0SHans de Goede     USBDevice *dev;
300 f79738b0SHans de Goede     int i, j;
301 f79738b0SHans de Goede 
302 ae310557SBALATON Zoltan     if (ohci->async_td) {
303 ae310557SBALATON Zoltan         usb_cancel_packet(&ohci->usb_packet);
304 ae310557SBALATON Zoltan         ohci->async_td = 0;
305 ae310557SBALATON Zoltan     }
306 f79738b0SHans de Goede     for (i = 0; i < ohci->num_ports; i++) {
307 f79738b0SHans de Goede         dev = ohci->rhport[i].port.dev;
308 f79738b0SHans de Goede         if (dev && dev->attached) {
309 f79738b0SHans de Goede             usb_device_ep_stopped(dev, &dev->ep_ctl);
310 f79738b0SHans de Goede             for (j = 0; j < USB_MAX_ENDPOINTS; j++) {
311 f79738b0SHans de Goede                 usb_device_ep_stopped(dev, &dev->ep_in[j]);
312 f79738b0SHans de Goede                 usb_device_ep_stopped(dev, &dev->ep_out[j]);
313 f79738b0SHans de Goede             }
314 f79738b0SHans de Goede         }
315 f79738b0SHans de Goede     }
316 f79738b0SHans de Goede }
317 f79738b0SHans de Goede 
ohci_roothub_reset(OHCIState * ohci)318 84d04e21SHervé Poussineau static void ohci_roothub_reset(OHCIState *ohci)
319 f1ae32a1SGerd Hoffmann {
320 f1ae32a1SGerd Hoffmann     OHCIPort *port;
321 f1ae32a1SGerd Hoffmann     int i;
322 f1ae32a1SGerd Hoffmann 
323 f1ae32a1SGerd Hoffmann     ohci_bus_stop(ohci);
324 84d04e21SHervé Poussineau     ohci->rhdesc_a = OHCI_RHA_NPS | ohci->num_ports;
325 84d04e21SHervé Poussineau     ohci->rhdesc_b = 0x0; /* Impl. specific */
326 84d04e21SHervé Poussineau     ohci->rhstatus = 0;
327 84d04e21SHervé Poussineau 
328 84d04e21SHervé Poussineau     for (i = 0; i < ohci->num_ports; i++) {
329 84d04e21SHervé Poussineau         port = &ohci->rhport[i];
330 84d04e21SHervé Poussineau         port->ctrl = 0;
331 84d04e21SHervé Poussineau         if (port->port.dev && port->port.dev->attached) {
332 84d04e21SHervé Poussineau             usb_port_reset(&port->port);
333 84d04e21SHervé Poussineau         }
334 84d04e21SHervé Poussineau     }
335 84d04e21SHervé Poussineau     ohci_stop_endpoints(ohci);
336 84d04e21SHervé Poussineau }
337 84d04e21SHervé Poussineau 
338 84d04e21SHervé Poussineau /* Reset the controller */
ohci_soft_reset(OHCIState * ohci)339 84d04e21SHervé Poussineau static void ohci_soft_reset(OHCIState *ohci)
340 84d04e21SHervé Poussineau {
341 84d04e21SHervé Poussineau     trace_usb_ohci_reset(ohci->name);
342 84d04e21SHervé Poussineau 
343 84d04e21SHervé Poussineau     ohci_bus_stop(ohci);
344 84d04e21SHervé Poussineau     ohci->ctl = (ohci->ctl & OHCI_CTL_IR) | OHCI_USB_SUSPEND;
345 f1ae32a1SGerd Hoffmann     ohci->old_ctl = 0;
346 f1ae32a1SGerd Hoffmann     ohci->status = 0;
347 f1ae32a1SGerd Hoffmann     ohci->intr_status = 0;
348 f1ae32a1SGerd Hoffmann     ohci->intr = OHCI_INTR_MIE;
349 f1ae32a1SGerd Hoffmann 
350 f1ae32a1SGerd Hoffmann     ohci->hcca = 0;
351 f1ae32a1SGerd Hoffmann     ohci->ctrl_head = ohci->ctrl_cur = 0;
352 f1ae32a1SGerd Hoffmann     ohci->bulk_head = ohci->bulk_cur = 0;
353 f1ae32a1SGerd Hoffmann     ohci->per_cur = 0;
354 f1ae32a1SGerd Hoffmann     ohci->done = 0;
355 f1ae32a1SGerd Hoffmann     ohci->done_count = 7;
356 572a6732SBALATON Zoltan     /*
357 572a6732SBALATON Zoltan      * FSMPS is marked TBD in OCHI 1.0, what gives ffs?
358 f1ae32a1SGerd Hoffmann      * I took the value linux sets ...
359 f1ae32a1SGerd Hoffmann      */
360 f1ae32a1SGerd Hoffmann     ohci->fsmps = 0x2778;
361 f1ae32a1SGerd Hoffmann     ohci->fi = 0x2edf;
362 f1ae32a1SGerd Hoffmann     ohci->fit = 0;
363 f1ae32a1SGerd Hoffmann     ohci->frt = 0;
364 f1ae32a1SGerd Hoffmann     ohci->frame_number = 0;
365 f1ae32a1SGerd Hoffmann     ohci->pstart = 0;
366 f1ae32a1SGerd Hoffmann     ohci->lst = OHCI_LS_THRESH;
367 84d04e21SHervé Poussineau }
368 f1ae32a1SGerd Hoffmann 
ohci_hard_reset(OHCIState * ohci)369 34d97308SThomas Huth void ohci_hard_reset(OHCIState *ohci)
370 f1ae32a1SGerd Hoffmann {
371 84d04e21SHervé Poussineau     ohci_soft_reset(ohci);
372 84d04e21SHervé Poussineau     ohci->ctl = 0;
373 84d04e21SHervé Poussineau     ohci_roothub_reset(ohci);
374 f1ae32a1SGerd Hoffmann }
375 f1ae32a1SGerd Hoffmann 
376 f1ae32a1SGerd Hoffmann /* Get an array of dwords from main memory */
get_dwords(OHCIState * ohci,dma_addr_t addr,uint32_t * buf,int num)377 f1ae32a1SGerd Hoffmann static inline int get_dwords(OHCIState *ohci,
378 9ac6a217SDavid Gibson                              dma_addr_t addr, uint32_t *buf, int num)
379 f1ae32a1SGerd Hoffmann {
380 f1ae32a1SGerd Hoffmann     int i;
381 f1ae32a1SGerd Hoffmann 
382 f1ae32a1SGerd Hoffmann     addr += ohci->localmem_base;
383 f1ae32a1SGerd Hoffmann 
384 f1ae32a1SGerd Hoffmann     for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
385 ba06fe8aSPhilippe Mathieu-Daudé         if (dma_memory_read(ohci->as, addr,
386 ba06fe8aSPhilippe Mathieu-Daudé                             buf, sizeof(*buf), MEMTXATTRS_UNSPECIFIED)) {
387 cf66ee8eSAlexey Kardashevskiy             return -1;
388 cf66ee8eSAlexey Kardashevskiy         }
389 f1ae32a1SGerd Hoffmann         *buf = le32_to_cpu(*buf);
390 f1ae32a1SGerd Hoffmann     }
391 f1ae32a1SGerd Hoffmann 
392 cf66ee8eSAlexey Kardashevskiy     return 0;
393 f1ae32a1SGerd Hoffmann }
394 f1ae32a1SGerd Hoffmann 
395 f1ae32a1SGerd Hoffmann /* Put an array of dwords in to main memory */
put_dwords(OHCIState * ohci,dma_addr_t addr,uint32_t * buf,int num)396 f1ae32a1SGerd Hoffmann static inline int put_dwords(OHCIState *ohci,
397 9ac6a217SDavid Gibson                              dma_addr_t addr, uint32_t *buf, int num)
398 f1ae32a1SGerd Hoffmann {
399 f1ae32a1SGerd Hoffmann     int i;
400 f1ae32a1SGerd Hoffmann 
401 f1ae32a1SGerd Hoffmann     addr += ohci->localmem_base;
402 f1ae32a1SGerd Hoffmann 
403 f1ae32a1SGerd Hoffmann     for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
404 f1ae32a1SGerd Hoffmann         uint32_t tmp = cpu_to_le32(*buf);
405 ba06fe8aSPhilippe Mathieu-Daudé         if (dma_memory_write(ohci->as, addr,
406 ba06fe8aSPhilippe Mathieu-Daudé                              &tmp, sizeof(tmp), MEMTXATTRS_UNSPECIFIED)) {
407 cf66ee8eSAlexey Kardashevskiy             return -1;
408 cf66ee8eSAlexey Kardashevskiy         }
409 f1ae32a1SGerd Hoffmann     }
410 f1ae32a1SGerd Hoffmann 
411 cf66ee8eSAlexey Kardashevskiy     return 0;
412 f1ae32a1SGerd Hoffmann }
413 f1ae32a1SGerd Hoffmann 
414 f1ae32a1SGerd Hoffmann /* Get an array of words from main memory */
get_words(OHCIState * ohci,dma_addr_t addr,uint16_t * buf,int num)415 f1ae32a1SGerd Hoffmann static inline int get_words(OHCIState *ohci,
416 9ac6a217SDavid Gibson                             dma_addr_t addr, uint16_t *buf, int num)
417 f1ae32a1SGerd Hoffmann {
418 f1ae32a1SGerd Hoffmann     int i;
419 f1ae32a1SGerd Hoffmann 
420 f1ae32a1SGerd Hoffmann     addr += ohci->localmem_base;
421 f1ae32a1SGerd Hoffmann 
422 f1ae32a1SGerd Hoffmann     for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
423 ba06fe8aSPhilippe Mathieu-Daudé         if (dma_memory_read(ohci->as, addr,
424 ba06fe8aSPhilippe Mathieu-Daudé                             buf, sizeof(*buf), MEMTXATTRS_UNSPECIFIED)) {
425 cf66ee8eSAlexey Kardashevskiy             return -1;
426 cf66ee8eSAlexey Kardashevskiy         }
427 f1ae32a1SGerd Hoffmann         *buf = le16_to_cpu(*buf);
428 f1ae32a1SGerd Hoffmann     }
429 f1ae32a1SGerd Hoffmann 
430 cf66ee8eSAlexey Kardashevskiy     return 0;
431 f1ae32a1SGerd Hoffmann }
432 f1ae32a1SGerd Hoffmann 
433 f1ae32a1SGerd Hoffmann /* Put an array of words in to main memory */
put_words(OHCIState * ohci,dma_addr_t addr,uint16_t * buf,int num)434 f1ae32a1SGerd Hoffmann static inline int put_words(OHCIState *ohci,
435 9ac6a217SDavid Gibson                             dma_addr_t addr, uint16_t *buf, int num)
436 f1ae32a1SGerd Hoffmann {
437 f1ae32a1SGerd Hoffmann     int i;
438 f1ae32a1SGerd Hoffmann 
439 f1ae32a1SGerd Hoffmann     addr += ohci->localmem_base;
440 f1ae32a1SGerd Hoffmann 
441 f1ae32a1SGerd Hoffmann     for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
442 f1ae32a1SGerd Hoffmann         uint16_t tmp = cpu_to_le16(*buf);
443 ba06fe8aSPhilippe Mathieu-Daudé         if (dma_memory_write(ohci->as, addr,
444 ba06fe8aSPhilippe Mathieu-Daudé                              &tmp, sizeof(tmp), MEMTXATTRS_UNSPECIFIED)) {
445 cf66ee8eSAlexey Kardashevskiy             return -1;
446 cf66ee8eSAlexey Kardashevskiy         }
447 f1ae32a1SGerd Hoffmann     }
448 f1ae32a1SGerd Hoffmann 
449 cf66ee8eSAlexey Kardashevskiy     return 0;
450 f1ae32a1SGerd Hoffmann }
451 f1ae32a1SGerd Hoffmann 
ohci_read_ed(OHCIState * ohci,dma_addr_t addr,struct ohci_ed * ed)452 f1ae32a1SGerd Hoffmann static inline int ohci_read_ed(OHCIState *ohci,
453 9ac6a217SDavid Gibson                                dma_addr_t addr, struct ohci_ed *ed)
454 f1ae32a1SGerd Hoffmann {
455 f1ae32a1SGerd Hoffmann     return get_dwords(ohci, addr, (uint32_t *)ed, sizeof(*ed) >> 2);
456 f1ae32a1SGerd Hoffmann }
457 f1ae32a1SGerd Hoffmann 
ohci_read_td(OHCIState * ohci,dma_addr_t addr,struct ohci_td * td)458 f1ae32a1SGerd Hoffmann static inline int ohci_read_td(OHCIState *ohci,
459 9ac6a217SDavid Gibson                                dma_addr_t addr, struct ohci_td *td)
460 f1ae32a1SGerd Hoffmann {
461 f1ae32a1SGerd Hoffmann     return get_dwords(ohci, addr, (uint32_t *)td, sizeof(*td) >> 2);
462 f1ae32a1SGerd Hoffmann }
463 f1ae32a1SGerd Hoffmann 
ohci_read_iso_td(OHCIState * ohci,dma_addr_t addr,struct ohci_iso_td * td)464 f1ae32a1SGerd Hoffmann static inline int ohci_read_iso_td(OHCIState *ohci,
465 9ac6a217SDavid Gibson                                    dma_addr_t addr, struct ohci_iso_td *td)
466 f1ae32a1SGerd Hoffmann {
467 cf66ee8eSAlexey Kardashevskiy     return get_dwords(ohci, addr, (uint32_t *)td, 4) ||
468 cf66ee8eSAlexey Kardashevskiy            get_words(ohci, addr + 16, td->offset, 8);
469 f1ae32a1SGerd Hoffmann }
470 f1ae32a1SGerd Hoffmann 
ohci_read_hcca(OHCIState * ohci,dma_addr_t addr,struct ohci_hcca * hcca)471 f1ae32a1SGerd Hoffmann static inline int ohci_read_hcca(OHCIState *ohci,
472 9ac6a217SDavid Gibson                                  dma_addr_t addr, struct ohci_hcca *hcca)
473 f1ae32a1SGerd Hoffmann {
474 ba06fe8aSPhilippe Mathieu-Daudé     return dma_memory_read(ohci->as, addr + ohci->localmem_base, hcca,
475 ba06fe8aSPhilippe Mathieu-Daudé                            sizeof(*hcca), MEMTXATTRS_UNSPECIFIED);
476 f1ae32a1SGerd Hoffmann }
477 f1ae32a1SGerd Hoffmann 
ohci_put_ed(OHCIState * ohci,dma_addr_t addr,struct ohci_ed * ed)478 f1ae32a1SGerd Hoffmann static inline int ohci_put_ed(OHCIState *ohci,
479 9ac6a217SDavid Gibson                               dma_addr_t addr, struct ohci_ed *ed)
480 f1ae32a1SGerd Hoffmann {
481 572a6732SBALATON Zoltan     /*
482 572a6732SBALATON Zoltan      * ed->tail is under control of the HCD.
483 86e18caeSWei Yang      * Since just ed->head is changed by HC, just write back this
484 86e18caeSWei Yang      */
485 86e18caeSWei Yang     return put_dwords(ohci, addr + ED_WBACK_OFFSET,
486 86e18caeSWei Yang                       (uint32_t *)((char *)ed + ED_WBACK_OFFSET),
487 86e18caeSWei Yang                       ED_WBACK_SIZE >> 2);
488 f1ae32a1SGerd Hoffmann }
489 f1ae32a1SGerd Hoffmann 
ohci_put_td(OHCIState * ohci,dma_addr_t addr,struct ohci_td * td)490 f1ae32a1SGerd Hoffmann static inline int ohci_put_td(OHCIState *ohci,
491 9ac6a217SDavid Gibson                               dma_addr_t addr, struct ohci_td *td)
492 f1ae32a1SGerd Hoffmann {
493 f1ae32a1SGerd Hoffmann     return put_dwords(ohci, addr, (uint32_t *)td, sizeof(*td) >> 2);
494 f1ae32a1SGerd Hoffmann }
495 f1ae32a1SGerd Hoffmann 
ohci_put_iso_td(OHCIState * ohci,dma_addr_t addr,struct ohci_iso_td * td)496 f1ae32a1SGerd Hoffmann static inline int ohci_put_iso_td(OHCIState *ohci,
497 9ac6a217SDavid Gibson                                   dma_addr_t addr, struct ohci_iso_td *td)
498 f1ae32a1SGerd Hoffmann {
499 cae7f29cSJack Un     return put_dwords(ohci, addr, (uint32_t *)td, 4) ||
500 cae7f29cSJack Un            put_words(ohci, addr + 16, td->offset, 8);
501 f1ae32a1SGerd Hoffmann }
502 f1ae32a1SGerd Hoffmann 
ohci_put_hcca(OHCIState * ohci,dma_addr_t addr,struct ohci_hcca * hcca)503 f1ae32a1SGerd Hoffmann static inline int ohci_put_hcca(OHCIState *ohci,
504 9ac6a217SDavid Gibson                                 dma_addr_t addr, struct ohci_hcca *hcca)
505 f1ae32a1SGerd Hoffmann {
506 cf66ee8eSAlexey Kardashevskiy     return dma_memory_write(ohci->as,
507 9ac6a217SDavid Gibson                             addr + ohci->localmem_base + HCCA_WRITEBACK_OFFSET,
508 86e18caeSWei Yang                             (char *)hcca + HCCA_WRITEBACK_OFFSET,
509 ba06fe8aSPhilippe Mathieu-Daudé                             HCCA_WRITEBACK_SIZE, MEMTXATTRS_UNSPECIFIED);
510 f1ae32a1SGerd Hoffmann }
511 f1ae32a1SGerd Hoffmann 
512 f1ae32a1SGerd Hoffmann /* Read/Write the contents of a TD from/to main memory.  */
ohci_copy_td(OHCIState * ohci,struct ohci_td * td,uint8_t * buf,int len,DMADirection dir)513 cf66ee8eSAlexey Kardashevskiy static int ohci_copy_td(OHCIState *ohci, struct ohci_td *td,
514 9ac6a217SDavid Gibson                         uint8_t *buf, int len, DMADirection dir)
515 f1ae32a1SGerd Hoffmann {
516 9ac6a217SDavid Gibson     dma_addr_t ptr, n;
517 f1ae32a1SGerd Hoffmann 
518 f1ae32a1SGerd Hoffmann     ptr = td->cbp;
519 f1ae32a1SGerd Hoffmann     n = 0x1000 - (ptr & 0xfff);
520 1e58e7a0SBALATON Zoltan     if (n > len) {
521 f1ae32a1SGerd Hoffmann         n = len;
522 1e58e7a0SBALATON Zoltan     }
523 23faf569SPhilippe Mathieu-Daudé     if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
524 23faf569SPhilippe Mathieu-Daudé                       n, dir, MEMTXATTRS_UNSPECIFIED)) {
525 cf66ee8eSAlexey Kardashevskiy         return -1;
526 cf66ee8eSAlexey Kardashevskiy     }
527 cf66ee8eSAlexey Kardashevskiy     if (n == len) {
528 cf66ee8eSAlexey Kardashevskiy         return 0;
529 cf66ee8eSAlexey Kardashevskiy     }
530 f1ae32a1SGerd Hoffmann     ptr = td->be & ~0xfffu;
531 f1ae32a1SGerd Hoffmann     buf += n;
532 cf66ee8eSAlexey Kardashevskiy     if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
533 23faf569SPhilippe Mathieu-Daudé                       len - n, dir, MEMTXATTRS_UNSPECIFIED)) {
534 cf66ee8eSAlexey Kardashevskiy         return -1;
535 cf66ee8eSAlexey Kardashevskiy     }
536 cf66ee8eSAlexey Kardashevskiy     return 0;
537 f1ae32a1SGerd Hoffmann }
538 f1ae32a1SGerd Hoffmann 
539 f1ae32a1SGerd Hoffmann /* Read/Write the contents of an ISO TD from/to main memory.  */
ohci_copy_iso_td(OHCIState * ohci,uint32_t start_addr,uint32_t end_addr,uint8_t * buf,int len,DMADirection dir)540 cf66ee8eSAlexey Kardashevskiy static int ohci_copy_iso_td(OHCIState *ohci,
541 f1ae32a1SGerd Hoffmann                             uint32_t start_addr, uint32_t end_addr,
542 9ac6a217SDavid Gibson                             uint8_t *buf, int len, DMADirection dir)
543 f1ae32a1SGerd Hoffmann {
544 9ac6a217SDavid Gibson     dma_addr_t ptr, n;
545 f1ae32a1SGerd Hoffmann 
546 f1ae32a1SGerd Hoffmann     ptr = start_addr;
547 f1ae32a1SGerd Hoffmann     n = 0x1000 - (ptr & 0xfff);
548 1e58e7a0SBALATON Zoltan     if (n > len) {
549 f1ae32a1SGerd Hoffmann         n = len;
550 1e58e7a0SBALATON Zoltan     }
551 23faf569SPhilippe Mathieu-Daudé     if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
552 23faf569SPhilippe Mathieu-Daudé                       n, dir, MEMTXATTRS_UNSPECIFIED)) {
553 cf66ee8eSAlexey Kardashevskiy         return -1;
554 cf66ee8eSAlexey Kardashevskiy     }
555 cf66ee8eSAlexey Kardashevskiy     if (n == len) {
556 cf66ee8eSAlexey Kardashevskiy         return 0;
557 cf66ee8eSAlexey Kardashevskiy     }
558 f1ae32a1SGerd Hoffmann     ptr = end_addr & ~0xfffu;
559 f1ae32a1SGerd Hoffmann     buf += n;
560 cf66ee8eSAlexey Kardashevskiy     if (dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf,
561 23faf569SPhilippe Mathieu-Daudé                       len - n, dir, MEMTXATTRS_UNSPECIFIED)) {
562 cf66ee8eSAlexey Kardashevskiy         return -1;
563 cf66ee8eSAlexey Kardashevskiy     }
564 cf66ee8eSAlexey Kardashevskiy     return 0;
565 f1ae32a1SGerd Hoffmann }
566 f1ae32a1SGerd Hoffmann 
567 f1ae32a1SGerd Hoffmann #define USUB(a, b) ((int16_t)((uint16_t)(a) - (uint16_t)(b)))
568 f1ae32a1SGerd Hoffmann 
ohci_service_iso_td(OHCIState * ohci,struct ohci_ed * ed)569 3a4d06f2SBALATON Zoltan static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed)
570 f1ae32a1SGerd Hoffmann {
571 f1ae32a1SGerd Hoffmann     int dir;
572 f1ae32a1SGerd Hoffmann     size_t len = 0;
573 f1ae32a1SGerd Hoffmann     const char *str = NULL;
574 f1ae32a1SGerd Hoffmann     int pid;
575 f1ae32a1SGerd Hoffmann     int ret;
576 f1ae32a1SGerd Hoffmann     int i;
577 f1ae32a1SGerd Hoffmann     USBDevice *dev;
578 f1ae32a1SGerd Hoffmann     USBEndpoint *ep;
579 3a4d06f2SBALATON Zoltan     USBPacket *pkt;
580 3a4d06f2SBALATON Zoltan     uint8_t buf[8192];
581 3a4d06f2SBALATON Zoltan     bool int_req;
582 f1ae32a1SGerd Hoffmann     struct ohci_iso_td iso_td;
583 f1ae32a1SGerd Hoffmann     uint32_t addr;
584 f1ae32a1SGerd Hoffmann     uint16_t starting_frame;
585 f1ae32a1SGerd Hoffmann     int16_t relative_frame_number;
586 f1ae32a1SGerd Hoffmann     int frame_count;
587 f1ae32a1SGerd Hoffmann     uint32_t start_offset, next_offset, end_offset = 0;
588 f1ae32a1SGerd Hoffmann     uint32_t start_addr, end_addr;
589 f1ae32a1SGerd Hoffmann 
590 f1ae32a1SGerd Hoffmann     addr = ed->head & OHCI_DPTR_MASK;
591 f1ae32a1SGerd Hoffmann 
592 d8c2e6f2SQiang Liu     if (addr == 0) {
593 d8c2e6f2SQiang Liu         ohci_die(ohci);
594 d8c2e6f2SQiang Liu         return 1;
595 d8c2e6f2SQiang Liu     }
596 d8c2e6f2SQiang Liu 
597 cf66ee8eSAlexey Kardashevskiy     if (ohci_read_iso_td(ohci, addr, &iso_td)) {
598 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_read_failed(addr);
599 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
600 26f670a2SLi Qiang         return 1;
601 f1ae32a1SGerd Hoffmann     }
602 f1ae32a1SGerd Hoffmann 
603 f1ae32a1SGerd Hoffmann     starting_frame = OHCI_BM(iso_td.flags, TD_SF);
604 f1ae32a1SGerd Hoffmann     frame_count = OHCI_BM(iso_td.flags, TD_FC);
605 f1ae32a1SGerd Hoffmann     relative_frame_number = USUB(ohci->frame_number, starting_frame);
606 f1ae32a1SGerd Hoffmann 
607 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_iso_td_head(
608 f1ae32a1SGerd Hoffmann            ed->head & OHCI_DPTR_MASK, ed->tail & OHCI_DPTR_MASK,
609 f1ae32a1SGerd Hoffmann            iso_td.flags, iso_td.bp, iso_td.next, iso_td.be,
610 f1ae32a1SGerd Hoffmann            ohci->frame_number, starting_frame,
611 bc0d104cSAlex Bennée            frame_count, relative_frame_number);
612 3af8f177SAlexey Kardashevskiy     trace_usb_ohci_iso_td_head_offset(
613 3af8f177SAlexey Kardashevskiy            iso_td.offset[0], iso_td.offset[1],
614 3af8f177SAlexey Kardashevskiy            iso_td.offset[2], iso_td.offset[3],
615 3af8f177SAlexey Kardashevskiy            iso_td.offset[4], iso_td.offset[5],
616 3af8f177SAlexey Kardashevskiy            iso_td.offset[6], iso_td.offset[7]);
617 f1ae32a1SGerd Hoffmann 
618 f1ae32a1SGerd Hoffmann     if (relative_frame_number < 0) {
619 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_relative_frame_number_neg(relative_frame_number);
620 f1ae32a1SGerd Hoffmann         return 1;
621 f1ae32a1SGerd Hoffmann     } else if (relative_frame_number > frame_count) {
622 572a6732SBALATON Zoltan         /*
623 572a6732SBALATON Zoltan          * ISO TD expired - retire the TD to the Done Queue and continue with
624 572a6732SBALATON Zoltan          * the next ISO TD of the same ED
625 572a6732SBALATON Zoltan          */
626 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_relative_frame_number_big(relative_frame_number,
627 f1ae32a1SGerd Hoffmann                                                         frame_count);
628 1be90ebeSPrasad J Pandit         if (OHCI_CC_DATAOVERRUN == OHCI_BM(iso_td.flags, TD_CC)) {
629 1be90ebeSPrasad J Pandit             /* avoid infinite loop */
630 1be90ebeSPrasad J Pandit             return 1;
631 1be90ebeSPrasad J Pandit         }
632 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
633 f1ae32a1SGerd Hoffmann         ed->head &= ~OHCI_DPTR_MASK;
634 f1ae32a1SGerd Hoffmann         ed->head |= (iso_td.next & OHCI_DPTR_MASK);
635 f1ae32a1SGerd Hoffmann         iso_td.next = ohci->done;
636 f1ae32a1SGerd Hoffmann         ohci->done = addr;
637 f1ae32a1SGerd Hoffmann         i = OHCI_BM(iso_td.flags, TD_DI);
638 1e58e7a0SBALATON Zoltan         if (i < ohci->done_count) {
639 f1ae32a1SGerd Hoffmann             ohci->done_count = i;
640 1e58e7a0SBALATON Zoltan         }
641 cf66ee8eSAlexey Kardashevskiy         if (ohci_put_iso_td(ohci, addr, &iso_td)) {
642 cf66ee8eSAlexey Kardashevskiy             ohci_die(ohci);
643 cf66ee8eSAlexey Kardashevskiy             return 1;
644 cf66ee8eSAlexey Kardashevskiy         }
645 f1ae32a1SGerd Hoffmann         return 0;
646 f1ae32a1SGerd Hoffmann     }
647 f1ae32a1SGerd Hoffmann 
648 f1ae32a1SGerd Hoffmann     dir = OHCI_BM(ed->flags, ED_D);
649 f1ae32a1SGerd Hoffmann     switch (dir) {
650 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_IN:
651 f1ae32a1SGerd Hoffmann         str = "in";
652 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_IN;
653 f1ae32a1SGerd Hoffmann         break;
654 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_OUT:
655 f1ae32a1SGerd Hoffmann         str = "out";
656 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_OUT;
657 f1ae32a1SGerd Hoffmann         break;
658 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_SETUP:
659 f1ae32a1SGerd Hoffmann         str = "setup";
660 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_SETUP;
661 f1ae32a1SGerd Hoffmann         break;
662 f1ae32a1SGerd Hoffmann     default:
663 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_bad_direction(dir);
664 f1ae32a1SGerd Hoffmann         return 1;
665 f1ae32a1SGerd Hoffmann     }
666 f1ae32a1SGerd Hoffmann 
667 f1ae32a1SGerd Hoffmann     if (!iso_td.bp || !iso_td.be) {
668 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_bad_bp_be(iso_td.bp, iso_td.be);
669 f1ae32a1SGerd Hoffmann         return 1;
670 f1ae32a1SGerd Hoffmann     }
671 f1ae32a1SGerd Hoffmann 
672 f1ae32a1SGerd Hoffmann     start_offset = iso_td.offset[relative_frame_number];
673 1328fe0cSPrasad J Pandit     if (relative_frame_number < frame_count) {
674 f1ae32a1SGerd Hoffmann         next_offset = iso_td.offset[relative_frame_number + 1];
675 1328fe0cSPrasad J Pandit     } else {
676 1328fe0cSPrasad J Pandit         next_offset = iso_td.be;
677 1328fe0cSPrasad J Pandit     }
678 f1ae32a1SGerd Hoffmann 
679 f1ae32a1SGerd Hoffmann     if (!(OHCI_BM(start_offset, TD_PSW_CC) & 0xe) ||
680 f1ae32a1SGerd Hoffmann         ((relative_frame_number < frame_count) &&
681 f1ae32a1SGerd Hoffmann          !(OHCI_BM(next_offset, TD_PSW_CC) & 0xe))) {
682 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_bad_cc_not_accessed(start_offset, next_offset);
683 f1ae32a1SGerd Hoffmann         return 1;
684 f1ae32a1SGerd Hoffmann     }
685 f1ae32a1SGerd Hoffmann 
686 f1ae32a1SGerd Hoffmann     if ((relative_frame_number < frame_count) && (start_offset > next_offset)) {
687 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_iso_td_bad_cc_overrun(start_offset, next_offset);
688 f1ae32a1SGerd Hoffmann         return 1;
689 f1ae32a1SGerd Hoffmann     }
690 f1ae32a1SGerd Hoffmann 
691 f1ae32a1SGerd Hoffmann     if ((start_offset & 0x1000) == 0) {
692 f1ae32a1SGerd Hoffmann         start_addr = (iso_td.bp & OHCI_PAGE_MASK) |
693 f1ae32a1SGerd Hoffmann             (start_offset & OHCI_OFFSET_MASK);
694 f1ae32a1SGerd Hoffmann     } else {
695 f1ae32a1SGerd Hoffmann         start_addr = (iso_td.be & OHCI_PAGE_MASK) |
696 f1ae32a1SGerd Hoffmann             (start_offset & OHCI_OFFSET_MASK);
697 f1ae32a1SGerd Hoffmann     }
698 f1ae32a1SGerd Hoffmann 
699 f1ae32a1SGerd Hoffmann     if (relative_frame_number < frame_count) {
700 f1ae32a1SGerd Hoffmann         end_offset = next_offset - 1;
701 f1ae32a1SGerd Hoffmann         if ((end_offset & 0x1000) == 0) {
702 f1ae32a1SGerd Hoffmann             end_addr = (iso_td.bp & OHCI_PAGE_MASK) |
703 f1ae32a1SGerd Hoffmann                 (end_offset & OHCI_OFFSET_MASK);
704 f1ae32a1SGerd Hoffmann         } else {
705 f1ae32a1SGerd Hoffmann             end_addr = (iso_td.be & OHCI_PAGE_MASK) |
706 f1ae32a1SGerd Hoffmann                 (end_offset & OHCI_OFFSET_MASK);
707 f1ae32a1SGerd Hoffmann         }
708 f1ae32a1SGerd Hoffmann     } else {
709 f1ae32a1SGerd Hoffmann         /* Last packet in the ISO TD */
710 1328fe0cSPrasad J Pandit         end_addr = next_offset;
711 1328fe0cSPrasad J Pandit     }
712 1328fe0cSPrasad J Pandit 
713 1328fe0cSPrasad J Pandit     if (start_addr > end_addr) {
714 1328fe0cSPrasad J Pandit         trace_usb_ohci_iso_td_bad_cc_overrun(start_addr, end_addr);
715 1328fe0cSPrasad J Pandit         return 1;
716 f1ae32a1SGerd Hoffmann     }
717 f1ae32a1SGerd Hoffmann 
718 f1ae32a1SGerd Hoffmann     if ((start_addr & OHCI_PAGE_MASK) != (end_addr & OHCI_PAGE_MASK)) {
719 f1ae32a1SGerd Hoffmann         len = (end_addr & OHCI_OFFSET_MASK) + 0x1001
720 f1ae32a1SGerd Hoffmann             - (start_addr & OHCI_OFFSET_MASK);
721 f1ae32a1SGerd Hoffmann     } else {
722 f1ae32a1SGerd Hoffmann         len = end_addr - start_addr + 1;
723 f1ae32a1SGerd Hoffmann     }
724 3a4d06f2SBALATON Zoltan     if (len > sizeof(buf)) {
725 3a4d06f2SBALATON Zoltan         len = sizeof(buf);
726 1328fe0cSPrasad J Pandit     }
727 f1ae32a1SGerd Hoffmann 
728 f1ae32a1SGerd Hoffmann     if (len && dir != OHCI_TD_DIR_IN) {
729 3a4d06f2SBALATON Zoltan         if (ohci_copy_iso_td(ohci, start_addr, end_addr, buf, len,
730 cf66ee8eSAlexey Kardashevskiy                              DMA_DIRECTION_TO_DEVICE)) {
731 cf66ee8eSAlexey Kardashevskiy             ohci_die(ohci);
732 cf66ee8eSAlexey Kardashevskiy             return 1;
733 cf66ee8eSAlexey Kardashevskiy         }
734 f1ae32a1SGerd Hoffmann     }
735 f1ae32a1SGerd Hoffmann 
736 f1ae32a1SGerd Hoffmann     dev = ohci_find_device(ohci, OHCI_BM(ed->flags, ED_FA));
737 42340fc3SLiam Merwick     if (dev == NULL) {
738 42340fc3SLiam Merwick         trace_usb_ohci_td_dev_error();
739 42340fc3SLiam Merwick         return 1;
740 42340fc3SLiam Merwick     }
741 f1ae32a1SGerd Hoffmann     ep = usb_ep_get(dev, pid, OHCI_BM(ed->flags, ED_EN));
742 3a4d06f2SBALATON Zoltan     pkt = g_new0(USBPacket, 1);
743 3a4d06f2SBALATON Zoltan     usb_packet_init(pkt);
744 3a4d06f2SBALATON Zoltan     int_req = relative_frame_number == frame_count &&
745 3a4d06f2SBALATON Zoltan               OHCI_BM(iso_td.flags, TD_DI) == 0;
746 3a4d06f2SBALATON Zoltan     usb_packet_setup(pkt, pid, ep, 0, addr, false, int_req);
747 3a4d06f2SBALATON Zoltan     usb_packet_addbuf(pkt, buf, len);
748 3a4d06f2SBALATON Zoltan     usb_handle_packet(dev, pkt);
749 3a4d06f2SBALATON Zoltan     if (pkt->status == USB_RET_ASYNC) {
750 36dfe324SHans de Goede         usb_device_flush_ep_queue(dev, ep);
751 3a4d06f2SBALATON Zoltan         g_free(pkt);
752 f1ae32a1SGerd Hoffmann         return 1;
753 f1ae32a1SGerd Hoffmann     }
754 3a4d06f2SBALATON Zoltan     if (pkt->status == USB_RET_SUCCESS) {
755 3a4d06f2SBALATON Zoltan         ret = pkt->actual_length;
756 9a77a0f5SHans de Goede     } else {
757 3a4d06f2SBALATON Zoltan         ret = pkt->status;
758 9a77a0f5SHans de Goede     }
759 3a4d06f2SBALATON Zoltan     g_free(pkt);
760 f1ae32a1SGerd Hoffmann 
761 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_iso_td_so(start_offset, end_offset, start_addr, end_addr,
762 dc1f5988SAlexey Kardashevskiy                              str, len, ret);
763 f1ae32a1SGerd Hoffmann 
764 f1ae32a1SGerd Hoffmann     /* Writeback */
765 f1ae32a1SGerd Hoffmann     if (dir == OHCI_TD_DIR_IN && ret >= 0 && ret <= len) {
766 f1ae32a1SGerd Hoffmann         /* IN transfer succeeded */
767 3a4d06f2SBALATON Zoltan         if (ohci_copy_iso_td(ohci, start_addr, end_addr, buf, ret,
768 cf66ee8eSAlexey Kardashevskiy                              DMA_DIRECTION_FROM_DEVICE)) {
769 cf66ee8eSAlexey Kardashevskiy             ohci_die(ohci);
770 cf66ee8eSAlexey Kardashevskiy             return 1;
771 cf66ee8eSAlexey Kardashevskiy         }
772 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
773 f1ae32a1SGerd Hoffmann                     OHCI_CC_NOERROR);
774 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE, ret);
775 f1ae32a1SGerd Hoffmann     } else if (dir == OHCI_TD_DIR_OUT && ret == len) {
776 f1ae32a1SGerd Hoffmann         /* OUT transfer succeeded */
777 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
778 f1ae32a1SGerd Hoffmann                     OHCI_CC_NOERROR);
779 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE, 0);
780 f1ae32a1SGerd Hoffmann     } else {
781 f1ae32a1SGerd Hoffmann         if (ret > (ssize_t) len) {
782 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_iso_td_data_overrun(ret, len);
783 f1ae32a1SGerd Hoffmann             OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
784 f1ae32a1SGerd Hoffmann                         OHCI_CC_DATAOVERRUN);
785 f1ae32a1SGerd Hoffmann             OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
786 f1ae32a1SGerd Hoffmann                         len);
787 f1ae32a1SGerd Hoffmann         } else if (ret >= 0) {
788 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_iso_td_data_underrun(ret);
789 f1ae32a1SGerd Hoffmann             OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
790 f1ae32a1SGerd Hoffmann                         OHCI_CC_DATAUNDERRUN);
791 f1ae32a1SGerd Hoffmann         } else {
792 f1ae32a1SGerd Hoffmann             switch (ret) {
793 f1ae32a1SGerd Hoffmann             case USB_RET_IOERROR:
794 f1ae32a1SGerd Hoffmann             case USB_RET_NODEV:
795 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
796 f1ae32a1SGerd Hoffmann                             OHCI_CC_DEVICENOTRESPONDING);
797 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
798 f1ae32a1SGerd Hoffmann                             0);
799 f1ae32a1SGerd Hoffmann                 break;
800 f1ae32a1SGerd Hoffmann             case USB_RET_NAK:
801 f1ae32a1SGerd Hoffmann             case USB_RET_STALL:
802 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_iso_td_nak(ret);
803 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
804 f1ae32a1SGerd Hoffmann                             OHCI_CC_STALL);
805 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
806 f1ae32a1SGerd Hoffmann                             0);
807 f1ae32a1SGerd Hoffmann                 break;
808 f1ae32a1SGerd Hoffmann             default:
809 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_iso_td_bad_response(ret);
810 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
811 f1ae32a1SGerd Hoffmann                             OHCI_CC_UNDEXPETEDPID);
812 f1ae32a1SGerd Hoffmann                 break;
813 f1ae32a1SGerd Hoffmann             }
814 f1ae32a1SGerd Hoffmann         }
815 f1ae32a1SGerd Hoffmann     }
816 f1ae32a1SGerd Hoffmann 
817 f1ae32a1SGerd Hoffmann     if (relative_frame_number == frame_count) {
818 f1ae32a1SGerd Hoffmann         /* Last data packet of ISO TD - retire the TD to the Done Queue */
819 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_NOERROR);
820 f1ae32a1SGerd Hoffmann         ed->head &= ~OHCI_DPTR_MASK;
821 f1ae32a1SGerd Hoffmann         ed->head |= (iso_td.next & OHCI_DPTR_MASK);
822 f1ae32a1SGerd Hoffmann         iso_td.next = ohci->done;
823 f1ae32a1SGerd Hoffmann         ohci->done = addr;
824 f1ae32a1SGerd Hoffmann         i = OHCI_BM(iso_td.flags, TD_DI);
825 1e58e7a0SBALATON Zoltan         if (i < ohci->done_count) {
826 f1ae32a1SGerd Hoffmann             ohci->done_count = i;
827 f1ae32a1SGerd Hoffmann         }
828 1e58e7a0SBALATON Zoltan     }
829 cf66ee8eSAlexey Kardashevskiy     if (ohci_put_iso_td(ohci, addr, &iso_td)) {
830 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
831 cf66ee8eSAlexey Kardashevskiy     }
832 f1ae32a1SGerd Hoffmann     return 1;
833 f1ae32a1SGerd Hoffmann }
834 f1ae32a1SGerd Hoffmann 
835 29d81e42SPhilippe Mathieu-Daudé #define HEX_CHAR_PER_LINE 16
836 29d81e42SPhilippe Mathieu-Daudé 
ohci_td_pkt(const char * msg,const uint8_t * buf,size_t len)837 dc1f5988SAlexey Kardashevskiy static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
838 dc1f5988SAlexey Kardashevskiy {
839 d87aa138SStefan Hajnoczi     bool print16;
840 d87aa138SStefan Hajnoczi     bool printall;
841 dc1f5988SAlexey Kardashevskiy     int i;
842 29d81e42SPhilippe Mathieu-Daudé     char tmp[3 * HEX_CHAR_PER_LINE + 1];
843 dc1f5988SAlexey Kardashevskiy     char *p = tmp;
844 dc1f5988SAlexey Kardashevskiy 
845 d87aa138SStefan Hajnoczi     print16 = !!trace_event_get_state_backends(TRACE_USB_OHCI_TD_PKT_SHORT);
846 d87aa138SStefan Hajnoczi     printall = !!trace_event_get_state_backends(TRACE_USB_OHCI_TD_PKT_FULL);
847 d87aa138SStefan Hajnoczi 
848 dc1f5988SAlexey Kardashevskiy     if (!printall && !print16) {
849 dc1f5988SAlexey Kardashevskiy         return;
850 dc1f5988SAlexey Kardashevskiy     }
851 dc1f5988SAlexey Kardashevskiy 
852 dc1f5988SAlexey Kardashevskiy     for (i = 0; ; i++) {
853 29d81e42SPhilippe Mathieu-Daudé         if (i && (!(i % HEX_CHAR_PER_LINE) || (i == len))) {
854 dc1f5988SAlexey Kardashevskiy             if (!printall) {
855 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_pkt_short(msg, tmp);
856 dc1f5988SAlexey Kardashevskiy                 break;
857 dc1f5988SAlexey Kardashevskiy             }
858 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_td_pkt_full(msg, tmp);
859 dc1f5988SAlexey Kardashevskiy             p = tmp;
860 dc1f5988SAlexey Kardashevskiy             *p = 0;
861 dc1f5988SAlexey Kardashevskiy         }
862 dc1f5988SAlexey Kardashevskiy         if (i == len) {
863 dc1f5988SAlexey Kardashevskiy             break;
864 dc1f5988SAlexey Kardashevskiy         }
865 dc1f5988SAlexey Kardashevskiy 
866 dc1f5988SAlexey Kardashevskiy         p += sprintf(p, " %.2x", buf[i]);
867 dc1f5988SAlexey Kardashevskiy     }
868 dc1f5988SAlexey Kardashevskiy }
869 dc1f5988SAlexey Kardashevskiy 
870 572a6732SBALATON Zoltan /*
871 572a6732SBALATON Zoltan  * Service a transport descriptor.
872 572a6732SBALATON Zoltan  * Returns nonzero to terminate processing of this endpoint.
873 572a6732SBALATON Zoltan  */
ohci_service_td(OHCIState * ohci,struct ohci_ed * ed)874 f1ae32a1SGerd Hoffmann static int ohci_service_td(OHCIState *ohci, struct ohci_ed *ed)
875 f1ae32a1SGerd Hoffmann {
876 f1ae32a1SGerd Hoffmann     int dir;
877 f1ae32a1SGerd Hoffmann     size_t len = 0, pktlen = 0;
878 f1ae32a1SGerd Hoffmann     const char *str = NULL;
879 f1ae32a1SGerd Hoffmann     int pid;
880 f1ae32a1SGerd Hoffmann     int ret;
881 f1ae32a1SGerd Hoffmann     int i;
882 f1ae32a1SGerd Hoffmann     USBDevice *dev;
883 f1ae32a1SGerd Hoffmann     USBEndpoint *ep;
884 f1ae32a1SGerd Hoffmann     struct ohci_td td;
885 f1ae32a1SGerd Hoffmann     uint32_t addr;
886 f1ae32a1SGerd Hoffmann     int flag_r;
887 f1ae32a1SGerd Hoffmann     int completion;
888 f1ae32a1SGerd Hoffmann 
889 f1ae32a1SGerd Hoffmann     addr = ed->head & OHCI_DPTR_MASK;
890 d8c2e6f2SQiang Liu     if (addr == 0) {
891 d8c2e6f2SQiang Liu         ohci_die(ohci);
892 d8c2e6f2SQiang Liu         return 1;
893 d8c2e6f2SQiang Liu     }
894 d8c2e6f2SQiang Liu 
895 f1ae32a1SGerd Hoffmann     /* See if this TD has already been submitted to the device. */
896 f1ae32a1SGerd Hoffmann     completion = (addr == ohci->async_td);
897 f1ae32a1SGerd Hoffmann     if (completion && !ohci->async_complete) {
898 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_td_skip_async();
899 f1ae32a1SGerd Hoffmann         return 1;
900 f1ae32a1SGerd Hoffmann     }
901 cf66ee8eSAlexey Kardashevskiy     if (ohci_read_td(ohci, addr, &td)) {
902 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_td_read_error(addr);
903 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
904 6ebc069dSLi Qiang         return 1;
905 f1ae32a1SGerd Hoffmann     }
906 f1ae32a1SGerd Hoffmann 
907 f1ae32a1SGerd Hoffmann     dir = OHCI_BM(ed->flags, ED_D);
908 f1ae32a1SGerd Hoffmann     switch (dir) {
909 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_OUT:
910 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_IN:
911 f1ae32a1SGerd Hoffmann         /* Same value. */
912 f1ae32a1SGerd Hoffmann         break;
913 f1ae32a1SGerd Hoffmann     default:
914 f1ae32a1SGerd Hoffmann         dir = OHCI_BM(td.flags, TD_DP);
915 f1ae32a1SGerd Hoffmann         break;
916 f1ae32a1SGerd Hoffmann     }
917 f1ae32a1SGerd Hoffmann 
918 f1ae32a1SGerd Hoffmann     switch (dir) {
919 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_IN:
920 f1ae32a1SGerd Hoffmann         str = "in";
921 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_IN;
922 f1ae32a1SGerd Hoffmann         break;
923 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_OUT:
924 f1ae32a1SGerd Hoffmann         str = "out";
925 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_OUT;
926 f1ae32a1SGerd Hoffmann         break;
927 f1ae32a1SGerd Hoffmann     case OHCI_TD_DIR_SETUP:
928 f1ae32a1SGerd Hoffmann         str = "setup";
929 f1ae32a1SGerd Hoffmann         pid = USB_TOKEN_SETUP;
930 3c3c2336SDavid Hubbard         if (OHCI_BM(ed->flags, ED_EN) > 0) {  /* setup only allowed to ep 0 */
931 3c3c2336SDavid Hubbard             trace_usb_ohci_td_bad_pid(str, ed->flags, td.flags);
932 3c3c2336SDavid Hubbard             ohci_die(ohci);
933 3c3c2336SDavid Hubbard             return 1;
934 3c3c2336SDavid Hubbard         }
935 f1ae32a1SGerd Hoffmann         break;
936 f1ae32a1SGerd Hoffmann     default:
937 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_td_bad_direction(dir);
938 f1ae32a1SGerd Hoffmann         return 1;
939 f1ae32a1SGerd Hoffmann     }
940 f1ae32a1SGerd Hoffmann     if (td.cbp && td.be) {
941 f1ae32a1SGerd Hoffmann         if ((td.cbp & 0xfffff000) != (td.be & 0xfffff000)) {
942 f1ae32a1SGerd Hoffmann             len = (td.be & 0xfff) + 0x1001 - (td.cbp & 0xfff);
943 f1ae32a1SGerd Hoffmann         } else {
944 *53aaa881SDavid Hubbard             if (td.cbp - 1 > td.be) {  /* rely on td.cbp != 0 */
945 *53aaa881SDavid Hubbard                 trace_usb_ohci_td_bad_buf(td.cbp, td.be);
946 1328fe0cSPrasad J Pandit                 ohci_die(ohci);
947 1328fe0cSPrasad J Pandit                 return 1;
948 1328fe0cSPrasad J Pandit             }
949 f1ae32a1SGerd Hoffmann             len = (td.be - td.cbp) + 1;
950 f1ae32a1SGerd Hoffmann         }
951 1328fe0cSPrasad J Pandit         if (len > sizeof(ohci->usb_buf)) {
952 1328fe0cSPrasad J Pandit             len = sizeof(ohci->usb_buf);
953 1328fe0cSPrasad J Pandit         }
954 f1ae32a1SGerd Hoffmann 
955 f1ae32a1SGerd Hoffmann         pktlen = len;
956 f1ae32a1SGerd Hoffmann         if (len && dir != OHCI_TD_DIR_IN) {
957 f1ae32a1SGerd Hoffmann             /* The endpoint may not allow us to transfer it all now */
958 f1ae32a1SGerd Hoffmann             pktlen = (ed->flags & OHCI_ED_MPS_MASK) >> OHCI_ED_MPS_SHIFT;
959 f1ae32a1SGerd Hoffmann             if (pktlen > len) {
960 f1ae32a1SGerd Hoffmann                 pktlen = len;
961 f1ae32a1SGerd Hoffmann             }
962 f1ae32a1SGerd Hoffmann             if (!completion) {
963 cf66ee8eSAlexey Kardashevskiy                 if (ohci_copy_td(ohci, &td, ohci->usb_buf, pktlen,
964 cf66ee8eSAlexey Kardashevskiy                                  DMA_DIRECTION_TO_DEVICE)) {
965 cf66ee8eSAlexey Kardashevskiy                     ohci_die(ohci);
966 cf66ee8eSAlexey Kardashevskiy                 }
967 f1ae32a1SGerd Hoffmann             }
968 f1ae32a1SGerd Hoffmann         }
969 f1ae32a1SGerd Hoffmann     }
970 f1ae32a1SGerd Hoffmann 
971 f1ae32a1SGerd Hoffmann     flag_r = (td.flags & OHCI_TD_R) != 0;
972 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_td_pkt_hdr(addr, (int64_t)pktlen, (int64_t)len, str,
973 dc1f5988SAlexey Kardashevskiy                               flag_r, td.cbp, td.be);
974 dc1f5988SAlexey Kardashevskiy     ohci_td_pkt("OUT", ohci->usb_buf, pktlen);
975 f1ae32a1SGerd Hoffmann 
976 f1ae32a1SGerd Hoffmann     if (completion) {
977 f1ae32a1SGerd Hoffmann         ohci->async_td = 0;
978 69e25d26SAlexey Kardashevskiy         ohci->async_complete = false;
979 f1ae32a1SGerd Hoffmann     } else {
980 f1ae32a1SGerd Hoffmann         dev = ohci_find_device(ohci, OHCI_BM(ed->flags, ED_FA));
981 42340fc3SLiam Merwick         if (dev == NULL) {
982 42340fc3SLiam Merwick             trace_usb_ohci_td_dev_error();
983 42340fc3SLiam Merwick             return 1;
984 42340fc3SLiam Merwick         }
985 f1ae32a1SGerd Hoffmann         ep = usb_ep_get(dev, pid, OHCI_BM(ed->flags, ED_EN));
986 6e821e50SBALATON Zoltan         if (ohci->async_td) {
987 572a6732SBALATON Zoltan             /*
988 572a6732SBALATON Zoltan              * ??? The hardware should allow one active packet per
989 572a6732SBALATON Zoltan              * endpoint.  We only allow one active packet per controller.
990 572a6732SBALATON Zoltan              * This should be sufficient as long as devices respond in a
991 572a6732SBALATON Zoltan              * timely manner.
992 6e821e50SBALATON Zoltan              */
993 6e821e50SBALATON Zoltan             trace_usb_ohci_td_too_many_pending(ep->nr);
994 6e821e50SBALATON Zoltan             return 1;
995 6e821e50SBALATON Zoltan         }
996 8550a02dSGerd Hoffmann         usb_packet_setup(&ohci->usb_packet, pid, ep, 0, addr, !flag_r,
997 a6fb2ddbSHans de Goede                          OHCI_BM(td.flags, TD_DI) == 0);
998 f1ae32a1SGerd Hoffmann         usb_packet_addbuf(&ohci->usb_packet, ohci->usb_buf, pktlen);
999 9a77a0f5SHans de Goede         usb_handle_packet(dev, &ohci->usb_packet);
1000 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_td_packet_status(ohci->usb_packet.status);
1001 dc1f5988SAlexey Kardashevskiy 
1002 9a77a0f5SHans de Goede         if (ohci->usb_packet.status == USB_RET_ASYNC) {
1003 36dfe324SHans de Goede             usb_device_flush_ep_queue(dev, ep);
1004 f1ae32a1SGerd Hoffmann             ohci->async_td = addr;
1005 f1ae32a1SGerd Hoffmann             return 1;
1006 f1ae32a1SGerd Hoffmann         }
1007 f1ae32a1SGerd Hoffmann     }
1008 9a77a0f5SHans de Goede     if (ohci->usb_packet.status == USB_RET_SUCCESS) {
1009 9a77a0f5SHans de Goede         ret = ohci->usb_packet.actual_length;
1010 9a77a0f5SHans de Goede     } else {
1011 9a77a0f5SHans de Goede         ret = ohci->usb_packet.status;
1012 9a77a0f5SHans de Goede     }
1013 9a77a0f5SHans de Goede 
1014 f1ae32a1SGerd Hoffmann     if (ret >= 0) {
1015 f1ae32a1SGerd Hoffmann         if (dir == OHCI_TD_DIR_IN) {
1016 cf66ee8eSAlexey Kardashevskiy             if (ohci_copy_td(ohci, &td, ohci->usb_buf, ret,
1017 cf66ee8eSAlexey Kardashevskiy                              DMA_DIRECTION_FROM_DEVICE)) {
1018 cf66ee8eSAlexey Kardashevskiy                 ohci_die(ohci);
1019 cf66ee8eSAlexey Kardashevskiy             }
1020 dc1f5988SAlexey Kardashevskiy             ohci_td_pkt("IN", ohci->usb_buf, pktlen);
1021 f1ae32a1SGerd Hoffmann         } else {
1022 f1ae32a1SGerd Hoffmann             ret = pktlen;
1023 f1ae32a1SGerd Hoffmann         }
1024 f1ae32a1SGerd Hoffmann     }
1025 f1ae32a1SGerd Hoffmann 
1026 f1ae32a1SGerd Hoffmann     /* Writeback */
1027 f1ae32a1SGerd Hoffmann     if (ret == pktlen || (dir == OHCI_TD_DIR_IN && ret >= 0 && flag_r)) {
1028 f1ae32a1SGerd Hoffmann         /* Transmission succeeded. */
1029 f1ae32a1SGerd Hoffmann         if (ret == len) {
1030 f1ae32a1SGerd Hoffmann             td.cbp = 0;
1031 f1ae32a1SGerd Hoffmann         } else {
1032 f1ae32a1SGerd Hoffmann             if ((td.cbp & 0xfff) + ret > 0xfff) {
1033 f1ae32a1SGerd Hoffmann                 td.cbp = (td.be & ~0xfff) + ((td.cbp + ret) & 0xfff);
1034 f1ae32a1SGerd Hoffmann             } else {
1035 f1ae32a1SGerd Hoffmann                 td.cbp += ret;
1036 f1ae32a1SGerd Hoffmann             }
1037 f1ae32a1SGerd Hoffmann         }
1038 f1ae32a1SGerd Hoffmann         td.flags |= OHCI_TD_T1;
1039 f1ae32a1SGerd Hoffmann         td.flags ^= OHCI_TD_T0;
1040 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_NOERROR);
1041 f1ae32a1SGerd Hoffmann         OHCI_SET_BM(td.flags, TD_EC, 0);
1042 f1ae32a1SGerd Hoffmann 
1043 f1ae32a1SGerd Hoffmann         if ((dir != OHCI_TD_DIR_IN) && (ret != len)) {
1044 f1ae32a1SGerd Hoffmann             /* Partial packet transfer: TD not ready to retire yet */
1045 f1ae32a1SGerd Hoffmann             goto exit_no_retire;
1046 f1ae32a1SGerd Hoffmann         }
1047 f1ae32a1SGerd Hoffmann 
1048 f1ae32a1SGerd Hoffmann         /* Setting ED_C is part of the TD retirement process */
1049 f1ae32a1SGerd Hoffmann         ed->head &= ~OHCI_ED_C;
1050 1e58e7a0SBALATON Zoltan         if (td.flags & OHCI_TD_T0) {
1051 f1ae32a1SGerd Hoffmann             ed->head |= OHCI_ED_C;
1052 1e58e7a0SBALATON Zoltan         }
1053 f1ae32a1SGerd Hoffmann     } else {
1054 f1ae32a1SGerd Hoffmann         if (ret >= 0) {
1055 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_td_underrun();
1056 f1ae32a1SGerd Hoffmann             OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DATAUNDERRUN);
1057 f1ae32a1SGerd Hoffmann         } else {
1058 f1ae32a1SGerd Hoffmann             switch (ret) {
1059 f1ae32a1SGerd Hoffmann             case USB_RET_IOERROR:
1060 f1ae32a1SGerd Hoffmann             case USB_RET_NODEV:
1061 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_dev_error();
1062 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING);
1063 4b351a0fSJán Veselý                 break;
1064 f1ae32a1SGerd Hoffmann             case USB_RET_NAK:
1065 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_nak();
1066 f1ae32a1SGerd Hoffmann                 return 1;
1067 f1ae32a1SGerd Hoffmann             case USB_RET_STALL:
1068 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_stall();
1069 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_STALL);
1070 f1ae32a1SGerd Hoffmann                 break;
1071 f1ae32a1SGerd Hoffmann             case USB_RET_BABBLE:
1072 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_babble();
1073 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
1074 f1ae32a1SGerd Hoffmann                 break;
1075 f1ae32a1SGerd Hoffmann             default:
1076 dc1f5988SAlexey Kardashevskiy                 trace_usb_ohci_td_bad_device_response(ret);
1077 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_UNDEXPETEDPID);
1078 f1ae32a1SGerd Hoffmann                 OHCI_SET_BM(td.flags, TD_EC, 3);
1079 f1ae32a1SGerd Hoffmann                 break;
1080 f1ae32a1SGerd Hoffmann             }
1081 572a6732SBALATON Zoltan             /*
1082 572a6732SBALATON Zoltan              * An error occurred so we have to clear the interrupt counter.
1083 572a6732SBALATON Zoltan              * See spec at 6.4.4 on page 104
1084 572a6732SBALATON Zoltan              */
1085 7c48b95dSSebastian Bauer             ohci->done_count = 0;
1086 f1ae32a1SGerd Hoffmann         }
1087 f1ae32a1SGerd Hoffmann         ed->head |= OHCI_ED_H;
1088 f1ae32a1SGerd Hoffmann     }
1089 f1ae32a1SGerd Hoffmann 
1090 f1ae32a1SGerd Hoffmann     /* Retire this TD */
1091 f1ae32a1SGerd Hoffmann     ed->head &= ~OHCI_DPTR_MASK;
1092 f1ae32a1SGerd Hoffmann     ed->head |= td.next & OHCI_DPTR_MASK;
1093 f1ae32a1SGerd Hoffmann     td.next = ohci->done;
1094 f1ae32a1SGerd Hoffmann     ohci->done = addr;
1095 f1ae32a1SGerd Hoffmann     i = OHCI_BM(td.flags, TD_DI);
1096 1e58e7a0SBALATON Zoltan     if (i < ohci->done_count) {
1097 f1ae32a1SGerd Hoffmann         ohci->done_count = i;
1098 1e58e7a0SBALATON Zoltan     }
1099 f1ae32a1SGerd Hoffmann exit_no_retire:
1100 cf66ee8eSAlexey Kardashevskiy     if (ohci_put_td(ohci, addr, &td)) {
1101 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
1102 cf66ee8eSAlexey Kardashevskiy         return 1;
1103 cf66ee8eSAlexey Kardashevskiy     }
1104 f1ae32a1SGerd Hoffmann     return OHCI_BM(td.flags, TD_CC) != OHCI_CC_NOERROR;
1105 f1ae32a1SGerd Hoffmann }
1106 f1ae32a1SGerd Hoffmann 
1107 f1ae32a1SGerd Hoffmann /* Service an endpoint list.  Returns nonzero if active TD were found. */
ohci_service_ed_list(OHCIState * ohci,uint32_t head)1108 3a4d06f2SBALATON Zoltan static int ohci_service_ed_list(OHCIState *ohci, uint32_t head)
1109 f1ae32a1SGerd Hoffmann {
1110 f1ae32a1SGerd Hoffmann     struct ohci_ed ed;
1111 f1ae32a1SGerd Hoffmann     uint32_t next_ed;
1112 f1ae32a1SGerd Hoffmann     uint32_t cur;
1113 f1ae32a1SGerd Hoffmann     int active;
1114 95ed5693SLi Qiang     uint32_t link_cnt = 0;
1115 f1ae32a1SGerd Hoffmann     active = 0;
1116 f1ae32a1SGerd Hoffmann 
1117 1e58e7a0SBALATON Zoltan     if (head == 0) {
1118 f1ae32a1SGerd Hoffmann         return 0;
1119 1e58e7a0SBALATON Zoltan     }
1120 ab878998SLaurent Vivier     for (cur = head; cur && link_cnt++ < ED_LINK_LIMIT; cur = next_ed) {
1121 cf66ee8eSAlexey Kardashevskiy         if (ohci_read_ed(ohci, cur, &ed)) {
1122 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_ed_read_error(cur);
1123 cf66ee8eSAlexey Kardashevskiy             ohci_die(ohci);
1124 f1ae32a1SGerd Hoffmann             return 0;
1125 f1ae32a1SGerd Hoffmann         }
1126 f1ae32a1SGerd Hoffmann 
1127 f1ae32a1SGerd Hoffmann         next_ed = ed.next & OHCI_DPTR_MASK;
1128 f1ae32a1SGerd Hoffmann 
1129 f1ae32a1SGerd Hoffmann         if ((ed.head & OHCI_ED_H) || (ed.flags & OHCI_ED_K)) {
1130 f1ae32a1SGerd Hoffmann             uint32_t addr;
1131 f1ae32a1SGerd Hoffmann             /* Cancel pending packets for ED that have been paused. */
1132 f1ae32a1SGerd Hoffmann             addr = ed.head & OHCI_DPTR_MASK;
1133 f1ae32a1SGerd Hoffmann             if (ohci->async_td && addr == ohci->async_td) {
1134 f1ae32a1SGerd Hoffmann                 usb_cancel_packet(&ohci->usb_packet);
1135 f1ae32a1SGerd Hoffmann                 ohci->async_td = 0;
1136 f79738b0SHans de Goede                 usb_device_ep_stopped(ohci->usb_packet.ep->dev,
1137 f79738b0SHans de Goede                                       ohci->usb_packet.ep);
1138 f1ae32a1SGerd Hoffmann             }
1139 f1ae32a1SGerd Hoffmann             continue;
1140 f1ae32a1SGerd Hoffmann         }
1141 f1ae32a1SGerd Hoffmann 
1142 f1ae32a1SGerd Hoffmann         while ((ed.head & OHCI_DPTR_MASK) != ed.tail) {
1143 3af8f177SAlexey Kardashevskiy             trace_usb_ohci_ed_pkt(cur, (ed.head & OHCI_ED_H) != 0,
1144 3af8f177SAlexey Kardashevskiy                     (ed.head & OHCI_ED_C) != 0, ed.head & OHCI_DPTR_MASK,
1145 3af8f177SAlexey Kardashevskiy                     ed.tail & OHCI_DPTR_MASK, ed.next & OHCI_DPTR_MASK);
1146 3af8f177SAlexey Kardashevskiy             trace_usb_ohci_ed_pkt_flags(
1147 f1ae32a1SGerd Hoffmann                     OHCI_BM(ed.flags, ED_FA), OHCI_BM(ed.flags, ED_EN),
1148 f1ae32a1SGerd Hoffmann                     OHCI_BM(ed.flags, ED_D), (ed.flags & OHCI_ED_S) != 0,
1149 f1ae32a1SGerd Hoffmann                     (ed.flags & OHCI_ED_K) != 0, (ed.flags & OHCI_ED_F) != 0,
1150 3af8f177SAlexey Kardashevskiy                     OHCI_BM(ed.flags, ED_MPS));
1151 dc1f5988SAlexey Kardashevskiy 
1152 f1ae32a1SGerd Hoffmann             active = 1;
1153 f1ae32a1SGerd Hoffmann 
1154 f1ae32a1SGerd Hoffmann             if ((ed.flags & OHCI_ED_F) == 0) {
1155 1e58e7a0SBALATON Zoltan                 if (ohci_service_td(ohci, &ed)) {
1156 f1ae32a1SGerd Hoffmann                     break;
1157 1e58e7a0SBALATON Zoltan                 }
1158 f1ae32a1SGerd Hoffmann             } else {
1159 f1ae32a1SGerd Hoffmann                 /* Handle isochronous endpoints */
1160 3a4d06f2SBALATON Zoltan                 if (ohci_service_iso_td(ohci, &ed)) {
1161 f1ae32a1SGerd Hoffmann                     break;
1162 f1ae32a1SGerd Hoffmann                 }
1163 f1ae32a1SGerd Hoffmann             }
1164 3a4d06f2SBALATON Zoltan         }
1165 f1ae32a1SGerd Hoffmann 
1166 cf66ee8eSAlexey Kardashevskiy         if (ohci_put_ed(ohci, cur, &ed)) {
1167 cf66ee8eSAlexey Kardashevskiy             ohci_die(ohci);
1168 cf66ee8eSAlexey Kardashevskiy             return 0;
1169 cf66ee8eSAlexey Kardashevskiy         }
1170 f1ae32a1SGerd Hoffmann     }
1171 f1ae32a1SGerd Hoffmann 
1172 f1ae32a1SGerd Hoffmann     return active;
1173 f1ae32a1SGerd Hoffmann }
1174 f1ae32a1SGerd Hoffmann 
1175 fd0a10cdSLaurent Vivier /* set a timer for EOF */
ohci_eof_timer(OHCIState * ohci)1176 fd0a10cdSLaurent Vivier static void ohci_eof_timer(OHCIState *ohci)
1177 f1ae32a1SGerd Hoffmann {
1178 bc72ad67SAlex Bligh     timer_mod(ohci->eof_timer, ohci->sof_time + usb_frame_time);
1179 fd0a10cdSLaurent Vivier }
1180 fd0a10cdSLaurent Vivier /* Set a timer for EOF and generate a SOF event */
ohci_sof(OHCIState * ohci)1181 fd0a10cdSLaurent Vivier static void ohci_sof(OHCIState *ohci)
1182 fd0a10cdSLaurent Vivier {
1183 a60f39a4SMiguel GAIO     ohci->sof_time += usb_frame_time;
1184 fd0a10cdSLaurent Vivier     ohci_eof_timer(ohci);
1185 f1ae32a1SGerd Hoffmann     ohci_set_interrupt(ohci, OHCI_INTR_SF);
1186 f1ae32a1SGerd Hoffmann }
1187 f1ae32a1SGerd Hoffmann 
1188 f1ae32a1SGerd Hoffmann /* Process Control and Bulk lists. */
ohci_process_lists(OHCIState * ohci)1189 3a4d06f2SBALATON Zoltan static void ohci_process_lists(OHCIState *ohci)
1190 f1ae32a1SGerd Hoffmann {
1191 f1ae32a1SGerd Hoffmann     if ((ohci->ctl & OHCI_CTL_CLE) && (ohci->status & OHCI_STATUS_CLF)) {
1192 f1ae32a1SGerd Hoffmann         if (ohci->ctrl_cur && ohci->ctrl_cur != ohci->ctrl_head) {
1193 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_process_lists(ohci->ctrl_head, ohci->ctrl_cur);
1194 f1ae32a1SGerd Hoffmann         }
1195 3a4d06f2SBALATON Zoltan         if (!ohci_service_ed_list(ohci, ohci->ctrl_head)) {
1196 f1ae32a1SGerd Hoffmann             ohci->ctrl_cur = 0;
1197 f1ae32a1SGerd Hoffmann             ohci->status &= ~OHCI_STATUS_CLF;
1198 f1ae32a1SGerd Hoffmann         }
1199 f1ae32a1SGerd Hoffmann     }
1200 f1ae32a1SGerd Hoffmann 
1201 f1ae32a1SGerd Hoffmann     if ((ohci->ctl & OHCI_CTL_BLE) && (ohci->status & OHCI_STATUS_BLF)) {
1202 3a4d06f2SBALATON Zoltan         if (!ohci_service_ed_list(ohci, ohci->bulk_head)) {
1203 f1ae32a1SGerd Hoffmann             ohci->bulk_cur = 0;
1204 f1ae32a1SGerd Hoffmann             ohci->status &= ~OHCI_STATUS_BLF;
1205 f1ae32a1SGerd Hoffmann         }
1206 f1ae32a1SGerd Hoffmann     }
1207 f1ae32a1SGerd Hoffmann }
1208 f1ae32a1SGerd Hoffmann 
1209 f1ae32a1SGerd Hoffmann /* Do frame processing on frame boundary */
ohci_frame_boundary(void * opaque)1210 f1ae32a1SGerd Hoffmann static void ohci_frame_boundary(void *opaque)
1211 f1ae32a1SGerd Hoffmann {
1212 f1ae32a1SGerd Hoffmann     OHCIState *ohci = opaque;
1213 f1ae32a1SGerd Hoffmann     struct ohci_hcca hcca;
1214 f1ae32a1SGerd Hoffmann 
1215 cf66ee8eSAlexey Kardashevskiy     if (ohci_read_hcca(ohci, ohci->hcca, &hcca)) {
1216 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_hcca_read_error(ohci->hcca);
1217 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
1218 cf66ee8eSAlexey Kardashevskiy         return;
1219 cf66ee8eSAlexey Kardashevskiy     }
1220 f1ae32a1SGerd Hoffmann 
1221 f1ae32a1SGerd Hoffmann     /* Process all the lists at the end of the frame */
1222 f1ae32a1SGerd Hoffmann     if (ohci->ctl & OHCI_CTL_PLE) {
1223 f1ae32a1SGerd Hoffmann         int n;
1224 f1ae32a1SGerd Hoffmann 
1225 f1ae32a1SGerd Hoffmann         n = ohci->frame_number & 0x1f;
1226 3a4d06f2SBALATON Zoltan         ohci_service_ed_list(ohci, le32_to_cpu(hcca.intr[n]));
1227 f1ae32a1SGerd Hoffmann     }
1228 f1ae32a1SGerd Hoffmann 
1229 f1ae32a1SGerd Hoffmann     /* Cancel all pending packets if either of the lists has been disabled. */
1230 f79738b0SHans de Goede     if (ohci->old_ctl & (~ohci->ctl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) {
1231 f79738b0SHans de Goede         ohci_stop_endpoints(ohci);
1232 f79738b0SHans de Goede     }
1233 f1ae32a1SGerd Hoffmann     ohci->old_ctl = ohci->ctl;
1234 3a4d06f2SBALATON Zoltan     ohci_process_lists(ohci);
1235 f1ae32a1SGerd Hoffmann 
1236 cf66ee8eSAlexey Kardashevskiy     /* Stop if UnrecoverableError happened or ohci_sof will crash */
1237 cf66ee8eSAlexey Kardashevskiy     if (ohci->intr_status & OHCI_INTR_UE) {
1238 cf66ee8eSAlexey Kardashevskiy         return;
1239 cf66ee8eSAlexey Kardashevskiy     }
1240 cf66ee8eSAlexey Kardashevskiy 
1241 f1ae32a1SGerd Hoffmann     /* Frame boundary, so do EOF stuf here */
1242 f1ae32a1SGerd Hoffmann     ohci->frt = ohci->fit;
1243 f1ae32a1SGerd Hoffmann 
1244 f1ae32a1SGerd Hoffmann     /* Increment frame number and take care of endianness. */
1245 f1ae32a1SGerd Hoffmann     ohci->frame_number = (ohci->frame_number + 1) & 0xffff;
1246 f1ae32a1SGerd Hoffmann     hcca.frame = cpu_to_le16(ohci->frame_number);
1247 6301460cSPaolo Bonzini     /* When the HC updates frame number, set pad to 0. Ref OHCI Spec 4.4.1*/
1248 6301460cSPaolo Bonzini     hcca.pad = 0;
1249 f1ae32a1SGerd Hoffmann 
1250 f1ae32a1SGerd Hoffmann     if (ohci->done_count == 0 && !(ohci->intr_status & OHCI_INTR_WD)) {
1251 1e58e7a0SBALATON Zoltan         if (!ohci->done) {
1252 f1ae32a1SGerd Hoffmann             abort();
1253 1e58e7a0SBALATON Zoltan         }
1254 1e58e7a0SBALATON Zoltan         if (ohci->intr & ohci->intr_status) {
1255 f1ae32a1SGerd Hoffmann             ohci->done |= 1;
1256 1e58e7a0SBALATON Zoltan         }
1257 f1ae32a1SGerd Hoffmann         hcca.done = cpu_to_le32(ohci->done);
1258 f1ae32a1SGerd Hoffmann         ohci->done = 0;
1259 f1ae32a1SGerd Hoffmann         ohci->done_count = 7;
1260 f1ae32a1SGerd Hoffmann         ohci_set_interrupt(ohci, OHCI_INTR_WD);
1261 f1ae32a1SGerd Hoffmann     }
1262 f1ae32a1SGerd Hoffmann 
1263 1e58e7a0SBALATON Zoltan     if (ohci->done_count != 7 && ohci->done_count != 0) {
1264 f1ae32a1SGerd Hoffmann         ohci->done_count--;
1265 1e58e7a0SBALATON Zoltan     }
1266 f1ae32a1SGerd Hoffmann     /* Do SOF stuff here */
1267 f1ae32a1SGerd Hoffmann     ohci_sof(ohci);
1268 f1ae32a1SGerd Hoffmann 
1269 f1ae32a1SGerd Hoffmann     /* Writeback HCCA */
1270 cf66ee8eSAlexey Kardashevskiy     if (ohci_put_hcca(ohci, ohci->hcca, &hcca)) {
1271 cf66ee8eSAlexey Kardashevskiy         ohci_die(ohci);
1272 cf66ee8eSAlexey Kardashevskiy     }
1273 f1ae32a1SGerd Hoffmann }
1274 f1ae32a1SGerd Hoffmann 
1275 572a6732SBALATON Zoltan /*
1276 572a6732SBALATON Zoltan  * Start sending SOF tokens across the USB bus, lists are processed in
1277 f1ae32a1SGerd Hoffmann  * next frame
1278 f1ae32a1SGerd Hoffmann  */
ohci_bus_start(OHCIState * ohci)1279 f1ae32a1SGerd Hoffmann static int ohci_bus_start(OHCIState *ohci)
1280 f1ae32a1SGerd Hoffmann {
1281 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_start(ohci->name);
1282 572a6732SBALATON Zoltan     /*
1283 572a6732SBALATON Zoltan      * Delay the first SOF event by one frame time as linux driver is
1284 572a6732SBALATON Zoltan      * not ready to receive it and can meet some race conditions
1285 fd0a10cdSLaurent Vivier      */
1286 a60f39a4SMiguel GAIO     ohci->sof_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
1287 fd0a10cdSLaurent Vivier     ohci_eof_timer(ohci);
1288 f1ae32a1SGerd Hoffmann 
1289 f1ae32a1SGerd Hoffmann     return 1;
1290 f1ae32a1SGerd Hoffmann }
1291 f1ae32a1SGerd Hoffmann 
1292 f1ae32a1SGerd Hoffmann /* Stop sending SOF tokens on the bus */
ohci_bus_stop(OHCIState * ohci)1293 34d97308SThomas Huth void ohci_bus_stop(OHCIState *ohci)
1294 f1ae32a1SGerd Hoffmann {
1295 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_stop(ohci->name);
1296 bc72ad67SAlex Bligh     timer_del(ohci->eof_timer);
1297 f1ae32a1SGerd Hoffmann }
1298 f1ae32a1SGerd Hoffmann 
1299 572a6732SBALATON Zoltan /* Frame interval toggle is manipulated by the hcd only */
ohci_set_frame_interval(OHCIState * ohci,uint16_t val)1300 f1ae32a1SGerd Hoffmann static void ohci_set_frame_interval(OHCIState *ohci, uint16_t val)
1301 f1ae32a1SGerd Hoffmann {
1302 f1ae32a1SGerd Hoffmann     val &= OHCI_FMI_FI;
1303 f1ae32a1SGerd Hoffmann 
1304 f1ae32a1SGerd Hoffmann     if (val != ohci->fi) {
1305 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_set_frame_interval(ohci->name, ohci->fi, ohci->fi);
1306 f1ae32a1SGerd Hoffmann     }
1307 f1ae32a1SGerd Hoffmann 
1308 f1ae32a1SGerd Hoffmann     ohci->fi = val;
1309 f1ae32a1SGerd Hoffmann }
1310 f1ae32a1SGerd Hoffmann 
ohci_port_power(OHCIState * ohci,int i,int p)1311 f1ae32a1SGerd Hoffmann static void ohci_port_power(OHCIState *ohci, int i, int p)
1312 f1ae32a1SGerd Hoffmann {
1313 f1ae32a1SGerd Hoffmann     if (p) {
1314 f1ae32a1SGerd Hoffmann         ohci->rhport[i].ctrl |= OHCI_PORT_PPS;
1315 f1ae32a1SGerd Hoffmann     } else {
1316 978c93beSBALATON Zoltan         ohci->rhport[i].ctrl &= ~(OHCI_PORT_PPS | OHCI_PORT_CCS |
1317 978c93beSBALATON Zoltan                                   OHCI_PORT_PSS | OHCI_PORT_PRS);
1318 f1ae32a1SGerd Hoffmann     }
1319 f1ae32a1SGerd Hoffmann }
1320 f1ae32a1SGerd Hoffmann 
1321 f1ae32a1SGerd Hoffmann /* Set HcControlRegister */
ohci_set_ctl(OHCIState * ohci,uint32_t val)1322 f1ae32a1SGerd Hoffmann static void ohci_set_ctl(OHCIState *ohci, uint32_t val)
1323 f1ae32a1SGerd Hoffmann {
1324 f1ae32a1SGerd Hoffmann     uint32_t old_state;
1325 f1ae32a1SGerd Hoffmann     uint32_t new_state;
1326 f1ae32a1SGerd Hoffmann 
1327 f1ae32a1SGerd Hoffmann     old_state = ohci->ctl & OHCI_CTL_HCFS;
1328 f1ae32a1SGerd Hoffmann     ohci->ctl = val;
1329 f1ae32a1SGerd Hoffmann     new_state = ohci->ctl & OHCI_CTL_HCFS;
1330 f1ae32a1SGerd Hoffmann 
1331 f1ae32a1SGerd Hoffmann     /* no state change */
1332 1e58e7a0SBALATON Zoltan     if (old_state == new_state) {
1333 f1ae32a1SGerd Hoffmann         return;
1334 1e58e7a0SBALATON Zoltan     }
1335 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_set_ctl(ohci->name, new_state);
1336 f1ae32a1SGerd Hoffmann     switch (new_state) {
1337 f1ae32a1SGerd Hoffmann     case OHCI_USB_OPERATIONAL:
1338 f1ae32a1SGerd Hoffmann         ohci_bus_start(ohci);
1339 f1ae32a1SGerd Hoffmann         break;
1340 f1ae32a1SGerd Hoffmann     case OHCI_USB_SUSPEND:
1341 f1ae32a1SGerd Hoffmann         ohci_bus_stop(ohci);
1342 087462c7SLaurent Vivier         /* clear pending SF otherwise linux driver loops in ohci_irq() */
1343 087462c7SLaurent Vivier         ohci->intr_status &= ~OHCI_INTR_SF;
1344 087462c7SLaurent Vivier         ohci_intr_update(ohci);
1345 f1ae32a1SGerd Hoffmann         break;
1346 f1ae32a1SGerd Hoffmann     case OHCI_USB_RESUME:
1347 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_resume(ohci->name);
1348 f1ae32a1SGerd Hoffmann         break;
1349 f1ae32a1SGerd Hoffmann     case OHCI_USB_RESET:
1350 7d938fd1SHervé Poussineau         ohci_roothub_reset(ohci);
1351 f1ae32a1SGerd Hoffmann         break;
1352 f1ae32a1SGerd Hoffmann     }
1353 f1ae32a1SGerd Hoffmann }
1354 f1ae32a1SGerd Hoffmann 
ohci_get_frame_remaining(OHCIState * ohci)1355 f1ae32a1SGerd Hoffmann static uint32_t ohci_get_frame_remaining(OHCIState *ohci)
1356 f1ae32a1SGerd Hoffmann {
1357 f1ae32a1SGerd Hoffmann     uint16_t fr;
1358 f1ae32a1SGerd Hoffmann     int64_t tks;
1359 f1ae32a1SGerd Hoffmann 
1360 1e58e7a0SBALATON Zoltan     if ((ohci->ctl & OHCI_CTL_HCFS) != OHCI_USB_OPERATIONAL) {
1361 1e58e7a0SBALATON Zoltan         return ohci->frt << 31;
1362 1e58e7a0SBALATON Zoltan     }
1363 2a8537cfSMichael Tokarev     /* Being in USB operational state guarantees sof_time was set already. */
1364 bc72ad67SAlex Bligh     tks = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - ohci->sof_time;
1365 a60f39a4SMiguel GAIO     if (tks < 0) {
1366 a60f39a4SMiguel GAIO         tks = 0;
1367 a60f39a4SMiguel GAIO     }
1368 f1ae32a1SGerd Hoffmann 
1369 f1ae32a1SGerd Hoffmann     /* avoid muldiv if possible */
1370 1e58e7a0SBALATON Zoltan     if (tks >= usb_frame_time) {
1371 1e58e7a0SBALATON Zoltan         return ohci->frt << 31;
1372 1e58e7a0SBALATON Zoltan     }
1373 cd1f16f9SLaurent Vivier     tks = tks / usb_bit_time;
1374 f1ae32a1SGerd Hoffmann     fr = (uint16_t)(ohci->fi - tks);
1375 f1ae32a1SGerd Hoffmann 
1376 f1ae32a1SGerd Hoffmann     return (ohci->frt << 31) | fr;
1377 f1ae32a1SGerd Hoffmann }
1378 f1ae32a1SGerd Hoffmann 
1379 f1ae32a1SGerd Hoffmann 
1380 f1ae32a1SGerd Hoffmann /* Set root hub status */
ohci_set_hub_status(OHCIState * ohci,uint32_t val)1381 f1ae32a1SGerd Hoffmann static void ohci_set_hub_status(OHCIState *ohci, uint32_t val)
1382 f1ae32a1SGerd Hoffmann {
1383 f1ae32a1SGerd Hoffmann     uint32_t old_state;
1384 f1ae32a1SGerd Hoffmann 
1385 f1ae32a1SGerd Hoffmann     old_state = ohci->rhstatus;
1386 f1ae32a1SGerd Hoffmann 
1387 f1ae32a1SGerd Hoffmann     /* write 1 to clear OCIC */
1388 1e58e7a0SBALATON Zoltan     if (val & OHCI_RHS_OCIC) {
1389 f1ae32a1SGerd Hoffmann         ohci->rhstatus &= ~OHCI_RHS_OCIC;
1390 1e58e7a0SBALATON Zoltan     }
1391 f1ae32a1SGerd Hoffmann     if (val & OHCI_RHS_LPS) {
1392 f1ae32a1SGerd Hoffmann         int i;
1393 f1ae32a1SGerd Hoffmann 
1394 1e58e7a0SBALATON Zoltan         for (i = 0; i < ohci->num_ports; i++) {
1395 f1ae32a1SGerd Hoffmann             ohci_port_power(ohci, i, 0);
1396 1e58e7a0SBALATON Zoltan         }
1397 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_hub_power_down();
1398 f1ae32a1SGerd Hoffmann     }
1399 f1ae32a1SGerd Hoffmann 
1400 f1ae32a1SGerd Hoffmann     if (val & OHCI_RHS_LPSC) {
1401 f1ae32a1SGerd Hoffmann         int i;
1402 f1ae32a1SGerd Hoffmann 
1403 1e58e7a0SBALATON Zoltan         for (i = 0; i < ohci->num_ports; i++) {
1404 f1ae32a1SGerd Hoffmann             ohci_port_power(ohci, i, 1);
1405 1e58e7a0SBALATON Zoltan         }
1406 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_hub_power_up();
1407 f1ae32a1SGerd Hoffmann     }
1408 f1ae32a1SGerd Hoffmann 
1409 1e58e7a0SBALATON Zoltan     if (val & OHCI_RHS_DRWE) {
1410 f1ae32a1SGerd Hoffmann         ohci->rhstatus |= OHCI_RHS_DRWE;
1411 1e58e7a0SBALATON Zoltan     }
1412 1e58e7a0SBALATON Zoltan     if (val & OHCI_RHS_CRWE) {
1413 f1ae32a1SGerd Hoffmann         ohci->rhstatus &= ~OHCI_RHS_DRWE;
1414 1e58e7a0SBALATON Zoltan     }
1415 1e58e7a0SBALATON Zoltan     if (old_state != ohci->rhstatus) {
1416 f1ae32a1SGerd Hoffmann         ohci_set_interrupt(ohci, OHCI_INTR_RHSC);
1417 f1ae32a1SGerd Hoffmann     }
1418 1e58e7a0SBALATON Zoltan }
1419 f1ae32a1SGerd Hoffmann 
1420 0c38e9ddSBALATON Zoltan /* This is the one state transition the controller can do by itself */
ohci_resume(OHCIState * s)1421 0c38e9ddSBALATON Zoltan static bool ohci_resume(OHCIState *s)
1422 0c38e9ddSBALATON Zoltan {
1423 0c38e9ddSBALATON Zoltan     if ((s->ctl & OHCI_CTL_HCFS) == OHCI_USB_SUSPEND) {
1424 0c38e9ddSBALATON Zoltan         trace_usb_ohci_remote_wakeup(s->name);
1425 0c38e9ddSBALATON Zoltan         s->ctl &= ~OHCI_CTL_HCFS;
1426 0c38e9ddSBALATON Zoltan         s->ctl |= OHCI_USB_RESUME;
1427 0c38e9ddSBALATON Zoltan         return true;
1428 0c38e9ddSBALATON Zoltan     }
1429 0c38e9ddSBALATON Zoltan     return false;
1430 0c38e9ddSBALATON Zoltan }
1431 0c38e9ddSBALATON Zoltan 
1432 ef680088SBALATON Zoltan /*
1433 ef680088SBALATON Zoltan  * Sets a flag in a port status reg but only set it if the port is connected.
1434 ef680088SBALATON Zoltan  * If not set ConnectStatusChange flag. If flag is enabled return 1.
1435 ef680088SBALATON Zoltan  */
ohci_port_set_if_connected(OHCIState * ohci,int i,uint32_t val)1436 ef680088SBALATON Zoltan static int ohci_port_set_if_connected(OHCIState *ohci, int i, uint32_t val)
1437 ef680088SBALATON Zoltan {
1438 ef680088SBALATON Zoltan     int ret = 1;
1439 ef680088SBALATON Zoltan 
1440 ef680088SBALATON Zoltan     /* writing a 0 has no effect */
1441 ef680088SBALATON Zoltan     if (val == 0) {
1442 ef680088SBALATON Zoltan         return 0;
1443 ef680088SBALATON Zoltan     }
1444 ef680088SBALATON Zoltan     /* If CurrentConnectStatus is cleared we set ConnectStatusChange */
1445 ef680088SBALATON Zoltan     if (!(ohci->rhport[i].ctrl & OHCI_PORT_CCS)) {
1446 ef680088SBALATON Zoltan         ohci->rhport[i].ctrl |= OHCI_PORT_CSC;
1447 ef680088SBALATON Zoltan         if (ohci->rhstatus & OHCI_RHS_DRWE) {
1448 0c38e9ddSBALATON Zoltan             /* CSC is a wakeup event */
1449 0c38e9ddSBALATON Zoltan             if (ohci_resume(ohci)) {
1450 0c38e9ddSBALATON Zoltan                 ohci_set_interrupt(ohci, OHCI_INTR_RD);
1451 0c38e9ddSBALATON Zoltan             }
1452 ef680088SBALATON Zoltan         }
1453 ef680088SBALATON Zoltan         return 0;
1454 ef680088SBALATON Zoltan     }
1455 ef680088SBALATON Zoltan 
1456 ef680088SBALATON Zoltan     if (ohci->rhport[i].ctrl & val) {
1457 ef680088SBALATON Zoltan         ret = 0;
1458 ef680088SBALATON Zoltan     }
1459 ef680088SBALATON Zoltan     /* set the bit */
1460 ef680088SBALATON Zoltan     ohci->rhport[i].ctrl |= val;
1461 ef680088SBALATON Zoltan 
1462 ef680088SBALATON Zoltan     return ret;
1463 ef680088SBALATON Zoltan }
1464 ef680088SBALATON Zoltan 
1465 f1ae32a1SGerd Hoffmann /* Set root hub port status */
ohci_port_set_status(OHCIState * ohci,int portnum,uint32_t val)1466 f1ae32a1SGerd Hoffmann static void ohci_port_set_status(OHCIState *ohci, int portnum, uint32_t val)
1467 f1ae32a1SGerd Hoffmann {
1468 f1ae32a1SGerd Hoffmann     uint32_t old_state;
1469 f1ae32a1SGerd Hoffmann     OHCIPort *port;
1470 f1ae32a1SGerd Hoffmann 
1471 f1ae32a1SGerd Hoffmann     port = &ohci->rhport[portnum];
1472 f1ae32a1SGerd Hoffmann     old_state = port->ctrl;
1473 f1ae32a1SGerd Hoffmann 
1474 f1ae32a1SGerd Hoffmann     /* Write to clear CSC, PESC, PSSC, OCIC, PRSC */
1475 1e58e7a0SBALATON Zoltan     if (val & OHCI_PORT_WTC) {
1476 f1ae32a1SGerd Hoffmann         port->ctrl &= ~(val & OHCI_PORT_WTC);
1477 1e58e7a0SBALATON Zoltan     }
1478 1e58e7a0SBALATON Zoltan     if (val & OHCI_PORT_CCS) {
1479 f1ae32a1SGerd Hoffmann         port->ctrl &= ~OHCI_PORT_PES;
1480 1e58e7a0SBALATON Zoltan     }
1481 f1ae32a1SGerd Hoffmann     ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PES);
1482 f1ae32a1SGerd Hoffmann 
1483 f1ae32a1SGerd Hoffmann     if (ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PSS)) {
1484 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_port_suspend(portnum);
1485 f1ae32a1SGerd Hoffmann     }
1486 f1ae32a1SGerd Hoffmann 
1487 f1ae32a1SGerd Hoffmann     if (ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PRS)) {
1488 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_port_reset(portnum);
1489 f1ae32a1SGerd Hoffmann         usb_device_reset(port->port.dev);
1490 f1ae32a1SGerd Hoffmann         port->ctrl &= ~OHCI_PORT_PRS;
1491 f1ae32a1SGerd Hoffmann         /* ??? Should this also set OHCI_PORT_PESC. */
1492 f1ae32a1SGerd Hoffmann         port->ctrl |= OHCI_PORT_PES | OHCI_PORT_PRSC;
1493 f1ae32a1SGerd Hoffmann     }
1494 f1ae32a1SGerd Hoffmann 
1495 572a6732SBALATON Zoltan     /* Invert order here to ensure in ambiguous case, device is powered up. */
1496 1e58e7a0SBALATON Zoltan     if (val & OHCI_PORT_LSDA) {
1497 f1ae32a1SGerd Hoffmann         ohci_port_power(ohci, portnum, 0);
1498 1e58e7a0SBALATON Zoltan     }
1499 1e58e7a0SBALATON Zoltan     if (val & OHCI_PORT_PPS) {
1500 f1ae32a1SGerd Hoffmann         ohci_port_power(ohci, portnum, 1);
1501 1e58e7a0SBALATON Zoltan     }
1502 1e58e7a0SBALATON Zoltan     if (old_state != port->ctrl) {
1503 f1ae32a1SGerd Hoffmann         ohci_set_interrupt(ohci, OHCI_INTR_RHSC);
1504 f1ae32a1SGerd Hoffmann     }
1505 1e58e7a0SBALATON Zoltan }
1506 f1ae32a1SGerd Hoffmann 
ohci_mem_read(void * opaque,hwaddr addr,unsigned size)1507 f1ae32a1SGerd Hoffmann static uint64_t ohci_mem_read(void *opaque,
1508 a8170e5eSAvi Kivity                               hwaddr addr,
1509 f1ae32a1SGerd Hoffmann                               unsigned size)
1510 f1ae32a1SGerd Hoffmann {
1511 f1ae32a1SGerd Hoffmann     OHCIState *ohci = opaque;
1512 f1ae32a1SGerd Hoffmann     uint32_t retval;
1513 f1ae32a1SGerd Hoffmann 
1514 f1ae32a1SGerd Hoffmann     /* Only aligned reads are allowed on OHCI */
1515 f1ae32a1SGerd Hoffmann     if (addr & 3) {
1516 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_mem_read_unaligned(addr);
1517 f1ae32a1SGerd Hoffmann         return 0xffffffff;
1518 f1ae32a1SGerd Hoffmann     } else if (addr >= 0x54 && addr < 0x54 + ohci->num_ports * 4) {
1519 f1ae32a1SGerd Hoffmann         /* HcRhPortStatus */
1520 f1ae32a1SGerd Hoffmann         retval = ohci->rhport[(addr - 0x54) >> 2].ctrl | OHCI_PORT_PPS;
1521 9ae8d31dSBALATON Zoltan         trace_usb_ohci_mem_port_read(size, "HcRhPortStatus", (addr - 0x50) >> 2,
1522 9ae8d31dSBALATON Zoltan                                      addr, addr >> 2, retval);
1523 f1ae32a1SGerd Hoffmann     } else {
1524 f1ae32a1SGerd Hoffmann         switch (addr >> 2) {
1525 f1ae32a1SGerd Hoffmann         case 0: /* HcRevision */
1526 f1ae32a1SGerd Hoffmann             retval = 0x10;
1527 f1ae32a1SGerd Hoffmann             break;
1528 f1ae32a1SGerd Hoffmann 
1529 f1ae32a1SGerd Hoffmann         case 1: /* HcControl */
1530 f1ae32a1SGerd Hoffmann             retval = ohci->ctl;
1531 f1ae32a1SGerd Hoffmann             break;
1532 f1ae32a1SGerd Hoffmann 
1533 f1ae32a1SGerd Hoffmann         case 2: /* HcCommandStatus */
1534 f1ae32a1SGerd Hoffmann             retval = ohci->status;
1535 f1ae32a1SGerd Hoffmann             break;
1536 f1ae32a1SGerd Hoffmann 
1537 f1ae32a1SGerd Hoffmann         case 3: /* HcInterruptStatus */
1538 f1ae32a1SGerd Hoffmann             retval = ohci->intr_status;
1539 f1ae32a1SGerd Hoffmann             break;
1540 f1ae32a1SGerd Hoffmann 
1541 f1ae32a1SGerd Hoffmann         case 4: /* HcInterruptEnable */
1542 f1ae32a1SGerd Hoffmann         case 5: /* HcInterruptDisable */
1543 f1ae32a1SGerd Hoffmann             retval = ohci->intr;
1544 f1ae32a1SGerd Hoffmann             break;
1545 f1ae32a1SGerd Hoffmann 
1546 f1ae32a1SGerd Hoffmann         case 6: /* HcHCCA */
1547 f1ae32a1SGerd Hoffmann             retval = ohci->hcca;
1548 f1ae32a1SGerd Hoffmann             break;
1549 f1ae32a1SGerd Hoffmann 
1550 f1ae32a1SGerd Hoffmann         case 7: /* HcPeriodCurrentED */
1551 f1ae32a1SGerd Hoffmann             retval = ohci->per_cur;
1552 f1ae32a1SGerd Hoffmann             break;
1553 f1ae32a1SGerd Hoffmann 
1554 f1ae32a1SGerd Hoffmann         case 8: /* HcControlHeadED */
1555 f1ae32a1SGerd Hoffmann             retval = ohci->ctrl_head;
1556 f1ae32a1SGerd Hoffmann             break;
1557 f1ae32a1SGerd Hoffmann 
1558 f1ae32a1SGerd Hoffmann         case 9: /* HcControlCurrentED */
1559 f1ae32a1SGerd Hoffmann             retval = ohci->ctrl_cur;
1560 f1ae32a1SGerd Hoffmann             break;
1561 f1ae32a1SGerd Hoffmann 
1562 f1ae32a1SGerd Hoffmann         case 10: /* HcBulkHeadED */
1563 f1ae32a1SGerd Hoffmann             retval = ohci->bulk_head;
1564 f1ae32a1SGerd Hoffmann             break;
1565 f1ae32a1SGerd Hoffmann 
1566 f1ae32a1SGerd Hoffmann         case 11: /* HcBulkCurrentED */
1567 f1ae32a1SGerd Hoffmann             retval = ohci->bulk_cur;
1568 f1ae32a1SGerd Hoffmann             break;
1569 f1ae32a1SGerd Hoffmann 
1570 f1ae32a1SGerd Hoffmann         case 12: /* HcDoneHead */
1571 f1ae32a1SGerd Hoffmann             retval = ohci->done;
1572 f1ae32a1SGerd Hoffmann             break;
1573 f1ae32a1SGerd Hoffmann 
1574 f1ae32a1SGerd Hoffmann         case 13: /* HcFmInterretval */
1575 f1ae32a1SGerd Hoffmann             retval = (ohci->fit << 31) | (ohci->fsmps << 16) | (ohci->fi);
1576 f1ae32a1SGerd Hoffmann             break;
1577 f1ae32a1SGerd Hoffmann 
1578 f1ae32a1SGerd Hoffmann         case 14: /* HcFmRemaining */
1579 f1ae32a1SGerd Hoffmann             retval = ohci_get_frame_remaining(ohci);
1580 f1ae32a1SGerd Hoffmann             break;
1581 f1ae32a1SGerd Hoffmann 
1582 f1ae32a1SGerd Hoffmann         case 15: /* HcFmNumber */
1583 f1ae32a1SGerd Hoffmann             retval = ohci->frame_number;
1584 f1ae32a1SGerd Hoffmann             break;
1585 f1ae32a1SGerd Hoffmann 
1586 f1ae32a1SGerd Hoffmann         case 16: /* HcPeriodicStart */
1587 f1ae32a1SGerd Hoffmann             retval = ohci->pstart;
1588 f1ae32a1SGerd Hoffmann             break;
1589 f1ae32a1SGerd Hoffmann 
1590 f1ae32a1SGerd Hoffmann         case 17: /* HcLSThreshold */
1591 f1ae32a1SGerd Hoffmann             retval = ohci->lst;
1592 f1ae32a1SGerd Hoffmann             break;
1593 f1ae32a1SGerd Hoffmann 
1594 f1ae32a1SGerd Hoffmann         case 18: /* HcRhDescriptorA */
1595 f1ae32a1SGerd Hoffmann             retval = ohci->rhdesc_a;
1596 f1ae32a1SGerd Hoffmann             break;
1597 f1ae32a1SGerd Hoffmann 
1598 f1ae32a1SGerd Hoffmann         case 19: /* HcRhDescriptorB */
1599 f1ae32a1SGerd Hoffmann             retval = ohci->rhdesc_b;
1600 f1ae32a1SGerd Hoffmann             break;
1601 f1ae32a1SGerd Hoffmann 
1602 f1ae32a1SGerd Hoffmann         case 20: /* HcRhStatus */
1603 f1ae32a1SGerd Hoffmann             retval = ohci->rhstatus;
1604 f1ae32a1SGerd Hoffmann             break;
1605 f1ae32a1SGerd Hoffmann 
1606 f1ae32a1SGerd Hoffmann         /* PXA27x specific registers */
1607 f1ae32a1SGerd Hoffmann         case 24: /* HcStatus */
1608 f1ae32a1SGerd Hoffmann             retval = ohci->hstatus & ohci->hmask;
1609 f1ae32a1SGerd Hoffmann             break;
1610 f1ae32a1SGerd Hoffmann 
1611 f1ae32a1SGerd Hoffmann         case 25: /* HcHReset */
1612 f1ae32a1SGerd Hoffmann             retval = ohci->hreset;
1613 f1ae32a1SGerd Hoffmann             break;
1614 f1ae32a1SGerd Hoffmann 
1615 f1ae32a1SGerd Hoffmann         case 26: /* HcHInterruptEnable */
1616 f1ae32a1SGerd Hoffmann             retval = ohci->hmask;
1617 f1ae32a1SGerd Hoffmann             break;
1618 f1ae32a1SGerd Hoffmann 
1619 f1ae32a1SGerd Hoffmann         case 27: /* HcHInterruptTest */
1620 f1ae32a1SGerd Hoffmann             retval = ohci->htest;
1621 f1ae32a1SGerd Hoffmann             break;
1622 f1ae32a1SGerd Hoffmann 
1623 f1ae32a1SGerd Hoffmann         default:
1624 dc1f5988SAlexey Kardashevskiy             trace_usb_ohci_mem_read_bad_offset(addr);
1625 f1ae32a1SGerd Hoffmann             retval = 0xffffffff;
1626 f1ae32a1SGerd Hoffmann         }
1627 9ae8d31dSBALATON Zoltan         if (addr != 0xc || retval) {
1628 9ae8d31dSBALATON Zoltan             trace_usb_ohci_mem_read(size, ohci_reg_name(addr), addr, addr >> 2,
1629 9ae8d31dSBALATON Zoltan                                     retval);
1630 9ae8d31dSBALATON Zoltan         }
1631 f1ae32a1SGerd Hoffmann     }
1632 f1ae32a1SGerd Hoffmann 
1633 f1ae32a1SGerd Hoffmann     return retval;
1634 f1ae32a1SGerd Hoffmann }
1635 f1ae32a1SGerd Hoffmann 
ohci_mem_write(void * opaque,hwaddr addr,uint64_t val,unsigned size)1636 f1ae32a1SGerd Hoffmann static void ohci_mem_write(void *opaque,
1637 a8170e5eSAvi Kivity                            hwaddr addr,
1638 f1ae32a1SGerd Hoffmann                            uint64_t val,
1639 f1ae32a1SGerd Hoffmann                            unsigned size)
1640 f1ae32a1SGerd Hoffmann {
1641 f1ae32a1SGerd Hoffmann     OHCIState *ohci = opaque;
1642 f1ae32a1SGerd Hoffmann 
1643 f1ae32a1SGerd Hoffmann     /* Only aligned reads are allowed on OHCI */
1644 f1ae32a1SGerd Hoffmann     if (addr & 3) {
1645 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_mem_write_unaligned(addr);
1646 f1ae32a1SGerd Hoffmann         return;
1647 f1ae32a1SGerd Hoffmann     }
1648 f1ae32a1SGerd Hoffmann 
1649 f1ae32a1SGerd Hoffmann     if (addr >= 0x54 && addr < 0x54 + ohci->num_ports * 4) {
1650 f1ae32a1SGerd Hoffmann         /* HcRhPortStatus */
1651 9ae8d31dSBALATON Zoltan         trace_usb_ohci_mem_port_write(size, "HcRhPortStatus",
1652 9ae8d31dSBALATON Zoltan                                       (addr - 0x50) >> 2, addr, addr >> 2, val);
1653 f1ae32a1SGerd Hoffmann         ohci_port_set_status(ohci, (addr - 0x54) >> 2, val);
1654 f1ae32a1SGerd Hoffmann         return;
1655 f1ae32a1SGerd Hoffmann     }
1656 f1ae32a1SGerd Hoffmann 
1657 9ae8d31dSBALATON Zoltan     trace_usb_ohci_mem_write(size, ohci_reg_name(addr), addr, addr >> 2, val);
1658 f1ae32a1SGerd Hoffmann     switch (addr >> 2) {
1659 f1ae32a1SGerd Hoffmann     case 1: /* HcControl */
1660 f1ae32a1SGerd Hoffmann         ohci_set_ctl(ohci, val);
1661 f1ae32a1SGerd Hoffmann         break;
1662 f1ae32a1SGerd Hoffmann 
1663 f1ae32a1SGerd Hoffmann     case 2: /* HcCommandStatus */
1664 f1ae32a1SGerd Hoffmann         /* SOC is read-only */
1665 f1ae32a1SGerd Hoffmann         val = (val & ~OHCI_STATUS_SOC);
1666 f1ae32a1SGerd Hoffmann 
1667 f1ae32a1SGerd Hoffmann         /* Bits written as '0' remain unchanged in the register */
1668 f1ae32a1SGerd Hoffmann         ohci->status |= val;
1669 f1ae32a1SGerd Hoffmann 
1670 1e58e7a0SBALATON Zoltan         if (ohci->status & OHCI_STATUS_HCR) {
1671 0922c3f6SHervé Poussineau             ohci_soft_reset(ohci);
1672 1e58e7a0SBALATON Zoltan         }
1673 f1ae32a1SGerd Hoffmann         break;
1674 f1ae32a1SGerd Hoffmann 
1675 f1ae32a1SGerd Hoffmann     case 3: /* HcInterruptStatus */
1676 f1ae32a1SGerd Hoffmann         ohci->intr_status &= ~val;
1677 f1ae32a1SGerd Hoffmann         ohci_intr_update(ohci);
1678 f1ae32a1SGerd Hoffmann         break;
1679 f1ae32a1SGerd Hoffmann 
1680 f1ae32a1SGerd Hoffmann     case 4: /* HcInterruptEnable */
1681 f1ae32a1SGerd Hoffmann         ohci->intr |= val;
1682 f1ae32a1SGerd Hoffmann         ohci_intr_update(ohci);
1683 f1ae32a1SGerd Hoffmann         break;
1684 f1ae32a1SGerd Hoffmann 
1685 f1ae32a1SGerd Hoffmann     case 5: /* HcInterruptDisable */
1686 f1ae32a1SGerd Hoffmann         ohci->intr &= ~val;
1687 f1ae32a1SGerd Hoffmann         ohci_intr_update(ohci);
1688 f1ae32a1SGerd Hoffmann         break;
1689 f1ae32a1SGerd Hoffmann 
1690 f1ae32a1SGerd Hoffmann     case 6: /* HcHCCA */
1691 f1ae32a1SGerd Hoffmann         ohci->hcca = val & OHCI_HCCA_MASK;
1692 f1ae32a1SGerd Hoffmann         break;
1693 f1ae32a1SGerd Hoffmann 
1694 f1ae32a1SGerd Hoffmann     case 7: /* HcPeriodCurrentED */
1695 f1ae32a1SGerd Hoffmann         /* Ignore writes to this read-only register, Linux does them */
1696 f1ae32a1SGerd Hoffmann         break;
1697 f1ae32a1SGerd Hoffmann 
1698 f1ae32a1SGerd Hoffmann     case 8: /* HcControlHeadED */
1699 f1ae32a1SGerd Hoffmann         ohci->ctrl_head = val & OHCI_EDPTR_MASK;
1700 f1ae32a1SGerd Hoffmann         break;
1701 f1ae32a1SGerd Hoffmann 
1702 f1ae32a1SGerd Hoffmann     case 9: /* HcControlCurrentED */
1703 f1ae32a1SGerd Hoffmann         ohci->ctrl_cur = val & OHCI_EDPTR_MASK;
1704 f1ae32a1SGerd Hoffmann         break;
1705 f1ae32a1SGerd Hoffmann 
1706 f1ae32a1SGerd Hoffmann     case 10: /* HcBulkHeadED */
1707 f1ae32a1SGerd Hoffmann         ohci->bulk_head = val & OHCI_EDPTR_MASK;
1708 f1ae32a1SGerd Hoffmann         break;
1709 f1ae32a1SGerd Hoffmann 
1710 f1ae32a1SGerd Hoffmann     case 11: /* HcBulkCurrentED */
1711 f1ae32a1SGerd Hoffmann         ohci->bulk_cur = val & OHCI_EDPTR_MASK;
1712 f1ae32a1SGerd Hoffmann         break;
1713 f1ae32a1SGerd Hoffmann 
1714 f1ae32a1SGerd Hoffmann     case 13: /* HcFmInterval */
1715 f1ae32a1SGerd Hoffmann         ohci->fsmps = (val & OHCI_FMI_FSMPS) >> 16;
1716 f1ae32a1SGerd Hoffmann         ohci->fit = (val & OHCI_FMI_FIT) >> 31;
1717 f1ae32a1SGerd Hoffmann         ohci_set_frame_interval(ohci, val);
1718 f1ae32a1SGerd Hoffmann         break;
1719 f1ae32a1SGerd Hoffmann 
1720 f1ae32a1SGerd Hoffmann     case 15: /* HcFmNumber */
1721 f1ae32a1SGerd Hoffmann         break;
1722 f1ae32a1SGerd Hoffmann 
1723 f1ae32a1SGerd Hoffmann     case 16: /* HcPeriodicStart */
1724 f1ae32a1SGerd Hoffmann         ohci->pstart = val & 0xffff;
1725 f1ae32a1SGerd Hoffmann         break;
1726 f1ae32a1SGerd Hoffmann 
1727 f1ae32a1SGerd Hoffmann     case 17: /* HcLSThreshold */
1728 f1ae32a1SGerd Hoffmann         ohci->lst = val & 0xffff;
1729 f1ae32a1SGerd Hoffmann         break;
1730 f1ae32a1SGerd Hoffmann 
1731 f1ae32a1SGerd Hoffmann     case 18: /* HcRhDescriptorA */
1732 f1ae32a1SGerd Hoffmann         ohci->rhdesc_a &= ~OHCI_RHA_RW_MASK;
1733 f1ae32a1SGerd Hoffmann         ohci->rhdesc_a |= val & OHCI_RHA_RW_MASK;
1734 f1ae32a1SGerd Hoffmann         break;
1735 f1ae32a1SGerd Hoffmann 
1736 f1ae32a1SGerd Hoffmann     case 19: /* HcRhDescriptorB */
1737 f1ae32a1SGerd Hoffmann         break;
1738 f1ae32a1SGerd Hoffmann 
1739 f1ae32a1SGerd Hoffmann     case 20: /* HcRhStatus */
1740 f1ae32a1SGerd Hoffmann         ohci_set_hub_status(ohci, val);
1741 f1ae32a1SGerd Hoffmann         break;
1742 f1ae32a1SGerd Hoffmann 
1743 f1ae32a1SGerd Hoffmann     /* PXA27x specific registers */
1744 f1ae32a1SGerd Hoffmann     case 24: /* HcStatus */
1745 f1ae32a1SGerd Hoffmann         ohci->hstatus &= ~(val & ohci->hmask);
1746 7fa96d73SGerd Hoffmann         break;
1747 f1ae32a1SGerd Hoffmann 
1748 f1ae32a1SGerd Hoffmann     case 25: /* HcHReset */
1749 f1ae32a1SGerd Hoffmann         ohci->hreset = val & ~OHCI_HRESET_FSBIR;
1750 1e58e7a0SBALATON Zoltan         if (val & OHCI_HRESET_FSBIR) {
1751 84d04e21SHervé Poussineau             ohci_hard_reset(ohci);
1752 1e58e7a0SBALATON Zoltan         }
1753 f1ae32a1SGerd Hoffmann         break;
1754 f1ae32a1SGerd Hoffmann 
1755 f1ae32a1SGerd Hoffmann     case 26: /* HcHInterruptEnable */
1756 f1ae32a1SGerd Hoffmann         ohci->hmask = val;
1757 f1ae32a1SGerd Hoffmann         break;
1758 f1ae32a1SGerd Hoffmann 
1759 f1ae32a1SGerd Hoffmann     case 27: /* HcHInterruptTest */
1760 f1ae32a1SGerd Hoffmann         ohci->htest = val;
1761 f1ae32a1SGerd Hoffmann         break;
1762 f1ae32a1SGerd Hoffmann 
1763 f1ae32a1SGerd Hoffmann     default:
1764 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_mem_write_bad_offset(addr);
1765 f1ae32a1SGerd Hoffmann         break;
1766 f1ae32a1SGerd Hoffmann     }
1767 f1ae32a1SGerd Hoffmann }
1768 f1ae32a1SGerd Hoffmann 
1769 37bf0654SBALATON Zoltan static const MemoryRegionOps ohci_mem_ops = {
1770 37bf0654SBALATON Zoltan     .read = ohci_mem_read,
1771 37bf0654SBALATON Zoltan     .write = ohci_mem_write,
1772 37bf0654SBALATON Zoltan     .endianness = DEVICE_LITTLE_ENDIAN,
1773 37bf0654SBALATON Zoltan };
1774 37bf0654SBALATON Zoltan 
1775 37bf0654SBALATON Zoltan /* USBPortOps */
ohci_attach(USBPort * port1)1776 37bf0654SBALATON Zoltan static void ohci_attach(USBPort *port1)
1777 37bf0654SBALATON Zoltan {
1778 37bf0654SBALATON Zoltan     OHCIState *s = port1->opaque;
1779 37bf0654SBALATON Zoltan     OHCIPort *port = &s->rhport[port1->index];
1780 37bf0654SBALATON Zoltan     uint32_t old_state = port->ctrl;
1781 37bf0654SBALATON Zoltan 
1782 37bf0654SBALATON Zoltan     /* set connect status */
1783 37bf0654SBALATON Zoltan     port->ctrl |= OHCI_PORT_CCS | OHCI_PORT_CSC;
1784 37bf0654SBALATON Zoltan 
1785 37bf0654SBALATON Zoltan     /* update speed */
1786 37bf0654SBALATON Zoltan     if (port->port.dev->speed == USB_SPEED_LOW) {
1787 37bf0654SBALATON Zoltan         port->ctrl |= OHCI_PORT_LSDA;
1788 37bf0654SBALATON Zoltan     } else {
1789 37bf0654SBALATON Zoltan         port->ctrl &= ~OHCI_PORT_LSDA;
1790 37bf0654SBALATON Zoltan     }
1791 37bf0654SBALATON Zoltan 
1792 37bf0654SBALATON Zoltan     /* notify of remote-wakeup */
1793 37bf0654SBALATON Zoltan     if ((s->ctl & OHCI_CTL_HCFS) == OHCI_USB_SUSPEND) {
1794 37bf0654SBALATON Zoltan         ohci_set_interrupt(s, OHCI_INTR_RD);
1795 37bf0654SBALATON Zoltan     }
1796 37bf0654SBALATON Zoltan 
1797 37bf0654SBALATON Zoltan     trace_usb_ohci_port_attach(port1->index);
1798 37bf0654SBALATON Zoltan 
1799 37bf0654SBALATON Zoltan     if (old_state != port->ctrl) {
1800 37bf0654SBALATON Zoltan         ohci_set_interrupt(s, OHCI_INTR_RHSC);
1801 37bf0654SBALATON Zoltan     }
1802 37bf0654SBALATON Zoltan }
1803 37bf0654SBALATON Zoltan 
ohci_child_detach(USBPort * port1,USBDevice * dev)1804 b6b0c066SBALATON Zoltan static void ohci_child_detach(USBPort *port1, USBDevice *dev)
1805 f1ae32a1SGerd Hoffmann {
1806 b6b0c066SBALATON Zoltan     OHCIState *ohci = port1->opaque;
1807 b6b0c066SBALATON Zoltan 
1808 f1ae32a1SGerd Hoffmann     if (ohci->async_td &&
1809 f1ae32a1SGerd Hoffmann         usb_packet_is_inflight(&ohci->usb_packet) &&
1810 f1ae32a1SGerd Hoffmann         ohci->usb_packet.ep->dev == dev) {
1811 f1ae32a1SGerd Hoffmann         usb_cancel_packet(&ohci->usb_packet);
1812 f1ae32a1SGerd Hoffmann         ohci->async_td = 0;
1813 f1ae32a1SGerd Hoffmann     }
1814 f1ae32a1SGerd Hoffmann }
1815 f1ae32a1SGerd Hoffmann 
ohci_detach(USBPort * port1)1816 37bf0654SBALATON Zoltan static void ohci_detach(USBPort *port1)
1817 37bf0654SBALATON Zoltan {
1818 37bf0654SBALATON Zoltan     OHCIState *s = port1->opaque;
1819 37bf0654SBALATON Zoltan     OHCIPort *port = &s->rhport[port1->index];
1820 37bf0654SBALATON Zoltan     uint32_t old_state = port->ctrl;
1821 37bf0654SBALATON Zoltan 
1822 b6b0c066SBALATON Zoltan     ohci_child_detach(port1, port1->dev);
1823 37bf0654SBALATON Zoltan 
1824 37bf0654SBALATON Zoltan     /* set connect status */
1825 37bf0654SBALATON Zoltan     if (port->ctrl & OHCI_PORT_CCS) {
1826 37bf0654SBALATON Zoltan         port->ctrl &= ~OHCI_PORT_CCS;
1827 37bf0654SBALATON Zoltan         port->ctrl |= OHCI_PORT_CSC;
1828 37bf0654SBALATON Zoltan     }
1829 37bf0654SBALATON Zoltan     /* disable port */
1830 37bf0654SBALATON Zoltan     if (port->ctrl & OHCI_PORT_PES) {
1831 37bf0654SBALATON Zoltan         port->ctrl &= ~OHCI_PORT_PES;
1832 37bf0654SBALATON Zoltan         port->ctrl |= OHCI_PORT_PESC;
1833 37bf0654SBALATON Zoltan     }
1834 37bf0654SBALATON Zoltan     trace_usb_ohci_port_detach(port1->index);
1835 37bf0654SBALATON Zoltan 
1836 37bf0654SBALATON Zoltan     if (old_state != port->ctrl) {
1837 37bf0654SBALATON Zoltan         ohci_set_interrupt(s, OHCI_INTR_RHSC);
1838 37bf0654SBALATON Zoltan     }
1839 37bf0654SBALATON Zoltan }
1840 37bf0654SBALATON Zoltan 
ohci_wakeup(USBPort * port1)1841 37bf0654SBALATON Zoltan static void ohci_wakeup(USBPort *port1)
1842 37bf0654SBALATON Zoltan {
1843 37bf0654SBALATON Zoltan     OHCIState *s = port1->opaque;
1844 37bf0654SBALATON Zoltan     OHCIPort *port = &s->rhport[port1->index];
1845 37bf0654SBALATON Zoltan     uint32_t intr = 0;
1846 37bf0654SBALATON Zoltan     if (port->ctrl & OHCI_PORT_PSS) {
1847 37bf0654SBALATON Zoltan         trace_usb_ohci_port_wakeup(port1->index);
1848 37bf0654SBALATON Zoltan         port->ctrl |= OHCI_PORT_PSSC;
1849 37bf0654SBALATON Zoltan         port->ctrl &= ~OHCI_PORT_PSS;
1850 37bf0654SBALATON Zoltan         intr = OHCI_INTR_RHSC;
1851 37bf0654SBALATON Zoltan     }
1852 37bf0654SBALATON Zoltan     /* Note that the controller can be suspended even if this port is not */
1853 0c38e9ddSBALATON Zoltan     if (ohci_resume(s)) {
1854 37bf0654SBALATON Zoltan         /*
1855 37bf0654SBALATON Zoltan          * In suspend mode only ResumeDetected is possible, not RHSC:
1856 37bf0654SBALATON Zoltan          * see the OHCI spec 5.1.2.3.
1857 37bf0654SBALATON Zoltan          */
1858 37bf0654SBALATON Zoltan         intr = OHCI_INTR_RD;
1859 37bf0654SBALATON Zoltan     }
1860 37bf0654SBALATON Zoltan     ohci_set_interrupt(s, intr);
1861 37bf0654SBALATON Zoltan }
1862 37bf0654SBALATON Zoltan 
ohci_async_complete_packet(USBPort * port,USBPacket * packet)1863 37bf0654SBALATON Zoltan static void ohci_async_complete_packet(USBPort *port, USBPacket *packet)
1864 37bf0654SBALATON Zoltan {
1865 37bf0654SBALATON Zoltan     OHCIState *ohci = container_of(packet, OHCIState, usb_packet);
1866 37bf0654SBALATON Zoltan 
1867 37bf0654SBALATON Zoltan     trace_usb_ohci_async_complete();
1868 37bf0654SBALATON Zoltan     ohci->async_complete = true;
1869 3a4d06f2SBALATON Zoltan     ohci_process_lists(ohci);
1870 37bf0654SBALATON Zoltan }
1871 f1ae32a1SGerd Hoffmann 
1872 f1ae32a1SGerd Hoffmann static USBPortOps ohci_port_ops = {
1873 f1ae32a1SGerd Hoffmann     .attach = ohci_attach,
1874 f1ae32a1SGerd Hoffmann     .detach = ohci_detach,
1875 f1ae32a1SGerd Hoffmann     .child_detach = ohci_child_detach,
1876 f1ae32a1SGerd Hoffmann     .wakeup = ohci_wakeup,
1877 f1ae32a1SGerd Hoffmann     .complete = ohci_async_complete_packet,
1878 f1ae32a1SGerd Hoffmann };
1879 f1ae32a1SGerd Hoffmann 
1880 f1ae32a1SGerd Hoffmann static USBBusOps ohci_bus_ops = {
1881 f1ae32a1SGerd Hoffmann };
1882 f1ae32a1SGerd Hoffmann 
usb_ohci_init(OHCIState * ohci,DeviceState * dev,uint32_t num_ports,dma_addr_t localmem_base,char * masterbus,uint32_t firstport,AddressSpace * as,void (* ohci_die_fn)(OHCIState *),Error ** errp)1883 34d97308SThomas Huth void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports,
1884 34d97308SThomas Huth                    dma_addr_t localmem_base, char *masterbus,
1885 34d97308SThomas Huth                    uint32_t firstport, AddressSpace *as,
1886 4713720aSPhilippe Mathieu-Daudé                    void (*ohci_die_fn)(OHCIState *), Error **errp)
1887 f1ae32a1SGerd Hoffmann {
1888 f4bbaaf5SMarkus Armbruster     Error *err = NULL;
1889 f1ae32a1SGerd Hoffmann     int i;
1890 f1ae32a1SGerd Hoffmann 
1891 df32fd1cSPaolo Bonzini     ohci->as = as;
1892 72e0c127SThomas Huth     ohci->ohci_die = ohci_die_fn;
1893 9ac6a217SDavid Gibson 
1894 d400fc01SThomas Huth     if (num_ports > OHCI_MAX_PORTS) {
1895 b9a3a4f2SLi Qiang         error_setg(errp, "OHCI num-ports=%u is too big (limit is %u ports)",
1896 d400fc01SThomas Huth                    num_ports, OHCI_MAX_PORTS);
1897 d400fc01SThomas Huth         return;
1898 d400fc01SThomas Huth     }
1899 d400fc01SThomas Huth 
1900 f1ae32a1SGerd Hoffmann     if (usb_frame_time == 0) {
1901 f1ae32a1SGerd Hoffmann #ifdef OHCI_TIME_WARP
1902 73bcb24dSRutuja Shah         usb_frame_time = NANOSECONDS_PER_SECOND;
1903 73bcb24dSRutuja Shah         usb_bit_time = NANOSECONDS_PER_SECOND / (USB_HZ / 1000);
1904 f1ae32a1SGerd Hoffmann #else
1905 73bcb24dSRutuja Shah         usb_frame_time = NANOSECONDS_PER_SECOND / 1000;
1906 73bcb24dSRutuja Shah         if (NANOSECONDS_PER_SECOND >= USB_HZ) {
1907 73bcb24dSRutuja Shah             usb_bit_time = NANOSECONDS_PER_SECOND / USB_HZ;
1908 f1ae32a1SGerd Hoffmann         } else {
1909 f1ae32a1SGerd Hoffmann             usb_bit_time = 1;
1910 f1ae32a1SGerd Hoffmann         }
1911 f1ae32a1SGerd Hoffmann #endif
1912 dc1f5988SAlexey Kardashevskiy         trace_usb_ohci_init_time(usb_frame_time, usb_bit_time);
1913 f1ae32a1SGerd Hoffmann     }
1914 f1ae32a1SGerd Hoffmann 
1915 f1ae32a1SGerd Hoffmann     ohci->num_ports = num_ports;
1916 f1ae32a1SGerd Hoffmann     if (masterbus) {
1917 f1ae32a1SGerd Hoffmann         USBPort *ports[OHCI_MAX_PORTS];
1918 f1ae32a1SGerd Hoffmann         for (i = 0; i < num_ports; i++) {
1919 f1ae32a1SGerd Hoffmann             ports[i] = &ohci->rhport[i].port;
1920 f1ae32a1SGerd Hoffmann         }
1921 f4bbaaf5SMarkus Armbruster         usb_register_companion(masterbus, ports, num_ports,
1922 f1ae32a1SGerd Hoffmann                                firstport, ohci, &ohci_port_ops,
1923 f4bbaaf5SMarkus Armbruster                                USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL,
1924 f4bbaaf5SMarkus Armbruster                                &err);
1925 f4bbaaf5SMarkus Armbruster         if (err) {
1926 87581feaSMarkus Armbruster             error_propagate(errp, err);
1927 87581feaSMarkus Armbruster             return;
1928 f1ae32a1SGerd Hoffmann         }
1929 f1ae32a1SGerd Hoffmann     } else {
1930 c889b3a5SAndreas Färber         usb_bus_new(&ohci->bus, sizeof(ohci->bus), &ohci_bus_ops, dev);
1931 f1ae32a1SGerd Hoffmann         for (i = 0; i < num_ports; i++) {
1932 f1ae32a1SGerd Hoffmann             usb_register_port(&ohci->bus, &ohci->rhport[i].port,
1933 f1ae32a1SGerd Hoffmann                               ohci, i, &ohci_port_ops,
1934 f1ae32a1SGerd Hoffmann                               USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
1935 f1ae32a1SGerd Hoffmann         }
1936 f1ae32a1SGerd Hoffmann     }
1937 f1ae32a1SGerd Hoffmann 
1938 22fc860bSPaolo Bonzini     memory_region_init_io(&ohci->mem, OBJECT(dev), &ohci_mem_ops,
1939 22fc860bSPaolo Bonzini                           ohci, "ohci", 256);
1940 f1ae32a1SGerd Hoffmann     ohci->localmem_base = localmem_base;
1941 f1ae32a1SGerd Hoffmann 
1942 f1ae32a1SGerd Hoffmann     ohci->name = object_get_typename(OBJECT(dev));
1943 f1ae32a1SGerd Hoffmann     usb_packet_init(&ohci->usb_packet);
1944 f1ae32a1SGerd Hoffmann 
1945 f1ae32a1SGerd Hoffmann     ohci->async_td = 0;
1946 fa1298c2SGerd Hoffmann 
1947 fa1298c2SGerd Hoffmann     ohci->eof_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
1948 fa1298c2SGerd Hoffmann                                    ohci_frame_boundary, ohci);
1949 f1ae32a1SGerd Hoffmann }
1950 f1ae32a1SGerd Hoffmann 
1951 572a6732SBALATON Zoltan /*
1952 72e0c127SThomas Huth  * A typical OHCI will stop operating and set itself into error state
1953 72e0c127SThomas Huth  * (which can be queried by MMIO) to signal that it got an error.
1954 cf66ee8eSAlexey Kardashevskiy  */
ohci_sysbus_die(struct OHCIState * ohci)1955 34d97308SThomas Huth void ohci_sysbus_die(struct OHCIState *ohci)
1956 cf66ee8eSAlexey Kardashevskiy {
1957 dc1f5988SAlexey Kardashevskiy     trace_usb_ohci_die();
1958 cf66ee8eSAlexey Kardashevskiy 
1959 cf66ee8eSAlexey Kardashevskiy     ohci_set_interrupt(ohci, OHCI_INTR_UE);
1960 cf66ee8eSAlexey Kardashevskiy     ohci_bus_stop(ohci);
1961 72e0c127SThomas Huth }
1962 72e0c127SThomas Huth 
1963 69e25d26SAlexey Kardashevskiy static const VMStateDescription vmstate_ohci_state_port = {
1964 69e25d26SAlexey Kardashevskiy     .name = "ohci-core/port",
1965 69e25d26SAlexey Kardashevskiy     .version_id = 1,
1966 69e25d26SAlexey Kardashevskiy     .minimum_version_id = 1,
1967 3abedf29SRichard Henderson     .fields = (const VMStateField[]) {
1968 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(ctrl, OHCIPort),
1969 69e25d26SAlexey Kardashevskiy         VMSTATE_END_OF_LIST()
1970 69e25d26SAlexey Kardashevskiy     },
1971 69e25d26SAlexey Kardashevskiy };
1972 69e25d26SAlexey Kardashevskiy 
ohci_eof_timer_needed(void * opaque)1973 69e25d26SAlexey Kardashevskiy static bool ohci_eof_timer_needed(void *opaque)
1974 69e25d26SAlexey Kardashevskiy {
1975 69e25d26SAlexey Kardashevskiy     OHCIState *ohci = opaque;
1976 69e25d26SAlexey Kardashevskiy 
1977 fa1298c2SGerd Hoffmann     return timer_pending(ohci->eof_timer);
1978 69e25d26SAlexey Kardashevskiy }
1979 69e25d26SAlexey Kardashevskiy 
1980 69e25d26SAlexey Kardashevskiy static const VMStateDescription vmstate_ohci_eof_timer = {
1981 69e25d26SAlexey Kardashevskiy     .name = "ohci-core/eof-timer",
1982 69e25d26SAlexey Kardashevskiy     .version_id = 1,
1983 69e25d26SAlexey Kardashevskiy     .minimum_version_id = 1,
1984 5cd8cadaSJuan Quintela     .needed = ohci_eof_timer_needed,
1985 3abedf29SRichard Henderson     .fields = (const VMStateField[]) {
1986 e720677eSPaolo Bonzini         VMSTATE_TIMER_PTR(eof_timer, OHCIState),
1987 69e25d26SAlexey Kardashevskiy         VMSTATE_END_OF_LIST()
1988 69e25d26SAlexey Kardashevskiy     },
1989 69e25d26SAlexey Kardashevskiy };
1990 69e25d26SAlexey Kardashevskiy 
1991 34d97308SThomas Huth const VMStateDescription vmstate_ohci_state = {
1992 69e25d26SAlexey Kardashevskiy     .name = "ohci-core",
1993 69e25d26SAlexey Kardashevskiy     .version_id = 1,
1994 69e25d26SAlexey Kardashevskiy     .minimum_version_id = 1,
1995 3abedf29SRichard Henderson     .fields = (const VMStateField[]) {
1996 69e25d26SAlexey Kardashevskiy         VMSTATE_INT64(sof_time, OHCIState),
1997 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(ctl, OHCIState),
1998 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(status, OHCIState),
1999 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(intr_status, OHCIState),
2000 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(intr, OHCIState),
2001 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(hcca, OHCIState),
2002 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(ctrl_head, OHCIState),
2003 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(ctrl_cur, OHCIState),
2004 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(bulk_head, OHCIState),
2005 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(bulk_cur, OHCIState),
2006 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(per_cur, OHCIState),
2007 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(done, OHCIState),
2008 69e25d26SAlexey Kardashevskiy         VMSTATE_INT32(done_count, OHCIState),
2009 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT16(fsmps, OHCIState),
2010 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT8(fit, OHCIState),
2011 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT16(fi, OHCIState),
2012 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT8(frt, OHCIState),
2013 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT16(frame_number, OHCIState),
2014 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT16(padding, OHCIState),
2015 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(pstart, OHCIState),
2016 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(lst, OHCIState),
2017 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(rhdesc_a, OHCIState),
2018 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(rhdesc_b, OHCIState),
2019 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(rhstatus, OHCIState),
2020 69e25d26SAlexey Kardashevskiy         VMSTATE_STRUCT_ARRAY(rhport, OHCIState, OHCI_MAX_PORTS, 0,
2021 69e25d26SAlexey Kardashevskiy                              vmstate_ohci_state_port, OHCIPort),
2022 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(hstatus, OHCIState),
2023 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(hmask, OHCIState),
2024 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(hreset, OHCIState),
2025 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(htest, OHCIState),
2026 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(old_ctl, OHCIState),
2027 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT8_ARRAY(usb_buf, OHCIState, 8192),
2028 69e25d26SAlexey Kardashevskiy         VMSTATE_UINT32(async_td, OHCIState),
2029 69e25d26SAlexey Kardashevskiy         VMSTATE_BOOL(async_complete, OHCIState),
2030 69e25d26SAlexey Kardashevskiy         VMSTATE_END_OF_LIST()
2031 69e25d26SAlexey Kardashevskiy     },
2032 3abedf29SRichard Henderson     .subsections = (const VMStateDescription * const []) {
2033 5cd8cadaSJuan Quintela         &vmstate_ohci_eof_timer,
2034 5cd8cadaSJuan Quintela         NULL
2035 69e25d26SAlexey Kardashevskiy     }
2036 69e25d26SAlexey Kardashevskiy };
2037