/* returns 0 on success, else error. side-effect: pci_dev->driver is set to drv when drv claims pci_dev.  */
static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
/* returns 0 on success, else error. side-effect: pci_dev->driver is set to drv when drv claims pci_dev.  */
static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
{
	const struct pci_device_id *id;
	int error = 0;
	if (!pci_dev->driver && drv->probe) {
		error = -ENODEV;
		id = pci_match_device(drv, pci_dev);
		if (id)
			error = pci_call_probe(drv, pci_dev, id);
		if (error >= 0) {
			pci_dev->driver = drv;
			error = 0;
		}
	}
	return error;
}