~ubuntu-branches/ubuntu/trusty/qemu/trusty

« back to all changes in this revision

Viewing changes to .pc/linaro/0065-musb-add-dummy-support-for-ulpi-pass-through-registe.patch/hw/usb/hcd-musb.c

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2014-02-04 12:13:08 UTC
  • mfrom: (10.1.45 sid)
  • Revision ID: package-import@ubuntu.com-20140204121308-1xq92lrfs75agw2g
Tags: 1.7.0+dfsg-3ubuntu1~ppa1
* Merge 1.7.0+dfsg-3 from debian.  Remaining changes:
  - debian/patches/ubuntu:
    * expose-vmx_qemu64cpu.patch
    * linaro (omap3) and arm64 patches
    * ubuntu/target-ppc-add-stubs-for-kvm-breakpoints: fix FTBFS
      on ppc
    * ubuntu/CVE-2013-4377.patch: fix denial of service via virtio
  - debian/qemu-system-x86.modprobe: set kvm_intel nested=1 options
  - debian/control:
    * add arm64 to Architectures
    * add qemu-common and qemu-system-aarch64 packages
  - debian/qemu-system-common.install: add debian/tmp/usr/lib
  - debian/qemu-system-common.preinst: add kvm group
  - debian/qemu-system-common.postinst: remove acl placed by udev,
    and add udevadm trigger.
  - qemu-system-x86.links: add eepro100.rom, remove pxe-virtio,
    pxe-e1000 and pxe-rtl8139.
  - add qemu-system-x86.qemu-kvm.upstart and .default
  - qemu-user-static.postinst-in: remove arm64 binfmt
  - debian/rules:
    * allow parallel build
    * add aarch64 to system_targets and sys_systems
    * add qemu-kvm-spice links
    * install qemu-system-x86.modprobe
  - add debian/qemu-system-common.links for OVMF.fd link
* Remove kvm-img, kvm-nbd, kvm-ifup and kvm-ifdown symlinks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * "Inventra" High-speed Dual-Role Controller (MUSB-HDRC), Mentor Graphics,
3
 
 * USB2.0 OTG compliant core used in various chips.
4
 
 *
5
 
 * Copyright (C) 2008 Nokia Corporation
6
 
 * Written by Andrzej Zaborowski <andrew@openedhand.com>
7
 
 *
8
 
 * This program is free software; you can redistribute it and/or
9
 
 * modify it under the terms of the GNU General Public License as
10
 
 * published by the Free Software Foundation; either version 2 or
11
 
 * (at your option) version 3 of the License.
12
 
 *
13
 
 * This program is distributed in the hope that it will be useful,
14
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
 * GNU General Public License for more details.
17
 
 *
18
 
 * You should have received a copy of the GNU General Public License along
19
 
 * with this program; if not, see <http://www.gnu.org/licenses/>.
20
 
 *
21
 
 * Only host-mode and non-DMA accesses are currently supported.
22
 
 */
23
 
#include "qemu-common.h"
24
 
#include "qemu/timer.h"
25
 
#include "hw/usb.h"
26
 
#include "hw/irq.h"
27
 
#include "hw/hw.h"
28
 
 
29
 
/* Common USB registers */
30
 
#define MUSB_HDRC_FADDR         0x00    /* 8-bit */
31
 
#define MUSB_HDRC_POWER         0x01    /* 8-bit */
32
 
 
33
 
#define MUSB_HDRC_INTRTX        0x02    /* 16-bit */
34
 
#define MUSB_HDRC_INTRRX        0x04
35
 
#define MUSB_HDRC_INTRTXE       0x06  
36
 
#define MUSB_HDRC_INTRRXE       0x08  
37
 
#define MUSB_HDRC_INTRUSB       0x0a    /* 8 bit */
38
 
#define MUSB_HDRC_INTRUSBE      0x0b    /* 8 bit */
39
 
#define MUSB_HDRC_FRAME         0x0c    /* 16-bit */
40
 
#define MUSB_HDRC_INDEX         0x0e    /* 8 bit */
41
 
#define MUSB_HDRC_TESTMODE      0x0f    /* 8 bit */
42
 
 
43
 
/* Per-EP registers in indexed mode */
44
 
#define MUSB_HDRC_EP_IDX        0x10    /* 8-bit */
45
 
 
46
 
/* EP FIFOs */
47
 
#define MUSB_HDRC_FIFO          0x20
48
 
 
49
 
/* Additional Control Registers */
50
 
#define MUSB_HDRC_DEVCTL        0x60    /* 8 bit */
51
 
 
52
 
/* These are indexed */
53
 
#define MUSB_HDRC_TXFIFOSZ      0x62    /* 8 bit (see masks) */
54
 
#define MUSB_HDRC_RXFIFOSZ      0x63    /* 8 bit (see masks) */
55
 
#define MUSB_HDRC_TXFIFOADDR    0x64    /* 16 bit offset shifted right 3 */
56
 
#define MUSB_HDRC_RXFIFOADDR    0x66    /* 16 bit offset shifted right 3 */
57
 
 
58
 
/* Some more registers */
59
 
#define MUSB_HDRC_VCTRL         0x68    /* 8 bit */
60
 
#define MUSB_HDRC_HWVERS        0x6c    /* 8 bit */
61
 
 
62
 
/* Added in HDRC 1.9(?) & MHDRC 1.4 */
63
 
/* ULPI pass-through */
64
 
#define MUSB_HDRC_ULPI_VBUSCTL  0x70
65
 
#define MUSB_HDRC_ULPI_REGDATA  0x74
66
 
#define MUSB_HDRC_ULPI_REGADDR  0x75
67
 
#define MUSB_HDRC_ULPI_REGCTL   0x76
68
 
 
69
 
/* Extended config & PHY control */
70
 
#define MUSB_HDRC_ENDCOUNT      0x78    /* 8 bit */
71
 
#define MUSB_HDRC_DMARAMCFG     0x79    /* 8 bit */
72
 
#define MUSB_HDRC_PHYWAIT       0x7a    /* 8 bit */
73
 
#define MUSB_HDRC_PHYVPLEN      0x7b    /* 8 bit */
74
 
#define MUSB_HDRC_HS_EOF1       0x7c    /* 8 bit, units of 546.1 us */
75
 
#define MUSB_HDRC_FS_EOF1       0x7d    /* 8 bit, units of 533.3 ns */
76
 
#define MUSB_HDRC_LS_EOF1       0x7e    /* 8 bit, units of 1.067 us */
77
 
 
78
 
/* Per-EP BUSCTL registers */
79
 
#define MUSB_HDRC_BUSCTL        0x80
80
 
 
81
 
/* Per-EP registers in flat mode */
82
 
#define MUSB_HDRC_EP            0x100
83
 
 
84
 
/* offsets to registers in flat model */
85
 
#define MUSB_HDRC_TXMAXP        0x00    /* 16 bit apparently */
86
 
#define MUSB_HDRC_TXCSR         0x02    /* 16 bit apparently */
87
 
#define MUSB_HDRC_CSR0          MUSB_HDRC_TXCSR         /* re-used for EP0 */
88
 
#define MUSB_HDRC_RXMAXP        0x04    /* 16 bit apparently */
89
 
#define MUSB_HDRC_RXCSR         0x06    /* 16 bit apparently */
90
 
#define MUSB_HDRC_RXCOUNT       0x08    /* 16 bit apparently */
91
 
#define MUSB_HDRC_COUNT0        MUSB_HDRC_RXCOUNT       /* re-used for EP0 */
92
 
#define MUSB_HDRC_TXTYPE        0x0a    /* 8 bit apparently */
93
 
#define MUSB_HDRC_TYPE0         MUSB_HDRC_TXTYPE        /* re-used for EP0 */
94
 
#define MUSB_HDRC_TXINTERVAL    0x0b    /* 8 bit apparently */
95
 
#define MUSB_HDRC_NAKLIMIT0     MUSB_HDRC_TXINTERVAL    /* re-used for EP0 */
96
 
#define MUSB_HDRC_RXTYPE        0x0c    /* 8 bit apparently */
97
 
#define MUSB_HDRC_RXINTERVAL    0x0d    /* 8 bit apparently */
98
 
#define MUSB_HDRC_FIFOSIZE      0x0f    /* 8 bit apparently */
99
 
#define MUSB_HDRC_CONFIGDATA    MGC_O_HDRC_FIFOSIZE     /* re-used for EP0 */
100
 
 
101
 
/* "Bus control" registers */
102
 
#define MUSB_HDRC_TXFUNCADDR    0x00
103
 
#define MUSB_HDRC_TXHUBADDR     0x02
104
 
#define MUSB_HDRC_TXHUBPORT     0x03
105
 
 
106
 
#define MUSB_HDRC_RXFUNCADDR    0x04
107
 
#define MUSB_HDRC_RXHUBADDR     0x06
108
 
#define MUSB_HDRC_RXHUBPORT     0x07
109
 
 
110
 
/*
111
 
 * MUSBHDRC Register bit masks
112
 
 */
113
 
 
114
 
/* POWER */
115
 
#define MGC_M_POWER_ISOUPDATE           0x80 
116
 
#define MGC_M_POWER_SOFTCONN            0x40
117
 
#define MGC_M_POWER_HSENAB              0x20
118
 
#define MGC_M_POWER_HSMODE              0x10
119
 
#define MGC_M_POWER_RESET               0x08
120
 
#define MGC_M_POWER_RESUME              0x04
121
 
#define MGC_M_POWER_SUSPENDM            0x02
122
 
#define MGC_M_POWER_ENSUSPEND           0x01
123
 
 
124
 
/* INTRUSB */
125
 
#define MGC_M_INTR_SUSPEND              0x01
126
 
#define MGC_M_INTR_RESUME               0x02
127
 
#define MGC_M_INTR_RESET                0x04
128
 
#define MGC_M_INTR_BABBLE               0x04
129
 
