Statistics
| Branch: | Revision:

root / hw / usb-ohci.c @ 7ed208c4

History | View | Annotate | Download (49.8 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 87ecb68b pbrook
#include "hw.h"
30 87ecb68b pbrook
#include "qemu-timer.h"
31 87ecb68b pbrook
#include "usb.h"
32 87ecb68b pbrook
#include "pci.h"
33 9596ebb7 pbrook
#include "pxa.h"
34 ac611340 aurel32
#include "devices.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 0d92ed30 pbrook
#define dprintf printf
45 0d92ed30 pbrook
#else
46 0d92ed30 pbrook
#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 e24ad6f1 pbrook
enum ohci_type {
62 e24ad6f1 pbrook
    OHCI_TYPE_PCI,
63 ac611340 aurel32
    OHCI_TYPE_PXA,
64 ac611340 aurel32
    OHCI_TYPE_SM501,
65 e24ad6f1 pbrook
};
66 e24ad6f1 pbrook
67 0d92ed30 pbrook
typedef struct {
68 d537cf6c pbrook
    qemu_irq irq;
69 e24ad6f1 pbrook
    enum ohci_type type;
70 0d92ed30 pbrook
    int mem;
71 0d92ed30 pbrook
    int num_ports;
72 e24ad6f1 pbrook
    const char *name;
73 0d92ed30 pbrook
74 0d92ed30 pbrook
    QEMUTimer *eof_timer;
75 0d92ed30 pbrook
    int64_t sof_time;
76 0d92ed30 pbrook
77 0d92ed30 pbrook
    /* OHCI state */
78 0d92ed30 pbrook
    /* Control partition */
79 0d92ed30 pbrook
    uint32_t ctl, status;
80 0d92ed30 pbrook
    uint32_t intr_status;
81 0d92ed30 pbrook
    uint32_t intr;
82 0d92ed30 pbrook
83 0d92ed30 pbrook
    /* memory pointer partition */
84 0d92ed30 pbrook
    uint32_t hcca;
85 0d92ed30 pbrook
    uint32_t ctrl_head, ctrl_cur;
86 0d92ed30 pbrook
    uint32_t bulk_head, bulk_cur;
87 0d92ed30 pbrook
    uint32_t per_cur;
88 0d92ed30 pbrook
    uint32_t done;
89 0d92ed30 pbrook
    int done_count;
90 0d92ed30 pbrook
91 0d92ed30 pbrook
    /* Frame counter partition */
92 0d92ed30 pbrook
    uint32_t fsmps:15;
93 0d92ed30 pbrook
    uint32_t fit:1;
94 0d92ed30 pbrook
    uint32_t fi:14;
95 0d92ed30 pbrook
    uint32_t frt:1;
96 0d92ed30 pbrook
    uint16_t frame_number;
97 0d92ed30 pbrook
    uint16_t padding;
98 0d92ed30 pbrook
    uint32_t pstart;
99 0d92ed30 pbrook
    uint32_t lst;
100 0d92ed30 pbrook
101 0d92ed30 pbrook
    /* Root Hub partition */
102 0d92ed30 pbrook
    uint32_t rhdesc_a, rhdesc_b;
103 0d92ed30 pbrook
    uint32_t rhstatus;
104 0d92ed30 pbrook
    OHCIPort rhport[OHCI_MAX_PORTS];
105 4d611c9a pbrook
106 e24ad6f1 pbrook
    /* PXA27x Non-OHCI events */
107 e24ad6f1 pbrook
    uint32_t hstatus;
108 e24ad6f1 pbrook
    uint32_t hmask;
109 e24ad6f1 pbrook
    uint32_t hreset;
110 e24ad6f1 pbrook
    uint32_t htest;
111 e24ad6f1 pbrook
112 ac611340 aurel32
    /* SM501 local memory offset */
113 ac611340 aurel32
    target_phys_addr_t localmem_base;
114 ac611340 aurel32
115 4d611c9a pbrook
    /* Active packets.  */
116 4d611c9a pbrook
    uint32_t old_ctl;
117 4d611c9a pbrook
    USBPacket usb_packet;
118 4d611c9a pbrook
    uint8_t usb_buf[8192];
119 4d611c9a pbrook
    uint32_t async_td;
120 4d611c9a pbrook
    int async_complete;
121 4d611c9a pbrook
122 0d92ed30 pbrook
} OHCIState;
123 0d92ed30 pbrook
124 0d92ed30 pbrook
/* Host Controller Communications Area */
125 0d92ed30 pbrook
struct ohci_hcca {
126 0d92ed30 pbrook
    uint32_t intr[32];
127 0d92ed30 pbrook
    uint16_t frame, pad;
128 0d92ed30 pbrook
    uint32_t done;
129 0d92ed30 pbrook
};
130 0d92ed30 pbrook
131 73221b12 ths
static void ohci_bus_stop(OHCIState *ohci);
132 73221b12 ths
133 0d92ed30 pbrook
/* Bitfields for the first word of an Endpoint Desciptor.  */
134 0d92ed30 pbrook
#define OHCI_ED_FA_SHIFT  0
135 0d92ed30 pbrook
#define OHCI_ED_FA_MASK   (0x7f<<OHCI_ED_FA_SHIFT)
136 0d92ed30 pbrook
#define OHCI_ED_EN_SHIFT  7
137 0d92ed30 pbrook
#define OHCI_ED_EN_MASK   (0xf<<OHCI_ED_EN_SHIFT)
138 0d92ed30 pbrook
#define OHCI_ED_D_SHIFT   11
139 0d92ed30 pbrook
#define OHCI_ED_D_MASK    (3<<OHCI_ED_D_SHIFT)
140 0d92ed30 pbrook
#define OHCI_ED_S         (1<<13)
141 0d92ed30 pbrook
#define OHCI_ED_K         (1<<14)
142 0d92ed30 pbrook
#define OHCI_ED_F         (1<<15)
143 7bfe5777 balrog
#define OHCI_ED_MPS_SHIFT 16
144 7bfe5777 balrog
#define OHCI_ED_MPS_MASK  (0x7ff<<OHCI_ED_MPS_SHIFT)
145 0d92ed30 pbrook
146 0d92ed30 pbrook
/* Flags in the head field of an Endpoint Desciptor.  */
147 0d92ed30 pbrook
#define OHCI_ED_H         1
148 0d92ed30 pbrook
#define OHCI_ED_C         2
149 0d92ed30 pbrook
150 0d92ed30 pbrook
/* Bitfields for the first word of a Transfer Desciptor.  */
151 0d92ed30 pbrook
#define OHCI_TD_R         (1<<18)
152 0d92ed30 pbrook
#define OHCI_TD_DP_SHIFT  19
153 0d92ed30 pbrook
#define OHCI_TD_DP_MASK   (3<<OHCI_TD_DP_SHIFT)
154 0d92ed30 pbrook
#define OHCI_TD_DI_SHIFT  21
155 0d92ed30 pbrook
#define OHCI_TD_DI_MASK   (7<<OHCI_TD_DI_SHIFT)
156 0d92ed30 pbrook
#define OHCI_TD_T0        (1<<24)
157 0d92ed30 pbrook
#define OHCI_TD_T1        (1<<24)
158 0d92ed30 pbrook
#define OHCI_TD_EC_SHIFT  26
159 0d92ed30 pbrook
#define OHCI_TD_EC_MASK   (3<<OHCI_TD_EC_SHIFT)
160 0d92ed30 pbrook
#define OHCI_TD_CC_SHIFT  28
161 0d92ed30 pbrook
#define OHCI_TD_CC_MASK   (0xf<<OHCI_TD_CC_SHIFT)
162 0d92ed30 pbrook
163 7bfe5777 balrog
/* Bitfields for the first word of an Isochronous Transfer Desciptor.  */
164 7bfe5777 balrog
/* CC & DI - same as in the General Transfer Desciptor */
165 7bfe5777 balrog
#define OHCI_TD_SF_SHIFT  0
166 7bfe5777 balrog
#define OHCI_TD_SF_MASK   (0xffff<<OHCI_TD_SF_SHIFT)
167 7bfe5777 balrog
#define OHCI_TD_FC_SHIFT  24
168 7bfe5777 balrog
#define OHCI_TD_FC_MASK   (7<<OHCI_TD_FC_SHIFT)
169 7bfe5777 balrog
170 7bfe5777 balrog
/* Isochronous Transfer Desciptor - Offset / PacketStatusWord */
171 7bfe5777 balrog
#define OHCI_TD_PSW_CC_SHIFT 12
172 7bfe5777 balrog
#define OHCI_TD_PSW_CC_MASK  (0xf<<OHCI_TD_PSW_CC_SHIFT)
173 7bfe5777 balrog
#define OHCI_TD_PSW_SIZE_SHIFT 0
174 7bfe5777 balrog
#define OHCI_TD_PSW_SIZE_MASK  (0xfff<<OHCI_TD_PSW_SIZE_SHIFT)
175 7bfe5777 balrog
176 7bfe5777 balrog
#define OHCI_PAGE_MASK    0xfffff000
177 7bfe5777 balrog
#define OHCI_OFFSET_MASK  0xfff
178 7bfe5777 balrog
179 0d92ed30 pbrook
#define OHCI_DPTR_MASK    0xfffffff0
180 0d92ed30 pbrook
181 0d92ed30 pbrook
#define OHCI_BM(val, field) \
182 0d92ed30 pbrook
  (((val) & OHCI_##field##_MASK) >> OHCI_##field##_SHIFT)
183 0d92ed30 pbrook
184 0d92ed30 pbrook
#define OHCI_SET_BM(val, field, newval) do { \
185 0d92ed30 pbrook
    val &= ~OHCI_##field##_MASK; \
186 0d92ed30 pbrook
    val |= ((newval) << OHCI_##field##_SHIFT) & OHCI_##field##_MASK; \
187 0d92ed30 pbrook
    } while(0)
188 0d92ed30 pbrook
189 0d92ed30 pbrook
/* endpoint descriptor */
190 0d92ed30 pbrook
struct ohci_ed {
191 0d92ed30 pbrook
    uint32_t flags;
192 0d92ed30 pbrook
    uint32_t tail;
193 0d92ed30 pbrook
    uint32_t head;
194 0d92ed30 pbrook
    uint32_t next;
195 0d92ed30 pbrook
};
196 0d92ed30 pbrook
197 0d92ed30 pbrook
/* General transfer descriptor */
198 0d92ed30 pbrook
struct ohci_td {
199 0d92ed30 pbrook
    uint32_t flags;
200 0d92ed30 pbrook
    uint32_t cbp;
201 0d92ed30 pbrook
    uint32_t next;
202 0d92ed30 pbrook
    uint32_t be;
203 0d92ed30 pbrook
};
204 0d92ed30 pbrook
205 7bfe5777 balrog
/* Isochronous transfer descriptor */
206 7bfe5777 balrog
struct ohci_iso_td {
207 7bfe5777 balrog
    uint32_t flags;
208 7bfe5777 balrog
    uint32_t bp;
209 7bfe5777 balrog
    uint32_t next;
210 7bfe5777 balrog
    uint32_t be;
211 7bfe5777 balrog
    uint16_t offset[8];
212 7bfe5777 balrog
};
213 7bfe5777 balrog
214 0d92ed30 pbrook
#define USB_HZ                      12000000
215 0d92ed30 pbrook
216 0d92ed30 pbrook
/* OHCI Local stuff */
217 0d92ed30 pbrook
#define OHCI_CTL_CBSR         ((1<<0)|(1<<1))
218 0d92ed30 pbrook
#define OHCI_CTL_PLE          (1<<2)
219 0d92ed30 pbrook
#define OHCI_CTL_IE           (1<<3)
220 0d92ed30 pbrook
#define OHCI_CTL_CLE          (1<<4)
221 0d92ed30 pbrook
#define OHCI_CTL_BLE          (1<<5)
222 0d92ed30 pbrook
#define OHCI_CTL_HCFS         ((1<<6)|(1<<7))
223 0d92ed30 pbrook
#define  OHCI_USB_RESET       0x00
224 0d92ed30 pbrook
#define  OHCI_USB_RESUME      0x40
225 0d92ed30 pbrook
#define  OHCI_USB_OPERATIONAL 0x80
226 0d92ed30 pbrook
#define  OHCI_USB_SUSPEND     0xc0
227 0d92ed30 pbrook
#define OHCI_CTL_IR           (1<<8)
228 0d92ed30 pbrook
#define OHCI_CTL_RWC          (1<<9)
229 0d92ed30 pbrook
#define OHCI_CTL_RWE          (1<<10)
230 0d92ed30 pbrook
231 0d92ed30 pbrook
#define OHCI_STATUS_HCR       (1<<0)
232 0d92ed30 pbrook
#define OHCI_STATUS_CLF       (1<<1)
233 0d92ed30 pbrook
#define OHCI_STATUS_BLF       (1<<2)
234 0d92ed30 pbrook
#define OHCI_STATUS_OCR       (1<<3)
235 0d92ed30 pbrook
#define OHCI_STATUS_SOC       ((1<<6)|(1<<7))
236 0d92ed30 pbrook
237 0d92ed30 pbrook
#define OHCI_INTR_SO          (1<<0) /* Scheduling overrun */
238 0d92ed30 pbrook
#define OHCI_INTR_WD          (1<<1) /* HcDoneHead writeback */
239 0d92ed30 pbrook
#define OHCI_INTR_SF          (1<<2) /* Start of frame */
240 0d92ed30 pbrook
#define OHCI_INTR_RD          (1<<3) /* Resume detect */
241 0d92ed30 pbrook
#define OHCI_INTR_UE          (1<<4) /* Unrecoverable error */
242 0d92ed30 pbrook
#define OHCI_INTR_FNO         (1<<5) /* Frame number overflow */
243 0d92ed30 pbrook
#define OHCI_INTR_RHSC        (1<<6) /* Root hub status change */
244 0d92ed30 pbrook
#define OHCI_INTR_OC          (1<<30) /* Ownership change */
245 0d92ed30 pbrook
#define OHCI_INTR_MIE         (1<<31) /* Master Interrupt Enable */
246 0d92ed30 pbrook
247 0d92ed30 pbrook
#define OHCI_HCCA_SIZE        0x100
248 0d92ed30 pbrook
#define OHCI_HCCA_MASK        0xffffff00
249 0d92ed30 pbrook
250 0d92ed30 pbrook
#define OHCI_EDPTR_MASK       0xfffffff0
251 0d92ed30 pbrook
252 0d92ed30 pbrook
#define OHCI_FMI_FI           0x00003fff
253 0d92ed30 pbrook
#define OHCI_FMI_FSMPS        0xffff0000
254 0d92ed30 pbrook
#define OHCI_FMI_FIT          0x80000000
255 0d92ed30 pbrook
256 0d92ed30 pbrook
#define OHCI_FR_RT            (1<<31)
257 0d92ed30 pbrook
258 0d92ed30 pbrook
#define OHCI_LS_THRESH        0x628
259 0d92ed30 pbrook
260 0d92ed30 pbrook
#define OHCI_RHA_RW_MASK      0x00000000 /* Mask of supported features.  */
261 0d92ed30 pbrook
#define OHCI_RHA_PSM          (1<<8)
262 0d92ed30 pbrook
#define OHCI_RHA_NPS          (1<<9)
263 0d92ed30 pbrook
#define OHCI_RHA_DT           (1<<10)
264 0d92ed30 pbrook
#define OHCI_RHA_OCPM         (1<<11)
265 0d92ed30 pbrook
#define OHCI_RHA_NOCP         (1<<12)
266 0d92ed30 pbrook
#define OHCI_RHA_POTPGT_MASK  0xff000000
267 0d92ed30 pbrook
268 0d92ed30 pbrook
#define OHCI_RHS_LPS          (1<<0)
269 0d92ed30 pbrook
#define OHCI_RHS_OCI          (1<<1)
270 0d92ed30 pbrook
#define OHCI_RHS_DRWE         (1<<15)
271 0d92ed30 pbrook
#define OHCI_RHS_LPSC         (1<<16)
272 0d92ed30 pbrook
#define OHCI_RHS_OCIC         (1<<17)
273 0d92ed30 pbrook
#define OHCI_RHS_CRWE         (1<<31)
274 0d92ed30 pbrook
275 0d92ed30 pbrook
#define OHCI_PORT_CCS         (1<<0)
276 0d92ed30 pbrook
#define OHCI_PORT_PES         (1<<1)
277 0d92ed30 pbrook
#define OHCI_PORT_PSS         (1<<2)
278 0d92ed30 pbrook
#define OHCI_PORT_POCI        (1<<3)
279 0d92ed30 pbrook
#define OHCI_PORT_PRS         (1<<4)
280 0d92ed30 pbrook
#define OHCI_PORT_PPS         (1<<8)
281 0d92ed30 pbrook
#define OHCI_PORT_LSDA        (1<<9)
282 0d92ed30 pbrook
#define OHCI_PORT_CSC         (1<<16)
283 0d92ed30 pbrook
#define OHCI_PORT_PESC        (1<<17)
284 0d92ed30 pbrook
#define OHCI_PORT_PSSC        (1<<18)
285 0d92ed30 pbrook
#define OHCI_PORT_OCIC        (1<<19)
286 0d92ed30 pbrook
#define OHCI_PORT_PRSC        (1<<20)
287 0d92ed30 pbrook
#define OHCI_PORT_WTC         (OHCI_PORT_CSC|OHCI_PORT_PESC|OHCI_PORT_PSSC \
288 0d92ed30 pbrook
                               |OHCI_PORT_OCIC|OHCI_PORT_PRSC)
289 0d92ed30 pbrook
290 0d92ed30 pbrook
#define OHCI_TD_DIR_SETUP     0x0
291 0d92ed30 pbrook
#define OHCI_TD_DIR_OUT       0x1
292 0d92ed30 pbrook
#define OHCI_TD_DIR_IN        0x2
293 0d92ed30 pbrook
#define OHCI_TD_DIR_RESERVED  0x3
294 0d92ed30 pbrook
295 0d92ed30 pbrook
#define OHCI_CC_NOERROR             0x0
296 0d92ed30 pbrook
#define OHCI_CC_CRC                 0x1
297 0d92ed30 pbrook
#define OHCI_CC_BITSTUFFING         0x2
298 0d92ed30 pbrook
#define OHCI_CC_DATATOGGLEMISMATCH  0x3
299 0d92ed30 pbrook
#define OHCI_CC_STALL               0x4
300 0d92ed30 pbrook
#define OHCI_CC_DEVICENOTRESPONDING 0x5
301 0d92ed30 pbrook
#define OHCI_CC_PIDCHECKFAILURE     0x6
302 0d92ed30 pbrook
#define OHCI_CC_UNDEXPETEDPID       0x7
303 0d92ed30 pbrook
#define OHCI_CC_DATAOVERRUN         0x8
304 0d92ed30 pbrook
#define OHCI_CC_DATAUNDERRUN        0x9
305 0d92ed30 pbrook
#define OHCI_CC_BUFFEROVERRUN       0xc
306 0d92ed30 pbrook
#define OHCI_CC_BUFFERUNDERRUN      0xd
307 0d92ed30 pbrook
308 e24ad6f1 pbrook
#define OHCI_HRESET_FSBIR       (1 << 0)
309 e24ad6f1 pbrook
310 61064870 pbrook
/* Update IRQ levels */
311 61064870 pbrook
static inline void ohci_intr_update(OHCIState *ohci)
312 61064870 pbrook
{
313 61064870 pbrook
    int level = 0;
314 61064870 pbrook
315 61064870 pbrook
    if ((ohci->intr & OHCI_INTR_MIE) &&
316 61064870 pbrook
        (ohci->intr_status & ohci->intr))
317 61064870 pbrook
        level = 1;
318 61064870 pbrook
319 d537cf6c pbrook
    qemu_set_irq(ohci->irq, level);
320 61064870 pbrook
}
321 61064870 pbrook
322 61064870 pbrook
/* Set an interrupt */
323 61064870 pbrook
static inline void ohci_set_interrupt(OHCIState *ohci, uint32_t intr)
324 61064870 pbrook
{
325 61064870 pbrook
    ohci->intr_status |= intr;
326 61064870 pbrook
    ohci_intr_update(ohci);
327 61064870 pbrook
}
328 61064870 pbrook
329 61064870 pbrook
/* Attach or detach a device on a root hub port.  */
330 0d92ed30 pbrook
static void ohci_attach(USBPort *port1, USBDevice *dev)
331 0d92ed30 pbrook
{
332 0d92ed30 pbrook
    OHCIState *s = port1->opaque;
333 0d92ed30 pbrook
    OHCIPort *port = &s->rhport[port1->index];
334 61064870 pbrook
    uint32_t old_state = port->ctrl;
335 0d92ed30 pbrook
336 0d92ed30 pbrook
    if (dev) {
337 0d92ed30 pbrook
        if (port->port.dev) {
338 0d92ed30 pbrook
            usb_attach(port1, NULL);
339 0d92ed30 pbrook
        }
340 0d92ed30 pbrook
        /* set connect status */
341 61064870 pbrook
        port->ctrl |= OHCI_PORT_CCS | OHCI_PORT_CSC;
342 61064870 pbrook
343 0d92ed30 pbrook
        /* update speed */
344 0d92ed30 pbrook
        if (dev->speed == USB_SPEED_LOW)
345 0d92ed30 pbrook
            port->ctrl |= OHCI_PORT_LSDA;
346 0d92ed30 pbrook
        else
347 0d92ed30 pbrook
            port->ctrl &= ~OHCI_PORT_LSDA;
348 0d92ed30 pbrook
        port->port.dev = dev;
349 e24ad6f1 pbrook
350 e24ad6f1 pbrook
        /* notify of remote-wakeup */
351 e24ad6f1 pbrook
        if ((s->ctl & OHCI_CTL_HCFS) == OHCI_USB_SUSPEND)
352 e24ad6f1 pbrook
            ohci_set_interrupt(s, OHCI_INTR_RD);
353 e24ad6f1 pbrook
354 0d92ed30 pbrook
        /* send the attach message */
355 4d611c9a pbrook
        usb_send_msg(dev, USB_MSG_ATTACH);
356 0d92ed30 pbrook
        dprintf("usb-ohci: Attached port %d\n", port1->index);
357 0d92ed30 pbrook
    } else {
358 0d92ed30 pbrook
        /* set connect status */
359 61064870 pbrook
        if (port->ctrl & OHCI_PORT_CCS) {
360 61064870 pbrook
            port->ctrl &= ~OHCI_PORT_CCS;
361 61064870 pbrook
            port->ctrl |= OHCI_PORT_CSC;
362 0d92ed30 pbrook
        }
363 0d92ed30 pbrook
        /* disable port */
364 0d92ed30 pbrook
        if (port->ctrl & OHCI_PORT_PES) {
365 0d92ed30 pbrook
            port->ctrl &= ~OHCI_PORT_PES;
366 0d92ed30 pbrook
            port->ctrl |= OHCI_PORT_PESC;
367 0d92ed30 pbrook
        }
368 0d92ed30 pbrook
        dev = port->port.dev;
369 0d92ed30 pbrook
        if (dev) {
370 0d92ed30 pbrook
            /* send the detach message */
371 4d611c9a pbrook
            usb_send_msg(dev, USB_MSG_DETACH);
372 0d92ed30 pbrook
        }
373 0d92ed30 pbrook
        port->port.dev = NULL;
374 0d92ed30 pbrook
        dprintf("usb-ohci: Detached port %d\n", port1->index);
375 0d92ed30 pbrook
    }
376 61064870 pbrook
377 61064870 pbrook
    if (old_state != port->ctrl)
378 61064870 pbrook
        ohci_set_interrupt(s, OHCI_INTR_RHSC);
379 0d92ed30 pbrook
}
380 0d92ed30 pbrook
381 0d92ed30 pbrook
/* Reset the controller */
382 73221b12 ths
static void ohci_reset(void *opaque)
383 0d92ed30 pbrook
{
384 73221b12 ths
    OHCIState *ohci = opaque;
385 0d92ed30 pbrook
    OHCIPort *port;
386 0d92ed30 pbrook
    int i;
387 0d92ed30 pbrook
388 73221b12 ths
    ohci_bus_stop(ohci);
389 0d92ed30 pbrook
    ohci->ctl = 0;
390 4d611c9a pbrook
    ohci->old_ctl = 0;
391 0d92ed30 pbrook
    ohci->status = 0;
392 0d92ed30 pbrook
    ohci->intr_status = 0;
393 0d92ed30 pbrook
    ohci->intr = OHCI_INTR_MIE;
394 0d92ed30 pbrook
395 0d92ed30 pbrook
    ohci->hcca = 0;
396 0d92ed30 pbrook
    ohci->ctrl_head = ohci->ctrl_cur = 0;
397 0d92ed30 pbrook
    ohci->bulk_head = ohci->bulk_cur = 0;
398 0d92ed30 pbrook
    ohci->per_cur = 0;
399 0d92ed30 pbrook
    ohci->done = 0;
400 0d92ed30 pbrook
    ohci->done_count = 7;
401 0d92ed30 pbrook
402 0d92ed30 pbrook
    /* FSMPS is marked TBD in OCHI 1.0, what gives ffs?
403 0d92ed30 pbrook
     * I took the value linux sets ...
404 0d92ed30 pbrook
     */
405 0d92ed30 pbrook
    ohci->fsmps = 0x2778;
406 0d92ed30 pbrook
    ohci->fi = 0x2edf;
407 0d92ed30 pbrook
    ohci->fit = 0;
408 0d92ed30 pbrook
    ohci->frt = 0;
409 0d92ed30 pbrook
    ohci->frame_number = 0;
410 0d92ed30 pbrook
    ohci->pstart = 0;
411 0d92ed30 pbrook
    ohci->lst = OHCI_LS_THRESH;
412 0d92ed30 pbrook
413 0d92ed30 pbrook
    ohci->rhdesc_a = OHCI_RHA_NPS | ohci->num_ports;
414 0d92ed30 pbrook
    ohci->rhdesc_b = 0x0; /* Impl. specific */
415 0d92ed30 pbrook
    ohci->rhstatus = 0;
416 0d92ed30 pbrook
417 0d92ed30 pbrook
    for (i = 0; i < ohci->num_ports; i++)
418 0d92ed30 pbrook
      {
419 0d92ed30 pbrook
        port = &ohci->rhport[i];
420 0d92ed30 pbrook
        port->ctrl = 0;
421 0d92ed30 pbrook
        if (port->port.dev)
422 0d92ed30 pbrook
            ohci_attach(&port->port, port->port.dev);
423 0d92ed30 pbrook
      }
424 4d611c9a pbrook
    if (ohci->async_td) {
425 4d611c9a pbrook
        usb_cancel_packet(&ohci->usb_packet);
426 4d611c9a pbrook
        ohci->async_td = 0;
427 4d611c9a pbrook
    }
428 e24ad6f1 pbrook
    dprintf("usb-ohci: Reset %s\n", ohci->name);
429 0d92ed30 pbrook
}
430 0d92ed30 pbrook
431 0d92ed30 pbrook
/* Get an array of dwords from main memory */
432 ac611340 aurel32
static inline int get_dwords(OHCIState *ohci,
433 ac611340 aurel32
                             uint32_t addr, uint32_t *buf, int num)
434 0d92ed30 pbrook
{
435 0d92ed30 pbrook
    int i;
436 0d92ed30 pbrook
437 ac611340 aurel32
    addr += ohci->localmem_base;
438 ac611340 aurel32
439 0d92ed30 pbrook
    for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
440 0d92ed30 pbrook
        cpu_physical_memory_rw(addr, (uint8_t *)buf, sizeof(*buf), 0);
441 0d92ed30 pbrook
        *buf = le32_to_cpu(*buf);
442 0d92ed30 pbrook
    }
443 0d92ed30 pbrook
444 0d92ed30 pbrook
    return 1;
445 0d92ed30 pbrook
}
446 0d92ed30 pbrook
447 0d92ed30 pbrook
/* Put an array of dwords in to main memory */
448 ac611340 aurel32
static inline int put_dwords(OHCIState *ohci,
449 ac611340 aurel32
                             uint32_t addr, uint32_t *buf, int num)
450 0d92ed30 pbrook
{
451 0d92ed30 pbrook
    int i;
452 0d92ed30 pbrook
453 ac611340 aurel32
    addr += ohci->localmem_base;
454 ac611340 aurel32
455 0d92ed30 pbrook
    for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
456 0d92ed30 pbrook
        uint32_t tmp = cpu_to_le32(*buf);
457 0d92ed30 pbrook
        cpu_physical_memory_rw(addr, (uint8_t *)&tmp, sizeof(tmp), 1);
458 0d92ed30 pbrook
    }
459 0d92ed30 pbrook
460 0d92ed30 pbrook
    return 1;
461 0d92ed30 pbrook
}
462 0d92ed30 pbrook
463 7bfe5777 balrog
/* Get an array of words from main memory */
464 ac611340 aurel32
static inline int get_words(OHCIState *ohci,
465 ac611340 aurel32
                            uint32_t addr, uint16_t *buf, int num)
