Changes in uspace/drv/bus/usb/usbmid/usbmid.c [5153b58:5203e256] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/usbmid.c
r5153b58 r5203e256 45 45 46 46 /** Callback for DDF USB interface. */ 47 static int usb_iface_get_address_impl(ddf_fun_t *fun, devman_handle_t handle, 48 usb_address_t *address) 49 { 50 return usb_iface_get_address_hub_impl(fun, handle, address); 51 } 52 53 /** Callback for DDF USB interface. */ 47 54 static int usb_iface_get_interface_impl(ddf_fun_t *fun, devman_handle_t handle, 48 55 int *iface_no) … … 62 69 /** DDF interface of the child - interface function. */ 63 70 static usb_iface_t child_usb_iface = { 64 .get_hc_handle = usb_iface_get_hc_handle_ device_impl,65 .get_ my_address = usb_iface_get_my_address_forward_impl,66 .get_interface = usb_iface_get_interface_impl ,71 .get_hc_handle = usb_iface_get_hc_handle_hub_child_impl, 72 .get_address = usb_iface_get_address_impl, 73 .get_interface = usb_iface_get_interface_impl 67 74 }; 68 75 … … 72 79 }; 73 80 74 int usbmid_interface_destroy(usbmid_interface_t *mid_iface)75 {76 assert(mid_iface);77 assert_link_not_used(&mid_iface->link);78 const int ret = ddf_fun_unbind(mid_iface->fun);79 if (ret != EOK) {80 return ret;81 }82 /* NOTE: usbmid->interface points somewhere, but we did not83 * allocate that space, so don't touch */84 ddf_fun_destroy(mid_iface->fun);85 /* NOTE: mid_iface is invalid at this point, it was assigned to86 * mid_iface->fun->driver_data and freed in ddf_fun_destroy */87 return EOK;88 }89 81 90 82 /** Spawn new child device from one interface. … … 110 102 * class name something humanly understandable. 111 103 */ 112 rc = asprintf(&child_name, "%s% hhu",104 rc = asprintf(&child_name, "%s%d", 113 105 usb_str_class(interface_descriptor->interface_class), 114 interface_descriptor->interface_number);106 (int) interface_descriptor->interface_number); 115 107 if (rc < 0) { 116 return ENOMEM;108 goto error_leave; 117 109 } 118 110 119 111 /* Create the device. */ 120 112 child = ddf_fun_create(parent->ddf_dev, fun_inner, child_name); 121 free(child_name);122 113 if (child == NULL) { 123 return ENOMEM; 114 rc = ENOMEM; 115 goto error_leave; 124 116 } 125 117 118 iface->fun = child; 119 120 child->driver_data = iface; 121 child->ops = &child_device_ops; 122 126 123 rc = usb_device_create_match_ids_from_interface(device_descriptor, 127 interface_descriptor, &child->match_ids); 124 interface_descriptor, 125 &child->match_ids); 128 126 if (rc != EOK) { 129 ddf_fun_destroy(child); 130 return rc; 127 goto error_leave; 131 128 } 132 129 133 130 rc = ddf_fun_bind(child); 134 131 if (rc != EOK) { 132 goto error_leave; 133 } 134 135 return EOK; 136 137 error_leave: 138 if (child != NULL) { 139 child->name = NULL; 135 140 /* This takes care of match_id deallocation as well. */ 136 141 ddf_fun_destroy(child); 137 return rc; 142 } 143 if (child_name != NULL) { 144 free(child_name); 138 145 } 139 146 140 iface->fun = child; 141 child->driver_data = iface; 142 child->ops = &child_device_ops; 143 144 return EOK; 147 return rc; 145 148 } 146 149
Note:
See TracChangeset
for help on using the changeset viewer.