#define MGC_M_INTR_SOF                  0x08 
130
 
#define MGC_M_INTR_CONNECT              0x10
131
 
#define MGC_M_INTR_DISCONNECT           0x20
132
 
#define MGC_M_INTR_SESSREQ              0x40
133
 
#define MGC_M_INTR_VBUSERROR            0x80    /* FOR SESSION END */
134
 
#define MGC_M_INTR_EP0                  0x01    /* FOR EP0 INTERRUPT */
135
 
 
136
 
/* DEVCTL */
137
 
#define MGC_M_DEVCTL_BDEVICE            0x80   
138
 
#define MGC_M_DEVCTL_FSDEV              0x40
139
 
#define MGC_M_DEVCTL_LSDEV              0x20
140
 
#define MGC_M_DEVCTL_VBUS               0x18
141
 
#define MGC_S_DEVCTL_VBUS               3
142
 
#define MGC_M_DEVCTL_HM                 0x04
143
 
#define MGC_M_DEVCTL_HR                 0x02
144
 
#define MGC_M_DEVCTL_SESSION            0x01
145
 
 
146
 
/* TESTMODE */
147
 
#define MGC_M_TEST_FORCE_HOST           0x80
148
 
#define MGC_M_TEST_FIFO_ACCESS          0x40
149
 
#define MGC_M_TEST_FORCE_FS             0x20
150
 
#define MGC_M_TEST_FORCE_HS             0x10
151
 
#define MGC_M_TEST_PACKET               0x08
152
 
#define MGC_M_TEST_K                    0x04
153
 
#define MGC_M_TEST_J                    0x02
154
 
#define MGC_M_TEST_SE0_NAK              0x01
155
 
 
156
 
/* CSR0 */
157
 
#define MGC_M_CSR0_FLUSHFIFO            0x0100
158
 
#define MGC_M_CSR0_TXPKTRDY             0x0002
159
 
#define MGC_M_CSR0_RXPKTRDY             0x0001
160
 
 
161
 
/* CSR0 in Peripheral mode */
162
 
#define MGC_M_CSR0_P_SVDSETUPEND        0x0080
163
 
#define MGC_M_CSR0_P_SVDRXPKTRDY        0x0040
164
 
#define MGC_M_CSR0_P_SENDSTALL          0x0020
165
 
#define MGC_M_CSR0_P_SETUPEND           0x0010
166
 
#define MGC_M_CSR0_P_DATAEND            0x0008
167
 
#define MGC_M_CSR0_P_SENTSTALL          0x0004
168
 
 
169
 
/* CSR0 in Host mode */
170
 
#define MGC_M_CSR0_H_NO_PING            0x0800
171
 
#define MGC_M_CSR0_H_WR_DATATOGGLE      0x0400  /* set to allow setting: */
172
 
#define MGC_M_CSR0_H_DATATOGGLE         0x0200  /* data toggle control */
173
 
#define MGC_M_CSR0_H_NAKTIMEOUT         0x0080
174
 
#define MGC_M_CSR0_H_STATUSPKT          0x0040
175
 
#define MGC_M_CSR0_H_REQPKT             0x0020
176
 
#define MGC_M_CSR0_H_ERROR              0x0010
177
 
#define MGC_M_CSR0_H_SETUPPKT           0x0008
178
 
#define MGC_M_CSR0_H_RXSTALL            0x0004
179
 
 
180
 
/* CONFIGDATA */
181
 
#define MGC_M_CONFIGDATA_MPRXE          0x80    /* auto bulk pkt combining */
182
 
#define MGC_M_CONFIGDATA_MPTXE          0x40    /* auto bulk pkt splitting */
183
 
#define MGC_M_CONFIGDATA_BIGENDIAN      0x20
184
 
#define MGC_M_CONFIGDATA_HBRXE          0x10    /* HB-ISO for RX */
185
 
#define MGC_M_CONFIGDATA_HBTXE          0x08    /* HB-ISO for TX */
186
 
#define MGC_M_CONFIGDATA_DYNFIFO        0x04    /* dynamic FIFO sizing */
187
 
#define MGC_M_CONFIGDATA_SOFTCONE       0x02    /* SoftConnect */
188
 
#define MGC_M_CONFIGDATA_UTMIDW         0x01    /* Width, 0 => 8b, 1 => 16b */
189
 
 
190
 
/* TXCSR in Peripheral and Host mode */
191
 
#define MGC_M_TXCSR_AUTOSET             0x8000
192
 
#define MGC_M_TXCSR_ISO                 0x4000
193
 
#define MGC_M_TXCSR_MODE                0x2000
194
 
#define MGC_M_TXCSR_DMAENAB             0x1000
195
 
#define MGC_M_TXCSR_FRCDATATOG          0x0800
196
 
#define MGC_M_TXCSR_DMAMODE             0x0400
197
 
#define MGC_M_TXCSR_CLRDATATOG          0x0040
198
 
#define MGC_M_TXCSR_FLUSHFIFO           0x0008
199
 
#define MGC_M_TXCSR_FIFONOTEMPTY        0x0002
200
 
#define MGC_M_TXCSR_TXPKTRDY            0x0001
201
 
 
202
 
/* TXCSR in Peripheral mode */
203
 
#define MGC_M_TXCSR_P_INCOMPTX          0x0080
204
 
#define MGC_M_TXCSR_P_SENTSTALL         0x0020
205
 
#define MGC_M_TXCSR_P_SENDSTALL         0x0010
206
 
#define MGC_M_TXCSR_P_UNDERRUN          0x0004
207
 
 
208
 
/* TXCSR in Host mode */
209
 
#define MGC_M_TXCSR_H_WR_DATATOGGLE     0x0200
210
 
#define MGC_M_TXCSR_H_DATATOGGLE        0x0100
211
 
#define MGC_M_TXCSR_H_NAKTIMEOUT        0x0080
212
 
#define MGC_M_TXCSR_H_RXSTALL           0x0020
213
 
#define MGC_M_TXCSR_H_ERROR             0x0004
214
 
 
215
 
/* RXCSR in Peripheral and Host mode */
216
 
#define MGC_M_RXCSR_AUTOCLEAR           0x8000
217
 
#define MGC_M_RXCSR_DMAENAB             0x2000
218
 
#define MGC_M_RXCSR_DISNYET             0x1000
219
 
#define MGC_M_RXCSR_DMAMODE             0x0800
220
 
#define MGC_M_RXCSR_INCOMPRX            0x0100
221
 
#define MGC_M_RXCSR_CLRDATATOG          0x0080
222
 
#define MGC_M_RXCSR_FLUSHFIFO           0x0010
223
 
#define MGC_M_RXCSR_DATAERROR           0x0008
224
 
#define MGC_M_RXCSR_FIFOFULL            0x0002
225
 
#define MGC_M_RXCSR_RXPKTRDY            0x0001
226
 
 
227
 
/* RXCSR in Peripheral mode */
228
 
#define MGC_M_RXCSR_P_ISO               0x4000
229
 
#define MGC_M_RXCSR_P_SENTSTALL         0x0040
230
 
#define MGC_M_RXCSR_P_SENDSTALL         0x0020
231
 
#define MGC_M_RXCSR_P_OVERRUN           0x0004
232
 
 
233
 
/* RXCSR in Host mode */
234
 
#define MGC_M_RXCSR_H_AUTOREQ           0x4000
235
 
#define MGC_M_RXCSR_H_WR_DATATOGGLE     0x0400
236
 
#define MGC_M_RXCSR_H_DATATOGGLE        0x0200
237
 
#define MGC_M_RXCSR_H_RXSTALL           0x0040
238
 
#define MGC_M_RXCSR_H_REQPKT            0x0020
239
 
#define MGC_M_RXCSR_H_ERROR             0x0004
240
 
 
241
 
/* HUBADDR */
242
 
#define MGC_M_HUBADDR_MULTI_TT          0x80
243
 
 
244
 
/* ULPI: Added in HDRC 1.9(?) & MHDRC 1.4 */
245
 
#define MGC_M_ULPI_VBCTL_USEEXTVBUSIND  0x02
246
 
#define MGC_M_ULPI_VBCTL_USEEXTVBUS     0x01
247
 
#define MGC_M_ULPI_REGCTL_INT_ENABLE    0x08
248
 
#define MGC_M_ULPI_REGCTL_READNOTWRITE  0x04
249
 
#define MGC_M_ULPI_REGCTL_COMPLETE      0x02
250
 
#define MGC_M_ULPI_REGCTL_REG           0x01
251
 
 
252
 
/* #define MUSB_DEBUG */
253
 
 
254
 
#ifdef MUSB_DEBUG
255
 
#define TRACE(fmt,...) fprintf(stderr, "%s@%d: " fmt "\n", __FUNCTION__, \
256
 
                               __LINE__, ##__VA_ARGS__)
257
 
#else
258
 
#define TRACE(...)
259
 
#endif
260
 
 
261
 
 
262
 
static void musb_attach(USBPort *port);
263
 
static void musb_detach(USBPort *port);
264
 
static void musb_child_detach(USBPort *port, USBDevice *child);
265
 
static void musb_schedule_cb(USBPort *port, USBPacket *p);
266
 
static void musb_async_cancel_device(MUSBState *s, USBDevice *dev);
267
 
 
268
 
static USBPortOps musb_port_ops = {
269
 
    .attach = musb_attach,
270
 
    .detach = musb_detach,
271
 
    .child_detach = musb_child_detach,
272
 
    .complete = musb_schedule_cb,
273
 
};
274
 
 
275
 
static USBBusOps musb_bus_ops = {
276
 
};
277
 
 
278
 
typedef struct MUSBPacket MUSBPacket;
279
 
typedef struct MUSBEndPoint MUSBEndPoint;
280
 
 
281
 
struct MUSBPacket {
282
 
    USBPacket p;
283
 
    MUSBEndPoint *ep;
284
 
    int dir;
285
 
};
286
 
 
287
 
