Changes in uspace/drv/bus/isa/isa.c [f278930:ef9460b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/isa/isa.c
rf278930 ref9460b 37 37 */ 38 38 39 #include <adt/list.h>40 39 #include <assert.h> 41 40 #include <stdio.h> … … 64 63 #define CHILD_FUN_CONF_PATH "/drv/isa/isa.dev" 65 64 66 /** Obtain soft-state from device node */ 67 #define ISA_BUS(dev) ((isa_bus_t *) ((dev)->driver_data)) 68 69 /** Obtain soft-state from function node */ 70 #define ISA_FUN(fun) ((isa_fun_t *) ((fun)->driver_data)) 65 /** Obtain soft-state pointer from function node pointer */ 66 #define ISA_FUN(fnode) ((isa_fun_t *) ((fnode)->driver_data)) 71 67 72 68 #define ISA_MAX_HW_RES 4 73 69 74 typedef struct {75 fibril_mutex_t mutex;76 ddf_dev_t *dev;77 ddf_fun_t *fctl;78 list_t functions;79 } isa_bus_t;80 81 70 typedef struct isa_fun { 82 fibril_mutex_t mutex;83 71 ddf_fun_t *fnode; 84 72 hw_resource_list_t hw_resources; 85 link_t bus_link;86 73 } isa_fun_t; 87 74 … … 109 96 110 97 static int isa_add_device(ddf_dev_t *dev); 111 static int isa_dev_remove(ddf_dev_t *dev);112 static int isa_fun_online(ddf_fun_t *fun);113 static int isa_fun_offline(ddf_fun_t *fun);114 98 115 99 /** The isa device driver's standard operations */ 116 100 static driver_ops_t isa_ops = { 117 .add_device = &isa_add_device, 118 .dev_remove = &isa_dev_remove, 119 .fun_online = &isa_fun_online, 120 .fun_offline = &isa_fun_offline 101 .add_device = &isa_add_device 121 102 }; 122 103 … … 127 108 }; 128 109 129 static isa_fun_t *isa_fun_create(isa_bus_t *isa, const char *name) 130 { 131 ddf_fun_t *fnode = ddf_fun_create(isa->dev, fun_inner, name); 132 if (fnode == NULL) 133 return NULL; 134 135 isa_fun_t *fun = ddf_fun_data_alloc(fnode, sizeof(isa_fun_t)); 110 static isa_fun_t *isa_fun_create(ddf_dev_t *dev, const char *name) 111 { 112 isa_fun_t *fun = calloc(1, sizeof(isa_fun_t)); 136 113 if (fun == NULL) 137 114 return NULL; 138 115 139 fibril_mutex_initialize(&fun->mutex); 116 ddf_fun_t *fnode = ddf_fun_create(dev, fun_inner, name); 117 if (fnode == NULL) { 118 free(fun); 119 return NULL; 120 } 121 140 122 fun->fnode = fnode; 123 fnode->driver_data = fun; 141 124 return fun; 142 125 } … … 409 392 } 410 393 411 static void fun_hw_res_free(isa_fun_t *fun) 412 { 413 free(fun->hw_resources.resources); 414 fun->hw_resources.resources = NULL; 415 } 416 417 static char *isa_fun_read_info(char *fun_conf, isa_bus_t *isa) 394 static char *isa_fun_read_info(char *fun_conf, ddf_dev_t *dev) 418 395 { 419 396 char *line; … … 438 415 return NULL; 439 416 440 isa_fun_t *fun = isa_fun_create( isa, fun_name);417 isa_fun_t *fun = isa_fun_create(dev, fun_name); 441 418 if (fun == NULL) { 442 419 free(fun_name); … … 471 448 (void) ddf_fun_bind(fun->fnode); 472 449 473 list_append(&fun->bus_link, &isa->functions);474 475 450 return fun_conf; 476 451 } 477 452 478 static void fun_conf_parse(char *conf, isa_bus_t *isa)453 static void fun_conf_parse(char *conf, ddf_dev_t *dev) 479 454 { 480 455 while (conf != NULL && *conf != '\0') { 481 conf = isa_fun_read_info(conf, isa);482 } 483 } 484 485 static void isa_functions_add( isa_bus_t *isa)456 conf = isa_fun_read_info(conf, dev); 457 } 458 } 459 460 static void isa_functions_add(ddf_dev_t *dev) 486 461 { 487 462 char *fun_conf; … … 489 464 fun_conf = fun_conf_read(CHILD_FUN_CONF_PATH); 490 465 if (fun_conf != NULL) { 491 fun_conf_parse(fun_conf, isa);466 fun_conf_parse(fun_conf, dev); 492 467 free(fun_conf); 493 468 } … … 496 471 static int isa_add_device(ddf_dev_t *dev) 497 472 { 498 isa_bus_t *isa;499 500 473 ddf_msg(LVL_DEBUG, "isa_add_device, device handle = %d", 501 474 (int) dev->handle); 502 475 503 isa = ddf_dev_data_alloc(dev, sizeof(isa_bus_t));504 if (isa == NULL)505 return ENOMEM;506 507 fibril_mutex_initialize(&isa->mutex);508 isa->dev = dev;509 list_initialize(&isa->functions);510 511 476 /* Make the bus device more visible. Does not do anything. */ 512 477 ddf_msg(LVL_DEBUG, "Adding a 'ctl' function"); 513 478 514 fibril_mutex_lock(&isa->mutex); 515 516 isa->fctl = ddf_fun_create(dev, fun_exposed, "ctl"); 517 if (isa->fctl == NULL) { 479 ddf_fun_t *ctl = ddf_fun_create(dev, fun_exposed, "ctl"); 480 if (ctl == NULL) { 518 481 ddf_msg(LVL_ERROR, "Failed creating control function."); 519 482 return EXDEV; 520 483 } 521 484 522 if (ddf_fun_bind(isa->fctl) != EOK) { 523 ddf_fun_destroy(isa->fctl); 485 if (ddf_fun_bind(ctl) != EOK) { 524 486 ddf_msg(LVL_ERROR, "Failed binding control function."); 525 487 return EXDEV; … … 527 489 528 490 /* Add functions as specified in the configuration file. */ 529 isa_functions_add( isa);491 isa_functions_add(dev); 530 492 ddf_msg(LVL_NOTE, "Finished enumerating legacy functions"); 531 493 532 fibril_mutex_unlock(&isa->mutex);533 534 494 return EOK; 535 495 } 536 537 static int isa_dev_remove(ddf_dev_t *dev)538 {539 isa_bus_t *isa = ISA_BUS(dev);540 int rc;541 542 fibril_mutex_lock(&isa->mutex);543 544 while (!list_empty(&isa->functions)) {545 isa_fun_t *fun = list_get_instance(list_first(&isa->functions),546 isa_fun_t, bus_link);547 548 rc = ddf_fun_offline(fun->fnode);549 if (rc != EOK) {550 fibril_mutex_unlock(&isa->mutex);551 ddf_msg(LVL_ERROR, "Failed offlining %s", fun->fnode->name);552 return rc;553 }554 555 rc = ddf_fun_unbind(fun->fnode);556 if (rc != EOK) {557 fibril_mutex_unlock(&isa->mutex);558 ddf_msg(LVL_ERROR, "Failed unbinding %s", fun->fnode->name);559 return rc;560 }561 562 list_remove(&fun->bus_link);563 564 fun_hw_res_free(fun);565 ddf_fun_destroy(fun->fnode);566 }567 568 if (ddf_fun_unbind(isa->fctl) != EOK) {569 fibril_mutex_unlock(&isa->mutex);570 ddf_msg(LVL_ERROR, "Failed unbinding control function.");571 return EXDEV;572 }573 574 fibril_mutex_unlock(&isa->mutex);575 576 return EOK;577 }578 579 static int isa_fun_online(ddf_fun_t *fun)580 {581 ddf_msg(LVL_DEBUG, "isa_fun_online()");582 return ddf_fun_online(fun);583 }584 585 static int isa_fun_offline(ddf_fun_t *fun)586 {587 ddf_msg(LVL_DEBUG, "isa_fun_offline()");588 return ddf_fun_offline(fun);589 }590 591 496 592 497 static void isa_init()
Note:
See TracChangeset
for help on using the changeset viewer.