Changeset c05642d in mainline for uspace/drv/test/test1/test1.c


Ignore:
Timestamp:
2011-09-07T00:03:26Z (13 years ago)
Author:
Petr Koupy <petr.koupy@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5081276
Parents:
bb74dabe (diff), 038b289 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rbb74dabe rc05642d  
    11/*
    22 * Copyright (c) 2010 Vojtech Horky
     3 * Copyright (c) 2011 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    4041
    4142static int test1_add_device(ddf_dev_t *dev);
     43static int test1_dev_remove(ddf_dev_t *dev);
     44static int test1_dev_gone(ddf_dev_t *dev);
     45static int test1_fun_online(ddf_fun_t *fun);
     46static int test1_fun_offline(ddf_fun_t *fun);
    4247
    4348static driver_ops_t driver_ops = {
    44         .add_device = &test1_add_device
     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
    4554};
    4655
     
    4958        .driver_ops = &driver_ops
    5059};
     60
     61typedef struct {
     62        ddf_fun_t *fun_a;
     63        ddf_fun_t *clone;
     64        ddf_fun_t *child;
     65} test1_t;
    5166
    5267/** Register child and inform user about it.
     
    6075static int register_fun_verbose(ddf_dev_t *parent, const char *message,
    6176    const char *name, const char *match_id, int match_score,
    62     int expected_rc)
     77    int expected_rc, ddf_fun_t **pfun)
    6378{
    6479        ddf_fun_t *fun = NULL;
     
    103118        }
    104119
     120        if (pfun != NULL)
     121                *pfun = fun;
     122
    105123        return rc;
    106124}
     
    126144{
    127145        ddf_fun_t *fun_a;
     146        test1_t *test1;
    128147        int rc;
    129148
    130149        ddf_msg(LVL_DEBUG, "add_device(name=\"%s\", handle=%d)",
    131150            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        }
    132157
    133158        fun_a = ddf_fun_create(dev, fun_exposed, "a");
     
    137162        }
    138163
     164        test1->fun_a = fun_a;
     165
    139166        rc = ddf_fun_bind(fun_a);
    140167        if (rc != EOK) {
    141168                ddf_msg(LVL_ERROR, "Failed binding function 'a'.");
     169                ddf_fun_destroy(fun_a);
    142170                return rc;
    143171        }
     
    151179                (void) register_fun_verbose(dev,
    152180                    "cloning myself ;-)", "clone",
    153                     "virtual&test1", 10, EOK);
     181                    "virtual&test1", 10, EOK, &test1->clone);
    154182                (void) register_fun_verbose(dev,
    155183                    "cloning myself twice ;-)", "clone",
    156                     "virtual&test1", 10, EEXISTS);
     184                    "virtual&test1", 10, EEXISTS, NULL);
    157185        } else if (str_cmp(dev->name, "clone") == 0) {
    158186                (void) register_fun_verbose(dev,
    159187                    "run by the same task", "child",
    160                     "virtual&test1&child", 10, EOK);
     188                    "virtual&test1&child", 10, EOK, &test1->child);
    161189        }
    162190
     
    164192
    165193        return EOK;
     194}
     195
     196static 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
     217static 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
     232static 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
     260static 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
     288static 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
     294static int test1_fun_offline(ddf_fun_t *fun)
     295{
     296        ddf_msg(LVL_DEBUG, "test1_fun_offline()");
     297        return ddf_fun_offline(fun);
    166298}
    167299
Note: See TracChangeset for help on using the changeset viewer.