/* * 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 * or http://www.opensolaris.org/os/licensing. * 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 */ /* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * * MODULE: dapl_hca_util.c * * PURPOSE: Manage HCA structure * */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_provider.h" #include "dapl_hca_util.h" #include "dapl_hash.h" /* * dapl_hca_alloc * * alloc and initialize an HCA struct * * Input: * name * port * * Output: * hca_ptr * * Returns: * none * */ /* ARGSUSED */ DAPL_HCA * dapl_hca_alloc(char *name, char *port) { DAPL_HCA *hca_ptr; hca_ptr = dapl_os_alloc(sizeof (DAPL_HCA)); if (NULL != hca_ptr) { (void) dapl_os_memzero(hca_ptr, sizeof (DAPL_HCA)); if (DAT_SUCCESS == dapls_hash_create(DAPL_HASH_TABLE_DEFAULT_CAPACITY, DAT_TRUE, &hca_ptr->lmr_hash_table)) { dapl_os_lock_init(&hca_ptr->lock); dapl_llist_init_head(&hca_ptr->ia_list_head); hca_ptr->name = dapl_os_strdup(name); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->port_num = 0; hca_ptr->null_ib_cq_handle = IB_INVALID_HANDLE; } else { dapl_os_free(hca_ptr, sizeof (DAPL_HCA)); hca_ptr = NULL; } } return (hca_ptr); } /* * dapl_hca_free * * free an IA INFO struct * * Input: * hca_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_free(DAPL_HCA *hca_ptr) { unsigned int len; (void) dapls_hash_free(hca_ptr->lmr_hash_table); if (NULL != hca_ptr->name) { len = dapl_os_strlen(hca_ptr->name); /* pacify lint dapl_os_free macro doesn't use len */ len = len; dapl_os_free(hca_ptr->name, len + 1); } dapl_os_free(hca_ptr, sizeof (DAPL_HCA)); } /* * dapl_hca_link_ia * * Add an ia to the HCA structure * * Input: * hca_ptr * ia_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_link_ia(IN DAPL_HCA *hca_ptr, IN DAPL_IA *ia_ptr) { dapl_os_lock(&hca_ptr->lock); dapl_llist_add_head(&hca_ptr->ia_list_head, &ia_ptr->hca_ia_list_entry, ia_ptr); dapl_os_unlock(&hca_ptr->lock); } /* * dapl_hca_unlink_ia * * Remove an ia from the hca info structure * * Input: * hca_ptr * ia_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_unlink_ia(IN DAPL_HCA *hca_ptr, IN DAPL_IA *ia_ptr) { dapl_os_lock(&hca_ptr->lock); /* * If an error occurred when we were opening the IA it * will not be linked on the list; don't unlink an unlinked * list! */ if (!dapl_llist_is_empty(&hca_ptr->ia_list_head)) { (void) dapl_llist_remove_entry(&hca_ptr->ia_list_head, &ia_ptr->hca_ia_list_entry); } dapl_os_unlock(&hca_ptr->lock); }