Changeset 1db5669 in mainline
- Timestamp:
- 2013-09-11T12:35:55Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 48bd6f4, 4c9b28a
- Parents:
- cd3b380
- Location:
- uspace
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/devctl/devctl.c
rcd3b380 r1db5669 47 47 char drv_name[MAX_NAME_LENGTH]; 48 48 49 static const char *drv_state_str(driver_state_t state) 50 { 51 const char *sstate; 52 53 switch (state) { 54 case DRIVER_NOT_STARTED: 55 sstate = "not started"; 56 break; 57 case DRIVER_STARTING: 58 sstate = "starting"; 59 break; 60 case DRIVER_RUNNING: 61 sstate = "running"; 62 break; 63 default: 64 sstate = "unknown"; 65 } 66 67 return sstate; 68 } 69 49 70 static int fun_subtree_print(devman_handle_t funh, int lvl) 50 71 { … … 161 182 static int drv_list(void) 162 183 { 184 devman_handle_t *devs; 163 185 devman_handle_t *drvs; 164 186 driver_state_t state; 165 187 const char *sstate; 166 188 size_t ndrvs; 189 size_t ndevs; 167 190 size_t i; 168 191 int rc; … … 173 196 174 197 for (i = 0; i < ndrvs; i++) { 198 devs = NULL; 199 175 200 rc = devman_driver_get_name(drvs[i], drv_name, MAX_NAME_LENGTH); 176 201 if (rc != EOK) 177 continue;202 goto skip; 178 203 rc = devman_driver_get_state(drvs[i], &state); 179 204 if (rc != EOK) 180 continue; 181 switch (state) { 182 case DRIVER_NOT_STARTED: 183 sstate = "not started"; 184 break; 185 case DRIVER_STARTING: 186 sstate = "starting"; 187 break; 188 case DRIVER_RUNNING: 189 sstate = "running"; 190 break; 191 default: 192 sstate = "unknown"; 193 } 194 printf("%3d %-10s %s\n", (int)drvs[i], drv_name, sstate); 205 goto skip; 206 rc = devman_driver_get_devices(drvs[i], &devs, &ndevs); 207 if (rc != EOK) 208 goto skip; 209 210 sstate = drv_state_str(state); 211 212 printf("%-11s %3d %s\n", sstate, ndevs, drv_name); 213 skip: 214 free(devs); 195 215 } 196 216 free(drvs); 217 218 return EOK; 219 } 220 221 static int drv_show(char *drvname) 222 { 223 devman_handle_t *devs; 224 devman_handle_t drvh; 225 devman_handle_t funh; 226 driver_state_t state; 227 const char *sstate; 228 size_t ndevs; 229 size_t i; 230 int rc; 231 232 rc = devman_driver_get_handle(drvname, &drvh); 233 if (rc != EOK) 234 return rc; 235 236 devs = NULL; 237 238 rc = devman_driver_get_name(drvh, drv_name, MAX_NAME_LENGTH); 239 if (rc != EOK) 240 return rc; 241 242 rc = devman_driver_get_state(drvh, &state); 243 if (rc != EOK) 244 return rc; 245 246 rc = devman_driver_get_devices(drvh, &devs, &ndevs); 247 if (rc != EOK) 248 return rc; 249 250 sstate = drv_state_str(state); 251 252 printf("Driver: %s\n", drv_name); 253 printf("State: %s\n", sstate); 254 printf("Attached devices:\n"); 255 256 for (i = 0; i < ndevs; i++) { 257 rc = devman_dev_get_parent(devs[i], &funh); 258 if (rc != EOK) 259 goto error; 260 261 rc = devman_fun_get_path(funh, name, MAX_NAME_LENGTH); 262 if (rc != EOK) 263 goto error; 264 printf("\t%s\n", name); 265 } 266 267 error: 268 free(devs); 197 269 198 270 return EOK; … … 226 298 printf("\tdevctl offline <function>]\n"); 227 299 printf("\tdevctl list-drv\n"); 300 printf("\tdevctl show-drv <driver-name>\n"); 228 301 printf("\tdevctl load-drv <driver-name>\n"); 229 302 } … … 263 336 if (rc != EOK) 264 337 return 2; 338 } else if (str_cmp(argv[1], "show-drv") == 0) { 339 if (argc < 3) { 340 printf(NAME ": Argument missing.\n"); 341 print_syntax(); 342 return 1; 343 } 344 345 rc = drv_show(argv[2]); 346 if (rc != EOK) { 347 return 2; 348 } 265 349 } else if (str_cmp(argv[1], "load-drv") == 0) { 266 350 if (argc < 3) { -
uspace/lib/c/generic/devman.c
rcd3b380 r1db5669 579 579 } 580 580 581 int devman_dev_get_parent(devman_handle_t devh, devman_handle_t *funh) 582 { 583 async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT); 584 if (exch == NULL) 585 return ENOMEM; 586 587 sysarg_t retval = async_req_1_1(exch, DEVMAN_DEV_GET_PARENT, 588 devh, funh); 589 590 devman_exchange_end(exch); 591 return (int) retval; 592 } 593 581 594 int devman_fun_sid_to_handle(service_id_t sid, devman_handle_t *handle) 582 595 { … … 596 609 { 597 610 return devman_get_handles_internal(DEVMAN_GET_DRIVERS, 0, drvs, count); 611 } 612 613 int devman_driver_get_devices(devman_handle_t drvh, devman_handle_t **devs, 614 size_t *count) 615 { 616 return devman_get_handles_internal(DEVMAN_DRIVER_GET_DEVICES, 617 drvh, devs, count); 598 618 } 599 619 -
uspace/lib/c/include/devman.h
rcd3b380 r1db5669 61 61 unsigned int); 62 62 extern int devman_fun_get_child(devman_handle_t, devman_handle_t *); 63 extern int devman_dev_get_parent(devman_handle_t, devman_handle_t *); 63 64 extern int devman_dev_get_functions(devman_handle_t, devman_handle_t **, 64 65 size_t *); … … 72 73 extern int devman_fun_sid_to_handle(service_id_t, devman_handle_t *); 73 74 extern int devman_get_drivers(devman_handle_t **, size_t *); 75 extern int devman_driver_get_devices(devman_handle_t, devman_handle_t **, 76 size_t *); 74 77 extern int devman_driver_get_handle(const char *, devman_handle_t *); 75 78 extern int devman_driver_get_name(devman_handle_t, char *, size_t); -
uspace/lib/c/include/ipc/devman.h
rcd3b380 r1db5669 169 169 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD, 170 170 DEVMAN_DEV_GET_FUNCTIONS, 171 DEVMAN_DEV_GET_PARENT, 171 172 DEVMAN_FUN_GET_CHILD, 172 173 DEVMAN_FUN_GET_NAME, … … 177 178 DEVMAN_FUN_SID_TO_HANDLE, 178 179 DEVMAN_GET_DRIVERS, 180 DEVMAN_DRIVER_GET_DEVICES, 179 181 DEVMAN_DRIVER_GET_HANDLE, 180 182 DEVMAN_DRIVER_GET_NAME, -
uspace/srv/devman/client_conn.c
rcd3b380 r1db5669 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2013 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 269 270 } 270 271 272 /** Get handle for parent function of a device. */ 273 static void devman_dev_get_parent(ipc_callid_t iid, ipc_call_t *icall) 274 { 275 dev_node_t *dev; 276 277 fibril_rwlock_read_lock(&device_tree.rwlock); 278 279 dev = find_dev_node_no_lock(&device_tree, IPC_GET_ARG1(*icall)); 280 if (dev == NULL || dev->state == DEVICE_REMOVED) { 281 fibril_rwlock_read_unlock(&device_tree.rwlock); 282 async_answer_0(iid, ENOENT); 283 return; 284 } 285 286 if (dev->pfun == NULL) { 287 fibril_rwlock_read_unlock(&device_tree.rwlock); 288 async_answer_0(iid, ENOENT); 289 return; 290 } 291 292 async_answer_1(iid, EOK, dev->pfun->handle); 293 294 fibril_rwlock_read_unlock(&device_tree.rwlock); 295 } 296 271 297 static void devman_dev_get_functions(ipc_callid_t iid, ipc_call_t *icall) 272 298 { … … 425 451 426 452 if (!async_data_read_receive(&callid, &size)) { 427 async_answer_0(callid, EREFUSED);428 453 async_answer_0(iid, EREFUSED); 429 454 return; … … 449 474 async_answer_1(iid, retval, act_size); 450 475 } 476 477 static void devman_driver_get_devices(ipc_callid_t iid, ipc_call_t *icall) 478 { 479 ipc_callid_t callid; 480 size_t size; 481 size_t act_size; 482 int rc; 483 484 if (!async_data_read_receive(&callid, &size)) { 485 async_answer_0(iid, EREFUSED); 486 return; 487 } 488 489 driver_t *drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall)); 490 if (drv == NULL) { 491 async_answer_0(callid, ENOENT); 492 async_answer_0(iid, ENOENT); 493 return; 494 } 495 496 devman_handle_t *hdl_buf = (devman_handle_t *) malloc(size); 497 if (hdl_buf == NULL) { 498 async_answer_0(callid, ENOMEM); 499 async_answer_0(iid, ENOMEM); 500 return; 501 } 502 503 rc = driver_get_devices(drv, hdl_buf, size, &act_size); 504 if (rc != EOK) { 505 fibril_rwlock_read_unlock(&device_tree.rwlock); 506 async_answer_0(callid, rc); 507 async_answer_0(iid, rc); 508 return; 509 } 510 511 sysarg_t retval = async_data_read_finalize(callid, hdl_buf, size); 512 free(hdl_buf); 513 514 async_answer_1(iid, retval, act_size); 515 } 516 451 517 452 518 /** Find driver by name. */ … … 563 629 devman_function_get_handle(callid, &call); 564 630 break; 631 case DEVMAN_DEV_GET_PARENT: 632 devman_dev_get_parent(callid, &call); 633 break; 565 634 case DEVMAN_DEV_GET_FUNCTIONS: 566 635 devman_dev_get_functions(callid, &call); … … 589 658 case DEVMAN_GET_DRIVERS: 590 659 devman_get_drivers(callid, &call); 660 break; 661 case DEVMAN_DRIVER_GET_DEVICES: 662 devman_driver_get_devices(callid, &call); 591 663 break; 592 664 case DEVMAN_DRIVER_GET_HANDLE: -
uspace/srv/devman/driver.c
rcd3b380 r1db5669 729 729 } 730 730 731 /** Get list of device functions. */ 732 int driver_get_devices(driver_t *driver, devman_handle_t *hdl_buf, 733 size_t buf_size, size_t *act_size) 734 { 735 size_t act_cnt; 736 size_t buf_cnt; 737 738 fibril_mutex_lock(&driver->driver_mutex); 739 740 buf_cnt = buf_size / sizeof(devman_handle_t); 741 742 act_cnt = list_count(&driver->devices); 743 *act_size = act_cnt * sizeof(devman_handle_t); 744 745 if (buf_size % sizeof(devman_handle_t) != 0) { 746 fibril_mutex_unlock(&driver->driver_mutex); 747 return EINVAL; 748 } 749 750 size_t pos = 0; 751 list_foreach(driver->devices, driver_devices, dev_node_t, dev) { 752 if (pos < buf_cnt) { 753 hdl_buf[pos] = dev->handle; 754 } 755 756 pos++; 757 } 758 759 fibril_mutex_unlock(&driver->driver_mutex); 760 return EOK; 761 } 762 731 763 /** @} 732 764 */ -
uspace/srv/devman/driver.h
rcd3b380 r1db5669 64 64 extern void delete_driver(driver_t *); 65 65 extern int driver_get_list(driver_list_t *, devman_handle_t *, size_t, size_t *); 66 extern int driver_get_devices(driver_t *, devman_handle_t *, size_t, size_t *); 66 67 67 68 #endif
Note:
See TracChangeset
for help on using the changeset viewer.