466 7bfe5777 balrog
{
467 7bfe5777 balrog
    int i;
468 7bfe5777 balrog
469 ac611340 aurel32
    addr += ohci->localmem_base;
470 ac611340 aurel32
471 7bfe5777 balrog
    for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
472 7bfe5777 balrog
        cpu_physical_memory_rw(addr, (uint8_t *)buf, sizeof(*buf), 0);
473 7bfe5777 balrog
        *buf = le16_to_cpu(*buf);
474 7bfe5777 balrog
    }
475 7bfe5777 balrog
476 7bfe5777 balrog
    return 1;
477 7bfe5777 balrog
}
478 7bfe5777 balrog
479 7bfe5777 balrog
/* Put an array of words in to main memory */
480 ac611340 aurel32
static inline int put_words(OHCIState *ohci,
481 ac611340 aurel32
                            uint32_t addr, uint16_t *buf, int num)
482 7bfe5777 balrog
{
483 7bfe5777 balrog
    int i;
484 7bfe5777 balrog
485 ac611340 aurel32
    addr += ohci->localmem_base;
486 ac611340 aurel32
487 7bfe5777 balrog
    for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
488 7bfe5777 balrog
        uint16_t tmp = cpu_to_le16(*buf);
489 7bfe5777 balrog
        cpu_physical_memory_rw(addr, (uint8_t *)&tmp, sizeof(tmp), 1);
490 7bfe5777 balrog
    }
