/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
*/
/*
* This routine is only called when the port-monitor thread is
* about to die. Between the time the first mcast solicitation
* was done by the port-monitor thread and the time it is asked
* to die, a lot of things could've happened and we need to
* cleanup all of it.
*/
void
{
/*
* Since we would've already stopped processing completions for
* this thread's work queue, we don't have to worry about requests
* coming in for creation of new eoib nodes. However, there may
* be pending node creation requests for this port (thr_info)
* that we will have to drop.
*/
} else {
} else {
}
}
}
/*
* Now go through the list of all children and free up any
* resource we might've allocated; note that the child dips
* anything with them.
*/
if (child->ch_node_name) {
}
}
/*
* Return all the swqes we've acquired for the gateway unicast
* solicitations, free any address vectors we've allocated and
* finally free the gw entries from the list.
*/
sizeof (ibt_adds_vect_t));
}
}
}
/*
* Communicate all the details we received about the gateway (via the
* advertisement control message) to the eoib instance we're creating.
*/
void
{
int ret;
info->ti_hca_guid);
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
"%s property to 0x%llx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
"%s property to 0x%llx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
"%s property to 0x%llx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
"%s property to 0x%llx for child dip 0x%llx, ret=%d",
}
gwi->gw_adv_period);
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
gwi->gw_ka_period);
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
gwi->gw_ctrl_qpn);
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
gwi->gw_n_rss_qpn);
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
"%s property to 0x%lx for child dip 0x%llx, ret=%d",
}
(char *)(gwi->gw_system_name));
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
"%s property to '%s' for child dip 0x%llx, ret=%d",
}
(char *)(gwi->gw_port_name));
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
"%s property to '%s' for child dip 0x%llx, ret=%d",
}
(char *)(gwi->gw_vendor_id));
if (ret != DDI_PROP_SUCCESS) {
ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
"%s property to '%s' for child dip 0x%llx, ret=%d",
}
}
int
{
char *node_name;
ENX_DPRINTF_ERR("ddi_get_parent_data(child=0x%llx) "
"returned NULL", child);
return (DDI_NOT_WELL_FORMED);
}
/*
* Skip the name and "@" part in the eoib node path and copy the
* address part out to the caller.
*/
return (DDI_SUCCESS);
}
/*
*/
void
{
}
void
{
}
{
const char *hca_drv_name;
int hca_drv_inst;
/*
* Prepare the "ident" for EoIB nodes from this port monitor. To
* associate eoib instances with the corresponding HCA nodes easily,
* and to make sure eoib instance numbers do not change when
* like-for-like HCA replacements are made, tie up the ident to
* HCA driver name, HCA driver instance and the HCA port number.
* The eoib node address is later composed using this ident and
* the gateway port ids after discovery.
*/
ENX_DPRINTF_WARN("ibtl_ibnex_hcaguid2dip(hca_guid=0x%llx) "
ENX_DPRINTF_WARN("hca driver name NULL for "
"hca_guid=0x%llx, hca_dip=0x%llx",
ENX_DPRINTF_ERR("hca driver instance (%d) invalid for "
"hca_guid=0x%llx, hca_dip=0x%llx",
} else {
}
return (ti);
}
void
{
/*
* Tell the port monitor thread to stop and wait for it to
* happen. Before marking it for death, make sure there
* aren't any completions being processed.
*/
}
/*
* Destroy synchronization primitives initialized for this ti
*/
}
void
eibnx_terminate_monitors(void)
{
/*
* Ask all the port_monitor threads to die. Before marking them
* for death, make sure there aren't any completions being
* processed by the thread.
*/
}
}
int
dev_info_t **childp)
{
char *node_name;
int circular;
int ret;
/*
* Prepare the new node's name
*/
return (ENX_E_FAILURE);
if (ret == ENX_E_SUCCESS) {
if (childp) {
}
return (ENX_E_SUCCESS);
}
}
/*
* If the node does not already exist, we may need to create it
*/
}
/*
* Whether there was no devinfo node at all for the given node name or
* we had a devinfo node, but it wasn't in our list of eoib children,
* we'll try to online the instance here.
*/
if (ret != NDI_SUCCESS) {
ENX_DPRINTF_ERR("ndi_devi_online(node_name=%s) failed "
(void) ndi_devi_free(child_dip);
return (ENX_E_FAILURE);
}
if (childp) {
}
return (ENX_E_SUCCESS);
}
int
{
/*
* To unconfigure an eoib node, we only need to set the child's
* dip to NULL. When the node gets configured again, we either
* find the dip for the pathname and set it in this child, or
* allocate a new dip and set it in this child.
*/
}
int
{
/*
* Locate the port monitor thread info and gateway info
* that corresponds to the supplied devname.
*/
continue;
break;
}
if (gwi) {
break;
}
}
return (ENX_E_FAILURE);
}
return (ENX_E_SUCCESS);
}
int
{
return (ENX_E_SUCCESS);
}
}
}
return (ENX_E_FAILURE);
}
static char *
{
char *name;
return (NULL);
return (name);
}