47,7 → 47,6 |
#include <ipc/devmap.h> |
|
#define NAME "devmap" |
#define NULL_DEVICES 256 |
|
/** Representation of device driver. |
* |
98,10 → 97,8 |
static FIBRIL_CONDVAR_INITIALIZE(devices_list_cv); |
static FIBRIL_MUTEX_INITIALIZE(drivers_list_mutex); |
static FIBRIL_MUTEX_INITIALIZE(create_handle_mutex); |
static FIBRIL_MUTEX_INITIALIZE(null_devices_mutex); |
|
static dev_handle_t last_handle = 0; |
static devmap_device_t *null_devices[NULL_DEVICES]; |
|
static dev_handle_t devmap_create_handle(void) |
{ |
546,12 → 543,12 |
|
ipc_answer_0(iid, EOK); |
|
size_t name_size = str_size(device->name); |
|
/* FIXME: |
* We have no channel from DEVMAP to client, therefore |
* sending must be initiated by client. |
* |
* size_t name_size = str_size(device->name); |
* |
* int rc = ipc_data_write_send(phone, device->name, name_size); |
* if (rc != EOK) { |
* async_wait_for(req, NULL); |
621,43 → 618,21 |
ipc_answer_1(iid, EOK, pos); |
} |
|
static void devmap_null_create(ipc_callid_t iid, ipc_call_t *icall) |
/** Initialize device mapper. |
* |
* |
*/ |
static bool devmap_init(void) |
{ |
fibril_mutex_lock(&null_devices_mutex); |
|
unsigned int i; |
bool fnd = false; |
|
for (i = 0; i < NULL_DEVICES; i++) { |
if (null_devices[i] == NULL) { |
fnd = true; |
break; |
} |
} |
|
if (!fnd) { |
fibril_mutex_unlock(&null_devices_mutex); |
ipc_answer_0(iid, ENOMEM); |
return; |
} |
|
/* Create NULL device entry */ |
devmap_device_t *device = (devmap_device_t *) malloc(sizeof(devmap_device_t)); |
if (device == NULL) { |
fibril_mutex_unlock(&null_devices_mutex); |
ipc_answer_0(iid, ENOMEM); |
return; |
} |
if (device == NULL) |
return false; |
|
char null[DEVMAP_NAME_MAXLEN]; |
snprintf(null, DEVMAP_NAME_MAXLEN, "null%u", i); |
|
device->name = str_dup(null); |
device->name = str_dup("null"); |
if (device->name == NULL) { |
fibril_mutex_unlock(&null_devices_mutex); |
free(device); |
ipc_answer_0(iid, ENOMEM); |
return; |
return false; |
} |
|
list_initialize(&(device->devices)); |
669,50 → 644,11 |
device->handle = devmap_create_handle(); |
device->driver = NULL; |
|
/* Insert device into list of all devices |
and into null devices array */ |
/* Insert device into list of all devices */ |
list_append(&device->devices, &devices_list); |
null_devices[i] = device; |
|
fibril_mutex_unlock(&devices_list_mutex); |
fibril_mutex_unlock(&null_devices_mutex); |
|
ipc_answer_1(iid, EOK, (ipcarg_t) i); |
} |
|
static void devmap_null_destroy(ipc_callid_t iid, ipc_call_t *icall) |
{ |
fibril_mutex_lock(&null_devices_mutex); |
|
ipcarg_t i = IPC_GET_ARG1(*icall); |
|
if (null_devices[i] == NULL) { |
ipc_answer_0(iid, ENOENT); |
return; |
} |
|
devmap_device_unregister_core(null_devices[i]); |
null_devices[i] = NULL; |
|
fibril_mutex_unlock(&null_devices_mutex); |
|
ipc_answer_0(iid, EOK); |
} |
|
/** Initialize device mapper. |
* |
* |
*/ |
static bool devmap_init(void) |
{ |
fibril_mutex_lock(&null_devices_mutex); |
|
unsigned int i; |
for (i = 0; i < NULL_DEVICES; i++) |
null_devices[i] = NULL; |
|
fibril_mutex_unlock(&null_devices_mutex); |
|
return true; |
} |
|
765,7 → 701,7 |
} |
} |
|
if (driver != NULL) { |
if (NULL != driver) { |
/* |
* Unregister the device driver and all its devices. |
*/ |
797,12 → 733,6 |
case DEVMAP_DEVICE_GET_NAME: |
devmap_get_name(callid, &call); |
break; |
case DEVMAP_DEVICE_NULL_CREATE: |
devmap_null_create(callid, &call); |
break; |
case DEVMAP_DEVICE_NULL_DESTROY: |
devmap_null_destroy(callid, &call); |
break; |
case DEVMAP_DEVICE_GET_COUNT: |
devmap_get_count(callid, &call); |
break; |