491 7bfe5777 balrog
492 7bfe5777 balrog
    return 1;
493 7bfe5777 balrog
}
494 7bfe5777 balrog
495 ac611340 aurel32
static inline int ohci_read_ed(OHCIState *ohci,
496 ac611340 aurel32
                               uint32_t addr, struct ohci_ed *ed)
497 0d92ed30 pbrook
{
498 ac611340 aurel32
    return get_dwords(ohci, addr, (uint32_t *)ed, sizeof(*ed) >> 2);
499 0d92ed30 pbrook
}
500 0d92ed30 pbrook
501 ac611340 aurel32
static inline int ohci_read_td(OHCIState *ohci,
502 ac611340 aurel32
                               uint32_t addr, struct ohci_td *td)
503 0d92ed30 pbrook
{
504 ac611340 aurel32
    return get_dwords(ohci, addr, (uint32_t *)td, sizeof(*td) >> 2);
505 0d92ed30 pbrook
}
506 0d92ed30 pbrook
507 ac611340 aurel32
static inline int ohci_read_iso_td(OHCIState *ohci,
508 ac611340 aurel32
                                   uint32_t addr, struct ohci_iso_td *td)
509 7bfe5777 balrog
{
510 ac611340 aurel32
    return (get_dwords(ohci, addr, (uint32_t *)td, 4) &&
511 ac611340 aurel32
            get_words(ohci, addr + 16, td->offset, 8));
512 7bfe5777 balrog
}
513 7bfe5777 balrog
514 ac611340 aurel32
static inline int ohci_read_hcca(OHCIState *ohci,
515 ac611340 aurel32
                                 uint32_t addr, struct ohci_hcca *hcca)
516 0d92ed30 pbrook
{
517 ac611340 aurel32
    cpu_physical_memory_rw(addr + ohci->localmem_base,
518 ac611340 aurel32
                           (uint8_t *)hcca, sizeof(*hcca), 0);
519 ac611340 aurel32
    return 1;
520 0d92ed30 pbrook
}
521 0d92ed30 pbrook
522 ac611340 aurel32
static inline int ohci_put_ed(OHCIState *ohci,
523 ac611340 aurel32
                              uint32_t addr, struct ohci_ed *ed)
524 0d92ed30 pbrook
{
525 ac611340 aurel32
    return put_dwords(ohci, addr, (uint32_t *)ed, sizeof(*ed) >> 2);
526 0d92ed30 pbrook
}
527 0d92ed30 pbrook
528 ac611340 aurel32
static inline int ohci_put_td(OHCIState *ohci,
529 ac611340 aurel32
                              uint32_t addr, struct ohci_td *td)
530 7bfe5777 balrog
{
531 ac611340 aurel32
    return put_dwords(ohci, addr, (uint32_t *)td, sizeof(*td) >> 2);
532 ac611340 aurel32
}
533 ac611340 aurel32
534 ac611340 aurel32
static inline int ohci_put_iso_td(OHCIState *ohci,
535 ac611340 aurel32
                                  uint32_t addr, struct ohci_iso_td *td)
536 ac611340 aurel32
{
537 ac611340 aurel32
    return (put_dwords(ohci, addr, (uint32_t *)td, 4) &&
538 ac611340 aurel32
            put_words(ohci, addr + 16, td->offset, 8));
539 ac611340 aurel32
}
540 ac611340 aurel32
541 ac611340 aurel32
static inline int ohci_put_hcca(OHCIState *ohci,
542 ac611340 aurel32
                                uint32_t addr, struct ohci_hcca *hcca)
543 ac611340 aurel32
{
544 ac611340 aurel32
    cpu_physical_memory_rw(addr + ohci->localmem_base,
545 ac611340 aurel32
                           (uint8_t *)hcca, sizeof(*hcca), 1);
546 ac611340 aurel32
    return 1;
547 7bfe5777 balrog
}
548 7bfe5777 balrog
549 0d92ed30 pbrook
/* Read/Write the contents of a TD from/to main memory.  */
550 ac611340 aurel32
static void ohci_copy_td(OHCIState *ohci, struct ohci_td *td,
551 ac611340 aurel32
                         uint8_t *buf, int len, int write)
552 0d92ed30 pbrook
{
553 0d92ed30 pbrook
    uint32_t ptr;
554 0d92ed30 pbrook
    uint32_t n;
555 0d92ed30 pbrook
556 0d92ed30 pbrook
    ptr = td->cbp;
557 0d92ed30 pbrook
    n = 0x1000 - (ptr & 0xfff);
558 0d92ed30 pbrook
    if (n > len)
559 0d92ed30 pbrook
        n = len;
560 ac611340 aurel32
    cpu_physical_memory_rw(ptr + ohci->localmem_base, buf, n, write);
561 0d92ed30 pbrook
    if (n == len)
562 0d92ed30 pbrook
        return;
563 0d92ed30 pbrook
    ptr = td->be & ~0xfffu;
564 e6f3e5e0 pbrook
    buf += n;
565 ac611340 aurel32
    cpu_physical_memory_rw(ptr + ohci->localmem_base, buf, len - n, write);
566 0d92ed30 pbrook
}
567 0d92ed30 pbrook
568 7bfe5777 balrog
/* Read/Write the contents of an ISO TD from/to main memory.  */
569 ac611340 aurel32
static void ohci_copy_iso_td(OHCIState *ohci,
570 ac611340 aurel32
                             uint32_t start_addr, uint32_t end_addr,
571 7bfe5777 balrog
                             uint8_t *buf, int len, int write)
572 7bfe5777 balrog
{
573 7bfe5777 balrog
    uint32_t ptr;
574 7bfe5777 balrog
    uint32_t n;
575 4d611c9a pbrook
576 7bfe5777 balrog
    ptr = start_addr;
577 7bfe5777 balrog
    n = 0x1000 - (ptr & 0xfff);
578 7bfe5777 balrog
    if (n > len)
579 7bfe5777 balrog
        n = len;
580 ac611340 aurel32
    cpu_physical_memory_rw(ptr + ohci->localmem_base, buf, n, write);
581 7bfe5777 balrog
    if (n == len)
582 7bfe5777 balrog
        return;
583 7bfe5777 balrog
    ptr = end_addr & ~0xfffu;
584 7bfe5777 balrog
    buf += n;
585 ac611340 aurel32
    cpu_physical_memory_rw(ptr + ohci->localmem_base, buf, len - n, write);
586 7bfe5777 balrog
}
587 7bfe5777 balrog
588 7bfe5777 balrog
static void ohci_process_lists(OHCIState *ohci, int completion);
589 7bfe5777 balrog
590 7bfe5777 balrog
static void ohci_async_complete_packet(USBPacket *packet, void *opaque)
591 4d611c9a pbrook
{
592 4d611c9a pbrook
    OHCIState *ohci = opaque;
593 4d611c9a pbrook
#ifdef DEBUG_PACKET
594 4d611c9a pbrook
    dprintf("Async packet complete\n");
595 4d611c9a pbrook
#endif
596 4d611c9a pbrook
    ohci->async_complete = 1;
597 7bfe5777 balrog
    ohci_process_lists(ohci, 1);
598 7bfe5777 balrog
}
599 7bfe5777 balrog
600 7bfe5777 balrog
#define USUB(a, b) ((int16_t)((uint16_t)(a) - (uint16_t)(b)))
601 7bfe5777 balrog
602 7bfe5777 balrog
static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed,
603 7bfe5777 balrog
                               int completion)
