All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] PCI-E broken on PPC (regression)
@ 2010-01-25 13:42 Breno Leitao
  2010-01-25 20:38 ` Jesse Barnes
  2010-01-26  4:18 ` Kenji Kaneshige
  0 siblings, 2 replies; 15+ messages in thread
From: Breno Leitao @ 2010-01-25 13:42 UTC (permalink / raw)
  To: Linux PCI, linuxppc-dev; +Cc: Jay Vosburgh, Ron Mercer, kaneshige.kenji

Hello, 

I found that qlge is broken on PPC, and it got broken after commit 
06a1cbafb253c4c60d6a54a994887f5fbceabcc0. It happens because dev->pcie 
is not set on PPC, because the function set_pcie_port_type(), who sets
dev->pcie, is not being called on PPC PCI code.

So, I have two ideas to fix it, the first one is to call 
set_pcie_port_type() on pci_device_add() instead of pci_setup_device(). 
Since that PPC device flow calls pci_device_add(), it fixes the problem
without duplicating the caller for this function. 

OTOH, it's also possible to add set_pcie_port_type() on pci.h and call
it inside the PPC PCI files, specifically on of_create_pci_dev().

I tested both ideas and they work perfect, so I'd like to figure out 
which one is the most correct one. Both patches are attached here. 

Thanks, 
Breno

----- First idea -----

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 98ffb2d..328c3ab 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -746,7 +746,6 @@ int pci_setup_device(struct pci_dev *dev)
 	dev->hdr_type = hdr_type & 0x7f;
 	dev->multifunction = !!(hdr_type & 0x80);
 	dev->error_state = pci_channel_io_normal;
-	set_pcie_port_type(dev);
 	set_pci_aer_firmware_first(dev);
 
 	list_for_each_entry(slot, &dev->bus->slots, list)
@@ -1052,6 +1051,7 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
 	/* Initialize various capabilities */
 	pci_init_capabilities(dev);
 
+	set_pcie_port_type(dev);
 	/*
 	 * Add the device to our list of discovered devices
 	 * and the bus list for fixup functions, etc.

----- Second idea -----

diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c
index 7311fdf..f8820e8 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -160,6 +160,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
 	dev->error_state = pci_channel_io_normal;
 	dev->dma_mask = 0xffffffff;
 
+	set_pcie_port_type(dev);
 	if (!strcmp(type, "pci") || !strcmp(type, "pciex")) {
 		/* a PCI-PCI bridge */
 		dev->hdr_type = PCI_HEADER_TYPE_BRIDGE;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 98ffb2d..f787eea 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -681,7 +681,7 @@ static void pci_read_irq(struct pci_dev *dev)
 	dev->irq = irq;
 }
 
-static void set_pcie_port_type(struct pci_dev *pdev)
+void set_pcie_port_type(struct pci_dev *pdev)
 {
 	int pos;
 	u16 reg16;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 174e539..765095b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1269,6 +1269,7 @@ int pcibios_add_platform_entries(struct pci_dev *dev);
 void pcibios_disable_device(struct pci_dev *dev);
 int pcibios_set_pcie_reset_state(struct pci_dev *dev,
 				 enum pcie_reset_state state);
+extern void set_pcie_port_type(struct pci_dev *pdev);
 
 #ifdef CONFIG_PCI_MMCONFIG
 extern void __init pci_mmcfg_early_init(void);

^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2010-02-18  0:31 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-25 13:42 [RFC PATCH] PCI-E broken on PPC (regression) Breno Leitao
2010-01-25 20:38 ` Jesse Barnes
2010-01-26  1:50   ` Jesse Barnes
2010-01-26  2:59     ` Benjamin Herrenschmidt
2010-01-26  4:36     ` Kenji Kaneshige
2010-01-27  2:10     ` Benjamin Herrenschmidt
2010-01-27 16:26       ` Jesse Barnes
2010-01-27 22:00         ` Benjamin Herrenschmidt
2010-01-28  0:01           ` David Miller
2010-01-28  0:03             ` Jesse Barnes
2010-01-29  3:45       ` Matthew Wilcox
2010-01-29  3:54         ` Benjamin Herrenschmidt
2010-02-18  0:22       ` David Miller
2010-02-18  0:29         ` Jesse Barnes
2010-01-26  4:18 ` Kenji Kaneshige

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.