From b6ace498dd8b5653028a9802468faebd860c0013 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Tue, 8 May 2007 16:52:48 +0000 Subject: [PATCH] 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 --- .../kernel/drivers/network/pcnet/dev/le/glue.c | 5 +++-- .../freebsd_network/compat/sys/haiku-module.h | 11 +++++++++++ src/libs/compat/freebsd_network/device.c | 14 +++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c b/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c index 302fc160c4..6a522737b1 100644 --- a/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c +++ b/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c @@ -6,6 +6,9 @@ #include #include +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; diff --git a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h index b9b8efff3a..6abf482737 100644 --- a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h +++ b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h @@ -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); \ diff --git a/src/libs/compat/freebsd_network/device.c b/src/libs/compat/freebsd_network/device.c index c01f1a5d94..73079960c1 100644 --- a/src/libs/compat/freebsd_network/device.c +++ b/src/libs/compat/freebsd_network/device.c @@ -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(); }