604 7bfe5777 balrog
{
605 7bfe5777 balrog
    int dir;
606 7bfe5777 balrog
    size_t len = 0;
607 7ccfb2eb blueswir1
    const char *str = NULL;
608 7bfe5777 balrog
    int pid;
609 7bfe5777 balrog
    int ret;
610 7bfe5777 balrog
    int i;
611 7bfe5777 balrog
    USBDevice *dev;
612 7bfe5777 balrog
    struct ohci_iso_td iso_td;
613 7bfe5777 balrog
    uint32_t addr;
614 7bfe5777 balrog
    uint16_t starting_frame;
615 7bfe5777 balrog
    int16_t relative_frame_number;
616 7bfe5777 balrog
    int frame_count;
617 7bfe5777 balrog
    uint32_t start_offset, next_offset, end_offset = 0;
618 7bfe5777 balrog
    uint32_t start_addr, end_addr;
619 7bfe5777 balrog
620 7bfe5777 balrog
    addr = ed->head & OHCI_DPTR_MASK;
621 7bfe5777 balrog
622 ac611340 aurel32
    if (!ohci_read_iso_td(ohci, addr, &iso_td)) {
623 7bfe5777 balrog
        printf("usb-ohci: ISO_TD read error at %x\n", addr);
624 7bfe5777 balrog
        return 0;
625 7bfe5777 balrog
    }
626 7bfe5777 balrog
627 7bfe5777 balrog
    starting_frame = OHCI_BM(iso_td.flags, TD_SF);
628 7bfe5777 balrog
    frame_count = OHCI_BM(iso_td.flags, TD_FC);
629 7bfe5777 balrog
    relative_frame_number = USUB(ohci->frame_number, starting_frame); 
630 7bfe5777 balrog
631 7bfe5777 balrog
#ifdef DEBUG_ISOCH
632 7bfe5777 balrog
    printf("--- ISO_TD ED head 0x%.8x tailp 0x%.8x\n"
633 7bfe5777 balrog
           "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n"
634 7bfe5777 balrog
           "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n"
635 7bfe5777 balrog
           "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n"
636 7bfe5777 balrog
           "frame_number 0x%.8x starting_frame 0x%.8x\n"
637 7bfe5777 balrog
           "frame_count  0x%.8x relative %d\n"
638 7bfe5777 balrog
           "di 0x%.8x cc 0x%.8x\n",
639 7bfe5777 balrog
           ed->head & OHCI_DPTR_MASK, ed->tail & OHCI_DPTR_MASK,
640 7bfe5777 balrog
           iso_td.flags, iso_td.bp, iso_td.next, iso_td.be,
641 7bfe5777 balrog
           iso_td.offset[0], iso_td.offset[1], iso_td.offset[2], iso_td.offset[3],
642 7bfe5777 balrog
           iso_td.offset[4], iso_td.offset[5], iso_td.offset[6], iso_td.offset[7],
643 7bfe5777 balrog
           ohci->frame_number, starting_frame, 
644 7bfe5777 balrog
           frame_count, relative_frame_number,         
645 7bfe5777 balrog
           OHCI_BM(iso_td.flags, TD_DI), OHCI_BM(iso_td.flags, TD_CC));
646 7bfe5777 balrog
#endif
647 7bfe5777 balrog
648 7bfe5777 balrog
    if (relative_frame_number < 0) {
649 7bfe5777 balrog
        dprintf("usb-ohci: ISO_TD R=%d < 0\n", relative_frame_number);
650 7bfe5777 balrog
        return 1;
651 7bfe5777 balrog
    } else if (relative_frame_number > frame_count) {
652 7bfe5777 balrog
        /* ISO TD expired - retire the TD to the Done Queue and continue with
653 7bfe5777 balrog
           the next ISO TD of the same ED */
654 7bfe5777 balrog
        dprintf("usb-ohci: ISO_TD R=%d > FC=%d\n", relative_frame_number, 
655 7bfe5777 balrog
               frame_count);
656 7bfe5777 balrog
        OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
657 7bfe5777 balrog
        ed->head &= ~OHCI_DPTR_MASK;
658 7bfe5777 balrog
        ed->head |= (iso_td.next & OHCI_DPTR_MASK);
659 7bfe5777 balrog
        iso_td.next = ohci->done;
660 7bfe5777 balrog
        ohci->done = addr;
661 7bfe5777 balrog
        i = OHCI_BM(iso_td.flags, TD_DI);
662 7bfe5777 balrog
        if (i < ohci->done_count)
663 7bfe5777 balrog
            ohci->done_count = i;
664 ac611340 aurel32
        ohci_put_iso_td(ohci, addr, &iso_td);
665 7bfe5777 balrog
        return 0;
666 7bfe5777 balrog
    }
667 7bfe5777 balrog
668 7bfe5777 balrog
    dir = OHCI_BM(ed->flags, ED_D);
669 7bfe5777 balrog
    switch (dir) {
670 7bfe5777 balrog
    case OHCI_TD_DIR_IN:
671 7bfe5777 balrog
        str = "in";
672 7bfe5777 balrog
        pid = USB_TOKEN_IN;
673 7bfe5777 balrog
        break;
674 7bfe5777 balrog
    case OHCI_TD_DIR_OUT:
675 7bfe5777 balrog
        str = "out";
676 7bfe5777 balrog
        pid = USB_TOKEN_OUT;
677 7bfe5777 balrog
        break;
678 7bfe5777 balrog
    case OHCI_TD_DIR_SETUP:
679 7bfe5777 balrog
        str = "setup";
680 7bfe5777 balrog
        pid = USB_TOKEN_SETUP;
681 7bfe5777 balrog
        break;
682 7bfe5777 balrog
    default:
683 7bfe5777 balrog
        printf("usb-ohci: Bad direction %d\n", dir);
684 7bfe5777 balrog
        return 1;
685 7bfe5777 balrog
    }
686 7bfe5777 balrog
687 7bfe5777 balrog
    if (!iso_td.bp || !iso_td.be) {
688 7bfe5777 balrog
        printf("usb-ohci: ISO_TD bp 0x%.8x be 0x%.8x\n", iso_td.bp, iso_td.be);
689 7bfe5777 balrog
        return 1;
690 7bfe5777 balrog
    }
691 7bfe5777 balrog
692 7bfe5777 balrog
    start_offset = iso_td.offset[relative_frame_number];
693 7bfe5777 balrog
    next_offset = iso_td.offset[relative_frame_number + 1];
694 7bfe5777 balrog
695 7bfe5777 balrog
    if (!(OHCI_BM(start_offset, TD_PSW_CC) & 0xe) || 
696 7bfe5777 balrog
        ((relative_frame_number < frame_count) && 
697 7bfe5777 balrog
         !(OHCI_BM(next_offset, TD_PSW_CC) & 0xe))) {
698 7bfe5777 balrog
        printf("usb-ohci: ISO_TD cc != not accessed 0x%.8x 0x%.8x\n",
699 7bfe5777 balrog
               start_offset, next_offset);
700 7bfe5777 balrog
        return 1;
701 7bfe5777 balrog
    }
702 7bfe5777 balrog
703 7bfe5777 balrog
    if ((relative_frame_number < frame_count) && (start_offset > next_offset)) {
704 7bfe5777 balrog
        printf("usb-ohci: ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n",
705 7bfe5777 balrog
                start_offset, next_offset);
706 7bfe5777 balrog
        return 1;
707 7bfe5777 balrog
    }
708 7bfe5777 balrog
709 7bfe5777 balrog
    if ((start_offset & 0x1000) == 0) {
710 7bfe5777 balrog
        start_addr = (iso_td.bp & OHCI_PAGE_MASK) |
711 7bfe5777 balrog
            (start_offset & OHCI_OFFSET_MASK);
712 7bfe5777 balrog
    } else {
713 7bfe5777 balrog
        start_addr = (iso_td.be & OHCI_PAGE_MASK) |
714 7bfe5777 balrog
            (start_offset & OHCI_OFFSET_MASK);
715 7bfe5777 balrog
    }
716 7bfe5777 balrog
717 7bfe5777 balrog
    if (relative_frame_number < frame_count) {
718 7bfe5777 balrog
        end_offset = next_offset - 1;
719 7bfe5777 balrog
        if ((end_offset & 0x1000) == 0) {
720 7bfe5777 balrog
            end_addr = (iso_td.bp & OHCI_PAGE_MASK) |
721 7bfe5777 balrog
                (end_offset & OHCI_OFFSET_MASK);
722 7bfe5777 balrog
        } else {
723 7bfe5777 balrog
            end_addr = (iso_td.be & OHCI_PAGE_MASK) |
724 7bfe5777 balrog
                (end_offset & OHCI_OFFSET_MASK);
725 7bfe5777 balrog
        }
726 7bfe5777 balrog
    } else {
727 7bfe5777 balrog
        /* Last packet in the ISO TD */
728 7bfe5777 balrog
        end_addr = iso_td.be;
729 7bfe5777 balrog
    }
730 7bfe5777 balrog
731 7bfe5777 balrog
    if ((start_addr & OHCI_PAGE_MASK) != (end_addr & OHCI_PAGE_MASK)) {
732 7bfe5777 balrog
        len = (end_addr & OHCI_OFFSET_MASK) + 0x1001
733 7bfe5777 balrog
            - (start_addr & OHCI_OFFSET_MASK);
734 7bfe5777 balrog
    } else {
735 7bfe5777 balrog
        len = end_addr - start_addr + 1;
736 7bfe5777 balrog
    }
737 7bfe5777 balrog
738 7bfe5777 balrog
    if (len && dir != OHCI_TD_DIR_IN) {
739 ac611340 aurel32
        ohci_copy_iso_td(ohci, start_addr, end_addr, ohci->usb_buf, len, 0);
740 7bfe5777 balrog
    }
741 7bfe5777 balrog
742 7bfe5777 balrog
    if (completion) {
743 7bfe5777 balrog
        ret = ohci->usb_packet.len;
744 7bfe5777 balrog
    } else {
745 7bfe5777 balrog
        ret = USB_RET_NODEV;
746 7bfe5777 balrog
        for (i = 0; i < ohci->num_ports; i++) {
747 7bfe5777 balrog
            dev = ohci->rhport[i].port.dev;
748 7bfe5777 balrog
            if ((ohci->rhport[i].ctrl & OHCI_PORT_PES) == 0)
749 7bfe5777 balrog
                continue;
750 7bfe5777 balrog
            ohci->usb_packet.pid = pid;
751 7bfe5777 balrog
            ohci->usb_packet.devaddr = OHCI_BM(ed->flags, ED_FA);
752 7bfe5777 balrog
            ohci->usb_packet.devep = OHCI_BM(ed->flags, ED_EN);
753 7bfe5777 balrog
            ohci->usb_packet.data = ohci->usb_buf;
754 7bfe5777 balrog
            ohci->usb_packet.len = len;
755 7bfe5777 balrog
            ohci->usb_packet.complete_cb = ohci_async_complete_packet;
756 7bfe5777 balrog
            ohci->usb_packet.complete_opaque = ohci;
757 7bfe5777 balrog
            ret = dev->handle_packet(dev, &ohci->usb_packet);
758 7bfe5777 balrog
            if (ret != USB_RET_NODEV)
759 7bfe5777 balrog
                break;
760 7bfe5777 balrog
        }
761 7bfe5777 balrog
    
762 7bfe5777 balrog
        if (ret == USB_RET_ASYNC) {
763 7bfe5777 balrog
            return 1;
764 7bfe5777 balrog
        }
765 7bfe5777 balrog
    }
766 7bfe5777 balrog
767 7bfe5777 balrog
#ifdef DEBUG_ISOCH
768 7bfe5777 balrog
    printf("so 0x%.8x eo 0x%.8x\nsa 0x%.8x ea 0x%.8x\ndir %s len %zu ret %d\n",
769 7bfe5777 balrog
           start_offset, end_offset, start_addr, end_addr, str, len, ret);
770 7bfe5777 balrog
#endif
771 7bfe5777 balrog
772 7bfe5777 balrog
    /* Writeback */
773 7bfe5777 balrog
    if (dir == OHCI_TD_DIR_IN && ret >= 0 && ret <= len) {
774 7bfe5777 balrog
        /* IN transfer succeeded */
775 ac611340 aurel32
        ohci_copy_iso_td(ohci, start_addr, end_addr, ohci->usb_buf, ret, 1);
776 7bfe5777 balrog
        OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
777 7bfe5777 balrog
                    OHCI_CC_NOERROR);
778 7bfe5777 balrog
        OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE, ret);
779 7bfe5777 balrog
    } else if (dir == OHCI_TD_DIR_OUT && ret == len) {
780 7bfe5777 balrog
        /* OUT transfer succeeded */
781 7bfe5777 balrog
        OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
782 7bfe5777 balrog
                    OHCI_CC_NOERROR);
783 7bfe5777 balrog
        OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE, 0);
784 7bfe5777 balrog
    } else {
785 87283515 balrog
        if (ret > (ssize_t) len) {
786 7bfe5777 balrog
            printf("usb-ohci: DataOverrun %d > %zu\n", ret, len);
787 7bfe5777 balrog
            OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
788 7bfe5777 balrog
                        OHCI_CC_DATAOVERRUN);
789 7bfe5777 balrog
            OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
790 7bfe5777 balrog
                        len);
791 7bfe5777 balrog
        } else if (ret >= 0) {
792 7bfe5777 balrog
            printf("usb-ohci: DataUnderrun %d\n", ret);
793 7bfe5777 balrog
            OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
794 7bfe5777 balrog
                        OHCI_CC_DATAUNDERRUN);
795 7bfe5777 balrog
        } else {
796 7bfe5777 balrog
            switch (ret) {
797 7bfe5777 balrog
            case USB_RET_NODEV:
798 7bfe5777 balrog
                OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
799 7bfe5777 balrog
                            OHCI_CC_DEVICENOTRESPONDING);
800 7bfe5777 balrog
                OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
801 7bfe5777 balrog
                            0);
802 7bfe5777 balrog
                break;
803 7bfe5777 balrog
            case USB_RET_NAK:
804 7bfe5777 balrog
            case USB_RET_STALL:
805 7bfe5777 balrog
                printf("usb-ohci: got NAK/STALL %d\n", ret);
806 7bfe5777 balrog
                OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
807 7bfe5777 balrog
                            OHCI_CC_STALL);
808 7bfe5777 balrog
                OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_SIZE,
809 7bfe5777 balrog
                            0);
810 7bfe5777 balrog
                break;
811 7bfe5777 balrog
            default:
812 7bfe5777 balrog
                printf("usb-ohci: Bad device response %d\n", ret);
813 7bfe5777 balrog
                OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
814 7bfe5777 balrog
                            OHCI_CC_UNDEXPETEDPID);
815 7bfe5777 balrog
                break;
816 7bfe5777 balrog
            }
817 7bfe5777 balrog
        }
818 7bfe5777 balrog
    }
819 7bfe5777 balrog
820 7bfe5777 balrog
    if (relative_frame_number == frame_count) {
821 7bfe5777 balrog
        /* Last data packet of ISO TD - retire the TD to the Done Queue */
822 7bfe5777 balrog
        OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_NOERROR);
823 7bfe5777 balrog
        ed->head &= ~OHCI_DPTR_MASK;
824 7bfe5777 balrog
        ed->head |= (iso_td.next & OHCI_DPTR_MASK);
825 7bfe5777 balrog
        iso_td.next = ohci->done;
826 7bfe5777 balrog
        ohci->done = addr;
827 7bfe5777 balrog
        i = OHCI_BM(iso_td.flags, TD_DI);
828 7bfe5777 balrog
        if (i < ohci->done_count)
829 7bfe5777 balrog
            ohci->done_count = i;
830 7bfe5777 balrog
    }
831 ac611340 aurel32
    ohci_put_iso_td(ohci, addr, &iso_td);
832 7bfe5777 balrog
    return 1;
833 4d611c9a pbrook
}
834 4d611c9a pbrook
835 0d92ed30 pbrook
/* Service a transport descriptor.
836 0d92ed30 pbrook
   Returns nonzero to terminate processing of this endpoint.  */
