PCI device driver writing newbie trouble

From: Bert Thomas
Date: Thu Apr 20 2006 - 10:05:31 EST


Hi All,

I'm attempting to write a PCI device driver. I've read chapters 2, 9 and 12 of the linux device driver book (3rd ed) and it got me going with the code below. However, I never see the message printed from cif50_probe, so appearantly the kernel doesn't consider my driver the correct driver for the hardware.

I tried to load the driver with insmod, but I also rebooted the system in the hope that some part of the kernel would find the hardware and try to load my driver. Is that how it is supposed to work? At least my driver is listed in /lib/modules/2.6.15.7/modules.pcimap. Modprobe doesn't find it, I don't know why. The hardware contains a PLX chip. The hardware is found by the kernel, as it correctly shows up in /proc/pci:

Bus 1, device 13, function 0:
Class 0680: PCI device 10b5:9050 (rev 1).
IRQ 5.
Non-prefetchable 32 bit memory at 0xd1005000 [0xd100507f].
I/O at 0xd100 [0xd17f].
Non-prefetchable 32 bit memory at 0xd1000000 [0xd1001fff].

Also in the corresponding /sys files.

Does anyone have a suggestion why my probe function is not being called?

TIA
Bert

#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>
MODULE_LICENSE("Dual BSD/GPL");

static const struct pci_device_id cif50_ids[] = {
{
.vendor = 0x10B5,
.device = 0x9050,
.subvendor = PCI_ANY_ID, //0x10B5,
.subdevice = PCI_ANY_ID, //0x1080,
.class = PCI_ANY_ID,
.class_mask = PCI_ANY_ID
},
{ 0 }
};

MODULE_DEVICE_TABLE(pci,cif50_ids);

int cif50_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
printk("<1>Joehoe, de kernel wil me een PCI device geven!\n");
return -1;
}

void cif50_remove(struct pci_dev *dev)
{
}

static struct pci_driver pci_driver = {
.name = "cif50pb",
.id_table = cif50_ids,
.probe = cif50_probe,
.remove = cif50_remove,
};
static int hello_init(void)
{
printk("<1>Hello, world\n");
return pci_register_driver(&pci_driver);
}
static void hello_exit(void)
{
printk("<1>Goodbye cruel world\n");
pci_unregister_driver(&pci_driver);
}
module_init(hello_init);
module_exit(hello_exit);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/