freebsd compat. layer: close() and free().

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21078 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-05-09 01:28:02 +00:00
parent 9628dc45e2
commit 100b6e6537
2 changed files with 24 additions and 9 deletions
+22 -9
View File
@@ -48,7 +48,8 @@ allocate_device(driver_t *driver)
snprintf(semName, sizeof(semName), "%s rcv", gDriverName);
dev->softc = _kernel_malloc(driver->softc_size, M_ZERO);
dev->softc_size = driver->softc_size;
dev->softc = malloc(driver->softc_size);
if (dev->softc == NULL) {
free(dev);
return NULL;
@@ -119,9 +120,12 @@ compat_open(const char *name, uint32 flags, void **cookie)
dev = gDevices[i];
if (atomic_or(&dev->flags, DEVICE_OPEN) & DEVICE_OPEN)
if (!atomic_test_and_set(&dev->open, 1, 0))
return B_BUSY;
/* some drivers expect the softc to be zero'ed out */
memset(dev->softc, 0, dev->softc_size);
status = sDeviceAttach(dev);
if (status != 0)
dev->flags = 0;
@@ -144,7 +148,6 @@ compat_open(const char *name, uint32 flags, void **cookie)
}
*cookie = dev;
return status;
}
@@ -155,8 +158,15 @@ compat_close(void *cookie)
device_t dev = cookie;
device_printf(dev, "compat_close()\n");
UNIMPLEMENTED();
return B_ERROR;
atomic_or(&dev->flags, DEVICE_CLOSED);
/* do we need a memory barrier in read() or is the atomic_or
* (and the implicit 'lock') enough? */
release_sem_etc(dev->receive_sem, 1, B_RELEASE_ALL);
return B_OK;
}
@@ -167,10 +177,14 @@ compat_free(void *cookie)
device_printf(dev, "compat_free()\n");
sDeviceDetach(dev);
/* XXX empty out the send queue */
atomic_and(&dev->open, 0);
put_module(NET_STACK_MODULE_NAME);
free_device(dev);
UNIMPLEMENTED();
return B_ERROR;
return B_OK;
}
@@ -469,7 +483,6 @@ err_3:
err_2:
free(dev);
err_1:
err_0:
put_module(B_PCI_MODULE_NAME);
return status;
}
+2
View File
@@ -28,6 +28,7 @@ struct device {
pci_info pci_info;
char dev_name[128];
int32 open;
int32 flags;
struct ifqueue receive_queue;
@@ -41,6 +42,7 @@ struct device {
char nameunit[64];
const char * description;
void * softc;
size_t softc_size;
};