Lines Matching refs:dev

82     struct usb_device* dev;  member
146 static zx_status_t usb_dev_state_changed_locked(usb_device_t* dev);
148 static zx_status_t usb_device_alloc_string_desc(usb_device_t* dev, const char* string, in usb_device_alloc_string_desc() argument
151 mtx_lock(&dev->lock); in usb_device_alloc_string_desc()
154 for (i = 1; i < countof(dev->strings); i++) { in usb_device_alloc_string_desc()
155 if (!dev->strings[i]) { in usb_device_alloc_string_desc()
159 if (i == countof(dev->strings)) { in usb_device_alloc_string_desc()
160 mtx_unlock(&dev->lock); in usb_device_alloc_string_desc()
164 dev->strings[i] = strdup(string); in usb_device_alloc_string_desc()
165 if (!dev->strings[i]) { in usb_device_alloc_string_desc()
166 mtx_unlock(&dev->lock); in usb_device_alloc_string_desc()
170 mtx_unlock(&dev->lock); in usb_device_alloc_string_desc()
183 static zx_status_t usb_device_function_registered(usb_device_t* dev) { in usb_device_function_registered() argument
184 mtx_lock(&dev->lock); in usb_device_function_registered()
186 if (dev->config_desc) { in usb_device_function_registered()
188 mtx_unlock(&dev->lock); in usb_device_function_registered()
196 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_device_function_registered()
201 mtx_unlock(&dev->lock); in usb_device_function_registered()
209 mtx_unlock(&dev->lock); in usb_device_function_registered()
224 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_device_function_registered()
229 dev->config_desc = config_desc; in usb_device_function_registered()
232 dev->functions_registered = true; in usb_device_function_registered()
234 zx_status_t status = usb_dev_state_changed_locked(dev); in usb_device_function_registered()
235 mtx_unlock(&dev->lock); in usb_device_function_registered()
241 usb_device_t* dev = function->dev; in usb_func_set_interface() local
242 usb_function_t** endpoint_map = dev->endpoint_map; in usb_func_set_interface()
269 if (desc->bInterfaceNumber >= countof(dev->interface_map) || in usb_func_set_interface()
270 dev->interface_map[desc->bInterfaceNumber] != function) { in usb_func_set_interface()
281 if (index == 0 || index >= countof(dev->endpoint_map) || in usb_func_set_interface()
304 return usb_device_function_registered(function->dev); in usb_func_set_interface()
309 usb_device_t* dev = function->dev; in usb_func_alloc_interface() local
311 mtx_lock(&dev->lock); in usb_func_alloc_interface()
313 for (unsigned i = 0; i < countof(dev->interface_map); i++) { in usb_func_alloc_interface()
314 if (dev->interface_map[i] == NULL) { in usb_func_alloc_interface()
315 dev->interface_map[i] = function; in usb_func_alloc_interface()
316 mtx_unlock(&dev->lock); in usb_func_alloc_interface()
322 mtx_unlock(&dev->lock); in usb_func_alloc_interface()
340 usb_device_t* dev = function->dev; in usb_func_alloc_ep() local
341 usb_function_t** endpoint_map = dev->endpoint_map; in usb_func_alloc_ep()
343 mtx_lock(&dev->lock); in usb_func_alloc_ep()
347 mtx_unlock(&dev->lock); in usb_func_alloc_ep()
353 mtx_unlock(&dev->lock); in usb_func_alloc_ep()
360 return usb_dci_config_ep(&function->dev->usb_dci, ep_desc, ss_comp_desc); in usb_func_config_ep()
366 return usb_dci_disable_ep(&function->dev->usb_dci, ep_addr); in usb_func_disable_ep()
371 return usb_device_alloc_string_desc(function->dev, string, out_index); in usb_func_alloc_string_desc()
376 usb_dci_request_queue(&function->dev->usb_dci, req, cb); in usb_func_request_queue()
381 return usb_dci_ep_set_stall(&function->dev->usb_dci, ep_address); in usb_func_ep_set_stall()
386 return usb_dci_ep_clear_stall(&function->dev->usb_dci, ep_address); in usb_func_ep_clear_stall()
391 return function->dev->parent_request_size; in usb_func_get_request_size()
407 static zx_status_t usb_dev_get_descriptor(usb_device_t* dev, uint8_t request_type, in usb_dev_get_descriptor() argument
415 const usb_device_descriptor_t* desc = &dev->device_desc; in usb_dev_get_descriptor()
425 const usb_configuration_descriptor_t* desc = dev->config_desc; in usb_dev_get_descriptor()
448 char* string = dev->strings[string_index]; in usb_dev_get_descriptor()
475 static zx_status_t usb_dev_set_configuration(usb_device_t* dev, uint8_t configuration) { in usb_dev_set_configuration() argument
479 mtx_lock(&dev->lock); in usb_dev_set_configuration()
482 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_dev_set_configuration()
485 dev->speed); in usb_dev_set_configuration()
492 dev->configuration = configuration; in usb_dev_set_configuration()
495 mtx_unlock(&dev->lock); in usb_dev_set_configuration()
499 static zx_status_t usb_dev_set_interface(usb_device_t* dev, unsigned interface, in usb_dev_set_interface() argument
501 usb_function_t* function = dev->interface_map[interface]; in usb_dev_set_interface()
511 usb_device_t* dev = ctx; in usb_dev_control() local
536 return usb_dev_get_descriptor(dev, request_type, value, index, read_buffer, length, in usb_dev_control()
540 return usb_dev_set_configuration(dev, value); in usb_dev_control()
543 *((uint8_t *)read_buffer) = dev->configuration; in usb_dev_control()
551 return usb_dev_set_interface(dev, index, value); in usb_dev_control()
554 usb_function_t* function = dev->interface_map[index]; in usb_dev_control()
569 usb_function_t* function = dev->endpoint_map[index]; in usb_dev_control()
587 usb_device_t* dev = ctx; in usb_dev_set_connected() local
588 if (dev->connected != connected) { in usb_dev_set_connected()
591 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_dev_set_connected()
599 dev->connected = connected; in usb_dev_set_connected()
604 usb_device_t* dev = ctx; in usb_dev_set_speed() local
605 dev->speed = speed; in usb_dev_set_speed()
617 usb_device_t* dev = ctx; in usb_dev_set_device_desc() local
625 dev->device_desc.bLength = sizeof(usb_device_descriptor_t); in usb_dev_set_device_desc()
626 dev->device_desc.bDescriptorType = USB_DT_DEVICE; in usb_dev_set_device_desc()
627 dev->device_desc.bcdUSB = desc->bcdUSB; in usb_dev_set_device_desc()
628 dev->device_desc.bDeviceClass = desc->bDeviceClass; in usb_dev_set_device_desc()
629 dev->device_desc.bDeviceSubClass = desc->bDeviceSubClass; in usb_dev_set_device_desc()
630 dev->device_desc.bDeviceProtocol = desc->bDeviceProtocol; in usb_dev_set_device_desc()
631 dev->device_desc.bMaxPacketSize0 = desc->bMaxPacketSize0; in usb_dev_set_device_desc()
632 dev->device_desc.idVendor = desc->idVendor; in usb_dev_set_device_desc()
633 dev->device_desc.idProduct = desc->idProduct; in usb_dev_set_device_desc()
634 dev->device_desc.bcdDevice = desc->bcdDevice; in usb_dev_set_device_desc()
635 dev->device_desc.iManufacturer = desc->iManufacturer; in usb_dev_set_device_desc()
636 dev->device_desc.iProduct = desc->iProduct; in usb_dev_set_device_desc()
637 dev->device_desc.iSerialNumber = desc->iSerialNumber; in usb_dev_set_device_desc()
638 dev->device_desc.bNumConfigurations = desc->bNumConfigurations; in usb_dev_set_device_desc()
647 usb_device_t* dev = ctx; in usb_dev_alloc_string_desc() local
650 zx_status_t status = usb_device_alloc_string_desc(dev, name_data, &index); in usb_dev_alloc_string_desc()
654 static zx_status_t usb_dev_do_add_function(usb_device_t* dev, in usb_dev_do_add_function() argument
656 if (dev->functions_bound) { in usb_dev_do_add_function()
664 function->dci_dev = dev->dci_dev; in usb_dev_do_add_function()
665 function->dev = dev; in usb_dev_do_add_function()
667 list_add_tail(&dev->functions, &function->node); in usb_dev_do_add_function()
674 usb_device_t* dev = ctx; in usb_dev_add_function() local
676 zx_status_t status = usb_dev_do_add_function(dev, desc); in usb_dev_add_function()
680 static void usb_dev_remove_function_devices_locked(usb_device_t* dev) { in usb_dev_remove_function_devices_locked() argument
684 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_dev_remove_function_devices_locked()
693 free(dev->config_desc); in usb_dev_remove_function_devices_locked()
694 dev->config_desc = NULL; in usb_dev_remove_function_devices_locked()
695 dev->functions_registered = false; in usb_dev_remove_function_devices_locked()
696 dev->function_devs_added = false; in usb_dev_remove_function_devices_locked()
699 static zx_status_t usb_dev_add_function_devices_locked(usb_device_t* dev) { in usb_dev_add_function_devices_locked() argument
701 if (dev->function_devs_added) { in usb_dev_add_function_devices_locked()
705 usb_device_descriptor_t* device_desc = &dev->device_desc; in usb_dev_add_function_devices_locked()
708 list_for_every_entry(&dev->functions, function, usb_function_t, node) { in usb_dev_add_function_devices_locked()
734 zx_status_t status = device_add(dev->zxdev, &args, &function->zxdev); in usb_dev_add_function_devices_locked()
743 dev->function_devs_added = true; in usb_dev_add_function_devices_locked()
747 static zx_status_t usb_dev_state_changed_locked(usb_device_t* dev) { in usb_dev_state_changed_locked() argument
748 zxlogf(TRACE, "usb_dev_state_changed_locked usb_mode: %d dci_usb_mode: %d\n", dev->usb_mode, in usb_dev_state_changed_locked()
749 dev->dci_usb_mode); in usb_dev_state_changed_locked()
751 usb_mode_t new_dci_usb_mode = dev->dci_usb_mode; in usb_dev_state_changed_locked()
752 bool add_function_devs = (dev->usb_mode == USB_MODE_PERIPHERAL && dev->functions_bound); in usb_dev_state_changed_locked()
755 if (dev->usb_mode == USB_MODE_PERIPHERAL) { in usb_dev_state_changed_locked()
756 if (dev->functions_registered) { in usb_dev_state_changed_locked()
763 new_dci_usb_mode = dev->usb_mode; in usb_dev_state_changed_locked()
768 if (!dev->function_devs_added) { in usb_dev_state_changed_locked()
769 status = usb_dev_add_function_devices_locked(dev); in usb_dev_state_changed_locked()
776 if (dev->dci_usb_mode != new_dci_usb_mode) { in usb_dev_state_changed_locked()
778 if (dev->has_usb_mode_switch) { in usb_dev_state_changed_locked()
779 status = usb_mode_switch_set_mode(&dev->usb_mode_switch, new_dci_usb_mode); in usb_dev_state_changed_locked()
781 usb_mode_switch_set_mode(&dev->usb_mode_switch, USB_MODE_NONE); in usb_dev_state_changed_locked()
785 dev->dci_usb_mode = new_dci_usb_mode; in usb_dev_state_changed_locked()
788 if (!add_function_devs && dev->function_devs_added) { in usb_dev_state_changed_locked()
789 usb_dev_remove_function_devices_locked(dev); in usb_dev_state_changed_locked()
795 static zx_status_t usb_dev_do_bind_functions(usb_device_t* dev) { in usb_dev_do_bind_functions() argument
796 mtx_lock(&dev->lock); in usb_dev_do_bind_functions()
798 if (dev->functions_bound) { in usb_dev_do_bind_functions()
800 mtx_unlock(&dev->lock); in usb_dev_do_bind_functions()
804 usb_device_descriptor_t* device_desc = &dev->device_desc; in usb_dev_do_bind_functions()
807 mtx_unlock(&dev->lock); in usb_dev_do_bind_functions()
810 if (list_is_empty(&dev->functions)) { in usb_dev_do_bind_functions()
812 mtx_unlock(&dev->lock); in usb_dev_do_bind_functions()
817 dev->functions_bound = true; in usb_dev_do_bind_functions()
818 zx_status_t status = usb_dev_state_changed_locked(dev); in usb_dev_do_bind_functions()
819 mtx_unlock(&dev->lock); in usb_dev_do_bind_functions()
825 usb_device_t* dev = ctx; in usb_dev_bind_functions() local
827 zx_status_t status = usb_dev_do_bind_functions(dev); in usb_dev_bind_functions()
832 static zx_status_t usb_dev_do_clear_functions(usb_device_t* dev) { in usb_dev_do_clear_functions() argument
833 mtx_lock(&dev->lock); in usb_dev_do_clear_functions()
836 while ((function = list_remove_head_type(&dev->functions, usb_function_t, node)) != NULL) { in usb_dev_do_clear_functions()
844 free(dev->config_desc); in usb_dev_do_clear_functions()
845 dev->config_desc = NULL; in usb_dev_do_clear_functions()
846 dev->functions_bound = false; in usb_dev_do_clear_functions()
847 dev->functions_registered = false; in usb_dev_do_clear_functions()
849 memset(dev->interface_map, 0, sizeof(dev->interface_map)); in usb_dev_do_clear_functions()
850 memset(dev->endpoint_map, 0, sizeof(dev->endpoint_map)); in usb_dev_do_clear_functions()
851 for (unsigned i = 0; i < countof(dev->strings); i++) { in usb_dev_do_clear_functions()
852 free(dev->strings[i]); in usb_dev_do_clear_functions()
853 dev->strings[i] = NULL; in usb_dev_do_clear_functions()
856 zx_status_t status = usb_dev_state_changed_locked(dev); in usb_dev_do_clear_functions()
857 mtx_unlock(&dev->lock); in usb_dev_do_clear_functions()
863 usb_device_t* dev = ctx; in usb_dev_clear_functions() local
867 zx_status_t status = usb_dev_do_clear_functions(dev); in usb_dev_clear_functions()
872 usb_device_t* dev = ctx; in usb_dev_get_mode() local
874 mtx_lock(&dev->lock); in usb_dev_get_mode()
875 uint32_t mode = dev->usb_mode; in usb_dev_get_mode()
876 mtx_unlock(&dev->lock); in usb_dev_get_mode()
882 usb_device_t* dev = ctx; in usb_dev_set_mode() local
884 mtx_lock(&dev->lock); in usb_dev_set_mode()
885 dev->usb_mode = mode; in usb_dev_set_mode()
886 zx_status_t status = usb_dev_state_changed_locked(dev); in usb_dev_set_mode()
887 mtx_unlock(&dev->lock); in usb_dev_set_mode()
908 usb_device_t* dev = ctx; in usb_dev_unbind() local
909 usb_dev_do_clear_functions(dev); in usb_dev_unbind()
910 device_remove(dev->zxdev); in usb_dev_unbind()
915 usb_device_t* dev = ctx; in usb_dev_release() local
916 free(dev->config_desc); in usb_dev_release()
917 for (unsigned i = 0; i < countof(dev->strings); i++) { in usb_dev_release()
918 free(dev->strings[i]); in usb_dev_release()
920 free(dev); in usb_dev_release()
931 static zx_status_t usb_dev_set_default_config(usb_device_t* dev) { in usb_dev_set_default_config() argument
949 status = usb_device_alloc_string_desc(dev, USB_DEVICE_MANUFACTURER, &device_desc.iManufacturer); in usb_dev_set_default_config()
953 usb_device_alloc_string_desc(dev, USB_DEVICE_PRODUCT, &device_desc.iProduct); in usb_dev_set_default_config()
957 usb_device_alloc_string_desc(dev, USB_DEVICE_SERIAL, &device_desc.iSerialNumber); in usb_dev_set_default_config()
961 memcpy(&dev->device_desc, &device_desc, sizeof(dev->device_desc)); in usb_dev_set_default_config()
981 status = usb_dev_do_add_function(dev, &function_desc); in usb_dev_set_default_config()
984 return usb_dev_do_bind_functions(dev); in usb_dev_set_default_config()
991 usb_device_t* dev = calloc(1, sizeof(usb_device_t)); in usb_dev_bind() local
992 if (!dev) { in usb_dev_bind()
995 list_initialize(&dev->functions); in usb_dev_bind()
996 mtx_init(&dev->lock, mtx_plain); in usb_dev_bind()
997 dev->dci_dev = parent; in usb_dev_bind()
999 if (device_get_protocol(parent, ZX_PROTOCOL_USB_DCI, &dev->usb_dci)) { in usb_dev_bind()
1000 free(dev); in usb_dev_bind()
1004 if (device_get_protocol(parent, ZX_PROTOCOL_USB_MODE_SWITCH, &dev->usb_mode_switch) == ZX_OK) { in usb_dev_bind()
1005 dev->has_usb_mode_switch = true; in usb_dev_bind()
1013 &dev->usb_mode, sizeof(dev->usb_mode), &actual); in usb_dev_bind()
1016 dev->usb_mode = USB_MODE_PERIPHERAL; in usb_dev_bind()
1017 } else if (status != ZX_OK || actual != sizeof(dev->usb_mode)) { in usb_dev_bind()
1019 free(dev); in usb_dev_bind()
1023 if (dev->has_usb_mode_switch) { in usb_dev_bind()
1024 usb_mode_switch_set_mode(&dev->usb_mode_switch, USB_MODE_NONE); in usb_dev_bind()
1026 dev->dci_usb_mode = USB_MODE_NONE; in usb_dev_bind()
1027 dev->parent_request_size = usb_dci_get_request_size(&dev->usb_dci); in usb_dev_bind()
1032 .ctx = dev, in usb_dev_bind()
1038 status = device_add(parent, &args, &dev->zxdev); in usb_dev_bind()
1041 free(dev); in usb_dev_bind()
1047 .ctx = dev, in usb_dev_bind()
1049 usb_dci_set_interface(&dev->usb_dci, &intf); in usb_dev_bind()
1053 usb_dev_set_default_config(dev); in usb_dev_bind()