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