837 0d92ed30 pbrook
838 0d92ed30 pbrook
static int ohci_service_td(OHCIState *ohci, struct ohci_ed *ed)
839 0d92ed30 pbrook
{
840 0d92ed30 pbrook
    int dir;
841 0d92ed30 pbrook
    size_t len = 0;
842 7ccfb2eb blueswir1
    const char *str = NULL;
843 0d92ed30 pbrook
    int pid;
844 0d92ed30 pbrook
    int ret;
845 0d92ed30 pbrook
    int i;
846 0d92ed30 pbrook
    USBDevice *dev;
847 0d92ed30 pbrook
    struct ohci_td td;
848 0d92ed30 pbrook
    uint32_t addr;
849 0d92ed30 pbrook
    int flag_r;
850 4d611c9a pbrook
    int completion;
851 0d92ed30 pbrook
852 0d92ed30 pbrook
    addr = ed->head & OHCI_DPTR_MASK;
853 4d611c9a pbrook
    /* See if this TD has already been submitted to the device.  */
854 4d611c9a pbrook
    completion = (addr == ohci->async_td);
855 4d611c9a pbrook
    if (completion && !ohci->async_complete) {
856 4d611c9a pbrook
#ifdef DEBUG_PACKET
857 4d611c9a pbrook
        dprintf("Skipping async TD\n");
858 4d611c9a pbrook
#endif
859 4d611c9a pbrook
        return 1;
860 4d611c9a pbrook
    }
861 ac611340 aurel32
    if (!ohci_read_td(ohci, addr, &td)) {
862 0d92ed30 pbrook
        fprintf(stderr, "usb-ohci: TD read error at %x\n", addr);
863 0d92ed30 pbrook
        return 0;
864 0d92ed30 pbrook
    }
865 0d92ed30 pbrook
866 0d92ed30 pbrook
    dir = OHCI_BM(ed->flags, ED_D);
867 0d92ed30 pbrook
    switch (dir) {
868 0d92ed30 pbrook
    case OHCI_TD_DIR_OUT:
869 0d92ed30 pbrook
    case OHCI_TD_DIR_IN:
870 0d92ed30 pbrook
        /* Same value.  */
871 0d92ed30 pbrook
        break;
872 0d92ed30 pbrook
    default:
873 0d92ed30 pbrook
        dir = OHCI_BM(td.flags, TD_DP);
874 0d92ed30 pbrook
        break;
875 0d92ed30 pbrook
    }
876 0d92ed30 pbrook
877 0d92ed30 pbrook
    switch (dir) {
878 0d92ed30 pbrook
    case OHCI_TD_DIR_IN:
879 0d92ed30 pbrook
        str = "in";
880 0d92ed30 pbrook
        pid = USB_TOKEN_IN;
881 0d92ed30 pbrook
        break;
882 0d92ed30 pbrook
    case OHCI_TD_DIR_OUT:
883 0d92ed30 pbrook
        str = "out";
884 0d92ed30 pbrook
        pid = USB_TOKEN_OUT;
885 0d92ed30 pbrook
        break;
886 0d92ed30 pbrook
    case OHCI_TD_DIR_SETUP:
887 0d92ed30 pbrook
        str = "setup";
888 0d92ed30 pbrook
        pid = USB_TOKEN_SETUP;
889 0d92ed30 pbrook
        break;
890 0d92ed30 pbrook
    default:
891 0d92ed30 pbrook
        fprintf(stderr, "usb-ohci: Bad direction\n");
892 0d92ed30 pbrook
        return 1;
893 0d92ed30 pbrook
    }
894 0d92ed30 pbrook
    if (td.cbp && td.be) {
895 e6f3e5e0 pbrook
        if ((td.cbp & 0xfffff000) != (td.be & 0xfffff000)) {
896 e6f3e5e0 pbrook
            len = (td.be & 0xfff) + 0x1001 - (td.cbp & 0xfff);
897 e6f3e5e0 pbrook
        } else {
898 e6f3e5e0 pbrook
            len = (td.be - td.cbp) + 1;
899 e6f3e5e0 pbrook
        }
900 e6f3e5e0 pbrook
901 4d611c9a pbrook
        if (len && dir != OHCI_TD_DIR_IN && !completion) {
902 ac611340 aurel32
            ohci_copy_td(ohci, &td, ohci->usb_buf, len, 0);
903 0d92ed30 pbrook
        }
904 0d92ed30 pbrook
    }
905 0d92ed30 pbrook
906 0d92ed30 pbrook
    flag_r = (td.flags & OHCI_TD_R) != 0;
907 0d92ed30 pbrook
#ifdef DEBUG_PACKET
908 0d92ed30 pbrook
    dprintf(" TD @ 0x%.8x %u bytes %s r=%d cbp=0x%.8x be=0x%.8x\n",
909 0d92ed30 pbrook
            addr, len, str, flag_r, td.cbp, td.be);
910 0d92ed30 pbrook
911 87283515 balrog
    if (len > 0 && dir != OHCI_TD_DIR_IN) {
912 0d92ed30 pbrook
        dprintf("  data:");
913 0d92ed30 pbrook
        for (i = 0; i < len; i++)
914 4d611c9a pbrook
            printf(" %.2x", ohci->usb_buf[i]);
915 0d92ed30 pbrook
        dprintf("\n");
916 0d92ed30 pbrook
    }
917 0d92ed30 pbrook
#endif
918 4d611c9a pbrook
    if (completion) {
919 4d611c9a pbrook
        ret = ohci->usb_packet.len;
920 4d611c9a pbrook
        ohci->async_td = 0;
921 4d611c9a pbrook
        ohci->async_complete = 0;
922 4d611c9a pbrook
    } else {
923 4d611c9a pbrook
        ret = USB_RET_NODEV;
924 4d611c9a pbrook
        for (i = 0; i < ohci->num_ports; i++) {
925 4d611c9a pbrook
            dev = ohci->rhport[i].port.dev;
926 4d611c9a pbrook
            if ((ohci->rhport[i].ctrl & OHCI_PORT_PES) == 0)
927 4d611c9a pbrook
                continue;
928 4d611c9a pbrook
929 4d611c9a pbrook
            if (ohci->async_td) {
930 4d611c9a pbrook
                /* ??? The hardware should allow one active packet per
931 4d611c9a pbrook
                   endpoint.  We only allow one active packet per controller.
932 4d611c9a pbrook
                   This should be sufficient as long as devices respond in a
933 4d611c9a pbrook
                   timely manner.
934 4d611c9a pbrook
                 */
935 0d92ed30 pbrook
#ifdef DEBUG_PACKET
936 4d611c9a pbrook
                dprintf("Too many pending packets\n");
937 0d92ed30 pbrook
#endif
938 4d611c9a pbrook
                return 1;
939 4d611c9a pbrook
            }
940 4d611c9a pbrook
            ohci->usb_packet.pid = pid;
941 4d611c9a pbrook
            ohci->usb_packet.devaddr = OHCI_BM(ed->flags, ED_FA);
942 4d611c9a pbrook
            ohci->usb_packet.devep = OHCI_BM(ed->flags, ED_EN);
943 4d611c9a pbrook
            ohci->usb_packet.data = ohci->usb_buf;
944 4d611c9a pbrook
            ohci->usb_packet.len = len;
945 4d611c9a pbrook
            ohci->usb_packet.complete_cb = ohci_async_complete_packet;
946 4d611c9a pbrook
            ohci->usb_packet.complete_opaque = ohci;
947 4d611c9a pbrook
            ret = dev->handle_packet(dev, &ohci->usb_packet);
948 4d611c9a pbrook
            if (ret != USB_RET_NODEV)
949 4d611c9a pbrook
                break;
950 4d611c9a pbrook
        }
951 4d611c9a pbrook
#ifdef DEBUG_PACKET
952 4d611c9a pbrook
        dprintf("ret=%d\n", ret);
953 4d611c9a pbrook
#endif
954 4d611c9a pbrook
        if (ret == USB_RET_ASYNC) {
955 4d611c9a pbrook
            ohci->async_td = addr;
956 4d611c9a pbrook
            return 1;
957 4d611c9a pbrook
        }
958 4d611c9a pbrook
    }
959 0d92ed30 pbrook
    if (ret >= 0) {
960 0d92ed30 pbrook
        if (dir == OHCI_TD_DIR_IN) {
961 ac611340 aurel32
            ohci_copy_td(ohci, &td, ohci->usb_buf, ret, 1);
962 0d92ed30 pbrook
#ifdef DEBUG_PACKET
963 0d92ed30 pbrook
            dprintf("  data:");
964 0d92ed30 pbrook
            for (i = 0; i < ret; i++)
965 4d611c9a pbrook
                printf(" %.2x", ohci->usb_buf[i]);
966 0d92ed30 pbrook
            dprintf("\n");
967 0d92ed30 pbrook
#endif
968 0d92ed30 pbrook
        } else {
969 0d92ed30 pbrook
            ret = len;
970 0d92ed30 pbrook
        }
971 0d92ed30 pbrook
    }
972 0d92ed30 pbrook
973 0d92ed30 pbrook
    /* Writeback */
974 0d92ed30 pbrook
    if (ret == len || (dir == OHCI_TD_DIR_IN && ret >= 0 && flag_r)) {
975 0d92ed30 pbrook
        /* Transmission succeeded.  */
976 0d92ed30 pbrook
        if (ret == len) {
977 0d92ed30 pbrook
            td.cbp = 0;
978 0d92ed30 pbrook
        } else {
979 0d92ed30 pbrook
            td.cbp += ret;
980 0d92ed30 pbrook
            if ((td.cbp & 0xfff) + ret > 0xfff) {
981 0d92ed30 pbrook
                td.cbp &= 0xfff;
982 0d92ed30 pbrook
                td.cbp |= td.be & ~0xfff;
983 0d92ed30 pbrook
            }
984 0d92ed30 pbrook
        }
985 0d92ed30 pbrook
        td.flags |= OHCI_TD_T1;
986 0d92ed30 pbrook
        td.flags ^= OHCI_TD_T0;
987 0d92ed30 pbrook
        OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_NOERROR);
988 0d92ed30 pbrook
        OHCI_SET_BM(td.flags, TD_EC, 0);
989 0d92ed30 pbrook
990 0d92ed30 pbrook
        ed->head &= ~OHCI_ED_C;
991 0d92ed30 pbrook
        if (td.flags & OHCI_TD_T0)
992 0d92ed30 pbrook
            ed->head |= OHCI_ED_C;
993 0d92ed30 pbrook
    } else {
994 0d92ed30 pbrook
        if (ret >= 0) {
995 0d92ed30 pbrook
            dprintf("usb-ohci: Underrun\n");
996 0d92ed30 pbrook
            OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DATAUNDERRUN);
997 0d92ed30 pbrook
        } else {
998 0d92ed30 pbrook
            switch (ret) {
999 0d92ed30 pbrook
            case USB_RET_NODEV:
1000 0d92ed30 pbrook
                OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING);
1001 0d92ed30 pbrook
            case USB_RET_NAK:
1002 0d92ed30 pbrook
                dprintf("usb-ohci: got NAK\n");
1003 0d92ed30 pbrook
                return 1;
1004 0d92ed30 pbrook
            case USB_RET_STALL:
1005 0d92ed30 pbrook
                dprintf("usb-ohci: got STALL\n");
1006 0d92ed30 pbrook
                OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_STALL);
1007 0d92ed30 pbrook
                break;
1008 0d92ed30 pbrook
            case USB_RET_BABBLE:
1009 0d92ed30 pbrook
                dprintf("usb-ohci: got BABBLE\n");
1010 0d92ed30 pbrook
                OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
1011 0d92ed30 pbrook
                break;
1012 0d92ed30 pbrook
            default:
1013 0d92ed30 pbrook
                fprintf(stderr, "usb-ohci: Bad device response %d\n", ret);
1014 0d92ed30 pbrook
                OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_UNDEXPETEDPID);
1015 0d92ed30 pbrook
                OHCI_SET_BM(td.flags, TD_EC, 3);
1016 0d92ed30 pbrook
                break;
1017 0d92ed30 pbrook
            }
1018 0d92ed30 pbrook
        }
1019 0d92ed30 pbrook
        ed->head |= OHCI_ED_H;
1020 0d92ed30 pbrook
    }
1021 0d92ed30 pbrook
1022 0d92ed30 pbrook
    /* Retire this TD */
1023 0d92ed30 pbrook
    ed->head &= ~OHCI_DPTR_MASK;
1024 0d92ed30 pbrook
    ed->head |= td.next & OHCI_DPTR_MASK;
1025 0d92ed30 pbrook
    td.next = ohci->done;
1026 0d92ed30 pbrook
    ohci->done = addr;
1027 0d92ed30 pbrook
    i = OHCI_BM(td.flags, TD_DI);
1028 0d92ed30 pbrook
    if (i < ohci->done_count)
1029 0d92ed30 pbrook
        ohci->done_count = i;
1030 ac611340 aurel32
    ohci_put_td(ohci, addr, &td);
1031 0d92ed30 pbrook
    return OHCI_BM(td.flags, TD_CC) != OHCI_CC_NOERROR;
