public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [GIT PATCH] PCI bugfixes for 2.6.12-rc5
@ 2005-06-01  5:08 Greg KH
  2005-06-01  5:08 ` [PATCH] PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2005-06-01  5:08 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-pci

Here are 3 patches for the 2.6.12-rc5 tree that fix some PCI and PCI
Hotplug bugs, and 1 patch that adds some new device ids for nvidia ide
controllers.  All of these patches have been in the past few -mm
releases.

Please pull from:
	rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6.git/

Full patches will be sent to the linux-kernel and linux-pci mailing lists, if
anyone wants to see them.

thanks,

greg k-h

 drivers/ide/pci/amd74xx.c               |    3 
 drivers/pci/hotplug/cpci_hotplug_core.c |  302 ++++++++++++++------------------
 drivers/pci/hotplug/cpci_hotplug_pci.c  |  144 +++++----------
 drivers/pci/hotplug/shpchprm_acpi.c     |    4 
 include/linux/pci_ids.h                 |    6 
 5 files changed, 203 insertions(+), 256 deletions(-)
-------------

Andy Currid:
  o PCI: amd74xx patch for new NVIDIA device IDs

Kenji Kaneshige:
  o PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly
  o PCI Hotplug: shpchp driver doesn't program _HPP values properly

Scott Murray:
  o PCI Hotplug: more CPCI updates


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

* [PATCH] PCI: amd74xx patch for new NVIDIA device IDs
  2005-06-01  5:08   ` [PATCH] PCI Hotplug: shpchp driver doesn't program _HPP values properly Greg KH
@ 2005-06-01  5:08     ` Greg KH
  2005-06-01  5:08       ` [PATCH] PCI Hotplug: more CPCI updates Greg KH
  2005-06-01  7:32       ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Jeff Garzik
  0 siblings, 2 replies; 11+ messages in thread
From: Greg KH @ 2005-06-01  5:08 UTC (permalink / raw)
  To: linux-kernel, linux-pci; +Cc: acurrid

[PATCH] PCI: amd74xx patch for new NVIDIA device IDs

Here's the 2.6 amd74xx patch for NVIDIA MCP51.

Signed-off-by: Andy Currid <acurrid@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
commit af00f9811e0ccbd3db84ddc4cffb0da942653393
tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
author Andy Currid <acurrid@nvidia.com> Mon, 23 May 2005 08:55:45 -0700
committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:38 -0700

 drivers/ide/pci/amd74xx.c |    3 +++
 include/linux/pci_ids.h   |    6 ++++++
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -72,6 +72,7 @@ static struct amd_ide_chip {
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,	0x50, AMD_UDMA_133 },
+	{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,	0x50, AMD_UDMA_133 },
 	{ 0 }
 };
 
