freebsd compat. layer: added a requirements field so not all drivers init all subsystems. pcnet for instance doesn't need taskqueues.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21072 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos 2007-05-08 16:52:48 +00:00
parent 859a95b6c7
commit b6ace498dd
3 changed files with 23 additions and 7 deletions

View File

@ -6,6 +6,9 @@
#include <dev/le/lancevar.h>
#include <dev/le/am79900var.h>
HAIKU_FBSD_DRIVER_GLUE(pcnet, le, pci);
HAIKU_DRIVER_REQUIREMENTS(0);
/* from if_le_pci.c */
#define PCNET_PCI_RDP 0x10
#define PCNET_PCI_RAP 0x12
@ -27,8 +30,6 @@ struct le_pci_softc {
bus_dmamap_t sc_dmam;
};
HAIKU_FBSD_DRIVER_GLUE(pcnet, le, pci)
int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) {
struct le_pci_softc *lesc = (struct le_pci_softc *)device_get_softc(dev);
cpu_status status;

View File

@ -85,6 +85,17 @@ extern int __haiku_disable_interrupts(device_t dev);
return -1; \
}
extern int __haiku_driver_requirements;
enum {
FBSD_TASKQUEUES = 1 << 0,
};
#define HAIKU_DRIVER_REQUIREMENTS(flags) \
int __haiku_driver_requirements = (flags)
#define HAIKU_DRIVER_REQUIRES(flag) (__haiku_driver_requirements & (flag))
#define HAIKU_INTR_REGISTER_ENTER(status) do { \
status = disable_interrupts(); \
acquire_spinlock(&__haiku_intr_spinlock); \

View File

@ -407,9 +407,11 @@ _fbsd_init_driver(driver_t *driver)
if (status < B_OK)
goto err_2;
status = init_taskqueues();
if (status < B_OK)
goto err_3;
if (HAIKU_DRIVER_REQUIRES(FBSD_TASKQUEUES)) {
status = init_taskqueues();
if (status < B_OK)
goto err_3;
}
status = init_mbufs();
if (status < B_OK)
@ -446,7 +448,8 @@ _fbsd_init_driver(driver_t *driver)
return B_OK;
err_4:
uninit_taskqueues();
if (HAIKU_DRIVER_REQUIRES(FBSD_TASKQUEUES))
uninit_taskqueues();
err_3:
uninit_mutexes();
err_2:
@ -469,6 +472,7 @@ _fbsd_uninit_driver(driver_t *driver)
uninit_bounce_pages();
uninit_mbufs();
uninit_taskqueues();
if (HAIKU_DRIVER_REQUIRES(FBSD_TASKQUEUES))
uninit_taskqueues();
uninit_mutexes();
}