struct MUSBEndPoint {
288
 
    uint16_t faddr[2];
289
 
    uint8_t haddr[2];
290
 
    uint8_t hport[2];
291
 
    uint16_t csr[2];
292
 
    uint16_t maxp[2];
293
 
    uint16_t rxcount;
294
 
    uint8_t type[2];
295
 
    uint8_t interval[2];
296
 
    uint8_t config;
297
 
    uint8_t fifosize;
298
 
    int timeout[2];     /* Always in microframes */
299
 
 
300
 
    uint8_t *buf[2];
301
 
    int fifolen[2];
302
 
    int fifostart[2];
303
 
    int fifoaddr[2];
304
 
    MUSBPacket packey[2];
305
 
    int status[2];
306
 
    int ext_size[2];
307
 
 
308
 
    /* For callbacks' use */
309
 
    int epnum;
310
 
    int interrupt[2];
311
 
    MUSBState *musb;
312
 
    USBCallback *delayed_cb[2];
313
 
    QEMUTimer *intv_timer[2];
314
 
};
315
 
 
316
 
struct MUSBState {
317
 
    qemu_irq irqs[musb_irq_max];
318
 
    USBBus bus;
319
 
    USBPort port;
320
 
 
321
 
    int idx;
322
 
    uint8_t devctl;
323
 
    uint8_t power;
324
 
    uint8_t faddr;
325
 
 
326
 
    uint8_t intr;
327
 
    uint8_t mask;
328
 
    uint16_t tx_intr;
329
 
    uint16_t tx_mask;
330
 
    uint16_t rx_intr;
331
 
    uint16_t rx_mask;
332
 
 
333
 
    int setup_len;
334
 
    int session;
335
 
 
336
 
    uint8_t buf[0x8000];
337
 
 
338
 
        /* Duplicating the world since 2008!...  probably we should have 32
339
 
         * logical, single endpoints instead.  */
340
 
    MUSBEndPoint ep[16];
341
 
};
342
 
 
343
 
void musb_reset(MUSBState *s)
344
 
{
345
 
    int i;
346
 
 
347
 
    s->faddr = 0x00;
348
 
    s->devctl = 0;
349
 
    s->power = MGC_M_POWER_HSENAB;
350
 
    s->tx_intr = 0x0000;
351
 
    s->rx_intr = 0x0000;
352
 
    s->tx_mask = 0xffff;
353
 
    s->rx_mask = 0xffff;
354
 
    s->intr = 0x00;
355
 
    s->mask = 0x06;
356
 
    s->idx = 0;
357
 
 
358
 
    s->setup_len = 0;
359
 
    s->session = 0;
360
 
    memset(s->buf, 0, sizeof(s->buf));
361
 
 
362
 
    /* TODO: _DW */
363
 
    s->ep[0].config = MGC_M_CONFIGDATA_SOFTCONE | MGC_M_CONFIGDATA_DYNFIFO;
364
 
    for (i = 0; i < 16; i ++) {
365
 
        s->ep[i].fifosize = 64;
366
 
        s->ep[i].maxp[0] = 0x40;
367
 
        s->ep[i].maxp[1] = 0x40;
368
 
        s->ep[i].musb = s;
369
 
        s->ep[i].epnum = i;
370
 
        usb_packet_init(&s->ep[i].packey[0].p);
371
 
        usb_packet_init(&s->ep[i].packey[1].p);
372
 
    }
373
 
}
374
 
 
375
 
struct MUSBState *musb_init(DeviceState *parent_device, int gpio_base)
376
 