1032 0d92ed30 pbrook
}
1033 0d92ed30 pbrook
1034 0d92ed30 pbrook
/* Service an endpoint list.  Returns nonzero if active TD were found.  */
1035 7bfe5777 balrog
static int ohci_service_ed_list(OHCIState *ohci, uint32_t head, int completion)
1036 0d92ed30 pbrook
{
1037 0d92ed30 pbrook
    struct ohci_ed ed;
1038 0d92ed30 pbrook
    uint32_t next_ed;
1039 0d92ed30 pbrook
    uint32_t cur;
1040 0d92ed30 pbrook
    int active;
1041 0d92ed30 pbrook
1042 0d92ed30 pbrook
    active = 0;
1043 0d92ed30 pbrook
1044 0d92ed30 pbrook
    if (head == 0)
1045 0d92ed30 pbrook
        return 0;
1046 0d92ed30 pbrook
1047 0d92ed30 pbrook
    for (cur = head; cur; cur = next_ed) {
1048 ac611340 aurel32
        if (!ohci_read_ed(ohci, cur, &ed)) {
1049 0d92ed30 pbrook
            fprintf(stderr, "usb-ohci: ED read error at %x\n", cur);
1050 0d92ed30 pbrook
            return 0;
1051 0d92ed30 pbrook
        }
1052 0d92ed30 pbrook
1053 0d92ed30 pbrook
        next_ed = ed.next & OHCI_DPTR_MASK;
1054 0d92ed30 pbrook
1055 4d611c9a pbrook
        if ((ed.head & OHCI_ED_H) || (ed.flags & OHCI_ED_K)) {
1056 4d611c9a pbrook
            uint32_t addr;
1057 4d611c9a pbrook
            /* Cancel pending packets for ED that have been paused.  */
1058 4d611c9a pbrook
            addr = ed.head & OHCI_DPTR_MASK;
1059 4d611c9a pbrook
            if (ohci->async_td && addr == ohci->async_td) {
1060 4d611c9a pbrook
                usb_cancel_packet(&ohci->usb_packet);
1061 4d611c9a pbrook
                ohci->async_td = 0;
1062 4d611c9a pbrook
            }
1063 0d92ed30 pbrook
            continue;
1064 4d611c9a pbrook
        }
1065 0d92ed30 pbrook
1066 0d92ed30 pbrook
        while ((ed.head & OHCI_DPTR_MASK) != ed.tail) {
1067 0d92ed30 pbrook
#ifdef DEBUG_PACKET
1068 0d92ed30 pbrook
            dprintf("ED @ 0x%.8x fa=%u en=%u d=%u s=%u k=%u f=%u mps=%u "
1069 0d92ed30 pbrook
                    "h=%u c=%u\n  head=0x%.8x tailp=0x%.8x next=0x%.8x\n", cur,
1070 0d92ed30 pbrook
                    OHCI_BM(ed.flags, ED_FA), OHCI_BM(ed.flags, ED_EN),
1071 0d92ed30 pbrook
                    OHCI_BM(ed.flags, ED_D), (ed.flags & OHCI_ED_S)!= 0,
1072 0d92ed30 pbrook
                    (ed.flags & OHCI_ED_K) != 0, (ed.flags & OHCI_ED_F) != 0,
1073 0d92ed30 pbrook
                    OHCI_BM(ed.flags, ED_MPS), (ed.head & OHCI_ED_H) != 0,
1074 0d92ed30 pbrook
                    (ed.head & OHCI_ED_C) != 0, ed.head & OHCI_DPTR_MASK,
1075 0d92ed30 pbrook
                    ed.tail & OHCI_DPTR_MASK, ed.next & OHCI_DPTR_MASK);
1076 0d92ed30 pbrook
#endif
1077 0d92ed30 pbrook
            active = 1;
1078 0d92ed30 pbrook
1079 7bfe5777 balrog
            if ((ed.flags & OHCI_ED_F) == 0) {
1080 7bfe5777 balrog
                if (ohci_service_td(ohci, &ed))
1081 7bfe5777 balrog
                    break;
1082 7bfe5777 balrog
            } else {
1083 7bfe5777 balrog
                /* Handle isochronous endpoints */
1084 7bfe5777 balrog
                if (ohci_service_iso_td(ohci, &ed, completion))
1085 7bfe5777 balrog
                    break;
1086 7bfe5777 balrog
            }
1087 0d92ed30 pbrook
        }
1088 0d92ed30 pbrook
1089 ac611340 aurel32
        ohci_put_ed(ohci, cur, &ed);
1090 0d92ed30 pbrook
    }
1091 0d92ed30 pbrook
1092 0d92ed30 pbrook
    return active;
1093 0d92ed30 pbrook
}
1094 0d92ed30 pbrook
1095 0d92ed30 pbrook
/* Generate a SOF event, and set a timer for EOF */
1096 0d92ed30 pbrook
static void ohci_sof(OHCIState *ohci)
1097 0d92ed30 pbrook
{
1098 0d92ed30 pbrook
    ohci->sof_time = qemu_get_clock(vm_clock);
1099 0d92ed30 pbrook
    qemu_mod_timer(ohci->eof_timer, ohci->sof_time + usb_frame_time);
1100 0d92ed30 pbrook
    ohci_set_interrupt(ohci, OHCI_INTR_SF);
1101 0d92ed30 pbrook
}
1102 0d92ed30 pbrook
1103 4d611c9a pbrook
/* Process Control and Bulk lists.  */
1104 7bfe5777 balrog
static void ohci_process_lists(OHCIState *ohci, int completion)
1105 4d611c9a pbrook
{
1106 4d611c9a pbrook
    if ((ohci->ctl & OHCI_CTL_CLE) && (ohci->status & OHCI_STATUS_CLF)) {
1107 4d611c9a pbrook
        if (ohci->ctrl_cur && ohci->ctrl_cur != ohci->ctrl_head)
1108 87283515 balrog
          dprintf("usb-ohci: head %x, cur %x\n",
1109 87283515 balrog
                          ohci->ctrl_head, ohci->ctrl_cur);
1110 7bfe5777 balrog
        if (!ohci_service_ed_list(ohci, ohci->ctrl_head, completion)) {
1111 4d611c9a pbrook
            ohci->ctrl_cur = 0;
1112 4d611c9a pbrook
            ohci->status &= ~OHCI_STATUS_CLF;
1113 4d611c9a pbrook
        }
1114 4d611c9a pbrook
    }
1115 4d611c9a pbrook
1116 4d611c9a pbrook
    if ((ohci->ctl & OHCI_CTL_BLE) && (ohci->status & OHCI_STATUS_BLF)) {
1117 7bfe5777 balrog
        if (!ohci_service_ed_list(ohci, ohci->bulk_head, completion)) {
1118 4d611c9a pbrook
            ohci->bulk_cur = 0;
1119 4d611c9a pbrook
            ohci->status &= ~OHCI_STATUS_BLF;
1120 4d611c9a pbrook
        }
1121 4d611c9a pbrook
    }
1122 4d611c9a pbrook
}
1123 4d611c9a pbrook
1124 0d92ed30 pbrook
/* Do frame processing on frame boundary */
1125 0d92ed30 pbrook
static void ohci_frame_boundary(void *opaque)
1126 0d92ed30 pbrook
{
1127 0d92ed30 pbrook
    OHCIState *ohci = opaque;
1128 0d92ed30 pbrook
    struct ohci_hcca hcca;
1129 0d92ed30 pbrook
1130 ac611340 aurel32
    ohci_read_hcca(ohci, ohci->hcca, &hcca);
1131 0d92ed30 pbrook
1132 0d92ed30 pbrook
    /* Process all the lists at the end of the frame */
1133 0d92ed30 pbrook
    if (ohci->ctl & OHCI_CTL_PLE) {
1134 0d92ed30 pbrook
        int n;
1135 0d92ed30 pbrook
1136 0d92ed30 pbrook
        n = ohci->frame_number & 0x1f;
1137 7bfe5777 balrog
        ohci_service_ed_list(ohci, le32_to_cpu(hcca.intr[n]), 0);
1138 0d92ed30 pbrook
    }
1139 0d92ed30 pbrook
1140 4d611c9a pbrook
    /* Cancel all pending packets if either of the lists has been disabled.  */
1141 4d611c9a pbrook
    if (ohci->async_td &&
1142 4d611c9a pbrook
        ohci->old_ctl & (~ohci->ctl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) {
1143 4d611c9a pbrook
        usb_cancel_packet(&ohci->usb_packet);
1144 4d611c9a pbrook
        ohci->async_td = 0;
1145 0d92ed30 pbrook
    }
1146 4d611c9a pbrook
    ohci->old_ctl = ohci->ctl;
1147 7bfe5777 balrog
    ohci_process_lists(ohci, 0);
1148 0d92ed30 pbrook
1149 0d92ed30 pbrook
    /* Frame boundary, so do EOF stuf here */
1150 0d92ed30 pbrook
    ohci->frt = ohci->fit;
1151 0d92ed30 pbrook
1152 1fa63e43 Michael Buesch
    /* Increment frame number and take care of endianness. */
1153 0d92ed30 pbrook
    ohci->frame_number = (ohci->frame_number + 1) & 0xffff;
1154 1fa63e43 Michael Buesch
    hcca.frame = cpu_to_le16(ohci->frame_number);
1155 0d92ed30 pbrook
1156 0d92ed30 pbrook
    if (ohci->done_count == 0 && !(ohci->intr_status & OHCI_INTR_WD)) {
1157 0d92ed30 pbrook
        if (!ohci->done)
1158 0d92ed30 pbrook
            abort();
1159 0d92ed30 pbrook
        if (ohci->intr & ohci->intr_status)
1160 0d92ed30 pbrook
            ohci->done |= 1;
1161 0d92ed30 pbrook
        hcca.done = cpu_to_le32(ohci->done);
1162 0d92ed30 pbrook
        ohci->done = 0;
1163 0d92ed30 pbrook
        ohci->done_count = 7;
1164 0d92ed30 pbrook
        ohci_set_interrupt(ohci, OHCI_INTR_WD);
1165 0d92ed30 pbrook
    }
1166 0d92ed30 pbrook
1167 0d92ed30 pbrook
    if (ohci->done_count != 7 && ohci->done_count != 0)
1168 0d92ed30 pbrook
        ohci->done_count--;
1169 0d92ed30 pbrook
1170 0d92ed30 pbrook
    /* Do SOF stuff here */
1171 0d92ed30 pbrook
    ohci_sof(ohci);
1172 0d92ed30 pbrook
1173 0d92ed30 pbrook
    /* Writeback HCCA */
1174 ac611340 aurel32
    ohci_put_hcca(ohci, ohci->hcca, &hcca);
1175 0d92ed30 pbrook
}
1176 0d92ed30 pbrook
1177 0d92ed30 pbrook
/* Start sending SOF tokens across the USB bus, lists are processed in
1178 0d92ed30 pbrook
 * next frame
1179 0d92ed30 pbrook
 */
1180 0d92ed30 pbrook
static int ohci_bus_start(OHCIState *ohci)
1181 0d92ed30 pbrook
{
1182 0d92ed30 pbrook
    ohci->eof_timer = qemu_new_timer(vm_clock,
1183 0d92ed30 pbrook
                    ohci_frame_boundary,
1184 0d92ed30 pbrook
                    ohci);
1185 0d92ed30 pbrook
1186 0d92ed30 pbrook
    if (ohci->eof_timer == NULL) {
1187 e24ad6f1 pbrook
        fprintf(stderr, "usb-ohci: %s: qemu_new_timer failed\n", ohci->name);
1188 0d92ed30 pbrook
        /* TODO: Signal unrecoverable error */
1189 0d92ed30 pbrook
        return 0;
1190 0d92ed30 pbrook
    }
1191 0d92ed30 pbrook
1192 e24ad6f1 pbrook
    dprintf("usb-ohci: %s: USB Operational\n", ohci->name);
1193 0d92ed30 pbrook
1194 0d92ed30 pbrook
    ohci_sof(ohci);
1195 0d92ed30 pbrook
1196 0d92ed30 pbrook
    return 1;
1197 0d92ed30 pbrook
}
1198 0d92ed30 pbrook
1199 0d92ed30 pbrook
/* Stop sending SOF tokens on the bus */
1200 0d92ed30 pbrook
static void ohci_bus_stop(OHCIState *ohci)
1201 0d92ed30 pbrook
{
1202 0d92ed30 pbrook
    if (ohci->eof_timer)
1203 0d92ed30 pbrook
        qemu_del_timer(ohci->eof_timer);
1204 73221b12 ths
    ohci->eof_timer = NULL;
1205 0d92ed30 pbrook
}
1206 0d92ed30 pbrook
1207 0d92ed30 pbrook
/* Sets a flag in a port status register but only set it if the port is
1208 0d92ed30 pbrook
 * connected, if not set ConnectStatusChange flag. If flag is enabled
1209 0d92ed30 pbrook
 * return 1.
1210 0d92ed30 pbrook
 */
1211 0d92ed30 pbrook
static int ohci_port_set_if_connected(OHCIState *ohci, int i, uint32_t val)
1212 0d92ed30 pbrook
{
1213 0d92ed30 pbrook
    int ret = 1;
1214 0d92ed30 pbrook
1215 0d92ed30 pbrook
    /* writing a 0 has no effect */
1216 0d92ed30 pbrook
    if (val == 0)
1217 0d92ed30 pbrook
        return 0;
1218 0d92ed30 pbrook
1219 0d92ed30 pbrook
    /* If CurrentConnectStatus is cleared we set
1220 0d92ed30 pbrook
     * ConnectStatusChange
1221 0d92ed30 pbrook
     */
1222 0d92ed30 pbrook
    if (!(ohci->rhport[i].ctrl & OHCI_PORT_CCS)) {
1223 0d92ed30 pbrook
        ohci->rhport[i].ctrl |= OHCI_PORT_CSC;
1224 0d92ed30 pbrook
        if (ohci->rhstatus & OHCI_RHS_DRWE) {
1225 0d92ed30 pbrook
            /* TODO: CSC is a wakeup event */
1226 0d92ed30 pbrook
        }
1227 0d92ed30 pbrook
        return 0;
1228 0d92ed30 pbrook
    }
1229 0d92ed30 pbrook
1230 0d92ed30 pbrook
    if (ohci->rhport[i].ctrl & val)
1231 0d92ed30 pbrook
        ret = 0;
1232 0d92ed30 pbrook
1233 0d92ed30 pbrook
    /* set the bit */
1234 0d92ed30 pbrook
    ohci->rhport[i].ctrl |= val;
1235 0d92ed30 pbrook
1236 0d92ed30 pbrook
    return ret;
1237 0d92ed30 pbrook
}
1238 0d92ed30 pbrook
1239 0d92ed30 pbrook
/* Set the frame interval - frame interval toggle is manipulated by the hcd only */
1240 0d92ed30 pbrook
static void ohci_set_frame_interval(OHCIState *ohci, uint16_t val)
1241 0d92ed30 pbrook
{
1242 0d92ed30 pbrook
    val &= OHCI_FMI_FI;
1243 0d92ed30 pbrook
1244 0d92ed30 pbrook
    if (val != ohci->fi) {
1245 0d92ed30 pbrook
        dprintf("usb-ohci: %s: FrameInterval = 0x%x (%u)\n",
1246 e24ad6f1 pbrook
            ohci->name, ohci->fi, ohci->fi);
1247 0d92ed30 pbrook
    }
1248 0d92ed30 pbrook
1249 0d92ed30 pbrook
    ohci->fi = val;
1250 0d92ed30 pbrook
}
1251 0d92ed30 pbrook
1252 0d92ed30 pbrook
static void ohci_port_power(OHCIState *ohci, int i, int p)
1253 0d92ed30 pbrook
{
1254 0d92ed30 pbrook
    if (p) {
1255 0d92ed30 pbrook
        ohci->rhport[i].ctrl |= OHCI_PORT_PPS;
1256 0d92ed30 pbrook
    } else {
1257 0d92ed30 pbrook
        ohci->rhport[i].ctrl &= ~(OHCI_PORT_PPS|
1258 0d92ed30 pbrook
                    OHCI_PORT_CCS|
1259 0d92ed30 pbrook
                    OHCI_PORT_PSS|
1260 0d92ed30 pbrook
                    OHCI_PORT_PRS);
1261 0d92ed30 pbrook
    }
1262 0d92ed30 pbrook
}
1263 0d92ed30 pbrook
1264 0d92ed30 pbrook
/* Set HcControlRegister */
1265 0d92ed30 pbrook
static void ohci_set_ctl(OHCIState *ohci, uint32_t val)
1266 0d92ed30 pbrook
{
1267 0d92ed30 pbrook
    uint32_t old_state;
1268 0d92ed30 pbrook
    uint32_t new_state;
1269 0d92ed30 pbrook
1270 0d92ed30 pbrook
    old_state = ohci->ctl & OHCI_CTL_HCFS;
1271 0d92ed30 pbrook
    ohci->ctl = val;
1272 0d92ed30 pbrook
    new_state = ohci->ctl & OHCI_CTL_HCFS;
1273 0d92ed30 pbrook
1274 0d92ed30 pbrook
    /* no state change */
1275 0d92ed30 pbrook
    if (old_state == new_state)
1276 0d92ed30 pbrook
        return;
1277 0d92ed30 pbrook
1278 0d92ed30 pbrook
    switch (new_state) {
1279 0d92ed30 pbrook
    case OHCI_USB_OPERATIONAL:
1280 0d92ed30 pbrook
        ohci_bus_start(ohci);
1281 0d92ed30 pbrook
        break;
1282 0d92ed30 pbrook
    case OHCI_USB_SUSPEND:
1283 0d92ed30 pbrook
        ohci_bus_stop(ohci);
1284 e24ad6f1 pbrook
        dprintf("usb-ohci: %s: USB Suspended\n", ohci->name);
1285 0d92ed30 pbrook
        break;
1286 0d92ed30 pbrook
    case OHCI_USB_RESUME:
1287 e24ad6f1 pbrook
        dprintf("usb-ohci: %s: USB Resume\n", ohci->name);
1288 0d92ed30 pbrook
        break;
1289 0d92ed30 pbrook
    case OHCI_USB_RESET:
1290 73221b12 ths
        ohci_reset(ohci);
1291 e24ad6f1 pbrook
        dprintf("usb-ohci: %s: USB Reset\n", ohci->name);
1292 0d92ed30 pbrook
        break;
1293 0d92ed30 pbrook
    }
1294 0d92ed30 pbrook
}
1295 0d92ed30 pbrook
1296 0d92ed30 pbrook
static uint32_t ohci_get_frame_remaining(OHCIState *ohci)
1297 0d92ed30 pbrook
{
1298 0d92ed30 pbrook
    uint16_t fr;
1299 0d92ed30 pbrook
    int64_t tks;
1300 0d92ed30 pbrook
1301 0d92ed30 pbrook
    if ((ohci->ctl & OHCI_CTL_HCFS) != OHCI_USB_OPERATIONAL)
1302 0d92ed30 pbrook
        return (ohci->frt << 31);
1303 0d92ed30 pbrook
1304 0d92ed30 pbrook
    /* Being in USB operational state guarnatees sof_time was
1305 0d92ed30 pbrook
     * set already.
1306 0d92ed30 pbrook
     */
1307 0d92ed30 pbrook
    tks = qemu_get_clock(vm_clock) - ohci->sof_time;
1308 0d92ed30 pbrook
1309 0d92ed30 pbrook
    /* avoid muldiv if possible */
1310 0d92ed30 pbrook
    if (tks >= usb_frame_time)
1311 0d92ed30 pbrook
        return (ohci->frt << 31);
1312 0d92ed30 pbrook
1313 0d92ed30 pbrook
    tks = muldiv64(1, tks, usb_bit_time);
1314 0d92ed30 pbrook
    fr = (uint16_t)(ohci->fi - tks);
1315 0d92ed30 pbrook
1316 0d92ed30 pbrook
    return (ohci->frt << 31) | fr;
1317 0d92ed30 pbrook
}
1318 0d92ed30 pbrook
1319 0d92ed30 pbrook
1320 0d92ed30 pbrook
/* Set root hub status */
1321 0d92ed30 pbrook
static void ohci_set_hub_status(OHCIState *ohci, uint32_t val)
1322 0d92ed30 pbrook
{
1323 0d92ed30 pbrook
    uint32_t old_state;
1324 0d92ed30 pbrook
1325 0d92ed30 pbrook
    old_state = ohci->rhstatus;
1326 0d92ed30 pbrook
1327 0d92ed30 pbrook
    /* write 1 to clear OCIC */
1328 0d92ed30 pbrook
    if (val & OHCI_RHS_OCIC)
1329 0d92ed30 pbrook
        ohci->rhstatus &= ~OHCI_RHS_OCIC;
1330 0d92ed30 pbrook
1331 0d92ed30 pbrook
    if (val & OHCI_RHS_LPS) {
1332 0d92ed30 pbrook
        int i;
1333 0d92ed30 pbrook
1334 0d92ed30 pbrook
        for (i = 0; i < ohci->num_ports; i++)
1335 0d92ed30 pbrook
            ohci_port_power(ohci, i, 0);
1336 0d92ed30 pbrook
        dprintf("usb-ohci: powered down all ports\n");
1337 0d92ed30 pbrook
    }
1338 0d92ed30 pbrook
1339 0d92ed30 pbrook
    if (val & OHCI_RHS_LPSC) {
1340 0d92ed30 pbrook
        int i;
1341 0d92ed30 pbrook
1342 0d92ed30 pbrook
        for (i = 0; i < ohci->num_ports; i++)
1343 0d92ed30 pbrook
            ohci_port_power(ohci, i, 1);
1344 0d92ed30 pbrook
        dprintf("usb-ohci: powered up all ports\n");
1345 0d92ed30 pbrook
    }
1346 0d92ed30 pbrook
1347 0d92ed30 pbrook
    if (val & OHCI_RHS_DRWE)
1348 0d92ed30 pbrook
        ohci->rhstatus |= OHCI_RHS_DRWE;
1349 0d92ed30 pbrook
1350 0d92ed30 pbrook
    if (val & OHCI_RHS_CRWE)
1351 0d92ed30 pbrook
        ohci->rhstatus &= ~OHCI_RHS_DRWE;
1352 0d92ed30 pbrook
1353 0d92ed30 pbrook
    if (old_state != ohci->rhstatus)
1354 0d92ed30 pbrook
        ohci_set_interrupt(ohci, OHCI_INTR_RHSC);
1355 0d92ed30 pbrook
}
1356 0d92ed30 pbrook
1357 0d92ed30 pbrook
/* Set root hub port status */
1358 0d92ed30 pbrook
static void ohci_port_set_status(OHCIState *ohci, int portnum, uint32_t val)
1359 0d92ed30 pbrook
{
1360 0d92ed30 pbrook
    uint32_t old_state;
1361 0d92ed30 pbrook
    OHCIPort *port;
1362 0d92ed30 pbrook
1363 0d92ed30 pbrook
    port = &ohci->rhport[portnum];
1364 0d92ed30 pbrook
    old_state = port->ctrl;
1365 0d92ed30 pbrook
1366 0d92ed30 pbrook
    /* Write to clear CSC, PESC, PSSC, OCIC, PRSC */
1367 0d92ed30 pbrook
    if (val & OHCI_PORT_WTC)
1368 0d92ed30 pbrook
        port->ctrl &= ~(val & OHCI_PORT_WTC);
1369 0d92ed30 pbrook
1370 0d92ed30 pbrook
    if (val & OHCI_PORT_CCS)
1371 0d92ed30 pbrook
        port->ctrl &= ~OHCI_PORT_PES;
1372 0d92ed30 pbrook
1373 0d92ed30 pbrook
    ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PES);
1374 0d92ed30 pbrook
1375 0d92ed30 pbrook
    if (ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PSS))
