[EMAIL PROTECTED] wrote:

In message <[EMAIL PROTECTED]>, Iasen Kostov wrote:



Hi,
I want to know is there a way to call *_probe (for device driver) with fake (PCI) device that does not exists in the system ?
First of all a cant find how "struct device" is declared (i've searched even the compile/ dir) and second I think that I'll need to intercept pci_get_vendor and pci_get_device funcs with my own which should detect the fake device and thus will return vandor/device that I need to fake. I realy don't need anything else except _probe ...




I have never tried such but grimpsed the PCI framework, I propose the following, though I don't imagine why you want to do so:

Your driver have to contain DEVICE_IDENTIFY method that calls device_add_child to allocate device_t object.
Then you allocate 'struct pci_devinfo' and initialize pci_devinfo as you like. And you have to make your driver as a module. Then a device object will show up on the device tree on your system.


You may want to have a look at pci_add_children@/sys/dev/pci/pci.c





I think I was not clear .. .sorry. I ment to lie the driver that some device (that is not realy plugged in the machine) exists. Doing so I can check if drivers _probe() func returns "OK"
or not and by checking every device from /usr/share/misc/pci_vendors I could build device<->driver_file database.



Hmm, do you want to implement docking station or something? This is a part of my interest.



Don't know what you mean whit "docking station". I want to create framework for extracting info from every driver which device it can handle.
Then create create conf for devd or kernel_driver_autoloader :) or something like that (e.g. windoze .inf database).


I've patched a bit /sys/dev/pci/pci.c like this:

typedef uintptr_t *pci_fake_read_ivars_t(pcicfgregs *cfg);
static pci_fake_read_ivars_t *pci_fake_read_ivars = NULL;

int
pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
{
      struct pci_devinfo *dinfo;
      pcicfgregs *cfg = NULL;

      if(pci_fake_read_ivars && !strcmp("fake0", dev->nameunit)) {
          (*pci_fake_read_ivars)(cfg);
      } else {
          dinfo = device_get_ivars(child);
          cfg = &dinfo->cfg;
      }

And when I load my module it will set pci_fake_read_ivars and will start to test drivers probe sending devices with nameunit set to "fake0" thus telling pci_read_ivar() to fake the return values by calling pci_fake_read_ivars() callback ... I think this is very messy ... I hope that it will work this way :)



pci_read_ivar itself will not access real hardware: cache its value and simply use hardware register index as ivar index.
So it is enough to initialize
struct pci_devinfo then call device_set_ivar. Rather, there may be problem
when pci_cfg_save()@sys/dev/pci/pci.c is called.


Thank a lot this will realy simplify the work ! :) I won't need to patch sys/dev/pci/pci.c this way. Thanks .


_______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to