Date: Mon, 11 Dec 2006 13:10:11 GMT From: Iasen Kostov <ikostov@otel.net> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/104777: [kernel] [patch] Driver not unset properly after kldunload Message-ID: <200612111310.kBBDABlU037783@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/104777; it has been noted by GNATS. From: Iasen Kostov <ikostov@otel.net> To: bug-followup@FreeBSD.org, tbyte@otel.net Cc: Subject: Re: kern/104777: [kernel] [patch] Driver not unset properly after kldunload Date: Mon, 11 Dec 2006 15:07:19 +0200 --=-1Fy3i/CbiP2cB5LqrocQ Content-Type: text/plain Content-Transfer-Encoding: 7bit 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. --=-1Fy3i/CbiP2cB5LqrocQ 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) || --=-1Fy3i/CbiP2cB5LqrocQ--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612111310.kBBDABlU037783>