mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
22106368c9
The PCI Express port driver uses 'struct pcie_port_service_id' for matching port service devices and drivers, but this structure contains fields that duplicate information from the port device itself (vendor, device, subvendor, subdevice) and fields that are not used by any existing port service driver (class, class_mask, drvier_data). Also, both existing port service drivers (AER and PCIe HP) don't even use the vendor and device fields for device matching. Therefore 'struct pcie_port_service_id' can be removed altogether and the only useful members of it (port_type, service) can be introduced directly into the port service device and port service driver structures. That simplifies the code quite a bit and reduces its size. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
/*
|
|
* File: portdrv_bus.c
|
|
* Purpose: PCI Express Port Bus Driver's Bus Overloading Functions
|
|
*
|
|
* Copyright (C) 2004 Intel
|
|
* Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/pm.h>
|
|
|
|
#include <linux/pcieport_if.h>
|
|
#include "portdrv.h"
|
|
|
|
static int pcie_port_bus_match(struct device *dev, struct device_driver *drv);
|
|
|
|
struct bus_type pcie_port_bus_type = {
|
|
.name = "pci_express",
|
|
.match = pcie_port_bus_match,
|
|
};
|
|
EXPORT_SYMBOL_GPL(pcie_port_bus_type);
|
|
|
|
static int pcie_port_bus_match(struct device *dev, struct device_driver *drv)
|
|
{
|
|
struct pcie_device *pciedev;
|
|
struct pcie_port_data *port_data;
|
|
struct pcie_port_service_driver *driver;
|
|
|
|
if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type)
|
|
return 0;
|
|
|
|
pciedev = to_pcie_device(dev);
|
|
driver = to_service_driver(drv);
|
|
|
|
if (driver->service != pciedev->service)
|
|
return 0;
|
|
|
|
port_data = pci_get_drvdata(pciedev->port);
|
|
|
|
if (driver->port_type != PCIE_ANY_PORT
|
|
&& driver->port_type != port_data->port_type)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
int pcie_port_bus_register(void)
|
|
{
|
|
return bus_register(&pcie_port_bus_type);
|
|
}
|
|
|
|
void pcie_port_bus_unregister(void)
|
|
{
|
|
bus_unregister(&pcie_port_bus_type);
|
|
}
|