Changes in uspace/lib/c/generic/devman.c [e72fb34:692c40cb] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/devman.c
re72fb34 r692c40cb 28 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 29 */ 30 31 /** @addtogroup libc30 31 /** @addtogroup libc 32 32 * @{ 33 33 */ … … 37 37 #include <str.h> 38 38 #include <stdio.h> 39 #include <ipc/ipc.h> 39 40 #include <ipc/services.h> 40 41 #include <ipc/devman.h> 41 42 #include <devman.h> 42 43 #include <async.h> 43 #include <fibril_synch.h>44 44 #include <errno.h> 45 45 #include <malloc.h> … … 50 50 static int devman_phone_client = -1; 51 51 52 static FIBRIL_MUTEX_INITIALIZE(devman_phone_mutex);53 54 52 int devman_get_phone(devman_interface_t iface, unsigned int flags) 55 53 { 56 54 switch (iface) { 57 55 case DEVMAN_DRIVER: 58 fibril_mutex_lock(&devman_phone_mutex); 59 if (devman_phone_driver >= 0) { 60 fibril_mutex_unlock(&devman_phone_mutex); 56 if (devman_phone_driver >= 0) 61 57 return devman_phone_driver; 62 }63 58 64 59 if (flags & IPC_FLAG_BLOCKING) 65 devman_phone_driver = async_connect_me_to_blocking(66 PHONE_NS,SERVICE_DEVMAN, DEVMAN_DRIVER, 0);60 devman_phone_driver = ipc_connect_me_to_blocking(PHONE_NS, 61 SERVICE_DEVMAN, DEVMAN_DRIVER, 0); 67 62 else 68 devman_phone_driver = async_connect_me_to(PHONE_NS,63 devman_phone_driver = ipc_connect_me_to(PHONE_NS, 69 64 SERVICE_DEVMAN, DEVMAN_DRIVER, 0); 70 65 71 fibril_mutex_unlock(&devman_phone_mutex);72 66 return devman_phone_driver; 73 67 case DEVMAN_CLIENT: 74 fibril_mutex_lock(&devman_phone_mutex); 75 if (devman_phone_client >= 0) { 76 fibril_mutex_unlock(&devman_phone_mutex); 68 if (devman_phone_client >= 0) 77 69 return devman_phone_client; 78 } 79 80 if (flags & IPC_FLAG_BLOCKING) { 81 devman_phone_client = async_connect_me_to_blocking( 82 PHONE_NS, SERVICE_DEVMAN, DEVMAN_CLIENT, 0); 83 } else { 84 devman_phone_client = async_connect_me_to(PHONE_NS, 70 71 if (flags & IPC_FLAG_BLOCKING) 72 devman_phone_client = ipc_connect_me_to_blocking(PHONE_NS, 85 73 SERVICE_DEVMAN, DEVMAN_CLIENT, 0); 86 } 87 88 fibril_mutex_unlock(&devman_phone_mutex); 74 else 75 devman_phone_client = ipc_connect_me_to(PHONE_NS, 76 SERVICE_DEVMAN, DEVMAN_CLIENT, 0); 77 89 78 return devman_phone_client; 90 79 default: … … 106 95 aid_t req = async_send_2(phone, DEVMAN_DRIVER_REGISTER, 0, 0, &answer); 107 96 108 sysarg_t retval = async_data_write_start(phone, name, str_size(name));97 ipcarg_t retval = async_data_write_start(phone, name, str_size(name)); 109 98 if (retval != EOK) { 110 99 async_wait_for(req, NULL); … … 115 104 async_set_client_connection(conn); 116 105 117 async_connect_to_me(phone, 0, 0, 0, NULL); 106 ipcarg_t callback_phonehash; 107 ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash); 118 108 async_wait_for(req, &retval); 119 109 … … 123 113 } 124 114 125 static int devman_send_match_id(int phone, match_id_t *match_id) 126 { 127 ipc_call_t answer; 128 129 aid_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, 130 &answer); 131 int retval = async_data_write_start(phone, match_id->id, 132 str_size(match_id->id)); 133 134 async_wait_for(req, NULL); 135 return retval; 136 } 137 138 139 static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 115 static int devman_send_match_id(int phone, match_id_t *match_id) \ 116 { 117 ipc_call_t answer; 118 async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer); 119 int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id)); 120 return retval; 121 } 122 123 124 static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 140 125 { 141 126 link_t *link = match_ids->ids.next; 142 127 match_id_t *match_id = NULL; 143 128 int ret = EOK; 144 129 145 130 while (link != &match_ids->ids) { 146 131 match_id = list_get_instance(link, match_id_t, link); 147 ret = devman_send_match_id(phone, match_id);148 if (ret != EOK){149 return ret;150 }151 132 if (EOK != (ret = devman_send_match_id(phone, match_id))) 133 { 134 printf("Driver failed to send match id, error number = %d\n", ret); 135 return ret; 136 } 152 137 link = link->next; 153 138 } 154 155 return ret; 156 } 157 158 /** Add function to a device. 159 * 160 * Request devman to add a new function to the specified device owned by 161 * this driver task. 162 * 163 * @param name Name of the new function 164 * @param ftype Function type, fun_inner or fun_exposed 165 * @param match_ids Match IDs (should be empty for fun_exposed) 166 * @param devh Devman handle of the device 167 * @param funh Place to store handle of the new function 168 * 169 * @return EOK on success or negative error code. 170 */ 171 int devman_add_function(const char *name, fun_type_t ftype, 172 match_id_list_t *match_ids, devman_handle_t devh, devman_handle_t *funh) 173 { 139 return ret; 140 } 141 142 int devman_child_device_register( 143 const char *name, match_id_list_t *match_ids, device_handle_t parent_handle, device_handle_t *handle) 144 { 174 145 int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING); 175 int fun_handle; 176 177 if (phone < 0) 178 return phone; 179 180 async_serialize_start(); 181 182 int match_count = list_count(&match_ids->ids); 183 ipc_call_t answer; 184 185 aid_t req = async_send_3(phone, DEVMAN_ADD_FUNCTION, (sysarg_t) ftype, 186 devh, match_count, &answer); 187 188 sysarg_t retval = async_data_write_start(phone, name, str_size(name)); 189 if (retval != EOK) { 190 async_wait_for(req, NULL); 191 async_serialize_end(); 192 return retval; 193 } 194 195 int match_ids_rc = devman_send_match_ids(phone, match_ids); 196 197 async_wait_for(req, &retval); 198 199 async_serialize_end(); 200 201 /* Prefer the answer to DEVMAN_ADD_FUNCTION in case of errors. */ 202 if ((match_ids_rc != EOK) && (retval == EOK)) { 203 retval = match_ids_rc; 204 } 205 206 if (retval == EOK) 207 fun_handle = (int) IPC_GET_ARG1(answer); 208 else 209 fun_handle = -1; 210 211 *funh = fun_handle; 212 146 147 if (phone < 0) 148 return phone; 149 150 async_serialize_start(); 151 152 int match_count = list_count(&match_ids->ids); 153 ipc_call_t answer; 154 aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer); 155 156 ipcarg_t retval = async_data_write_start(phone, name, str_size(name)); 157 if (retval != EOK) { 158 async_wait_for(req, NULL); 159 async_serialize_end(); 160 return retval; 161 } 162 163 devman_send_match_ids(phone, match_ids); 164 165 async_wait_for(req, &retval); 166 167 async_serialize_end(); 168 169 if (retval != EOK) { 170 if (handle != NULL) { 171 *handle = -1; 172 } 173 return retval; 174 } 175 176 if (handle != NULL) 177 *handle = (int) IPC_GET_ARG1(answer); 178 213 179 return retval; 214 180 } 215 181 216 int devman_add_device_to_class(devman_handle_t devman_handle, 217 const char *class_name) 182 int devman_add_device_to_class(device_handle_t dev_handle, const char *class_name) 218 183 { 219 184 int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING); … … 224 189 async_serialize_start(); 225 190 ipc_call_t answer; 226 aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, 227 devman_handle, &answer); 228 229 sysarg_t retval = async_data_write_start(phone, class_name, 230 str_size(class_name)); 231 if (retval != EOK) { 232 async_wait_for(req, NULL); 233 async_serialize_end(); 234 return retval; 235 } 236 237 async_wait_for(req, &retval); 238 async_serialize_end(); 239 240 return retval; 191 aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, dev_handle, &answer); 192 193 ipcarg_t retval = async_data_write_start(phone, class_name, str_size(class_name)); 194 if (retval != EOK) { 195 async_wait_for(req, NULL); 196 async_serialize_end(); 197 return retval; 198 } 199 200 async_wait_for(req, &retval); 201 async_serialize_end(); 202 203 return retval; 241 204 } 242 205 … … 246 209 case DEVMAN_DRIVER: 247 210 if (devman_phone_driver >= 0) { 248 async_hangup(devman_phone_driver);211 ipc_hangup(devman_phone_driver); 249 212 devman_phone_driver = -1; 250 213 } … … 252 215 case DEVMAN_CLIENT: 253 216 if (devman_phone_client >= 0) { 254 async_hangup(devman_phone_client);217 ipc_hangup(devman_phone_client); 255 218 devman_phone_client = -1; 256 219 } … … 261 224 } 262 225 263 int devman_device_connect(dev man_handle_t handle, unsigned int flags)226 int devman_device_connect(device_handle_t handle, unsigned int flags) 264 227 { 265 228 int phone; 266 229 267 230 if (flags & IPC_FLAG_BLOCKING) { 268 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,231 phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN, 269 232 DEVMAN_CONNECT_TO_DEVICE, handle); 270 233 } else { 271 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,234 phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN, 272 235 DEVMAN_CONNECT_TO_DEVICE, handle); 273 236 } … … 276 239 } 277 240 278 int devman_parent_device_connect(dev man_handle_t handle, unsigned int flags)241 int devman_parent_device_connect(device_handle_t handle, unsigned int flags) 279 242 { 280 243 int phone; 281 244 282 245 if (flags & IPC_FLAG_BLOCKING) { 283 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,246 phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN, 284 247 DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle); 285 248 } else { 286 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,249 phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN, 287 250 DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle); 288 251 } … … 291 254 } 292 255 293 int devman_device_get_handle(const char *pathname, devman_handle_t *handle, 294 unsigned int flags) 256 int devman_device_get_handle(const char *pathname, device_handle_t *handle, unsigned int flags) 295 257 { 296 258 int phone = devman_get_phone(DEVMAN_CLIENT, flags); … … 305 267 &answer); 306 268 307 sysarg_t retval = async_data_write_start(phone, pathname, 308 str_size(pathname)); 269 ipcarg_t retval = async_data_write_start(phone, pathname, str_size(pathname)); 309 270 if (retval != EOK) { 310 271 async_wait_for(req, NULL); … … 319 280 if (retval != EOK) { 320 281 if (handle != NULL) 321 *handle = (dev man_handle_t) -1;282 *handle = (device_handle_t) -1; 322 283 return retval; 323 284 } 324 285 325 286 if (handle != NULL) 326 *handle = (dev man_handle_t) IPC_GET_ARG1(answer);287 *handle = (device_handle_t) IPC_GET_ARG1(answer); 327 288 328 289 return retval; 329 290 } 330 291 331 int devman_device_get_handle_by_class(const char *classname,332 const char *devname, devman_handle_t *handle, unsigned int flags)333 {334 int phone = devman_get_phone(DEVMAN_CLIENT, flags);335 336 if (phone < 0)337 return phone;338 339 async_serialize_start();340 341 ipc_call_t answer;342 aid_t req = async_send_1(phone, DEVMAN_DEVICE_GET_HANDLE_BY_CLASS,343 flags, &answer);344 345 sysarg_t retval = async_data_write_start(phone, classname,346 str_size(classname));347 if (retval != EOK) {348 async_wait_for(req, NULL);349 async_serialize_end();350 return retval;351 }352 retval = async_data_write_start(phone, devname,353 str_size(devname));354 if (retval != EOK) {355 async_wait_for(req, NULL);356 async_serialize_end();357 return retval;358 }359 360 async_wait_for(req, &retval);361 362 async_serialize_end();363 364 if (retval != EOK) {365 if (handle != NULL)366 *handle = (devman_handle_t) -1;367 return retval;368 }369 370 if (handle != NULL)371 *handle = (devman_handle_t) IPC_GET_ARG1(answer);372 373 return retval;374 }375 376 292 377 293 /** @}
Note:
See TracChangeset
for help on using the changeset viewer.