1376 0d92ed30 pbrook
        dprintf("usb-ohci: port %d: SUSPEND\n", portnum);
1377 0d92ed30 pbrook
1378 0d92ed30 pbrook
    if (ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PRS)) {
1379 0d92ed30 pbrook
        dprintf("usb-ohci: port %d: RESET\n", portnum);
1380 4d611c9a pbrook
        usb_send_msg(port->port.dev, USB_MSG_RESET);
1381 0d92ed30 pbrook
        port->ctrl &= ~OHCI_PORT_PRS;
1382 0d92ed30 pbrook
        /* ??? Should this also set OHCI_PORT_PESC.  */
1383 0d92ed30 pbrook
        port->ctrl |= OHCI_PORT_PES | OHCI_PORT_PRSC;
1384 0d92ed30 pbrook
    }
1385 0d92ed30 pbrook
1386 0d92ed30 pbrook
    /* Invert order here to ensure in ambiguous case, device is
1387 0d92ed30 pbrook
     * powered up...
1388 0d92ed30 pbrook
     */
1389 0d92ed30 pbrook
    if (val & OHCI_PORT_LSDA)
1390 0d92ed30 pbrook
        ohci_port_power(ohci, portnum, 0);
1391 0d92ed30 pbrook
    if (val & OHCI_PORT_PPS)
1392 0d92ed30 pbrook
        ohci_port_power(ohci, portnum, 1);
1393 0d92ed30 pbrook
1394 0d92ed30 pbrook
    if (old_state != port->ctrl)
1395 0d92ed30 pbrook
        ohci_set_interrupt(ohci, OHCI_INTR_RHSC);
1396 0d92ed30 pbrook
1397 0d92ed30 pbrook
    return;
1398 0d92ed30 pbrook
}
1399 0d92ed30 pbrook
1400 0d92ed30 pbrook
static uint32_t ohci_mem_read(void *ptr, target_phys_addr_t addr)
1401 0d92ed30 pbrook
{
1402 0d92ed30 pbrook
    OHCIState *ohci = ptr;
1403 65e1d81b aurel32
    uint32_t retval;
1404 0d92ed30 pbrook
1405 0d92ed30 pbrook
    /* Only aligned reads are allowed on OHCI */
1406 0d92ed30 pbrook
    if (addr & 3) {
1407 0d92ed30 pbrook
        fprintf(stderr, "usb-ohci: Mis-aligned read\n");
1408 0d92ed30 pbrook
        return 0xffffffff;
1409 65e1d81b aurel32
    } else if (addr >= 0x54 && addr < 0x54 + ohci->num_ports * 4) {
1410 0d92ed30 pbrook
        /* HcRhPortStatus */
1411 65e1d81b aurel32
        retval = ohci->rhport[(addr - 0x54) >> 2].ctrl | OHCI_PORT_PPS;
1412 65e1d81b aurel32
    } else {
1413 65e1d81b aurel32
        switch (addr >> 2) {
1414 65e1d81b aurel32
        case 0: /* HcRevision */
1415 65e1d81b aurel32
            retval = 0x10;
1416 65e1d81b aurel32
            break;
1417 65e1d81b aurel32
1418 65e1d81b aurel32
        case 1: /* HcControl */
1419 65e1d81b aurel32
            retval = ohci->ctl;
1420 65e1d81b aurel32
            break;
1421 65e1d81b aurel32
1422 65e1d81b aurel32
        case 2: /* HcCommandStatus */
1423 65e1d81b aurel32
            retval = ohci->status;
1424 65e1d81b aurel32
            break;
1425 65e1d81b aurel32
1426 65e1d81b aurel32
        case 3: /* HcInterruptStatus */
1427 65e1d81b aurel32
            retval = ohci->intr_status;
1428 65e1d81b aurel32
            break;
1429 65e1d81b aurel32
1430 65e1d81b aurel32
        case 4: /* HcInterruptEnable */
1431 65e1d81b aurel32
        case 5: /* HcInterruptDisable */
1432 65e1d81b aurel32
            retval = ohci->intr;
1433 65e1d81b aurel32
            break;
1434 65e1d81b aurel32
1435 65e1d81b aurel32
        case 6: /* HcHCCA */
1436 65e1d81b aurel32
            retval = ohci->hcca;
1437 65e1d81b aurel32
            break;
1438 65e1d81b aurel32
1439 65e1d81b aurel32
        case 7: /* HcPeriodCurrentED */
1440 65e1d81b aurel32
            retval = ohci->per_cur;
1441 65e1d81b aurel32
            break;
1442 65e1d81b aurel32
1443 65e1d81b aurel32
        case 8: /* HcControlHeadED */
1444 65e1d81b aurel32
            retval = ohci->ctrl_head;
1445 65e1d81b aurel32
            break;
1446 65e1d81b aurel32
1447 65e1d81b aurel32
        case 9: /* HcControlCurrentED */
1448 65e1d81b aurel32
            retval = ohci->ctrl_cur;
1449 65e1d81b aurel32
            break;
1450 65e1d81b aurel32
1451 65e1d81b aurel32
        case 10: /* HcBulkHeadED */
1452 65e1d81b aurel32
            retval = ohci->bulk_head;
1453 65e1d81b aurel32
            break;
1454 65e1d81b aurel32
1455 65e1d81b aurel32
        case 11: /* HcBulkCurrentED */
1456 65e1d81b aurel32
            retval = ohci->bulk_cur;
1457 65e1d81b aurel32
            break;
1458 65e1d81b aurel32
1459 65e1d81b aurel32
        case 12: /* HcDoneHead */
1460 65e1d81b aurel32
            retval = ohci->done;
1461 65e1d81b aurel32
            break;
1462 65e1d81b aurel32
1463 65e1d81b aurel32
        case 13: /* HcFmInterretval */
1464 65e1d81b aurel32
            retval = (ohci->fit << 31) | (ohci->fsmps << 16) | (ohci->fi);
1465 65e1d81b aurel32
            break;
1466 65e1d81b aurel32
1467 65e1d81b aurel32
        case 14: /* HcFmRemaining */
1468 65e1d81b aurel32
            retval = ohci_get_frame_remaining(ohci);
1469 65e1d81b aurel32
            break;
1470 65e1d81b aurel32
1471 65e1d81b aurel32
        case 15: /* HcFmNumber */
1472 65e1d81b aurel32
            retval = ohci->frame_number;
1473 65e1d81b aurel32
            break;
1474 65e1d81b aurel32
1475 65e1d81b aurel32
        case 16: /* HcPeriodicStart */
1476 65e1d81b aurel32
            retval = ohci->pstart;
1477 65e1d81b aurel32
            break;
1478 65e1d81b aurel32
1479 65e1d81b aurel32
        case 17: /* HcLSThreshold */
1480 65e1d81b aurel32
            retval = ohci->lst;
1481 65e1d81b aurel32
            break;
1482 65e1d81b aurel32
1483 65e1d81b aurel32
        case 18: /* HcRhDescriptorA */
1484 65e1d81b aurel32
            retval = ohci->rhdesc_a;
1485 65e1d81b aurel32
            break;
1486 65e1d81b aurel32
1487 65e1d81b aurel32
        case 19: /* HcRhDescriptorB */
1488 65e1d81b aurel32
            retval = ohci->rhdesc_b;
1489 65e1d81b aurel32
            break;
1490 65e1d81b aurel32
1491 65e1d81b aurel32
        case 20: /* HcRhStatus */
1492 65e1d81b aurel32
            retval = ohci->rhstatus;
1493 65e1d81b aurel32
            break;
1494 65e1d81b aurel32
1495 65e1d81b aurel32
        /* PXA27x specific registers */
1496 65e1d81b aurel32
        case 24: /* HcStatus */
1497 65e1d81b aurel32
            retval = ohci->hstatus & ohci->hmask;
1498 65e1d81b aurel32
            break;
1499 65e1d81b aurel32
1500 65e1d81b aurel32
        case 25: /* HcHReset */
1501 65e1d81b aurel32
            retval = ohci->hreset;
1502 65e1d81b aurel32
            break;
1503 65e1d81b aurel32
1504 65e1d81b aurel32
        case 26: /* HcHInterruptEnable */
1505 65e1d81b aurel32
            retval = ohci->hmask;
1506 65e1d81b aurel32
            break;
1507 65e1d81b aurel32
1508 65e1d81b aurel32
        case 27: /* HcHInterruptTest */
1509 65e1d81b aurel32
            retval = ohci->htest;
1510 65e1d81b aurel32
            break;
1511 65e1d81b aurel32
1512 65e1d81b aurel32
        default:
1513 65e1d81b aurel32
            fprintf(stderr, "ohci_read: Bad offset %x\n", (int)addr);
1514 65e1d81b aurel32
            retval = 0xffffffff;
1515 65e1d81b aurel32
        }
1516 0d92ed30 pbrook
    }
1517 0d92ed30 pbrook
1518 65e1d81b aurel32
#ifdef TARGET_WORDS_BIGENDIAN
1519 65e1d81b aurel32
    retval = bswap32(retval);
1520 65e1d81b aurel32
#endif
1521 65e1d81b aurel32
    return retval;
1522 0d92ed30 pbrook
}
1523 0d92ed30 pbrook
1524 0d92ed30 pbrook
static void ohci_mem_write(void *ptr, target_phys_addr_t addr, uint32_t val)
1525 0d92ed30 pbrook
{
1526 0d92ed30 pbrook
    OHCIState *ohci = ptr;
1527 0d92ed30 pbrook
1528 65e1d81b aurel32
#ifdef TARGET_WORDS_BIGENDIAN
1529 65e1d81b aurel32
    val = bswap32(val);
1530 65e1d81b aurel32
#endif
1531 65e1d81b aurel32
1532 0d92ed30 pbrook
    /* Only aligned reads are allowed on OHCI */
1533 0d92ed30 pbrook
    if (addr & 3) {
1534 0d92ed30 pbrook
        fprintf(stderr, "usb-ohci: Mis-aligned write\n");
1535 0d92ed30 pbrook
        return;
1536 0d92ed30 pbrook
    }
1537 0d92ed30 pbrook
1538 0d92ed30 pbrook
    if (addr >= 0x54 && addr < 0x54 + ohci->num_ports * 4) {
1539 0d92ed30 pbrook
        /* HcRhPortStatus */
1540 0d92ed30 pbrook
        ohci_port_set_status(ohci, (addr - 0x54) >> 2, val);
1541 0d92ed30 pbrook
        return;
1542 0d92ed30 pbrook
    }
1543 0d92ed30 pbrook
1544 0d92ed30 pbrook
    switch (addr >> 2) {
1545 0d92ed30 pbrook
    case 1: /* HcControl */
1546 0d92ed30 pbrook
        ohci_set_ctl(ohci, val);
1547 0d92ed30 pbrook
        break;
1548 0d92ed30 pbrook
1549 0d92ed30 pbrook
    case 2: /* HcCommandStatus */
1550 0d92ed30 pbrook
        /* SOC is read-only */
1551 0d92ed30 pbrook
        val = (val & ~OHCI_STATUS_SOC);
1552 0d92ed30 pbrook
1553 0d92ed30 pbrook
        /* Bits written as '0' remain unchanged in the register */
1554 0d92ed30 pbrook
        ohci->status |= val;
1555 0d92ed30 pbrook
1556 0d92ed30 pbrook
        if (ohci->status & OHCI_STATUS_HCR)
1557 0d92ed30 pbrook
            ohci_reset(ohci);
1558 0d92ed30 pbrook
        break;
1559 0d92ed30 pbrook
1560 0d92ed30 pbrook
    case 3: /* HcInterruptStatus */
1561 0d92ed30 pbrook
        ohci->intr_status &= ~val;
1562 0d92ed30 pbrook
        ohci_intr_update(ohci);
1563 0d92ed30 pbrook
        break;
1564 0d92ed30 pbrook
1565 0d92ed30 pbrook
    case 4: /* HcInterruptEnable */
1566 0d92ed30 pbrook
        ohci->intr |= val;
1567 0d92ed30 pbrook
        ohci_intr_update(ohci);
1568 0d92ed30 pbrook
        break;
1569 0d92ed30 pbrook
1570 0d92ed30 pbrook
    case 5: /* HcInterruptDisable */
1571 0d92ed30 pbrook
        ohci->intr &= ~val;
1572 0d92ed30 pbrook
        ohci_intr_update(ohci);
1573 0d92ed30 pbrook
        break;
1574 0d92ed30 pbrook
1575 0d92ed30 pbrook
    case 6: /* HcHCCA */
1576 0d92ed30 pbrook
        ohci->hcca = val & OHCI_HCCA_MASK;
1577 0d92ed30 pbrook
        break;
1578 0d92ed30 pbrook
1579 0d92ed30 pbrook
    case 8: /* HcControlHeadED */
1580 0d92ed30 pbrook
        ohci->ctrl_head = val & OHCI_EDPTR_MASK;
1581 0d92ed30 pbrook
        break;
1582 0d92ed30 pbrook
1583 0d92ed30 pbrook
    case 9: /* HcControlCurrentED */
1584 0d92ed30 pbrook
        ohci->ctrl_cur = val & OHCI_EDPTR_MASK;
1585 0d92ed30 pbrook
        break;
1586 0d92ed30 pbrook
1587 0d92ed30 pbrook
    case 10: /* HcBulkHeadED */
1588 0d92ed30 pbrook
        ohci->bulk_head = val & OHCI_EDPTR_MASK;
1589 0d92ed30 pbrook
        break;
1590 0d92ed30 pbrook
1591 0d92ed30 pbrook
    case 11: /* HcBulkCurrentED */
1592 0d92ed30 pbrook
        ohci->bulk_cur = val & OHCI_EDPTR_MASK;
1593 0d92ed30 pbrook
        break;
1594 0d92ed30 pbrook
1595 0d92ed30 pbrook
    case 13: /* HcFmInterval */
1596 0d92ed30 pbrook
        ohci->fsmps = (val & OHCI_FMI_FSMPS) >> 16;
1597 0d92ed30 pbrook
        ohci->fit = (val & OHCI_FMI_FIT) >> 31;
1598 0d92ed30 pbrook
        ohci_set_frame_interval(ohci, val);
1599 0d92ed30 pbrook
        break;
1600 0d92ed30 pbrook
1601 7bfe5777 balrog
    case 15: /* HcFmNumber */
1602 7bfe5777 balrog
        break;
1603 7bfe5777 balrog
1604 0d92ed30 pbrook
    case 16: /* HcPeriodicStart */
1605 0d92ed30 pbrook
        ohci->pstart = val & 0xffff;
1606 0d92ed30 pbrook
        break;
1607 0d92ed30 pbrook
1608 0d92ed30 pbrook
    case 17: /* HcLSThreshold */
1609 0d92ed30 pbrook
        ohci->lst = val & 0xffff;
1610 0d92ed30 pbrook
        break;
1611 0d92ed30 pbrook
1612 0d92ed30 pbrook
    case 18: /* HcRhDescriptorA */
1613 0d92ed30 pbrook
        ohci->rhdesc_a &= ~OHCI_RHA_RW_MASK;
1614 0d92ed30 pbrook
        ohci->rhdesc_a |= val & OHCI_RHA_RW_MASK;
1615 0d92ed30 pbrook
        break;
1616 0d92ed30 pbrook
1617 0d92ed30 pbrook
    case 19: /* HcRhDescriptorB */
1618 0d92ed30 pbrook
        break;
1619 0d92ed30 pbrook
1620 0d92ed30 pbrook
    case 20: /* HcRhStatus */
1621 0d92ed30 pbrook
        ohci_set_hub_status(ohci, val);
1622 0d92ed30 pbrook
        break;
1623 0d92ed30 pbrook
1624 e24ad6f1 pbrook
    /* PXA27x specific registers */
1625 e24ad6f1 pbrook
    case 24: /* HcStatus */
1626 e24ad6f1 pbrook
        ohci->hstatus &= ~(val & ohci->hmask);
1627 e24ad6f1 pbrook
1628 e24ad6f1 pbrook
    case 25: /* HcHReset */
1629 e24ad6f1 pbrook
        ohci->hreset = val & ~OHCI_HRESET_FSBIR;
1630 e24ad6f1 pbrook
        if (val & OHCI_HRESET_FSBIR)
1631 e24ad6f1 pbrook
            ohci_reset(ohci);
1632 e24ad6f1 pbrook
        break;
1633 e24ad6f1 pbrook
1634 e24ad6f1 pbrook
    case 26: /* HcHInterruptEnable */
1635 e24ad6f1 pbrook
        ohci->hmask = val;
1636 e24ad6f1 pbrook
        break;
1637 e24ad6f1 pbrook
1638 e24ad6f1 pbrook
    case 27: /* HcHInterruptTest */
1639 e24ad6f1 pbrook
        ohci->htest = val;
1640 e24ad6f1 pbrook
        break;
1641 e24ad6f1 pbrook
1642 0d92ed30 pbrook
    default:
1643 0d92ed30 pbrook
        fprintf(stderr, "ohci_write: Bad offset %x\n", (int)addr);
1644 0d92ed30 pbrook
        break;
1645 0d92ed30 pbrook
    }
1646 0d92ed30 pbrook
}
1647 0d92ed30 pbrook
1648 0d92ed30 pbrook
/* Only dword reads are defined on OHCI register space */
1649 0d92ed30 pbrook
static CPUReadMemoryFunc *ohci_readfn[3]={
1650 0d92ed30 pbrook
    ohci_mem_read,
1651 0d92ed30 pbrook
    ohci_mem_read,
1652 0d92ed30 pbrook
    ohci_mem_read
1653 0d92ed30 pbrook
};
1654 0d92ed30 pbrook
1655 0d92ed30 pbrook
/* Only dword writes are defined on OHCI register space */
1656 0d92ed30 pbrook
static CPUWriteMemoryFunc *ohci_writefn[3]={
1657 0d92ed30 pbrook
    ohci_mem_write,
1658 0d92ed30 pbrook
    ohci_mem_write,
1659 0d92ed30 pbrook
    ohci_mem_write
1660 0d92ed30 pbrook
};
1661 0d92ed30 pbrook
1662 e24ad6f1 pbrook
static void usb_ohci_init(OHCIState *ohci, int num_ports, int devfn,
1663 ac611340 aurel32
                          qemu_irq irq, enum ohci_type type,
1664 ac611340 aurel32
                          const char *name, uint32_t localmem_base)
