Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 07 Dec 2006 17:54:36 +0200
From:      Iasen Kostov <tbyte@otel.net>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Driver not unset properly after kldunload
Message-ID:  <1165506876.37590.12.camel@DraGoN.OTEL.net>
In-Reply-To: <200612061135.55487.jhb@freebsd.org>
References:  <1164842336.1066.6.camel@WarHeaD.OTEL.net> <200612061135.55487.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--=-JzvqiRaU8sheWlcGbKlB
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

On Wed, 2006-12-06 at 11:35 -0500, John Baldwin wrote:
...
> I don't see why this patch changes things.  devclass_delete_device() only 
> clears dev->unit, dev->devclass, and dev->nameunit.  device_set_driver() 
> doesn't check or clear any of those.  In fact, your change does make 
> device_set_driver() not work at all since the device state will still be 
> DS_ATTACHED when you call device_set_driver() now.  So, I guess your patch 
> actually makes the device _not_ be detached from the driver.
> 
	Forgive me for being so lazy :). I've analized the problem as I should
have done the first time and I hope I found the solution. First time I
was missleaded by sys/dev/pci/pci_user.c and the way it sets pd_name[]
in pci_devinfo struct (You actualy need to use pciconf atleast once
after loading the driver) ... It's only set when you use PCIOCGETCONF
ioctl on /dev/pci and it only sets it once (which is not very clever)
and never unset it. But one can unload the current driver and load
another (as in if_nfe, if_nve case) or just unload the driver and
pd_name[] will always show the first driver attached on that device.
	So I hope this new patch is better one.



--=-JzvqiRaU8sheWlcGbKlB
Content-Disposition: attachment; filename=pci_user.c.diff
Content-Type: text/x-patch; name=pci_user.c.diff; charset=UTF-8
Content-Transfer-Encoding: 7bit

--- sys/dev/pci/pci_user.c.old	Thu Dec  7 02:26:12 2006
+++ sys/dev/pci/pci_user.c	Thu Dec  7 02:52:23 2006
@@ -303,14 +303,18 @@
 
 			/* Populate pd_name and pd_unit */
 			name = NULL;
-			if (dinfo->cfg.dev && dinfo->conf.pd_name[0] == '\0')
+			if (dinfo->cfg.dev) {
 				name = device_get_name(dinfo->cfg.dev);
-			if (name) {
-				strncpy(dinfo->conf.pd_name, name,
-					sizeof(dinfo->conf.pd_name));
-				dinfo->conf.pd_name[PCI_MAXNAMELEN] = 0;
-				dinfo->conf.pd_unit =
-					device_get_unit(dinfo->cfg.dev);
+				if (name) {
+					strncpy(dinfo->conf.pd_name, name,
+						sizeof(dinfo->conf.pd_name));
+					dinfo->conf.pd_name[PCI_MAXNAMELEN] = 0;
+					dinfo->conf.pd_unit =
+						device_get_unit(dinfo->cfg.dev);
+				} else {
+					dinfo->conf.pd_name[0] = '\0';
+					dinfo->conf.pd_unit = 0;
+				}
 			}
 
 			if ((pattern_buf == NULL) ||

--=-JzvqiRaU8sheWlcGbKlB--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1165506876.37590.12.camel>