Changes in uspace/drv/bus/usb/usbmid/explore.c [4ca778b:feeac0d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/explore.c
r4ca778b rfeeac0d 40 40 #include <usb/dev/request.h> 41 41 #include <usb/dev/dp.h> 42 #include <usb/ddfiface.h> 42 43 #include "usbmid.h" 44 45 /** Operations of the device itself. */ 46 static ddf_dev_ops_t mid_device_ops = { 47 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl 48 }; 43 49 44 50 /** Tell whether given interface is already in the list. … … 50 56 static bool interface_in_list(const list_t *list, int interface_no) 51 57 { 52 list_foreach(*list, l) { 53 const usbmid_interface_t *iface = usbmid_interface_from_link(l); 58 list_foreach(*list, link, usbmid_interface_t, iface) { 54 59 if (iface->interface_no == interface_no) { 55 60 return true; … … 66 71 * @param list List where to add the interfaces. 67 72 */ 68 static intcreate_interfaces(const uint8_t *config_descriptor,69 size_t config_descriptor_size, list_t *list , usb_device_t *usb_dev)73 static void create_interfaces(const uint8_t *config_descriptor, 74 size_t config_descriptor_size, list_t *list) 70 75 { 71 assert(config_descriptor);72 assert(usb_dev);73 74 76 const usb_dp_parser_data_t data = { 75 77 .data = config_descriptor, … … 87 89 /* Walk all descriptors nested in the current configuration decriptor; 88 90 * i.e. all interface descriptors. */ 89 for (; 91 for (;interface_ptr != NULL; 90 92 interface_ptr = usb_dp_get_sibling_descriptor( 91 93 &parser, &data, config_descriptor, interface_ptr)) … … 104 106 continue; 105 107 } 106 107 108 usb_log_info("Creating child for interface %d (%s).\n", 109 interface->interface_number, 110 usb_str_class(interface->interface_class)); 111 112 usbmid_interface_t *iface = NULL; 113 const int rc = usbmid_spawn_interface_child(usb_dev, &iface, 114 &usb_device_descriptors(usb_dev)->device, interface); 115 if (rc != EOK) { 108 usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t)); 109 if (iface == NULL) { 116 110 //TODO: Do something about that failure. 117 usb_log_error("Failed to create interface child for " 118 "%d (%s): %s.\n", interface->interface_number, 119 usb_str_class(interface->interface_class), 120 str_error(rc)); 121 } else { 122 list_append(&iface->link, list); 123 } 124 } 125 return EOK; 111 break; 112 } 113 114 link_initialize(&iface->link); 115 iface->fun = NULL; 116 iface->interface_no = interface->interface_number; 117 iface->interface = interface; 118 119 list_append(&iface->link, list); 120 } 126 121 } 127 122 … … 134 129 * @return Whether to accept this device from devman. 135 130 */ 136 intusbmid_explore_device(usb_device_t *dev)131 bool usbmid_explore_device(usb_device_t *dev) 137 132 { 138 assert(dev);139 const unsigned dev_class = 140 usb_device_descriptors(dev)->device.device_class;133 int rc; 134 135 unsigned dev_class = dev->descriptors.device.device_class; 141 136 if (dev_class != USB_CLASS_USE_INTERFACE) { 142 137 usb_log_warning( … … 144 139 dev_class, usb_str_class(dev_class), 145 140 USB_CLASS_USE_INTERFACE); 146 usb_log_error("Not a multi-interface device, refusing.\n"); 147 return ENOTSUP; 148 } 149 150 /* Get coonfiguration descriptor. */ 151 const size_t config_descriptor_size = 152 usb_device_descriptors(dev)->full_config_size; 153 const void *config_descriptor_raw = 154 usb_device_descriptors(dev)->full_config; 141 usb_log_error("Not multi interface device, refusing.\n"); 142 return false; 143 } 144 145 /* Shortcuts to save on typing ;-). */ 146 const void *config_descriptor_raw = dev->descriptors.configuration; 147 size_t config_descriptor_size = dev->descriptors.configuration_size; 155 148 const usb_standard_configuration_descriptor_t *config_descriptor = 156 149 config_descriptor_raw; 157 150 158 151 /* Select the first configuration */ 159 int rc = usb_request_set_configuration(usb_device_get_default_pipe(dev),152 rc = usb_request_set_configuration(&dev->ctrl_pipe, 160 153 config_descriptor->configuration_number); 161 154 if (rc != EOK) { 162 155 usb_log_error("Failed to set device configuration: %s.\n", 163 156 str_error(rc)); 164 return rc;165 } 166 157 return false; 158 } 159 167 160 /* Create driver soft-state. */ 168 161 usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t)); 169 162 if (!usb_mid) { 170 163 usb_log_error("Failed to create USB MID structure.\n"); 171 return ENOMEM;164 return false; 172 165 } 173 166 174 167 /* Create control function. */ 175 usb_mid->ctl_fun = usb_device_ddf_fun_create(dev, fun_exposed, "ctl");168 usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl"); 176 169 if (usb_mid->ctl_fun == NULL) { 177 170 usb_log_error("Failed to create control function.\n"); 178 return ENOMEM; 179 } 171 return false; 172 } 173 ddf_fun_set_ops(usb_mid->ctl_fun, &mid_device_ops); 180 174 181 175 /* Bind control function. */ … … 185 179 str_error(rc)); 186 180 ddf_fun_destroy(usb_mid->ctl_fun); 187 return rc; 188 } 181 return false; 182 } 183 189 184 190 185 /* Create interface children. */ 191 186 list_initialize(&usb_mid->interface_list); 192 187 create_interfaces(config_descriptor_raw, config_descriptor_size, 193 &usb_mid->interface_list, dev); 194 195 return EOK; 188 &usb_mid->interface_list); 189 190 /* Start child function for every interface. */ 191 list_foreach(usb_mid->interface_list, link, usbmid_interface_t, iface) { 192 usb_log_info("Creating child for interface %d (%s).\n", 193 iface->interface_no, 194 usb_str_class(iface->interface->interface_class)); 195 196 rc = usbmid_spawn_interface_child(dev, iface, 197 &dev->descriptors.device, iface->interface); 198 if (rc != EOK) { 199 usb_log_error("Failed to create interface child: %s.\n", 200 str_error(rc)); 201 } 202 } 203 204 return true; 196 205 } 197 206
Note:
See TracChangeset
for help on using the changeset viewer.