Skip to contentSkip to conversation

PCI bugfixes for 2.6.12-rc5

PATCH New Greg KH 5 participants 11 messages Jun 1, 2005 – Jun 6, 2005

Subsystems (4)
lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 1/1 PCI bugfixes for 2.6.12-rc5

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

author
#1 lore raw

PATCH 1/1 PCI Hotplug: SHPCHP driver doesn't enable PERR and SERR properly

[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.

---
commit 2ac2610b26c9da72820443328ff2c56c7b8c87b8
tree 9ca01e869d0c5a958232b7007e3fb48a27b0c5b3
parent 7a8cb869f31de525bc34095f51f8c8a43ffcb6a9
author Kenji Kaneshige <[email protected]> Fri, 27 May 2005 16:08:14 +0900 committer Greg KH <[email protected]> Tue, 31 May 2005 14:26:37 -0700

 drivers/pci/hotplug/shpchprm_acpi.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/pci/hotplug/shpchprm_acpi.c +1 -1
@@ -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) {
author
#2 lore raw

PATCH 1/1 PCI Hotplug: shpchp driver doesn't program _HPP values properly

[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.

---
commit 7a8cb869f31de525bc34095f51f8c8a43ffcb6a9
tree 952c03852730f328c2b500acb4748d2c4298d2b3
parent 2e3e80c2b75e3815a0160cbd23d4fdb767d66b35
author Kenji Kaneshige <[email protected]> Mon, 23 May 2005 19:50:32 +0900 committer Greg KH <[email protected]> Tue, 31 May 2005 14:26:37 -0700

 drivers/pci/hotplug/shpchprm_acpi.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/pci/hotplug/shpchprm_acpi.c +1 -1
@@ -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) {
author
#3 lore raw

PATCH 1/1 PCI: amd74xx patch for new NVIDIA device IDs

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

Here's the 2.6 amd74xx patch for NVIDIA MCP51.

---
commit af00f9811e0ccbd3db84ddc4cffb0da942653393
tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
author Andy Currid <[email protected]> Mon, 23 May 2005 08:55:45 -0700 committer Greg KH <[email protected]> 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(-)
drivers/ide/pci/amd74xx.c +3 -0
@@ -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);
include/linux/pci_ids.h +6 -0
@@ -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
author
#4 lore raw

PATCH 1/1 PCI Hotplug: more CPCI updates

[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.

---
commit bcc488ab02254a6e60d749187a632dc3d642d4f8
tree 4cd45b4d546cf85c14c442b27f611e048a4d9938
parent af00f9811e0ccbd3db84ddc4cffb0da942653393
author Scott Murray <[email protected]> Fri, 27 May 2005 16:48:52 -0400 committer Greg KH <[email protected]> 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(-)
drivers/pci/hotplug/cpci_hotplug_core.c +138 -164
@@ -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 ([email protected])
  * 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);
drivers/pci/hotplug/cpci_hotplug_pci.c +54 -90

297 lines not on this page · raw message

#5 lore raw

Re: [PATCH] PCI Hotplug: more CPCI updates

Quoted 5 lines · Greg KH

[PATCH] PCI Hotplug: more CPCI updates

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

drivers/pci/hotplug/cpci_hotplug_core.c cpci_hp_intr(int irq, void *data, struct · line 399

Quoted 10 lines
drivers/pci/hotplug/cpci_hotplug_core.c +7 -1
-			}
+		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?

Quoted 4 lines
drivers/pci/hotplug/cpci_hotplug_pci.c +0 -0
@@ -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);

drivers/pci/hotplug/cpci_hotplug_pci.c int cpci_configure_slot(struct slot* slo · line 286

Quoted 10 lines
drivers/pci/hotplug/cpci_hotplug_pci.c +3 -3
-		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.

Quoted 9 lines
drivers/pci/hotplug/cpci_hotplug_pci.c +1 -1
@@ -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;
 	}

drivers/pci/hotplug/cpci_hotplug_pci.c int cpci_unconfigure_slot(struct slot* s · line 319

Quoted 10 lines
drivers/pci/hotplug/cpci_hotplug_pci.c +2 -2
 
 	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.

#6 lore raw

Re: [PATCH] PCI Hotplug: more CPCI updates

Quoted 21 lines · Prarit Bhargava
Quoted 7 lines · Greg KH

[PATCH] PCI Hotplug: more CPCI updates

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

drivers/pci/hotplug/cpci_hotplug_core.c cpci_hp_intr(int irq, void *data, struct · line 399

Quoted 10 lines
drivers/pci/hotplug/cpci_hotplug_core.c +7 -1
-            }
+        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;
         }
     }
Quoted 2 lines

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.

#7 lore raw

Re: [PATCH] PCI Hotplug: more CPCI updates

Quoted 22 lines · Prarit Bhargava
Quoted 21 lines · Prarit Bhargava
Quoted 17 lines · Greg KH

[PATCH] PCI Hotplug: more CPCI updates

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

drivers/pci/hotplug/cpci_hotplug_core.c +7 -1
-            }
+        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;
         }
     }
Quoted 4 lines
Quoted 2 lines

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

Signature · 4 lines
Scott Murray
SOMA Networks, Inc.
Toronto, Ontario
e-mail: [email protected]
#8 lore raw

Re: [PATCH] PCI Hotplug: more CPCI updates

Quoted 27 lines · Scott Murray
Quoted 25 lines · Prarit Bhargava
Quoted 23 lines · Prarit Bhargava
Quoted 7 lines · Greg KH

[PATCH] PCI Hotplug: more CPCI updates

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

Review

Quoted 10 lines
(quoted diff) +7 -1
-            }
+        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?

Quoted 7 lines
Quoted 1 line

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 [email protected]
drivers/pci/hotplug/cpci_hotplug_core.c +2 -0
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
@@ -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);
 }
 
drivers/pci/hotplug/cpci_hotplug_pci.c +4 -1
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
@@ -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;
 }
Signature · 4 lines
Scott Murray
SOMA Networks, Inc.
Toronto, Ontario
e-mail: [email protected]
#9 lore raw

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

In reply to Greg KH
Quoted 14 lines · Greg KH

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

Here's the 2.6 amd74xx patch for NVIDIA MCP51.

---
commit af00f9811e0ccbd3db84ddc4cffb0da942653393
tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
author Andy Currid <[email protected]> Mon, 23 May 2005 08:55:45 -0700 committer Greg KH <[email protected]> Tue, 31 May 2005 14:26:38 -0700

Quoted 2 lines
 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

#10 lore raw

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

Quoted 19 lines · Jeff Garzik
Quoted 14 lines · Greg KH

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

Here's the 2.6 amd74xx patch for NVIDIA MCP51.

---
commit af00f9811e0ccbd3db84ddc4cffb0da942653393
tree 5a9c3b7f7d61d96d3624ad130b173a761cb7dac2
parent 2ac2610b26c9da72820443328ff2c56c7b8c87b8
author Andy Currid <[email protected]> Mon, 23 May 2005 08:55:45 -0700 committer Greg KH <[email protected]> Tue, 31 May 2005 14:26:38 -0700

Quoted 2 lines
 drivers/ide/pci/amd74xx.c |    3 +++
 include/linux/pci_ids.h   |    6 ++++++
Quoted 6 lines

This is hardly a PCI patch.

Has Bart, the IDE maintainer, acked this?

Jeff

Thanks Jeff.

Ack.