PCI: PCIe portdrv: Remove struct pcie_port_service_id
authorRafael J. Wysocki <rjw@sisk.pl>
Tue, 13 Jan 2009 13:46:46 +0000 (14:46 +0100)
committerJesse Barnes <jbarnes@hobbes.lan>
Fri, 20 Mar 2009 02:29:23 +0000 (19:29 -0700)
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>
drivers/pci/hotplug/pciehp_acpi.c
drivers/pci/hotplug/pciehp_core.c
drivers/pci/pcie/aer/aerdrv.c
drivers/pci/pcie/aer/aerdrv_core.c
drivers/pci/pcie/portdrv.h
drivers/pci/pcie/portdrv_bus.c
drivers/pci/pcie/portdrv_core.c
include/linux/pcieport_if.h

index ad8835758a175ec6851f2151d0d19c014b2c4406..21734c311529c10012d94cb4e6f192b121b5a546 100644 (file)
@@ -67,16 +67,6 @@ static int __init parse_detect_mode(void)
        return PCIEHP_DETECT_DEFAULT;
 }
 
-static struct pcie_port_service_id __initdata port_pci_ids[] = {
-       {
-               .vendor = PCI_ANY_ID,
-               .device = PCI_ANY_ID,
-               .port_type = PCIE_ANY_PORT,
-               .service_type = PCIE_PORT_SERVICE_HP,
-               .driver_data =  0,
-        }, { /* end: all zeroes */ }
-};
-
 static int __initdata dup_slot_id;
 static int __initdata acpi_slot_detected;
 static struct list_head __initdata dummy_slots = LIST_HEAD_INIT(dummy_slots);
@@ -110,7 +100,8 @@ static int __init dummy_probe(struct pcie_device *dev)
 
 static struct pcie_port_service_driver __initdata dummy_driver = {
         .name           = "pciehp_dummy",
-        .id_table       = port_pci_ids,
+       .port_type      = PCIE_ANY_PORT,
+       .service        = PCIE_PORT_SERVICE_HP,
         .probe          = dummy_probe,
 };
 
index 3429b21dbb533b285daaa1d1af6231b9eecf9faf..3d21bbba330898c098e2010fc2890382fc2a3c42 100644 (file)
@@ -505,18 +505,10 @@ static int pciehp_resume (struct pcie_device *dev)
 }
 #endif
 
