From mboxrd@z Thu Jan 1 00:00:00 1970 From: greg@kroah.com (Greg KH) Date: Wed, 4 May 2011 07:55:13 -0700 Subject: Faking PCI devices? In-Reply-To: References: Message-ID: <20110504145513.GA12265@kroah.com> To: kernelnewbies@lists.kernelnewbies.org List-Id: kernelnewbies.lists.kernelnewbies.org On Wed, May 04, 2011 at 11:39:20AM +0200, Manohar Vanga wrote: > Hi, > > I have written a simulated driver for a PCI board and am looking for a clean > way to use the driver. Currently, I am setting the PCI ids to PCI_ANY_ID and > only allowing a single probe call to go through using a global variable > (concurrency issues but I don't care for the simulation). > > static int n > ... > static int fake_board_probe(struct pci_dev *pdev, const struct pci_device_id > *ent) > { > ??? if (n == 1) > ??????? return -1; Please return a proper error value, like -ENODEV. > ??? n = 1; > ??? ... > } > static int fake_board_init(void) > { > ??? n = 0; > ??? .... > } > > I want to do a cleaner job of this and wanted to write a PCI bridge driver that > actually registers the devices with the correct IDs that I need. This also > gives me the advantage of being able to register multiple devices which is a > useful for the simulation I am working on. > Can anyone point me in the right direction for this? Most of the code (eg. > struct pci_controller) seem to be architecture specific. Just register your device, and then don't use any global variables to the driver. Put them all in your struct pci_dev private area and you will be fine. There's thousands of examples of this in the kernel. hope this helps, greg k-h