1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23 */
24
25#include <sys/types.h>
26#include <sys/kmem.h>
27#include <sys/ksynch.h>
28#include <sys/ib/ibtl/ibti_common.h>
29
30kmutex_t	ibtl_part_attr_mutex;
31ibt_status_t	(*ibtl_get_part_attr_cb)(datalink_id_t, ibt_part_attr_t *);
32ibt_status_t	(*ibtl_get_all_part_attr_cb)(ibt_part_attr_t **, int *);
33
34void
35ibt_register_part_attr_cb(
36    ibt_status_t (*get_part_attr)(datalink_id_t, ibt_part_attr_t *),
37    ibt_status_t (*get_all_part_attr)(ibt_part_attr_t **, int *))
38{
39	mutex_enter(&ibtl_part_attr_mutex);
40	ibtl_get_part_attr_cb = get_part_attr;
41	ibtl_get_all_part_attr_cb = get_all_part_attr;
42	mutex_exit(&ibtl_part_attr_mutex);
43}
44
45void
46ibt_unregister_part_attr_cb(void)
47{
48	mutex_enter(&ibtl_part_attr_mutex);
49	ibtl_get_part_attr_cb = NULL;
50	ibtl_get_all_part_attr_cb = NULL;
51	mutex_exit(&ibtl_part_attr_mutex);
52}
53
54ibt_status_t
55ibt_get_part_attr(datalink_id_t linkid, ibt_part_attr_t *attr)
56{
57	ibt_status_t	status;
58
59	mutex_enter(&ibtl_part_attr_mutex);
60	if (ibtl_get_part_attr_cb != NULL)
61		status = (*ibtl_get_part_attr_cb) (linkid, attr);
62	else
63		status = IBT_NO_SUCH_OBJECT;
64	mutex_exit(&ibtl_part_attr_mutex);
65
66	return (status);
67}
68
69ibt_status_t
70ibt_get_all_part_attr(ibt_part_attr_t **attr, int *nparts)
71{
72	ibt_status_t	status;
73
74	mutex_enter(&ibtl_part_attr_mutex);
75	if (ibtl_get_all_part_attr_cb != NULL)
76		status = (*ibtl_get_all_part_attr_cb) (attr, nparts);
77	else {
78		*attr = NULL;
79		*nparts = 0;
80		status = IBT_SUCCESS;
81	}
82	mutex_exit(&ibtl_part_attr_mutex);
83
84	return (status);
85}
86
87ibt_status_t
88ibt_free_part_attr(ibt_part_attr_t *attr, int nparts)
89{
90	if (nparts > 0)
91		kmem_free(attr, sizeof (ibt_part_attr_t) * nparts);
92	return (IBT_SUCCESS);
93}
94