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:
@@ -48,7 +48,8 @@ allocate_device(driver_t *driver)
|
|||||||
|
|
||||||
snprintf(semName, sizeof(semName), "%s rcv", gDriverName);
|
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) {
|
if (dev->softc == NULL) {
|
||||||
free(dev);
|
free(dev);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -119,9 +120,12 @@ compat_open(const char *name, uint32 flags, void **cookie)
|
|||||||
|
|
||||||
dev = gDevices[i];
|
dev = gDevices[i];
|
||||||
|
|
||||||
if (atomic_or(&dev->flags, DEVICE_OPEN) & DEVICE_OPEN)
|
if (!atomic_test_and_set(&dev->open, 1, 0))
|
||||||
return B_BUSY;
|
return B_BUSY;
|
||||||
|
|
||||||
|
/* some drivers expect the softc to be zero'ed out */
|
||||||
|
memset(dev->softc, 0, dev->softc_size);
|
||||||
|
|
||||||
status = sDeviceAttach(dev);
|
status = sDeviceAttach(dev);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
dev->flags = 0;
|
dev->flags = 0;
|
||||||
@@ -144,7 +148,6 @@ compat_open(const char *name, uint32 flags, void **cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
*cookie = dev;
|
*cookie = dev;
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,8 +158,15 @@ compat_close(void *cookie)
|
|||||||
device_t dev = cookie;
|
device_t dev = cookie;
|
||||||
|
|
||||||
device_printf(dev, "compat_close()\n");
|
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");
|
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);
|
put_module(NET_STACK_MODULE_NAME);
|
||||||
free_device(dev);
|
|
||||||
UNIMPLEMENTED();
|
return B_OK;
|
||||||
return B_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -469,7 +483,6 @@ err_3:
|
|||||||
err_2:
|
err_2:
|
||||||
free(dev);
|
free(dev);
|
||||||
err_1:
|
err_1:
|
||||||
err_0:
|
|
||||||
put_module(B_PCI_MODULE_NAME);
|
put_module(B_PCI_MODULE_NAME);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ struct device {
|
|||||||
pci_info pci_info;
|
pci_info pci_info;
|
||||||
char dev_name[128];
|
char dev_name[128];
|
||||||
|
|
||||||
|
int32 open;
|
||||||
int32 flags;
|
int32 flags;
|
||||||
|
|
||||||
struct ifqueue receive_queue;
|
struct ifqueue receive_queue;
|
||||||
@@ -41,6 +42,7 @@ struct device {
|
|||||||
char nameunit[64];
|
char nameunit[64];
|
||||||
const char * description;
|
const char * description;
|
||||||
void * softc;
|
void * softc;
|
||||||
|
size_t softc_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user