Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Dec 2011 20:55:19 -0700
From:      ss griffon <ssgriffonuser@gmail.com>
To:        freebsd-drivers@freebsd.org
Subject:   Attaching pseudo bus to i386 nexus bus.
Message-ID:  <CAFYJ9ehmS=QAW0aHD8jwaptUsbZuDsS98kL2AL_4Pd1AbcEL6Q@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
I've been playing around with the hdac sound driver and as an exercise
I decided to make my own "pseudo" pcm driver. =A0However, I can't seem
to get my device_probe and device_attach functions to be called on my
"pseudo" bus driver. =A0I've spent a lot of time looking at the bus code
in kernel/subr_bus.c and I think I have a good understanding of it but
apparently not good enough. =A0I've looked at other devices that
implement buses, such as hdac, pci and acpi (which hangs off of nexus
as well) and I can't find what they are doing to make their
device_probe/device_attach to be called. =A0Perhaps my driver is missing
a reference to a parent? =A0Anyway, any help would be greatly
appreciated, maybe it is something very obvious. =A0I turned on the
BUS_DEBUG option and provide it's output along with the code.

Code:

#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_snd.h"
#endif

#include <dev/sound/pcm/sound.h>
#include <dev/sound/pcm/pcm.h>

#include "device_if.h"
#include "bus_if.h"
#include "mixer_if.h"

static int
snd_loop_bus_probe(device_t dev)
{
  printf("%s %d called\n", __func__, __LINE__);
  return 0;
}

static int
snd_loop_bus_attach(device_t dev)
{
  printf("%s %d called\n", __func__, __LINE__);
  return 0;
}

static void
snd_loop_bus_driver_added(device_t dev, driver_t *driver)
{
  printf("%s %d called\n", __func__, __LINE__);
}

static device_method_t snd_loop_bus_methods[] =3D {
  DEVMETHOD(device_probe,	snd_loop_bus_probe),
  DEVMETHOD(device_attach,	snd_loop_bus_attach),
  /*Bus Interface*/
  DEVMETHOD(bus_driver_added,	snd_loop_bus_driver_added),
  { 0, 0 }
};

static driver_t snd_loop_bus_driver =3D {
  "snd_loop_bus",
  snd_loop_bus_methods,
  PCM_SOFTC_SIZE, /*This isn't used, should be 1*/
};

devclass_t snd_loop_bus_devclass;
DRIVER_MODULE(snd_loop_bus, nexus, snd_loop_bus_driver,
snd_loop_bus_devclass, 0, 0);



BUS_DEBUG Output:

devclass_find_internal:914: looking for nexus
driver_module_handler:4462: Loading module: driver snd_loop_bus on bus
nexus (pass 2147483647)
devclass_add_driver:1047: snd_loop_bus
devclass_find_internal:914: looking for snd_loop_bus
devclass_find_internal:924: creating snd_loop_bus



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFYJ9ehmS=QAW0aHD8jwaptUsbZuDsS98kL2AL_4Pd1AbcEL6Q>