Statistics
| Branch: | Revision:

root / hw / usb / hcd-ohci.c @ f487b677

History | View | Annotate | Download (55.3 kB)

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