Messages in this thread | | | Subject | Re: Can we remove pci_find_device() yet? | From | Ben Hutchings <> | Date | Tue, 12 Jan 2010 20:53:25 +0000 |
| |
On Tue, 2010-01-12 at 21:34 +0100, Krzysztof Halasa wrote: > Greg KH <gregkh@suse.de> writes: > > > Close, but if you do this, please name the function > > hisax_find_pci_device() or something, and change the drivers to use it > > instead. Also put a big fat warning in the function that calling this > > is unsafe for any PCI hotplug type machine. > > BTW, I have a driver in the works which uses these functions, and I > wonder how to do it correctly. The problem is that the hardware is a > dual-function PCI card (two DEC Tulip Ethernet controllers) but part of > the first device (EEPROM interface or something like that) is used by > both (there is an FPGA connected there, serving both channels). > > This means drivers for dev#0 and dev#1 (both "normal" PCI controllers) > need to register and access part of dev#0 BARs.
I hope you realise that this is a design error! Linux is fairly forgiving and allows PCI drivers to do unusual things, but other OSes make it hard or impossible for PCI drivers to coordinate multiple functions.
> How do I do that properly, in terms of PCI API?
One of our older controllers had a similar design error in that the two functions would sometimes have to be reset together. The way we look for the second function is:
dev = pci_dev_get(dev1); while ((dev = pci_get_device(vendor_id, device_id, dev))) { if (dev->bus == dev1->bus && dev->devfn == dev1->devfn + 1) { dev2 = dev; break; } }
I assume this is 'properly' since no-one has told me otherwise.
Ben.
-- Ben Hutchings, Senior Software Engineer, Solarflare Communications Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
| |