{
377
 
    MUSBState *s = g_malloc0(sizeof(*s));
378
 
    int i;
379
 
 
380
 
    for (i = 0; i < musb_irq_max; i++) {
381
 
        s->irqs[i] = qdev_get_gpio_in(parent_device, gpio_base + i);
382
 
    }
383
 
 
384
 
    musb_reset(s);
385
 
 
386
 
    usb_bus_new(&s->bus, sizeof(s->bus), &musb_bus_ops, parent_device);
387
 
    usb_register_port(&s->bus, &s->port, s, 0, &musb_port_ops,
388
 
                      USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
389
 
 
390
 
    return s;
391
 
}
392
 
 
393
 
static void musb_vbus_set(MUSBState *s, int level)
394
 
{
395
 
    if (level)
396
 
        s->devctl |= 3 << MGC_S_DEVCTL_VBUS;
397
 
    else
398
 
        s->devctl &= ~MGC_M_DEVCTL_VBUS;
399
 
 
400
 
    qemu_set_irq(s->irqs[musb_set_vbus], level);
401
 
}
402
 
 
403
 
static void musb_intr_set(MUSBState *s, int line, int level)
404
 
{
405
 
    if (!level) {
406
 
        s->intr &= ~(1 << line);
407
 
        qemu_irq_lower(s->irqs[line]);
408
 
    } else if (s->mask & (1 << line)) {
409
 
        s->intr |= 1 << line;
410
 
        qemu_irq_raise(s->irqs[line]);
411
 
    }
412
 
}
413
 
 
414
 
static void musb_tx_intr_set(MUSBState *s, int line, int level)
415
 
{
416
 
    if (!level) {
417
 
        s->tx_intr &= ~(1 << line);
418
 
        if (!s->tx_intr)
419
 
            qemu_irq_lower(s->irqs[musb_irq_tx]);
420
 
    } else if (s->tx_mask & (1 << line)) {
421
 
        s->tx_intr |= 1 << line;
422
 
        qemu_irq_raise(s->irqs[musb_irq_tx]);
423
 
    }
424
 
}
425
 
 
426
 
static void musb_rx_intr_set(MUSBState *s, int line, int level)
427
 
{
428
 
    if (line) {
429
 
        if (!level) {
430
 
            s->rx_intr &= ~(1 << line);
431
 
            if (!s->rx_intr)
432
 
                qemu_irq_lower(s->irqs[musb_irq_rx]);
433
 
        } else if (s->rx_mask & (1 << line)) {
434
 
            s->rx_intr |= 1 << line;
435
 
            qemu_irq_raise(s->irqs[musb_irq_rx]);
436
 
        }
437
 
    } else
438
 
        musb_tx_intr_set(s, line, level);
439
 
}
440
 
 
441
 
uint32_t musb_core_intr_get(MUSBState *s)
442
 
{
443
 
    return (s->rx_intr << 15) | s->tx_intr;
444
 
}
445
 
 
446
 
void musb_core_intr_clear(MUSBState *s, uint32_t mask)
447
 
{
448
 
    if (s->rx_intr) {
449
 
        s->rx_intr &= mask >> 15;
450
 
        if (!s->rx_intr)
451
 
            qemu_irq_lower(s->irqs[musb_irq_rx]);
452
 
    }
453
 
 
454
 
    if (s->tx_intr) {
455
 
        s->tx_intr &= mask & 0xffff;
456
 
        if (!s->tx_intr)
457
 
            qemu_irq_lower(s->irqs[musb_irq_tx]);
458
 
    }
459
 
}
460
 
 
461
 
void musb_set_size(MUSBState *s, int epnum, int size, int is_tx)
462
 
{
463
 
    s->ep[epnum].ext_size[!is_tx] = size;
464
 
    s->ep[epnum].fifostart[0] = 0;
465
 
    s->ep[epnum].fifostart[1] = 0;
466
 
    s->ep[epnum].fifolen[0] = 0;
467
 
    s->ep[epnum].fifolen[1] = 0;
468
 
}
469
 
 
470
 
static void musb_session_update(MUSBState *s, int prev_dev, int prev_sess)
471
 
{
472
 
    int detect_prev = prev_dev && prev_sess;
473
 
    int detect = !!s->port.dev && s->session;
474
 
 
475
 
    if (detect && !detect_prev) {
476
 
        /* Let's skip the ID pin sense and VBUS sense formalities and
477
 
         * and signal a successful SRP directly.  This should work at least
478
 
         * for the Linux driver stack.  */
479
 
        musb_intr_set(s, musb_irq_connect, 1);
480
 
 
481
 
        if (s->port.dev->speed == USB_SPEED_LOW) {
482
 
            s->devctl &= ~MGC_M_DEVCTL_FSDEV;
483
 
            s->devctl |= MGC_M_DEVCTL_LSDEV;
484
 
        } else {
485
 
            s->devctl |= MGC_M_DEVCTL_FSDEV;
486
 
            s->devctl &= ~MGC_M_DEVCTL_LSDEV;
487
 
        }
488
 
 
489
 
        /* A-mode?  */
490
 
        s->devctl &= ~MGC_M_DEVCTL_BDEVICE;
491
 
 
492
 
        /* Host-mode bit?  */
493
 
        s->devctl |= MGC_M_DEVCTL_HM;
494
 
#if 1
495
 
        musb_vbus_set(s, 1);
496
 
#endif
497
 
    } else if (!detect && detect_prev) {
498
 
#if 1
499
 
        musb_vbus_set(s, 0);
500
 
#endif
501
 
    }
502
 
}
503
 
 
504
 
/* Attach or detach a device on our only port.  */
505
 
static void musb_attach(USBPort *port)
506
 
{
507
 
    MUSBState *s = (MUSBState *) port->opaque;
508
 
 
509
 
    musb_intr_set(s, musb_irq_vbus_request, 1);
510
 
    musb_session_update(s, 0, s->session);
511
 
}
512
 
 
513
 
static void musb_detach(USBPort *port)
514
 
{
515
 
    MUSBState *s = (MUSBState *) port->opaque;
516
 
 
517
 
    musb_async_cancel_device(s, port->dev);
518
 
 
519
 
    musb_intr_set(s, musb_irq_disconnect, 1);
520
 
    musb_session_update(s, 1, s->session);
521
 
}
522
 
 
523
 
static void musb_child_detach(USBPort *port, USBDevice *child)
524
 
{
525
 
    MUSBState *s = (MUSBState *) port->opaque;
526
 
 
527
 
    musb_async_cancel_device(s, child);
528
 
}
529
 
 
530
 
static void musb_cb_tick0(void *opaque)
531
 
{
532
 
    MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
533
 
 
534
 
    ep->delayed_cb[0](&ep->packey[0].p, opaque);
535
 
}
536
 
 
537
 
static void musb_cb_tick1(void *opaque)
538
 
{
539
 
    MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
540
 
 
541
 
    ep->delayed_cb[1](&ep->packey[1].p, opaque);
542
 
}
543
 
 
544
 
#define musb_cb_tick    (dir ? musb_cb_tick1 : musb_cb_tick0)
545
 
 
546
 
static void musb_schedule_cb(USBPort *port, USBPacket *packey)
547
 
{
548
 
    MUSBPacket *p = container_of(packey, MUSBPacket, p);
549
 
    MUSBEndPoint *ep = p->ep;
550
 
    int dir = p->dir;
551
 
    int timeout = 0;
552
 
 
553
 
    if (ep->status[dir] == USB_RET_NAK)
554
 
        timeout = ep->timeout[dir];
555
 
    else if (ep->interrupt[dir])
556
 
        timeout = 8;
557
 
    else
558
 
        return musb_cb_tick(ep);
559
 
 
560
 
    if (!ep->intv_timer[dir])
561
 
        ep->intv_timer[dir] = timer_new_ns(QEMU_CLOCK_VIRTUAL, musb_cb_tick, ep);
562
 
 
563
 
    timer_mod(ep->intv_timer[dir], qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
564
 
                   muldiv64(timeout, get_ticks_per_sec(), 8000));
565
 
}
566
 
 
567
 
static int musb_timeout(int ttype, int speed, int val)
568
 
{
569
 
#if 1
570
 
    return val << 3;
571
 
#endif
572
 
 
573
 
    switch (ttype) {
574
 
    case USB_ENDPOINT_XFER_CONTROL:
575
 
        if (val < 2)
576
 
            return 0;
577
 
        else if (speed == USB_SPEED_HIGH)
578
 
            return 1 << (val - 1);
579
 
        else
580
 
            return 8 << (val - 1);
581
 
 
582
 
    case USB_ENDPOINT_XFER_INT:
583
 
        if (speed == USB_SPEED_HIGH)
584
 
            if (val < 2)
585
 
                return 0;
586
 
            else
587
 
                return 1 << (val - 1);
588
 
        else
589
 
            return val << 3;
590
 
 
591
 
    case USB_ENDPOINT_XFER_BULK:
592
 
    case USB_ENDPOINT_XFER_ISOC:
593
 
        if (val < 2)
594
 
            return 0;
595
 
        else if (speed == USB_SPEED_HIGH)
596
 
            return 1 << (val - 1);
597
 
        else
598
 
            return 8 << (val - 1);
599
 
        /* TODO: what with low-speed Bulk and Isochronous?  */
600
 
    }
601
 
 
602
 
    hw_error("bad interval\n");
603
 
}
604
 
 
605
 
static void musb_packet(MUSBState *s, MUSBEndPoint *ep,
606
 
                int epnum, int pid, int len, USBCallback cb, int dir)
607
 
{
608
 
    USBDevice *dev;
609
 
    USBEndpoint *uep;
610
 
    int idx = epnum && dir;
611
 
    int ttype;
612
 
 
613
 
    /* ep->type[0,1] contains:
614
 
     * in bits 7:6 the speed (0 - invalid, 1 - high, 2 - full, 3 - slow)
615
 
     * in bits 5:4 the transfer type (BULK / INT)
616
 
     * in bits 3:0 the EP num
617
 
     */
618
 
    ttype = epnum ? (ep->type[idx] >> 4) & 3 : 0;
619
 
 
620
 
    ep->timeout[dir] = musb_timeout(ttype,
621
 
                    ep->type[idx] >> 6, ep->interval[idx]);
622
 
    ep->interrupt[dir] = ttype == USB_ENDPOINT_XFER_INT;
623
 
    ep->delayed_cb[dir] = cb;
624
 
 
625
 
    /* A wild guess on the FADDR semantics... */
626
 
    dev = usb_find_device(&s->port, ep->faddr[idx]);
627
 
    uep = usb_ep_get(dev, pid, ep->type[idx] & 0xf);
628
 
    usb_packet_setup(&ep->packey[dir].p, pid, uep, 0,
629
 
                     (dev->addr << 16) | (uep->nr << 8) | pid, false, true);
630
 
    usb_packet_addbuf(&ep->packey[dir].p, ep->buf[idx], len);
631
 
    ep->packey[dir].ep = ep;
632
 
    ep->packey[dir].dir = dir;
633
 
 
634
 
    usb_handle_packet(dev, &ep->packey[dir].p);
635
 
 
636
 
    if (ep->packey[dir].p.status == USB_RET_ASYNC) {
637
 
        usb_device_flush_ep_queue(dev, uep);
638
 
        ep->status[dir] = len;
639
 
        return;
640
 
    }
641
 
 
642
 
    if (ep->packey[dir].p.status == USB_RET_SUCCESS) {
643
 
        ep->status[dir] = ep->packey[dir].p.actual_length;
644
 
    } else {
645
 
        ep->status[dir] = ep->packey[dir].p.status;
646
 
    }
647
 
    musb_schedule_cb(&s->port, &ep->packey[dir].p);
648
 
}
649
 
 
650
 
static void musb_tx_packet_complete(USBPacket *packey, void *opaque)
651
 
{
652
 
    /* Unfortunately we can't use packey->devep because that's the remote
653
 
     * endpoint number and may be different than our local.  */
654
 
    MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
655
 
    int epnum = ep->epnum;
656
 
    MUSBState *s = ep->musb;
657
 
 
658
 
    ep->fifostart[0] = 0;
659
 
    ep->fifolen[0] = 0;
660
 
#ifdef CLEAR_NAK
661
 
    if (ep->status[0] != USB_RET_NAK) {
662
 
#endif
663
 
        if (epnum)
664
 
            ep->csr[0] &= ~(MGC_M_TXCSR_FIFONOTEMPTY | MGC_M_TXCSR_TXPKTRDY);
665
 
        else
666
 
            ep->csr[0] &= ~MGC_M_CSR0_TXPKTRDY;
667
 
#ifdef CLEAR_NAK
668
 
    }
669
 
#endif
670
 
 
671
 
    /* Clear all of the error bits first */
672
 
    if (epnum)
673
 
        ep->csr[0] &= ~(MGC_M_TXCSR_H_ERROR | MGC_M_TXCSR_H_RXSTALL |
674
 
                        MGC_M_TXCSR_H_NAKTIMEOUT);
675
 
    else
676
 
        ep->csr[0] &= ~(MGC_M_CSR0_H_ERROR | MGC_M_CSR0_H_RXSTALL |
677
 
                        MGC_M_CSR0_H_NAKTIMEOUT | MGC_M_CSR0_H_NO_PING);
678
 
 
679
 
    if (ep->status[0] == USB_RET_STALL) {
680
 
        /* Command not supported by target! */
681
 
        ep->status[0] = 0;
682
 
 
683
 
        if (epnum)
684
 
            ep->csr[0] |= MGC_M_TXCSR_H_RXSTALL;
685
 
        else
686
 
            ep->csr[0] |= MGC_M_CSR0_H_RXSTALL;
687
 
    }
688
 
 
689
 
    if (ep->status[0] == USB_RET_NAK) {
690
 
        ep->status[0] = 0;
691
 
 
692
 
        /* NAK timeouts are only generated in Bulk transfers and
693
 
         * Data-errors in Isochronous.  */
694
 
        if (ep->interrupt[0]) {
695
 
            return;
696
 
        }
697
 
 
698
 
        if (epnum)
699
 
            ep->csr[0] |= MGC_M_TXCSR_H_NAKTIMEOUT;
700
 
        else
701
 
            ep->csr[0] |= MGC_M_CSR0_H_NAKTIMEOUT;
702
 
    }
703
 
 
704
 
    if (ep->status[0] < 0) {
705
 
        if (ep->status[0] == USB_RET_BABBLE)
706
 
            musb_intr_set(s, musb_irq_rst_babble, 1);
707
 
 
708
 
        /* Pretend we've tried three times already and failed (in
709
 
         * case of USB_TOKEN_SETUP).  */
710
 
        if (epnum)
711
 
            ep->csr[0] |= MGC_M_TXCSR_H_ERROR;
712
 
        else
713
 
            ep->csr[0] |= MGC_M_CSR0_H_ERROR;
714
 
 
715
 
        musb_tx_intr_set(s, epnum, 1);
716
 
        return;
717
 
    }
718
 
    /* TODO: check len for over/underruns of an OUT packet?  */
719
 
 
720
 
#ifdef SETUPLEN_HACK
721
 
    if (!epnum && ep->packey[0].pid == USB_TOKEN_SETUP)
722
 
        s->setup_len = ep->packey[0].data[6];
723
 
#endif
724
 
 
725
 
    /* In DMA mode: if no error, assert DMA request for this EP,
726
 
     * and skip the interrupt.  */
727
 
    musb_tx_intr_set(s, epnum, 1);
728
 
}
729
 
 
730
 
static void musb_rx_packet_complete(USBPacket *packey, void *opaque)
731
 
{
732
 
    /* Unfortunately we can't use packey->devep because that's the remote
733
 
     * endpoint number and may be different than our local.  */
734
 
    MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
735
 
    int epnum = ep->epnum;
736
 
    MUSBState *s = ep->musb;
737
 
 
738
 
    ep->fifostart[1] = 0;
739
 
    ep->fifolen[1] = 0;
740
 
 
741
 
#ifdef CLEAR_NAK
742
 
    if (ep->status[1] != USB_RET_NAK) {
743
 
#endif
744
 
        ep->csr[1] &= ~MGC_M_RXCSR_H_REQPKT;
745
 
        if (!epnum)
746
 
            ep->csr[0] &= ~MGC_M_CSR0_H_REQPKT;
747
 
#ifdef CLEAR_NAK
748
 
    }
749
 
#endif
750
 
 
751
 
    /* Clear all of the imaginable error bits first */
752
 
    ep->csr[1] &= ~(MGC_M_RXCSR_H_ERROR | MGC_M_RXCSR_H_RXSTALL |
753
 
                    MGC_M_RXCSR_DATAERROR);
754
 
    if (!epnum)
755
 
        ep->csr[0] &= ~(MGC_M_CSR0_H_ERROR | MGC_M_CSR0_H_RXSTALL |
756
 
                        MGC_M_CSR0_H_NAKTIMEOUT | MGC_M_CSR0_H_NO_PING);
757
 
 
758
 
    if (ep->status[1] == USB_RET_STALL) {
759
 
        ep->status[1] = 0;
760
 
 
761
 
        ep->csr[1] |= MGC_M_RXCSR_H_RXSTALL;
762
 
        if (!epnum)
763
 
            ep->csr[0] |= MGC_M_CSR0_H_RXSTALL;
764
 
    }
765
 
 
766
 
    if (ep->status[1] == USB_RET_NAK) {
767
 
        ep->status[1] = 0;
768
 
 
769
 
        /* NAK timeouts are only generated in Bulk transfers and
770
 
         * Data-errors in Isochronous.  */
771
 
        if (ep->interrupt[1])
772
 
            return musb_packet(s, ep, epnum, USB_TOKEN_IN,
773
 
                            packey->iov.size, musb_rx_packet_complete, 1);
774
 
 
775
 
        ep->csr[1] |= MGC_M_RXCSR_DATAERROR;
776
 
        if (!epnum)
777
 
            ep->csr[0] |= MGC_M_CSR0_H_NAKTIMEOUT;
778
 
    }
779
 
 
780
 
    if (ep->status[1] < 0) {
781
 
        if (ep->status[1] == USB_RET_BABBLE) {
782
 
            musb_intr_set(s, musb_irq_rst_babble, 1);
783
 
            return;
784
 
        }
785
 
 
786
 
        /* Pretend we've tried three times already and failed (in
787
 
         * case of a control transfer).  */
788
 
        ep->csr[1] |= MGC_M_RXCSR_H_ERROR;
789
 
        if (!epnum)
790
 
            ep->csr[0] |= MGC_M_CSR0_H_ERROR;
791
 
 
792
 
        musb_rx_intr_set(s, epnum, 1);
793
 
        return;
794
 
    }
795
 
    /* TODO: check len for over/underruns of an OUT packet?  */
796
 
    /* TODO: perhaps make use of e->ext_size[1] here.  */
797
 
 
798
 
    if (!(ep->csr[1] & (MGC_M_RXCSR_H_RXSTALL | MGC_M_RXCSR_DATAERROR))) {
799
 
        ep->csr[1] |= MGC_M_RXCSR_FIFOFULL | MGC_M_RXCSR_RXPKTRDY;
800
 
        if (!epnum)
801
 
            ep->csr[0] |= MGC_M_CSR0_RXPKTRDY;
802
 
 
803
 
        ep->rxcount = ep->status[1]; /* XXX: MIN(packey->len, ep->maxp[1]); */
804
 
        /* In DMA mode: assert DMA request for this EP */
805
 
    }
806
 
 
807
 
    /* Only if DMA has not been asserted */
808
 
    musb_rx_intr_set(s, epnum, 1);
809
 
}
810
 
 
811
 
static void musb_async_cancel_device(MUSBState *s, USBDevice *dev)
812
 
{
813
 
    int ep, dir;
814
 
 
815
 
    for (ep = 0; ep < 16; ep++) {
816
 
        for (dir = 0; dir < 2; dir++) {
817
 
            if (!usb_packet_is_inflight(&s->ep[ep].packey[dir].p) ||
818
 
                s->ep[ep].packey[dir].p.ep->dev != dev) {
819
 
                continue;
820
 
            }
821
 
            usb_cancel_packet(&s->ep[ep].packey[dir].p);
822
 
            /* status updates needed here? */
823
 
        }
824
 
    }
825
 
}
826
 
 
827
 
static void musb_tx_rdy(MUSBState *s, int epnum)
828
 
{
829
 
    MUSBEndPoint *ep = s->ep + epnum;
830
 
    int pid;
831
 
    int total, valid = 0;
832
 
    TRACE("start %d, len %d",  ep->fifostart[0], ep->fifolen[0] );
833
 
    ep->fifostart[0] += ep->fifolen[0];
834
 
    ep->fifolen[0] = 0;
835
 
 
836
 
    /* XXX: how's the total size of the packet retrieved exactly in
837
 
     * the generic case?  */
838
 
    total = ep->maxp[0] & 0x3ff;
839
 
 
840
 
    if (ep->ext_size[0]) {
841
 
        total = ep->ext_size[0];
842
 
        ep->ext_size[0] = 0;
843
 
        valid = 1;
844
 
    }
845
 
 
846
 
    /* If the packet is not fully ready yet, wait for a next segment.  */
847
 
    if (epnum && (ep->fifostart[0]) < total)
848
 
        return;
849
 
 
850
 
    if (!valid)
851
 
        total = ep->fifostart[0];
852
 
 
853
 
    pid = USB_TOKEN_OUT;
854
 
    if (!epnum && (ep->csr[0] & MGC_M_CSR0_H_SETUPPKT)) {
855
 
        pid = USB_TOKEN_SETUP;
856
 
        if (total != 8) {
857
 
            TRACE("illegal SETUPPKT length of %i bytes", total);
858
 
        }
859
 
        /* Controller should retry SETUP packets three times on errors
860
 
         * but it doesn't make sense for us to do that.  */
861
 
    }
862
 
 
863
 
    return musb_packet(s, ep, epnum, pid,
864
 
                    total, musb_tx_packet_complete, 0);
865
 
}
866
 
 
867
 
static void musb_rx_req(MUSBState *s, int epnum)
868
 
{
869
 
    MUSBEndPoint *ep = s->ep + epnum;
870
 
    int total;
871
 
 
872
 
    /* If we already have a packet, which didn't fit into the
873
 
     * 64 bytes of the FIFO, only move the FIFO start and return. (Obsolete) */
874
 
    if (ep->packey[1].p.pid == USB_TOKEN_IN && ep->status[1] >= 0 &&
875
 
                    (ep->fifostart[1]) + ep->rxcount <
876
 
                    ep->packey[1].p.iov.size) {
877
 
        TRACE("0x%08x, %d",  ep->fifostart[1], ep->rxcount );
878
 
        ep->fifostart[1] += ep->rxcount;
879
 
        ep->fifolen[1] = 0;
880
 
 
881
 
        ep->rxcount = MIN(ep->packey[0].p.iov.size - (ep->fifostart[1]),
882
 
                        ep->maxp[1]);
883
 
 
884
 
        ep->csr[1] &= ~MGC_M_RXCSR_H_REQPKT;
885
 
        if (!epnum)
886
 
            ep->csr[0] &= ~MGC_M_CSR0_H_REQPKT;
887
 
 
888
 
        /* Clear all of the error bits first */
889
 
        ep->csr[1] &= ~(MGC_M_RXCSR_H_ERROR | MGC_M_RXCSR_H_RXSTALL |
890
 
                        MGC_M_RXCSR_DATAERROR);
891
 
        if (!epnum)
892
 
            ep->csr[0] &= ~(MGC_M_CSR0_H_ERROR | MGC_M_CSR0_H_RXSTALL |
893
 
                            MGC_M_CSR0_H_NAKTIMEOUT | MGC_M_CSR0_H_NO_PING);
894
 
 
895
 
        ep->csr[1] |= MGC_M_RXCSR_FIFOFULL | MGC_M_RXCSR_RXPKTRDY;
896
 
        if (!epnum)
897
 
            ep->csr[0] |= MGC_M_CSR0_RXPKTRDY;
898
 
        musb_rx_intr_set(s, epnum, 1);
899
 
        return;
900
 
    }
901
 
 
902
 
    /* The driver sets maxp[1] to 64 or less because it knows the hardware
903
 
     * FIFO is this deep.  Bigger packets get split in
904
 
     * usb_generic_handle_packet but we can also do the splitting locally
905
 
     * for performance.  It turns out we can also have a bigger FIFO and
906
 
     * ignore the limit set in ep->maxp[1].  The Linux MUSB driver deals
907
 
     * OK with single packets of even 32KB and we avoid splitting, however
908
 
     * usb_msd.c sometimes sends a packet bigger than what Linux expects
909
 
     * (e.g. 8192 bytes instead of 4096) and we get an OVERRUN.  Splitting
910
 
     * hides this overrun from Linux.  Up to 4096 everything is fine
911
 
     * though.  Currently this is disabled.
912
 
     *
913
 
     * XXX: mind ep->fifosize.  */
914
 
    total = MIN(ep->maxp[1] & 0x3ff, sizeof(s->buf));
915
 
 
916
 
#ifdef SETUPLEN_HACK
917
 
    /* Why should *we* do that instead of Linux?  */
918
 
    if (!epnum) {
919
 
        if (ep->packey[0].p.devaddr == 2) {
920
 
            total = MIN(s->setup_len, 8);
921
 
        } else {
922
 
            total = MIN(s->setup_len, 64);
923
 
        }
924
 
        s->setup_len -= total;
925
 
    }
926
 
#endif
927
 
 
928
 
    return musb_packet(s, ep, epnum, USB_TOKEN_IN,
929
 
                    total, musb_rx_packet_complete, 1);
930
 
}
931
 
 
932
 
static uint8_t musb_read_fifo(MUSBEndPoint *ep)
933
 
{
934
 
    uint8_t value;
935
 
    if (ep->fifolen[1] >= 64) {
936
 
        /* We have a FIFO underrun */
937
 
        TRACE("EP%d FIFO is now empty, stop reading", ep->epnum);
938
 
        return 0x00000000;
939
 
    }
940
 
    /* In DMA mode clear RXPKTRDY and set REQPKT automatically
941
 
     * (if AUTOREQ is set) */
942
 
 
943
 
    ep->csr[1] &= ~MGC_M_RXCSR_FIFOFULL;
944
 
    value=ep->buf[1][ep->fifostart[1] + ep->fifolen[1] ++];
945
 
    TRACE("EP%d 0x%02x, %d", ep->epnum, value, ep->fifolen[1] );
946
 
    return value;
947
 
}
948
 
 
949
 
static void musb_write_fifo(MUSBEndPoint *ep, uint8_t value)
950
 
{
951
 
    TRACE("EP%d = %02x", ep->epnum, value);
952
 
    if (ep->fifolen[0] >= 64) {
953
 
        /* We have a FIFO overrun */
954
 
        TRACE("EP%d FIFO exceeded 64 bytes, stop feeding data", ep->epnum);
955
 
        return;
956
 
     }
957
 
 
958
 
     ep->buf[0][ep->fifostart[0] + ep->fifolen[0] ++] = value;
959
 
     ep->csr[0] |= MGC_M_TXCSR_FIFONOTEMPTY;
960
 
}
961
 
 
962
 
static void musb_ep_frame_cancel(MUSBEndPoint *ep, int dir)
963
 
{
964
 
    if (ep->intv_timer[dir])
965
 
        timer_del(ep->intv_timer[dir]);
966
 
}
967
 
 
968
 
/* Bus control */
969
 
static uint8_t musb_busctl_readb(void *opaque, int ep, int addr)
970
 
{
971
 
    MUSBState *s = (MUSBState *) opaque;
972
 
 
973
 
    switch (addr) {
974
 
    /* For USB2.0 HS hubs only */
975
 
    case MUSB_HDRC_TXHUBADDR:
976
 
        return s->ep[ep].haddr[0];
977
 
    case MUSB_HDRC_TXHUBPORT:
978
 
        return s->ep[ep].hport[0];
979
 
    case MUSB_HDRC_RXHUBADDR:
980
 
        return s->ep[ep].haddr[1];
981
 
    case MUSB_HDRC_RXHUBPORT:
982
 
        return s->ep[ep].hport[1];
983
 
 
984
 
    default:
985
 
        TRACE("unknown register 0x%02x", addr);
986
 
        return 0x00;
987
 
    };
988
 
}
989
 
 
990
 
static void musb_busctl_writeb(void *opaque, int ep, int addr, uint8_t value)
991
 
{
992
 
    MUSBState *s = (MUSBState *) opaque;
993
 
 
994
 
    switch (addr) {
995
 
    case MUSB_HDRC_TXFUNCADDR:
996
 
        s->ep[ep].faddr[0] = value;
997
 
        break;
998
 
    case MUSB_HDRC_RXFUNCADDR:
999
 
        s->ep[ep].faddr[1] = value;
1000
 
        break;
1001
 
    case MUSB_HDRC_TXHUBADDR:
1002
 
        s->ep[ep].haddr[0] = value;
1003
 
        break;
1004
 
    case MUSB_HDRC_TXHUBPORT:
1005
 
        s->ep[ep].hport[0] = value;
1006
 
        break;
1007
 
    case MUSB_HDRC_RXHUBADDR:
1008
 
        s->ep[ep].haddr[1] = value;
1009
 
        break;
1010
 
    case MUSB_HDRC_RXHUBPORT:
1011
 
        s->ep[ep].hport[1] = value;
1012
 
        break;
1013
 
 
1014
 
    default:
1015
 
        TRACE("unknown register 0x%02x", addr);
1016
 
        break;
1017
 
    };
1018
 
}
1019
 
 
1020
 
static uint16_t musb_busctl_readh(void *opaque, int ep, int addr)
1021
 
{
1022
 
    MUSBState *s = (MUSBState *) opaque;
1023
 
 
1024
 
    switch (addr) {
1025
 
    case MUSB_HDRC_TXFUNCADDR:
1026
 
        return s->ep[ep].faddr[0];
1027
 
    case MUSB_HDRC_RXFUNCADDR:
1028
 
        return s->ep[ep].faddr[1];
1029
 
 
1030
 
    default:
1031
 
        return musb_busctl_readb(s, ep, addr) |
1032
 
                (musb_busctl_readb(s, ep, addr | 1) << 8);
1033
 
    };
1034
 
}
1035
 
 
1036
 
static void musb_busctl_writeh(void *opaque, int ep, int addr, uint16_t value)
1037
 
{
1038
 
    MUSBState *s = (MUSBState *) opaque;
1039
 
 
1040
 
    switch (addr) {
1041
 
    case MUSB_HDRC_TXFUNCADDR:
1042
 
        s->ep[ep].faddr[0] = value;
1043
 
        break;
1044
 
    case MUSB_HDRC_RXFUNCADDR:
1045
 
        s->ep[ep].faddr[1] = value;
1046
 
        break;
1047
 
 
1048
 
    default:
1049
 
        musb_busctl_writeb(s, ep, addr, value & 0xff);
1050
 
        musb_busctl_writeb(s, ep, addr | 1, value >> 8);
1051
 
    };
1052
 
}
1053
 
 
1054
 
/* Endpoint control */
1055
 
static uint8_t musb_ep_readb(void *opaque, int ep, int addr)
1056
 
{
1057
 
    MUSBState *s = (MUSBState *) opaque;
1058
 
 
1059
 
    switch (addr) {
1060
 
    case MUSB_HDRC_TXTYPE:
1061
 
        return s->ep[ep].type[0];
1062
 
    case MUSB_HDRC_TXINTERVAL:
1063
 
        return s->ep[ep].interval[0];
1064
 
    case MUSB_HDRC_RXTYPE:
1065
 
        return s->ep[ep].type[1];
1066
 
    case MUSB_HDRC_RXINTERVAL:
1067
 
        return s->ep[ep].interval[1];
1068
 
    case (MUSB_HDRC_FIFOSIZE & ~1):
1069
 
        return 0x00;
1070
 
    case MUSB_HDRC_FIFOSIZE:
1071
 
        return ep ? s->ep[ep].fifosize : s->ep[ep].config;
1072
 
    case MUSB_HDRC_RXCOUNT:
1073
 
        return s->ep[ep].rxcount;
1074
 
 
1075
 
    default:
1076
 
        TRACE("unknown register 0x%02x", addr);
1077
 
        return 0x00;
1078
 
    };
1079
 
}
1080
 
 
1081
 
static void musb_ep_writeb(void *opaque, int ep, int addr, uint8_t value)
1082
 
{
1083
 
    MUSBState *s = (MUSBState *) opaque;
1084
 
 
1085
 
    switch (addr) {
1086
 
    case MUSB_HDRC_TXTYPE:
1087
 
        s->ep[ep].type[0] = value;
1088
 
        break;
1089
 
    case MUSB_HDRC_TXINTERVAL:
1090
 
        s->ep[ep].interval[0] = value;
1091
 
        musb_ep_frame_cancel(&s->ep[ep], 0);
1092
 
        break;
1093
 
    case MUSB_HDRC_RXTYPE:
1094
 
        s->ep[ep].type[1] = value;
1095
 
        break;
1096
 
    case MUSB_HDRC_RXINTERVAL:
1097
 
        s->ep[ep].interval[1] = value;
1098
 
        musb_ep_frame_cancel(&s->ep[ep], 1);
1099
 
        break;
1100
 
    case (MUSB_HDRC_FIFOSIZE & ~1):
1101
 
        break;
1102
 
    case MUSB_HDRC_FIFOSIZE:
1103
 
        TRACE("somebody messes with fifosize (now %i bytes)", value);
1104
 
        s->ep[ep].fifosize = value;
1105
 
        break;
1106
 
    default:
1107
 
        TRACE("unknown register 0x%02x", addr);
1108
 
        break;
1109
 
    };
1110
 
}
1111
 
 
1112
 
static uint16_t musb_ep_readh(void *opaque, int ep, int addr)
1113
 
{
1114
 
    MUSBState *s = (MUSBState *) opaque;
1115
 
    uint16_t ret;
1116
 
 
1117
 
    switch (addr) {
1118
 
    case MUSB_HDRC_TXMAXP:
1119
 
        return s->ep[ep].maxp[0];
1120
 
    case MUSB_HDRC_TXCSR:
1121
 
        return s->ep[ep].csr[0];
1122
 
    case MUSB_HDRC_RXMAXP:
1123
 
        return s->ep[ep].maxp[1];
1124
 
    case MUSB_HDRC_RXCSR:
1125
 
        ret = s->ep[ep].csr[1];
1126
 
 
1127
 
        /* TODO: This and other bits probably depend on
1128
 
         * ep->csr[1] & MGC_M_RXCSR_AUTOCLEAR.  */
1129
 
        if (s->ep[ep].csr[1] & MGC_M_RXCSR_AUTOCLEAR)
1130
 
            s->ep[ep].csr[1] &= ~MGC_M_RXCSR_RXPKTRDY;
1131
 
 
1132
 
        return ret;
1133
 
    case MUSB_HDRC_RXCOUNT:
1134
 
        return s->ep[ep].rxcount;
1135
 
 
1136
 
    default:
1137
 
        return musb_ep_readb(s, ep, addr) |
1138
 
                (musb_ep_readb(s, ep, addr | 1) << 8);
1139
 
    };
1140
 
}
1141
 
 
1142
 
static void musb_ep_writeh(void *opaque, int ep, int addr, uint16_t value)
1143
 
{
1144
 
    MUSBState *s = (MUSBState *) opaque;
1145
 
 
1146
 
    switch (addr) {
1147
 
    case MUSB_HDRC_TXMAXP:
1148
 
        s->ep[ep].maxp[0] = value;
1149
 
        break;
1150
 
    case MUSB_HDRC_TXCSR:
1151
 
        if (ep) {
1152
 
            s->ep[ep].csr[0] &= value & 0xa6;
1153
 
            s->ep[ep].csr[0] |= value & 0xff59;
1154
 
        } else {
1155
 
            s->ep[ep].csr[0] &= value & 0x85;
1156
 
            s->ep[ep].csr[0] |= value & 0xf7a;
1157
 
        }
1158
 
 
1159
 
        musb_ep_frame_cancel(&s->ep[ep], 0);
1160
 
 
1161
 
        if ((ep && (value & MGC_M_TXCSR_FLUSHFIFO)) ||
1162
 
                        (!ep && (value & MGC_M_CSR0_FLUSHFIFO))) {
1163
 
            s->ep[ep].fifolen[0] = 0;
1164
 
            s->ep[ep].fifostart[0] = 0;
1165
 
            if (ep)
1166
 
                s->ep[ep].csr[0] &=
1167
 
                        ~(MGC_M_TXCSR_FIFONOTEMPTY | MGC_M_TXCSR_TXPKTRDY);
1168
 
            else
1169
 
                s->ep[ep].csr[0] &=
1170
 
                        ~(MGC_M_CSR0_TXPKTRDY | MGC_M_CSR0_RXPKTRDY);
1171
 
        }
1172
 
        if (
1173
 
                        (ep &&
1174
 
#ifdef CLEAR_NAK
1175
 
                         (value & MGC_M_TXCSR_TXPKTRDY) &&
1176
 
                         !(value & MGC_M_TXCSR_H_NAKTIMEOUT)) ||
1177
 
#else
1178
 
                         (value & MGC_M_TXCSR_TXPKTRDY)) ||
1179
 
#endif
1180
 
                        (!ep &&
1181
 
#ifdef CLEAR_NAK
1182
 
                         (value & MGC_M_CSR0_TXPKTRDY) &&
1183
 
                         !(value & MGC_M_CSR0_H_NAKTIMEOUT)))
1184
 
#else
1185
 
                         (value & MGC_M_CSR0_TXPKTRDY)))