@@ -487,6 +488,7 @@ static ide_pci_device_t amd74xx_chipsets
 	/* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"),
 	/* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
 	/* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
+	/* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
 };
 
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
@@ -521,6 +523,7 @@ static struct pci_device_id amd74xx_pci_
 #endif
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
 	{ 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1230,6 +1230,12 @@
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL	0x0258
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL	0x0259
 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL	0x025B
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE	0x0265
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA	0x0266
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2	0x0267
+#define PCI_DEVICE_ID_NVIDIA_NVENET_12		0x0268
+#define PCI_DEVICE_ID_NVIDIA_NVENET_13		0x0269
+#define PCI_DEVICE_ID_NVIDIA_MCP51_AUDIO	0x026B
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800	0x0280
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X    0x0281
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE     0x0282


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

* [PATCH] PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly
  2005-06-01  5:08 [GIT PATCH] PCI bugfixes for 2.6.12-rc5 Greg KH
@ 2005-06-01  5:08 ` Greg KH
  2005-06-01  5:08   ` [PATCH] PCI Hotplug: shpchp driver doesn't program _HPP values properly Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2005-06-01  5:08 UTC (permalink / raw)
  To: linux-kernel, linux-pci; +Cc: kaneshige.kenji

[PATCH] PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly

Current shpchp driver doesn't seem to program command register to
enable PERR and SERR properly. The following patch fixes this issue.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
commit 2ac2610b26c9da72820443328ff2c56c7b8c87b8
tree 9ca01e869d0c5a958232b7007e3fb48a27b0c5b3
parent 7a8cb869f31de525bc34095f51f8c8a43ffcb6a9
author Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Fri, 27 May 2005 16:08:14 +0900
committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:37 -0700

 drivers/pci/hotplug/shpchprm_acpi.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/pci/hotplug/shpchprm_acpi.c b/drivers/pci/hotplug/shpchprm_acpi.c
--- a/drivers/pci/hotplug/shpchprm_acpi.c
+++ b/drivers/pci/hotplug/shpchprm_acpi.c
@@ -1681,7 +1681,7 @@ void shpchprm_enable_card(
 		| PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
 	bcmd = bcommand  = bcommand | PCI_BRIDGE_CTL_NO_ISA;
 
-	ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
+	ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus);
 	if (ab) {
 		if (ab->_hpp) {
 			if (ab->_hpp->enable_perr) {


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

* [PATCH] PCI Hotplug: shpchp driver doesn't program _HPP values properly
  2005-06-01  5:08 ` [PATCH] PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly Greg KH
@ 2005-06-01  5:08   ` Greg KH
  2005-06-01  5:08     ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2005-06-01  5:08 UTC (permalink / raw)
  To: linux-kernel, linux-pci; +Cc: kaneshige.kenji

[PATCH] PCI Hotplug: shpchp driver doesn't program _HPP values properly

Current shpchp driver doesn't seem to program _HPP values
properly. The following patch fixes this issue.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
commit 7a8cb869f31de525bc34095f51f8c8a43ffcb6a9
tree 952c03852730f328c2b500acb4748d2c4298d2b3
parent 2e3e80c2b75e3815a0160cbd23d4fdb767d66b35
author Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Mon, 23 May 2005 19:50:32 +0900
committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:37 -0700

 drivers/pci/hotplug/shpchprm_acpi.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/pci/hotplug/shpchprm_acpi.c b/drivers/pci/hotplug/shpchprm_acpi.c
--- a/drivers/pci/hotplug/shpchprm_acpi.c
+++ b/drivers/pci/hotplug/shpchprm_acpi.c
@@ -1626,7 +1626,7 @@ int shpchprm_set_hpp(
 	pci_bus->number = func->bus;
 	devfn = PCI_DEVFN(func->device, func->function);
 
-	ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus);
+	ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus);
 
 	if (ab) {
 		if (ab->_hpp) {


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

* [PATCH] PCI Hotplug: more CPCI updates
  2005-06-01  5:08     ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Greg KH
@ 2005-06-01  5:08       ` Greg KH
  2005-06-02  2:41         ` Prarit Bhargava
  2005-06-01  7:32       ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Jeff Garzik
  1 sibling, 1 reply; 11+ messages in thread
From: Greg KH @ 2005-06-01  5:08 UTC (permalink / raw)
  To: linux-kernel, linux-pci; +Cc: scottm

[PATCH] PCI Hotplug: more CPCI updates

Here is my third attempt at a patch to further update the CompactPCI
hotplug driver infrastructure to address the pci_enable_device issue
discussed on the list as well as a few other issues I discovered during
some more testing.  This version addresses a few more issues pointed out
by Prarit Bhargava.  Changes include:
- cpci_enable_device and its recursive calling of pci_enable_device on
  new devices removed.
- Use list_rwsem to avoid slot status change races between disable_slot
  and check_slots.
- Fixed oopsing in cpci_hp_unregister_bus caused by calling list_del on
  a slot after calling pci_hp_deregister.
- Removed kfree calls in cleanup_slots since release_slot will have
  done it already.
- Reworked init_slots a bit to fix latch and adapter file updating on
  subsequent calls to cpci_hp_start.
- Improved sanity checking in cpci_hp_register_controller.
- Now shut things down correctly in cpci_hotplug_exit.
- Switch to pci_get_slot instead of deprecated pci_find_slot.
- A bunch of CodingStyle fixes.

Signed-off-by: Scott Murray <scottm@somanetworks.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
commit bcc488ab02254a6e60d749187a632dc3d642d4f8
tree 4cd45b4d546cf85c14c442b27f611e048a4d9938
parent af00f9811e0ccbd3db84ddc4cffb0da942653393
author Scott Murray <scottm@somanetworks.com> Fri, 27 May 2005 16:48:52 -0400
committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:38 -0700

 drivers/pci/hotplug/cpci_hotplug_core.c |  302 ++++++++++++++-----------------
 drivers/pci/hotplug/cpci_hotplug_pci.c  |  144 ++++++---------
 2 files changed, 192 insertions(+), 254 deletions(-)

diff --git a/drivers/pci/hotplug/cpci_hotplug_core.c b/drivers/pci/hotplug/cpci_hotplug_core.c
--- a/drivers/pci/hotplug/cpci_hotplug_core.c
+++ b/drivers/pci/hotplug/cpci_hotplug_core.c
@@ -1,7 +1,7 @@
 /*
  * CompactPCI Hot Plug Driver
  *
- * Copyright (C) 2002 SOMA Networks, Inc.
+ * Copyright (C) 2002,2005 SOMA Networks, Inc.
  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
  * Copyright (C) 2001 IBM Corp.
  *
@@ -45,10 +45,10 @@
 
 #define dbg(format, arg...)					\
 	do {							\
-		if(cpci_debug)					\
+		if (cpci_debug)					\
 			printk (KERN_DEBUG "%s: " format "\n",	\
 				MY_NAME , ## arg); 		\
-	} while(0)
+	} while (0)
 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
@@ -111,10 +111,8 @@ enable_slot(struct hotplug_slot *hotplug
 
 	dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
 
-	if(controller->ops->set_power) {
+	if (controller->ops->set_power)
 		retval = controller->ops->set_power(slot, 1);
-	}
-
 	return retval;
 }
 
@@ -126,37 +124,41 @@ disable_slot(struct hotplug_slot *hotplu
 
 	dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
 
+	down_write(&list_rwsem);
+
 	/* Unconfigure device */
 	dbg("%s - unconfiguring slot %s",
 	    __FUNCTION__, slot->hotplug_slot->name);
