diff mbox

[v3] Setup disabled bridges even if buses are added.

Message ID 20090403164009.0987.27C06F64@necst.nec.co.jp
State Accepted, archived
Headers show

Commit Message

Yuji Shimada April 3, 2009, 7:41 a.m. UTC
Thank you for your review.


This patch setups disabled bridges even if buses have already been
added.

pci_assign_unassigned_resources is called after buses are added.
pci_assign_unassigned_resources calls pci_bus_assign_resources.
pci_bus_assign_resources calls pci_setup_bridge to configure BARs of
bridges.

Currently pci_setup_bridge returns immediately if the bus have already
been added. So pci_assign_unassigned_resources can't configure BARs of
bridge.

The patch fixes the issue.

On logical hot-add, we need to prevent the kernel from re-initializing
bridges that have already been initialized. To achieve this,
pci_setup_bridge returns immediately if the bridge have already been
enabled.

We don't need to check whether the specified bus is a root bus or not.
pci_setup_bridge is not called on a root bus, because a root bus does
not have a bridge.

The patch adds a new helper function, pci_is_enabled. I made the
function name similar to pci_is_managed. The codes which use
enable_cnt directly are changed to use pci_is_enabled.

Thanks,
--
Yuji Shimada


Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>


--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Alexander Chiang April 3, 2009, 5:16 p.m. UTC | #1
* Yuji Shimada <shimada-yxb@necst.nec.co.jp>:
> Thank you for your review.
> 
> 
> This patch setups disabled bridges even if buses have already been
> added.
> 
> pci_assign_unassigned_resources is called after buses are added.
> pci_assign_unassigned_resources calls pci_bus_assign_resources.
> pci_bus_assign_resources calls pci_setup_bridge to configure BARs of
> bridges.
> 
> Currently pci_setup_bridge returns immediately if the bus have already
> been added. So pci_assign_unassigned_resources can't configure BARs of
> bridge.
> 
> The patch fixes the issue.
> 
> On logical hot-add, we need to prevent the kernel from re-initializing
> bridges that have already been initialized. To achieve this,
> pci_setup_bridge returns immediately if the bridge have already been
> enabled.
> 
> We don't need to check whether the specified bus is a root bus or not.
> pci_setup_bridge is not called on a root bus, because a root bus does
> not have a bridge.
> 
> The patch adds a new helper function, pci_is_enabled. I made the
> function name similar to pci_is_managed. The codes which use
> enable_cnt directly are changed to use pci_is_enabled.
> 
> Thanks,
> --
> Yuji Shimada
 
Acked-by: Alex Chiang <achiang@hp.com>
 
> Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
 
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jesse Barnes April 6, 2009, 6:47 p.m. UTC | #2
On Fri, 03 Apr 2009 16:41:46 +0900
Yuji Shimada <shimada-yxb@necst.nec.co.jp> wrote:

> Thank you for your review.
> 
> 
> This patch setups disabled bridges even if buses have already been
> added.

Applied, thanks guys.
diff mbox

Patch

diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 68f91a2..97a8194 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -184,7 +184,7 @@  void pci_enable_bridges(struct pci_bus *bus)
 
 	list_for_each_entry(dev, &bus->devices, bus_list) {
 		if (dev->subordinate) {
-			if (atomic_read(&dev->enable_cnt) == 0) {
+			if (!pci_is_enabled(dev)) {
 				retval = pci_enable_device(dev);
 				pci_set_master(dev);
 			}
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index e9a8706..cd8e682 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -148,7 +148,7 @@  static ssize_t is_enabled_store(struct device *dev,
 		return -EPERM;
 
 	if (!val) {
-		if (atomic_read(&pdev->enable_cnt) != 0)
+		if (pci_is_enabled(pdev))
 			pci_disable_device(pdev);
 		else
 			result = -EIO;
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 59569b8..5080a5d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -812,7 +812,7 @@  static int do_pci_enable_device(struct pci_dev *dev, int bars)
  */
 int pci_reenable_device(struct pci_dev *dev)
 {
-	if (atomic_read(&dev->enable_cnt))
+	if (pci_is_enabled(dev))
 		return do_pci_enable_device(dev, (1 << PCI_NUM_RESOURCES) - 1);
 	return 0;
 }
@@ -1010,7 +1010,7 @@  static void do_pci_disable_device(struct pci_dev *dev)
  */
 void pci_disable_enabled_device(struct pci_dev *dev)
 {
-	if (atomic_read(&dev->enable_cnt))
+	if (pci_is_enabled(dev))
 		do_pci_disable_device(dev);
 }
 
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 334285a..8d9da9d 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -144,7 +144,7 @@  static void pci_setup_bridge(struct pci_bus *bus)
 	struct pci_bus_region region;
 	u32 l, bu, lu, io_upper16;
 
-	if (!pci_is_root_bus(bus) && bus->is_added)
+	if (pci_is_enabled(bridge))
 		return;
 
 	dev_info(&bridge->dev, "PCI bridge, secondary bus %04x:%02x\n",
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 6fb335b..1873182 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -674,6 +674,11 @@  int __must_check pci_reenable_device(struct pci_dev *);
 int __must_check pcim_enable_device(struct pci_dev *pdev);
 void pcim_pin_device(struct pci_dev *pdev);
 
+static inline int pci_is_enabled(struct pci_dev *pdev)
+{
+	return (atomic_read(&pdev->enable_cnt) > 0);
+}
+
 static inline int pci_is_managed(struct pci_dev *pdev)
 {
 	return pdev->is_managed;