Changeset 9a66bc2e in mainline
- Timestamp:
- 2010-04-04T21:52:26Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8c06905
- Parents:
- 5cd136ab
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/amd64/Makefile.inc
r5cd136ab r9a66bc2e 38 38 RD_DRVS = \ 39 39 root \ 40 rootia32 40 rootia32 \ 41 pciintel 41 42 42 43 MODULES := $(notdir $(COMPONENTS)) -
uspace/Makefile
r5cd136ab r9a66bc2e 78 78 DIRS += srv/dd 79 79 DIRS += srv/drivers/rootia32 80 DIRS += srv/drivers/pciintel 80 81 # DIRS += srv/hw/bus/pci 81 82 endif -
uspace/lib/libc/generic/device/hw_res.c
r5cd136ab r9a66bc2e 52 52 hw_resources->resources = (hw_resource_t *)malloc(size); 53 53 if (NULL == hw_resources->resources) { 54 size = 0; 55 ret = false; 54 return false; 56 55 } 57 56 … … 60 59 free(hw_resources->resources); 61 60 hw_resources->resources = NULL; 62 ret =false;61 return false; 63 62 } 64 63 65 return ret;64 return true; 66 65 } 67 66 -
uspace/lib/libdrv/generic/driver.c
r5cd136ab r9a66bc2e 57 57 static driver_t *driver; 58 58 LIST_INITIALIZE(devices); 59 FIBRIL_MUTEX_INITIALIZE(devices_mutex); 59 60 60 61 static device_t * driver_create_device() … … 67 68 } 68 69 70 static void add_to_devices_list(device_t *dev) 71 { 72 fibril_mutex_lock(&devices_mutex); 73 list_append(&dev->link, &devices); 74 fibril_mutex_unlock(&devices_mutex); 75 } 76 77 static void remove_from_devices_list(device_t *dev) 78 { 79 fibril_mutex_lock(&devices_mutex); 80 list_append(&dev->link, &devices); 81 fibril_mutex_unlock(&devices_mutex); 82 } 83 69 84 static device_t * driver_get_device(link_t *devices, device_handle_t handle) 70 85 { 71 86 device_t *dev = NULL; 87 88 fibril_mutex_lock(&devices_mutex); 72 89 link_t *link = devices->next; 73 74 90 while (link != devices) { 75 91 dev = list_get_instance(link, device_t, link); 76 92 if (handle == dev->handle) { 93 fibril_mutex_unlock(&devices_mutex); 77 94 return dev; 78 95 } 79 } 96 link = link->next; 97 } 98 fibril_mutex_unlock(&devices_mutex); 80 99 81 100 return NULL; … … 86 105 printf("%s: driver_add_device\n", driver->name); 87 106 88 // result of the operation - device was added, device is not present etc. 89 ipcarg_t ret = 0; 107 // TODO device state - the driver may detect the device is not actually present 108 // (old non PnP devices) or is not working properly. 109 // We should send such information to device manager. 110 111 ipcarg_t ret; 90 112 device_handle_t dev_handle = IPC_GET_ARG1(*icall); 91 113 device_t *dev = driver_create_device(); 92 114 dev->handle = dev_handle; 93 if (driver->driver_ops->add_device(dev)) { 94 list_append(&dev->link, &devices); 95 // TODO set return value 96 } 97 printf("%s: new device with handle = %x was added.\n", driver->name, dev_handle); 98 115 add_to_devices_list(dev); 116 if (driver->driver_ops->add_device(dev)) { 117 printf("%s: new device with handle = %x was added.\n", driver->name, dev_handle); 118 ret = 1; 119 } else { 120 printf("%s: failed to add a new device with handle = %x.\n", driver->name, dev_handle); 121 remove_from_devices_list(dev); 122 // TODO delete device 123 ret = 0; 124 } 99 125 ipc_answer_1(iid, EOK, ret); 100 126 } … … 129 155 * Generic client connection handler both for applications and drivers. 130 156 * 131 * @param dr ivertrue for driver client, false for other clients (applications, services etc.).132 */ 133 static void driver_connection_gen(ipc_callid_t iid, ipc_call_t *icall, bool dr iver)157 * @param drv true for driver client, false for other clients (applications, services etc.). 158 */ 159 static void driver_connection_gen(ipc_callid_t iid, ipc_call_t *icall, bool drv) 134 160 { 135 161 // Answer the first IPC_M_CONNECT_ME_TO call and remember the handle of the device to which the client connected. 136 device_handle_t handle = IPC_GET_ARG 1(*icall);162 device_handle_t handle = IPC_GET_ARG2(*icall); 137 163 device_t *dev = driver_get_device(&devices, handle); 138 164 139 165 if (dev == NULL) { 166 printf("%s: driver_connection_gen error - no device with handle %x was found.\n", driver->name, handle); 140 167 ipc_answer_0(iid, ENOENT); 141 168 return; … … 147 174 // TODO open the device (introduce some callbacks for opening and closing devices registered by the driver) 148 175 149 ipc_answer_0(iid, EOK); 176 printf("%s: driver_connection_gen: accepting connection.\n", driver->name); 177 ipc_answer_0(iid, EOK); 150 178 151 179 while (1) { … … 153 181 ipc_call_t call; 154 182 183 printf("%s: driver_connection_gen: waiting for call.\n", driver->name); 155 184 callid = async_get_call(&call); 156 185 ipcarg_t method = IPC_GET_METHOD(call); … … 166 195 if (!is_valid_iface_id(method)) { 167 196 // this is not device's interface 197 printf("%s: driver_connection_gen error - invalid interface id %x.", driver->name, method); 168 198 ipc_answer_0(callid, ENOTSUP); 169 199 break; … … 175 205 void *iface = device_get_iface(dev, method); 176 206 if (NULL == iface) { 207 printf("%s: driver_connection_gen error - ", driver->name); 208 printf("device with handle %x has no interface with id %x.\n", handle, method); 177 209 ipc_answer_0(callid, ENOTSUP); 178 210 break; … … 188 220 if (NULL == iface_method_ptr) { 189 221 // the interface has not such method 222 printf("%s: driver_connection_gen error - invalid interface method.", driver->name); 190 223 ipc_answer_0(callid, ENOTSUP); 191 224 break; … … 203 236 static void driver_connection_driver(ipc_callid_t iid, ipc_call_t *icall) 204 237 { 238 printf("%s: driver_connection_driver\n", driver->name); 205 239 driver_connection_gen(iid, icall, true); 206 240 } … … 208 242 static void driver_connection_client(ipc_callid_t iid, ipc_call_t *icall) 209 243 { 244 printf("%s: driver_connection_client\n", driver->name); 210 245 driver_connection_gen(iid, icall, false); 211 246 } … … 244 279 assert(NULL != child->name); 245 280 281 add_to_devices_list(child); 246 282 if (EOK == devman_child_device_register(child->name, &child->match_ids, parent->handle, &child->handle)) { 247 283 return true; 248 284 } 285 remove_from_devices_list(child); 249 286 return false; 250 287 } -
uspace/lib/libdrv/include/driver.h
r5cd136ab r9a66bc2e 80 80 device_handle_t handle; 81 81 /** The phone to the parent device driver.*/ 82 i pcarg_t parent_phone;82 int parent_phone; 83 83 /** The device's name.*/ 84 84 const char *name; -
uspace/srv/devman/main.c
r5cd136ab r9a66bc2e 258 258 } 259 259 260 static void devman_forward(ipc_callid_t iid, ipc_call_t *icall, bool drv_to_parent) { 261 device_handle_t handle; 260 static void devman_forward(ipc_callid_t iid, ipc_call_t *icall, bool drv_to_parent) { 261 262 device_handle_t handle = IPC_GET_ARG2(*icall); 263 printf(NAME ": devman_forward - trying to forward connection to device with handle %x.\n", handle); 264 262 265 node_t *dev = find_dev_node(&device_tree, handle); 263 266 if (NULL == dev) { 267 printf(NAME ": devman_forward error - no device with handle %x was found.\n", handle); 264 268 ipc_answer_0(iid, ENOENT); 265 269 return; … … 269 273 270 274 if (drv_to_parent) { 271 driver = dev->parent->drv; 275 if (NULL != dev->parent) { 276 driver = dev->parent->drv; 277 } 272 278 } else { 273 279 driver = dev->drv; 274 280 } 275 281 276 if (NULL == driver) { 282 if (NULL == driver) { 283 printf(NAME ": devman_forward error - no driver to connect to.\n", handle); 277 284 ipc_answer_0(iid, ENOENT); 278 285 return; … … 286 293 } 287 294 295 if (driver->phone <= 0) { 296 printf(NAME ": devman_forward: cound not forward to driver %s (the driver's phone is %x).\n", driver->name, driver->phone); 297 return; 298 } 299 printf(NAME ": devman_forward: forward to driver %s with phone %d.\n", driver->name, driver->phone); 288 300 ipc_forward_fast(iid, driver->phone, method, dev->handle, 0, IPC_FF_NONE); 289 301 } -
uspace/srv/drivers/rootia32/rootia32.c
r5cd136ab r9a66bc2e 50 50 #include <ipc/devman.h> 51 51 #include <ipc/dev_iface.h> 52 #include <resource.h> 52 53 53 54 #define NAME "rootia32" 54 55 55 typedef struct rootia32_ dev_data {56 typedef struct rootia32_child_dev_data { 56 57 hw_resource_list_t hw_resources; 57 } rootia32_ dev_data_t;58 } rootia32_child_dev_data_t; 58 59 59 60 static bool rootia32_add_device(device_t *dev); … … 82 83 }; 83 84 84 static rootia32_ dev_data_t pci_data = {85 static rootia32_child_dev_data_t pci_data = { 85 86 .hw_resources = { 86 87 1, … … 89 90 }; 90 91 92 static hw_resource_list_t * rootia32_get_child_resources(device_t *dev) 93 { 94 rootia32_child_dev_data_t *data = (rootia32_child_dev_data_t *)dev->driver_data; 95 if (NULL == data) { 96 return NULL; 97 } 98 return &data->hw_resources; 99 } 100 101 static bool rootia32_enable_child_interrupt(device_t *dev) 102 { 103 // TODO 104 105 return false; 106 } 107 108 static resource_iface_t child_res_iface = { 109 &rootia32_get_child_resources, 110 &rootia32_enable_child_interrupt 111 }; 112 91 113 static bool rootia32_add_child( 92 114 device_t *parent, const char *name, const char *str_match_id, 93 rootia32_ dev_data_t *drv_data)115 rootia32_child_dev_data_t *drv_data) 94 116 { 95 117 printf(NAME ": adding new child device '%s'.\n", name); … … 113 135 match_id->score = 100; 114 136 add_match_id(&child->match_ids, match_id); 137 138 // add an interface to the device 139 device_set_iface(child, HW_RES_DEV_IFACE, &child_res_iface); 115 140 116 141 // register child device … … 151 176 if (!rootia32_add_children(dev)) { 152 177 printf(NAME ": failed to add child devices for platform ia32.\n"); 153 return false;154 178 } 155 179
Note:
See TracChangeset
for help on using the changeset viewer.