* [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2)
@ 2009-01-13 13:34 Rafael J. Wysocki
2009-01-13 13:38 ` [PATCH 1/7] PCI PCIe portdrv: Use driver data to simplify code Rafael J. Wysocki
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:34 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
Hi,
This is the second iteration of the series of patches containing fixes and
cleanups of the PCI Express port driver. Apart from bug fixes the patches
generally remove unnecessary things from the driver and simplify the code.
The last patch adds support for the new PCI PM framework.
I've tested these patches on a couple of machines and I'm quite confident that
they don't break things, but still more testing is always recommended. :-)
Please consider for applying.
Thanks,
Rafael
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/7] PCI PCIe portdrv: Use driver data to simplify code
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
@ 2009-01-13 13:38 ` Rafael J. Wysocki
2009-01-13 13:39 ` [PATCH 2/7] PCI PCIe portdrv: Aviod using service devices with wrong interrupts (rev. 2) Rafael J. Wysocki
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:38 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
PCI Express port driver extension, as defined by
struct pcie_port_device_ext in portdrv.h, is allocated and
initialized, but never used (it also is never freed). Extend it to
hold the PCI Express port type as well as the port interrupt mode,
change its name and use it to simplify the code in portdrv_core.c .
Additionally, remove the redundant interrupt_mode member of
struct pcie_device defined in include/linux/pcieport_if.h .
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/pcie/portdrv.h | 5 +-
drivers/pci/pcie/portdrv_core.c | 95 +++++++++++++++-------------------------
include/linux/pcieport_if.h | 1
3 files changed, 39 insertions(+), 62 deletions(-)
Index: linux-2.6/drivers/pci/pcie/portdrv.h
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv.h
+++ linux-2.6/drivers/pci/pcie/portdrv.h
@@ -28,8 +28,9 @@
#define get_descriptor_id(type, service) (((type - 4) << 4) | service)
-struct pcie_port_device_ext {
- int interrupt_mode; /* [0:INTx | 1:MSI | 2:MSI-X] */
+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;
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -15,10 +15,9 @@
#include <linux/slab.h>
#include <linux/pcieport_if.h>
+#include "../pci.h"
#include "portdrv.h"
-extern int pcie_mch_quirk; /* MSI-quirk Indicator */
-
/**
* release_pcie_device - free PCI Express port service device structure
* @dev: Port service device to release
@@ -31,28 +30,6 @@ static void release_pcie_device(struct d
kfree(to_pcie_device(dev));
}
-static int is_msi_quirked(struct pci_dev *dev)
-{
- int port_type, quirk = 0;
- u16 reg16;
-
- pci_read_config_word(dev,
- pci_find_capability(dev, PCI_CAP_ID_EXP) +
- PCIE_CAPABILITIES_REG, ®16);
- port_type = (reg16 >> 4) & PORT_TYPE_MASK;
- switch(port_type) {
- case PCIE_RC_PORT:
- if (pcie_mch_quirk == 1)
- quirk = 1;
- break;
- case PCIE_SW_UPSTREAM_PORT:
- case PCIE_SW_DOWNSTREAM_PORT:
- default:
- break;
- }
- return quirk;
-}
-
/**
* assign_interrupt_mode - choose interrupt mode for PCI Express port services
* (INTx, MSI-X, MSI) and set up vectors
@@ -64,6 +41,7 @@ static int is_msi_quirked(struct pci_dev
*/
static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask)
{
+ struct pcie_port_data *port_data = pci_get_drvdata(dev);
int i, pos, nvec, status = -EINVAL;
int interrupt_mode = PCIE_PORT_INTx_MODE;
@@ -75,7 +53,7 @@ static int assign_interrupt_mode(struct
}
/* Check MSI quirk */
- if (is_msi_quirked(dev))
+ if (port_data->port_type == PCIE_RC_PORT && pcie_mch_quirk)
return interrupt_mode;
/* Select MSI-X over MSI if supported */
@@ -132,13 +110,11 @@ static int get_port_device_capability(st
pos + PCIE_SLOT_CAPABILITIES_REG, ®32);
if (reg32 & SLOT_HP_CAPABLE_MASK)
services |= PCIE_PORT_SERVICE_HP;
- }
- /* PME Capable - root port capability */
- if (((reg16 >> 4) & PORT_TYPE_MASK) == PCIE_RC_PORT)
- services |= PCIE_PORT_SERVICE_PME;
-
+ }
+ /* AER capable */
if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR))
services |= PCIE_PORT_SERVICE_AER;
+ /* VC support */
if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC))
services |= PCIE_PORT_SERVICE_VC;
@@ -152,15 +128,15 @@ static int get_port_device_capability(st
* @port_type: Type of the port
* @service_type: Type of service to associate with the service device
* @irq: Interrupt vector to associate with the service device
- * @irq_mode: Interrupt mode of the service (INTx, MSI-X, MSI)
*/
static void pcie_device_init(struct pci_dev *parent, struct pcie_device *dev,
- int port_type, int service_type, int irq, int irq_mode)
+ int service_type, int irq)
{
+ struct pcie_port_data *port_data = pci_get_drvdata(parent);
struct device *device;
+ int port_type = port_data->port_type;
dev->port = parent;
- dev->interrupt_mode = irq_mode;
dev->irq = irq;
dev->id.vendor = parent->vendor;
dev->id.device = parent->device;
@@ -185,10 +161,9 @@ static void pcie_device_init(struct pci_
* @port_type: Type of the port
* @service_type: Type of service to associate with the service device
* @irq: Interrupt vector to associate with the service device
- * @irq_mode: Interrupt mode of the service (INTx, MSI-X, MSI)
*/
static struct pcie_device* alloc_pcie_device(struct pci_dev *parent,
- int port_type, int service_type, int irq, int irq_mode)
+ int service_type, int irq)
{
struct pcie_device *device;
@@ -196,7 +171,7 @@ static struct pcie_device* alloc_pcie_de
if (!device)
return NULL;
- pcie_device_init(parent, device, port_type, service_type, irq,irq_mode);
+ pcie_device_init(parent, device, service_type, irq);
return device;
}
@@ -230,39 +205,36 @@ int pcie_port_device_probe(struct pci_de
*/
int pcie_port_device_register(struct pci_dev *dev)
{
- struct pcie_port_device_ext *p_ext;
- int status, type, capabilities, irq_mode, i;
+ struct pcie_port_data *port_data;
+ int status, capabilities, irq_mode, i;
int vectors[PCIE_PORT_DEVICE_MAXSERVICES];
u16 reg16;
- /* Allocate port device extension */
- if (!(p_ext = kmalloc(sizeof(struct pcie_port_device_ext), GFP_KERNEL)))
+ port_data = kzalloc(sizeof(*port_data), GFP_KERNEL);
+ if (!port_data)
return -ENOMEM;
-
- pci_set_drvdata(dev, p_ext);
+ pci_set_drvdata(dev, port_data);
/* Get port type */
pci_read_config_word(dev,
pci_find_capability(dev, PCI_CAP_ID_EXP) +
PCIE_CAPABILITIES_REG, ®16);
- type = (reg16 >> 4) & PORT_TYPE_MASK;
+ port_data->port_type = (reg16 >> 4) & PORT_TYPE_MASK;
- /* Now get port services */
capabilities = get_port_device_capability(dev);
+ /* Root ports are capable of generating PME too */
+ if (port_data->port_type == PCIE_RC_PORT)
+ capabilities |= PCIE_PORT_SERVICE_PME;
+
irq_mode = assign_interrupt_mode(dev, vectors, capabilities);
- p_ext->interrupt_mode = irq_mode;
+ port_data->port_irq_mode = irq_mode;
/* Allocate child services if any */
for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
struct pcie_device *child;
if (capabilities & (1 << i)) {
- child = alloc_pcie_device(
- dev, /* parent */
- type, /* port type */
- i, /* service type */
- vectors[i], /* irq */
- irq_mode /* interrupt mode */);
+ child = alloc_pcie_device(dev, i, vectors[i]);
if (child) {
status = device_register(&child->device);
if (status) {
@@ -349,25 +321,30 @@ static int remove_iter(struct device *de
*/
void pcie_port_device_remove(struct pci_dev *dev)
{
- struct device *device;
- unsigned long device_addr;
- int interrupt_mode = PCIE_PORT_INTx_MODE;
+ struct pcie_port_data *port_data = pci_get_drvdata(dev);
int status;
do {
+ unsigned long device_addr;
+
status = device_for_each_child(&dev->dev, &device_addr, remove_iter);
if (status) {
- device = (struct device*)device_addr;
- interrupt_mode = (to_pcie_device(device))->interrupt_mode;
+ struct device *device = (struct device*)device_addr;
put_device(device);
device_unregister(device);
}
} while (status);
- /* Switch to INTx by default if MSI enabled */
- if (interrupt_mode == PCIE_PORT_MSIX_MODE)
+
+ switch (port_data->port_irq_mode) {
+ case PCIE_PORT_MSIX_MODE:
pci_disable_msix(dev);
- else if (interrupt_mode == PCIE_PORT_MSI_MODE)
+ break;
+ case PCIE_PORT_MSI_MODE:
pci_disable_msi(dev);
+ break;
+ }
+
+ kfree(port_data);
}
/**
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -36,7 +36,6 @@ struct pcie_port_service_id {
struct pcie_device {
int irq; /* Service IRQ/MSI/MSI-X Vector */
- int interrupt_mode; /* [0:INTx | 1:MSI | 2:MSI-X] */
struct pcie_port_service_id id; /* Service ID */
struct pci_dev *port; /* Root/Upstream/Downstream Port */
void *priv_data; /* Service Private Data */
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/7] PCI PCIe portdrv: Aviod using service devices with wrong interrupts (rev. 2)
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
2009-01-13 13:38 ` [PATCH 1/7] PCI PCIe portdrv: Use driver data to simplify code Rafael J. Wysocki
@ 2009-01-13 13:39 ` Rafael J. Wysocki
2009-01-13 13:42 ` [PATCH 3/7] PCI PCIe portdrv: Do not enable port device before setting up " Rafael J. Wysocki
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:39 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
The PCI Express port driver should not attempt to register service
devices that require the ability to generate interrupts if generating
interrupts is not possible. Namely, if the port has no interrupt pin
configured and we cannot set up MSI or MSI-X for it, there is no way
it can generate interrupts and in such a case the port services that
rely on interrupts (PME, PCIe HP, AER) should not be enabled for it.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/pcie/portdrv_core.c | 41 +++++++++++++++++++++++++++-------------
include/linux/pcieport_if.h | 1
2 files changed, 29 insertions(+), 13 deletions(-)
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -22,6 +22,7 @@
#define PCIE_PORT_SERVICE_VC 8 /* Virtual Channel */
/* Root/Upstream/Downstream Port's Interrupt Mode */
+#define PCIE_PORT_NO_IRQ (-1)
#define PCIE_PORT_INTx_MODE 0
#define PCIE_PORT_MSI_MODE 1
#define PCIE_PORT_MSIX_MODE 2
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -43,7 +43,7 @@ static int assign_interrupt_mode(struct
{
struct pcie_port_data *port_data = pci_get_drvdata(dev);
int i, pos, nvec, status = -EINVAL;
- int interrupt_mode = PCIE_PORT_INTx_MODE;
+ int interrupt_mode = PCIE_PORT_NO_IRQ;
/* Set INTx as default */
for (i = 0, nvec = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
@@ -51,7 +51,9 @@ static int assign_interrupt_mode(struct
nvec++;
vectors[i] = dev->irq;
}
-
+ if (dev->pin)
+ interrupt_mode = PCIE_PORT_INTx_MODE;
+
/* Check MSI quirk */
if (port_data->port_type == PCIE_RC_PORT && pcie_mch_quirk)
return interrupt_mode;
@@ -141,7 +143,7 @@ static void pcie_device_init(struct pci_
dev->id.vendor = parent->vendor;
dev->id.device = parent->device;
dev->id.port_type = port_type;
- dev->id.service_type = (1 << service_type);
+ dev->id.service_type = service_type;
/* Initialize generic device interface */
device = &dev->device;
@@ -232,19 +234,32 @@ int pcie_port_device_register(struct pci
/* Allocate child services if any */
for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
struct pcie_device *child;
+ int service = 1 << i;
- if (capabilities & (1 << i)) {
- child = alloc_pcie_device(dev, i, vectors[i]);
- if (child) {
- status = device_register(&child->device);
- if (status) {
- kfree(child);
- continue;
- }
- get_device(&child->device);
- }
+ if (!(capabilities & service))
+ continue;
+
+ /*
+ * Don't use service devices that require interrupts if there is
+ * no way to generate them.
+ */
+ if (irq_mode == PCIE_PORT_NO_IRQ
+ && service != PCIE_PORT_SERVICE_VC)
+ continue;
+
+ child = alloc_pcie_device(dev, service, vectors[i]);
+ if (!child)
+ continue;
+
+ status = device_register(&child->device);
+ if (status) {
+ kfree(child);
+ continue;
}
+
+ get_device(&child->device);
}
+
return 0;
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/7] PCI PCIe portdrv: Do not enable port device before setting up interrupts (rev. 2)
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
2009-01-13 13:38 ` [PATCH 1/7] PCI PCIe portdrv: Use driver data to simplify code Rafael J. Wysocki
2009-01-13 13:39 ` [PATCH 2/7] PCI PCIe portdrv: Aviod using service devices with wrong interrupts (rev. 2) Rafael J. Wysocki
@ 2009-01-13 13:42 ` Rafael J. Wysocki
2009-01-13 13:43 ` [PATCH 4/7] PCI PCIe portdrv: Remove unnecessary function Rafael J. Wysocki
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:42 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
The PCI Express port driver calls pci_enable_device() before setting
up interrupts, which is wrong, because if there is an interrupt pin
configured for the port, pci_enable_device() will likely set up an
interrupt link for it. However, this shouldn't be done if either
MSI or MSI-X interrupt mode is chosen for the port.
The solution is to call pci_enable_device() after setting up
interrupts, because in that case the interrupt link won't be set up
if MSI or MSI-X are enabled.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/pcie/portdrv_core.c | 38 ++++++++++++++++++++++++++++----------
drivers/pci/pcie/portdrv_pci.c | 11 +++--------
2 files changed, 31 insertions(+), 18 deletions(-)
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -208,7 +208,7 @@ int pcie_port_device_probe(struct pci_de
int pcie_port_device_register(struct pci_dev *dev)
{
struct pcie_port_data *port_data;
- int status, capabilities, irq_mode, i;
+ int status, capabilities, irq_mode, i, nr_serv;
int vectors[PCIE_PORT_DEVICE_MAXSERVICES];
u16 reg16;
@@ -229,24 +229,32 @@ int pcie_port_device_register(struct pci
capabilities |= PCIE_PORT_SERVICE_PME;
irq_mode = assign_interrupt_mode(dev, vectors, capabilities);
+ if (irq_mode == PCIE_PORT_NO_IRQ) {
+ /*
+ * Don't use service devices that require interrupts if there is
+ * no way to generate them.
+ */
+ if (!(capabilities & PCIE_PORT_SERVICE_VC)) {
+ status = -ENODEV;
+ goto Error;
+ }
+ capabilities = PCIE_PORT_SERVICE_VC;
+ }
port_data->port_irq_mode = irq_mode;
+ status = pci_enable_device(dev);
+ if (status)
+ goto Error;
+ pci_set_master(dev);
+
/* Allocate child services if any */
- for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
+ for (i = 0, nr_serv = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
struct pcie_device *child;
int service = 1 << i;
if (!(capabilities & service))
continue;
- /*
- * Don't use service devices that require interrupts if there is
- * no way to generate them.
- */
- if (irq_mode == PCIE_PORT_NO_IRQ
- && service != PCIE_PORT_SERVICE_VC)
- continue;
-
child = alloc_pcie_device(dev, service, vectors[i]);
if (!child)
continue;
@@ -258,9 +266,19 @@ int pcie_port_device_register(struct pci
}
get_device(&child->device);
+ nr_serv++;
+ }
+ if (!nr_serv) {
+ pci_disable_device(dev);
+ status = -ENODEV;
+ goto Error;
}
return 0;
+
+ Error:
+ kfree(port_data);
+ return status;
}
#ifdef CONFIG_PM
Index: linux-2.6/drivers/pci/pcie/portdrv_pci.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_pci.c
+++ linux-2.6/drivers/pci/pcie/portdrv_pci.c
@@ -94,18 +94,13 @@ static int __devinit pcie_portdrv_probe
if (status)
return status;
- if (pci_enable_device(dev) < 0)
- return -ENODEV;
-
- pci_set_master(dev);
if (!dev->irq && dev->pin) {
dev_warn(&dev->dev, "device [%04x:%04x] has invalid IRQ; "
"check vendor BIOS\n", dev->vendor, dev->device);
}
- if (pcie_port_device_register(dev)) {
- pci_disable_device(dev);
- return -ENOMEM;
- }
+ status = pcie_port_device_register(dev);
+ if (status)
+ return status;
pcie_portdrv_save_config(dev);
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/7] PCI PCIe portdrv: Remove unnecessary function
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
` (2 preceding siblings ...)
2009-01-13 13:42 ` [PATCH 3/7] PCI PCIe portdrv: Do not enable port device before setting up " Rafael J. Wysocki
@ 2009-01-13 13:43 ` Rafael J. Wysocki
2009-01-13 13:44 ` [PATCH 5/7] PCI PCIe portdrv: Simplily probe callback of service drivers (rev. 2) Rafael J. Wysocki
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:43 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
The function pcie_portdrv_save_config() in portdrv_pci.c is not
necessary. Remove it.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/pcie/portdrv_pci.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
Index: linux-2.6/drivers/pci/pcie/portdrv_pci.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_pci.c
+++ linux-2.6/drivers/pci/pcie/portdrv_pci.c
@@ -32,11 +32,6 @@ MODULE_LICENSE("GPL");
/* global data */
static const char device_name[] = "pcieport-driver";
-static int pcie_portdrv_save_config(struct pci_dev *dev)
-{
- return pci_save_state(dev);
-}
-
static int pcie_portdrv_restore_config(struct pci_dev *dev)
{
int retval;
@@ -102,7 +97,7 @@ static int __devinit pcie_portdrv_probe
if (status)
return status;
- pcie_portdrv_save_config(dev);
+ pci_save_state(dev);
pci_enable_pcie_error_reporting(dev);
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 5/7] PCI PCIe portdrv: Simplily probe callback of service drivers (rev. 2)
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
` (3 preceding siblings ...)
2009-01-13 13:43 ` [PATCH 4/7] PCI PCIe portdrv: Remove unnecessary function Rafael J. Wysocki
@ 2009-01-13 13:44 ` Rafael J. Wysocki
2009-01-13 13:46 ` [PATCH 6/7] PCI PCIe portdrv: Remove struct pcie_port_service_id (rev. 3) Rafael J. Wysocki
2009-01-13 13:48 ` [PATCH 7/7] PCI PCIe portdrv: Implement pm object Rafael J. Wysocki
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:44 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
The second argument of the ->probe() callback in
struct pcie_port_service_driver is unnecessary and never used.
Remove it.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/hotplug/pciehp_acpi.c | 3 +--
drivers/pci/hotplug/pciehp_core.c | 2 +-
drivers/pci/pcie/aer/aerdrv.c | 6 ++----
drivers/pci/pcie/portdrv_core.c | 2 +-
include/linux/pcieport_if.h | 3 +--
5 files changed, 6 insertions(+), 10 deletions(-)
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -56,8 +56,7 @@ static inline void* get_service_data(str
struct pcie_port_service_driver {
const char *name;
- int (*probe) (struct pcie_device *dev,
- const struct pcie_port_service_id *id);
+ int (*probe) (struct pcie_device *dev);
void (*remove) (struct pcie_device *dev);
int (*suspend) (struct pcie_device *dev, pm_message_t state);
int (*resume) (struct pcie_device *dev);
Index: linux-2.6/drivers/pci/pcie/aer/aerdrv.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c
@@ -38,8 +38,7 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
-static int __devinit aer_probe (struct pcie_device *dev,
- const struct pcie_port_service_id *id );
+static int __devinit aer_probe (struct pcie_device *dev);
static void aer_remove(struct pcie_device *dev);
static int aer_suspend(struct pcie_device *dev, pm_message_t state)
{return 0;}
@@ -207,8 +206,7 @@ static void aer_remove(struct pcie_devic
*
* Invoked when PCI Express bus loads AER service driver.
**/
-static int __devinit aer_probe (struct pcie_device *dev,
- const struct pcie_port_service_id *id )
+static int __devinit aer_probe (struct pcie_device *dev)
{
int status;
struct aer_rpc *rpc;
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -402,7 +402,7 @@ static int pcie_port_probe_service(struc
return -ENODEV;
pciedev = to_pcie_device(dev);
- status = driver->probe(pciedev, driver->id_table);
+ status = driver->probe(pciedev);
if (!status) {
dev_printk(KERN_DEBUG, dev, "service driver %s loaded\n",
driver->name);
Index: linux-2.6/drivers/pci/hotplug/pciehp_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_core.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_core.c
@@ -399,7 +399,7 @@ static int get_cur_bus_speed(struct hotp
return 0;
}
-static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_id *id)
+static int pciehp_probe(struct pcie_device *dev)
{
int rc;
struct controller *ctrl;
Index: linux-2.6/drivers/pci/hotplug/pciehp_acpi.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_acpi.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_acpi.c
@@ -82,8 +82,7 @@ static int __initdata acpi_slot_detected
static struct list_head __initdata dummy_slots = LIST_HEAD_INIT(dummy_slots);
/* Dummy driver for dumplicate name detection */
-static int __init dummy_probe(struct pcie_device *dev,
- const struct pcie_port_service_id *id)
+static int __init dummy_probe(struct pcie_device *dev)
{
int pos;
u32 slot_cap;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 6/7] PCI PCIe portdrv: Remove struct pcie_port_service_id (rev. 3)
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
` (4 preceding siblings ...)
2009-01-13 13:44 ` [PATCH 5/7] PCI PCIe portdrv: Simplily probe callback of service drivers (rev. 2) Rafael J. Wysocki
@ 2009-01-13 13:46 ` Rafael J. Wysocki
2009-01-13 13:48 ` [PATCH 7/7] PCI PCIe portdrv: Implement pm object Rafael J. Wysocki
6 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:46 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
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>
---
drivers/pci/hotplug/pciehp_acpi.c | 13 ++-----------
drivers/pci/hotplug/pciehp_core.c | 12 ++----------
drivers/pci/pcie/aer/aerdrv.c | 16 ++--------------
drivers/pci/pcie/aer/aerdrv_core.c | 10 +++++-----
drivers/pci/pcie/portdrv.h | 5 -----
drivers/pci/pcie/portdrv_bus.c | 18 ++++++++++--------
drivers/pci/pcie/portdrv_core.c | 5 +----
include/linux/pcieport_if.h | 17 ++++++++---------
8 files changed, 30 insertions(+), 66 deletions(-)
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -27,18 +27,15 @@
#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) \
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -140,10 +140,7 @@ static void pcie_device_init(struct pci_
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: linux-2.6/drivers/pci/pcie/portdrv_bus.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_bus.c
+++ linux-2.6/drivers/pci/pcie/portdrv_bus.c
@@ -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: linux-2.6/drivers/pci/pcie/aer/aerdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv_core.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv_core.c
@@ -320,21 +320,21 @@ static int find_aer_service_iter(struct
{
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: linux-2.6/drivers/pci/hotplug/pciehp_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_core.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_core.c
@@ -496,18 +496,10 @@ static int pciehp_resume (struct pcie_de
}
#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: linux-2.6/drivers/pci/pcie/aer/aerdrv.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c
@@ -48,19 +48,6 @@ static pci_ers_result_t aer_error_detect
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_err
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: linux-2.6/drivers/pci/hotplug/pciehp_acpi.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_acpi.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_acpi.c
@@ -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 pci
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: linux-2.6/drivers/pci/pcie/portdrv.h
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv.h
+++ linux-2.6/drivers/pci/pcie/portdrv.h
@@ -28,11 +28,6 @@
#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);
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 7/7] PCI PCIe portdrv: Implement pm object
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
` (5 preceding siblings ...)
2009-01-13 13:46 ` [PATCH 6/7] PCI PCIe portdrv: Remove struct pcie_port_service_id (rev. 3) Rafael J. Wysocki
@ 2009-01-13 13:48 ` Rafael J. Wysocki
2009-01-16 18:20 ` Jesse Barnes
6 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-13 13:48 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
From: Rafael J. Wysocki <rjw@sisk.pl>
Implement pm object for the PCI Express port driver in order to use
the new power management framework and reduce the code size.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/pci/hotplug/pciehp_core.c | 4 +--
drivers/pci/pcie/aer/aerdrv.c | 6 -----
drivers/pci/pcie/portdrv.h | 4 +--
drivers/pci/pcie/portdrv_core.c | 14 +++++-------
drivers/pci/pcie/portdrv_pci.c | 43 ++++++++++++--------------------------
include/linux/pcieport_if.h | 2 -
6 files changed, 25 insertions(+), 48 deletions(-)
Index: linux-2.6/drivers/pci/pcie/portdrv_pci.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_pci.c
+++ linux-2.6/drivers/pci/pcie/portdrv_pci.c
@@ -44,33 +44,21 @@ static int pcie_portdrv_restore_config(s
}
#ifdef CONFIG_PM
-static int pcie_portdrv_suspend(struct pci_dev *dev, pm_message_t state)
-{
- return pcie_port_device_suspend(dev, state);
-
-}
+static struct dev_pm_ops pcie_portdrv_pm_ops = {
+ .suspend = pcie_port_device_suspend,
+ .resume = pcie_port_device_resume,
+ .freeze = pcie_port_device_suspend,
+ .thaw = pcie_port_device_resume,
+ .poweroff = pcie_port_device_suspend,
+ .restore = pcie_port_device_resume,
+};
-static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)
-{
- return pci_save_state(dev);
-}
+#define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops)
-static int pcie_portdrv_resume_early(struct pci_dev *dev)
-{
- return pci_restore_state(dev);
-}
+#else /* !PM */
-static int pcie_portdrv_resume(struct pci_dev *dev)
-{
- pcie_portdrv_restore_config(dev);
- return pcie_port_device_resume(dev);
-}
-#else
-#define pcie_portdrv_suspend NULL
-#define pcie_portdrv_suspend_late NULL
-#define pcie_portdrv_resume_early NULL
-#define pcie_portdrv_resume NULL
-#endif
+#define PCIE_PORTDRV_PM_OPS NULL
+#endif /* !PM */
/*
* pcie_portdrv_probe - Probe PCI-Express port devices
@@ -281,12 +269,9 @@ static struct pci_driver pcie_portdriver
.probe = pcie_portdrv_probe,
.remove = pcie_portdrv_remove,
- .suspend = pcie_portdrv_suspend,
- .suspend_late = pcie_portdrv_suspend_late,
- .resume_early = pcie_portdrv_resume_early,
- .resume = pcie_portdrv_resume,
-
.err_handler = &pcie_portdrv_err_handler,
+
+ .driver.pm = PCIE_PORTDRV_PM_OPS,
};
static int __init pcie_portdrv_init(void)
Index: linux-2.6/drivers/pci/pcie/portdrv.h
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv.h
+++ linux-2.6/drivers/pci/pcie/portdrv.h
@@ -32,8 +32,8 @@ extern struct bus_type pcie_port_bus_typ
extern int pcie_port_device_probe(struct pci_dev *dev);
extern int pcie_port_device_register(struct pci_dev *dev);
#ifdef CONFIG_PM
-extern int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state);
-extern int pcie_port_device_resume(struct pci_dev *dev);
+extern int pcie_port_device_suspend(struct device *dev);
+extern int pcie_port_device_resume(struct device *dev);
#endif
extern void pcie_port_device_remove(struct pci_dev *dev);
extern int __must_check pcie_port_bus_register(void);
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -282,13 +282,12 @@ int pcie_port_device_register(struct pci
static int suspend_iter(struct device *dev, void *data)
{
struct pcie_port_service_driver *service_driver;
- pm_message_t state = * (pm_message_t *) data;
if ((dev->bus == &pcie_port_bus_type) &&
(dev->driver)) {
service_driver = to_service_driver(dev->driver);
if (service_driver->suspend)
- service_driver->suspend(to_pcie_device(dev), state);
+ service_driver->suspend(to_pcie_device(dev));
}
return 0;
}
@@ -296,11 +295,10 @@ static int suspend_iter(struct device *d
/**
* pcie_port_device_suspend - suspend port services associated with a PCIe port
* @dev: PCI Express port to handle
- * @state: Representation of system power management transition in progress
*/
-int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state)
+int pcie_port_device_suspend(struct device *dev)
{
- return device_for_each_child(&dev->dev, &state, suspend_iter);
+ return device_for_each_child(dev, NULL, suspend_iter);
}
static int resume_iter(struct device *dev, void *data)
@@ -320,11 +318,11 @@ static int resume_iter(struct device *de
* pcie_port_device_suspend - resume port services associated with a PCIe port
* @dev: PCI Express port to handle
*/
-int pcie_port_device_resume(struct pci_dev *dev)
+int pcie_port_device_resume(struct device *dev)
{
- return device_for_each_child(&dev->dev, NULL, resume_iter);
+ return device_for_each_child(dev, NULL, resume_iter);
}
-#endif
+#endif /* PM */
static int remove_iter(struct device *dev, void *data)
{
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -55,7 +55,7 @@ struct pcie_port_service_driver {
const char *name;
int (*probe) (struct pcie_device *dev);
void (*remove) (struct pcie_device *dev);
- int (*suspend) (struct pcie_device *dev, pm_message_t state);
+ int (*suspend) (struct pcie_device *dev);
int (*resume) (struct pcie_device *dev);
/* Service Error Recovery Handler */
Index: linux-2.6/drivers/pci/pcie/aer/aerdrv.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c
@@ -40,9 +40,6 @@ MODULE_LICENSE("GPL");
static int __devinit aer_probe (struct pcie_device *dev);
static void aer_remove(struct pcie_device *dev);
-static int aer_suspend(struct pcie_device *dev, pm_message_t state)
-{return 0;}
-static int aer_resume(struct pcie_device *dev) {return 0;}
static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
enum pci_channel_state error);
static void aer_error_resume(struct pci_dev *dev);
@@ -61,9 +58,6 @@ static struct pcie_port_service_driver a
.probe = aer_probe,
.remove = aer_remove,
- .suspend = aer_suspend,
- .resume = aer_resume,
-
.err_handler = &aer_error_handlers,
.reset_link = aer_root_reset,
Index: linux-2.6/drivers/pci/hotplug/pciehp_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_core.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_core.c
@@ -466,7 +466,7 @@ static void pciehp_remove (struct pcie_d
}
#ifdef CONFIG_PM
-static int pciehp_suspend (struct pcie_device *dev, pm_message_t state)
+static int pciehp_suspend (struct pcie_device *dev)
{
dev_info(&dev->device, "%s ENTRY\n", __func__);
return 0;
@@ -494,7 +494,7 @@ static int pciehp_resume (struct pcie_de
}
return 0;
}
-#endif
+#endif /* PM */
static struct pcie_port_service_driver hpdriver_portdrv = {
.name = PCIE_MODULE_NAME,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 7/7] PCI PCIe portdrv: Implement pm object
2009-01-13 13:48 ` [PATCH 7/7] PCI PCIe portdrv: Implement pm object Rafael J. Wysocki
@ 2009-01-16 18:20 ` Jesse Barnes
2009-01-16 21:15 ` Rafael J. Wysocki
0 siblings, 1 reply; 10+ messages in thread
From: Jesse Barnes @ 2009-01-16 18:20 UTC (permalink / raw)
To: Rafael J. Wysocki; +Cc: LKML, Linux PCI
On Tuesday, January 13, 2009 5:48 am Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rjw@sisk.pl>
>
> Implement pm object for the PCI Express port driver in order to use
> the new power management framework and reduce the code size.
>
> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
I applied this series. Hopefully you can Kenji-san can get on the same page
wrt MSI vector handling so we can apply the last one from one of you. :)
Thanks,
--
Jesse Barnes, Intel Open Source Technology Center
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 7/7] PCI PCIe portdrv: Implement pm object
2009-01-16 18:20 ` Jesse Barnes
@ 2009-01-16 21:15 ` Rafael J. Wysocki
0 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2009-01-16 21:15 UTC (permalink / raw)
To: Jesse Barnes; +Cc: LKML, Linux PCI
On Friday 16 January 2009, Jesse Barnes wrote:
> On Tuesday, January 13, 2009 5:48 am Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <rjw@sisk.pl>
> >
> > Implement pm object for the PCI Express port driver in order to use
> > the new power management framework and reduce the code size.
> >
> > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
>
> I applied this series.
Thanks!
> Hopefully you can Kenji-san can get on the same page
> wrt MSI vector handling so we can apply the last one from one of you. :)
We will. :-)
Best,
Rafael
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-01-16 21:16 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-13 13:34 [PATCH 0/7] PCI Express port driver fixes and cleanups (rev. 2) Rafael J. Wysocki
2009-01-13 13:38 ` [PATCH 1/7] PCI PCIe portdrv: Use driver data to simplify code Rafael J. Wysocki
2009-01-13 13:39 ` [PATCH 2/7] PCI PCIe portdrv: Aviod using service devices with wrong interrupts (rev. 2) Rafael J. Wysocki
2009-01-13 13:42 ` [PATCH 3/7] PCI PCIe portdrv: Do not enable port device before setting up " Rafael J. Wysocki
2009-01-13 13:43 ` [PATCH 4/7] PCI PCIe portdrv: Remove unnecessary function Rafael J. Wysocki
2009-01-13 13:44 ` [PATCH 5/7] PCI PCIe portdrv: Simplily probe callback of service drivers (rev. 2) Rafael J. Wysocki
2009-01-13 13:46 ` [PATCH 6/7] PCI PCIe portdrv: Remove struct pcie_port_service_id (rev. 3) Rafael J. Wysocki
2009-01-13 13:48 ` [PATCH 7/7] PCI PCIe portdrv: Implement pm object Rafael J. Wysocki
2009-01-16 18:20 ` Jesse Barnes
2009-01-16 21:15 ` Rafael J. Wysocki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®