Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/isa/isa.c

    rf278930 ref9460b  
    3737 */
    3838
    39 #include <adt/list.h>
    4039#include <assert.h>
    4140#include <stdio.h>
     
    6463#define CHILD_FUN_CONF_PATH "/drv/isa/isa.dev"
    6564
    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))
    7167
    7268#define ISA_MAX_HW_RES 4
    7369
    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 
    8170typedef struct isa_fun {
    82         fibril_mutex_t mutex;
    8371        ddf_fun_t *fnode;
    8472        hw_resource_list_t hw_resources;
    85         link_t bus_link;
    8673} isa_fun_t;
    8774
     
    10996
    11097static 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);
    11498
    11599/** The isa device driver's standard operations */
    116100static 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
    121102};
    122103
     
    127108};
    128109
    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));
     110static 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));
    136113        if (fun == NULL)
    137114                return NULL;
    138115
    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
    140122        fun->fnode = fnode;
     123        fnode->driver_data = fun;
    141124        return fun;
    142125}
     
    409392}
    410393
    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)
     394static char *isa_fun_read_info(char *fun_conf, ddf_dev_t *dev)
    418395{
    419396        char *line;
     
    438415                return NULL;
    439416
    440         isa_fun_t *fun = isa_fun_create(isa, fun_name);
     417        isa_fun_t *fun = isa_fun_create(dev, fun_name);
    441418        if (fun == NULL) {
    442419                free(fun_name);
     
    471448        (void) ddf_fun_bind(fun->fnode);
    472449
    473         list_append(&fun->bus_link, &isa->functions);
    474 
    475450        return fun_conf;
    476451}
    477452
    478 static void fun_conf_parse(char *conf, isa_bus_t *isa)
     453static void fun_conf_parse(char *conf, ddf_dev_t *dev)
    479454{
    480455        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
     460static void isa_functions_add(ddf_dev_t *dev)
    486461{
    487462        char *fun_conf;
     
    489464        fun_conf = fun_conf_read(CHILD_FUN_CONF_PATH);
    490465        if (fun_conf != NULL) {
    491                 fun_conf_parse(fun_conf, isa);
     466                fun_conf_parse(fun_conf, dev);
    492467                free(fun_conf);
    493468        }
     
    496471static int isa_add_device(ddf_dev_t *dev)
    497472{
    498         isa_bus_t *isa;
    499 
    500473        ddf_msg(LVL_DEBUG, "isa_add_device, device handle = %d",
    501474            (int) dev->handle);
    502475
    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 
    511476        /* Make the bus device more visible. Does not do anything. */
    512477        ddf_msg(LVL_DEBUG, "Adding a 'ctl' function");
    513478
    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) {
    518481                ddf_msg(LVL_ERROR, "Failed creating control function.");
    519482                return EXDEV;
    520483        }
    521484
    522         if (ddf_fun_bind(isa->fctl) != EOK) {
    523                 ddf_fun_destroy(isa->fctl);
     485        if (ddf_fun_bind(ctl) != EOK) {
    524486                ddf_msg(LVL_ERROR, "Failed binding control function.");
    525487                return EXDEV;
     
    527489
    528490        /* Add functions as specified in the configuration file. */
    529         isa_functions_add(isa);
     491        isa_functions_add(dev);
    530492        ddf_msg(LVL_NOTE, "Finished enumerating legacy functions");
    531493
    532         fibril_mutex_unlock(&isa->mutex);
    533 
    534494        return EOK;
    535495}
    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 
    591496
    592497static void isa_init()
Note: See TracChangeset for help on using the changeset viewer.