Changeset bda60d9 in mainline for uspace/srv
- Timestamp:
- 2010-03-19T14:40:14Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d347b53
- Parents:
- 7707954
- Location:
- uspace/srv
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r7707954 rbda60d9 320 320 node_t *node = create_dev_node(); 321 321 if (node) { 322 insert_dev_node(tree, node, NULL);322 insert_dev_node(tree, node, "", NULL); 323 323 match_id_t *id = create_match_id(); 324 324 id->id = "root"; … … 410 410 } 411 411 412 /** Find device driver in the list of device drivers. 413 * 414 * @param drv_list the list of device drivers. 415 * @param drv_name the name of the device driver which is searched. 416 * @return the device driver of the specified name, if it is in the list, NULL otherwise. 417 */ 412 418 driver_t * find_driver(driver_list_t *drv_list, const char *drv_name) 413 419 { … … 432 438 } 433 439 440 /** Remember the driver's phone. 441 * @param driver the driver. 442 * @param phone the phone to the driver. 443 */ 434 444 void set_driver_phone(driver_t *driver, ipcarg_t phone) 435 445 { … … 467 477 } 468 478 469 /** Finish the initialization of a driver after it has succesfully started and registered itself by the device manager. 479 /** Finish the initialization of a driver after it has succesfully started 480 * and after it has registered itself by the device manager. 470 481 * 471 482 * Pass devices formerly matched to the driver to the driver and remember the driver is running and fully functional now. … … 559 570 printf(NAME ": init_device_tree.\n"); 560 571 572 memset(tree->node_map, 0, MAX_DEV * sizeof(node_t *)); 573 561 574 atomic_set(&tree->current_handle, 0); 562 575 … … 570 583 } 571 584 585 /** Create and set device's full path in device tree. 586 * 587 * @param node the device's device node. 588 * @param parent the parent device node. 589 * @return true on success, false otherwise (insufficient resources etc.). 590 */ 591 static bool set_dev_path(node_t *node, node_t *parent) 592 { 593 assert(NULL != node->name); 594 595 size_t pathsize = (str_size(node->name) + 1); 596 if (NULL != parent) { 597 pathsize += str_size(parent->name) + 1; 598 } 599 600 if (NULL == (node->pathname = (char *)malloc(pathsize))) { 601 printf(NAME ": failed to allocate device path.\n"); 602 return false; 603 } 604 605 if (NULL != parent) { 606 str_cpy(node->pathname, pathsize, parent->pathname); 607 str_append(node->pathname, pathsize, "/"); 608 str_append(node->pathname, pathsize, node->name); 609 } else { 610 str_cpy(node->pathname, pathsize, node->name); 611 } 612 613 return true; 614 } 615 616 /** Insert new device into device tree. 617 * 618 * @param tree the device tree. 619 * @param node the newly added device node. 620 * @param dev_name the name of the newly added device. 621 * @param parent the parent device node. 622 * @return true on success, false otherwise (insufficient resources etc.). 623 */ 624 bool insert_dev_node(dev_tree_t *tree, node_t *node, const char *dev_name, node_t *parent) 625 { 626 printf(NAME ": insert_dev_node\n"); 627 628 assert(NULL != node && NULL != tree && dev_name != NULL); 629 630 node->name = dev_name; 631 if (!set_dev_path(node, parent)) { 632 return false; 633 } 634 635 // add the node to the handle-to-node map 636 node->handle = atomic_postinc(&tree->current_handle); 637 if (node->handle >= MAX_DEV) { 638 printf(NAME ": failed to add device to device tree, because maximum number of devices was reached.\n"); 639 free(node->pathname); 640 node->pathname = NULL; 641 atomic_postdec(&tree->current_handle); 642 return false; 643 } 644 tree->node_map[node->handle] = node; 645 646 // add the node to the list of its parent's children 647 node->parent = parent; 648 if (NULL != parent) { 649 fibril_mutex_lock(&parent->children_mutex); 650 list_append(&node->sibling, &parent->children); 651 fibril_mutex_unlock(&parent->children_mutex); 652 } 653 return true; 654 } 655 572 656 /** @} 573 657 */ -
uspace/srv/devman/devman.h
r7707954 rbda60d9 40 40 #include <adt/list.h> 41 41 #include <ipc/ipc.h> 42 #include <ipc/devman.h> 42 43 #include <fibril_synch.h> 43 44 #include <atomic.h> … … 48 49 49 50 #define MATCH_EXT ".ma" 51 #define MAX_DEV 256 50 52 51 53 struct node; 52 54 53 55 typedef struct node node_t; 54 55 /** Ids of device models used for device-to-driver matching.56 */57 typedef struct match_id {58 /** Pointers to next and previous ids.59 */60 link_t link;61 /** Id of device model.62 */63 const char *id;64 /** Relevancy of device-to-driver match.65 * The higher is the product of scores specified for the device by the bus driver and by the leaf driver,66 * the more suitable is the leaf driver for handling the device.67 */68 unsigned int score;69 } match_id_t;70 71 /** List of ids for matching devices to drivers sorted72 * according to match scores in descending order.73 */74 typedef struct match_id_list {75 link_t ids;76 } match_id_list_t;77 56 78 57 typedef enum { … … 117 96 struct node { 118 97 /** The global unique identifier of the device.*/ 119 long handle; 98 device_handle_t handle; 99 /** The name of the device specified by its parent. */ 100 char *name; 101 /** Full path and name of the device in device hierarchi (i. e. in full path in device tree).*/ 102 char *pathname; 120 103 /** The node of the parent device. */ 121 104 node_t *parent; … … 140 123 /** Root device node. */ 141 124 node_t *root_node; 125 /** The next available handle - handles are assigned in a sequential manner.*/ 142 126 atomic_t current_handle; 127 /** Handle-to-node mapping. */ 128 node_t * node_map[MAX_DEV]; 143 129 } dev_tree_t; 144 130 … … 152 138 bool read_match_ids(const char *conf_path, match_id_list_t *ids); 153 139 char * read_id(const char **buf) ; 154 void add_match_id(match_id_list_t *ids, match_id_t *id);155 156 void clean_match_ids(match_id_list_t *ids);157 158 159 static inline match_id_t * create_match_id()160 {161 match_id_t *id = malloc(sizeof(match_id_t));162 memset(id, 0, sizeof(match_id_t));163 return id;164 }165 166 static inline void delete_match_id(match_id_t *id)167 {168 if (id) {169 free_not_null(id->id);170 free(id);171 }172 }173 174 175 176 177 140 178 141 // Drivers … … 248 211 } 249 212 250 static inline void insert_dev_node(dev_tree_t *tree, node_t *node, node_t *parent) 251 { 252 assert(NULL != node && NULL != tree); 253 254 node->handle = atomic_postinc(&tree->current_handle); 255 256 node->parent = parent; 257 if (NULL != parent) { 258 fibril_mutex_lock(&parent->children_mutex); 259 list_append(&node->sibling, &parent->children); 260 fibril_mutex_unlock(&parent->children_mutex); 213 static inline node_t * find_dev_node(dev_tree_t *tree, long handle) 214 { 215 if (handle < MAX_DEV) { 216 return tree->node_map[handle]; 261 217 } 262 } 263 218 return NULL; 219 } 264 220 265 221 // Device tree … … 267 223 bool init_device_tree(dev_tree_t *tree, driver_list_t *drivers_list); 268 224 bool create_root_node(dev_tree_t *tree); 269 225 bool insert_dev_node(dev_tree_t *tree, node_t *node, const char *dev_name, node_t *parent); 270 226 271 227 #endif -
uspace/srv/devman/main.c
r7707954 rbda60d9 120 120 } 121 121 122 static void devman_add_child(ipc_callid_t callid, ipc_call_t *call, driver_t *driver) 123 { 124 printf(NAME ": devman_add_child\n"); 125 126 // TODO 127 128 } 129 122 130 /** Function for handling connections to device manager. 123 131 * … … 145 153 continue; 146 154 case DEVMAN_ADD_CHILD_DEVICE: 147 // TODO add new device node to the device tree155 devman_add_child(callid, &call, driver); 148 156 break; 149 157 default: -
uspace/srv/devman/match.c
r7707954 rbda60d9 89 89 } 90 90 91 void add_match_id(match_id_list_t *ids, match_id_t *id)92 {93 match_id_t *mid = NULL;94 link_t *link = ids->ids.next;95 96 while (link != &ids->ids) {97 mid = list_get_instance(link, match_id_t,link);98 if (mid->score < id->score) {99 break;100 }101 link = link->next;102 }103 104 list_insert_before(&id->link, link);105 }106 91 107 void clean_match_ids(match_id_list_t *ids)108 {109 link_t *link = NULL;110 match_id_t *id;111 112 while(!list_empty(&ids->ids)) {113 link = ids->ids.next;114 list_remove(link);115 id = list_get_instance(link, match_id_t, link);116 delete_match_id(id);117 }118 }119 92 -
uspace/srv/drivers/root/root.c
r7707954 rbda60d9 44 44 #include <string.h> 45 45 #include <ctype.h> 46 #include <macros.h> 46 47 47 48 #include <driver.h> … … 63 64 }; 64 65 66 static bool add_platform_child(device_t *parent) { 67 printf(NAME ": adding new child for platform device.\n"); 68 69 device_t *platform = NULL; 70 match_id_t *match_id = NULL; 71 72 // create new device 73 if (NULL == (platform = create_device())) { 74 goto failure; 75 } 76 77 // TODO - replace this with some better solution 78 platform->name = STRING(UARCH); 79 printf(NAME ": the new device's name is %s.\n", platform->name); 80 81 // initialize match id list 82 if (NULL == (match_id = create_match_id())) { 83 goto failure; 84 } 85 match_id->id = platform->name; 86 match_id->score = 100; 87 add_match_id(&platform->match_ids, match_id); 88 89 // register child device 90 if (!child_device_register(platform, parent)) { 91 goto failure; 92 } 93 94 return true; 95 96 failure: 97 if (NULL != match_id) { 98 match_id->id = NULL; 99 } 100 101 if (NULL != platform) { 102 platform->name = NULL; 103 delete_device(platform); 104 } 105 106 return false; 107 } 108 65 109 static bool root_add_device(device_t *dev) 66 110 { 67 printf(NAME ": root_add_device, device handle = %s", dev->handle); 68 // TODO add root device and register its children 111 printf(NAME ": root_add_device, device handle = %d\n", dev->handle); 112 113 // register root device's children 114 if (!add_platform_child(dev)) { 115 return false; 116 } 117 69 118 return true; 70 119 } … … 90 139 * @} 91 140 */ 141
Note:
See TracChangeset
for help on using the changeset viewer.