Changes in uspace/lib/libc/generic/devmap.c [1313ee9:7fcb74c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/devmap.c
r1313ee9 r7fcb74c 35 35 #include <async.h> 36 36 #include <errno.h> 37 #include <malloc.h>38 #include <bool.h>39 37 40 38 static int devmap_phone_driver = -1; … … 107 105 aid_t req = async_send_2(phone, DEVMAP_DRIVER_REGISTER, 0, 0, &answer); 108 106 109 ipcarg_t retval = async_data_write_start(phone, name, str_size(name)); 107 ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1); 108 110 109 if (retval != EOK) { 111 110 async_wait_for(req, NULL); … … 127 126 /** Register new device. 128 127 * 129 * @param namespace Namespace name. 130 * @param fqdn Fully qualified device name. 131 * @param handle Output: Handle to the created instance of device. 128 * @param name Device name. 129 * @param handle Output: Handle to the created instance of device. 132 130 * 133 131 */ 134 int devmap_device_register(const char * fqdn, dev_handle_t *handle)132 int devmap_device_register(const char *name, dev_handle_t *handle) 135 133 { 136 134 int phone = devmap_get_phone(DEVMAP_DRIVER, IPC_FLAG_BLOCKING); … … 145 143 &answer); 146 144 147 ipcarg_t retval = async_data_write_start(phone, fqdn, str_size(fqdn)); 145 ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1); 146 148 147 if (retval != EOK) { 149 148 async_wait_for(req, NULL); … … 168 167 } 169 168 170 int devmap_device_get_handle(const char * fqdn, dev_handle_t *handle, unsigned int flags)169 int devmap_device_get_handle(const char *name, dev_handle_t *handle, unsigned int flags) 171 170 { 172 171 int phone = devmap_get_phone(DEVMAP_CLIENT, flags); … … 181 180 &answer); 182 181 183 ipcarg_t retval = async_data_write_start(phone, fqdn, str_size(fqdn)); 182 ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1); 183 184 184 if (retval != EOK) { 185 185 async_wait_for(req, NULL); … … 202 202 203 203 return retval; 204 }205 206 int devmap_namespace_get_handle(const char *name, dev_handle_t *handle, unsigned int flags)207 {208 int phone = devmap_get_phone(DEVMAP_CLIENT, flags);209 210 if (phone < 0)211 return phone;212 213 async_serialize_start();214 215 ipc_call_t answer;216 aid_t req = async_send_2(phone, DEVMAP_NAMESPACE_GET_HANDLE, flags, 0,217 &answer);218 219 ipcarg_t retval = async_data_write_start(phone, name, str_size(name));220 if (retval != EOK) {221 async_wait_for(req, NULL);222 async_serialize_end();223 return retval;224 }225 226 async_wait_for(req, &retval);227 228 async_serialize_end();229 230 if (retval != EOK) {231 if (handle != NULL)232 *handle = (dev_handle_t) -1;233 return retval;234 }235 236 if (handle != NULL)237 *handle = (dev_handle_t) IPC_GET_ARG1(answer);238 239 return retval;240 }241 242 devmap_handle_type_t devmap_handle_probe(dev_handle_t handle)243 {244 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);245 246 if (phone < 0)247 return phone;248 249 ipcarg_t type;250 int retval = async_req_1_1(phone, DEVMAP_HANDLE_PROBE, handle, &type);251 if (retval != EOK)252 return DEV_HANDLE_NONE;253 254 return (devmap_handle_type_t) type;255 204 } 256 205 … … 278 227 279 228 ipcarg_t null_id; 280 int retval = async_req_0_1(phone, DEVMAP_ NULL_CREATE, &null_id);229 int retval = async_req_0_1(phone, DEVMAP_DEVICE_NULL_CREATE, &null_id); 281 230 if (retval != EOK) 282 231 return -1; … … 292 241 return; 293 242 294 async_req_1_0(phone, DEVMAP_NULL_DESTROY, (ipcarg_t) null_id); 295 } 296 297 static size_t devmap_count_namespaces_internal(int phone) 298 { 243 async_req_1_0(phone, DEVMAP_DEVICE_NULL_DESTROY, (ipcarg_t) null_id); 244 } 245 246 ipcarg_t devmap_device_get_count(void) 247 { 248 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 249 250 if (phone < 0) 251 return 0; 252 299 253 ipcarg_t count; 300 int retval = async_req_0_1(phone, DEVMAP_ GET_NAMESPACE_COUNT, &count);254 int retval = async_req_0_1(phone, DEVMAP_DEVICE_GET_COUNT, &count); 301 255 if (retval != EOK) 302 256 return 0; … … 305 259 } 306 260 307 static size_t devmap_count_devices_internal(int phone, dev_handle_t ns_handle) 308 { 309 ipcarg_t count; 310 int retval = async_req_1_1(phone, DEVMAP_GET_DEVICE_COUNT, ns_handle, &count); 261 ipcarg_t devmap_device_get_devices(ipcarg_t count, dev_desc_t *data) 262 { 263 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 264 265 if (phone < 0) 266 return 0; 267 268 async_serialize_start(); 269 270 ipc_call_t answer; 271 aid_t req = async_send_0(phone, DEVMAP_DEVICE_GET_DEVICES, &answer); 272 273 ipcarg_t retval = ipc_data_read_start(phone, data, count * sizeof(dev_desc_t)); 274 275 if (retval != EOK) { 276 async_wait_for(req, NULL); 277 async_serialize_end(); 278 return 0; 279 } 280 281 async_wait_for(req, &retval); 282 283 async_serialize_end(); 284 311 285 if (retval != EOK) 312 286 return 0; 313 287 314 return count; 315 } 316 317 size_t devmap_count_namespaces(void) 318 { 319 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 320 321 if (phone < 0) 322 return 0; 323 324 return devmap_count_namespaces_internal(phone); 325 } 326 327 size_t devmap_count_devices(dev_handle_t ns_handle) 328 { 329 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 330 331 if (phone < 0) 332 return 0; 333 334 return devmap_count_devices_internal(phone, ns_handle); 335 } 336 337 size_t devmap_get_namespaces(dev_desc_t **data) 338 { 339 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 340 341 if (phone < 0) 342 return 0; 343 344 /* Loop until namespaces read succesful */ 345 while (true) { 346 size_t count = devmap_count_namespaces_internal(phone); 347 if (count == 0) 348 return 0; 349 350 dev_desc_t *devs = (dev_desc_t *) calloc(count, sizeof(dev_desc_t)); 351 if (devs == NULL) 352 return 0; 353 354 async_serialize_start(); 355 356 ipc_call_t answer; 357 aid_t req = async_send_0(phone, DEVMAP_GET_NAMESPACES, &answer); 358 359 int rc = async_data_read_start(phone, devs, count * sizeof(dev_desc_t)); 360 if (rc == EOVERFLOW) { 361 /* 362 * Number of namespaces has changed since 363 * the last call of DEVMAP_DEVICE_GET_NAMESPACE_COUNT 364 */ 365 async_serialize_end(); 366 free(devs); 367 continue; 368 } 369 370 if (rc != EOK) { 371 async_wait_for(req, NULL); 372 async_serialize_end(); 373 free(devs); 374 return 0; 375 } 376 377 ipcarg_t retval; 378 async_wait_for(req, &retval); 379 async_serialize_end(); 380 381 if (retval != EOK) 382 return 0; 383 384 *data = devs; 385 return count; 386 } 387 } 388 389 size_t devmap_get_devices(dev_handle_t ns_handle, dev_desc_t **data) 390 { 391 int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING); 392 393 if (phone < 0) 394 return 0; 395 396 /* Loop until namespaces read succesful */ 397 while (true) { 398 size_t count = devmap_count_devices_internal(phone, ns_handle); 399 if (count == 0) 400 return 0; 401 402 dev_desc_t *devs = (dev_desc_t *) calloc(count, sizeof(dev_desc_t)); 403 if (devs == NULL) 404 return 0; 405 406 async_serialize_start(); 407 408 ipc_call_t answer; 409 aid_t req = async_send_1(phone, DEVMAP_GET_DEVICES, ns_handle, &answer); 410 411 int rc = async_data_read_start(phone, devs, count * sizeof(dev_desc_t)); 412 if (rc == EOVERFLOW) { 413 /* 414 * Number of devices has changed since 415 * the last call of DEVMAP_DEVICE_GET_DEVICE_COUNT 416 */ 417 async_serialize_end(); 418 free(devs); 419 continue; 420 } 421 422 if (rc != EOK) { 423 async_wait_for(req, NULL); 424 async_serialize_end(); 425 free(devs); 426 return 0; 427 } 428 429 ipcarg_t retval; 430 async_wait_for(req, &retval); 431 async_serialize_end(); 432 433 if (retval != EOK) 434 return 0; 435 436 *data = devs; 437 return count; 438 } 439 } 288 return IPC_GET_ARG1(answer); 289 }
Note:
See TracChangeset
for help on using the changeset viewer.