-static struct pcie_port_service_id port_pci_ids[] = { {
-       .vendor = PCI_ANY_ID,
-       .device = PCI_ANY_ID,
-       .port_type = PCIE_ANY_PORT,
-       .service_type = PCIE_PORT_SERVICE_HP,
-       .driver_data =  0,
-       }, { /* end: all zeroes */ }
-};
-
 static struct pcie_port_service_driver hpdriver_portdrv = {
        .name           = PCIE_MODULE_NAME,
-       .id_table       = &port_pci_ids[0],
+       .port_type      = PCIE_ANY_PORT,
+       .service        = PCIE_PORT_SERVICE_HP,
 
        .probe          = pciehp_probe,
        .remove         = pciehp_remove,
index 57c41204c549887732d47c780c385536171efd20..e11c03194063d1f088e3bfc44a563516b1743c50 100644 (file)
@@ -48,19 +48,6 @@ static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
 static void aer_error_resume(struct pci_dev *dev);
 static pci_ers_result_t aer_root_reset(struct pci_dev *dev);
 
-/*
- * PCI Express bus's AER Root service driver data structure
- */
-static struct pcie_port_service_id aer_id[] = {
-       {
-       .vendor         = PCI_ANY_ID,
-       .device         = PCI_ANY_ID,
-       .port_type      = PCIE_RC_PORT,
-       .service_type   = PCIE_PORT_SERVICE_AER,
-       },
-       { /* end: all zeroes */ }
-};
-
 static struct pci_error_handlers aer_error_handlers = {
        .error_detected = aer_error_detected,
        .resume = aer_error_resume,
@@ -68,7 +55,8 @@ static struct pci_error_handlers aer_error_handlers = {
 
 static struct pcie_port_service_driver aerdriver = {
        .name           = "aer",
-       .id_table       = &aer_id[0],
+       .port_type      = PCIE_ANY_PORT,
+       .service        = PCIE_PORT_SERVICE_AER,
 
        .probe          = aer_probe,
        .remove         = aer_remove,
index 38257500738223486758e337cb49d7184ddcef5a..307452f30035562cea6f290fb0fa1bac34679893 100644 (file)
@@ -351,21 +351,21 @@ static int find_aer_service_iter(struct device *device, void *data)
 {
        struct device_driver *driver;
        struct pcie_port_service_driver *service_driver;
-       struct pcie_device *pcie_dev;
        struct find_aer_service_data *result;
 
        result = (struct find_aer_service_data *) data;
 
        if (device->bus == &pcie_port_bus_type) {
-               pcie_dev = to_pcie_device(device);
-               if (pcie_dev->id.port_type == PCIE_SW_DOWNSTREAM_PORT)
+               struct pcie_port_data *port_data;
+
+               port_data = pci_get_drvdata(to_pcie_device(device)->port);
+               if (port_data->port_type == PCIE_SW_DOWNSTREAM_PORT)
                        result->is_downstream = 1;
 
                driver = device->driver;
                if (driver) {
                        service_driver = to_service_driver(driver);
-                       if (service_driver->id_table->service_type ==
-                                       PCIE_PORT_SERVICE_AER) {
+                       if (service_driver->service == PCIE_PORT_SERVICE_AER) {
                                result->aer_driver = service_driver;
                                return 1;
                        }
index b0dcbc73415e14d85f13613c7aa48e447a63abd7..ad4d082a0344a0bf7c1b034897a84ca0e90dbce6 100644 (file)
 
 #define get_descriptor_id(type, service) (((type - 4) << 4) | service)
 
-struct pcie_port_data {
-       int port_type;          /* Type of the port */
-       int port_irq_mode;      /* [0:INTx | 1:MSI | 2:MSI-X] */
-};
-
 extern struct bus_type pcie_port_bus_type;
 extern int pcie_port_device_probe(struct pci_dev *dev);
 extern int pcie_port_device_register(struct pci_dev *dev);
index eec89b767f9f828d3389ef2584ad5fd103388869..ef3a4eeaebb45077005f4948b458e3b241ba1f38 100644 (file)
@@ -26,20 +26,22 @@ 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->id_table->vendor != PCI_ANY_ID && 
-               driver->id_table->vendor != pciedev->id.vendor) ||
-              (driver->id_table->device != PCI_ANY_ID &&
-               driver->id_table->device != pciedev->id.device) ||      
-              (driver->id_table->port_type != PCIE_ANY_PORT &&
-               driver->id_table->port_type != pciedev->id.port_type) ||
-               driver->id_table->service_type != pciedev->id.service_type )
+
+       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;
index 682524b0c93a19c675b994b721e9ec4a5320c936..843d9e30dd3b1408765fbaa50522d6a0faf0a7d4 100644 (file)
@@ -140,10 +140,7 @@ static void pcie_device_init(struct pci_dev *parent, struct pcie_device *dev,
 
        dev->port = parent;
        dev->irq = irq;
-       dev->id.vendor = parent->vendor;
-       dev->id.device = parent->device;
-       dev->id.port_type = port_type;
-       dev->id.service_type = service_type;
+       dev->service = service_type;
 
        /* Initialize generic device interface */
        device = &dev->device;
index 59e90b8a78397e4211bb9ae644a8daf42b303516..a3832079508e34fd45cf995ba13d8d97453632d6 100644 (file)
 #define PCIE_PORT_MSI_MODE             1
 #define PCIE_PORT_MSIX_MODE            2
 
-struct pcie_port_service_id {
-       __u32 vendor, device;           /* Vendor and device ID or PCI_ANY_ID*/
-       __u32 subvendor, subdevice;     /* Subsystem ID's or PCI_ANY_ID */
-       __u32 class, class_mask;        /* (class,subclass,prog-if) triplet */
-       __u32 port_type, service_type;  /* Port Entity */
-       kernel_ulong_t driver_data;
+struct pcie_port_data {
+       int port_type;          /* Type of the port */
+       int port_irq_mode;      /* [0:INTx | 1:MSI | 2:MSI-X] */
 };
 
 struct pcie_device {
        int             irq;        /* Service IRQ/MSI/MSI-X Vector */
-       struct pcie_port_service_id id; /* Service ID */
-       struct pci_dev  *port;      /* Root/Upstream/Downstream Port */
+       struct pci_dev *port;       /* Root/Upstream/Downstream Port */
+       u32             service;    /* Port service this device represents */
        void            *priv_data; /* Service Private Data */
        struct device   device;     /* Generic Device Interface */
 };
@@ -67,7 +64,9 @@ struct pcie_port_service_driver {
        /* Link Reset Capability - AER service driver specific */
        pci_ers_result_t (*reset_link) (struct pci_dev *dev);
 
-       const struct pcie_port_service_id *id_table;
+       int port_type;  /* Type of the port this driver can handle */
+       u32 service;    /* Port service this device represents */
+
        struct device_driver driver;
 };
 #define to_service_driver(d) \