Changes in uspace/drv/bus/usb/usbmid/explore.c [56fd7cf:87a3df7f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/explore.c
r56fd7cf r87a3df7f 34 34 * Exploration of available interfaces in the USB device. 35 35 */ 36 #include <ddf/driver.h> 36 37 #include <errno.h> 37 38 #include <str_error.h> … … 56 57 static bool interface_in_list(const list_t *list, int interface_no) 57 58 { 58 list_foreach(*list, l) { 59 usbmid_interface_t *iface = usbmid_interface_from_link(l); 59 list_foreach(*list, link, usbmid_interface_t, iface) { 60 60 if (iface->interface_no == interface_no) { 61 61 return true; … … 71 71 * @param config_descriptor_size Size of configuration descriptor in bytes. 72 72 * @param list List where to add the interfaces. 73 */ 74 static void create_interfaces(const uint8_t *config_descriptor, 75 size_t config_descriptor_size, list_t *list) 73 * @return EOK on success, ENOMEM if out of memory. 74 */ 75 static int create_interfaces(usb_mid_t *mid, const uint8_t *config_descriptor, 76 size_t config_descriptor_size) 76 77 { 77 78 const usb_dp_parser_data_t data = { … … 102 103 103 104 /* Skip alternate interfaces. */ 104 if (interface_in_list(list, interface->interface_number)) { 105 if (interface_in_list(&mid->interface_list, 106 interface->interface_number)) { 105 107 /* TODO: add the alternatives and create match ids 106 108 * for them. */ 107 109 continue; 108 110 } 109 usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t)); 110 if (iface == NULL) { 111 //TODO: Do something about that failure. 112 break; 113 } 111 112 /* Create the function */ 113 ddf_fun_t *fun = ddf_fun_create(mid->dev, fun_inner, NULL); 114 if (fun == NULL) 115 goto error; 116 117 usbmid_interface_t *iface = ddf_fun_data_alloc(fun, 118 sizeof(usbmid_interface_t)); 119 if (iface == NULL) 120 goto error; 114 121 115 122 link_initialize(&iface->link); 116 iface->fun = NULL;123 iface->fun = fun; 117 124 iface->interface_no = interface->interface_number; 118 125 iface->interface = interface; 119 126 120 list_append(&iface->link, list); 121 } 127 list_append(&iface->link, &mid->interface_list); 128 } 129 130 return EOK; 131 error: 132 while (!list_empty(&mid->interface_list)) { 133 link_t *link = list_first(&mid->interface_list); 134 usbmid_interface_t *iface = list_get_instance(link, 135 usbmid_interface_t, link); 136 137 ddf_fun_destroy(iface->fun); 138 } 139 140 return ENOMEM; 122 141 } 123 142 … … 166 185 } 167 186 187 usb_mid->dev = dev->ddf_dev; 188 168 189 /* Create control function. */ 169 190 usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl"); … … 183 204 } 184 205 185 186 206 /* Create interface children. */ 187 207 list_initialize(&usb_mid->interface_list); 188 create_interfaces(config_descriptor_raw, config_descriptor_size, 189 &usb_mid->interface_list); 208 create_interfaces(usb_mid, config_descriptor_raw, config_descriptor_size); 190 209 191 210 /* 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 211 list_foreach(usb_mid->interface_list, link, usbmid_interface_t, iface) { 195 212 usb_log_info("Creating child for interface %d (%s).\n", 196 213 iface->interface_no,
Note:
See TracChangeset
for help on using the changeset viewer.