[parisc-linux] Unregister driver patch

Matthieu Delahaye delahaym@esiee.fr
Sun, 25 Feb 2001 12:02:38 +0100


This is a multi-part message in MIME format.
--------------6502D643E70F51A324AA0CCC
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Grant Grundler wrote:

> Matthieu Delahaye wrote:
> > Here is a patch which implements the unregister_driver() function.
>
> Matthieu,
> That's excellent!
>
> But no patch was attached. Please post!
>

Yes, it's not the first time! The problem was between my keyboard and my
chair ;-)
More over, I reposted it before your answer... to myself only... Sorry.
I think holidays aren't good for me.

Matthieu

>
> thanks,
> grant
>
> Grant Grundler
> parisc-linux {PCI|IOMMU|SMP} hacker
> +1.408.447.7253
>
> _______________________________________________
> parisc-linux mailing list
> parisc-linux@lists.parisc-linux.org
> http://lists.parisc-linux.org/cgi-bin/mailman/listinfo/parisc-linux

--------------6502D643E70F51A324AA0CCC
Content-Type: text/plain; charset=us-ascii;
 name="unregister.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="unregister.diff"

diff -Nru linux.old/arch/parisc/kernel/drivers.c linux.new/arch/parisc/kernel/drivers.c
--- linux.old/arch/parisc/kernel/drivers.c	Sat Feb 10 18:13:25 2001
+++ linux.new/arch/parisc/kernel/drivers.c	Sat Feb 24 16:40:03 2001
@@ -57,17 +57,23 @@
 		** The list gets built in reverse order...ideally, it shouldn't
 		** matter but reality will eventually rear it's ugly head.
 		*/
+		if(driver->next) {
+			BUG();
+			printk(KERN_WARNING "Warning: %s %s was already registered. Skiping.\n", driver->name,driver->version);
+			continue; 
+		}
+		
 		driver->next = pa_drivers;
 		pa_drivers = driver;
 
 		for (i=0; i < num_devices; i++) {
 			device = &pa_devices[i];
 
-			if (device->managed)			continue;
+			if ((int)device->driver) continue;
 			if (0 == compare_spec(device, driver))	continue;
 
 			if ( (*driver->callback)(device,driver) ==0) {
-				device->managed=1;
+				device->driver=driver;
 			} else {
 				printk("Warning : device (%d, 0x%x, 0x%x, 0x%x, 0x%x) NOT claimed by %s %s\n",
 					device->hw_type,
@@ -77,6 +83,42 @@
 			}
 		}
 	}
+	
+	return 0;
+}
+
+
+
+int unregister_driver(struct pa_iodc_driver *driver)
+{
+	int i;
+	struct hp_device * device;
+	struct pa_iodc_driver * drv;
+	
+	for(;driver->check;driver++) {
+		drv=pa_drivers;
+		if(pa_drivers==driver) {
+			pa_drivers=driver->next;
+		} else {
+			while(drv!=NULL && driver!=drv->next) {
+				drv=drv->next;
+			}
+
+			if(drv==NULL) {
+				printk(KERN_WARNING "unregister_driver: %s %s wasn't registered\n", driver->name, driver->version);
+				continue;
+			} else {
+				drv->next=driver->next;
+				driver->next=NULL;
+			}
+			
+		}
+	    
+		for (i=0; i < num_devices; i++) {
+			device = &pa_devices[i];
+			if (device->driver==driver) device->driver=NULL;
+		}
+	}
 	return 0;
 }
 
@@ -127,7 +169,7 @@
 	d->sversion_rev = iodc_data[4]>>4;
 	d->opt = iodc_data[7];
 	d->hpa = (void *) hpa;
-	d->managed = 0;
+	d->driver = NULL;
 	d->reference = parisc_get_reference(d->hw_type,
 					d->hversion, d->sversion);
 
@@ -145,16 +187,16 @@
 {
 	struct pa_iodc_driver *driver = pa_drivers;
 
-	while ((0 == hp_dev->managed) && (NULL != driver)) {
+	while ((NULL == hp_dev->driver) && (NULL != driver)) {
 
 		if (compare_spec(hp_dev,driver))
-			hp_dev->managed =
-				((*driver->callback)(hp_dev,driver) == 0);
+			hp_dev->driver =
+				(((*driver->callback)(hp_dev,driver) == 0)?driver:NULL);
 
 		driver = driver->next;
 	}
 
-	return hp_dev->managed;
+	return (hp_dev->driver==driver);
 }
 
 struct hp_device *get_pa_dev(unsigned int index)
diff -Nru linux.old/include/asm-parisc/hardware.h linux.new/include/asm-parisc/hardware.h
--- linux.old/include/asm-parisc/hardware.h	Sat Feb 10 18:14:08 2001
+++ linux.new/include/asm-parisc/hardware.h	Sat Feb 24 16:43:00 2001
@@ -22,7 +22,7 @@
 	unsigned int	sversion_rev;
 	struct hp_hardware *reference;  /* This is a pointer to the
                                             reference */
-	unsigned int	managed; /* this is if the device has a driver for it */
+	struct pa_iodc_driver *driver; /* this is if the device has a driver for it */
 
 	unsigned int	num_addrs;	/* some devices have additional address ranges, */
 	unsigned long	addr[MAX_ADD_ADDRS]; /* which will be stored here */
@@ -113,6 +113,7 @@
 extern struct hp_device *get_pa_dev(unsigned int index);
 extern void print_pa_devices(char * buf);
 extern int register_driver(struct pa_iodc_driver *driver);
+extern int unregister_driver(struct pa_iodc_driver *driver);
 
 /* inventory.c: */
 extern void do_inventory(void);

--------------6502D643E70F51A324AA0CCC--