Lines Matching +full:default +full:- +full:state
39 USBDevice *udev = port->dev; in usb_pick_speed()
43 if ((udev->speedmask & (1 << speeds[i])) && in usb_pick_speed()
44 (port->speedmask & (1 << speeds[i]))) { in usb_pick_speed()
45 udev->speed = speeds[i]; in usb_pick_speed()
53 USBDevice *dev = port->dev; in usb_attach()
56 assert(dev->attached); in usb_attach()
57 assert(dev->state == USB_STATE_NOTATTACHED); in usb_attach()
59 port->ops->attach(port); in usb_attach()
60 dev->state = USB_STATE_ATTACHED; in usb_attach()
66 USBDevice *dev = port->dev; in usb_detach()
69 assert(dev->state != USB_STATE_NOTATTACHED); in usb_detach()
70 port->ops->detach(port); in usb_detach()
71 dev->state = USB_STATE_NOTATTACHED; in usb_detach()
76 USBDevice *dev = port->dev; in usb_port_reset()
86 if (dev == NULL || !dev->attached) { in usb_device_reset()
90 dev->remote_wakeup = 0; in usb_device_reset()
91 dev->addr = 0; in usb_device_reset()
92 dev->state = USB_STATE_DEFAULT; in usb_device_reset()
97 USBDevice *dev = ep->dev; in usb_wakeup()
108 if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) { in usb_wakeup()
109 dev->port->ops->wakeup(dev->port); in usb_wakeup()
111 if (bus->ops->wakeup_endpoint) { in usb_wakeup()
112 bus->ops->wakeup_endpoint(bus, ep, stream); in usb_wakeup()
134 if (p->iov.size != 8) { in do_token_setup()
135 p->status = USB_RET_STALL; in do_token_setup()
139 usb_packet_copy(p, s->setup_buf, p->iov.size); in do_token_setup()
140 s->setup_index = 0; in do_token_setup()
141 p->actual_length = 0; in do_token_setup()
142 setup_len = (s->setup_buf[7] << 8) | s->setup_buf[6]; in do_token_setup()
143 if (setup_len > sizeof(s->data_buf)) { in do_token_setup()
146 setup_len, sizeof(s->data_buf)); in do_token_setup()
147 p->status = USB_RET_STALL; in do_token_setup()
150 s->setup_len = setup_len; in do_token_setup()
152 request = (s->setup_buf[0] << 8) | s->setup_buf[1]; in do_token_setup()
153 value = (s->setup_buf[3] << 8) | s->setup_buf[2]; in do_token_setup()
154 index = (s->setup_buf[5] << 8) | s->setup_buf[4]; in do_token_setup()
156 if (s->setup_buf[0] & USB_DIR_IN) { in do_token_setup()
159 s->setup_len, s->data_buf); in do_token_setup()
160 if (p->status == USB_RET_ASYNC) { in do_token_setup()
161 s->setup_state = SETUP_STATE_SETUP; in do_token_setup()
163 if (p->status != USB_RET_SUCCESS) { in do_token_setup()
167 if (p->actual_length < s->setup_len) { in do_token_setup()
168 s->setup_len = p->actual_length; in do_token_setup()
170 s->setup_state = SETUP_STATE_DATA; in do_token_setup()
172 if (s->setup_len == 0) in do_token_setup()
173 s->setup_state = SETUP_STATE_ACK; in do_token_setup()
175 s->setup_state = SETUP_STATE_DATA; in do_token_setup()
178 p->actual_length = 8; in do_token_setup()
185 assert(p->ep->nr == 0); in do_token_in()
187 request = (s->setup_buf[0] << 8) | s->setup_buf[1]; in do_token_in()
188 value = (s->setup_buf[3] << 8) | s->setup_buf[2]; in do_token_in()
189 index = (s->setup_buf[5] << 8) | s->setup_buf[4]; in do_token_in()
191 switch(s->setup_state) { in do_token_in()
193 if (!(s->setup_buf[0] & USB_DIR_IN)) { in do_token_in()
196 s->setup_len, s->data_buf); in do_token_in()
197 if (p->status == USB_RET_ASYNC) { in do_token_in()
200 s->setup_state = SETUP_STATE_IDLE; in do_token_in()
201 p->actual_length = 0; in do_token_in()
207 if (s->setup_buf[0] & USB_DIR_IN) { in do_token_in()
208 int len = s->setup_len - s->setup_index; in do_token_in()
209 if (len > p->iov.size) { in do_token_in()
210 len = p->iov.size; in do_token_in()
212 usb_packet_copy(p, s->data_buf + s->setup_index, len); in do_token_in()
213 s->setup_index += len; in do_token_in()
214 if (s->setup_index >= s->setup_len) { in do_token_in()
215 s->setup_state = SETUP_STATE_ACK; in do_token_in()
219 s->setup_state = SETUP_STATE_IDLE; in do_token_in()
220 p->status = USB_RET_STALL; in do_token_in()
224 default: in do_token_in()
225 p->status = USB_RET_STALL; in do_token_in()
231 assert(p->ep->nr == 0); in do_token_out()
233 switch(s->setup_state) { in do_token_out()
235 if (s->setup_buf[0] & USB_DIR_IN) { in do_token_out()
236 s->setup_state = SETUP_STATE_IDLE; in do_token_out()
245 if (!(s->setup_buf[0] & USB_DIR_IN)) { in do_token_out()
246 int len = s->setup_len - s->setup_index; in do_token_out()
247 if (len > p->iov.size) { in do_token_out()
248 len = p->iov.size; in do_token_out()
250 usb_packet_copy(p, s->data_buf + s->setup_index, len); in do_token_out()
251 s->setup_index += len; in do_token_out()
252 if (s->setup_index >= s->setup_len) { in do_token_out()
253 s->setup_state = SETUP_STATE_ACK; in do_token_out()
257 s->setup_state = SETUP_STATE_IDLE; in do_token_out()
258 p->status = USB_RET_STALL; in do_token_out()
262 default: in do_token_out()
263 p->status = USB_RET_STALL; in do_token_out()
273 s->setup_buf[i] = p->parameter >> (i*8); in do_parameter()
276 s->setup_state = SETUP_STATE_PARAM; in do_parameter()
277 s->setup_index = 0; in do_parameter()
279 request = (s->setup_buf[0] << 8) | s->setup_buf[1]; in do_parameter()
280 value = (s->setup_buf[3] << 8) | s->setup_buf[2]; in do_parameter()
281 index = (s->setup_buf[5] << 8) | s->setup_buf[4]; in do_parameter()
283 setup_len = (s->setup_buf[7] << 8) | s->setup_buf[6]; in do_parameter()
284 if (setup_len > sizeof(s->data_buf)) { in do_parameter()
287 setup_len, sizeof(s->data_buf)); in do_parameter()
288 p->status = USB_RET_STALL; in do_parameter()
291 s->setup_len = setup_len; in do_parameter()
293 if (p->pid == USB_TOKEN_OUT) { in do_parameter()
294 usb_packet_copy(p, s->data_buf, s->setup_len); in do_parameter()
299 s->setup_len, s->data_buf); in do_parameter()
300 if (p->status == USB_RET_ASYNC) { in do_parameter()
304 if (p->actual_length < s->setup_len) { in do_parameter()
305 s->setup_len = p->actual_length; in do_parameter()
307 if (p->pid == USB_TOKEN_IN) { in do_parameter()
308 p->actual_length = 0; in do_parameter()
309 usb_packet_copy(p, s->data_buf, s->setup_len); in do_parameter()
320 if (p->status < 0) { in usb_generic_async_ctrl_complete()
321 s->setup_state = SETUP_STATE_IDLE; in usb_generic_async_ctrl_complete()
325 switch (s->setup_state) { in usb_generic_async_ctrl_complete()
327 if (p->actual_length < s->setup_len) { in usb_generic_async_ctrl_complete()
328 s->setup_len = p->actual_length; in usb_generic_async_ctrl_complete()
330 s->setup_state = SETUP_STATE_DATA; in usb_generic_async_ctrl_complete()
331 p->actual_length = 8; in usb_generic_async_ctrl_complete()
335 s->setup_state = SETUP_STATE_IDLE; in usb_generic_async_ctrl_complete()
336 p->actual_length = 0; in usb_generic_async_ctrl_complete()
341 if (p->actual_length < s->setup_len) { in usb_generic_async_ctrl_complete()
342 s->setup_len = p->actual_length; in usb_generic_async_ctrl_complete()
344 if (p->pid == USB_TOKEN_IN) { in usb_generic_async_ctrl_complete()
345 p->actual_length = 0; in usb_generic_async_ctrl_complete()
346 usb_packet_copy(p, s->data_buf, s->setup_len); in usb_generic_async_ctrl_complete()
350 default: in usb_generic_async_ctrl_complete()
358 USBDevice *dev = port->dev; in usb_find_device()
360 if (dev == NULL || !dev->attached || dev->state != USB_STATE_DEFAULT) { in usb_find_device()
363 if (dev->addr == addr) { in usb_find_device()
371 USBDevice *dev = p->ep->dev; in usb_process_one()
379 nak = (p->status == USB_RET_NAK); in usb_process_one()
380 p->status = USB_RET_SUCCESS; in usb_process_one()
382 if (p->ep->nr == 0) { in usb_process_one()
384 if (p->parameter) { in usb_process_one()
388 switch (p->pid) { in usb_process_one()
398 default: in usb_process_one()
399 p->status = USB_RET_STALL; in usb_process_one()
413 QTAILQ_INSERT_TAIL(&p->ep->queue, p, queue); in usb_queue_one()
414 p->status = USB_RET_ASYNC; in usb_queue_one()
417 /* Hand over a packet to a device for processing. p->status ==
423 p->status = USB_RET_NODEV; in usb_handle_packet()
426 assert(dev == p->ep->dev); in usb_handle_packet()
427 assert(dev->state == USB_STATE_DEFAULT); in usb_handle_packet()
429 assert(p->ep != NULL); in usb_handle_packet()
432 if (p->ep->halted) { in usb_handle_packet()
433 assert(QTAILQ_EMPTY(&p->ep->queue)); in usb_handle_packet()
434 p->ep->halted = false; in usb_handle_packet()
437 if (QTAILQ_EMPTY(&p->ep->queue) || p->ep->pipeline || p->stream) { in usb_handle_packet()
439 if (p->status == USB_RET_ASYNC) { in usb_handle_packet()
441 assert(p->ep->type != USB_ENDPOINT_XFER_ISOC); in usb_handle_packet()
443 assert(p->ep->type != USB_ENDPOINT_XFER_INT || in usb_handle_packet()
444 (dev->flags & (1 << USB_DEV_FLAG_IS_HOST))); in usb_handle_packet()
446 QTAILQ_INSERT_TAIL(&p->ep->queue, p, queue); in usb_handle_packet()
447 } else if (p->status == USB_RET_ADD_TO_QUEUE) { in usb_handle_packet()
451 * When pipelining is enabled usb-devices must always return async, in usb_handle_packet()
454 assert(p->stream || !p->ep->pipeline || in usb_handle_packet()
455 QTAILQ_EMPTY(&p->ep->queue)); in usb_handle_packet()
456 if (p->status != USB_RET_NAK) { in usb_handle_packet()
468 USBEndpoint *ep = p->ep; in usb_packet_complete_one()
470 assert(p->stream || QTAILQ_FIRST(&ep->queue) == p); in usb_packet_complete_one()
471 assert(p->status != USB_RET_ASYNC && p->status != USB_RET_NAK); in usb_packet_complete_one()
473 if (p->status != USB_RET_SUCCESS || in usb_packet_complete_one()
474 (p->short_not_ok && (p->actual_length < p->iov.size))) { in usb_packet_complete_one()
475 ep->halted = true; in usb_packet_complete_one()
479 QTAILQ_REMOVE(&ep->queue, p, queue); in usb_packet_complete_one()
480 dev->port->ops->complete(dev->port, p); in usb_packet_complete_one()
488 USBEndpoint *ep = p->ep; in usb_packet_complete()
493 while (!QTAILQ_EMPTY(&ep->queue)) { in usb_packet_complete()
494 p = QTAILQ_FIRST(&ep->queue); in usb_packet_complete()
495 if (ep->halted) { in usb_packet_complete()
497 p->status = USB_RET_REMOVE_FROM_QUEUE; in usb_packet_complete()
498 dev->port->ops->complete(dev->port, p); in usb_packet_complete()
501 if (p->state == USB_PACKET_ASYNC) { in usb_packet_complete()
506 if (p->status == USB_RET_ASYNC) { in usb_packet_complete()
510 usb_packet_complete_one(ep->dev, p); in usb_packet_complete()
519 bool callback = (p->state == USB_PACKET_ASYNC); in usb_cancel_packet()
522 QTAILQ_REMOVE(&p->ep->queue, p, queue); in usb_cancel_packet()
524 usb_device_cancel_packet(p->ep->dev, p); in usb_cancel_packet()
531 qemu_iovec_init(&p->iov, 1); in usb_packet_init()
534 static const char *usb_packet_state_name(USBPacketState state) in usb_packet_state_name() argument
544 if (state < ARRAY_SIZE(name)) { in usb_packet_state_name()
545 return name[state]; in usb_packet_state_name()
555 if (p->state == expected) { in usb_packet_check_state()
558 dev = p->ep->dev; in usb_packet_check_state()
560 trace_usb_packet_state_fault(bus->busnr, dev->port->path, p->ep->nr, p, in usb_packet_check_state()
561 usb_packet_state_name(p->state), in usb_packet_check_state()
563 assert(!"usb packet state check failed"); in usb_packet_check_state()
566 void usb_packet_set_state(USBPacket *p, USBPacketState state) in usb_packet_set_state() argument
568 if (p->ep) { in usb_packet_set_state()
569 USBDevice *dev = p->ep->dev; in usb_packet_set_state()
571 trace_usb_packet_state_change(bus->busnr, dev->port->path, p->ep->nr, p, in usb_packet_set_state()
572 usb_packet_state_name(p->state), in usb_packet_set_state()
573 usb_packet_state_name(state)); in usb_packet_set_state()
575 trace_usb_packet_state_change(-1, "", -1, p, in usb_packet_set_state()
576 usb_packet_state_name(p->state), in usb_packet_set_state()
577 usb_packet_state_name(state)); in usb_packet_set_state()
579 p->state = state; in usb_packet_set_state()
587 assert(p->iov.iov != NULL); in usb_packet_setup()
588 p->id = id; in usb_packet_setup()
589 p->pid = pid; in usb_packet_setup()
590 p->ep = ep; in usb_packet_setup()
591 p->stream = stream; in usb_packet_setup()
592 p->status = USB_RET_SUCCESS; in usb_packet_setup()
593 p->actual_length = 0; in usb_packet_setup()
594 p->parameter = 0; in usb_packet_setup()
595 p->short_not_ok = short_not_ok; in usb_packet_setup()
596 p->int_req = int_req; in usb_packet_setup()
597 p->combined = NULL; in usb_packet_setup()
598 qemu_iovec_reset(&p->iov); in usb_packet_setup()
604 qemu_iovec_add(&p->iov, ptr, len); in usb_packet_addbuf()
609 QEMUIOVector *iov = p->combined ? &p->combined->iov : &p->iov; in usb_packet_copy()
611 assert(p->actual_length >= 0); in usb_packet_copy()
612 assert(p->actual_length + bytes <= iov->size); in usb_packet_copy()
613 switch (p->pid) { in usb_packet_copy()
616 iov_to_buf(iov->iov, iov->niov, p->actual_length, ptr, bytes); in usb_packet_copy()
619 iov_from_buf(iov->iov, iov->niov, p->actual_length, ptr, bytes); in usb_packet_copy()
621 default: in usb_packet_copy()
622 fprintf(stderr, "%s: invalid pid: %x\n", __func__, p->pid); in usb_packet_copy()
625 p->actual_length += bytes; in usb_packet_copy()
630 QEMUIOVector *iov = p->combined ? &p->combined->iov : &p->iov; in usb_packet_skip()
632 assert(p->actual_length >= 0); in usb_packet_skip()
633 assert(p->actual_length + bytes <= iov->size); in usb_packet_skip()
634 if (p->pid == USB_TOKEN_IN) { in usb_packet_skip()
635 iov_memset(iov->iov, iov->niov, p->actual_length, 0, bytes); in usb_packet_skip()
637 p->actual_length += bytes; in usb_packet_skip()
642 return p->combined ? p->combined->iov.size : p->iov.size; in usb_packet_size()
648 qemu_iovec_destroy(&p->iov); in usb_packet_cleanup()
655 dev->ep_ctl.nr = 0; in usb_ep_reset()
656 dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL; in usb_ep_reset()
657 dev->ep_ctl.ifnum = 0; in usb_ep_reset()
658 dev->ep_ctl.max_packet_size = 64; in usb_ep_reset()
659 dev->ep_ctl.max_streams = 0; in usb_ep_reset()
660 dev->ep_ctl.dev = dev; in usb_ep_reset()
661 dev->ep_ctl.pipeline = false; in usb_ep_reset()
663 dev->ep_in[ep].nr = ep + 1; in usb_ep_reset()
664 dev->ep_out[ep].nr = ep + 1; in usb_ep_reset()
665 dev->ep_in[ep].pid = USB_TOKEN_IN; in usb_ep_reset()
666 dev->ep_out[ep].pid = USB_TOKEN_OUT; in usb_ep_reset()
667 dev->ep_in[ep].type = USB_ENDPOINT_XFER_INVALID; in usb_ep_reset()
668 dev->ep_out[ep].type = USB_ENDPOINT_XFER_INVALID; in usb_ep_reset()
669 dev->ep_in[ep].ifnum = USB_INTERFACE_INVALID; in usb_ep_reset()
670 dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID; in usb_ep_reset()
671 dev->ep_in[ep].max_packet_size = 0; in usb_ep_reset()
672 dev->ep_out[ep].max_packet_size = 0; in usb_ep_reset()
673 dev->ep_in[ep].max_streams = 0; in usb_ep_reset()
674 dev->ep_out[ep].max_streams = 0; in usb_ep_reset()
675 dev->ep_in[ep].dev = dev; in usb_ep_reset()
676 dev->ep_out[ep].dev = dev; in usb_ep_reset()
677 dev->ep_in[ep].pipeline = false; in usb_ep_reset()
678 dev->ep_out[ep].pipeline = false; in usb_ep_reset()
687 QTAILQ_INIT(&dev->ep_ctl.queue); in usb_ep_init()
689 QTAILQ_INIT(&dev->ep_in[ep].queue); in usb_ep_init()
690 QTAILQ_INIT(&dev->ep_out[ep].queue); in usb_ep_init()
705 dev->product_desc, dev->configuration); in usb_ep_dump()
709 if (dev->ep_in[ep].type != USB_ENDPOINT_XFER_INVALID && in usb_ep_dump()
710 dev->ep_in[ep].ifnum == ifnum) { in usb_ep_dump()
714 ifnum, dev->altsetting[ifnum]); in usb_ep_dump()
717 tname[dev->ep_in[ep].type], in usb_ep_dump()
718 dev->ep_in[ep].max_packet_size); in usb_ep_dump()
720 if (dev->ep_out[ep].type != USB_ENDPOINT_XFER_INVALID && in usb_ep_dump()
721 dev->ep_out[ep].ifnum == ifnum) { in usb_ep_dump()
725 ifnum, dev->altsetting[ifnum]); in usb_ep_dump()
728 tname[dev->ep_out[ep].type], in usb_ep_dump()
729 dev->ep_out[ep].max_packet_size); in usb_ep_dump()
733 fprintf(stderr, "--\n"); in usb_ep_dump()
742 return &dev->ep_ctl; in usb_ep_get()
746 eps = (pid == USB_TOKEN_IN) ? dev->ep_in : dev->ep_out; in usb_ep_get()
747 return eps + ep - 1; in usb_ep_get()
753 return uep->type; in usb_ep_get_type()
759 uep->type = type; in usb_ep_set_type()
765 uep->ifnum = ifnum; in usb_ep_set_ifnum()
782 default: in usb_ep_set_max_packet_size()
786 uep->max_packet_size = size * microframes; in usb_ep_set_max_packet_size()
796 uep->max_streams = 1 << MaxStreams; in usb_ep_set_max_streams()
798 uep->max_streams = 0; in usb_ep_set_max_streams()
805 uep->halted = halted; in usb_ep_set_halted()
814 QTAILQ_FOREACH(p, &uep->queue, queue) { in usb_ep_find_packet_by_id()
815 if (p->id == id) { in usb_ep_find_packet_by_id()