usr/src/uts/common/io/ib/ibtl/ibtl_impl.c
author hiremath
Mon, 12 Dec 2005 14:14:35 -0800
changeset 1093 4dc7aec69dc9
parent 929 e9eba56e751c
child 7862 f8b6a07acfd6
permissions -rw-r--r--
6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets 6308117 IB Nexus BUS_CONFIG_ONE will need to load HCA drivers during boot 6309515 ibdm should MADs with unique transaction ID 6309525 IOC vendor and sub-vendor ID has an endian issue 6321383 tavor moving queue pairs out of reset can take a while 6332260 ibt_open_rc_channel: redirected inputs needs better handling 6333763 crload test causes system hangs and other InfiniBand CM failures under stress 6350831 ibt_get_paths() returns IBT_HCA_PORT_NOT_ACTIVE when second hca has no active ports 6361204 tavor fmr can invalidate memory regions sooner
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * ibtl_impl.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * This file contains the IBTF module's initialization and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * IBTF Clients/Modules registration routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/sunndi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/sunmdi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/ib/ibtl/impl/ibtl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/ib/ibtl/impl/ibtl_ibnex.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * Globals.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
static char ibtf[] = "ibtl_impl";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
extern ibtl_ibnex_callback_t	ibtl_ibnex_callback_routine;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * ibtl_clnt_list:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 *	Head of the list of IBT Client Instances. The IBT Client List
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 *	is modified by IBTF on an IBT client's ibt_attach/ibt_detach call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * ibtl_hca_list:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *	Head of the list of HCA devices. The HCA List is modified by IBTF on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 *	a CI's ibc_attach/ibc_detach call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 *	The datap of the list elements points to an ibtl_hca_devinfo_s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *	structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *				(ibc_attach)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 *  ibtl_hca_list	-> ibtl_hca_devinfo_t--> ...	-->ibtl_hca_devinfo_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *	[per-hca_dev]		|	^			{nth HCA Dev}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *				|	|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *				|  ibtl_hca_t (ibt_open_hca)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *				|	^  |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *				|	|  |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *				v	|  V
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *  ibtl_clnt_list	->	ibtl_clnt_t--> ...--> {n'th Module}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *	[per-client_instance]	(ibt_attach)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
/* Global List of IBT Client Instances, and associated mutex. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
struct ibtl_clnt_s *ibtl_clnt_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
kmutex_t ibtl_clnt_list_mutex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
/* Lock for the race between the client and CM to free QPs. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
kmutex_t ibtl_free_qp_mutex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/* Lock for the race between the client closing the HCA and QPN being freed. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
kcondvar_t ibtl_close_hca_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
/* Global List of HCA Devices, and associated mutex. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
struct ibtl_hca_devinfo_s *ibtl_hca_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
/* Well-known async handlers and associated client private. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
ibt_async_handler_t ibtl_cm_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
ibt_async_handler_t ibtl_dm_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
ibt_async_handler_t ibtl_ibma_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
void	*ibtl_cm_clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
void	*ibtl_dm_clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
void	*ibtl_ibma_clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
extern int ib_hw_status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
_NOTE(SCHEME_PROTECTS_DATA("Scheme protects data", ib_hw_status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 * Misc Module Declarations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
extern struct mod_ops mod_miscops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
static struct modlmisc modlmisc = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	&mod_miscops,			/* Type of module - misc. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	"IB Transport Layer v%I%"	/* Name of the Module. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
static struct modlinkage modlinkage = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	MODREV_1, (void *)&modlmisc, NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 * IBTF Loadable Module Routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	int rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	if ((rval = mod_install(&modlinkage)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	 * initialize IBTL ib2usec table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	ibtl_ib2usec_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	 * Initialize Logging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	ibtl_logging_initialization();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	 * Initialize the Alloc QP States.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	ibtl_init_cep_states();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	 * Initialize all Global Link Lists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	mutex_init(&ibtl_clnt_list_mutex, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	mutex_init(&ibtl_free_qp_mutex, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	cv_init(&ibtl_close_hca_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	mutex_init(&ibtl_qp_mutex, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	cv_init(&ibtl_qp_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	ibtl_thread_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 * The IBTF Module is never unloaded. Actually there is no need of this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * routine, but provided just in case.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	int rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	if ((rval = mod_remove(&modlinkage)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	ibtl_thread_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	mutex_destroy(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	mutex_destroy(&ibtl_free_qp_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	cv_destroy(&ibtl_close_hca_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	mutex_destroy(&ibtl_qp_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	cv_destroy(&ibtl_qp_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	 * Stop Logging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	ibtl_logging_destroy();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
_info(struct modinfo *modinfop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	/* Return the Module Information. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	return (mod_info(&modlinkage, modinfop));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * IBTF Client Registration Routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
 *	ibt_attach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 *	modinfop	- Client Module info structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 *	arg		- usually client's dip
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 *	clnt_private	- client's private data pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
 *	ibt_hdl_p	- pointer to client's specific IBT handle,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
 *			 which is opaque to clients.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
 *	IBT_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
 *	IBT_INVALID_PARAM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
 *	IBTF Client module during its attach() to register its instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
 *	to IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
 *	Registers the IBTF client module instance and returns an opaque
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
 *	handler to the client to be used for future calls to IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
 *	Adds this client module instance to ibtl_clnt_list list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
 *	Records well-known async handlers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
ibt_attach(ibt_clnt_modinfo_t *mod_infop, dev_info_t *arg, void *clnt_private,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
    ibt_clnt_hdl_t *ibt_hdl_p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	dev_info_t	*pdip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	ibtl_clnt_t	*clntp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	IBTF_DPRINTF_L3(ibtf, "ibt_attach(%p, %p, %p)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	    mod_infop, arg, clnt_private);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	if (mod_infop->mi_clnt_name == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		IBTF_DPRINTF_L1(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		    "IB client needs to specify its name");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	 * Validate the Transport API version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	 */
929
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
   239
	if (mod_infop->mi_ibt_version != IBTI_V2) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		IBTF_DPRINTF_L1(ibtf, "ibt_attach: IB client '%s' has an "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		    "invalid IB TI Version '%d'", mod_infop->mi_clnt_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		    mod_infop->mi_ibt_version);
929
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
   243
		return (IBT_NOT_SUPPORTED);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	if (mod_infop->mi_async_handler == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		IBTF_DPRINTF_L2(ibtf, "ibt_attach: Client '%s' has not\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		    "        provided an Asynchronous Event Handler.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		    "        This will be required soon.",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		    mod_infop->mi_clnt_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	 * Check out Client's Class information. If it is not of mgmt class,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	 * we expect 'arg' to be Not NULL and point to client driver's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	 * device info struct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	if ((!IBT_CLNT_MGMT_CLASS(mod_infop->mi_clnt_class)) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	    (arg == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		IBTF_DPRINTF_L1(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		    "arg not set with driver's dip.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	if (!IBT_CLNT_MGMT_CLASS(mod_infop->mi_clnt_class)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		pdip = ddi_get_parent(arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		if (pdip == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		    ibtl_ibnex_valid_hca_parent(pdip) != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
			IBTF_DPRINTF_L2(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
			    "client %s is not a child of IB nexus driver.",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
			    ddi_driver_name(arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
			return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	if (mod_infop->mi_clnt_class == IBT_CM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		if (ibtl_cm_async_handler != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
			IBTF_DPRINTF_L1(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
			    "CM is already attached.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
			mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
			return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		ibtl_cm_async_handler = mod_infop->mi_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		ibtl_cm_clnt_private = clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	} else if (mod_infop->mi_clnt_class == IBT_DM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		if (ibtl_dm_async_handler != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			IBTF_DPRINTF_L1(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			    "DM is already attached.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
			mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
			return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		ibtl_dm_async_handler = mod_infop->mi_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		ibtl_dm_clnt_private = clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	} else if (mod_infop->mi_clnt_class == IBT_IBMA) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		if (ibtl_ibma_async_handler != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
			IBTF_DPRINTF_L1(ibtf, "ibt_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			    "IBMF is already attached.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
			return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		ibtl_ibma_async_handler = mod_infop->mi_async_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		ibtl_ibma_clnt_private = clnt_private;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	/* Allocate the memory for per-client-device info structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	clntp = kmem_zalloc(sizeof (ibtl_clnt_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	_NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(clntp->clnt_modinfop,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	    clntp->clnt_dip, clntp->clnt_name, clntp->clnt_async_cnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	    clntp->clnt_private))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	/* Update the Client info structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	clntp->clnt_modinfop = mod_infop;	/* IBT Client's Mod Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	clntp->clnt_private = clnt_private;	/* IBT Client's private */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	clntp->clnt_dip = arg;			/* IBT Client's dip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	clntp->clnt_async_cnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	/* using a count of 7 below guarantees it is NULL terminated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	(void) strncpy(clntp->clnt_name, mod_infop->mi_clnt_name, 7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	_NOTE(NOW_VISIBLE_TO_OTHER_THREADS(clntp->clnt_modinfop,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	    clntp->clnt_dip, clntp->clnt_name, clntp->clnt_async_cnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	    clntp->clnt_private))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 * Update Client Device Instance List.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	clntp->clnt_list_link = ibtl_clnt_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	ibtl_clnt_list = clntp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	 * The ibt_hdl_p is a opaque handle which is the address of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	 * ibt_clnt_t structure passed back to the clients.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	 * The client will pass on this handle in its future calls to IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	*ibt_hdl_p = clntp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	return (IBT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
 *	ibt_detach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
 *	ibt_hdl - IBT Handle as returned during ibt_attach call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
 *	none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
 *	IBT_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
 *	IBT_INVALID_PARAM.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
 *	IBTF Client module during its detach() to de-register its instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
 *	from IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
 *	Deregisters the IBTF client module instance from the IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
 *	All resources and any reference to this ibt_hdl will be removed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
ibt_detach(ibt_clnt_hdl_t ibt_hdl)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	ibtl_clnt_t **clntpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	IBTF_DPRINTF_L3(ibtf, "ibt_detach(%p)", ibt_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	clntpp = &ibtl_clnt_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	for (; *clntpp != NULL; clntpp = &(*clntpp)->clnt_list_link)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		if (*clntpp == ibt_hdl)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	if (*clntpp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		IBTF_DPRINTF_L1(ibtf, "ibt_detach: Client @ %p Not Found",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		    ibt_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		return (IBT_INVALID_PARAM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	 * Check out whether the client has freed all its resources.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	 * If not done, then fail the detach.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	 * viz. A client has to close all the HCA they have opened,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	 * i.e. the HCA List maintained for clients has to be empty.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	 * If this list is not empty, then the client has not performed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	 * complete clean-up, so fail the detach.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	if (ibt_hdl->clnt_hca_list != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		IBTF_DPRINTF_L2(ibtf, "ibt_detach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		    "ERROR: Client '%s' has not closed all of its HCAs",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		    ibt_hdl->clnt_modinfop->mi_clnt_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		return (IBT_HCA_RESOURCES_NOT_FREED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	if (ibt_hdl->clnt_srv_cnt != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		IBTF_DPRINTF_L2(ibtf, "ibt_detach: client '%s' still has "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		    "services or subnet_notices registered",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		    ibt_hdl->clnt_modinfop->mi_clnt_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		return (IBT_HCA_RESOURCES_NOT_FREED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	 * Delete the entry of this module from the ibtl_clnt_list List.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	*clntpp = ibt_hdl->clnt_list_link;	/* remove us */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	/* make sure asyncs complete before freeing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	ibtl_free_clnt_async_check(ibt_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	if (ibt_hdl->clnt_modinfop->mi_clnt_class == IBT_CM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		ibtl_cm_async_handler = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		ibtl_cm_clnt_private = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	} else if (ibt_hdl->clnt_modinfop->mi_clnt_class == IBT_DM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		ibtl_dm_async_handler = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		ibtl_dm_clnt_private = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	} else if (ibt_hdl->clnt_modinfop->mi_clnt_class == IBT_IBMA) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		ibtl_ibma_async_handler = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		ibtl_ibma_clnt_private = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	/* Free up the memory of per-client info struct. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	kmem_free(ibt_hdl, sizeof (ibtl_clnt_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	return (IBT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
ibtl_set_ibhw_status()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	ib_hw_status++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
ibtl_clear_ibhw_status()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	ib_hw_status--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
 *	ibc_init
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
 *	modlp		- Pointer to IBC client module linkage structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 *	None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
 *	0 always for now
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 *	CI client calls IBTF during its _init() to register HCA with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 *	Solaris I/O framework.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
 *	Initializes the CI clients module linkage structure with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
 *	default bus_ops structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
ibc_init(struct modlinkage *modlp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	ibtl_ibnex_cb_args_t	cb_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	cb_args.cb_flag = IBTL_IBNEX_IBC_INIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	cb_args.cb_modlp = modlp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	if (ibtl_ibnex_callback_routine) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		(void) ((*ibtl_ibnex_callback_routine)(&cb_args));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
 *	ibc_fini
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
 *	modlp		- Pointer to IBC client module linkage structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
 *	None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
 *	None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
 *	CI client calls IBTF during its _fini() to remove HCA with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
 *	Solaris I/O framework.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
 *	Undo what is done during ibc_init
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
ibc_fini(struct modlinkage *modlp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	ibtl_ibnex_cb_args_t	cb_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	cb_args.cb_flag = IBTL_IBNEX_IBC_FINI;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	cb_args.cb_modlp = modlp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	if (ibtl_ibnex_callback_routine) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		(void) ((*ibtl_ibnex_callback_routine)(&cb_args));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
 *	ibc_attach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
 *	info_p		- IBC HCA Info.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
 *	ibc_hdl_p	- IBC Client's HCA Handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
 *	IBC_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
 *	IBC_FAILURE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 *	CI calls IBTF during its attach() to register HCA Device with IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
 *	Registers the presence of HCA device by providing the HCA device info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
 *  	structure and provides an opaque HCA handler for future calls to this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
 *  	HCA device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
ibc_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
ibc_attach(ibc_clnt_hdl_t *ibc_hdl_p, ibc_hca_info_t *info_p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	ibtl_hca_devinfo_t	*hca_devp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	uint_t			nports;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	ibt_status_t		status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	IBTF_DPRINTF_L2(ibtf, "ibc_attach(%p, %p)", ibc_hdl_p, info_p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	/* Validate the Transport API version */
929
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
   529
	if (info_p->hca_ci_vers != IBCI_V2) {
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
   530
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: Invalid IB CI Version '%d'",
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
   531
		    info_p->hca_ci_vers);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	if (info_p->hca_attr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		    "HCA Attributes must be specified.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	nports = info_p->hca_attr->hca_nports;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	if (nports == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		    "Number of ports must be valid");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	if (info_p->hca_attr->hca_max_port_pkey_tbl_sz == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		    "Number of Partitions must be at least 1");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	if ((info_p->hca_attr->hca_flags & IBT_HCA_CURRENT_QP_STATE) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
		    "HCA driver must support QP current state checking");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	if ((info_p->hca_attr->hca_flags & IBT_HCA_PORT_UP) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		    "HCA driver must support PORT_UP async events");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	 * Install IB nexus driver (if not installed already)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	 */
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 929
diff changeset
   569
	ibtl_set_ibhw_status();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	if (ndi_devi_config_vhci("ib", 0) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		IBTF_DPRINTF_L2(ibtf, "ibc_attach: IB nexus attach failed");
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 929
diff changeset
   572
		ibtl_clear_ibhw_status();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	ibtl_thread_init2();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	/* Allocate the memory for per-client info structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	hca_devp = kmem_zalloc(sizeof (ibtl_hca_devinfo_t) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	    (nports - 1) * sizeof (ibtl_async_port_status_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	/* Update HCA dev info structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	hca_devp->hd_ibc_hca_hdl = info_p->hca_handle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	hca_devp->hd_ibc_ops	= info_p->hca_ops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	hca_devp->hd_hca_attr	= info_p->hca_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	hca_devp->hd_hca_dip	= info_p->hca_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	status = ibtl_init_hca_portinfo(hca_devp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	if (status != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: call to ibc_query_hca_ports "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		    "failed: status = %d", status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		kmem_free(hca_devp, sizeof (ibtl_hca_devinfo_t) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		    (nports - 1) * sizeof (ibtl_async_port_status_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	/* Register the with MPxIO as PHCI */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	if (mdi_phci_register(MDI_HCI_CLASS_IB, info_p->hca_dip, 0) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		MDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
		IBTF_DPRINTF_L1(ibtf, "ibc_attach: MPxIO register failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
		kmem_free(hca_devp, sizeof (ibtl_hca_devinfo_t) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		    (nports - 1) * sizeof (ibtl_async_port_status_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	/* Initialize the Client List for this HCA. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	hca_devp->hd_state	= IBTL_HCA_DEV_ATTACHED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	/* lock out asyncs until after we announce the new HCA */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	hca_devp->hd_async_busy = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	cv_init(&hca_devp->hd_async_task_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	cv_init(&hca_devp->hd_async_busy_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	/* init portinfo locking variables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	hca_devp->hd_portinfo_locked_port = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	cv_init(&hca_devp->hd_portinfo_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	 * The ibc_hdl_p points to an opaque handle which is the address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	 * of ibt_hca_devinfo_t structure passed back to the CI.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	 * The CI will pass on this handle in its future upcalls to IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	*ibc_hdl_p = hca_devp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	return (IBC_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
 *	ibc_post_attach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
 *	ibc_hdl		- IBC Client's HCA Handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
 *	none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
 *	CI calls IBTF during its attach() after a successful ibc_attach().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
 *	Announces to all known clients the existence of this HCA (by GUID).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
ibc_post_attach(ibc_clnt_hdl_t ibc_hdl)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	IBTF_DPRINTF_L2(ibtf, "ibc_post_attach(%p)", ibc_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	 * Update the HCA Device List.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	ibc_hdl->hd_hca_dev_link = ibtl_hca_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	ibtl_hca_list = ibc_hdl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	/* notify all IBT Client Device Instances of the new HCA Device */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	ibtl_announce_new_hca(ibc_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
 *	ibc_pre_detach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
 *	ibc_clnt_hdl	- IBC HCA Handle as returned during ibc_attach call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
 *  	cmd		- DDI_DETACH/DDI_SUSPEND command.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
 *	none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
 *	IBC_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
 *	IBC_FAILURE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
 *	CI to try to get all IBTF clients to close the HCA device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
 *	Attempts to deregister the HCA device entry from the IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
 *	If all resources are freed by the IBTF clients and this HCA
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
 *	is closed, then IBC_SUCCESS is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
ibc_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
ibc_pre_detach(ibc_clnt_hdl_t hca_devp, ddi_detach_cmd_t cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	ibtl_hca_devinfo_t **hcapp, *hcap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	IBTF_DPRINTF_L2(ibtf, "ibc_pre_detach(%p, 0x%x)", hca_devp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	 * Return failure, if command is not DDI_DETACH
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	case DDI_DETACH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		return (IBC_FAILURE); /* TBD: DDI_FAILURE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	/* Make sure this HCA is on the HCA Device List.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	hcap = ibtl_hca_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	while (hcap != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
		if (hcap == hca_devp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		hcap = hcap->hd_hca_dev_link;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	if (hcap == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	 * Initially set the state to "Detaching".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	hca_devp->hd_state = IBTL_HCA_DEV_DETACHING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	 * Try to detach all IBTI clients, and continue only if all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
	 * of the detaches succeed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	if (ibtl_detach_all_clients(hca_devp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
		hca_devp->hd_state = IBTL_HCA_DEV_ATTACHED; /* fix hd_state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	 * Check to see if all clients closed this HCA, or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	 * We only succeed if all clients cooperated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	if (hca_devp->hd_clnt_list != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		hca_devp->hd_state = IBTL_HCA_DEV_ATTACHED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		IBTF_DPRINTF_L2(ibtf, "ibc_pre_detach: HCA still has attached "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
		    "clients");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	 * mark this device as detached
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	hca_devp->hd_state = IBTL_HCA_DEV_DETACHED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	/* Delete the entry for this hca_devp from hca_head_list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	hcapp = &ibtl_hca_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	while (*hcapp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
		if (*hcapp == hca_devp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
		hcapp = &(*hcapp)->hd_hca_dev_link;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	if (mdi_phci_unregister(hca_devp->hd_hca_dip, 0) != MDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
		hca_devp->hd_state = IBTL_HCA_DEV_ATTACHED; /* fix hd_state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		IBTF_DPRINTF_L1(ibtf, "ibc_pre_detach: PHCI unregister failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	if (*hcapp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
		hca_devp->hd_state = IBTL_HCA_DEV_ATTACHED; /* fix hd_state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
		IBTF_DPRINTF_L1(ibtf, "ibc_pre_detach: HCA not attached");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		return (IBC_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	*hcapp = hca_devp->hd_hca_dev_link;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	ibtl_fast_gid_cache_valid = B_FALSE;	/* invalidate fast_gid_cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	return (IBC_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
 *	ibc_detach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
 *	ibc_clnt_hdl	- IBC HCA Handle as returned during ibc_attach call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
 *	none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
 *	None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
 * Called by:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
 *	CI to detach the HCA device from IBTF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
 *	Do the second step of detaching the HCA, which is required
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
 *	after a successful ibc_pre_detach.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
ibc_detach(ibc_clnt_hdl_t hca_devp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
	IBTF_DPRINTF_L2(ibtf, "ibc_detach(%p)", hca_devp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	mutex_enter(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	if (hca_devp->hd_state != IBTL_HCA_DEV_DETACHED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
		mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
		IBTF_DPRINTF_L0(ibtf, "ibc_detach: HCA has not successfully "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
		    "pre-detached");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	cv_destroy(&hca_devp->hd_async_task_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	cv_destroy(&hca_devp->hd_async_busy_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	cv_destroy(&hca_devp->hd_portinfo_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	kmem_free(hca_devp->hd_portinfop, hca_devp->hd_portinfo_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	mutex_exit(&ibtl_clnt_list_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	/* Free up the memory of per-client info struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	kmem_free(hca_devp, sizeof (ibtl_hca_devinfo_t) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	    (hca_devp->hd_hca_attr->hca_nports - 1) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	    sizeof (ibtl_async_port_status_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	ibtl_clear_ibhw_status();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
 *	ibt_ci_data_in()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
 *	hca_hdl			HCA Handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
 *	flags			IBT_COMPLETE_ALLOC - Finish a deferred alloc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
 *      object                  Identifies the type object pointed to by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
 *                              ibt_object_handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
 *      ibt_object_handle       The handle of the object to be associated with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
 *				the data in/out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
 *	data_p			Pointer data passed in to the CI. The buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
 *				should be allocated by the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
 *	data_sz			The size of the buffer pointed to by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
 *				data_p.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
 *	IBT_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
 *	IBT_NOT_SUPPORTED	Feature not supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
 *	IBT_INVALID_PARAM	Invalid object type specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
 *	IBT_HCA_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
 *	IBT_AH_HDL_INVALID/IBT_UD_DEST_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
 *	IBT_CHAN_HDL_INVALID/IBT_QP_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
 *	IBT_CQ_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
 *	IBT_EEC_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
 *	IBT_RDD_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
 *	IBT_MW_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
 *	IBT_PD_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
 *	IBT_SRQ_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
 *	Exchange CI private data for the specified CI object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
ibt_ci_data_in(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
    ibt_object_type_t object, void *ibt_object_handle, void *data_p,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
    size_t data_sz)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
	ibt_status_t		retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	void			*ci_obj_hdl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	IBTF_DPRINTF_L3(ibtf, "ibt_ci_data_in(%p, %x, %d, %p, %p, %d)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	    hca, flags, object, ibt_object_handle, data_p, data_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	switch (object) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	case IBT_HDL_HCA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		    (IBTL_HCA2CIHCA(((ibt_hca_hdl_t)ibt_object_handle)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	case IBT_HDL_CHANNEL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		    (IBTL_CHAN2CIQP(((ibt_channel_hdl_t)ibt_object_handle)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
	case IBT_HDL_CQ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		    (((ibt_cq_hdl_t)(ibt_object_handle))->cq_ibc_cq_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	case IBT_HDL_EEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		    (((ibt_eec_hdl_t)(ibt_object_handle))->eec_ibc_eec_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	case IBT_HDL_UD_DEST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		    (((ibt_ud_dest_hdl_t)(ibt_object_handle))->ud_ah);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	case IBT_HDL_SRQ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
		    (((ibt_srq_hdl_t)(ibt_object_handle))->srq_ibc_srq_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		ci_obj_hdl = ibt_object_handle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	retval = (IBTL_HCA2CIHCAOPS_P(hca)->ibc_ci_data_in)(IBTL_HCA2CIHCA(hca),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	    flags, object, ci_obj_hdl, data_p, data_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	if (retval != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
		IBTF_DPRINTF_L2(ibtf, "ibt_ci_data_in: Failed : %d", retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
 *	ibt_ci_data_out()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
 *	hca_hdl			HCA Handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
 *	flags			IBT_COMPLETE_ALLOC - Finish a deferred alloc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
 *      object                  Identifies the type object pointed to by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
 *                              ibt_object_handle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
 *      ibt_object_handle       The handle of the object to be associated with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
 *				the data in/out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
 *	data_p			Pointer to a buffer in which to return the CI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
 *				private data. The buffer should be allocated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
 *				by the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
 *	data_sz			The size of the buffer pointed to by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
 *				data_p.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
 * Output:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
 *	IBT_SUCCESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
 *	IBT_NOT_SUPPORTED	Feature not supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
 *	IBT_INSUFF_RESOURCE	The buffer pointed to by data_p was too
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
 *				small to hold the data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
 *	IBT_INVALID_PARAM	Invalid object type specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
 *	IBT_HCA_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
 *	IBT_AH_HDL_INVALID/IBT_UD_DEST_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
 *	IBT_CHAN_HDL_INVALID/IBT_QP_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
 *	IBT_CQ_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
 *	IBT_EEC_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
 *	IBT_RDD_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
 *	IBT_MW_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
 *	IBT_PD_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
 *	IBT_SRQ_HDL_INVALID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
 *	Exchange CI private data for the specified CI object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
ibt_ci_data_out(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
    ibt_object_type_t object, void *ibt_object_handle, void *data_p,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
    size_t data_sz)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	ibt_status_t		retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	void			*ci_obj_hdl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	IBTF_DPRINTF_L3(ibtf, "ibt_ci_data_out(%p, %x, %d, %p, %p, %d)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	    hca, flags, object, ibt_object_handle, data_p, data_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	switch (object) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	case  IBT_HDL_HCA:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
		    (IBTL_HCA2CIHCA(((ibt_hca_hdl_t)ibt_object_handle)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	case IBT_HDL_CHANNEL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		    (IBTL_CHAN2CIQP(((ibt_channel_hdl_t)ibt_object_handle)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	case IBT_HDL_CQ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		    (((ibt_cq_hdl_t)(ibt_object_handle))->cq_ibc_cq_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	case IBT_HDL_EEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
		    (((ibt_eec_hdl_t)(ibt_object_handle))->eec_ibc_eec_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
	case IBT_HDL_UD_DEST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
		    (((ibt_ud_dest_hdl_t)(ibt_object_handle))->ud_ah);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
	case IBT_HDL_SRQ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
		ci_obj_hdl = (void *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
		    (((ibt_srq_hdl_t)(ibt_object_handle))->srq_ibc_srq_hdl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
		ci_obj_hdl = ibt_object_handle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	retval = (IBTL_HCA2CIHCAOPS_P(hca)->ibc_ci_data_out)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	    (IBTL_HCA2CIHCA(hca), flags, object, ci_obj_hdl, data_p, data_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	if (retval != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
		IBTF_DPRINTF_L2(ibtf, "ibt_ci_data_out: Failed : %d", retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
 * FMA Support functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
#define	IBTL_ENA_MASK		0xC0000000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
#define	IBTL_ENA_POSSIBLE	0x80000000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
#define	IBTL_TYPE_SHIFT		27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
 *	ibt_get_module_failure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
 *	type			Identifies the failing IB module.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
 *	ena			'0' or the data for Fault Management
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
 *				Architecture (ENA).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
 *	status			Special IB failure status.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
 *	XXX Just stubbed out to return failures with no data for Fault
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
 *	Management Architecture (ENAs) at the moment XXX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
ibt_get_module_failure(ibt_failure_type_t type, uint64_t ena)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	ibt_status_t	ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	IBTF_DPRINTF_L3(ibtf, "ibt_get_module_failure(%d, 0x%llX)", type, ena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
	switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
	case IBT_FAILURE_CI:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	case IBT_FAILURE_IBMF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
	case IBT_FAILURE_IBCM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
	case IBT_FAILURE_IBDM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	case IBT_FAILURE_IBTL:
929
e9eba56e751c PSARC 2005/546 FMR Update for IBTF
srust
parents: 0
diff changeset
  1044
	case IBT_FAILURE_IBSM:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		ret = IBTL_ENA_POSSIBLE | (type << IBTL_TYPE_SHIFT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
		ret = IBT_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	IBTF_DPRINTF_L3(ibtf, "ibt_get_module_failure: ret = 0x%lX", ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
 * Function:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
 *	ibc_get_ci_failure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
 * Input:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
 *	ena			'0' or the data for Fault Management
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
 *				Architecture (ENA).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
 * Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
 *	status			Special CI failure status.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
 *	Just use the function above to do the job.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
ibt_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
ibc_get_ci_failure(uint64_t ena)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
	return (ibt_get_module_failure(IBT_FAILURE_CI, ena));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
 * ibt_check_failure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
 *	Function to test for special case failures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
 *	status		An ibt_status_t returned from an IBTF function call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
 *	reserved_p	NULL, or a pointer to where we store the data for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
 *			Fault Management Architecture (ENA).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
 * Description:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
 *	XXX Still need to determine the data for Fault Management Architecture
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
 *	(ENA), using 0 for now XXX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
ibt_failure_type_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
ibt_check_failure(ibt_status_t status, uint64_t *reserved_p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
	ibt_failure_type_t type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	IBTF_DPRINTF_L3(ibtf, "ibt_check_failure(%X)", status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	if ((status & IBTL_ENA_MASK) == IBTL_ENA_POSSIBLE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
		type = status & ~IBTL_ENA_POSSIBLE >> IBTL_TYPE_SHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
		/* XXX Need more work here... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		if (reserved_p != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
			*reserved_p = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
		type = IBT_FAILURE_STANDARD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
		if (reserved_p != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
			*reserved_p = 0;	/* No FMA Data Available. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	IBTF_DPRINTF_L3(ibtf, "ibt_check_failure: type = 0x%X", type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	return (type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
}