Linux PARISC architecture development
 help / color / mirror / Atom feed
* [parisc-linux] Unregister driver patch
@ 2001-02-24 15:56 Matthieu Delahaye
  2001-02-25  6:16 ` Grant Grundler
  0 siblings, 1 reply; 7+ messages in thread
From: Matthieu Delahaye @ 2001-02-24 15:56 UTC (permalink / raw)
  To: parisc-linux

Hi all!

Here is a patch which implements the unregister_driver() function.

I had to change a field in struct hp_device:
The field "manage" (bool) become "driver" (pointer on a pa_iodc_driver),

since unregister_driver has to know by which driver a device was managed
to make unregister proper.
unregister_driver() first remove the driver from the list. Then, it
looks for devices managed by this driver and changed their "driver"
field to NULL.


More over, some drivers call register_driver at least two times, e.g.
the gsc parallel port driver. When it append, BUG() is called and a
warning is send to give the name of the driver.

NOTE: Since the structure pa_iodc_driver is used to maintain the list of
the registered drivers, I think this do not have to be put in data.init
section.


Regards,

Matthieu Delahaye
ESIEE Team
http://www.esiee.fr/~puffin

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-24 15:56 [parisc-linux] Unregister driver patch Matthieu Delahaye
@ 2001-02-25  6:16 ` Grant Grundler
  2001-02-25 11:02   ` Matthieu Delahaye
  0 siblings, 1 reply; 7+ messages in thread
From: Grant Grundler @ 2001-02-25  6:16 UTC (permalink / raw)
  To: Matthieu Delahaye; +Cc: parisc-linux

Matthieu Delahaye wrote:
> Here is a patch which implements the unregister_driver() function.

Matthieu,
That's excellent!

But no patch was attached. Please post!

thanks,
grant

Grant Grundler
parisc-linux {PCI|IOMMU|SMP} hacker
+1.408.447.7253

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-25  6:16 ` Grant Grundler
@ 2001-02-25 11:02   ` Matthieu Delahaye
  2001-02-26  4:30     ` Grant Grundler
  2001-02-26  5:30     ` Grant Grundler
  0 siblings, 2 replies; 7+ messages in thread
From: Matthieu Delahaye @ 2001-02-25 11:02 UTC (permalink / raw)
  To: Grant Grundler, parisc-linux

[-- Attachment #1: Type: text/plain, Size: 688 bytes --]

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

[-- Attachment #2: unregister.diff --]
[-- Type: text/plain, Size: 3526 bytes --]

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);

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-25 11:02   ` Matthieu Delahaye
@ 2001-02-26  4:30     ` Grant Grundler
  2001-02-26 16:38       ` Matthew Wilcox
  2001-02-26  5:30     ` Grant Grundler
  1 sibling, 1 reply; 7+ messages in thread
From: Grant Grundler @ 2001-02-26  4:30 UTC (permalink / raw)
  To: Matthieu Delahaye; +Cc: parisc-linux

Matthieu Delahaye wrote:
> I think holidays aren't good for me.

hmmm...maybe not. ;^)

I'll apply the patch tomorrow barring major objections.
The patch looks good to me (with one nit noted below).
Thanks!


> -			if (device->managed)			continue;
> +			if ((int)device->driver) continue;

I'll change this to:
		if (NULL != device->driver) continue;

device->driver is a pointer and should certainly not be cast to an int
in this case. For 64-bit, we will loose the upper half of the address
and we want to test the entire address. Even if it worked, I wouldn't
want to risk it not working in the future.

grant

Grant Grundler
parisc-linux {PCI|IOMMU|SMP} hacker
+1.408.447.7253

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-25 11:02   ` Matthieu Delahaye
  2001-02-26  4:30     ` Grant Grundler
@ 2001-02-26  5:30     ` Grant Grundler
  2001-02-26 10:00       ` Matthieu Delahaye
  1 sibling, 1 reply; 7+ messages in thread
From: Grant Grundler @ 2001-02-26  5:30 UTC (permalink / raw)
  To: Matthieu Delahaye; +Cc: parisc-linux

Hi Matthieu,
Ok. I lied. One more issue with the patch in register_pa_dev().

Matthieu Delahaye wrote:
> @@ -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)?driv
>   er:NULL);
>  
>  		driver = driver->next;
>  	}
>  
> -	return hp_dev->managed;
> +	return (hp_dev->driver==driver);

In the case a device is managed,  "driver" points to "->next" after
we exit the loop and we end up returning false.  Right?

I think "return (NULL != hp_dev->driver)" is the correct code.

grant

Grant Grundler
parisc-linux {PCI|IOMMU|SMP} hacker
+1.408.447.7253

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-26  5:30     ` Grant Grundler
@ 2001-02-26 10:00       ` Matthieu Delahaye
  0 siblings, 0 replies; 7+ messages in thread
From: Matthieu Delahaye @ 2001-02-26 10:00 UTC (permalink / raw)
  To: Grant Grundler, parisc-linux

Grant Grundler wrote:
> 
> Hi Matthieu,
> Ok. I lied. One more issue with the patch in register_pa_dev().
> 
> Matthieu Delahaye wrote:
> > @@ -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)?driv
> >   er:NULL);
> >
> >               driver = driver->next;
> >       }
> >
> > -     return hp_dev->managed;
> > +     return (hp_dev->driver==driver);
> 
> In the case a device is managed,  "driver" points to "->next" after
> we exit the loop and we end up returning false.  Right?
> 
> I think "return (NULL != hp_dev->driver)" is the correct code.
> 
You're right. I couldn't test this function because I didn't find a way
to add devices only after some drivers were already registered.

Matthieu

> grant
> 
> Grant Grundler
> parisc-linux {PCI|IOMMU|SMP} hacker
> +1.408.447.7253

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

* Re: [parisc-linux] Unregister driver patch
  2001-02-26  4:30     ` Grant Grundler
@ 2001-02-26 16:38       ` Matthew Wilcox
  0 siblings, 0 replies; 7+ messages in thread
From: Matthew Wilcox @ 2001-02-26 16:38 UTC (permalink / raw)
  To: Grant Grundler; +Cc: Matthieu Delahaye, parisc-linux

On Sun, Feb 25, 2001 at 08:30:55PM -0800, Grant Grundler wrote:
> > -			if (device->managed)			continue;
> > +			if ((int)device->driver) continue;
> 
> I'll change this to:
> 		if (NULL != device->driver) continue;

we definitely don't want to cast this to an int.  But what's wrong with

if (device->driver)
	continue;

it reads properly `if device has driver then continue'.  Sure, it's complex
to think about if you try and puzzle it out `so, if i've assigned a value to
driver then it's not 0, so this is true in which case continue', but if you
just read it, it says what it means.

-- 
Revolutions do not require corporate support.

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

end of thread, other threads:[~2001-02-26 17:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-02-24 15:56 [parisc-linux] Unregister driver patch Matthieu Delahaye
2001-02-25  6:16 ` Grant Grundler
2001-02-25 11:02   ` Matthieu Delahaye
2001-02-26  4:30     ` Grant Grundler
2001-02-26 16:38       ` Matthew Wilcox
2001-02-26  5:30     ` Grant Grundler
2001-02-26 10:00       ` Matthieu Delahaye

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