Changeset bda60d9 in mainline for uspace/lib
- Timestamp:
- 2010-03-19T14:40:14Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d347b53
- Parents:
- 7707954
- Location:
- uspace/lib
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/devman.c
r7707954 rbda60d9 106 106 } 107 107 108 int devman_child_device_register(const char *name, long parent_handle, long *handle) 108 int devman_child_device_register( 109 const char *name, match_id_list_t *match_ids, device_handle_t parent_handle, device_handle_t *handle) 109 110 { 110 111 int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING); … … 124 125 return retval; 125 126 } 127 128 // TODO match ids 126 129 127 130 async_wait_for(req, &retval); -
uspace/lib/libc/include/devman.h
r7707954 rbda60d9 46 46 47 47 int devman_driver_register(const char *, async_client_conn_t); 48 int devman_child_device_register(const char * name, long parent_handle, long *handle);48 int devman_child_device_register(const char *, match_id_list_t *, device_handle_t, device_handle_t *); 49 49 50 50 -
uspace/lib/libc/include/ipc/devman.h
r7707954 rbda60d9 34 34 #define LIBC_IPC_DEVMAN_H_ 35 35 36 #include <adt/list.h> 36 37 #include <ipc/ipc.h> 38 #include <stdlib.h> 39 #include <string.h> 37 40 38 41 #define DEVMAN_NAME_MAXLEN 256 42 43 typedef ipcarg_t device_handle_t; 44 45 /** Ids of device models used for device-to-driver matching. 46 */ 47 typedef struct match_id { 48 /** Pointers to next and previous ids. 49 */ 50 link_t link; 51 /** Id of device model. 52 */ 53 const char *id; 54 /** Relevancy of device-to-driver match. 55 * The higher is the product of scores specified for the device by the bus driver and by the leaf driver, 56 * the more suitable is the leaf driver for handling the device. 57 */ 58 unsigned int score; 59 } match_id_t; 60 61 /** List of ids for matching devices to drivers sorted 62 * according to match scores in descending order. 63 */ 64 typedef struct match_id_list { 65 link_t ids; 66 } match_id_list_t; 67 68 69 static inline match_id_t * create_match_id() 70 { 71 match_id_t *id = malloc(sizeof(match_id_t)); 72 memset(id, 0, sizeof(match_id_t)); 73 return id; 74 } 75 76 static inline void delete_match_id(match_id_t *id) 77 { 78 if (id) { 79 if (NULL != id->id) { 80 free(id->id); 81 } 82 free(id); 83 } 84 } 85 86 static inline void add_match_id(match_id_list_t *ids, match_id_t *id) 87 { 88 match_id_t *mid = NULL; 89 link_t *link = ids->ids.next; 90 91 while (link != &ids->ids) { 92 mid = list_get_instance(link, match_id_t,link); 93 if (mid->score < id->score) { 94 break; 95 } 96 link = link->next; 97 } 98 99 list_insert_before(&id->link, link); 100 } 101 102 static inline void clean_match_ids(match_id_list_t *ids) 103 { 104 link_t *link = NULL; 105 match_id_t *id; 106 107 while(!list_empty(&ids->ids)) { 108 link = ids->ids.next; 109 list_remove(link); 110 id = list_get_instance(link, match_id_t, link); 111 delete_match_id(id); 112 } 113 } 39 114 40 115 typedef enum { -
uspace/lib/libdrv/generic/driver.c
r7707954 rbda60d9 72 72 // result of the operation - device was added, device is not present etc. 73 73 ipcarg_t ret = 0; 74 ipcarg_t dev_handle = IPC_GET_ARG1(*icall);74 device_handle_t dev_handle = IPC_GET_ARG1(*icall); 75 75 76 76 printf("%s: adding device with handle = %x \n", driver->name, dev_handle); … … 109 109 ipc_answer_0(callid, ENOENT); 110 110 } 111 } 112 111 } 113 112 } 114 113 … … 150 149 } 151 150 152 bool child_device_register(device_t *child, const char *child_name,device_t *parent)151 bool child_device_register(device_t *child, device_t *parent) 153 152 { 154 if (devman_child_device_register(child_name, parent->handle, &child->handle)) { 153 printf("%s: child_device_register\n", driver->name); 154 155 assert(NULL != child->name); 156 157 if (devman_child_device_register(child->name, &child->match_ids, parent->handle, &child->handle)) { 155 158 // TODO initialize child device 156 159 return true; -
uspace/lib/libdrv/include/driver.h
r7707954 rbda60d9 37 37 38 38 #include <adt/list.h> 39 #include <ipc/devman.h> 39 40 40 41 typedef struct device { 41 longhandle;42 device_handle_t handle; 42 43 ipcarg_t parent_phone; 44 const char *name; 45 match_id_list_t match_ids; 43 46 44 47 // TODO add more items - parent bus type etc. … … 64 67 if (NULL != dev) { 65 68 memset(dev, 0, sizeof(device_t)); 66 } 67 69 } 70 list_initialize(&dev->match_ids.ids); 68 71 return dev; 69 72 } 70 73 71 bool child_device_register(device_t *child, const char *child_name, device_t *parent); 74 static inline delete_device(device_t *dev) { 75 clean_match_ids(&dev->match_ids); 76 if (NULL != dev->name) { 77 free(dev->name); 78 } 79 free(dev); 80 } 72 81 82 bool child_device_register(device_t *child, device_t *parent); 73 83 74 84
Note:
See TracChangeset
for help on using the changeset viewer.