1186
 
#endif
1187
 
            musb_tx_rdy(s, ep);
1188
 
        if (!ep &&
1189
 
                        (value & MGC_M_CSR0_H_REQPKT) &&
1190
 
#ifdef CLEAR_NAK
1191
 
                        !(value & (MGC_M_CSR0_H_NAKTIMEOUT |
1192
 
                                        MGC_M_CSR0_RXPKTRDY)))
1193
 
#else
1194
 
                        !(value & MGC_M_CSR0_RXPKTRDY))
1195
 
#endif
1196
 
            musb_rx_req(s, ep);
1197
 
        break;
1198
 
 
1199
 
    case MUSB_HDRC_RXMAXP:
1200
 
        s->ep[ep].maxp[1] = value;
1201
 
        break;
1202
 
    case MUSB_HDRC_RXCSR:
1203
 
        /* (DMA mode only) */
1204
 
        if (
1205
 
                (value & MGC_M_RXCSR_H_AUTOREQ) &&
1206
 
                !(value & MGC_M_RXCSR_RXPKTRDY) &&
1207
 
                (s->ep[ep].csr[1] & MGC_M_RXCSR_RXPKTRDY))
1208
 
            value |= MGC_M_RXCSR_H_REQPKT;
1209
 
 
1210
 
        s->ep[ep].csr[1] &= 0x102 | (value & 0x4d);
