Changes in uspace/lib/usb/src/dev.c [b49d872:5debe97] in mainline
- File:
-
- 1 edited
-
uspace/lib/usb/src/dev.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/dev.c
rb49d872 r5debe97 37 37 #define MAX_DEVICE_PATH 1024 38 38 39 /** Find host controller handle, address and iface number for the device.40 *41 * @param[in] device_handle Device devman handle.42 * @param[out] hc_handle Where to store handle of host controller43 * controlling device with @p device_handle handle.44 * @param[out] address Place to store the device's address45 * @param[out] iface Place to stoer the assigned USB interface number.46 * @return Error code.47 */48 int usb_get_info_by_handle(devman_handle_t device_handle,49 devman_handle_t *hc_handle, usb_address_t *address, int *iface)50 {51 async_sess_t *parent_sess =52 devman_parent_device_connect(EXCHANGE_ATOMIC, device_handle,53 IPC_FLAG_BLOCKING);54 if (!parent_sess)55 return ENOMEM;56 57 async_exch_t *exch = async_exchange_begin(parent_sess);58 if (!exch) {59 async_hangup(parent_sess);60 return ENOMEM;61 }62 63 usb_address_t tmp_address;64 devman_handle_t tmp_handle;65 int tmp_iface;66 67 if (address) {68 const int ret = usb_get_my_address(exch, &tmp_address);69 if (ret != EOK) {70 async_exchange_end(exch);71 async_hangup(parent_sess);72 return ret;73 }74 }75 76 if (hc_handle) {77 const int ret = usb_get_hc_handle(exch, &tmp_handle);78 if (ret != EOK) {79 async_exchange_end(exch);80 async_hangup(parent_sess);81 return ret;82 }83 }84 85 if (iface) {86 const int ret = usb_get_my_interface(exch, &tmp_iface);87 switch (ret) {88 case ENOTSUP:89 /* Implementing GET_MY_INTERFACE is voluntary. */90 tmp_iface = -1;91 case EOK:92 break;93 default:94 async_exchange_end(exch);95 async_hangup(parent_sess);96 return ret;97 }98 }99 100 if (hc_handle)101 *hc_handle = tmp_handle;102 103 if (address)104 *address = tmp_address;105 106 if (iface)107 *iface = tmp_iface;108 109 async_exchange_end(exch);110 async_hangup(parent_sess);111 112 return EOK;113 }114 115 39 static bool try_parse_bus_and_address(const char *path, 116 c onst char **func_start,40 char **func_start, 117 41 devman_handle_t *out_hc_handle, usb_address_t *out_device_address) 118 42 { … … 120 44 size_t address; 121 45 int rc; 122 c onst char *ptr;46 char *ptr; 123 47 124 48 rc = str_uint64_t(path, &ptr, 10, false, &sid); … … 175 99 * @return Error code. 176 100 */ 177 int usb_resolve_device_handle(const char *dev_path, devman_handle_t *out_hc_handle, 178 usb_address_t *out_dev_addr, devman_handle_t *out_dev_handle) 101 int usb_resolve_device_handle(const char *dev_path, devman_handle_t *dev_handle) 179 102 { 180 if (dev_path == NULL ) {103 if (dev_path == NULL || dev_handle == NULL) { 181 104 return EBADMEM; 182 105 } 183 106 184 bool found_hc = false; 185 bool found_addr = false; 186 devman_handle_t hc_handle, dev_handle; 187 usb_address_t dev_addr = -1; 107 devman_handle_t hc; 108 usb_address_t addr = -1; 188 109 int rc; 189 bool is_bus_addr; 190 const char *func_start = NULL; 110 char *func_start = NULL; 191 111 char *path = NULL; 192 112 193 113 /* First try the BUS.ADDR format. */ 194 is_bus_addr = try_parse_bus_and_address(dev_path, &func_start, 195 &hc_handle, &dev_addr); 196 if (is_bus_addr) { 197 found_hc = true; 198 found_addr = true; 114 if (try_parse_bus_and_address(dev_path, &func_start, &hc, &addr)) { 199 115 /* 200 116 * Now get the handle of the device. We will need that … … 208 124 * Otherwise, we will 209 125 */ 210 rc = get_device_handle_by_address(hc_handle, dev_addr, 211 &dev_handle);126 127 rc = get_device_handle_by_address(hc, addr, dev_handle); 212 128 if (rc != EOK) { 213 129 return rc; … … 215 131 if (str_length(func_start) > 0) { 216 132 char tmp_path[MAX_DEVICE_PATH]; 217 rc = devman_fun_get_path( dev_handle,133 rc = devman_fun_get_path(*dev_handle, 218 134 tmp_path, MAX_DEVICE_PATH); 219 135 if (rc != EOK) { … … 226 142 } else { 227 143 /* Everything is resolved. Get out of here. */ 228 goto copy_out;144 return EOK; 229 145 } 230 146 } else { … … 236 152 237 153 /* First try to get the device handle. */ 238 rc = devman_fun_get_handle(path, &dev_handle, 0);154 rc = devman_fun_get_handle(path, dev_handle, 0); 239 155 if (rc != EOK) { 240 156 free(path); … … 253 169 } 254 170 255 /* Try to find its host controller. */256 if (!found_hc) {257 rc = usb_get_hc_by_handle(tmp_handle, &hc_handle);258 if (rc == EOK) {259 found_hc = true;260 }261 }262 263 /* Try to get its address. */264 if (!found_addr) {265 rc = usb_get_address_by_handle(tmp_handle, &dev_addr);266 if (rc == 0) {267 found_addr = true;268 }269 }270 271 /* Speed-up. */272 if (found_hc && found_addr) {273 break;274 }275 276 171 /* Remove the last suffix. */ 277 172 char *slash_pos = str_rchr(path, '/'); … … 283 178 free(path); 284 179 285 if (!found_addr || !found_hc) {286 return ENOENT;287 }288 289 copy_out:290 if (out_dev_addr != NULL) {291 *out_dev_addr = dev_addr;292 }293 if (out_hc_handle != NULL) {294 *out_hc_handle = hc_handle;295 }296 if (out_dev_handle != NULL) {297 *out_dev_handle = dev_handle;298 }299 180 300 181 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.
