4 * Copyright (c) 2005 Fabrice Bellard
6 * 2008 Generic packet handler rewrite by Max Krasnyansky
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 #include "qemu-common.h"
31 void usb_attach(USBPort
*port
)
33 USBDevice
*dev
= port
->dev
;
36 assert(dev
->attached
);
37 assert(dev
->state
== USB_STATE_NOTATTACHED
);
38 port
->ops
->attach(port
);
39 dev
->state
= USB_STATE_ATTACHED
;
40 usb_device_handle_attach(dev
);
43 void usb_detach(USBPort
*port
)
45 USBDevice
*dev
= port
->dev
;
48 assert(dev
->state
!= USB_STATE_NOTATTACHED
);
49 port
->ops
->detach(port
);
50 dev
->state
= USB_STATE_NOTATTACHED
;
53 void usb_port_reset(USBPort
*port
)
55 USBDevice
*dev
= port
->dev
;
60 usb_device_reset(dev
);
63 void usb_device_reset(USBDevice
*dev
)
65 if (dev
== NULL
|| !dev
->attached
) {
68 dev
->remote_wakeup
= 0;
70 dev
->state
= USB_STATE_DEFAULT
;
71 usb_device_handle_reset(dev
);
74 void usb_wakeup(USBEndpoint
*ep
)
76 USBDevice
*dev
= ep
->dev
;
77 USBBus
*bus
= usb_bus_from_device(dev
);
79 if (dev
->remote_wakeup
&& dev
->port
&& dev
->port
->ops
->wakeup
) {
80 dev
->port
->ops
->wakeup(dev
->port
);
82 if (bus
->ops
->wakeup_endpoint
) {
83 bus
->ops
->wakeup_endpoint(bus
, ep
);
87 /**********************/
89 /* generic USB device helpers (you are not forced to use them when
90 writing your USB device driver, but they help handling the
94 #define SETUP_STATE_IDLE 0
95 #define SETUP_STATE_SETUP 1
96 #define SETUP_STATE_DATA 2
97 #define SETUP_STATE_ACK 3
98 #define SETUP_STATE_PARAM 4
100 static int do_token_setup(USBDevice
*s
, USBPacket
*p
)
102 int request
, value
, index
;
105 if (p
->iov
.size
!= 8) {
106 return USB_RET_STALL
;
109 usb_packet_copy(p
, s
->setup_buf
, p
->iov
.size
);
111 s
->setup_len
= (s
->setup_buf
[7] << 8) | s
->setup_buf
[6];
114 request
= (s
->setup_buf
[0] << 8) | s
->setup_buf
[1];
115 value
= (s
->setup_buf
[3] << 8) | s
->setup_buf
[2];
116 index
= (s
->setup_buf
[5] << 8) | s
->setup_buf
[4];
118 if (s
->setup_buf
[0] & USB_DIR_IN
) {
119 ret
= usb_device_handle_control(s
, p
, request
, value
, index
,
120 s
->setup_len
, s
->data_buf
);
121 if (ret
== USB_RET_ASYNC
) {
122 s
->setup_state
= SETUP_STATE_SETUP
;
123 return USB_RET_ASYNC
;
128 if (ret
< s
->setup_len
)
130 s
->setup_state
= SETUP_STATE_DATA
;
132 if (s
->setup_len
> sizeof(s
->data_buf
)) {
134 "usb_generic_handle_packet: ctrl buffer too small (%d > %zu)\n",
135 s
->setup_len
, sizeof(s
->data_buf
));
136 return USB_RET_STALL
;
138 if (s
->setup_len
== 0)
139 s
->setup_state
= SETUP_STATE_ACK
;
141 s
->setup_state
= SETUP_STATE_DATA
;
147 static int do_token_in(USBDevice
*s
, USBPacket
*p
)
149 int request
, value
, index
;
152 assert(p
->ep
->nr
== 0);
154 request
= (s
->setup_buf
[0] << 8) | s
->setup_buf
[1];
155 value
= (s
->setup_buf
[3] << 8) | s
->setup_buf
[2];
156 index
= (s
->setup_buf
[5] << 8) | s
->setup_buf
[4];
158 switch(s
->setup_state
) {
159 case SETUP_STATE_ACK
:
160 if (!(s
->setup_buf
[0] & USB_DIR_IN
)) {
161 ret
= usb_device_handle_control(s
, p
, request
, value
, index
,
162 s
->setup_len
, s
->data_buf
);
163 if (ret
== USB_RET_ASYNC
) {
164 return USB_RET_ASYNC
;
166 s
->setup_state
= SETUP_STATE_IDLE
;
175 case SETUP_STATE_DATA
:
176 if (s
->setup_buf
[0] & USB_DIR_IN
) {
177 int len
= s
->setup_len
- s
->setup_index
;
178 if (len
> p
->iov
.size
) {
181 usb_packet_copy(p
, s
->data_buf
+ s
->setup_index
, len
);
182 s
->setup_index
+= len
;
183 if (s
->setup_index
>= s
->setup_len
)
184 s
->setup_state
= SETUP_STATE_ACK
;
188 s
->setup_state
= SETUP_STATE_IDLE
;
189 return USB_RET_STALL
;
192 return USB_RET_STALL
;
196 static int do_token_out(USBDevice
*s
, USBPacket
*p
)
198 assert(p
->ep
->nr
== 0);
200 switch(s
->setup_state
) {
201 case SETUP_STATE_ACK
:
202 if (s
->setup_buf
[0] & USB_DIR_IN
) {
203 s
->setup_state
= SETUP_STATE_IDLE
;
206 /* ignore additional output */
210 case SETUP_STATE_DATA
:
211 if (!(s
->setup_buf
[0] & USB_DIR_IN
)) {
212 int len
= s
->setup_len
- s
->setup_index
;
213 if (len
> p
->iov
.size
) {
216 usb_packet_copy(p
, s
->data_buf
+ s
->setup_index
, len
);
217 s
->setup_index
+= len
;
218 if (s
->setup_index
>= s
->setup_len
)
219 s
->setup_state
= SETUP_STATE_ACK
;
223 s
->setup_state
= SETUP_STATE_IDLE
;
224 return USB_RET_STALL
;
227 return USB_RET_STALL
;
231 static int do_parameter(USBDevice
*s
, USBPacket
*p
)
233 int request
, value
, index
;
236 for (i
= 0; i
< 8; i
++) {
237 s
->setup_buf
[i
] = p
->parameter
>> (i
*8);
240 s
->setup_state
= SETUP_STATE_PARAM
;
241 s
->setup_len
= (s
->setup_buf
[7] << 8) | s
->setup_buf
[6];
244 request
= (s
->setup_buf
[0] << 8) | s
->setup_buf
[1];
245 value
= (s
->setup_buf
[3] << 8) | s
->setup_buf
[2];
246 index
= (s
->setup_buf
[5] << 8) | s
->setup_buf
[4];
248 if (s
->setup_len
> sizeof(s
->data_buf
)) {
250 "usb_generic_handle_packet: ctrl buffer too small (%d > %zu)\n",
251 s
->setup_len
, sizeof(s
->data_buf
));
252 return USB_RET_STALL
;
255 if (p
->pid
== USB_TOKEN_OUT
) {
256 usb_packet_copy(p
, s
->data_buf
, s
->setup_len
);
259 ret
= usb_device_handle_control(s
, p
, request
, value
, index
,
260 s
->setup_len
, s
->data_buf
);
265 if (ret
< s
->setup_len
) {
268 if (p
->pid
== USB_TOKEN_IN
) {
269 usb_packet_copy(p
, s
->data_buf
, s
->setup_len
);
275 /* ctrl complete function for devices which use usb_generic_handle_packet and
276 may return USB_RET_ASYNC from their handle_control callback. Device code
277 which does this *must* call this function instead of the normal
278 usb_packet_complete to complete their async control packets. */
279 void usb_generic_async_ctrl_complete(USBDevice
*s
, USBPacket
*p
)
282 s
->setup_state
= SETUP_STATE_IDLE
;
285 switch (s
->setup_state
) {
286 case SETUP_STATE_SETUP
:
287 if (p
->result
< s
->setup_len
) {
288 s
->setup_len
= p
->result
;
290 s
->setup_state
= SETUP_STATE_DATA
;
294 case SETUP_STATE_ACK
:
295 s
->setup_state
= SETUP_STATE_IDLE
;
299 case SETUP_STATE_PARAM
:
300 if (p
->result
< s
->setup_len
) {
301 s
->setup_len
= p
->result
;
303 if (p
->pid
== USB_TOKEN_IN
) {
305 usb_packet_copy(p
, s
->data_buf
, s
->setup_len
);
312 usb_packet_complete(s
, p
);
315 /* XXX: fix overflow */
316 int set_usb_string(uint8_t *buf
, const char *str
)
325 for(i
= 0; i
< len
; i
++) {
332 USBDevice
*usb_find_device(USBPort
*port
, uint8_t addr
)
334 USBDevice
*dev
= port
->dev
;
336 if (dev
== NULL
|| !dev
->attached
|| dev
->state
!= USB_STATE_DEFAULT
) {
339 if (dev
->addr
== addr
) {
342 return usb_device_find_device(dev
, addr
);
345 static int usb_process_one(USBPacket
*p
)
347 USBDevice
*dev
= p
->ep
->dev
;
349 if (p
->ep
->nr
== 0) {
352 return do_parameter(dev
, p
);
355 case USB_TOKEN_SETUP
:
356 return do_token_setup(dev
, p
);
358 return do_token_in(dev
, p
);
360 return do_token_out(dev
, p
);
362 return USB_RET_STALL
;
366 return usb_device_handle_data(dev
, p
);
370 /* Hand over a packet to a device for processing. Return value
371 USB_RET_ASYNC indicates the processing isn't finished yet, the
372 driver will call usb_packet_complete() when done processing it. */
373 int usb_handle_packet(USBDevice
*dev
, USBPacket
*p
)
378 return USB_RET_NODEV
;
380 assert(dev
== p
->ep
->dev
);
381 assert(dev
->state
== USB_STATE_DEFAULT
);
382 usb_packet_check_state(p
, USB_PACKET_SETUP
);
383 assert(p
->ep
!= NULL
);
385 /* Submitting a new packet clears halt */
387 assert(QTAILQ_EMPTY(&p
->ep
->queue
));
388 p
->ep
->halted
= false;
391 if (QTAILQ_EMPTY(&p
->ep
->queue
) || p
->ep
->pipeline
) {
392 ret
= usb_process_one(p
);
393 if (ret
== USB_RET_ASYNC
) {
394 assert(p
->ep
->type
!= USB_ENDPOINT_XFER_ISOC
);
395 usb_packet_set_state(p
, USB_PACKET_ASYNC
);
396 QTAILQ_INSERT_TAIL(&p
->ep
->queue
, p
, queue
);
397 } else if (ret
== USB_RET_ADD_TO_QUEUE
) {
398 usb_packet_set_state(p
, USB_PACKET_QUEUED
);
399 QTAILQ_INSERT_TAIL(&p
->ep
->queue
, p
, queue
);
403 * When pipelining is enabled usb-devices must always return async,
404 * otherwise packets can complete out of order!
406 assert(!p
->ep
->pipeline
|| QTAILQ_EMPTY(&p
->ep
->queue
));
407 if (ret
!= USB_RET_NAK
) {
409 usb_packet_set_state(p
, USB_PACKET_COMPLETE
);
414 usb_packet_set_state(p
, USB_PACKET_QUEUED
);
415 QTAILQ_INSERT_TAIL(&p
->ep
->queue
, p
, queue
);
420 void usb_packet_complete_one(USBDevice
*dev
, USBPacket
*p
)
422 USBEndpoint
*ep
= p
->ep
;
424 assert(QTAILQ_FIRST(&ep
->queue
) == p
);
425 assert(p
->result
!= USB_RET_ASYNC
&& p
->result
!= USB_RET_NAK
);
427 if (p
->result
< 0 || (p
->short_not_ok
&& (p
->result
< p
->iov
.size
))) {
430 usb_packet_set_state(p
, USB_PACKET_COMPLETE
);
431 QTAILQ_REMOVE(&ep
->queue
, p
, queue
);
432 dev
->port
->ops
->complete(dev
->port
, p
);
435 /* Notify the controller that an async packet is complete. This should only
436 be called for packets previously deferred by returning USB_RET_ASYNC from
438 void usb_packet_complete(USBDevice
*dev
, USBPacket
*p
)
440 USBEndpoint
*ep
= p
->ep
;
443 usb_packet_check_state(p
, USB_PACKET_ASYNC
);
444 usb_packet_complete_one(dev
, p
);
446 while (!QTAILQ_EMPTY(&ep
->queue
)) {
447 p
= QTAILQ_FIRST(&ep
->queue
);
449 /* Empty the queue on a halt */
450 p
->result
= USB_RET_REMOVE_FROM_QUEUE
;
451 dev
->port
->ops
->complete(dev
->port
, p
);
454 if (p
->state
== USB_PACKET_ASYNC
) {
457 usb_packet_check_state(p
, USB_PACKET_QUEUED
);
458 ret
= usb_process_one(p
);
459 if (ret
== USB_RET_ASYNC
) {
460 usb_packet_set_state(p
, USB_PACKET_ASYNC
);
464 usb_packet_complete_one(ep
->dev
, p
);
468 /* Cancel an active packet. The packed must have been deferred by
469 returning USB_RET_ASYNC from handle_packet, and not yet
471 void usb_cancel_packet(USBPacket
* p
)
473 bool callback
= (p
->state
== USB_PACKET_ASYNC
);
474 assert(usb_packet_is_inflight(p
));
475 usb_packet_set_state(p
, USB_PACKET_CANCELED
);
476 QTAILQ_REMOVE(&p
->ep
->queue
, p
, queue
);
478 usb_device_cancel_packet(p
->ep
->dev
, p
);
483 void usb_packet_init(USBPacket
*p
)
485 qemu_iovec_init(&p
->iov
, 1);
488 static const char *usb_packet_state_name(USBPacketState state
)
490 static const char *name
[] = {
491 [USB_PACKET_UNDEFINED
] = "undef",
492 [USB_PACKET_SETUP
] = "setup",
493 [USB_PACKET_QUEUED
] = "queued",
494 [USB_PACKET_ASYNC
] = "async",
495 [USB_PACKET_COMPLETE
] = "complete",
496 [USB_PACKET_CANCELED
] = "canceled",
498 if (state
< ARRAY_SIZE(name
)) {
504 void usb_packet_check_state(USBPacket
*p
, USBPacketState expected
)
509 if (p
->state
== expected
) {
513 bus
= usb_bus_from_device(dev
);
514 trace_usb_packet_state_fault(bus
->busnr
, dev
->port
->path
, p
->ep
->nr
, p
,
515 usb_packet_state_name(p
->state
),
516 usb_packet_state_name(expected
));
517 assert(!"usb packet state check failed");
520 void usb_packet_set_state(USBPacket
*p
, USBPacketState state
)
523 USBDevice
*dev
= p
->ep
->dev
;
524 USBBus
*bus
= usb_bus_from_device(dev
);
525 trace_usb_packet_state_change(bus
->busnr
, dev
->port
->path
, p
->ep
->nr
, p
,
526 usb_packet_state_name(p
->state
),
527 usb_packet_state_name(state
));
529 trace_usb_packet_state_change(-1, "", -1, p
,
530 usb_packet_state_name(p
->state
),
531 usb_packet_state_name(state
));
536 void usb_packet_setup(USBPacket
*p
, int pid
, USBEndpoint
*ep
, uint64_t id
,
537 bool short_not_ok
, bool int_req
)
539 assert(!usb_packet_is_inflight(p
));
540 assert(p
->iov
.iov
!= NULL
);
546 p
->short_not_ok
= short_not_ok
;
547 p
->int_req
= int_req
;
548 qemu_iovec_reset(&p
->iov
);
549 usb_packet_set_state(p
, USB_PACKET_SETUP
);
552 void usb_packet_addbuf(USBPacket
*p
, void *ptr
, size_t len
)
554 qemu_iovec_add(&p
->iov
, ptr
, len
);
557 void usb_packet_copy(USBPacket
*p
, void *ptr
, size_t bytes
)
559 assert(p
->result
>= 0);
560 assert(p
->result
+ bytes
<= p
->iov
.size
);
562 case USB_TOKEN_SETUP
:
564 iov_to_buf(p
->iov
.iov
, p
->iov
.niov
, p
->result
, ptr
, bytes
);
567 iov_from_buf(p
->iov
.iov
, p
->iov
.niov
, p
->result
, ptr
, bytes
);
570 fprintf(stderr
, "%s: invalid pid: %x\n", __func__
, p
->pid
);
576 void usb_packet_skip(USBPacket
*p
, size_t bytes
)
578 assert(p
->result
>= 0);
579 assert(p
->result
+ bytes
<= p
->iov
.size
);
580 if (p
->pid
== USB_TOKEN_IN
) {
581 iov_memset(p
->iov
.iov
, p
->iov
.niov
, p
->result
, 0, bytes
);
586 void usb_packet_cleanup(USBPacket
*p
)
588 assert(!usb_packet_is_inflight(p
));
589 qemu_iovec_destroy(&p
->iov
);
592 void usb_ep_reset(USBDevice
*dev
)
597 dev
->ep_ctl
.type
= USB_ENDPOINT_XFER_CONTROL
;
598 dev
->ep_ctl
.ifnum
= 0;
599 dev
->ep_ctl
.dev
= dev
;
600 dev
->ep_ctl
.pipeline
= false;
601 for (ep
= 0; ep
< USB_MAX_ENDPOINTS
; ep
++) {
602 dev
->ep_in
[ep
].nr
= ep
+ 1;
603 dev
->ep_out
[ep
].nr
= ep
+ 1;
604 dev
->ep_in
[ep
].pid
= USB_TOKEN_IN
;
605 dev
->ep_out
[ep
].pid
= USB_TOKEN_OUT
;
606 dev
->ep_in
[ep
].type
= USB_ENDPOINT_XFER_INVALID
;
607 dev
->ep_out
[ep
].type
= USB_ENDPOINT_XFER_INVALID
;
608 dev
->ep_in
[ep
].ifnum
= USB_INTERFACE_INVALID
;
609 dev
->ep_out
[ep
].ifnum
= USB_INTERFACE_INVALID
;
610 dev
->ep_in
[ep
].dev
= dev
;
611 dev
->ep_out
[ep
].dev
= dev
;
612 dev
->ep_in
[ep
].pipeline
= false;
613 dev
->ep_out
[ep
].pipeline
= false;
617 void usb_ep_init(USBDevice
*dev
)
622 QTAILQ_INIT(&dev
->ep_ctl
.queue
);
623 for (ep
= 0; ep
< USB_MAX_ENDPOINTS
; ep
++) {
624 QTAILQ_INIT(&dev
->ep_in
[ep
].queue
);
625 QTAILQ_INIT(&dev
->ep_out
[ep
].queue
);
629 void usb_ep_dump(USBDevice
*dev
)
631 static const char *tname
[] = {
632 [USB_ENDPOINT_XFER_CONTROL
] = "control",
633 [USB_ENDPOINT_XFER_ISOC
] = "isoc",
634 [USB_ENDPOINT_XFER_BULK
] = "bulk",
635 [USB_ENDPOINT_XFER_INT
] = "int",
637 int ifnum
, ep
, first
;
639 fprintf(stderr
, "Device \"%s\", config %d\n",
640 dev
->product_desc
, dev
->configuration
);
641 for (ifnum
= 0; ifnum
< 16; ifnum
++) {
643 for (ep
= 0; ep
< USB_MAX_ENDPOINTS
; ep
++) {
644 if (dev
->ep_in
[ep
].type
!= USB_ENDPOINT_XFER_INVALID
&&
645 dev
->ep_in
[ep
].ifnum
== ifnum
) {
648 fprintf(stderr
, " Interface %d, alternative %d\n",
649 ifnum
, dev
->altsetting
[ifnum
]);
651 fprintf(stderr
, " Endpoint %d, IN, %s, %d max\n", ep
,
652 tname
[dev
->ep_in
[ep
].type
],
653 dev
->ep_in
[ep
].max_packet_size
);
655 if (dev
->ep_out
[ep
].type
!= USB_ENDPOINT_XFER_INVALID
&&
656 dev
->ep_out
[ep
].ifnum
== ifnum
) {
659 fprintf(stderr
, " Interface %d, alternative %d\n",
660 ifnum
, dev
->altsetting
[ifnum
]);
662 fprintf(stderr
, " Endpoint %d, OUT, %s, %d max\n", ep
,
663 tname
[dev
->ep_out
[ep
].type
],
664 dev
->ep_out
[ep
].max_packet_size
);
668 fprintf(stderr
, "--\n");
671 struct USBEndpoint
*usb_ep_get(USBDevice
*dev
, int pid
, int ep
)
673 struct USBEndpoint
*eps
;
678 eps
= (pid
== USB_TOKEN_IN
) ? dev
->ep_in
: dev
->ep_out
;
682 assert(pid
== USB_TOKEN_IN
|| pid
== USB_TOKEN_OUT
);
683 assert(ep
> 0 && ep
<= USB_MAX_ENDPOINTS
);
687 uint8_t usb_ep_get_type(USBDevice
*dev
, int pid
, int ep
)
689 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
693 void usb_ep_set_type(USBDevice
*dev
, int pid
, int ep
, uint8_t type
)
695 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
699 uint8_t usb_ep_get_ifnum(USBDevice
*dev
, int pid
, int ep
)
701 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
705 void usb_ep_set_ifnum(USBDevice
*dev
, int pid
, int ep
, uint8_t ifnum
)
707 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
711 void usb_ep_set_max_packet_size(USBDevice
*dev
, int pid
, int ep
,
714 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
715 int size
, microframes
;
718 switch ((raw
>> 11) & 3) {
729 uep
->max_packet_size
= size
* microframes
;
732 int usb_ep_get_max_packet_size(USBDevice
*dev
, int pid
, int ep
)
734 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
735 return uep
->max_packet_size
;
738 void usb_ep_set_pipeline(USBDevice
*dev
, int pid
, int ep
, bool enabled
)
740 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
741 uep
->pipeline
= enabled
;
744 USBPacket
*usb_ep_find_packet_by_id(USBDevice
*dev
, int pid
, int ep
,
747 struct USBEndpoint
*uep
= usb_ep_get(dev
, pid
, ep
);
750 while ((p
= QTAILQ_FIRST(&uep
->queue
)) != NULL
) {