1665 0d92ed30 pbrook
{
1666 0d92ed30 pbrook
    int i;
1667 0d92ed30 pbrook
1668 0d92ed30 pbrook
    if (usb_frame_time == 0) {
1669 eb38c52c blueswir1
#ifdef OHCI_TIME_WARP
1670 0d92ed30 pbrook
        usb_frame_time = ticks_per_sec;
1671 0d92ed30 pbrook
        usb_bit_time = muldiv64(1, ticks_per_sec, USB_HZ/1000);
1672 0d92ed30 pbrook
#else
1673 0d92ed30 pbrook
        usb_frame_time = muldiv64(1, ticks_per_sec, 1000);
1674 0d92ed30 pbrook
        if (ticks_per_sec >= USB_HZ) {
1675 0d92ed30 pbrook
            usb_bit_time = muldiv64(1, ticks_per_sec, USB_HZ);
1676 0d92ed30 pbrook
        } else {
1677 0d92ed30 pbrook
            usb_bit_time = 1;
1678 0d92ed30 pbrook
        }
1679 0d92ed30 pbrook
#endif
1680 0d92ed30 pbrook
        dprintf("usb-ohci: usb_bit_time=%lli usb_frame_time=%lli\n",
1681 0d92ed30 pbrook
                usb_frame_time, usb_bit_time);
1682 0d92ed30 pbrook
    }
1683 0d92ed30 pbrook
1684 1eed09cb Avi Kivity
    ohci->mem = cpu_register_io_memory(ohci_readfn, ohci_writefn, ohci);
1685 ac611340 aurel32
    ohci->localmem_base = localmem_base;
1686 e24ad6f1 pbrook
    ohci->name = name;
1687 e24ad6f1 pbrook
1688 e24ad6f1 pbrook
    ohci->irq = irq;
1689 e24ad6f1 pbrook
    ohci->type = type;
1690 e24ad6f1 pbrook
1691 e24ad6f1 pbrook
    ohci->num_ports = num_ports;
1692 e24ad6f1 pbrook
    for (i = 0; i < num_ports; i++) {
1693 e24ad6f1 pbrook
        qemu_register_usb_port(&ohci->rhport[i].port, ohci, i, ohci_attach);
1694 e24ad6f1 pbrook
    }
1695 e24ad6f1 pbrook
1696 e24ad6f1 pbrook
    ohci->async_td = 0;
1697 a08d4367 Jan Kiszka
    qemu_register_reset(ohci_reset, ohci);
1698 e24ad6f1 pbrook
    ohci_reset(ohci);
1699 e24ad6f1 pbrook
}
1700 e24ad6f1 pbrook
1701 e24ad6f1 pbrook
typedef struct {
1702 e24ad6f1 pbrook
    PCIDevice pci_dev;
1703 e24ad6f1 pbrook
    OHCIState state;
1704 e24ad6f1 pbrook
} OHCIPCIState;
1705 e24ad6f1 pbrook
1706 e24ad6f1 pbrook
static void ohci_mapfunc(PCIDevice *pci_dev, int i,
1707 e24ad6f1 pbrook
            uint32_t addr, uint32_t size, int type)
1708 e24ad6f1 pbrook
{
1709 e24ad6f1 pbrook
    OHCIPCIState *ohci = (OHCIPCIState *)pci_dev;
1710 e24ad6f1 pbrook
    cpu_register_physical_memory(addr, size, ohci->state.mem);
1711 e24ad6f1 pbrook
}
1712 e24ad6f1 pbrook
1713 e24ad6f1 pbrook
void usb_ohci_init_pci(struct PCIBus *bus, int num_ports, int devfn)
1714 e24ad6f1 pbrook
{
1715 e24ad6f1 pbrook
    OHCIPCIState *ohci;
1716 e24ad6f1 pbrook
1717 e24ad6f1 pbrook
    ohci = (OHCIPCIState *)pci_register_device(bus, "OHCI USB", sizeof(*ohci),
1718 e24ad6f1 pbrook
                                               devfn, NULL, NULL);
1719 0d92ed30 pbrook
    if (ohci == NULL) {
1720 0d92ed30 pbrook
        fprintf(stderr, "usb-ohci: Failed to register PCI device\n");
1721 0d92ed30 pbrook
        return;
1722 0d92ed30 pbrook
    }
1723 0d92ed30 pbrook
1724 deb54399 aliguori
    pci_config_set_vendor_id(ohci->pci_dev.config, PCI_VENDOR_ID_APPLE);
1725 a770dc7e aliguori
    pci_config_set_device_id(ohci->pci_dev.config,
1726 a770dc7e aliguori
                             PCI_DEVICE_ID_APPLE_IPID_USB);
1727 0d92ed30 pbrook
    ohci->pci_dev.config[0x09] = 0x10; /* OHCI */
1728 173a543b blueswir1
    pci_config_set_class(ohci->pci_dev.config, PCI_CLASS_SERIAL_USB);
1729 0d92ed30 pbrook
    ohci->pci_dev.config[0x3d] = 0x01; /* interrupt pin 1 */
1730 0d92ed30 pbrook
1731 d537cf6c pbrook
    usb_ohci_init(&ohci->state, num_ports, devfn, ohci->pci_dev.irq[0],
1732 ac611340 aurel32
                  OHCI_TYPE_PCI, ohci->pci_dev.name, 0);
1733 0d92ed30 pbrook
1734 28c2c264 Avi Kivity
    pci_register_bar((struct PCIDevice *)ohci, 0, 256,
1735 0d92ed30 pbrook
                           PCI_ADDRESS_SPACE_MEM, ohci_mapfunc);
1736 e24ad6f1 pbrook
}
1737 0d92ed30 pbrook
1738 e24ad6f1 pbrook
void usb_ohci_init_pxa(target_phys_addr_t base, int num_ports, int devfn,
1739 d537cf6c pbrook
                       qemu_irq irq)
1740 e24ad6f1 pbrook
{
1741 e24ad6f1 pbrook
    OHCIState *ohci = (OHCIState *)qemu_mallocz(sizeof(OHCIState));
1742 0d92ed30 pbrook
1743 d537cf6c pbrook
    usb_ohci_init(ohci, num_ports, devfn, irq,
1744 ac611340 aurel32
                  OHCI_TYPE_PXA, "OHCI USB", 0);
1745 e24ad6f1 pbrook
1746 8da3ff18 pbrook
    cpu_register_physical_memory(base, 0x1000, ohci->mem);
1747 0d92ed30 pbrook
}
1748 ac611340 aurel32
1749 ac611340 aurel32
void usb_ohci_init_sm501(uint32_t mmio_base, uint32_t localmem_base,
1750 ac611340 aurel32
                         int num_ports, int devfn, qemu_irq irq)
1751 ac611340 aurel32
{
1752 ac611340 aurel32
    OHCIState *ohci = (OHCIState *)qemu_mallocz(sizeof(OHCIState));
1753 ac611340 aurel32
1754 ac611340 aurel32
    usb_ohci_init(ohci, num_ports, devfn, irq,
1755 ac611340 aurel32
                  OHCI_TYPE_SM501, "OHCI USB", localmem_base);
1756 ac611340 aurel32
1757 ac611340 aurel32
    cpu_register_physical_memory(mmio_base, 0x1000, ohci->mem);
1758 ac611340 aurel32
}