changeset 3756:fb8fddb52b9f

6520116 kstat_create fails with namespace collision during device configure
author krishnae
date Sat, 03 Mar 2007 11:53:56 -0800
parents 8708c35cb823
children 180422ea4336
files usr/src/uts/common/io/pcie_fault.c usr/src/uts/common/sys/pcie_impl.h usr/src/uts/sun4/io/px/px.c usr/src/uts/sun4/io/px/px_pci.c usr/src/uts/sun4u/io/pci/pci_pci.c
diffstat 5 files changed, 19 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/pcie_fault.c	Sat Mar 03 08:20:50 2007 -0800
+++ b/usr/src/uts/common/io/pcie_fault.c	Sat Mar 03 11:53:56 2007 -0800
@@ -190,7 +190,7 @@
 
 /* Called during postattach to initalize FM lock */
 void
-pf_init(dev_info_t *dip, ddi_iblock_cookie_t ibc)
+pf_init(dev_info_t *dip, ddi_iblock_cookie_t ibc, ddi_attach_cmd_t cmd)
 {
 	pcie_ppd_t		*ppd_p = pcie_get_ppd(dip);
 	struct i_ddi_fmhdl	*fmhdl = DEVI(dip)->devi_fmhdl;
@@ -200,7 +200,10 @@
 		fmhdl->fh_cap |= cap;
 	} else {
 		ppd_p->ppd_fm_flags |= PF_IS_NH;
-		ddi_fm_init(dip, &cap, &ibc);
+
+		if (cmd == DDI_ATTACH)
+			ddi_fm_init(dip, &cap, &ibc);
+
 		fmhdl = DEVI(dip)->devi_fmhdl;
 	}
 
@@ -216,7 +219,7 @@
 
 /* undo OPL FMA lock, called at predetach */
 void
-pf_fini(dev_info_t *dip)
+pf_fini(dev_info_t *dip, ddi_detach_cmd_t cmd)
 {
 	pcie_ppd_t	*ppd_p = pcie_get_ppd(dip);
 
@@ -226,8 +229,10 @@
 
 	/* undo non-hardened drivers */
 	if (ppd_p->ppd_fm_flags & PF_IS_NH) {
-		ppd_p->ppd_fm_flags &= ~PF_IS_NH;
-		ddi_fm_fini(dip);
+		if (cmd == DDI_DETACH) {
+			ppd_p->ppd_fm_flags &= ~PF_IS_NH;
+			ddi_fm_fini(dip);
+		}
 	}
 
 	/* no other code should set the flag to false */
--- a/usr/src/uts/common/sys/pcie_impl.h	Sat Mar 03 08:20:50 2007 -0800
+++ b/usr/src/uts/common/sys/pcie_impl.h	Sat Mar 03 11:53:56 2007 -0800
@@ -194,8 +194,9 @@
     uint32_t flag, uint32_t addr, pcie_req_id_t bdf);
 extern int pf_scan_fabric(dev_info_t *rpdip, ddi_fm_error_t *derr,
     pf_data_t *dq_p, int *dq_tail_p);
-extern void pf_init(dev_info_t *dip, ddi_iblock_cookie_t ibc);
-extern void pf_fini(dev_info_t *dip);
+extern void pf_init(dev_info_t *dip, ddi_iblock_cookie_t ibc,
+    ddi_attach_cmd_t cmd);
+extern void pf_fini(dev_info_t *dip, ddi_detach_cmd_t cmd);
 extern boolean_t pf_ready(dev_info_t *dip);
 
 
--- a/usr/src/uts/sun4/io/px/px.c	Sat Mar 03 08:20:50 2007 -0800
+++ b/usr/src/uts/sun4/io/px/px.c	Sat Mar 03 11:53:56 2007 -0800
@@ -1255,7 +1255,7 @@
 			if (as->cmd == DDI_ATTACH && as->result != DDI_SUCCESS)
 				pcie_pm_release(dip);
 
-			pf_init(rdip, (void *)px_p->px_fm_ibc);
+			pf_init(rdip, (void *)px_p->px_fm_ibc, as->cmd);
 
 			(void) pcie_postattach_child(rdip);
 
@@ -1281,7 +1281,7 @@
 			}
 			return (DDI_SUCCESS);
 		case DDI_PRE:
-			pf_fini(rdip);
+			pf_fini(rdip, ds->cmd);
 			return (DDI_SUCCESS);
 		default:
 			break;
--- a/usr/src/uts/sun4/io/px/px_pci.c	Sat Mar 03 08:20:50 2007 -0800
+++ b/usr/src/uts/sun4/io/px/px_pci.c	Sat Mar 03 11:53:56 2007 -0800
@@ -707,7 +707,7 @@
 			if (as->cmd == DDI_ATTACH && as->result != DDI_SUCCESS)
 				pcie_pm_release(dip);
 
-			pf_init(rdip, (void *)pxb_p->pxb_fm_ibc);
+			pf_init(rdip, (void *)pxb_p->pxb_fm_ibc, as->cmd);
 
 			/*
 			 * For hotplug-capable slots, we should explicitly
@@ -739,7 +739,7 @@
 		ds = (struct detachspec *)arg;
 		switch (ds->when) {
 		case DDI_PRE:
-			pf_fini(rdip);
+			pf_fini(rdip, ds->cmd);
 			return (DDI_SUCCESS);
 
 		case DDI_POST:
--- a/usr/src/uts/sun4u/io/pci/pci_pci.c	Sat Mar 03 08:20:50 2007 -0800
+++ b/usr/src/uts/sun4u/io/pci/pci_pci.c	Sat Mar 03 11:53:56 2007 -0800
@@ -579,7 +579,7 @@
 		as = (struct attachspec *)arg;
 		if ((ppb_p->parent_bus == PCIE_PCIECAP_DEV_TYPE_PCIE_DEV) &&
 		    (as->when == DDI_POST))
-			pf_init(rdip, ppb_p->fm_ibc);
+			pf_init(rdip, ppb_p->fm_ibc, as->cmd);
 
 		return (DDI_SUCCESS);
 
@@ -590,7 +590,7 @@
 		ds = (struct detachspec *)arg;
 		if ((ppb_p->parent_bus == PCIE_PCIECAP_DEV_TYPE_PCIE_DEV) &&
 		    (ds->when == DDI_PRE))
-			pf_fini(rdip);
+			pf_fini(rdip, ds->cmd);
 
 		return (DDI_SUCCESS);