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