linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* PATCH: convert pci ide support to new locking
@ 2004-08-15 15:17 Alan Cox
  0 siblings, 0 replies; only message in thread
From: Alan Cox @ 2004-08-15 15:17 UTC (permalink / raw)
  To: linux-ide, linux-kernel, torvalds

Actually more like "to actually have any locking". Also add a helper for
PCI unregister.


diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.8-rc3/drivers/ide/setup-pci.c linux-2.6.8-rc3/drivers/ide/setup-pci.c
--- linux.vanilla-2.6.8-rc3/drivers/ide/setup-pci.c	2004-08-09 15:51:00.000000000 +0100
+++ linux-2.6.8-rc3/drivers/ide/setup-pci.c	2004-08-12 17:55:34.000000000 +0100
@@ -1,7 +1,8 @@
 /*
- *  linux/drivers/ide/setup-pci.c		Version 1.10	2002/08/19
+ *  linux/drivers/ide/setup-pci.c		Version 1.14	2004/08/10
  *
  *  Copyright (c) 1998-2000  Andre Hedrick <andre@linux-ide.org>
+ *  Copyright (c) 2004 Red Hat <alan@redhat.com>
  *
  *  Copyright (c) 1995-1998  Mark Lord
  *  May be copied or modified under the terms of the GNU General Public License
@@ -11,6 +12,7 @@
  *	Use pci_set_master
  *	Fix misreporting of I/O v MMIO problems
  *	Initial fixups for simplex devices
+ *	Hot unplug paths
  */
 
 /*
@@ -42,7 +44,7 @@
  *	Match a PCI IDE port against an entry in ide_hwifs[],
  *	based on io_base port if possible. Return the matching hwif,
  *	or a new hwif. If we find an error (clashing, out of devices, etc)
- *	return NULL
+ *	return NULL. The caller must hold the ide_cfg_sem.
  *
  *	FIXME: we need to handle mmio matches here too
  */
@@ -87,6 +89,8 @@
 	 *
 	 * Unless there is a bootable card that does not use the standard
 	 * ports 1f0/170 (the ide0/ide1 defaults). The (bootable) flag.
+	 *
+	 * FIXME: migrate use of ide_unknown to also use ->configured
 	 */
 	if (bootable) {
 		for (h = 0; h < MAX_HWIFS; ++h) {
@@ -435,8 +439,18 @@
 		ctl = port ? 0x374 : 0x3f4;
 		base = port ? 0x170 : 0x1f0;
 	}
+	
+	/*
+	 * Protect against a hwif being unloaded as we attach to it
+	 */
+	down(&ide_cfg_sem);
+	
 	if ((hwif = ide_match_hwif(base, d->bootable, d->name)) == NULL)
+	{
+		up(&ide_cfg_sem);
 		return NULL;	/* no room in ide_hwifs[] */
+	}
+	
 	if (hwif->io_ports[IDE_DATA_OFFSET] != base ||
 	    hwif->io_ports[IDE_CONTROL_OFFSET] != (ctl | 2)) {
 		memset(&hwif->hw, 0, sizeof(hwif->hw));
@@ -448,6 +462,9 @@
 	hwif->pci_dev = dev;
 	hwif->cds = (struct ide_pci_device_s *) d;
 	hwif->channel = port;
+	hwif->configured = 1;
+	
+	up(&ide_cfg_sem);
 
 	if (!hwif->irq)
 		hwif->irq = irq;
@@ -762,6 +779,53 @@
 
 EXPORT_SYMBOL_GPL(ide_setup_pci_devices);
 
+/**
+ *	ide_pci_remove_hwifs	-	remove PCI interfaces
+ *	@dev: PCI device
+ *
+ *	Remove any hwif attached to this PCI device. This will call
+ *	back the various hwif->remove functions. In order to get the
+ *	best results when delays occur we kill the iops before we
+ *	potentially start blocking for long periods untangling the
+ *	IDE layer.
+ *
+ *	Takes the ide_cfg_sem in order to protect against races with
+ *	new/old hwifs. Calls functions that take all the other locks
+ *	so should be called with no locks held.
+ */
+ 
+void ide_pci_remove_hwifs(struct pci_dev *dev)
+{
+	int i;
+	ide_hwif_t *hwif = ide_hwifs;
+
+	down(&ide_cfg_sem);
+#if 0
+	for(i = 0; i < MAX_HWIFS; i++)
+	{
+		if(hwif->configured && hwif->pci_dev == dev)
+		{
+			removed_hwif_iops(hwif);
+		}
+		i++;
+		hwif++;
+	}
+#endif
+	hwif = ide_hwifs;
+	
+	for(i = 0; i < MAX_HWIFS; i++)
+	{
+		if(hwif->configured && hwif->pci_dev == dev)
+			__ide_unregister_hwif(hwif);
+		i++;
+		hwif++;
+	}
+	up(&ide_cfg_sem);
+}
+
+EXPORT_SYMBOL_GPL(ide_pci_remove_hwifs);
+
+
 /*
  *	Module interfaces
  */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-08-15 15:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-15 15:17 PATCH: convert pci ide support to new locking Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).