1211
 
        s->ep[ep].csr[1] |= value & 0xfeb0;
1212
 
 
1213
 
        musb_ep_frame_cancel(&s->ep[ep], 1);
1214
 
 
1215
 
        if (value & MGC_M_RXCSR_FLUSHFIFO) {
1216
 
            s->ep[ep].fifolen[1] = 0;
1217
 
            s->ep[ep].fifostart[1] = 0;
1218
 
            s->ep[ep].csr[1] &= ~(MGC_M_RXCSR_FIFOFULL | MGC_M_RXCSR_RXPKTRDY);
1219
 
            /* If double buffering and we have two packets ready, flush
1220
 
             * only the first one and set up the fifo at the second packet.  */
1221
 
        }
1222
 
#ifdef CLEAR_NAK
1223
 
        if ((value & MGC_M_RXCSR_H_REQPKT) && !(value & MGC_M_RXCSR_DATAERROR))
1224
 
#else
1225
 
        if (value & MGC_M_RXCSR_H_REQPKT)
1226
 
#endif
1227
 
            musb_rx_req(s, ep);
1228
 
        break;
1229
 
    case MUSB_HDRC_RXCOUNT:
1230
 
        s->ep[ep].rxcount = value;
1231
 
        break;
1232
 
 
1233
 
    default:
1234
 
        musb_ep_writeb(s, ep, addr, value & 0xff);
1235
 
        musb_ep_writeb(s, ep, addr | 1, value >> 8);
1236
 
    };
1237
 
}
1238
 
 
1239
 
/* Generic control */
1240
 
static uint32_t musb_readb(void *opaque, hwaddr addr)
1241
 
{
1242
 
    MUSBState *s = (MUSBState *) opaque;
1243
 
    int ep, i;
1244
 
    uint8_t ret;
1245
 
 
1246
 
    switch (addr) {
1247
 
    case MUSB_HDRC_FADDR:
1248
 
        return s->faddr;
1249
 
    case MUSB_HDRC_POWER:
1250
 
        return s->power;
1251
 
    case MUSB_HDRC_INTRUSB:
1252
 
        ret = s->intr;
1253
 
        for (i = 0; i < sizeof(ret) * 8; i ++)
1254
 
            if (ret & (1 << i))
1255
 
                musb_intr_set(s, i, 0);
1256
 
        return ret;
1257
 
    case MUSB_HDRC_INTRUSBE:
1258
 
        return s->mask;
1259
 
    case MUSB_HDRC_INDEX:
1260
 
        return s->idx;
1261
 
    case MUSB_HDRC_TESTMODE:
1262
 
        return 0x00;
1263
 
 
1264
 
    case MUSB_HDRC_EP_IDX ... (MUSB_HDRC_EP_IDX + 0xf):
1265
 
        return musb_ep_readb(s, s->idx, addr & 0xf);
1266
 
 
1267
 
    case MUSB_HDRC_DEVCTL:
1268
 
        return s->devctl;
1269
 
 
1270
 
    case MUSB_HDRC_TXFIFOSZ:
1271
 
    case MUSB_HDRC_RXFIFOSZ:
1272
 
    case MUSB_HDRC_VCTRL:
1273
 
        /* TODO */
1274
 
        return 0x00;
1275
 
 
1276
 
    case MUSB_HDRC_HWVERS:
1277
 
        return (1 << 10) | 400;
1278
 
 
1279
 
    case (MUSB_HDRC_VCTRL | 1):
1280
 
    case (MUSB_HDRC_HWVERS | 1):
1281
 
    case (MUSB_HDRC_DEVCTL | 1):
1282
 
        return 0x00;
1283
 
 
1284
 
    case MUSB_HDRC_BUSCTL ... (MUSB_HDRC_BUSCTL + 0x7f):
1285
 
        ep = (addr >> 3) & 0xf;
1286
 
        return musb_busctl_readb(s, ep, addr & 0x7);
1287
 
 
1288
 
    case MUSB_HDRC_EP ... (MUSB_HDRC_EP + 0xff):
1289
 
        ep = (addr >> 4) & 0xf;
1290
 
        return musb_ep_readb(s, ep, addr & 0xf);
1291
 
 
1292
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1293
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1294
 
        return musb_read_fifo(s->ep + ep);
1295
 
 
1296
 
    default:
1297
 
        TRACE("unknown register 0x%02x", (int) addr);
1298
 
        return 0x00;
1299
 
    };
1300
 
}
1301
 
 
1302
 
static void musb_writeb(void *opaque, hwaddr addr, uint32_t value)
1303
 
