<net/if_ether.h>
[minix3.git] / servers / devman / bind.c
blob298a356ee05481fbbe596ee39a0bc6ac9a5a07cc
1 #include "devman.h"
2 #include "proto.h"
4 /*****************************************************************************
5 * do_bind_device *
6 ****************************************************************************/
7 int do_bind_device(message *m)
9 struct devman_device *dev;
10 int res;
11 endpoint_t src = m->m_source;
13 /* check if msg comes from RS */
14 if (src != RS_PROC_NR) {
15 m->DEVMAN_RESULT = EPERM;
16 printf("[W] could bind message from somebody else than RS\n");
18 return 0;
19 } else {
20 /* get the device */
21 dev = devman_find_device(m->DEVMAN_DEVICE_ID);
22 /* bind device at device provider*/
23 if (dev != NULL) {
24 m->m_type = DEVMAN_BIND;
25 /* ...device ID and endpoint is still set */
27 #ifdef DEBUG
28 printf("devman: bind call to %d for dev %d\n",
29 dev->owner, m->DEVMAN_DEVICE_ID);
30 #endif
32 res = ipc_sendrec(dev->owner, m);
33 if (res != OK) {
34 printf("[W] devman.do_bind_device(): could not send "
35 "message to device owner (%d)\n", res);
36 m->DEVMAN_RESULT= res;
37 } else if (m->DEVMAN_RESULT != OK) {
38 printf("[W] devman.do_bind_device(): driver could"
39 " not bind device (%ld)\n", m->DEVMAN_RESULT);
40 } else {
41 dev->state = DEVMAN_DEVICE_BOUND;
42 devman_get_device(dev);
44 } else {
45 m->DEVMAN_RESULT = ENODEV;
47 m->m_type = DEVMAN_REPLY;
48 ipc_send(RS_PROC_NR, m);
50 return 0;
53 /*****************************************************************************
54 * do_unbind_device *
55 ****************************************************************************/
56 int do_unbind_device(message *m)
58 struct devman_device *dev;
59 int res;
60 endpoint_t src = m->m_source;
62 /* check if msg comes from RS */
63 if (src != RS_PROC_NR) {
64 m->DEVMAN_RESULT = EPERM;
65 printf("[W] devman.do_unbind_device(): unbind message from somebody"
66 "else than RS (%d)\n", src);
67 return 0;
68 } else {
69 /* get the device */
70 dev = devman_find_device(m->DEVMAN_DEVICE_ID);
71 /* bind device at device provider*/
72 if (dev != NULL) {
74 m->m_type = DEVMAN_UNBIND;
75 /* ...device ID and endpoint is still set */
76 #ifdef DEBUG
77 printf("devman: unbind call to %d for dev %d\n",
78 dev->owner, m->DEVMAN_DEVICE_ID);
79 #endif
80 res = ipc_sendrec(dev->owner, m);
81 if (res != OK) {
82 printf("[W] devman.do_unbind_device(): could not send "
83 "message to device owner (%d)\n", res);
84 m->DEVMAN_RESULT= res;
85 } else if (m->DEVMAN_RESULT != OK && m->DEVMAN_RESULT != 19) {
86 /* device drive deleted device already? */
87 printf("[W] devman.do_unbind_device(): driver could"
88 " not unbind device (%ld)\n", m->DEVMAN_RESULT);
89 } else {
90 if (dev->state != DEVMAN_DEVICE_ZOMBIE) {
91 dev->state = DEVMAN_DEVICE_UNBOUND;
93 devman_put_device(dev);
94 m->DEVMAN_RESULT = OK;
96 } else {
97 /* this might be the case, but perhaps its better to keep
98 the device in the db as long a driver is bound to it*/
99 m->DEVMAN_RESULT = ENODEV;
101 m->m_type = DEVMAN_REPLY;
102 ipc_send(RS_PROC_NR, m);
104 return 0;