[IBBUS] workaround for some problems with WHQL PnP test over IPoIB. [mlnx: 3535]
[mirror/winof/.git] / core / bus / kernel / bus_port_mgr.c
index b3c7026..3742f71 100644 (file)
@@ -864,6 +864,10 @@ port_mgr_port_add(
                        return IB_ERROR;\r
                }\r
 \r
+               /* clean the extension (must be before initializing) */\r
+               p_port_ext = p_pdo[num_pdo]->DeviceExtension;\r
+               memset( p_port_ext, 0, sizeof(bus_port_ext_t) );\r
+\r
                /* Initialize the device extension. */\r
                cl_init_pnp_po_ext( p_pdo[num_pdo], NULL, p_pdo[num_pdo],\r
                                                        bus_globals.dbg_lvl, &vfptr_port_pnp,\r
@@ -872,7 +876,6 @@ port_mgr_port_add(
                /* Set the DO_BUS_ENUMERATED_DEVICE flag to mark it as a PDO. */\r
                p_pdo[num_pdo]->Flags |= DO_BUS_ENUMERATED_DEVICE;\r
 \r
-               p_port_ext = p_pdo[num_pdo]->DeviceExtension;\r
                p_port_ext->pdo.dev_po_state.DeviceState = PowerDeviceD0;\r
                p_port_ext->pdo.p_parent_ext = p_bfi->p_bus_ext;\r
                p_port_ext->pdo.b_present = TRUE;\r
@@ -923,7 +926,7 @@ port_mgr_port_add(
                 * Set the context of the PNP event. The context is passed in for future\r
                 * events on the same port.\r
                 */\r
-               if(num_pdo == 0)\r
+               if(num_pdo == 0) \r
                        p_ctx->p_pdo_ext = p_port_ext;\r
        }\r
 \r
@@ -1237,8 +1240,6 @@ port_mgr_port_remove(
        }\r
 \r
        p_ext->b_present = FALSE;\r
-       p_ext->b_reported_missing = TRUE;\r
-\r
        BUS_TRACE( BUS_DBG_PNP,\r
                ("Mark removing %s: PDO %p, ext %p, present %d, missing %d .\n",\r
                p_ext->cl_ext.vfptr_pnp_po->identity, p_ext->cl_ext.p_self_do, p_ext,\r
@@ -1346,6 +1347,13 @@ port_release_resources(
        p_ext = p_dev_obj->DeviceExtension;\r
        p_port_mgr = p_ext->pdo.p_parent_ext->bus_filter->p_port_mgr;\r
 \r
+       /* skip releasing resources if PDO has not been yet reported missing */\r
+       if (!p_ext->pdo.b_reported_missing) {\r
+               BUS_TRACE_EXIT( BUS_DBG_PNP, ("PDO is not yet reported missing - skip the removing port from vector: PDO %p, ext %p\n",\r
+                       p_dev_obj, p_ext) );\r
+               return;\r
+       }\r
+\r
        /* Remove this PDO from its list. */\r
        cl_mutex_acquire( &p_port_mgr->pdo_mutex );\r
        BUS_TRACE( BUS_DBG_PNP, ("Removing port from vector: PDO %p, ext %p\n",\r
@@ -1432,8 +1440,20 @@ port_surprise_remove(
        UNUSED_PARAM( p_irp );\r
 \r
        p_ext = p_dev_obj->DeviceExtension;\r
-       p_ext->pdo.b_present = FALSE;\r
-       p_ext->pdo.b_reported_missing = TRUE;\r
+       //\r
+       // Setting 2 folloeing flags seems like the right behaviour\r
+       // according to DDK, but it causes \r
+       // WHQL PnP SurpriseRemoval test to fail\r
+       // So, as a work around, they are disabled for now.\r
+       // The best solution is to rewrite all the drivers\r
+       // to WDF model, hoping it will handle right all PnP/Power issues\r
+       //\r
+//     p_ext->pdo.b_present = FALSE;\r
+//     p_ext->pdo.b_reported_missing = TRUE;\r
+       if (!p_ext->pdo.b_reported_missing) {\r
+               // we have not yet reported the device absence \r
+               cl_rollback_pnp_state( &p_ext->pdo.cl_ext );\r
+       }\r
        BUS_TRACE( BUS_DBG_PNP, ("%s: PDO %p, ext %p, present %d, missing %d .\n",\r
                p_ext->pdo.cl_ext.vfptr_pnp_po->identity, p_ext->pdo.cl_ext.p_self_do, \r
                p_ext, p_ext->pdo.b_present, p_ext->pdo.b_reported_missing ) );\r