-	if((retval = cpci_unconfigure_slot(slot))) {
+	if ((retval = cpci_unconfigure_slot(slot))) {
 		err("%s - could not unconfigure slot %s",
 		    __FUNCTION__, slot->hotplug_slot->name);
-		return retval;
+		goto disable_error;
 	}
 	dbg("%s - finished unconfiguring slot %s",
 	    __FUNCTION__, slot->hotplug_slot->name);
 
 	/* Clear EXT (by setting it) */
-	if(cpci_clear_ext(slot)) {
+	if (cpci_clear_ext(slot)) {
 		err("%s - could not clear EXT for slot %s",
 		    __FUNCTION__, slot->hotplug_slot->name);
 		retval = -ENODEV;
+		goto disable_error;
 	}
 	cpci_led_on(slot);
 
-	if(controller->ops->set_power) {
-		retval = controller->ops->set_power(slot, 0);
-	}
+	if (controller->ops->set_power)
+		if ((retval = controller->ops->set_power(slot, 0)))
+			goto disable_error;
 
-	if(update_adapter_status(slot->hotplug_slot, 0)) {
+	if (update_adapter_status(slot->hotplug_slot, 0))
 		warn("failure to update adapter file");
-	}
 
-	if(slot->extracting) {
+	if (slot->extracting) {
 		slot->extracting = 0;
 		atomic_dec(&extracting);
 	}
+disable_error:
+	up_write(&list_rwsem);
 	return retval;
 }
 
@@ -165,9 +167,8 @@ cpci_get_power_status(struct slot *slot)
 {
 	u8 power = 1;
 
-	if(controller->ops->get_power) {
+	if (controller->ops->get_power)
 		power = controller->ops->get_power(slot);
-	}
 	return power;
 }
 
@@ -237,9 +238,8 @@ cpci_hp_register_bus(struct pci_bus *bus
 	int status = -ENOMEM;
 	int i;
 
-	if(!(controller && bus)) {
+	if (!(controller && bus))
 		return -ENODEV;
-	}
 
 	/*
 	 * Create a structure for each slot, and register that slot
@@ -316,32 +316,30 @@ int
 cpci_hp_unregister_bus(struct pci_bus *bus)
 {
 	struct slot *slot;
-	struct list_head *tmp;
-	struct list_head *next;
-	int status;
+	struct slot *tmp;
+	int status = 0;
 
 	down_write(&list_rwsem);
-	if(!slots) {
+	if (!slots) {
 		up_write(&list_rwsem);
 		return -1;
 	}
-	list_for_each_safe(tmp, next, &slot_list) {
-		slot = list_entry(tmp, struct slot, slot_list);
-		if(slot->bus == bus) {
+	list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
+		if (slot->bus == bus) {
+			list_del(&slot->slot_list);
+			slots--;
+
 			dbg("deregistering slot %s", slot->hotplug_slot->name);
 			status = pci_hp_deregister(slot->hotplug_slot);
-			if(status) {
+			if (status) {
 				err("pci_hp_deregister failed with error %d",
 				    status);
-				return status;
+				break;
 			}
-
-			list_del(&slot->slot_list);
-			slots--;
 		}
 	}
 	up_write(&list_rwsem);
-	return 0;
+	return status;
 }
 
 /* This is the interrupt mode interrupt handler */
@@ -351,7 +349,7 @@ cpci_hp_intr(int irq, void *data, struct
 	dbg("entered cpci_hp_intr");
 
 	/* Check to see if it was our interrupt */
-	if((controller->irq_flags & SA_SHIRQ) &&
+	if ((controller->irq_flags & SA_SHIRQ) &&
 	    !controller->ops->check_irq(controller->dev_id)) {
 		dbg("exited cpci_hp_intr, not our interrupt");
 		return IRQ_NONE;
@@ -373,38 +371,30 @@ cpci_hp_intr(int irq, void *data, struct
  * INS bits of the cold-inserted devices.
  */
 static int
-init_slots(void)
+init_slots(int clear_ins)
 {
 	struct slot *slot;
-	struct list_head *tmp;
 	struct pci_dev* dev;
 
 	dbg("%s - enter", __FUNCTION__);
 	down_read(&list_rwsem);
-	if(!slots) {
+	if (!slots) {
 		up_read(&list_rwsem);
 		return -1;
 	}
-	list_for_each(tmp, &slot_list) {
-		slot = list_entry(tmp, struct slot, slot_list);
+	list_for_each_entry(slot, &slot_list, slot_list) {
 		dbg("%s - looking at slot %s",
 		    __FUNCTION__, slot->hotplug_slot->name);
-		if(cpci_check_and_clear_ins(slot)) {
+		if (clear_ins && cpci_check_and_clear_ins(slot))
 			dbg("%s - cleared INS for slot %s",
 			    __FUNCTION__, slot->hotplug_slot->name);
-			dev = pci_find_slot(slot->bus->number, PCI_DEVFN(slot->number, 0));
-			if(dev) {
-				if(update_adapter_status(slot->hotplug_slot, 1)) {
-					warn("failure to update adapter file");
-				}
-				if(update_latch_status(slot->hotplug_slot, 1)) {
-					warn("failure to update latch file");
-				}
-				slot->dev = dev;
-			} else {
-				err("%s - no driver attached to device in slot %s",
-				    __FUNCTION__, slot->hotplug_slot->name);
-			}
+		dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
+		if (dev) {
+			if (update_adapter_status(slot->hotplug_slot, 1))
+				warn("failure to update adapter file");
+			if (update_latch_status(slot->hotplug_slot, 1))
+				warn("failure to update latch file");
+			slot->dev = dev;
 		}
 	}
 	up_read(&list_rwsem);
@@ -416,26 +406,28 @@ static int
 check_slots(void)
 {
 	struct slot *slot;
-	struct list_head *tmp;
 	int extracted;
 	int inserted;
 	u16 hs_csr;
 
 	down_read(&list_rwsem);
-	if(!slots) {
+	if (!slots) {
 		up_read(&list_rwsem);
 		err("no slots registered, shutting down");
 		return -1;
 	}
 	extracted = inserted = 0;
-	list_for_each(tmp, &slot_list) {
-		slot = list_entry(tmp, struct slot, slot_list);
+	list_for_each_entry(slot, &slot_list, slot_list) {
 		dbg("%s - looking at slot %s",
 		    __FUNCTION__, slot->hotplug_slot->name);
-		if(cpci_check_and_clear_ins(slot)) {
-			/* Some broken hardware (e.g. PLX 9054AB) asserts ENUM# twice... */
-			if(slot->dev) {
-				warn("slot %s already inserted", slot->hotplug_slot->name);
+		if (cpci_check_and_clear_ins(slot)) {
+			/*
+			 * Some broken hardware (e.g. PLX 9054AB) asserts
+			 * ENUM# twice...
+			 */
+			if (slot->dev) {
+				warn("slot %s already inserted",
+				     slot->hotplug_slot->name);
 				inserted++;
 				continue;
 			}
@@ -452,7 +444,7 @@ check_slots(void)
 			/* Configure device */
 			dbg("%s - configuring slot %s",
 			    __FUNCTION__, slot->hotplug_slot->name);
-			if(cpci_configure_slot(slot)) {
+			if (cpci_configure_slot(slot)) {
 				err("%s - could not configure slot %s",
 				    __FUNCTION__, slot->hotplug_slot->name);
 				continue;
@@ -465,13 +457,11 @@ check_slots(void)
 			dbg("%s - slot %s HS_CSR (2) = %04x",
 			    __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
-			if(update_latch_status(slot->hotplug_slot, 1)) {
+			if (update_latch_status(slot->hotplug_slot, 1))
 				warn("failure to update latch file");
-			}
 
-			if(update_adapter_status(slot->hotplug_slot, 1)) {
+			if (update_adapter_status(slot->hotplug_slot, 1))
 				warn("failure to update adapter file");
-			}
 
 			cpci_led_off(slot);
 
@@ -481,7 +471,7 @@ check_slots(void)
 			    __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
 			inserted++;
-		} else if(cpci_check_ext(slot)) {
+		} else if (cpci_check_ext(slot)) {
 			/* Process extraction request */
 			dbg("%s - slot %s extracted",
 			    __FUNCTION__, slot->hotplug_slot->name);
@@ -491,27 +481,25 @@ check_slots(void)
 			dbg("%s - slot %s HS_CSR = %04x",
 			    __FUNCTION__, slot->hotplug_slot->name, hs_csr);
 
-			if(!slot->extracting) {
-				if(update_latch_status(slot->hotplug_slot, 0)) {
+			if (!slot->extracting) {
+				if (update_latch_status(slot->hotplug_slot, 0)) {
 					warn("failure to update latch file");
-
 				}
-				atomic_inc(&extracting);
 				slot->extracting = 1;
+				atomic_inc(&extracting);
 			}
 			extracted++;
-		} else if(slot->extracting) {
+		} else if (slot->extracting) {
 			hs_csr = cpci_get_hs_csr(slot);
-			if(hs_csr == 0xffff) {
+			if (hs_csr == 0xffff) {
 				/*
 				 * Hmmm, we're likely hosed at this point, should we
 				 * bother trying to tell the driver or not?
 				 */
 				err("card in slot %s was improperly removed",
 				    slot->hotplug_slot->name);
-				if(update_adapter_status(slot->hotplug_slot, 0)) {
+				if (update_adapter_status(slot->hotplug_slot, 0))
 					warn("failure to update adapter file");
-				}
 				slot->extracting = 0;
 				atomic_dec(&extracting);
 			}
@@ -520,10 +508,9 @@ check_slots(void)
 	up_read(&list_rwsem);
 	dbg("inserted=%d, extracted=%d, extracting=%d",
 	    inserted, extracted, atomic_read(&extracting));
-	if(inserted || extracted) {
+	if (inserted || extracted)
 		return extracted;
-	}
-	else if(!atomic_read(&extracting)) {
+	else if (!atomic_read(&extracting)) {
 		err("cannot find ENUM# source, shutting down");
 		return -1;
 	}
@@ -541,12 +528,12 @@ event_thread(void *data)
 	unlock_kernel();
 
 	dbg("%s - event thread started", __FUNCTION__);
-	while(1) {
+	while (1) {
 		dbg("event thread sleeping");
 		down_interruptible(&event_semaphore);
 		dbg("event thread woken, thread_finished = %d",
 		    thread_finished);
-		if(thread_finished || signal_pending(current))
+		if (thread_finished || signal_pending(current))
 			break;
 		do {
 			rc = check_slots();
@@ -558,7 +545,9 @@ event_thread(void *data)
 				thread_finished = 1;
 				break;
 			}
-		} while(atomic_read(&extracting) != 0);
+		} while (atomic_read(&extracting) && !thread_finished);
+		if (thread_finished)
+			break;
 
 		/* Re-enable ENUM# interrupt */
 		dbg("%s - re-enabling irq", __FUNCTION__);
@@ -579,21 +568,21 @@ poll_thread(void *data)
 	daemonize("cpci_hp_polld");
 	unlock_kernel();
 
-	while(1) {
-		if(thread_finished || signal_pending(current))
+	while (1) {
+		if (thread_finished || signal_pending(current))
 			break;
-		if(controller->ops->query_enum()) {
+		if (controller->ops->query_enum()) {
 			do {
 				rc = check_slots();
-				if(rc > 0) {
+				if (rc > 0) {
 					/* Give userspace a chance to handle extraction */
 					msleep(500);
-				} else if(rc < 0) {
+				} else if (rc < 0) {
 					dbg("%s - error checking slots", __FUNCTION__);
 					thread_finished = 1;
 					break;
 				}
-			} while(atomic_read(&extracting) != 0);
+			} while (atomic_read(&extracting) && !thread_finished);
 		}
 		msleep(100);
 	}
@@ -612,12 +601,11 @@ cpci_start_thread(void)
 	init_MUTEX_LOCKED(&thread_exit);
 	thread_finished = 0;
 
-	if(controller->irq) {
+	if (controller->irq)
 		pid = kernel_thread(event_thread, NULL, 0);
-	} else {
+	else
 		pid = kernel_thread(poll_thread, NULL, 0);
-	}
-	if(pid < 0) {
+	if (pid < 0) {
 		err("Can't start up our thread");
 		return -1;
 	}
@@ -630,9 +618,8 @@ cpci_stop_thread(void)
 {
 	thread_finished = 1;
 	dbg("thread finish command given");
-	if(controller->irq) {
+	if (controller->irq)
 		up(&event_semaphore);
-	}
 	dbg("wait for thread to exit");
 	down(&thread_exit);
 }
@@ -642,45 +629,67 @@ cpci_hp_register_controller(struct cpci_
 {
 	int status = 0;
 
-	if(!controller) {
-		controller = new_controller;
-		if(controller->irq) {
-			if(request_irq(controller->irq,
-					cpci_hp_intr,
-					controller->irq_flags,
-					MY_NAME, controller->dev_id)) {
-				err("Can't get irq %d for the hotplug cPCI controller", controller->irq);
-				status = -ENODEV;
-			}
-			dbg("%s - acquired controller irq %d", __FUNCTION__,
-			    controller->irq);
+	if (controller)
+		return -1;
+	if (!(new_controller && new_controller->ops))
+		return -EINVAL;
+	if (new_controller->irq) {
+		if (!(new_controller->ops->enable_irq &&
+		     new_controller->ops->disable_irq))
+			status = -EINVAL;
+		if (request_irq(new_controller->irq,
+			       cpci_hp_intr,
+			       new_controller->irq_flags,
+			       MY_NAME,
+			       new_controller->dev_id)) {
+			err("Can't get irq %d for the hotplug cPCI controller",
+			    new_controller->irq);
+			status = -ENODEV;
 		}
-	} else {
-		err("cPCI hotplug controller already registered");
-		status = -1;
+		dbg("%s - acquired controller irq %d",
+		    __FUNCTION__, new_controller->irq);
 	}
+	if (!status)
+		controller = new_controller;
 	return status;
 }
 
+static void
+cleanup_slots(void)
+{
+	struct slot *slot;
+	struct slot *tmp;
+
+	/*
+	 * Unregister all of our slots with the pci_hotplug subsystem,
+	 * and free up all memory that we had allocated.
+	 */
+	down_write(&list_rwsem);
+	if (!slots)
+		goto cleanup_null;
+	list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
+		list_del(&slot->slot_list);
+		pci_hp_deregister(slot->hotplug_slot);
+	}
+cleanup_null:
+	up_write(&list_rwsem);
+	return;
+}
+
 int
 cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller)
 {
 	int status = 0;
 
-	if(controller) {
-		if(atomic_read(&extracting) != 0) {
-			return -EBUSY;
-		}
-		if(!thread_finished) {
+	if (controller) {
+		if (!thread_finished)
 			cpci_stop_thread();
-		}
-		if(controller->irq) {
+		if (controller->irq)
 			free_irq(controller->irq, controller->dev_id);
-		}
 		controller = NULL;
-	} else {
+		cleanup_slots();
+	} else
 		status = -ENODEV;
-	}
 	return status;
 }
 
@@ -691,32 +700,28 @@ cpci_hp_start(void)
 	int status;
 
 	dbg("%s - enter", __FUNCTION__);
-	if(!controller) {
+	if (!controller)
 		return -ENODEV;
-	}
 
 	down_read(&list_rwsem);
-	if(list_empty(&slot_list)) {
+	if (list_empty(&slot_list)) {
 		up_read(&list_rwsem);
 		return -ENODEV;
 	}
 	up_read(&list_rwsem);
 
-	if(first) {
-		status = init_slots();
-		if(status) {
-			return status;
-		}
+	status = init_slots(first);
+	if (first)
 		first = 0;
-	}
+	if (status)
+		return status;
 
 	status = cpci_start_thread();
-	if(status) {
+	if (status)
 		return status;
-	}
 	dbg("%s - thread started", __FUNCTION__);
 
-	if(controller->irq) {
+	if (controller->irq) {
 		/* Start enum interrupt processing */
 		dbg("%s - enabling irq", __FUNCTION__);
 		controller->ops->enable_irq();
@@ -728,13 +733,9 @@ cpci_hp_start(void)
 int
 cpci_hp_stop(void)
 {
-	if(!controller) {
+	if (!controller)
 		return -ENODEV;
-	}
-	if(atomic_read(&extracting) != 0) {
-		return -EBUSY;
-	}
-	if(controller->irq) {
+	if (controller->irq) {
 		/* Stop enum interrupt processing */
 		dbg("%s - disabling irq", __FUNCTION__);
 		controller->ops->disable_irq();
@@ -743,34 +744,6 @@ cpci_hp_stop(void)
 	return 0;
 }
 
-static void __exit
-cleanup_slots(void)
-{
-	struct list_head *tmp;
-	struct slot *slot;
-
-	/*
-	 * Unregister all of our slots with the pci_hotplug subsystem,
-	 * and free up all memory that we had allocated.
-	 */
-	down_write(&list_rwsem);
-	if(!slots) {
-		goto null_cleanup;
-	}
-	list_for_each(tmp, &slot_list) {
-		slot = list_entry(tmp, struct slot, slot_list);
-		list_del(&slot->slot_list);
-		pci_hp_deregister(slot->hotplug_slot);
-		kfree(slot->hotplug_slot->info);
-		kfree(slot->hotplug_slot->name);
-		kfree(slot->hotplug_slot);
-		kfree(slot);
-	}
-      null_cleanup:
-	up_write(&list_rwsem);
-	return;
-}
-
 int __init
 cpci_hotplug_init(int debug)
 {
@@ -784,7 +757,8 @@ cpci_hotplug_exit(void)
 	/*
 	 * Clean everything up.
 	 */
-	cleanup_slots();
+	cpci_hp_stop();
+	cpci_hp_unregister_controller(controller);
 }
 
 EXPORT_SYMBOL_GPL(cpci_hp_register_controller);
diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c
--- a/drivers/pci/hotplug/cpci_hotplug_pci.c
+++ b/drivers/pci/hotplug/cpci_hotplug_pci.c
@@ -1,7 +1,7 @@
 /*
  * CompactPCI Hot Plug Driver PCI functions
  *
- * Copyright (C) 2002 by SOMA Networks, Inc.
+ * Copyright (C) 2002,2005 by SOMA Networks, Inc.
  *
  * All rights reserved.
  *
@@ -38,10 +38,10 @@ extern int cpci_debug;
 
 #define dbg(format, arg...)					\
 	do {							\
-		if(cpci_debug)					\
+		if (cpci_debug)					\
 			printk (KERN_DEBUG "%s: " format "\n",	\
 				MY_NAME , ## arg); 		\
-	} while(0)
+	} while (0)
 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
@@ -57,16 +57,15 @@ u8 cpci_get_attention_status(struct slot
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return 0;
-	}
 
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return 0;
-	}
+
 	return hs_csr & 0x0008 ? 1 : 0;
 }
 
@@ -78,27 +77,22 @@ int cpci_set_attention_status(struct slo
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return 0;
-	}
-
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return 0;
-	}
-	if(status) {
+	if (status)
 		hs_csr |= HS_CSR_LOO;
-	} else {
+	else
 		hs_csr &= ~HS_CSR_LOO;
-	}
-	if(pci_bus_write_config_word(slot->bus,
+	if (pci_bus_write_config_word(slot->bus,
 				      slot->devfn,
 				      hs_cap + 2,
-				      hs_csr)) {
+				      hs_csr))
 		return 0;
-	}
 	return 1;
 }
 
@@ -110,16 +104,13 @@ u16 cpci_get_hs_csr(struct slot* slot)
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return 0xFFFF;
-	}
-
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return 0xFFFF;
-	}
 	return hs_csr;
 }
 
@@ -132,24 +123,22 @@ int cpci_check_and_clear_ins(struct slot
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return 0;
-	}
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return 0;
-	}
-	if(hs_csr & HS_CSR_INS) {
+	if (hs_csr & HS_CSR_INS) {
 		/* Clear INS (by setting it) */
-		if(pci_bus_write_config_word(slot->bus,
+		if (pci_bus_write_config_word(slot->bus,
 					      slot->devfn,
 					      hs_cap + 2,
-					      hs_csr)) {
+					      hs_csr))
 			ins = 0;
-		}
-		ins = 1;
+		else
+			ins = 1;
 	}
 	return ins;
 }
@@ -163,18 +152,15 @@ int cpci_check_ext(struct slot* slot)
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return 0;
-	}
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return 0;
-	}
-	if(hs_csr & HS_CSR_EXT) {
+	if (hs_csr & HS_CSR_EXT)
 		ext = 1;
-	}
 	return ext;
 }
 
@@ -186,23 +172,20 @@ int cpci_clear_ext(struct slot* slot)
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return -ENODEV;
-	}
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return -ENODEV;
-	}
-	if(hs_csr & HS_CSR_EXT) {
+	if (hs_csr & HS_CSR_EXT) {
 		/* Clear EXT (by setting it) */
-		if(pci_bus_write_config_word(slot->bus,
+		if (pci_bus_write_config_word(slot->bus,
 					      slot->devfn,
 					      hs_cap + 2,
-					      hs_csr)) {
+					      hs_csr))
 			return -ENODEV;
-		}
 	}
 	return 0;
 }
@@ -215,18 +198,16 @@ int cpci_led_on(struct slot* slot)
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return -ENODEV;
-	}
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return -ENODEV;
-	}
-	if((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) {
+	if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) {
 		hs_csr |= HS_CSR_LOO;
-		if(pci_bus_write_config_word(slot->bus,
+		if (pci_bus_write_config_word(slot->bus,
 					      slot->devfn,
 					      hs_cap + 2,
 					      hs_csr)) {
@@ -246,18 +227,16 @@ int cpci_led_off(struct slot* slot)
 	hs_cap = pci_bus_find_capability(slot->bus,
 					 slot->devfn,
 					 PCI_CAP_ID_CHSWP);
-	if(!hs_cap) {
+	if (!hs_cap)
 		return -ENODEV;
-	}
-	if(pci_bus_read_config_word(slot->bus,
+	if (pci_bus_read_config_word(slot->bus,
 				     slot->devfn,
 				     hs_cap + 2,
-				     &hs_csr)) {
+				     &hs_csr))
 		return -ENODEV;
-	}
-	if(hs_csr & HS_CSR_LOO) {
+	if (hs_csr & HS_CSR_LOO) {
 		hs_csr &= ~HS_CSR_LOO;
-		if(pci_bus_write_config_word(slot->bus,
+		if (pci_bus_write_config_word(slot->bus,
 					      slot->devfn,
 					      hs_cap + 2,
 					      hs_csr)) {
@@ -274,19 +253,6 @@ int cpci_led_off(struct slot* slot)
  * Device configuration functions
  */
 
-static void cpci_enable_device(struct pci_dev *dev)
-{
-	struct pci_bus *bus;
-
-	pci_enable_device(dev);
-	if(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
-		bus = dev->subordinate;
-		list_for_each_entry(dev, &bus->devices, bus_list) {
-			cpci_enable_device(dev);
-		}
-	}
-}
-
 int cpci_configure_slot(struct slot* slot)
 {
 	unsigned char busnr;
@@ -294,14 +260,14 @@ int cpci_configure_slot(struct slot* slo
 
 	dbg("%s - enter", __FUNCTION__);
 
-	if(slot->dev == NULL) {
+	if (slot->dev == NULL) {
 		dbg("pci_dev null, finding %02x:%02x:%x",
 		    slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn));
-		slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
+		slot->dev = pci_get_slot(slot->bus, slot->devfn);
 	}
 
 	/* Still NULL? Well then scan for it! */
-	if(slot->dev == NULL) {
+	if (slot->dev == NULL) {
 		int n;
 		dbg("pci_dev still null");
 
@@ -311,10 +277,10 @@ int cpci_configure_slot(struct slot* slo
 		 */
 		n = pci_scan_slot(slot->bus, slot->devfn);
 		dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
-		if(n > 0)
+		if (n > 0)
 			pci_bus_add_devices(slot->bus);
-		slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
-		if(slot->dev == NULL) {
+		slot->dev = pci_get_slot(slot->bus, slot->devfn);
+		if (slot->dev == NULL) {
 			err("Could not find PCI device for slot %02x", slot->number);
 			return 1;
 		}
@@ -329,8 +295,6 @@ int cpci_configure_slot(struct slot* slo
 
 	pci_bus_assign_resources(slot->dev->bus);
 
-	cpci_enable_device(slot->dev);
-
 	dbg("%s - exit", __FUNCTION__);
 	return 0;
 }
@@ -341,15 +305,15 @@ int cpci_unconfigure_slot(struct slot* s
 	struct pci_dev *dev;
 
 	dbg("%s - enter", __FUNCTION__);
-	if(!slot->dev) {
+	if (!slot->dev) {
 		err("No device for slot %02x\n", slot->number);
 		return -ENODEV;
 	}
 
 	for (i = 0; i < 8; i++) {
-		dev = pci_find_slot(slot->bus->number,
+		dev = pci_get_slot(slot->bus,
 				    PCI_DEVFN(PCI_SLOT(slot->devfn), i));
-		if(dev) {
+		if (dev) {
 			pci_remove_bus_device(dev);
 			slot->dev = NULL;
 		}


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

* Re: [PATCH] PCI: amd74xx patch for new NVIDIA device IDs
  2005-06-01  5:08     ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Greg KH
  2005-06-01  5:08       ` [PATCH] PCI Hotplug: more CPCI updates Greg KH
@ 2005-06-01  7:32       ` Jeff Garzik
  2005-06-01  9:50         ` Bartlomiej Zolnierkiewicz
  1 sibling, 1 reply; 11+ messages in thread
From: Jeff Garzik @ 2005-06-01  7:32 UTC (permalink / raw)
  To: Greg K-H; +Cc: linux-kernel, linux-ide@vger.kernel.org, acurrid

Greg KH wrote:
> [PATCH] PCI: amd74xx patch for new NVIDIA device IDs
> 
> Here's the 2.6 amd74xx patch for NVIDIA MCP51.
> 
> Signed-off-by: Andy Currid <acurrid@nvidia.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
> 
> ---
> commit af00f9811e0ccbd3db84ddc4cffb0da942653393
> tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
> parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
> author Andy Currid <acurrid@nvidia.com> Mon, 23 May 2005 08:55:45 -0700
> committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:38 -0700
> 
>  drivers/ide/pci/amd74xx.c |    3 +++
>  include/linux/pci_ids.h   |    6 ++++++


This is hardly a PCI patch.

Has Bart, the IDE maintainer, acked this?

	Jeff



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

* Re: [PATCH] PCI: amd74xx patch for new NVIDIA device IDs
  2005-06-01  7:32       ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Jeff Garzik
@ 2005-06-01  9:50         ` Bartlomiej Zolnierkiewicz
  0 siblings, 0 replies; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2005-06-01  9:50 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Greg K-H, linux-kernel, linux-ide@vger.kernel.org, acurrid

On 6/1/05, Jeff Garzik <jgarzik@pobox.com> wrote:
> Greg KH wrote:
> > [PATCH] PCI: amd74xx patch for new NVIDIA device IDs
> >
> > Here's the 2.6 amd74xx patch for NVIDIA MCP51.
> >
> > Signed-off-by: Andy Currid <acurrid@nvidia.com>
> > Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
> >
> > ---
> > commit af00f9811e0ccbd3db84ddc4cffb0da942653393
> > tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
> > parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
> > author Andy Currid <acurrid@nvidia.com> Mon, 23 May 2005 08:55:45 -0700
> > committer Greg KH <gregkh@suse.de> Tue, 31 May 2005 14:26:38 -0700
> >
> >  drivers/ide/pci/amd74xx.c |    3 +++
> >  include/linux/pci_ids.h   |    6 ++++++
> 
> 
> This is hardly a PCI patch.
> 
> Has Bart, the IDE maintainer, acked this?
> 
>         Jeff
> 

Thanks Jeff.

Ack.

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

* Re: [PATCH] PCI Hotplug: more CPCI updates
  2005-06-01  5:08       ` [PATCH] PCI Hotplug: more CPCI updates Greg KH
@ 2005-06-02  2:41         ` Prarit Bhargava
  2005-06-02  2:46           ` Prarit Bhargava
  0 siblings, 1 reply; 11+ messages in thread
From: Prarit Bhargava @ 2005-06-02  2:41 UTC (permalink / raw)
  To: scottm; +Cc: Greg K-H, linux-kernel, linux-pci

Greg KH wrote:
> [PATCH] PCI Hotplug: more CPCI updates

> - Switch to pci_get_slot instead of deprecated pci_find_slot.
> - A bunch of CodingStyle fixes.

> -			}
> +		dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
> +		if (dev) {
> +			if (update_adapter_status(slot->hotplug_slot, 1))
> +				warn("failure to update adapter file");
> +			if (update_latch_status(slot->hotplug_slot, 1))
> +				warn("failure to update latch file");
> +			slot->dev = dev;
>  		}
>  	}

I don't claim to know the code as well as Scott or Greg does, but I don't see a 
pci_put_dev for the slot->dev to clean up the usage count?

> @@ -311,10 +277,10 @@ int cpci_configure_slot(struct slot* slo
>  		 */
>  		n = pci_scan_slot(slot->bus, slot->devfn);
>  		dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
> -		if(n > 0)
> +		if (n > 0)
>  			pci_bus_add_devices(slot->bus);
> -		slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
> -		if(slot->dev == NULL) {
> +		slot->dev = pci_get_slot(slot->bus, slot->devfn);
> +		if (slot->dev == NULL) {
>  			err("Could not find PCI device for slot %02x", slot->number);
>  			return 1;
>  		}

Same here -- I don't see a pci_put_dev for the slot->dev.

> @@ -341,15 +305,15 @@ int cpci_unconfigure_slot(struct slot* s
>  	struct pci_dev *dev;
>  
>  	dbg("%s - enter", __FUNCTION__);
> -	if(!slot->dev) {
> +	if (!slot->dev) {
>  		err("No device for slot %02x\n", slot->number);
>  		return -ENODEV;
>  	}
>  
>  	for (i = 0; i < 8; i++) {
> -		dev = pci_find_slot(slot->bus->number,
> +		dev = pci_get_slot(slot->bus,
>  				    PCI_DEVFN(PCI_SLOT(slot->devfn), i));
> -		if(dev) {
> +		if (dev) {
>  			pci_remove_bus_device(dev);
>  			slot->dev = NULL;
>  		}

And again here...

P.

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

* Re: [PATCH] PCI Hotplug: more CPCI updates
  2005-06-02  2:41         ` Prarit Bhargava
@ 2005-06-02  2:46           ` Prarit Bhargava
  2005-06-02  3:03             ` Scott Murray
  0 siblings, 1 reply; 11+ messages in thread
From: Prarit Bhargava @ 2005-06-02  2:46 UTC (permalink / raw)
  To: Prarit Bhargava; +Cc: scottm, Greg K-H, linux-kernel, linux-pci

Prarit Bhargava wrote:
> Greg KH wrote:
> 
>> [PATCH] PCI Hotplug: more CPCI updates
> 
> 
>> - Switch to pci_get_slot instead of deprecated pci_find_slot.
>> - A bunch of CodingStyle fixes.
> 
> 
>> -            }
>> +        dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
>> +        if (dev) {
>> +            if (update_adapter_status(slot->hotplug_slot, 1))
>> +                warn("failure to update adapter file");
>> +            if (update_latch_status(slot->hotplug_slot, 1))
>> +                warn("failure to update latch file");
>> +            slot->dev = dev;
>>          }
>>      }
> 
> 
> I don't claim to know the code as well as Scott or Greg does, but I 
> don't see a pci_put_dev for the slot->dev to clean up the usage count?
> 

s/pci_put_dev/pci_dev_put/g

:)

P.

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

* Re: [PATCH] PCI Hotplug: more CPCI updates
  2005-06-02  2:46           ` Prarit Bhargava
@ 2005-06-02  3:03             ` Scott Murray
  2005-06-06 19:48               ` Scott Murray
  0 siblings, 1 reply; 11+ messages in thread
From: Scott Murray @ 2005-06-02  3:03 UTC (permalink / raw)
  To: Prarit Bhargava; +Cc: Greg K-H, linux-kernel, linux-pci

On Wed, 1 Jun 2005, Prarit Bhargava wrote:

> Prarit Bhargava wrote:
> > Greg KH wrote:
> > 
> >> [PATCH] PCI Hotplug: more CPCI updates
> > 
> > 
> >> - Switch to pci_get_slot instead of deprecated pci_find_slot.
> >> - A bunch of CodingStyle fixes.
> > 
> > 
> >> -            }
> >> +        dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
> >> +        if (dev) {
> >> +            if (update_adapter_status(slot->hotplug_slot, 1))
> >> +                warn("failure to update adapter file");
> >> +            if (update_latch_status(slot->hotplug_slot, 1))
> >> +                warn("failure to update latch file");
> >> +            slot->dev = dev;
> >>          }
> >>      }
> > 
> > 
> > I don't claim to know the code as well as Scott or Greg does, but I 
> > don't see a pci_put_dev for the slot->dev to clean up the usage count?
> 
> s/pci_put_dev/pci_dev_put/g

Sorry Prarit, when you suggested I switch over to pci_get_slot in your 
previous comments to me, I didn't look that closely and missed the 
reference counting.  Greg, I think the required fix is just a couple of 
lines in my hotplug slot release function, I'll code it up and test it 
ASAP tomorrow with an eye on getting a patch off by early afternoon EDT.

Scott


-- 
Scott Murray
SOMA Networks, Inc.
Toronto, Ontario
e-mail: scottm@somanetworks.com

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

* Re: [PATCH] PCI Hotplug: more CPCI updates
  2005-06-02  3:03             ` Scott Murray
@ 2005-06-06 19:48               ` Scott Murray
  0 siblings, 0 replies; 11+ messages in thread
From: Scott Murray @ 2005-06-06 19:48 UTC (permalink / raw)
  To: Greg K-H; +Cc: Prarit Bhargava, Linux Kernel Mailing List, linux-pci

On Wed, 1 Jun 2005, Scott Murray wrote:

> On Wed, 1 Jun 2005, Prarit Bhargava wrote:
> 
> > Prarit Bhargava wrote:
> > > Greg KH wrote:
> > > 
> > >> [PATCH] PCI Hotplug: more CPCI updates
> > > 
> > > 
> > >> - Switch to pci_get_slot instead of deprecated pci_find_slot.
> > >> - A bunch of CodingStyle fixes.
> > > 
> > > 
> > >> -            }
> > >> +        dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
> > >> +        if (dev) {
> > >> +            if (update_adapter_status(slot->hotplug_slot, 1))
> > >> +                warn("failure to update adapter file");
> > >> +            if (update_latch_status(slot->hotplug_slot, 1))
> > >> +                warn("failure to update latch file");
> > >> +            slot->dev = dev;
> > >>          }
> > >>      }
> > > 
> > > 
> > > I don't claim to know the code as well as Scott or Greg does, but I 
> > > don't see a pci_put_dev for the slot->dev to clean up the usage count?
> > 
> > s/pci_put_dev/pci_dev_put/g
> 
> Sorry Prarit, when you suggested I switch over to pci_get_slot in your 
> previous comments to me, I didn't look that closely and missed the 
> reference counting.  Greg, I think the required fix is just a couple of 
> lines in my hotplug slot release function, I'll code it up and test it 
> ASAP tomorrow with an eye on getting a patch off by early afternoon EDT.

Greg, sorry for the delay, here's a patch that fixes up the pci_dev 
refcounting in the CPCI code.  I've done some testing against it and it 
seems fine here.

 cpci_hotplug_core.c |    2 ++
 cpci_hotplug_pci.c  |    5 ++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

Signed-Off-By: scottm@somanetworks.com

diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet --exclude=SOMA linux-2.6/drivers/pci/hotplug/cpci_hotplug_core.c linux-2.6-cpci/drivers/pci/hotplug/cpci_hotplug_core.c
--- linux-2.6/drivers/pci/hotplug/cpci_hotplug_core.c	2005-06-02 15:10:19.000000000 -0400
+++ linux-2.6-cpci/drivers/pci/hotplug/cpci_hotplug_core.c	2005-06-02 15:18:40.000000000 -0400
@@ -217,6 +217,8 @@
 	kfree(slot->hotplug_slot->info);
 	kfree(slot->hotplug_slot->name);
 	kfree(slot->hotplug_slot);
+	if (slot->dev)
+		pci_dev_put(slot->dev);
 	kfree(slot);
 }
 
diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet --exclude=SOMA linux-2.6/drivers/pci/hotplug/cpci_hotplug_pci.c linux-2.6-cpci/drivers/pci/hotplug/cpci_hotplug_pci.c
--- linux-2.6/drivers/pci/hotplug/cpci_hotplug_pci.c	2005-06-02 15:10:19.000000000 -0400
+++ linux-2.6-cpci/drivers/pci/hotplug/cpci_hotplug_pci.c	2005-06-02 15:22:12.000000000 -0400
@@ -315,9 +315,12 @@
 				    PCI_DEVFN(PCI_SLOT(slot->devfn), i));
 		if (dev) {
 			pci_remove_bus_device(dev);
-			slot->dev = NULL;
+			pci_dev_put(dev);
 		}
 	}
+	pci_dev_put(slot->dev);
+	slot->dev = NULL;
+
 	dbg("%s - exit", __FUNCTION__);
 	return 0;
 }


-- 
Scott Murray
SOMA Networks, Inc.
Toronto, Ontario
e-mail: scottm@somanetworks.com

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

end of thread, other threads:[~2005-06-06 19:52 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-06-01  5:08 [GIT PATCH] PCI bugfixes for 2.6.12-rc5 Greg KH
2005-06-01  5:08 ` [PATCH] PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly Greg KH
2005-06-01  5:08   ` [PATCH] PCI Hotplug: shpchp driver doesn't program _HPP values properly Greg KH
2005-06-01  5:08     ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Greg KH
2005-06-01  5:08       ` [PATCH] PCI Hotplug: more CPCI updates Greg KH
2005-06-02  2:41         ` Prarit Bhargava
2005-06-02  2:46           ` Prarit Bhargava
2005-06-02  3:03             ` Scott Murray
2005-06-06 19:48               ` Scott Murray
2005-06-01  7:32       ` [PATCH] PCI: amd74xx patch for new NVIDIA device IDs Jeff Garzik
2005-06-01  9:50         ` Bartlomiej Zolnierkiewicz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox