Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/test/test1/test1.c

    r80a96d2 ref9460b  
    11/*
    22 * Copyright (c) 2010 Vojtech Horky
    3  * Copyright (c) 2011 Jiri Svoboda
    43 * All rights reserved.
    54 *
     
    4140
    4241static int test1_add_device(ddf_dev_t *dev);
    43 static int test1_dev_remove(ddf_dev_t *dev);
    44 static int test1_dev_gone(ddf_dev_t *dev);
    45 static int test1_fun_online(ddf_fun_t *fun);
    46 static int test1_fun_offline(ddf_fun_t *fun);
    4742
    4843static driver_ops_t driver_ops = {
    49         .add_device = &test1_add_device,
    50         .dev_remove = &test1_dev_remove,
    51         .dev_gone = &test1_dev_gone,
    52         .fun_online = &test1_fun_online,
    53         .fun_offline = &test1_fun_offline
     44        .add_device = &test1_add_device
    5445};
    5546
     
    5849        .driver_ops = &driver_ops
    5950};
    60 
    61 typedef struct {
    62         ddf_fun_t *fun_a;
    63         ddf_fun_t *clone;
    64         ddf_fun_t *child;
    65 } test1_t;
    6651
    6752/** Register child and inform user about it.
     
    7560static int register_fun_verbose(ddf_dev_t *parent, const char *message,
    7661    const char *name, const char *match_id, int match_score,
    77     int expected_rc, ddf_fun_t **pfun)
     62    int expected_rc)
    7863{
    7964        ddf_fun_t *fun = NULL;
     
    118103        }
    119104
    120         if (pfun != NULL)
    121                 *pfun = fun;
    122 
    123105        return rc;
    124106}
     
    144126{
    145127        ddf_fun_t *fun_a;
    146         test1_t *test1;
    147128        int rc;
    148129
    149130        ddf_msg(LVL_DEBUG, "add_device(name=\"%s\", handle=%d)",
    150131            dev->name, (int) dev->handle);
    151 
    152         test1 = ddf_dev_data_alloc(dev, sizeof(test1_t));
    153         if (test1 == NULL) {
    154                 ddf_msg(LVL_ERROR, "Failed allocating soft state.\n");
    155                 return ENOMEM;
    156         }
    157132
    158133        fun_a = ddf_fun_create(dev, fun_exposed, "a");
     
    162137        }
    163138
    164         test1->fun_a = fun_a;
    165 
    166139        rc = ddf_fun_bind(fun_a);
    167140        if (rc != EOK) {
    168141                ddf_msg(LVL_ERROR, "Failed binding function 'a'.");
    169                 ddf_fun_destroy(fun_a);
    170142                return rc;
    171143        }
    172144
    173         ddf_fun_add_to_category(fun_a, "virtual");
     145        ddf_fun_add_to_class(fun_a, "virtual");
    174146
    175147        if (str_cmp(dev->name, "null") == 0) {
    176148                fun_a->ops = &char_device_ops;
    177                 ddf_fun_add_to_category(fun_a, "virt-null");
     149                ddf_fun_add_to_class(fun_a, "virt-null");
    178150        } else if (str_cmp(dev->name, "test1") == 0) {
    179151                (void) register_fun_verbose(dev,
    180152                    "cloning myself ;-)", "clone",
    181                     "virtual&test1", 10, EOK, &test1->clone);
     153                    "virtual&test1", 10, EOK);
    182154                (void) register_fun_verbose(dev,
    183155                    "cloning myself twice ;-)", "clone",
    184                     "virtual&test1", 10, EEXISTS, NULL);
     156                    "virtual&test1", 10, EEXISTS);
    185157        } else if (str_cmp(dev->name, "clone") == 0) {
    186158                (void) register_fun_verbose(dev,
    187159                    "run by the same task", "child",
    188                     "virtual&test1&child", 10, EOK, &test1->child);
     160                    "virtual&test1&child", 10, EOK);
    189161        }
    190162
     
    192164
    193165        return EOK;
    194 }
    195 
    196 static int fun_remove(ddf_fun_t *fun, const char *name)
    197 {
    198         int rc;
    199 
    200         ddf_msg(LVL_DEBUG, "fun_remove(%p, '%s')", fun, name);
    201         rc = ddf_fun_offline(fun);
    202         if (rc != EOK) {
    203                 ddf_msg(LVL_ERROR, "Error offlining function '%s'.", name);
    204                 return rc;
    205         }
    206 
    207         rc = ddf_fun_unbind(fun);
    208         if (rc != EOK) {
    209                 ddf_msg(LVL_ERROR, "Failed unbinding function '%s'.", name);
    210                 return rc;
    211         }
    212 
    213         ddf_fun_destroy(fun);
    214         return EOK;
    215 }
    216 
    217 static int fun_unbind(ddf_fun_t *fun, const char *name)
    218 {
    219         int rc;
    220 
    221         ddf_msg(LVL_DEBUG, "fun_unbind(%p, '%s')", fun, name);
    222         rc = ddf_fun_unbind(fun);
    223         if (rc != EOK) {
    224                 ddf_msg(LVL_ERROR, "Failed unbinding function '%s'.", name);
    225                 return rc;
    226         }
    227 
    228         ddf_fun_destroy(fun);
    229         return EOK;
    230 }
    231 
    232 static int test1_dev_remove(ddf_dev_t *dev)
    233 {
    234         test1_t *test1 = (test1_t *)dev->driver_data;
    235         int rc;
    236 
    237         ddf_msg(LVL_DEBUG, "test1_dev_remove(%p)", dev);
    238 
    239         if (test1->fun_a != NULL) {
    240                 rc = fun_remove(test1->fun_a, "a");
    241                 if (rc != EOK)
    242                         return rc;
    243         }
    244 
    245         if (test1->clone != NULL) {
    246                 rc = fun_remove(test1->clone, "clone");
    247                 if (rc != EOK)
    248                         return rc;
    249         }
    250 
    251         if (test1->child != NULL) {
    252                 rc = fun_remove(test1->child, "child");
    253                 if (rc != EOK)
    254                         return rc;
    255         }
    256 
    257         return EOK;
    258 }
    259 
    260 static int test1_dev_gone(ddf_dev_t *dev)
    261 {
    262         test1_t *test1 = (test1_t *)dev->driver_data;
    263         int rc;
    264 
    265         ddf_msg(LVL_DEBUG, "test1_dev_remove(%p)", dev);
    266 
    267         if (test1->fun_a != NULL) {
    268                 rc = fun_unbind(test1->fun_a, "a");
    269                 if (rc != EOK)
    270                         return rc;
    271         }
    272 
    273         if (test1->clone != NULL) {
    274                 rc = fun_unbind(test1->clone, "clone");
    275                 if (rc != EOK)
    276                         return rc;
    277         }
    278 
    279         if (test1->child != NULL) {
    280                 rc = fun_unbind(test1->child, "child");
    281                 if (rc != EOK)
    282                         return rc;
    283         }
    284 
    285         return EOK;
    286 }
    287 
    288 static int test1_fun_online(ddf_fun_t *fun)
    289 {
    290         ddf_msg(LVL_DEBUG, "test1_fun_online()");
    291         return ddf_fun_online(fun);
    292 }
    293 
    294 static int test1_fun_offline(ddf_fun_t *fun)
    295 {
    296         ddf_msg(LVL_DEBUG, "test1_fun_offline()");
    297         return ddf_fun_offline(fun);
    298166}
    299167
Note: See TracChangeset for help on using the changeset viewer.