Changes in uspace/drv/test/test1/test1.c [80a96d2:ef9460b] in mainline
- File:
-
- 1 edited
-
uspace/drv/test/test1/test1.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/test/test1/test1.c
r80a96d2 ref9460b 1 1 /* 2 2 * Copyright (c) 2010 Vojtech Horky 3 * Copyright (c) 2011 Jiri Svoboda4 3 * All rights reserved. 5 4 * … … 41 40 42 41 static 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);47 42 48 43 static 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 54 45 }; 55 46 … … 58 49 .driver_ops = &driver_ops 59 50 }; 60 61 typedef struct {62 ddf_fun_t *fun_a;63 ddf_fun_t *clone;64 ddf_fun_t *child;65 } test1_t;66 51 67 52 /** Register child and inform user about it. … … 75 60 static int register_fun_verbose(ddf_dev_t *parent, const char *message, 76 61 const char *name, const char *match_id, int match_score, 77 int expected_rc , ddf_fun_t **pfun)62 int expected_rc) 78 63 { 79 64 ddf_fun_t *fun = NULL; … … 118 103 } 119 104 120 if (pfun != NULL)121 *pfun = fun;122 123 105 return rc; 124 106 } … … 144 126 { 145 127 ddf_fun_t *fun_a; 146 test1_t *test1;147 128 int rc; 148 129 149 130 ddf_msg(LVL_DEBUG, "add_device(name=\"%s\", handle=%d)", 150 131 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 }157 132 158 133 fun_a = ddf_fun_create(dev, fun_exposed, "a"); … … 162 137 } 163 138 164 test1->fun_a = fun_a;165 166 139 rc = ddf_fun_bind(fun_a); 167 140 if (rc != EOK) { 168 141 ddf_msg(LVL_ERROR, "Failed binding function 'a'."); 169 ddf_fun_destroy(fun_a);170 142 return rc; 171 143 } 172 144 173 ddf_fun_add_to_c ategory(fun_a, "virtual");145 ddf_fun_add_to_class(fun_a, "virtual"); 174 146 175 147 if (str_cmp(dev->name, "null") == 0) { 176 148 fun_a->ops = &char_device_ops; 177 ddf_fun_add_to_c ategory(fun_a, "virt-null");149 ddf_fun_add_to_class(fun_a, "virt-null"); 178 150 } else if (str_cmp(dev->name, "test1") == 0) { 179 151 (void) register_fun_verbose(dev, 180 152 "cloning myself ;-)", "clone", 181 "virtual&test1", 10, EOK , &test1->clone);153 "virtual&test1", 10, EOK); 182 154 (void) register_fun_verbose(dev, 183 155 "cloning myself twice ;-)", "clone", 184 "virtual&test1", 10, EEXISTS , NULL);156 "virtual&test1", 10, EEXISTS); 185 157 } else if (str_cmp(dev->name, "clone") == 0) { 186 158 (void) register_fun_verbose(dev, 187 159 "run by the same task", "child", 188 "virtual&test1&child", 10, EOK , &test1->child);160 "virtual&test1&child", 10, EOK); 189 161 } 190 162 … … 192 164 193 165 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);298 166 } 299 167
Note:
See TracChangeset
for help on using the changeset viewer.
