case IB_PNP_SM_CHANGE:\r
case IB_PNP_PORT_ACTIVE:\r
/* Initiate a sweep - delay a bit to allow the ports to come up. */\r
- if( g_ioc_poll_interval )\r
+ if( g_ioc_poll_interval && !gp_ioc_pnp->query_cnt)\r
{\r
cl_status = cl_timer_start( &gp_ioc_pnp->sweep_timer, 250 );\r
CL_ASSERT( cl_status == CL_SUCCESS );\r
{\r
case IB_PNP_IOU_ADD:\r
CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOU );\r
- p_context = pnp_create_context( p_reg, p_event->p_rec->guid );\r
+ p_context = pnp_create_context( p_reg, &p_event->p_rec->guid);\r
break;\r
\r
case IB_PNP_IOU_REMOVE:\r
CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOU );\r
/* Lookup the context for this IOU. */\r
- p_context = pnp_get_context( p_reg, p_event->p_rec->guid );\r
+ p_context = pnp_get_context( p_reg, &p_event->p_rec->guid );\r
break;\r
\r
case IB_PNP_IOC_ADD:\r
CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOC );\r
- p_context = pnp_create_context( p_reg, p_event->p_rec->guid );\r
+ p_context = pnp_create_context( p_reg, &p_event->p_rec->guid);\r
break;\r
-\r
- default:\r
+ case IB_PNP_IOC_PATH_ADD:\r
+ case IB_PNP_IOC_PATH_REMOVE:\r
CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOC );\r
- p_context = pnp_get_context( p_reg, p_event->p_rec->guid );\r
+ p_context = pnp_get_context( p_reg, &p_event->p_rec->guid );\r
+ break;\r
+ default:\r
+ AL_PRINT_EXIT(TRACE_LEVEL_WARNING, AL_DBG_PNP,("Invalid PnP event %#x\n",\r
+ p_event->p_rec->pnp_event));\r
+ return CL_NOT_DONE;\r
break;\r
}\r
if( !p_context )\r
p_event->p_rec->pnp_event == IB_PNP_IOU_REMOVE ||\r
p_event->p_rec->pnp_event == IB_PNP_IOC_REMOVE )\r
{\r
- cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
+ cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
cl_free( p_context );\r
}\r
else\r
}\r
p_rec->pnp_rec.pnp_event = IB_PNP_IOU_ADD;\r
p_rec->pnp_rec.guid = p_iou->guid;\r
+ p_rec->pnp_rec.ca_guid = p_iou->ca_guid;\r
+ \r
p_rec->ca_guid = p_iou->ca_guid;\r
+ p_rec->guid = p_iou->guid;\r
p_rec->vend_id = p_iou->vend_id;\r
p_rec->dev_id = p_iou->dev_id;\r
p_rec->revision = p_iou->revision;\r
\r
p_rec->pnp_rec.pnp_event = IB_PNP_IOC_ADD;\r
p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid;\r
+ p_rec->pnp_rec.ca_guid = p_ioc->p_iou->ca_guid;\r
+ \r
p_rec->ca_guid = p_ioc->p_iou->ca_guid;\r
cl_memcpy( p_rec->svc_entry_array, p_ioc->p_svc_entries,\r
p_ioc->profile.num_svc_entries * sizeof(ib_svc_entry_t) );\r
p_rec = (ib_pnp_ioc_path_rec_t*)cl_zalloc( event.rec_size * 2 );\r
if( !p_rec )\r
return;\r
-\r
+ p_rec->pnp_rec.pnp_event = pnp_event;\r
+ p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid;\r
+ p_rec->pnp_rec.ca_guid = p_path->ca_guid;\r
+ \r
p_rec->ca_guid = p_path->ca_guid;\r
p_rec->port_guid = p_path->port_guid;\r
p_rec->path = p_path->rec;\r
\r
- p_rec->pnp_rec.pnp_event = pnp_event;\r
- p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid;\r
-\r
event.p_rec = (ib_pnp_rec_t*)p_rec;\r
event.p_user_rec = (ib_pnp_rec_t*)(((uint8_t*)p_rec) + event.rec_size);\r
\r
IN al_obj_t *p_obj );\r
\r
\r
+/*\r
+ * Compares two context for inserts/lookups in a flexi map. Keys are the\r
+ * address of the reg guid1, which is adjacent to the context guid2 (if exist).\r
+ * This allows for a single call to cl_memcmp.\r
+ */\r
+static intn_t\r
+__context_cmp128(\r
+ IN const void* const p_key1,\r
+ IN const void* const p_key2 )\r
+{\r
+ return cl_memcmp( p_key1, p_key2, sizeof(uint64_t) * 2 );\r
+}\r
+\r
+/*\r
+ * Compares two context for inserts/lookups in a flexi map. Keys are the\r
+ * address of the reg guid1, which is adjacent to the context guid2 (if exist).\r
+ * This allows for a single call to cl_memcmp.\r
+ */\r
+static intn_t\r
+__context_cmp64(\r
+ IN const void* const p_key1,\r
+ IN const void* const p_key2 )\r
+{\r
+ return cl_memcmp( p_key1, p_key2, sizeof(uint64_t) );\r
+}\r
+\r
+\r
/*\r
* Event structures for queuing to the async proc manager.\r
*/\r
IN al_obj_t *p_obj )\r
{\r
al_pnp_t *p_reg;\r
- cl_map_item_t *p_item;\r
+ cl_fmap_item_t *p_item;\r
IRP *p_irp;\r
\r
AL_ENTER( AL_DBG_PNP );\r
p_reg = PARENT_STRUCT( p_obj, al_pnp_t, obj );\r
\r
/* Cleanup the context list. */\r
- while( cl_qmap_count( &p_reg->context_map ) )\r
+ while( cl_fmap_count( &p_reg->context_map ) )\r
{\r
- p_item = cl_qmap_tail( &p_reg->context_map );\r
- cl_qmap_remove_item( &p_reg->context_map, p_item );\r
+ p_item = cl_fmap_tail( &p_reg->context_map );\r
+ cl_fmap_remove_item( &p_reg->context_map, p_item );\r
cl_free( p_item );\r
}\r
\r
IN al_obj_t *p_obj )\r
{\r
al_pnp_t *p_reg;\r
- cl_map_item_t *p_item;\r
+ cl_fmap_item_t *p_item;\r
\r
AL_ENTER( AL_DBG_PNP );\r
\r
p_reg = PARENT_STRUCT( p_obj, al_pnp_t, obj );\r
\r
/* Cleanup the context list. */\r
- while( cl_qmap_count( &p_reg->context_map ) )\r
+ while( cl_fmap_count( &p_reg->context_map ) )\r
{\r
- p_item = cl_qmap_tail( &p_reg->context_map );\r
- cl_qmap_remove_item( &p_reg->context_map, p_item );\r
+ p_item = cl_fmap_tail( &p_reg->context_map );\r
+ cl_fmap_remove_item( &p_reg->context_map, p_item );\r
cl_free( p_item );\r
}\r
\r
al_pnp_context_t*\r
pnp_get_context(\r
IN const al_pnp_t* const p_reg,\r
- IN const ib_net64_t guid )\r
+ IN const void* const p_key )\r
{\r
- cl_map_item_t *p_context_item;\r
+ cl_fmap_item_t *p_context_item;\r
\r
AL_ENTER( AL_DBG_PNP );\r
\r
/* Search the context list for this CA. */\r
- p_context_item = cl_qmap_get( &p_reg->context_map, guid );\r
- if( p_context_item != cl_qmap_end( &p_reg->context_map ) )\r
+ p_context_item = cl_fmap_get( &p_reg->context_map, p_key );\r
+ if( p_context_item != cl_fmap_end( &p_reg->context_map ) )\r
{\r
AL_EXIT( AL_DBG_PNP );\r
return PARENT_STRUCT( p_context_item, al_pnp_context_t, map_item );\r
}\r
else\r
{\r
- cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
+ cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
cl_free( p_context );\r
}\r
\r
al_pnp_context_t*\r
pnp_create_context(\r
IN al_pnp_t* const p_reg,\r
- IN const net64_t guid )\r
+ IN const void* const p_key )\r
{\r
al_pnp_context_t *p_context;\r
- cl_map_item_t *p_item;\r
+ cl_fmap_item_t *p_item;\r
\r
AL_ENTER( AL_DBG_PNP );\r
\r
sizeof(al_pnp_context_t)) );\r
return NULL;\r
}\r
-\r
/* Store the GUID in the context record. */\r
- p_context->guid = guid;\r
+ cl_memcpy(&p_context->guid, p_key, sizeof(ib_net64_t) * 2);\r
\r
/* Add the context to the context list. */\r
- p_item = cl_qmap_insert( &p_reg->context_map, p_context->guid,\r
+ p_item = cl_fmap_insert( &p_reg->context_map, &p_context->guid,\r
&p_context->map_item );\r
-\r
+ if( p_item != &p_context->map_item )\r
+ {\r
+ AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_PNP,\r
+ ("p_context is already in context map %I64x \n",p_context->guid));\r
+ p_context = NULL;\r
+ }\r
+ \r
+ \r
AL_EXIT( AL_DBG_PNP );\r
return p_context;\r
}\r
p_port_attr += event_rec.port_index;\r
\r
/* Create a new context for user port information. */\r
- p_context = pnp_create_context( p_reg, p_port_attr->port_guid );\r
+ p_context = pnp_create_context( p_reg, &p_port_attr->port_guid);\r
if( !p_context )\r
continue;\r
\r
case IB_PNP_CA:\r
event_rec.pnp_event = IB_PNP_CA_ADD;\r
p_context = pnp_create_context( p_reg,\r
- event_rec.p_ci_ca->p_pnp_attr->ca_guid );\r
+ &event_rec.p_ci_ca->p_pnp_attr->ca_guid);\r
if( !p_context )\r
break;\r
\r
\r
/* Initialize the registration info. */\r
construct_al_obj( &p_reg->obj, AL_OBJ_TYPE_H_PNP );\r
- cl_qmap_init( &p_reg->context_map );\r
+ switch(pnp_get_class(p_pnp_req->pnp_class)){\r
+ case IB_PNP_IOU:\r
+ case IB_PNP_IOC:\r
+ cl_fmap_init( &p_reg->context_map, __context_cmp128 );\r
+ break;\r
+ case IB_PNP_PORT:\r
+ case IB_PNP_CA:\r
+ cl_fmap_init( &p_reg->context_map, __context_cmp64 );\r
+ break;\r
+ default:\r
+ AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,\r
+ ("unknown pnp_class 0x%x.\n", pnp_get_class(p_pnp_req->pnp_class)));\r
+ }\r
status = init_al_obj( &p_reg->obj, p_pnp_req->pnp_context, TRUE,\r
__pnp_reg_destroying, __pnp_reg_cleanup, __pnp_reg_free );\r
if( status != IB_SUCCESS )\r
* exercise to the open source community.\r
*/\r
p_context = pnp_create_context( p_reg,\r
- p_event_rec->p_ci_ca->p_pnp_attr->ca_guid );\r
+ &p_event_rec->p_ci_ca->p_pnp_attr->ca_guid);\r
if( !p_context )\r
continue;\r
\r
{\r
p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr;\r
p_port_attr += port_index;\r
- p_context = pnp_get_context( p_reg, p_port_attr->port_guid );\r
+ p_context = pnp_get_context( p_reg, &p_port_attr->port_guid );\r
if( !p_context )\r
continue;\r
\r
* Remove the port context from the registrant's\r
* context list.\r
*/\r
- cl_qmap_remove_item( &p_reg->context_map,\r
+ cl_fmap_remove_item( &p_reg->context_map,\r
&p_context->map_item );\r
/* Free the context. */\r
cl_free( p_context );\r
\r
/* Search the context list for this CA. */\r
p_context =\r
- pnp_get_context( p_reg, p_event_rec->p_ci_ca->verbs.guid );\r
+ pnp_get_context( p_reg, &p_event_rec->p_ci_ca->p_pnp_attr->ca_guid);\r
\r
/* Make sure we found a context. */\r
if( !p_context )\r
if( __pnp_notify_user( p_reg, p_context, p_event_rec ) == IB_SUCCESS )\r
{\r
/* Remove the context from the context list. */\r
- cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
+ cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item );\r
\r
/* Deallocate the context block. */\r
cl_free( p_context );\r
p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr;\r
p_port_attr += p_event_rec->port_index;\r
\r
- p_context = pnp_get_context( p_reg, p_port_attr->port_guid );\r
+ p_context = pnp_get_context( p_reg, &p_port_attr->port_guid );\r
if( !p_context )\r
continue;\r
\r
p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr;\r
p_port_attr += p_event_rec->port_index;\r
\r
- p_context = pnp_get_context( p_reg, p_port_attr->port_guid );\r
+ p_context = pnp_get_context( p_reg, &p_port_attr->port_guid );\r
if( !p_context )\r
continue;\r
\r
{\r
cl_obj_destroy( &p_ioc_mgr->obj );\r
IOU_PRINT_EXIT( TRACE_LEVEL_ERROR, IOU_DBG_ERROR,\r
- ("ib_reg_pnp returned %s.\n",\r
+ ("open_al returned %s.\n",\r
p_ioc_mgr->ifc.get_err_str(status)) );\r
return status;\r
}\r
p_ioc_ext->pdo.p_parent_ext = p_ext;\r
p_ioc_ext->pdo.b_present = TRUE;\r
p_ioc_ext->pdo.b_reported_missing = FALSE;\r
-\r
+ p_ioc_ext->pdo.ca_guid = p_pnp_rec->ca_guid;\r
+ \r
/* Copy the IOC profile and service entries. */\r
p_ioc_ext->info = p_pnp_rec->info;\r
cl_memcpy( p_ioc_ext->svc_entries, p_pnp_rec->svc_entry_array,\r
}\r
\r
/* The instance ID is the port GUID. */\r
- p_string = ExAllocatePool( PagedPool, sizeof(WCHAR) * 17 );\r
+ p_string = ExAllocatePool( PagedPool, sizeof(WCHAR) * 33 );\r
if( !p_string )\r
{\r
IOU_PRINT_EXIT( TRACE_LEVEL_ERROR, IOU_DBG_ERROR,\r
return STATUS_NO_MEMORY;\r
}\r
\r
- status = RtlStringCchPrintfW(\r
- p_string, 17, L"%016I64x", p_ext->info.profile.ioc_guid );\r
+ status = RtlStringCchPrintfW(p_string, 33, L"%016I64x%016I64x",\r
+ p_ext->info.profile.ioc_guid,p_ext->pdo.ca_guid);\r
if( !NT_SUCCESS( status ) )\r
{\r
CL_ASSERT( NT_SUCCESS( status ) );\r