Search code examples
linux-kernellinux-device-driverkernel-module

pci_driver.probe function not called so pci_device_id wrong?


I am moving my first steps into Linux Kernel Device Driver development.

I learnt that for pci-e cards I have to call pci_register_driver providing information via an object of type pci_driver ( below an example ). When I load my module ( via insmod ) If the information passed via .id_table is found than the .probe function is called.

As I am now I cannot see my .probe function called at all ( I added some logging via printk ) so I must assume that the information contained in pci_device_id must be wrong, right?

Is there any way to retrieve this information directly from the hardware itself? Once I plug my PCI-E card on my Linux box, where I can find all information about it? Maybe reading BIOS or some file in sys?

Any help is appreciated.

AFG

      static struct pci_driver my_driver = {
      // other here
          .id_table = pci_datatable,
          .probe    = driver_add
      //
      };

      static struct pci_device_id pci_datatable[] __devinitdata =
      {
          { VendorID,  PciExp_0041,  PCI_ANY_ID, PCI_ANY_ID },
          { 0 },
      };

      int __devinit DmaDriverAdd(
          struct pci_dev *             pPciDev,
          const struct pci_device_id * pPciEntry
          )
      {
          // my stuff!
      }

Solution

  • The command you want is lspci.

    With no arguments it will give you a list of all PCI devices, eg:

    $ lspci
    00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
    00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family 
    03:00.0 Network controller: Intel Corporation Centrino Advanced-N 6205 (rev 34)
    ...
    

    Then to get the ids, use:

    $ lspci -v -n -s 03:00.0
    03:00.0 0280: 8086:0085 (rev 34)
        Subsystem: 8086:1311
        Flags: bus master, fast devsel, latency 0, IRQ 52
    

    You can also find the same information in /sys:

    $ cd /sys/bus/pci/devices/0000:03:00.0 
    $ cat vendor device 
    0x8086
    0x0085
    $ cat subsystem_vendor subsystem_device 
    0x8086
    0x1311