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