{
1304
 
    MUSBState *s = (MUSBState *) opaque;
1305
 
    int ep;
1306
 
 
1307
 
    switch (addr) {
1308
 
    case MUSB_HDRC_FADDR:
1309
 
        s->faddr = value & 0x7f;
1310
 
        break;
1311
 
    case MUSB_HDRC_POWER:
1312
 
        s->power = (value & 0xef) | (s->power & 0x10);
1313
 
        /* MGC_M_POWER_RESET is also read-only in Peripheral Mode */
1314
 
        if ((value & MGC_M_POWER_RESET) && s->port.dev) {
1315
 
            usb_device_reset(s->port.dev);
1316
 
            /* Negotiate high-speed operation if MGC_M_POWER_HSENAB is set.  */
1317
 
            if ((value & MGC_M_POWER_HSENAB) &&
1318
 
                            s->port.dev->speed == USB_SPEED_HIGH)
1319
 
                s->power |= MGC_M_POWER_HSMODE; /* Success */
1320
 
            /* Restart frame counting.  */
1321
 
        }
1322
 
        if (value & MGC_M_POWER_SUSPENDM) {
1323
 
            /* When all transfers finish, suspend and if MGC_M_POWER_ENSUSPEND
1324
 
             * is set, also go into low power mode.  Frame counting stops.  */
1325
 
            /* XXX: Cleared when the interrupt register is read */
1326
 
        }
1327
 
        if (value & MGC_M_POWER_RESUME) {
1328
 
            /* Wait 20ms and signal resuming on the bus.  Frame counting
1329
 
             * restarts.  */
1330
 
        }
1331
 
        break;
1332
 
    case MUSB_HDRC_INTRUSB:
1333
 
        break;
1334
 
    case MUSB_HDRC_INTRUSBE:
1335
 
        s->mask = value & 0xff;
1336
 
        break;
1337
 
    case MUSB_HDRC_INDEX:
1338
 
        s->idx = value & 0xf;
1339
 
        break;
1340
 
    case MUSB_HDRC_TESTMODE:
1341
 
        break;
1342
 
 
1343
 
    case MUSB_HDRC_EP_IDX ... (MUSB_HDRC_EP_IDX + 0xf):
1344
 
        musb_ep_writeb(s, s->idx, addr & 0xf, value);
1345
 
        break;
1346
 
 
1347
 
    case MUSB_HDRC_DEVCTL:
1348
 
        s->session = !!(value & MGC_M_DEVCTL_SESSION);
1349
 
        musb_session_update(s,
1350
 
                        !!s->port.dev,
1351
 
                        !!(s->devctl & MGC_M_DEVCTL_SESSION));
1352
 
 
1353
 
        /* It seems this is the only R/W bit in this register?  */
1354
 
        s->devctl &= ~MGC_M_DEVCTL_SESSION;
1355
 
        s->devctl |= value & MGC_M_DEVCTL_SESSION;
1356
 
        break;
1357
 
 
1358
 
    case MUSB_HDRC_TXFIFOSZ:
1359
 
    case MUSB_HDRC_RXFIFOSZ:
1360
 
    case MUSB_HDRC_VCTRL:
1361
 
        /* TODO */
1362
 
        break;
1363
 
 
1364
 
    case (MUSB_HDRC_VCTRL | 1):
1365
 
    case (MUSB_HDRC_DEVCTL | 1):
1366
 
        break;
1367
 
 
1368
 
    case MUSB_HDRC_BUSCTL ... (MUSB_HDRC_BUSCTL + 0x7f):
1369
 
        ep = (addr >> 3) & 0xf;
1370
 
        musb_busctl_writeb(s, ep, addr & 0x7, value);
1371
 
        break;
1372
 
 
1373
 
    case MUSB_HDRC_EP ... (MUSB_HDRC_EP + 0xff):
1374
 
        ep = (addr >> 4) & 0xf;
1375
 
        musb_ep_writeb(s, ep, addr & 0xf, value);
1376
 
        break;
1377
 
 
1378
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1379
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1380
 
        musb_write_fifo(s->ep + ep, value & 0xff);
1381
 
        break;
1382
 
 
1383
 
    default:
1384
 
        TRACE("unknown register 0x%02x", (int) addr);
1385
 
        break;
1386
 
    };
1387
 
}
1388
 
 
1389
 
static uint32_t musb_readh(void *opaque, hwaddr addr)
1390
 
{
1391
 
    MUSBState *s = (MUSBState *) opaque;
1392
 
    int ep, i;
1393
 
    uint16_t ret;
1394
 
 
1395
 
    switch (addr) {
1396
 
    case MUSB_HDRC_INTRTX:
1397
 
        ret = s->tx_intr;
1398
 
        /* Auto clear */
1399
 
        for (i = 0; i < sizeof(ret) * 8; i ++)
1400
 
            if (ret & (1 << i))
1401
 
                musb_tx_intr_set(s, i, 0);
1402
 
        return ret;
1403
 
    case MUSB_HDRC_INTRRX:
1404
 
        ret = s->rx_intr;
1405
 
        /* Auto clear */
1406
 
        for (i = 0; i < sizeof(ret) * 8; i ++)
1407
 
            if (ret & (1 << i))
1408
 
                musb_rx_intr_set(s, i, 0);
1409
 
        return ret;
1410
 
    case MUSB_HDRC_INTRTXE:
1411
 
        return s->tx_mask;
1412
 
    case MUSB_HDRC_INTRRXE:
1413
 
        return s->rx_mask;
1414
 
 
1415
 
    case MUSB_HDRC_FRAME:
1416
 
        /* TODO */
1417
 
        return 0x0000;
1418
 
    case MUSB_HDRC_TXFIFOADDR:
1419
 
        return s->ep[s->idx].fifoaddr[0];
1420
 
    case MUSB_HDRC_RXFIFOADDR:
1421
 
        return s->ep[s->idx].fifoaddr[1];
1422
 
 
1423
 
    case MUSB_HDRC_EP_IDX ... (MUSB_HDRC_EP_IDX + 0xf):
1424
 
        return musb_ep_readh(s, s->idx, addr & 0xf);
1425
 
 
1426
 
    case MUSB_HDRC_BUSCTL ... (MUSB_HDRC_BUSCTL + 0x7f):
1427
 
        ep = (addr >> 3) & 0xf;
1428
 
        return musb_busctl_readh(s, ep, addr & 0x7);
1429
 
 
1430
 
    case MUSB_HDRC_EP ... (MUSB_HDRC_EP + 0xff):
1431
 
        ep = (addr >> 4) & 0xf;
1432
 
        return musb_ep_readh(s, ep, addr & 0xf);
1433
 
 
1434
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1435
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1436
 
        return (musb_read_fifo(s->ep + ep) | musb_read_fifo(s->ep + ep) << 8);
1437
 
 
1438
 
    default:
1439
 
        return musb_readb(s, addr) | (musb_readb(s, addr | 1) << 8);
1440
 
    };
1441
 
}
1442
 
 
1443
 
static void musb_writeh(void *opaque, hwaddr addr, uint32_t value)
1444
 
{
1445
 
    MUSBState *s = (MUSBState *) opaque;
1446
 
    int ep;
1447
 
 
1448
 
    switch (addr) {
1449
 
    case MUSB_HDRC_INTRTXE:
1450
 
        s->tx_mask = value;
1451
 
        /* XXX: the masks seem to apply on the raising edge like with
1452
 
         * edge-triggered interrupts, thus no need to update.  I may be
1453
 
         * wrong though.  */
1454
 
        break;
1455
 
    case MUSB_HDRC_INTRRXE:
1456
 
        s->rx_mask = value;
1457
 
        break;
1458
 
 
1459
 
    case MUSB_HDRC_FRAME:
1460
 
        /* TODO */
1461
 
        break;
1462
 
    case MUSB_HDRC_TXFIFOADDR:
1463
 
        s->ep[s->idx].fifoaddr[0] = value;
1464
 
        s->ep[s->idx].buf[0] =
1465
 
                s->buf + ((value << 3) & 0x7ff );
1466
 
        break;
1467
 
    case MUSB_HDRC_RXFIFOADDR:
1468
 
        s->ep[s->idx].fifoaddr[1] = value;
1469
 
        s->ep[s->idx].buf[1] =
1470
 
                s->buf + ((value << 3) & 0x7ff);
1471
 
        break;
1472
 
 
1473
 
    case MUSB_HDRC_EP_IDX ... (MUSB_HDRC_EP_IDX + 0xf):
1474
 
        musb_ep_writeh(s, s->idx, addr & 0xf, value);
1475
 
        break;
1476
 
 
1477
 
    case MUSB_HDRC_BUSCTL ... (MUSB_HDRC_BUSCTL + 0x7f):
1478
 
        ep = (addr >> 3) & 0xf;
1479
 
        musb_busctl_writeh(s, ep, addr & 0x7, value);
1480
 
        break;
1481
 
 
1482
 
    case MUSB_HDRC_EP ... (MUSB_HDRC_EP + 0xff):
1483
 
        ep = (addr >> 4) & 0xf;
1484
 
        musb_ep_writeh(s, ep, addr & 0xf, value);
1485
 
        break;
1486
 
 
1487
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1488
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1489
 
        musb_write_fifo(s->ep + ep, value & 0xff);
1490
 
        musb_write_fifo(s->ep + ep, (value >> 8) & 0xff);
1491
 
        break;
1492
 
 
1493
 
    default:
1494
 
        musb_writeb(s, addr, value & 0xff);
1495
 
        musb_writeb(s, addr | 1, value >> 8);
1496
 
    };
1497
 
}
1498
 
 
1499
 
static uint32_t musb_readw(void *opaque, hwaddr addr)
1500
 
{
1501
 
    MUSBState *s = (MUSBState *) opaque;
1502
 
    int ep;
1503
 
 
1504
 
    switch (addr) {
1505
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1506
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1507
 
        return ( musb_read_fifo(s->ep + ep)       |
1508
 
                 musb_read_fifo(s->ep + ep) << 8  |
1509
 
                 musb_read_fifo(s->ep + ep) << 16 |
1510
 
                 musb_read_fifo(s->ep + ep) << 24 );
1511
 
    default:
1512
 
        TRACE("unknown register 0x%02x", (int) addr);
1513
 
        return 0x00000000;
1514
 
    };
1515
 
}
1516
 
 
1517
 
static void musb_writew(void *opaque, hwaddr addr, uint32_t value)
1518
 
{
1519
 
    MUSBState *s = (MUSBState *) opaque;
1520
 
    int ep;
1521
 
 
1522
 
    switch (addr) {
1523
 
    case MUSB_HDRC_FIFO ... (MUSB_HDRC_FIFO + 0x3f):
1524
 
        ep = ((addr - MUSB_HDRC_FIFO) >> 2) & 0xf;
1525
 
        musb_write_fifo(s->ep + ep, value & 0xff);
1526
 
        musb_write_fifo(s->ep + ep, (value >> 8 ) & 0xff);
1527
 
        musb_write_fifo(s->ep + ep, (value >> 16) & 0xff);
1528
 
        musb_write_fifo(s->ep + ep, (value >> 24) & 0xff);
1529
 
            break;
1530
 
    default:
1531
 
        TRACE("unknown register 0x%02x", (int) addr);
1532
 
        break;
1533
 
    };
1534
 
}
1535
 
 
1536
 
CPUReadMemoryFunc * const musb_read[] = {
1537
 
    musb_readb,
1538
 
    musb_readh,
1539
 
    musb_readw,
1540
 
};
1541
 
 
1542
 
CPUWriteMemoryFunc * const musb_write[] = {
1543
 
    musb_writeb,
1544
 
    musb_writeh,
1545
 
    musb_writew,
1546
 
};